View Javadoc
1   package org.apache.maven.plugins.dependency.utils.filters;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   * http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import java.io.File;
23  import java.util.LinkedHashSet;
24  import java.util.Set;
25  
26  import org.apache.maven.artifact.Artifact;
27  import org.apache.maven.plugins.dependency.fromConfiguration.ArtifactItem;
28  import org.apache.maven.plugins.dependency.utils.DependencyUtil;
29  import org.apache.maven.shared.artifact.filter.collection.AbstractArtifactsFilter;
30  import org.apache.maven.shared.artifact.filter.collection.ArtifactFilterException;
31  import org.codehaus.plexus.util.StringUtils;
32  
33  /**
34   * @author <a href="mailto:brianf@apache.org">Brian Fox</a>
35   * @version $Id: DestFileFilter.java 1807877 2017-09-09 10:35:59Z khmarbaise $
36   */
37  public class DestFileFilter
38      extends AbstractArtifactsFilter
39      implements ArtifactItemFilter
40  {
41      private boolean overWriteReleases;
42  
43      private boolean overWriteSnapshots;
44  
45      private boolean overWriteIfNewer;
46  
47      private boolean useSubDirectoryPerArtifact;
48  
49      private boolean useSubDirectoryPerType;
50  
51      private boolean useSubDirectoryPerScope;
52  
53      private boolean useRepositoryLayout;
54  
55      private boolean removeVersion;
56  
57      private boolean removeClassifier;
58  
59      private boolean prependGroupId;
60  
61      private boolean useBaseVersion;
62  
63      private File outputFileDirectory;
64  
65      public DestFileFilter( File outputFileDirectory )
66      {
67          this( false, false, false, false, false, false, false, false, false, false, outputFileDirectory );
68      }
69  
70      public DestFileFilter( boolean overWriteReleases, boolean overWriteSnapshots, boolean overWriteIfNewer,
71                             boolean useSubDirectoryPerArtifact, boolean useSubDirectoryPerType,
72                             boolean useSubDirectoryPerScope, boolean useRepositoryLayout, boolean removeVersion,
73                             boolean prependGroupId, boolean useBaseVersion, File outputFileDirectory )
74      {
75          this.overWriteReleases = overWriteReleases;
76          this.overWriteSnapshots = overWriteSnapshots;
77          this.overWriteIfNewer = overWriteIfNewer;
78          this.useSubDirectoryPerArtifact = useSubDirectoryPerArtifact;
79          this.useSubDirectoryPerType = useSubDirectoryPerType;
80          this.useSubDirectoryPerScope = useSubDirectoryPerScope;
81          this.useRepositoryLayout = useRepositoryLayout;
82          this.removeVersion = removeVersion;
83          this.prependGroupId = prependGroupId;
84          this.useBaseVersion = useBaseVersion;
85          this.outputFileDirectory = outputFileDirectory;
86      }
87  
88      /*
89       * (non-Javadoc)
90       * @see org.apache.mojo.dependency.utils.filters.ArtifactsFilter#filter(java.util.Set,
91       * org.apache.maven.plugin.logging.Log)
92       */
93      @Override
94      public Set<Artifact> filter( Set<Artifact> artifacts )
95          throws ArtifactFilterException
96      {
97          Set<Artifact> result = new LinkedHashSet<Artifact>();
98  
99          for ( Artifact artifact : artifacts )
100         {
101             if ( isArtifactIncluded( new ArtifactItem( artifact ) ) )
102             {
103                 result.add( artifact );
104             }
105         }
106         return result;
107     }
108 
109     /**
110      * @return Returns the overWriteReleases.
111      */
112     public boolean isOverWriteReleases()
113     {
114         return this.overWriteReleases;
115     }
116 
117     /**
118      * @param overWriteReleases The overWriteReleases to set.
119      */
120     public void setOverWriteReleases( boolean overWriteReleases )
121     {
122         this.overWriteReleases = overWriteReleases;
123     }
124 
125     /**
126      * @return Returns the overWriteSnapshots.
127      */
128     public boolean isOverWriteSnapshots()
129     {
130         return this.overWriteSnapshots;
131     }
132 
133     /**
134      * @param overWriteSnapshots The overWriteSnapshots to set.
135      */
136     public void setOverWriteSnapshots( boolean overWriteSnapshots )
137     {
138         this.overWriteSnapshots = overWriteSnapshots;
139     }
140 
141     /**
142      * @return Returns the overWriteIfNewer.
143      */
144     public boolean isOverWriteIfNewer()
145     {
146         return this.overWriteIfNewer;
147     }
148 
149     /**
150      * @param overWriteIfNewer The overWriteIfNewer to set.
151      */
152     public void setOverWriteIfNewer( boolean overWriteIfNewer )
153     {
154         this.overWriteIfNewer = overWriteIfNewer;
155     }
156 
157     /**
158      * @return Returns the outputFileDirectory.
159      */
160     public File getOutputFileDirectory()
161     {
162         return this.outputFileDirectory;
163     }
164 
165     /**
166      * @param outputFileDirectory The outputFileDirectory to set.
167      */
168     public void setOutputFileDirectory( File outputFileDirectory )
169     {
170         this.outputFileDirectory = outputFileDirectory;
171     }
172 
173     /**
174      * @return Returns the removeVersion.
175      */
176     public boolean isRemoveVersion()
177     {
178         return this.removeVersion;
179     }
180 
181     /**
182      * @param removeVersion The removeVersion to set.
183      */
184     public void setRemoveVersion( boolean removeVersion )
185     {
186         this.removeVersion = removeVersion;
187     }
188 
189     /**
190      * @return Returns the removeClassifier.
191      */
192     public boolean isRemoveClassifier()
193     {
194         return this.removeClassifier;
195     }
196 
197     /**
198      * @param removeClassifier The removeClassifier to set.
199      */
200     public void setRemoveClassifier( boolean removeClassifier )
201     {
202         this.removeClassifier = removeClassifier;
203     }
204 
205     /**
206      * @return Returns the useSubDirectoryPerArtifact.
207      */
208     public boolean isUseSubDirectoryPerArtifact()
209     {
210         return this.useSubDirectoryPerArtifact;
211     }
212 
213     /**
214      * @param useSubDirectoryPerArtifact The useSubDirectoryPerArtifact to set.
215      */
216     public void setUseSubDirectoryPerArtifact( boolean useSubDirectoryPerArtifact )
217     {
218         this.useSubDirectoryPerArtifact = useSubDirectoryPerArtifact;
219     }
220 
221     /**
222      * @return Returns the useSubDirectoryPerType.
223      */
224     public boolean isUseSubDirectoryPerType()
225     {
226         return this.useSubDirectoryPerType;
227     }
228 
229     /**
230      * @param useSubDirectoryPerType The useSubDirectoryPerType to set.
231      */
232     public void setUseSubDirectoryPerType( boolean useSubDirectoryPerType )
233     {
234         this.useSubDirectoryPerType = useSubDirectoryPerType;
235     }
236 
237     /**
238      * @return Returns the useRepositoryLayout
239      */
240     public boolean isUseRepositoryLayout()
241     {
242         return useRepositoryLayout;
243     }
244 
245     /**
246      * @param useRepositoryLayout the useRepositoryLayout to set
247      */
248     public void setUseRepositoryLayout( boolean useRepositoryLayout )
249     {
250         this.useRepositoryLayout = useRepositoryLayout;
251     }
252 
253     @Override
254     public boolean isArtifactIncluded( ArtifactItem item )
255     {
256         Artifact artifact = item.getArtifact();
257 
258         boolean overWrite = ( artifact.isSnapshot() && this.overWriteSnapshots )
259             || ( !artifact.isSnapshot() && this.overWriteReleases );
260 
261         File destFolder = item.getOutputDirectory();
262         if ( destFolder == null )
263         {
264             destFolder =
265                 DependencyUtil.getFormattedOutputDirectory( useSubDirectoryPerScope, useSubDirectoryPerType,
266                                                             useSubDirectoryPerArtifact, useRepositoryLayout,
267                                                             removeVersion, this.outputFileDirectory, artifact );
268         }
269 
270         File destFile;
271         if ( StringUtils.isEmpty( item.getDestFileName() ) )
272         {
273             String formattedFileName = DependencyUtil.getFormattedFileName( artifact, removeVersion, prependGroupId,
274                                                                             useBaseVersion, removeClassifier );
275             destFile = new File( destFolder, formattedFileName );
276         }
277         else
278         {
279             destFile = new File( destFolder, item.getDestFileName() );
280         }
281 
282         return overWrite || !destFile.exists()
283             || ( overWriteIfNewer && artifact.getFile().lastModified() > destFile.lastModified() );
284     }
285 }