View Javadoc
1   /**
2    * Portions of this software was developed by employees of the National Institute
3    * of Standards and Technology (NIST), an agency of the Federal Government and is
4    * being made available as a public service. Pursuant to title 17 United States
5    * Code Section 105, works of NIST employees are not subject to copyright
6    * protection in the United States. This software may be subject to foreign
7    * copyright. Permission in the United States and in foreign countries, to the
8    * extent that NIST may hold copyright, to use, copy, modify, create derivative
9    * works, and distribute this software and its documentation without fee is hereby
10   * granted on a non-exclusive basis, provided that this notice and disclaimer
11   * of warranty appears in all copies.
12   *
13   * THE SOFTWARE IS PROVIDED 'AS IS' WITHOUT ANY WARRANTY OF ANY KIND, EITHER
14   * EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY
15   * THAT THE SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF
16   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND FREEDOM FROM
17   * INFRINGEMENT, AND ANY WARRANTY THAT THE DOCUMENTATION WILL CONFORM TO THE
18   * SOFTWARE, OR ANY WARRANTY THAT THE SOFTWARE WILL BE ERROR FREE.  IN NO EVENT
19   * SHALL NIST BE LIABLE FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO, DIRECT,
20   * INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF, RESULTING FROM,
21   * OR IN ANY WAY CONNECTED WITH THIS SOFTWARE, WHETHER OR NOT BASED UPON WARRANTY,
22   * CONTRACT, TORT, OR OTHERWISE, WHETHER OR NOT INJURY WAS SUSTAINED BY PERSONS OR
23   * PROPERTY OR OTHERWISE, AND WHETHER OR NOT LOSS WAS SUSTAINED FROM, OR AROSE OUT
24   * OF THE RESULTS OF, OR USE OF, THE SOFTWARE OR SERVICES PROVIDED HEREUNDER.
25   */
26  
27  package gov.nist.secauto.swid.plugin.entry;
28  
29  import gov.nist.secauto.swid.builder.resource.PathRelativizer;
30  
31  import org.codehaus.plexus.components.io.fileselectors.FileInfo;
32  
33  import java.io.IOException;
34  import java.io.InputStream;
35  import java.nio.file.Path;
36  import java.util.List;
37  
38  public abstract class AbstractFileEntry implements FileEntry {
39  
40    public AbstractFileEntry() {
41    }
42  
43    /**
44     * Retrieve the base of the file's path, which can be excluded.
45     * 
46     * @return the base
47     */
48    protected abstract Path getBase();
49  
50    /**
51     * Retrieve the full path to the file.
52     * 
53     * @return the filePath
54     */
55    @Override
56    public abstract Path getPath();
57  
58    /**
59     * Retrieve the relative path of the file with the base removed.
60     * 
61     * @return the file's relative path
62     */
63    protected Path getRelativePath() {
64      return getBase().relativize(getPath());
65    }
66  
67    protected abstract String getOutputBase();
68  
69    @Override
70    public String getOutputRelativePath() {
71      StringBuilder builder = new StringBuilder();
72      // Should be null if no base is provided or a path using the '/' sperator
73      String base = getOutputBase();
74      if (base != null) {
75        builder.append(base);
76        builder.append('/');
77      }
78  
79      Path relativePath = getRelativePath();
80      String relativePathString = relativePath.toString();
81      String seperator = relativePath.getFileSystem().getSeparator();
82      if (!"/".equals(seperator)) {
83        relativePathString = relativePathString.replace(seperator, "/");
84      }
85      builder.append(relativePathString);
86      return builder.toString();
87  
88    }
89  
90    @Override
91    public List<String> getRelativePathSegements(String swidTagPath) {
92      return PathRelativizer.relativize(swidTagPath, getOutputRelativePath());
93    }
94  
95    @Override
96    public FileInfo asFileInfo() {
97      return new ResourceFileInfo();
98    }
99  
100   private class ResourceFileInfo implements FileInfo {
101 
102     @Override
103     public String getName() {
104       return AbstractFileEntry.this.getOutputRelativePath().toString();
105     }
106 
107     @Override
108     public InputStream getContents() throws IOException {
109       return AbstractFileEntry.this.getInputStream();
110     }
111 
112     @Override
113     public boolean isFile() {
114       return true;
115     }
116 
117     @Override
118     public boolean isDirectory() {
119       return false;
120     }
121 
122     @Override
123     public boolean isSymbolicLink() {
124       return false;
125     }
126   }
127 }