View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.codehaus.plexus.archiver.diags;
20  
21  import javax.annotation.Nonnull;
22  
23  import java.io.File;
24  import java.io.IOException;
25  import java.nio.charset.Charset;
26  import java.nio.file.attribute.FileTime;
27  import java.util.ArrayList;
28  import java.util.Comparator;
29  import java.util.Date;
30  import java.util.HashMap;
31  import java.util.List;
32  import java.util.Map;
33  
34  import org.codehaus.plexus.archiver.ArchiveEntry;
35  import org.codehaus.plexus.archiver.ArchivedFileSet;
36  import org.codehaus.plexus.archiver.Archiver;
37  import org.codehaus.plexus.archiver.ArchiverException;
38  import org.codehaus.plexus.archiver.FileSet;
39  import org.codehaus.plexus.archiver.ResourceIterator;
40  import org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributes;
41  import org.codehaus.plexus.components.io.resources.PlexusIoResource;
42  import org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection;
43  import org.codehaus.plexus.util.StringUtils;
44  
45  /**
46   * A diagnostic archiver that keeps track of stuff that has been added.
47   */
48  public class TrackingArchiver implements Archiver {
49  
50      private File destFile;
51  
52      public final List<Addition> added = new ArrayList<>();
53  
54      private boolean useJvmChmod;
55  
56      private boolean ignorePermissions;
57  
58      private FileTime lastModifiedTime;
59  
60      private Comparator<String> filenameComparator;
61  
62      @Override
63      public void createArchive() throws ArchiverException, IOException {}
64  
65      @Override
66      public void addDirectory(final @Nonnull File directory) throws ArchiverException {
67          added.add(new Addition(directory, null, null, null, PlexusIoResourceAttributes.UNKNOWN_OCTAL_MODE));
68      }
69  
70      @Override
71      @Deprecated
72      public void addDirectory(final @Nonnull File directory, final String prefix) throws ArchiverException {
73          added.add(new Addition(directory, prefix, null, null, PlexusIoResourceAttributes.UNKNOWN_OCTAL_MODE));
74      }
75  
76      @Override
77      @Deprecated
78      public void addDirectory(final @Nonnull File directory, final String[] includes, final String[] excludes)
79              throws ArchiverException {
80          added.add(new Addition(directory, null, includes, excludes, PlexusIoResourceAttributes.UNKNOWN_OCTAL_MODE));
81      }
82  
83      @Override
84      @Deprecated
85      public void addDirectory(
86              final @Nonnull File directory, final String prefix, final String[] includes, final String[] excludes)
87              throws ArchiverException {
88          added.add(new Addition(directory, prefix, includes, excludes, PlexusIoResourceAttributes.UNKNOWN_OCTAL_MODE));
89      }
90  
91      @Override
92      public void addFileSet(final @Nonnull FileSet fileSet) throws ArchiverException {
93          added.add(new Addition(fileSet, null, null, null, PlexusIoResourceAttributes.UNKNOWN_OCTAL_MODE));
94      }
95  
96      @Override
97      public void addFile(final @Nonnull File inputFile, final @Nonnull String destFileName) throws ArchiverException {
98          added.add(new Addition(inputFile, destFileName, null, null, PlexusIoResourceAttributes.UNKNOWN_OCTAL_MODE));
99      }
100 
101     @Override
102     public void addFile(final @Nonnull File inputFile, final @Nonnull String destFileName, final int permissions)
103             throws ArchiverException {
104         added.add(new Addition(inputFile, destFileName, null, null, permissions));
105     }
106 
107     @Override
108     public void addArchivedFileSet(final @Nonnull File archiveFile) throws ArchiverException {
109         added.add(new Addition(archiveFile, null, null, null, PlexusIoResourceAttributes.UNKNOWN_OCTAL_MODE));
110     }
111 
112     @Override
113     @Deprecated
114     public void addArchivedFileSet(final @Nonnull File archiveFile, final String prefix) throws ArchiverException {
115         added.add(new Addition(archiveFile, prefix, null, null, PlexusIoResourceAttributes.UNKNOWN_OCTAL_MODE));
116     }
117 
118     @Override
119     public void addSymlink(String s, String s2) throws ArchiverException {
120         added.add(new Addition(s, null, null, null, PlexusIoResourceAttributes.UNKNOWN_OCTAL_MODE));
121     }
122 
123     @Override
124     public void addSymlink(String s, int i, String s2) throws ArchiverException {
125         added.add(new Addition(s, null, null, null, PlexusIoResourceAttributes.UNKNOWN_OCTAL_MODE));
126     }
127 
128     @Override
129     @Deprecated
130     public void addArchivedFileSet(final File archiveFile, final String[] includes, final String[] excludes)
131             throws ArchiverException {
132         added.add(new Addition(archiveFile, null, includes, excludes, PlexusIoResourceAttributes.UNKNOWN_OCTAL_MODE));
133     }
134 
135     @Override
136     @Deprecated
137     public void addArchivedFileSet(
138             final @Nonnull File archiveFile, final String prefix, final String[] includes, final String[] excludes)
139             throws ArchiverException {
140         added.add(new Addition(archiveFile, prefix, includes, excludes, PlexusIoResourceAttributes.UNKNOWN_OCTAL_MODE));
141     }
142 
143     @Override
144     public void addArchivedFileSet(final ArchivedFileSet fileSet) throws ArchiverException {
145         added.add(new Addition(fileSet, null, null, null, PlexusIoResourceAttributes.UNKNOWN_OCTAL_MODE));
146     }
147 
148     @Override
149     public void addArchivedFileSet(final ArchivedFileSet fileSet, Charset charset) throws ArchiverException {
150         added.add(new Addition(fileSet, null, null, null, PlexusIoResourceAttributes.UNKNOWN_OCTAL_MODE));
151     }
152 
153     @Override
154     public void addResource(final PlexusIoResource resource, final String destFileName, final int permissions)
155             throws ArchiverException {
156         added.add(new Addition(resource, destFileName, null, null, permissions));
157     }
158 
159     @Override
160     public void addResources(final PlexusIoResourceCollection resources) throws ArchiverException {
161         added.add(new Addition(resources, null, null, null, PlexusIoResourceAttributes.UNKNOWN_OCTAL_MODE));
162     }
163 
164     @Override
165     public File getDestFile() {
166         return destFile;
167     }
168 
169     @Override
170     public void setDestFile(final File destFile) {
171         this.destFile = destFile;
172     }
173 
174     @Override
175     public void setFileMode(final int mode) {}
176 
177     @Override
178     public int getFileMode() {
179         return Integer.parseInt("0644", 8);
180     }
181 
182     @Override
183     public int getOverrideFileMode() {
184         return Integer.parseInt("0644", 8);
185     }
186 
187     @Override
188     public void setDefaultFileMode(final int mode) {}
189 
190     @Override
191     public int getDefaultFileMode() {
192         return Integer.parseInt("0644", 8);
193     }
194 
195     @Override
196     public void setDirectoryMode(final int mode) {}
197 
198     @Override
199     public int getDirectoryMode() {
200         return Integer.parseInt("0755", 8);
201     }
202 
203     @Override
204     public int getOverrideDirectoryMode() {
205         return Integer.parseInt("0755", 8);
206     }
207 
208     @Override
209     public void setDefaultDirectoryMode(final int mode) {}
210 
211     @Override
212     public int getDefaultDirectoryMode() {
213         return Integer.parseInt("0755", 8);
214     }
215 
216     @Override
217     public boolean getIncludeEmptyDirs() {
218         return false;
219     }
220 
221     @Override
222     public void setIncludeEmptyDirs(final boolean includeEmptyDirs) {}
223 
224     @Override
225     public void setDotFileDirectory(final File dotFileDirectory) {}
226 
227     public @Nonnull @Override ResourceIterator getResources() throws ArchiverException {
228         throw new RuntimeException("Not implemented");
229     }
230 
231     @Override
232     @Deprecated
233     public Map<String, ArchiveEntry> getFiles() {
234         return new HashMap<>();
235     }
236 
237     @Override
238     public boolean isForced() {
239         return false;
240     }
241 
242     @Override
243     public void setForced(final boolean forced) {}
244 
245     @Override
246     public boolean isSupportingForced() {
247         return true;
248     }
249 
250     @Override
251     public String getDuplicateBehavior() {
252         return null;
253     }
254 
255     @Override
256     public void setDuplicateBehavior(final String duplicate) {}
257 
258     public class Addition {
259 
260         /**
261          * {@inheritDoc}
262          *
263          * @see Object#toString()
264          */
265         @Override
266         public String toString() {
267             return "Addition (\n    resource= " + resource + "\n    directory= " + directory + "\n    destination= "
268                     + destination + "\n    permissions= " + permissions + "\n    includes= "
269                     + (includes == null ? "-none-" : StringUtils.join(includes, ", "))
270                     + "\n    excludes= "
271                     + (excludes == null ? "-none-" : StringUtils.join(excludes, ", ")) + "\n)";
272         }
273 
274         public final Object resource;
275 
276         public final File directory;
277 
278         public final String destination;
279 
280         public final int permissions;
281 
282         public final String[] includes;
283 
284         public final String[] excludes;
285 
286         public Addition(
287                 final Object resource,
288                 final String destination,
289                 final String[] includes,
290                 final String[] excludes,
291                 final int permissions) {
292             this.resource = resource;
293             if (resource instanceof FileSet) {
294                 final FileSet fs = (FileSet) resource;
295                 directory = fs.getDirectory();
296                 this.destination = fs.getPrefix();
297                 this.includes = fs.getIncludes();
298                 this.excludes = fs.getExcludes();
299                 this.permissions = permissions;
300             } else {
301                 if (resource instanceof File && ((File) resource).isDirectory()) {
302                     directory = (File) resource;
303                 } else {
304                     directory = null;
305                 }
306 
307                 this.destination = destination;
308                 this.includes = includes;
309                 this.excludes = excludes;
310                 this.permissions = permissions;
311             }
312         }
313     }
314 
315     @Override
316     @Deprecated
317     public boolean isUseJvmChmod() {
318         return useJvmChmod;
319     }
320 
321     @Override
322     @Deprecated
323     public void setUseJvmChmod(final boolean useJvmChmod) {
324         this.useJvmChmod = useJvmChmod;
325     }
326 
327     @Override
328     public boolean isIgnorePermissions() {
329         return ignorePermissions;
330     }
331 
332     @Override
333     public void setIgnorePermissions(final boolean ignorePermissions) {
334         this.ignorePermissions = ignorePermissions;
335     }
336 
337     /**
338      * @deprecated Use {@link #setLastModifiedTime(FileTime)} instead.
339      */
340     @Override
341     @Deprecated
342     public void setLastModifiedDate(final Date lastModifiedDate) {
343         this.lastModifiedTime = lastModifiedDate != null ? FileTime.fromMillis(lastModifiedDate.getTime()) : null;
344     }
345 
346     /**
347      * @deprecated Use {@link #getLastModifiedTime()} instead.
348      */
349     @Override
350     @Deprecated
351     public Date getLastModifiedDate() {
352         return lastModifiedTime != null ? new Date(lastModifiedTime.toMillis()) : null;
353     }
354 
355     @Override
356     public void setLastModifiedTime(final FileTime lastModifiedTime) {
357         this.lastModifiedTime = lastModifiedTime;
358     }
359 
360     @Override
361     public FileTime getLastModifiedTime() {
362         return lastModifiedTime;
363     }
364 
365     @Override
366     public void setFilenameComparator(final Comparator<String> filenameComparator) {
367         this.filenameComparator = filenameComparator;
368     }
369 
370     public Comparator<String> getFilenameComparator() {
371         return filenameComparator;
372     }
373 
374     @Override
375     public void setOverrideUid(int uid) {}
376 
377     @Override
378     public void setOverrideUserName(String userName) {}
379 
380     @Override
381     public int getOverrideUid() {
382         return 0;
383     }
384 
385     @Override
386     public String getOverrideUserName() {
387         return null;
388     }
389 
390     @Override
391     public void setOverrideGid(int gid) {}
392 
393     @Override
394     public void setOverrideGroupName(String groupName) {}
395 
396     @Override
397     public int getOverrideGid() {
398         return 0;
399     }
400 
401     @Override
402     public String getOverrideGroupName() {
403         return null;
404     }
405 
406     @Override
407     public void setUmask(int umask) {}
408 
409     @Override
410     public int getUmask() {
411         return 0;
412     }
413 
414     /**
415      * @deprecated Use {@link #configureReproducibleBuild(FileTime)} instead.
416      */
417     @Override
418     @Deprecated
419     public void configureReproducible(Date lastModifiedDate) {}
420 
421     @Override
422     public void configureReproducibleBuild(FileTime lastModifiedTime) {}
423 }