View Javadoc
1   package org.apache.maven.shared.filtering;
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 java.io.File;
23  import java.io.Reader;
24  import java.util.ArrayList;
25  import java.util.List;
26  
27  import org.apache.maven.execution.MavenSession;
28  import org.apache.maven.model.Resource;
29  import org.apache.maven.project.MavenProject;
30  import org.apache.maven.shared.utils.io.FileUtils;
31  import org.apache.maven.shared.utils.io.FileUtils.FilterWrapper;
32  import org.codehaus.plexus.interpolation.StringSearchInterpolator;
33  import org.codehaus.plexus.interpolation.ValueSource;
34  
35  /**
36   * A bean to configure a resources filtering execution.
37   *
38   * @author Olivier Lamy
39   */
40  public class MavenResourcesExecution
41      extends AbstractMavenFilteringRequest
42  {
43  
44      private List<Resource> resources;
45  
46      private File outputDirectory;
47  
48      private List<String> nonFilteredFileExtensions;
49  
50      private List<FileUtils.FilterWrapper> filterWrappers;
51  
52      private File resourcesBaseDirectory;
53  
54      private boolean useDefaultFilterWrappers = false;
55  
56      private boolean filterFilenames = false;
57  
58      private String encoding;
59  
60      /**
61       * Overwrite existing files even if the destination files are newer. <code>false</code> by default.
62       *
63       * @since 1.0-beta-2
64       */
65      private boolean overwrite = false;
66  
67      /**
68       * Copy any empty directories included in the Resources.
69       *
70       * @since 1.0-beta-2
71       */
72      private boolean includeEmptyDirs = false;
73  
74      /**
75       * Do not stop trying to filter tokens when reaching EOL.
76       *
77       * @since 1.0
78       */
79      private boolean supportMultiLineFiltering;
80  
81      /**
82       * Do nothing.
83       */
84      public MavenResourcesExecution()
85      {
86          // no op
87      }
88  
89      /**
90       * As we use a Maven project <code>useDefaultFilterWrappers</code> will be set to <code>true</code>.
91       *
92       * @param resources The list of resources.
93       * @param outputDirectory The output directory.
94       * @param mavenProject The maven project.
95       * @param encoding The given encoding.
96       * @param fileFilters The file filters.
97       * @param nonFilteredFileExtensions The extensions which should not being filtered.
98       * @param mavenSession The maven session.
99       */
100     public MavenResourcesExecution( List<Resource> resources, File outputDirectory, MavenProject mavenProject,
101                                     String encoding, List<String> fileFilters, List<String> nonFilteredFileExtensions,
102                                     MavenSession mavenSession )
103     {
104         super( mavenProject, fileFilters, mavenSession );
105         this.encoding = encoding;
106         this.resources = resources;
107         this.outputDirectory = outputDirectory;
108         this.nonFilteredFileExtensions = nonFilteredFileExtensions;
109         this.useDefaultFilterWrappers = true;
110         this.resourcesBaseDirectory = mavenProject.getBasedir();
111     }
112 
113     /**
114      * @param resources The list of resources.
115      * @param outputDirectory The output directory.
116      * @param encoding The given encoding.
117      * @param filterWrappers The list of filter wrappers.
118      * @param resourcesBaseDirectory The resources base directory.
119      * @param nonFilteredFileExtensions The list of extensions which should not being filtered.
120      */
121     public MavenResourcesExecution( List<Resource> resources, File outputDirectory, String encoding,
122                                     List<FileUtils.FilterWrapper> filterWrappers, File resourcesBaseDirectory,
123                                     List<String> nonFilteredFileExtensions )
124     {
125         this();
126         this.resources = resources;
127         this.outputDirectory = outputDirectory;
128         this.filterWrappers = filterWrappers;
129         this.nonFilteredFileExtensions = nonFilteredFileExtensions;
130         this.resourcesBaseDirectory = resourcesBaseDirectory;
131         this.useDefaultFilterWrappers = false;
132         setEncoding( encoding );
133     }
134 
135     /**
136      * Return the encoding.
137      * 
138      * @return Current encoding.
139      */
140     public String getEncoding()
141     {
142         return encoding;
143     }
144 
145     /**
146      * Set the value for encoding.
147      * 
148      * @param encoding Give the new value for encoding.
149      */
150     public void setEncoding( String encoding )
151     {
152         this.encoding = encoding;
153     }
154 
155     /**
156      * @return List of {@link org.apache.maven.model.Resource}
157      */
158     public List<Resource> getResources()
159     {
160         return resources;
161     }
162 
163     /**
164      * @param resources List of {@link org.apache.maven.model.Resource}
165      */
166     public void setResources( List<Resource> resources )
167     {
168         this.resources = resources;
169     }
170 
171     /**
172      * @return The output directory.
173      */
174     public File getOutputDirectory()
175     {
176         return outputDirectory;
177     }
178 
179     /**
180      * @param outputDirectory The output directory.
181      */
182     public void setOutputDirectory( File outputDirectory )
183     {
184         this.outputDirectory = outputDirectory;
185     }
186 
187     /**
188      * @return List of {@link String} file extensions to not filter
189      */
190     public List<String> getNonFilteredFileExtensions()
191     {
192         return nonFilteredFileExtensions;
193     }
194 
195     /**
196      * @param nonFilteredFileExtensions List of {@link String} file extensions to not filter
197      */
198     public void setNonFilteredFileExtensions( List<String> nonFilteredFileExtensions )
199     {
200         this.nonFilteredFileExtensions = nonFilteredFileExtensions;
201     }
202 
203     /**
204      * @return List of {@link FileUtils.FilterWrapper}
205      */
206     public List<FileUtils.FilterWrapper> getFilterWrappers()
207     {
208         return filterWrappers;
209     }
210 
211     /**
212      * @param filterWrappers List of {@link FileUtils.FilterWrapper}
213      */
214     public void setFilterWrappers( List<FileUtils.FilterWrapper> filterWrappers )
215     {
216         this.filterWrappers = filterWrappers;
217     }
218 
219     /**
220      * @param filterWrapper The filter wrapper which should be added.
221      */
222     public void addFilterWrapper( FilterWrapper filterWrapper )
223     {
224         if ( this.filterWrappers == null )
225         {
226             this.filterWrappers = new ArrayList<FilterWrapper>();
227         }
228         this.filterWrappers.add( filterWrapper );
229     }
230 
231     /**
232      * @param valueSource {@link ValueSource}
233      * @param startExp start token like <code>${</code>
234      * @param endExp endToken <code>}</code>
235      * @param escapeString The escape string.
236      * @param multiLineFiltering do we support or use filtering on multi lines with start and endtoken on multi lines
237      * @since 1.0
238      */
239     public void addFilerWrapperWithEscaping( final ValueSource valueSource, final String startExp, final String endExp,
240                                              final String escapeString, final boolean multiLineFiltering )
241     {
242         addFilterWrapper( new FileUtils.FilterWrapper()
243         {
244             public Reader getReader( Reader reader )
245             {
246                 StringSearchInterpolator propertiesInterpolator = new StringSearchInterpolator( startExp, endExp );
247                 propertiesInterpolator.addValueSource( valueSource );
248                 propertiesInterpolator.setEscapeString( escapeString );
249                 InterpolatorFilterReaderLineEnding interpolatorFilterReader =
250                     new InterpolatorFilterReaderLineEnding( reader, propertiesInterpolator, startExp, endExp,
251                                                             multiLineFiltering );
252                 interpolatorFilterReader.setInterpolateWithPrefixPattern( false );
253                 return interpolatorFilterReader;
254             }
255         } );
256     }
257 
258     /**
259      * @return The resource base directory.
260      */
261     public File getResourcesBaseDirectory()
262     {
263         return resourcesBaseDirectory;
264     }
265 
266     /**
267      * @param resourcesBaseDirectory Set the resource base directory.
268      */
269     public void setResourcesBaseDirectory( File resourcesBaseDirectory )
270     {
271         this.resourcesBaseDirectory = resourcesBaseDirectory;
272     }
273 
274     /**
275      * @return use default filter wrapper
276      */
277     public boolean isUseDefaultFilterWrappers()
278     {
279         return useDefaultFilterWrappers;
280     }
281 
282     /**
283      * @param useDefaultFilterWrappers {@link #useDefaultFilterWrappers}
284      */
285     public void setUseDefaultFilterWrappers( boolean useDefaultFilterWrappers )
286     {
287         this.useDefaultFilterWrappers = useDefaultFilterWrappers;
288     }
289 
290     /**
291      * Overwrite existing files even if the destination files are newer.
292      *
293      * @return {@link #overwrite}
294      * @since 1.0-beta-2
295      */
296     public boolean isOverwrite()
297     {
298         return overwrite;
299     }
300 
301     /**
302      * Overwrite existing files even if the destination files are newer.
303      *
304      * @param overwrite overwrite true or false.
305      * @since 1.0-beta-2
306      */
307     public void setOverwrite( boolean overwrite )
308     {
309         this.overwrite = overwrite;
310     }
311 
312     /**
313      * Copy any empty directories included in the Resources.
314      *
315      * @return {@link #includeEmptyDirs}
316      * @since 1.0-beta-2
317      */
318     public boolean isIncludeEmptyDirs()
319     {
320         return includeEmptyDirs;
321     }
322 
323     /**
324      * Copy any empty directories included in the Resources.
325      *
326      * @param includeEmptyDirs {@code true} to include empty directories, otherwise {@code false}.
327      * @since 1.0-beta-2
328      */
329     public void setIncludeEmptyDirs( boolean includeEmptyDirs )
330     {
331         this.includeEmptyDirs = includeEmptyDirs;
332     }
333 
334     /**
335      * @return {@code true} if filenames are filtered, otherwise {@code false}
336      * @since 1.2
337      */
338     public boolean isFilterFilenames()
339     {
340         return filterFilenames;
341     }
342 
343     /**
344      * @param filterFilenames {@code true} if filenames should be filtered, otherwise {@code false}
345      * @since 1.2
346      */
347     public void setFilterFilenames( boolean filterFilenames )
348     {
349         this.filterFilenames = filterFilenames;
350     }
351 
352     /**
353      * @return {@link MavenResourcesExecution}
354      */
355     public MavenResourcesExecution copyOf()
356     {
357         MavenResourcesExecution mre = new MavenResourcesExecution();
358         mre.setAdditionalProperties( mre.getAdditionalProperties() );
359         mre.setEncoding( mre.getEncoding() );
360         mre.setEscapedBackslashesInFilePath( mre.isEscapedBackslashesInFilePath() );
361         mre.setEscapeString( mre.getEscapeString() );
362         mre.setFileFilters( copyList( mre.getFileFilters() ) );
363         mre.setFilterWrappers( copyList( mre.getFilterWrappers() ) );
364         mre.setIncludeEmptyDirs( mre.isIncludeEmptyDirs() );
365         mre.setInjectProjectBuildFilters( mre.isInjectProjectBuildFilters() );
366         mre.setMavenProject( mre.getMavenProject() );
367         mre.setMavenSession( mre.getMavenSession() );
368         mre.setNonFilteredFileExtensions( copyList( mre.getNonFilteredFileExtensions() ) );
369         mre.setOutputDirectory( mre.getOutputDirectory() );
370         mre.setOverwrite( mre.isOverwrite() );
371         mre.setProjectStartExpressions( copyList( mre.getProjectStartExpressions() ) );
372         mre.setResources( copyList( mre.getResources() ) );
373         mre.setResourcesBaseDirectory( mre.getResourcesBaseDirectory() );
374         mre.setUseDefaultFilterWrappers( mre.isUseDefaultFilterWrappers() );
375         mre.setSupportMultiLineFiltering( mre.isSupportMultiLineFiltering() );
376         return mre;
377     }
378 
379     private <T> List<T> copyList( List<T> lst )
380     {
381         if ( lst == null )
382         {
383             return null;
384         }
385         else if ( lst.isEmpty() )
386         {
387             return new ArrayList<T>();
388         }
389         else
390         {
391             return new ArrayList<T>( lst );
392         }
393     }
394 
395     /** {@inheritDoc} */
396     public boolean isSupportMultiLineFiltering()
397     {
398         return supportMultiLineFiltering;
399     }
400 
401     /** {@inheritDoc} */
402     public void setSupportMultiLineFiltering( boolean supportMultiLineFiltering )
403     {
404         this.supportMultiLineFiltering = supportMultiLineFiltering;
405     }
406 }