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