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.io.StringReader;
25  import java.nio.file.Files;
26  import java.util.ArrayList;
27  import java.util.Arrays;
28  import java.util.Collections;
29  import java.util.LinkedHashSet;
30  import java.util.List;
31  import java.util.Properties;
32  
33  import org.apache.commons.io.IOUtils;
34  import org.apache.maven.project.MavenProject;
35  import org.apache.maven.shared.utils.io.FileUtils.FilterWrapper;
36  import org.codehaus.plexus.PlexusTestCase;
37  
38  /**
39   * @author Olivier Lamy
40   *
41   */
42  public class DefaultMavenFileFilterTest
43      extends PlexusTestCase
44  {
45  
46      File to = new File( getBasedir(), "target/reflection-test.properties" );
47  
48      @Override
49      protected void setUp()
50          throws Exception
51      {
52          super.setUp();
53          Files.deleteIfExists( to.toPath() );
54      }
55  
56      public void testNotOverwriteFile()
57          throws Exception
58      {
59          MavenFileFilter mavenFileFilter = lookup( MavenFileFilter.class );
60  
61          File from = new File( getBasedir(), "src/test/units-files/reflection-test.properties" );
62  
63          mavenFileFilter.copyFile( from, to, false, null, null );
64  
65          from = new File( getBasedir(), "src/test/units-files/reflection-test-older.properties" );
66  
67          // very old file :-)
68          from.setLastModified( 1 );
69  
70          to.setLastModified( System.currentTimeMillis() );
71  
72          mavenFileFilter.copyFile( from, to, false, null, null );
73  
74          Properties properties = PropertyUtils.loadPropertyFile( to, null );
75          assertEquals( "${pom.version}", properties.getProperty( "version" ) );
76  
77      }
78  
79      public void testOverwriteFile()
80          throws Exception
81      {
82          MavenFileFilter mavenFileFilter = lookup( MavenFileFilter.class );
83  
84          File from = new File( getBasedir(), "src/test/units-files/reflection-test.properties" );
85  
86          mavenFileFilter.copyFile( from, to, false, null, null );
87  
88          from = new File( getBasedir(), "src/test/units-files/reflection-test-older.properties" );
89  
90          // very old file :-)
91          from.setLastModified( 1 );
92  
93          to.setLastModified( System.currentTimeMillis() );
94  
95          mavenFileFilter.copyFile( from, to, false, null, null, true );
96  
97          Properties properties = PropertyUtils.loadPropertyFile( to, null );
98          assertEquals( "older file", properties.getProperty( "version" ) );
99  
100     }
101 
102     public void testNullSafeDefaultFilterWrappers()
103         throws Exception
104     {
105         MavenFileFilter mavenFileFilter = lookup( MavenFileFilter.class );
106 
107         mavenFileFilter.getDefaultFilterWrappers( null, null, false, null, null );
108 
109         // shouldn't fail
110     }
111 
112     public void testMultiFilterFileInheritance()
113         throws Exception
114     {
115         DefaultMavenFileFilter mavenFileFilter = new DefaultMavenFileFilter();
116 
117         File testDir = new File( getBasedir(), "src/test/units-files/MSHARED-177" );
118 
119         List<String> filters = new ArrayList<>();
120 
121         filters.add( new File( testDir, "first_filter_file.properties" ).getAbsolutePath() );
122         filters.add( new File( testDir, "second_filter_file.properties" ).getAbsolutePath() );
123         filters.add( new File( testDir, "third_filter_file.properties" ).getAbsolutePath() );
124 
125         final Properties filterProperties = new Properties();
126 
127         mavenFileFilter.loadProperties( filterProperties, new File( getBasedir() ), filters, new Properties() );
128 
129         assertTrue( filterProperties.getProperty( "third_filter_key" ).equals( "first and second" ) );
130     }
131 
132     // MSHARED-161: DefaultMavenFileFilter.getDefaultFilterWrappers loads
133     // filters from the current directory instead of using basedir
134     public void testMavenBasedir()
135         throws Exception
136     {
137         MavenFileFilter mavenFileFilter = lookup( MavenFileFilter.class );
138 
139         AbstractMavenFilteringRequest req = new AbstractMavenFilteringRequest();
140         req.setFileFilters( Collections.singletonList( "src/main/filters/filefilter.properties" ) );
141 
142         MavenProject mavenProject = new StubMavenProject( new File( "src/test/units-files/MSHARED-161" ) );
143         mavenProject.getBuild().setFilters( Collections.singletonList( "src/main/filters/buildfilter.properties" ) );
144         req.setMavenProject( mavenProject );
145         req.setInjectProjectBuildFilters( true );
146 
147         List<FilterWrapper> wrappers = mavenFileFilter.getDefaultFilterWrappers( req );
148 
149         try ( Reader reader = wrappers.get( 0 ).getReader( new StringReader( "${filefilter} ${buildfilter}" ) ) )
150         {
151             assertEquals( "true true", IOUtils.toString( reader ) );
152         }
153     }
154 
155     // MSHARED-198: custom delimiters doesn't work as expected
156     public void testCustomDelimiters()
157         throws Exception
158     {
159         MavenFileFilter mavenFileFilter = lookup( MavenFileFilter.class );
160 
161         AbstractMavenFilteringRequest req = new AbstractMavenFilteringRequest();
162         Properties additionalProperties = new Properties();
163         additionalProperties.setProperty( "FILTER.a.ME", "DONE" );
164         req.setAdditionalProperties( additionalProperties );
165         req.setDelimiters( new LinkedHashSet<>( Arrays.asList( "aaa*aaa", "abc*abc" ) ) );
166 
167         List<FilterWrapper> wrappers = mavenFileFilter.getDefaultFilterWrappers( req );
168 
169         Reader reader = wrappers.get( 0 ).getReader( new StringReader( "aaaFILTER.a.MEaaa" ) );
170         assertEquals( "DONE", IOUtils.toString( reader ) );
171 
172         reader = wrappers.get( 0 ).getReader( new StringReader( "abcFILTER.a.MEabc" ) );
173         assertEquals( "DONE", IOUtils.toString( reader ) );
174     }
175 
176     // MSHARED-199: Filtering doesn't work if 2 delimiters are used on the same line, the first one being left open
177     public void testLineWithSingleAtAndExpression()
178         throws Exception
179     {
180         MavenFileFilter mavenFileFilter = lookup( MavenFileFilter.class );
181 
182         AbstractMavenFilteringRequest req = new AbstractMavenFilteringRequest();
183         Properties additionalProperties = new Properties();
184         additionalProperties.setProperty( "foo", "bar" );
185         req.setAdditionalProperties( additionalProperties );
186 
187         List<FilterWrapper> wrappers = mavenFileFilter.getDefaultFilterWrappers( req );
188 
189         try ( Reader reader = wrappers.get( 0 ).getReader( new StringReader( "toto@titi.com ${foo}" ) ) )
190         {
191             assertEquals( "toto@titi.com bar", IOUtils.toString( reader ) );
192         }
193     }
194 }