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   */
36  public class DestFileFilter
37      extends AbstractArtifactsFilter
38      implements ArtifactItemFilter
39  {
40      private boolean overWriteReleases;
41  
42      private boolean overWriteSnapshots;
43  
44      private boolean overWriteIfNewer;
45  
46      private boolean useSubDirectoryPerArtifact;
47  
48      private boolean useSubDirectoryPerType;
49  
50      private boolean useSubDirectoryPerScope;
51  
52      private boolean useRepositoryLayout;
53  
54      private boolean removeVersion;
55  
56      private boolean removeClassifier;
57  
58      private boolean prependGroupId;
59  
60      private boolean useBaseVersion;
61  
62      private File outputFileDirectory;
63  
64      /**
65       * @param outputFileDirectory the output directory.
66       */
67      public DestFileFilter( File outputFileDirectory )
68      {
69          this( false, false, false, false, false, false, false, false, false, false, outputFileDirectory );
70      }
71  
72      /**
73       * @param overWriteReleases true/false.
74       * @param overWriteSnapshots true/false.
75       * @param overWriteIfNewer true/false.
76       * @param useSubDirectoryPerArtifact true/false.
77       * @param useSubDirectoryPerType true/false.
78       * @param useSubDirectoryPerScope true/false.
79       * @param useRepositoryLayout true/false.
80       * @param removeVersion true/false.
81       * @param prependGroupId true/false.
82       * @param useBaseVersion true/false.
83       * @param outputFileDirectory the output directory.
84       */
85      public DestFileFilter( boolean overWriteReleases, boolean overWriteSnapshots, boolean overWriteIfNewer,
86                             boolean useSubDirectoryPerArtifact, boolean useSubDirectoryPerType,
87                             boolean useSubDirectoryPerScope, boolean useRepositoryLayout, boolean removeVersion,
88                             boolean prependGroupId, boolean useBaseVersion, File outputFileDirectory )
89      {
90          this.overWriteReleases = overWriteReleases;
91          this.overWriteSnapshots = overWriteSnapshots;
92          this.overWriteIfNewer = overWriteIfNewer;
93          this.useSubDirectoryPerArtifact = useSubDirectoryPerArtifact;
94          this.useSubDirectoryPerType = useSubDirectoryPerType;
95          this.useSubDirectoryPerScope = useSubDirectoryPerScope;
96          this.useRepositoryLayout = useRepositoryLayout;
97          this.removeVersion = removeVersion;
98          this.prependGroupId = prependGroupId;
99          this.useBaseVersion = useBaseVersion;
100         this.outputFileDirectory = outputFileDirectory;
101     }
102 
103     /*
104      * (non-Javadoc)
105      * @see org.apache.mojo.dependency.utils.filters.ArtifactsFilter#filter(java.util.Set,
106      * org.apache.maven.plugin.logging.Log)
107      */
108     @Override
109     public Set<Artifact> filter( Set<Artifact> artifacts )
110         throws ArtifactFilterException
111     {
112         Set<Artifact> result = new LinkedHashSet<Artifact>();
113 
114         for ( Artifact artifact : artifacts )
115         {
116             if ( isArtifactIncluded( new ArtifactItem( artifact ) ) )
117             {
118                 result.add( artifact );
119             }
120         }
121         return result;
122     }
123 
124     /**
125      * @return Returns the overWriteReleases.
126      */
127     public boolean isOverWriteReleases()
128     {
129         return this.overWriteReleases;
130     }
131 
132     /**
133      * @param overWriteReleases The overWriteReleases to set.
134      */
135     public void setOverWriteReleases( boolean overWriteReleases )
136     {
137         this.overWriteReleases = overWriteReleases;
138     }
139 
140     /**
141      * @return Returns the overWriteSnapshots.
142      */
143     public boolean isOverWriteSnapshots()
144     {
145         return this.overWriteSnapshots;
146     }
147 
148     /**
149      * @param overWriteSnapshots The overWriteSnapshots to set.
150      */
151     public void setOverWriteSnapshots( boolean overWriteSnapshots )
152     {
153         this.overWriteSnapshots = overWriteSnapshots;
154     }
155 
156     /**
157      * @return Returns the overWriteIfNewer.
158      */
159     public boolean isOverWriteIfNewer()
160     {
161         return this.overWriteIfNewer;
162     }
163 
164     /**
165      * @param overWriteIfNewer The overWriteIfNewer to set.
166      */
167     public void setOverWriteIfNewer( boolean overWriteIfNewer )
168     {
169         this.overWriteIfNewer = overWriteIfNewer;
170     }
171 
172     /**
173      * @return Returns the outputFileDirectory.
174      */
175     public File getOutputFileDirectory()
176     {
177         return this.outputFileDirectory;
178     }
179 
180     /**
181      * @param outputFileDirectory The outputFileDirectory to set.
182      */
183     public void setOutputFileDirectory( File outputFileDirectory )
184     {
185         this.outputFileDirectory = outputFileDirectory;
186     }
187 
188     /**
189      * @return Returns the removeVersion.
190      */
191     public boolean isRemoveVersion()
192     {
193         return this.removeVersion;
194     }
195 
196     /**
197      * @param removeVersion The removeVersion to set.
198      */
199     public void setRemoveVersion( boolean removeVersion )
200     {
201         this.removeVersion = removeVersion;
202     }
203 
204     /**
205      * @return Returns the removeClassifier.
206      */
207     public boolean isRemoveClassifier()
208     {
209         return this.removeClassifier;
210     }
211 
212     /**
213      * @param removeClassifier The removeClassifier to set.
214      */
215     public void setRemoveClassifier( boolean removeClassifier )
216     {
217         this.removeClassifier = removeClassifier;
218     }
219 
220     /**
221      * @return Returns the useSubDirectoryPerArtifact.
222      */
223     public boolean isUseSubDirectoryPerArtifact()
224     {
225         return this.useSubDirectoryPerArtifact;
226     }
227 
228     /**
229      * @param useSubDirectoryPerArtifact The useSubDirectoryPerArtifact to set.
230      */
231     public void setUseSubDirectoryPerArtifact( boolean useSubDirectoryPerArtifact )
232     {
233         this.useSubDirectoryPerArtifact = useSubDirectoryPerArtifact;
234     }
235 
236     /**
237      * @return Returns the useSubDirectoryPerType.
238      */
239     public boolean isUseSubDirectoryPerType()
240     {
241         return this.useSubDirectoryPerType;
242     }
243 
244     /**
245      * @param useSubDirectoryPerType The useSubDirectoryPerType to set.
246      */
247     public void setUseSubDirectoryPerType( boolean useSubDirectoryPerType )
248     {
249         this.useSubDirectoryPerType = useSubDirectoryPerType;
250     }
251 
252     /**
253      * @return Returns the useRepositoryLayout
254      */
255     public boolean isUseRepositoryLayout()
256     {
257         return useRepositoryLayout;
258     }
259 
260     /**
261      * @param useRepositoryLayout the useRepositoryLayout to set
262      */
263     public void setUseRepositoryLayout( boolean useRepositoryLayout )
264     {
265         this.useRepositoryLayout = useRepositoryLayout;
266     }
267 
268     @Override
269     public boolean isArtifactIncluded( ArtifactItem item )
270     {
271         Artifact artifact = item.getArtifact();
272 
273         boolean overWrite = ( artifact.isSnapshot() && this.overWriteSnapshots )
274             || ( !artifact.isSnapshot() && this.overWriteReleases );
275 
276         File destFolder = item.getOutputDirectory();
277         if ( destFolder == null )
278         {
279             destFolder =
280                 DependencyUtil.getFormattedOutputDirectory( useSubDirectoryPerScope, useSubDirectoryPerType,
281                                                             useSubDirectoryPerArtifact, useRepositoryLayout,
282                                                             removeVersion, this.outputFileDirectory, artifact );
283         }
284 
285         File destFile;
286         if ( StringUtils.isEmpty( item.getDestFileName() ) )
287         {
288             String formattedFileName = DependencyUtil.getFormattedFileName( artifact, removeVersion, prependGroupId,
289                                                                             useBaseVersion, removeClassifier );
290             destFile = new File( destFolder, formattedFileName );
291         }
292         else
293         {
294             destFile = new File( destFolder, item.getDestFileName() );
295         }
296 
297         return overWrite || !destFile.exists()
298             || ( overWriteIfNewer && artifact.getFile().lastModified() > destFile.lastModified() );
299     }
300 }