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.project.MavenProject;
29  import org.codehaus.plexus.interpolation.Interpolator;
30  import org.codehaus.plexus.interpolation.RegexBasedInterpolator;
31  import org.codehaus.plexus.interpolation.StringSearchInterpolator;
32  import org.codehaus.plexus.interpolation.ValueSource;
33  import org.codehaus.plexus.util.FileUtils;
34  import org.codehaus.plexus.util.FileUtils.FilterWrapper;
35  
36  /**
37   * A bean to configure a resources filtering execution.
38   *
39   * @author <a href="mailto:olamy@apache.org">olamy</a>
40   * @version $Id: MavenResourcesExecution.java 1057398 2011-01-10 22:18:08Z dennisl $
41   */
42  public class MavenResourcesExecution
43      extends AbstractMavenFilteringRequest
44  {
45     
46      /** @see org.apache.maven.model.Resource  */
47      private List resources;
48  
49      private File outputDirectory;
50  
51      private List nonFilteredFileExtensions;
52  
53      /** @see FileUtils.FilterWrapper */
54      private List filterWrappers;
55  
56      private File resourcesBaseDirectory;
57  
58      private boolean useDefaultFilterWrappers = false;
59      
60      /**
61       * Overwrite existing files even if the destination files are newer.
62       * <code>false</code> by default.
63       *
64       * @since 1.0-beta-2
65       */
66      private boolean overwrite = false;
67      
68      /**
69       * Copy any empty directories included in the Resources.
70       *
71       * @since 1.0-beta-2
72       */
73      private boolean includeEmptyDirs = false;
74      
75      /**
76       * Do not stop trying to filter tokens when reaching EOL.
77       *
78       * @since 1.0
79       */
80      private boolean supportMultiLineFiltering;    
81      
82      public MavenResourcesExecution()
83      {
84          // no op
85      }
86      
87      /**
88       * As we use a Maven project <code>useDefaultFilterWrappers</code> will be set to <code>true</code>.
89       *
90       * @param resources
91       * @param outputDirectory
92       * @param mavenProject
93       * @param encoding
94       * @param fileFilters
95       * @param nonFilteredFileExtensions
96       * @param mavenSession
97       */
98      public MavenResourcesExecution( List resources, File outputDirectory, MavenProject mavenProject, String encoding,
99                                      List fileFilters, List nonFilteredFileExtensions, MavenSession mavenSession )
100     {
101         super( mavenProject, fileFilters, encoding, mavenSession );
102         this.resources = resources;
103         this.outputDirectory = outputDirectory;
104         this.nonFilteredFileExtensions = nonFilteredFileExtensions;
105         this.useDefaultFilterWrappers = true;
106         this.resourcesBaseDirectory = mavenProject.getBasedir();
107     }
108 
109     public MavenResourcesExecution( List resources, File outputDirectory, String encoding, List filterWrappers,
110                                     File resourcesBaseDirectory, List nonFilteredFileExtensions )
111     {
112         this();
113         this.resources = resources;
114         this.outputDirectory = outputDirectory;
115         this.filterWrappers = filterWrappers;
116         this.nonFilteredFileExtensions = nonFilteredFileExtensions;
117         this.resourcesBaseDirectory = resourcesBaseDirectory;
118         this.useDefaultFilterWrappers = false;
119         setEncoding( encoding );
120     }
121 
122     
123     /**
124      * @return List of {@link org.apache.maven.model.Resource}
125      */
126     public List getResources()
127     {
128         return resources;
129     }
130 
131     /**
132      * @param resources List of {@link org.apache.maven.model.Resource}
133      */
134     public void setResources( List resources )
135     {
136         this.resources = resources;
137     }
138 
139     public File getOutputDirectory()
140     {
141         return outputDirectory;
142     }
143 
144     public void setOutputDirectory( File outputDirectory )
145     {
146         this.outputDirectory = outputDirectory;
147     }
148 
149     /**
150      * @return List of {@link String} file extensions to not filter
151      */
152     public List getNonFilteredFileExtensions()
153     {
154         return nonFilteredFileExtensions;
155     }
156 
157     /**
158      * @param nonFilteredFileExtensions List of {@link String} file extensions to not filter
159      */
160     public void setNonFilteredFileExtensions( List nonFilteredFileExtensions )
161     {
162         this.nonFilteredFileExtensions = nonFilteredFileExtensions;
163     }
164 
165     /**
166      * @return List of {@link FileUtils.FilterWrapper}
167      */
168     public List getFilterWrappers()
169     {
170         return filterWrappers;
171     }
172 
173     /**
174      * @param filterWrappers List of {@link FileUtils.FilterWrapper}
175      */
176     public void setFilterWrappers( List filterWrappers )
177     {
178         this.filterWrappers = filterWrappers;
179     }
180     
181     public void addFilterWrapper( FilterWrapper filterWrapper )
182     {
183         if ( this.filterWrappers == null )
184         {
185             this.filterWrappers = new ArrayList();
186         }
187         this.filterWrappers.add( filterWrapper );
188     }
189     
190     /**
191      * Helper to add {@link FileUtils.FilterWrapper}, will {@link RegexBasedInterpolator} with default regex Exp ${ } 
192      * and InterpolatorFilterReaderLineEnding with defaultTokens ${ }.
193      *
194      * @param valueSource 
195      * @deprecated This doesn't support escaping use {@link #addFilerWrapperWithEscaping(ValueSource, String, String, String, boolean)}
196      */
197     public void addFilerWrapper( final ValueSource valueSource )
198     {
199         addFilterWrapper( new FileUtils.FilterWrapper()
200         {
201             public Reader getReader( Reader reader )
202             {
203                 Interpolator propertiesInterpolator = new RegexBasedInterpolator();
204                 propertiesInterpolator.addValueSource( valueSource );
205                 return new InterpolatorFilterReaderLineEnding( reader, propertiesInterpolator,
206                                                                InterpolatorFilterReaderLineEnding.DEFAULT_BEGIN_TOKEN,
207                                                                InterpolatorFilterReaderLineEnding.DEFAULT_END_TOKEN,
208                                                                false );
209             }
210         } );
211     }
212 
213     /**
214      * @param valueSource
215      * @param startRegExp
216      * @param endRegExp
217      * @param startToken
218      * @param endToken
219      * @deprecated This doesn't support escaping use {@link #addFilerWrapperWithEscaping(ValueSource, String, String, String, boolean)}
220      */
221     public void addFilerWrapper( final ValueSource valueSource, final String startRegExp, final String endRegExp,
222                                  final String startToken, final String endToken )
223     {
224         addFilterWrapper( new FileUtils.FilterWrapper()
225         {
226             public Reader getReader( Reader reader )
227             {
228                 Interpolator propertiesInterpolator = new RegexBasedInterpolator( startRegExp, endRegExp );
229                 propertiesInterpolator.addValueSource( valueSource );
230                 return new InterpolatorFilterReaderLineEnding( reader, propertiesInterpolator, startToken, endToken,
231                                                                false );
232             }
233         } );
234     }  
235     
236     /**
237      * @param valueSource
238      * @param startExp start token like ${
239      * @param endExp endToken }
240      * @since 1.0-beta-2
241      * @param escapeString
242      * @deprecated This doesn't support escaping use {@link #addFilerWrapperWithEscaping(ValueSource, String, String, String, boolean)}
243      */
244     public void addFilerWrapperWithEscaping( final ValueSource valueSource, final String startExp, final String endExp,
245                                              final String escapeString )
246     {
247         addFilterWrapper( new FileUtils.FilterWrapper()
248         {
249             public Reader getReader( Reader reader )
250             {
251                 StringSearchInterpolator propertiesInterpolator = new StringSearchInterpolator( startExp, endExp );
252                 propertiesInterpolator.addValueSource( valueSource );
253                 propertiesInterpolator.setEscapeString( escapeString );
254                 InterpolatorFilterReaderLineEnding interpolatorFilterReader
255                     = new InterpolatorFilterReaderLineEnding( reader,
256                                                               propertiesInterpolator,
257                                                               startExp, endExp, false );
258                 interpolatorFilterReader.setInterpolateWithPrefixPattern( false );
259                 return interpolatorFilterReader;
260             }
261         } );
262     } 
263     
264     /**
265      * @param valueSource
266      * @param startExp start token like ${
267      * @param endExp endToken }
268      * @param escapeString
269      * @param supportMultiLineFiltering do we support or use filtering on multi lines with start and endtoken on multi lines
270      * @since 1.0
271      */
272     public void addFilerWrapperWithEscaping( final ValueSource valueSource, final String startExp, final String endExp,
273                                              final String escapeString, final boolean supportMultiLineFiltering )
274     {
275         addFilterWrapper( new FileUtils.FilterWrapper()
276         {
277             public Reader getReader( Reader reader )
278             {
279                 StringSearchInterpolator propertiesInterpolator = new StringSearchInterpolator( startExp, endExp );
280                 propertiesInterpolator.addValueSource( valueSource );
281                 propertiesInterpolator.setEscapeString( escapeString );
282                 InterpolatorFilterReaderLineEnding interpolatorFilterReader
283                     = new InterpolatorFilterReaderLineEnding( reader,
284                                                               propertiesInterpolator,
285                                                               startExp, endExp, 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     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 List copyList( List lst )
380     {
381         if ( lst == null )
382         {
383             return null;
384         }
385         else if ( lst.isEmpty() )
386         {
387             return new ArrayList();
388         }
389         else
390         {
391             return new ArrayList( lst );
392         }
393     }
394 
395     public boolean isSupportMultiLineFiltering()
396     {
397         return supportMultiLineFiltering;
398     }
399 
400     public void setSupportMultiLineFiltering( boolean supportMultiLineFiltering )
401     {
402         this.supportMultiLineFiltering = supportMultiLineFiltering;
403     }
404 }