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