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