View Javadoc

1   package org.apache.maven.plugin.war.util;
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 org.codehaus.plexus.util.DirectoryScanner;
23  import org.codehaus.plexus.util.StringUtils;
24  
25  import java.io.File;
26  import java.util.Collection;
27  import java.util.HashSet;
28  import java.util.Iterator;
29  import java.util.LinkedHashSet;
30  import java.util.Set;
31  
32  /**
33   * Set of file's paths.
34   * <p/>
35   * The class extends functionality of a "normal" set of strings by a process of
36   * the paths normalization. All paths are converted to unix form (slashes) and
37   * they don't start with starting /.
38   *
39   * @author Piotr Tabor
40   * @version $Id: PathSet.html 868453 2013-07-05 11:25:41Z olamy $
41   */
42  
43  public class PathSet implements Iterable<String>
44  {
45  
46      /**
47       * Set of normalized paths
48       */
49      private Set<String> pathsSet = new LinkedHashSet<String>();
50  
51      /**
52       * The method normalizes the path.
53       * <p/>
54       * <ul>
55       * <li>changes directory separator to unix's separator(/)</li>
56       * <li>deletes all trailing slashes</li>
57       * </ul>
58       *
59       * @param path to normalization
60       * @return normalized path
61       */
62      protected String normalizeFilePath( String path )
63      {
64          return normalizeFilePathStatic( path );
65      }
66  
67      /*-------------------- Business interface ------------------------------*/
68  
69      /**
70       * Creates an empty paths set
71       */
72      public PathSet()
73      {
74          /*Empty default constructor*/
75      }
76  
77      /**
78       * Creates paths set and normalizate and adds all 'paths'.
79       * The source 'paths' will not be changed
80       *
81       * @param paths to be added
82       */
83      public PathSet( Collection<String> paths )
84      {
85          addAll( paths );
86      }
87  
88      /**
89       * Creates paths set and normalizate and adds all 'paths'.
90       * The source 'paths' will not be changed
91       *
92       * @param paths to be added
93       */
94      public PathSet( String[] paths )
95      {
96          addAll( paths );
97      }
98  
99      /**
100      * Normalizes and adds given path to the set.
101      *
102      * @param path to be added
103      */
104     public void add( String path )
105     {
106         pathsSet.add( normalizeFilePath( path ) );
107     }
108 
109     /**
110      * Normalizes and adds given paths (collection of strings)
111      * to the set. The source collection will not be changed
112      *
113      * @param paths  - collection of strings to be added
114      * @param prefix added to all given paths
115      */
116     public void addAll( Collection<String> paths, String prefix )
117     {
118         for ( String val : paths )
119         {
120             add( prefix + val );
121         }
122     }
123 
124     /**
125      * Normalizes and adds given paths to the set.
126      * The source collection will not be changed
127      *
128      * @param paths  to be added
129      * @param prefix added to all given paths
130      */
131     public void addAll( String[] paths, String prefix )
132     {
133         for ( String val : paths )
134         {
135             add( prefix + val );
136         }
137     }
138 
139     /**
140      * Adds given paths to the set.
141      * The source collection will not be changed
142      *
143      * @param paths  to be added
144      * @param prefix added to all given paths
145      */
146     public void addAll( PathSet paths, String prefix )
147     {
148         for ( String path : paths )
149         {
150             add( prefix + path );
151         }
152     }
153 
154     /**
155      * Normalizes and adds given paths (collection of strings)
156      * to the set. The source collection will not be changed
157      *
158      * @param paths - collection of strings to be added
159      */
160     public void addAll( Collection<String> paths )
161     {
162         addAll( paths, "" );
163     }
164 
165     /**
166      * Normalizes and adds given paths to the set.
167      * The source collection will not be changed
168      *
169      * @param paths to be added
170      */
171     public void addAll( String[] paths )
172     {
173         addAll( paths, "" );
174     }
175 
176     /**
177      * Adds given paths to the set.
178      * The source collection will not be changed
179      *
180      * @param paths to be added
181      */
182     public void addAll( PathSet paths )
183     {
184         addAll( paths, "" );
185     }
186 
187     /**
188      * Checks if the set constains given path. The path is normalized
189      * before check.
190      *
191      * @param path we are looking for in the set.
192      * @return information if the set constains the path.
193      */
194     public boolean contains( String path )
195     {
196         return pathsSet.contains( normalizeFilePath( path ) );
197     }
198 
199     /**
200      * Removes the specified path if it exists.
201      *
202      * @param path the path to remove
203      * @return true if the path was removed, false if it did not existed
204      */
205     boolean remove( String path )
206     {
207         final String normalizedPath = normalizeFilePath( path );
208         return pathsSet.remove( normalizedPath );
209 
210     }
211 
212     /**
213      * Returns iterator of normalized paths (strings)
214      *
215      * @return iterator of normalized paths (strings)
216      */
217     public Iterator<String> iterator()
218     {
219         return pathsSet.iterator();
220     }
221 
222     public Collection<String> paths()
223     {
224         return pathsSet;
225     }
226 
227     /**
228      * Adds given prefix to all paths in the set.
229      * <p/>
230      * The prefix should be ended by '/'. The generated paths are normalized.
231      *
232      * @param prefix to be added to all items
233      */
234     public void addPrefix( String prefix )
235     {
236         final Set<String> newSet = new HashSet<String>();
237         for ( String path : pathsSet )
238         {
239             newSet.add( normalizeFilePath( prefix + path ) );
240         }
241         pathsSet = newSet;
242     }
243 
244     /**
245      * Returns count of the paths in the set
246      *
247      * @return count of the paths in the set
248      */
249     public int size()
250     {
251         return pathsSet.size();
252     }
253 
254     /**
255      * Adds to the set all files in the given directory
256      *
257      * @param directory that will be searched for file's paths to add
258      * @param prefix    to be added to all found files
259      */
260     public void addAllFilesInDirectory( File directory, String prefix )
261     {
262         DirectoryScanner scanner = new DirectoryScanner();
263         scanner.setBasedir( directory );
264         scanner.scan();
265         addAll( scanner.getIncludedFiles(), prefix );
266     }
267 
268     /*-------------------- Universal static mathods ------------------------*/
269     /**
270      * The method normalizes the path.
271      * <p/>
272      * <ul>
273      * <li>changes directory separator to unix's separator(/)</li>
274      * <li>deletes all trailing slashes</li>
275      * </ul>
276      *
277      * @param path to normalization
278      * @return normalized path
279      */
280     public static String normalizeFilePathStatic( String path )
281     {
282         return trimTrailingSlashes( StringUtils.replace( path, '\\', '/' ) );
283     }
284 
285     /**
286      * The method deletes all trailing slashes from the given string
287      *
288      * @param str a string
289      * @return trimed string
290      */
291     public static String trimTrailingSlashes( String str )
292     {
293         int i;
294         for ( i = 0; i < str.length() && str.charAt( i ) == '/'; i++ )
295         {
296             // just calculate i
297         }
298         return str.substring( i );
299     }
300 
301 }