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