You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by kr...@apache.org on 2014/10/14 20:49:31 UTC

svn commit: r1631834 - in /maven/shared/trunk/maven-filtering/src: main/java/org/apache/maven/shared/filtering/ test/java/org/apache/maven/shared/filtering/

Author: krosenvold
Date: Tue Oct 14 18:49:30 2014
New Revision: 1631834

URL: http://svn.apache.org/r1631834
Log:
[MSHARED-366] Added reader based api which avoids using files

File based version delegates to reader based version. Testcase added for reader based version,
although most features are tested via the file based version

Added:
    maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/BaseFilter.java
    maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/DefaultFilterInfo.java
    maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/DefaultMavenReaderFilter.java
    maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/MavenReaderFilter.java
    maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/MavenReaderFilterRequest.java
    maven/shared/trunk/maven-filtering/src/test/java/org/apache/maven/shared/filtering/DefaultMavenReaderFilterTest.java
Modified:
    maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java
    maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/MavenFileFilter.java

Added: maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/BaseFilter.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/BaseFilter.java?rev=1631834&view=auto
==============================================================================
--- maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/BaseFilter.java (added)
+++ maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/BaseFilter.java Tue Oct 14 18:49:30 2014
@@ -0,0 +1,291 @@
+package org.apache.maven.shared.filtering;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.Reader;
+import java.util.*;
+
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.settings.Settings;
+import org.apache.maven.shared.utils.StringUtils;
+import org.apache.maven.shared.utils.io.FileUtils;
+import org.codehaus.plexus.interpolation.*;
+import org.codehaus.plexus.interpolation.multi.MultiDelimiterStringSearchInterpolator;
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+
+import javax.annotation.Nonnull;
+
+class BaseFilter extends AbstractLogEnabled implements DefaultFilterInfo {
+
+
+	/**
+	 * @see org.apache.maven.shared.filtering.MavenFileFilter#getDefaultFilterWrappers(org.apache.maven.project.MavenProject, java.util.List, boolean, org.apache.maven.execution.MavenSession)
+	 * @deprecated
+	 */
+	public List<FileUtils.FilterWrapper> getDefaultFilterWrappers( final MavenProject mavenProject,
+			List<String> filters,
+			final boolean escapedBackslashesInFilePath,
+			MavenSession mavenSession )
+			throws MavenFilteringException
+	{
+		return getDefaultFilterWrappers( mavenProject, filters, escapedBackslashesInFilePath, mavenSession, null );
+	}
+
+
+	@Nonnull public List<FileUtils.FilterWrapper> getDefaultFilterWrappers( final MavenProject mavenProject, List<String> filters,
+			final boolean escapedBackslashesInFilePath,
+			MavenSession mavenSession,
+			MavenResourcesExecution mavenResourcesExecution )
+			throws MavenFilteringException
+	{
+
+		MavenResourcesExecution mre =
+				mavenResourcesExecution == null ? new MavenResourcesExecution() : mavenResourcesExecution.copyOf();
+
+		mre.setMavenProject( mavenProject );
+		mre.setMavenSession( mavenSession );
+		mre.setFilters( filters );
+		mre.setEscapedBackslashesInFilePath( escapedBackslashesInFilePath );
+
+		return getDefaultFilterWrappers( mre );
+
+	}
+
+	@Nonnull public List<FileUtils.FilterWrapper> getDefaultFilterWrappers( final AbstractMavenFilteringRequest req )
+			throws MavenFilteringException
+	{
+		// backup values
+		boolean supportMultiLineFiltering = req.isSupportMultiLineFiltering();
+
+		// compensate for null parameter value.
+		final AbstractMavenFilteringRequest request = req == null ? new MavenFileFilterRequest() : req;
+
+		request.setSupportMultiLineFiltering( supportMultiLineFiltering );
+
+		// Here we build some properties which will be used to read some properties files
+		// to interpolate the expression ${ } in this properties file
+
+		// Take a copy of filterProperties to ensure that evaluated filterTokens are not propagated
+		// to subsequent filter files. Note: this replicates current behaviour and seems to make sense.
+
+		final Properties baseProps = new Properties();
+
+		// Project properties
+		if ( request.getMavenProject() != null )
+		{
+			baseProps.putAll( request.getMavenProject().getProperties() == null
+					? Collections.emptyMap()
+					: request.getMavenProject().getProperties() );
+		}
+		// TODO this is NPE free but do we consider this as normal
+		// or do we have to throw an MavenFilteringException with mavenSession cannot be null
+		if ( request.getMavenSession() != null )
+		{
+			// execution properties wins
+			baseProps.putAll( request.getMavenSession().getExecutionProperties() );
+		}
+
+		// now we build properties to use for resources interpolation
+
+		final Properties filterProperties = new Properties();
+
+		File basedir = request.getMavenProject() != null ? request.getMavenProject().getBasedir() : new File( "." );
+
+		loadProperties( filterProperties, basedir, request.getFileFilters(), baseProps );
+		if ( filterProperties.size() < 1 )
+		{
+			filterProperties.putAll( baseProps );
+		}
+
+		if ( request.getMavenProject() != null )
+		{
+			if ( request.isInjectProjectBuildFilters() )
+			{
+				@SuppressWarnings( "unchecked" )
+				List<String> buildFilters = new ArrayList<String>( request.getMavenProject().getBuild().getFilters() );
+
+				// JDK-8015656: (coll) unexpected NPE from removeAll
+				if ( request.getFileFilters() != null )
+				{
+					buildFilters.removeAll( request.getFileFilters() );
+				}
+
+				loadProperties( filterProperties, basedir, buildFilters, baseProps );
+			}
+
+			// Project properties
+			filterProperties.putAll( request.getMavenProject().getProperties() == null
+					? Collections.emptyMap()
+					: request.getMavenProject().getProperties() );
+		}
+		if ( request.getMavenSession() != null )
+		{
+			// execution properties wins
+			filterProperties.putAll( request.getMavenSession().getExecutionProperties() );
+		}
+
+		if ( request.getAdditionalProperties() != null )
+		{
+			// additional properties wins
+			filterProperties.putAll( request.getAdditionalProperties() );
+		}
+
+		List<FileUtils.FilterWrapper> defaultFilterWrappers = request == null
+				? new ArrayList<FileUtils.FilterWrapper>( 1 )
+				: new ArrayList<FileUtils.FilterWrapper>( request.getDelimiters().size() + 1 );
+
+		if ( getLogger().isDebugEnabled() )
+		{
+			getLogger().debug( "properties used " + filterProperties );
+		}
+
+		final ValueSource propertiesValueSource = new PropertiesBasedValueSource( filterProperties );
+
+		if ( request != null )
+		{
+			FileUtils.FilterWrapper wrapper =
+					new Wrapper( request.getDelimiters(), request.getMavenProject(), request.getMavenSession(),
+							propertiesValueSource, request.getProjectStartExpressions(), request.getEscapeString(),
+							request.isEscapeWindowsPaths(), request.isSupportMultiLineFiltering() );
+
+			defaultFilterWrappers.add( wrapper );
+		}
+
+		return defaultFilterWrappers;
+	}
+
+	/**
+	 * default visibility only for testing reason !
+	 */
+	void loadProperties( Properties filterProperties, File basedir, List<String> propertiesFilePaths, Properties baseProps )
+			throws MavenFilteringException
+	{
+		if ( propertiesFilePaths != null )
+		{
+			Properties workProperties = new Properties();
+			workProperties.putAll( baseProps );
+
+			for ( String filterFile : propertiesFilePaths )
+			{
+				if ( StringUtils.isEmpty(filterFile) )
+				{
+					// skip empty file name
+					continue;
+				}
+				try
+				{
+					File propFile = FileUtils.resolveFile( basedir, filterFile );
+					Properties properties = PropertyUtils.loadPropertyFile( propFile, workProperties );
+					filterProperties.putAll( properties );
+					workProperties.putAll( properties );
+				}
+				catch ( IOException e )
+				{
+					throw new MavenFilteringException( "Error loading property file '" + filterFile + "'", e );
+				}
+			}
+		}
+	}
+
+	private static final class Wrapper
+			extends FileUtils.FilterWrapper
+	{
+
+		private LinkedHashSet<String> delimiters;
+
+		private MavenProject project;
+
+		private ValueSource propertiesValueSource;
+
+		private List<String> projectStartExpressions;
+
+		private String escapeString;
+
+		private boolean escapeWindowsPaths;
+
+		private final MavenSession mavenSession;
+
+		private boolean supportMultiLineFiltering;
+
+		Wrapper( LinkedHashSet<String> delimiters, MavenProject project, MavenSession mavenSession,
+				ValueSource propertiesValueSource, List<String> projectStartExpressions, String escapeString,
+				boolean escapeWindowsPaths, boolean supportMultiLineFiltering )
+		{
+			super();
+			this.delimiters = delimiters;
+			this.project = project;
+			this.mavenSession = mavenSession;
+			this.propertiesValueSource = propertiesValueSource;
+			this.projectStartExpressions = projectStartExpressions;
+			this.escapeString = escapeString;
+			this.escapeWindowsPaths = escapeWindowsPaths;
+			this.supportMultiLineFiltering = supportMultiLineFiltering;
+		}
+
+		public Reader getReader( Reader reader )
+		{
+			MultiDelimiterStringSearchInterpolator interpolator = new MultiDelimiterStringSearchInterpolator();
+			interpolator.setDelimiterSpecs( delimiters );
+
+			RecursionInterceptor ri = null;
+			if ( projectStartExpressions != null && !projectStartExpressions.isEmpty() )
+			{
+				ri = new PrefixAwareRecursionInterceptor( projectStartExpressions, true );
+			}
+			else
+			{
+				ri = new SimpleRecursionInterceptor();
+			}
+
+			interpolator.addValueSource( propertiesValueSource );
+
+			if ( project != null )
+			{
+				interpolator.addValueSource( new PrefixedObjectValueSource( projectStartExpressions, project, true ) );
+			}
+
+			if ( mavenSession != null )
+			{
+				interpolator.addValueSource( new PrefixedObjectValueSource( "session", mavenSession ) );
+
+				final Settings settings = mavenSession.getSettings();
+				if ( settings != null )
+				{
+					interpolator.addValueSource( new PrefixedObjectValueSource( "settings", settings ) );
+					interpolator.addValueSource(
+							new SingleResponseValueSource( "localRepository", settings.getLocalRepository() ) );
+				}
+			}
+
+			interpolator.setEscapeString( escapeString );
+
+			if ( escapeWindowsPaths )
+			{
+				interpolator.addPostProcessor( new InterpolationPostProcessor()
+				{
+					public Object execute( String expression, Object value )
+					{
+						if ( value instanceof String )
+						{
+							return FilteringUtils.escapeWindowsPath( (String) value );
+						}
+
+						return value;
+					}
+				} );
+			}
+
+			MultiDelimiterInterpolatorFilterReaderLineEnding filterReader =
+					new MultiDelimiterInterpolatorFilterReaderLineEnding( reader, interpolator, supportMultiLineFiltering );
+			filterReader.setRecursionInterceptor( ri );
+			filterReader.setDelimiterSpecs( delimiters );
+
+			filterReader.setInterpolateWithPrefixPattern( false );
+			filterReader.setEscapeString( escapeString );
+
+			return filterReader;
+		}
+
+	}
+}

Added: maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/DefaultFilterInfo.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/DefaultFilterInfo.java?rev=1631834&view=auto
==============================================================================
--- maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/DefaultFilterInfo.java (added)
+++ maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/DefaultFilterInfo.java Tue Oct 14 18:49:30 2014
@@ -0,0 +1,77 @@
+package org.apache.maven.shared.filtering;
+
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.util.List;
+
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.shared.utils.io.FileUtils;
+
+import javax.annotation.Nonnull;
+
+public interface DefaultFilterInfo {
+	/**
+	 * Will return the default FileUtils.FilterWrappers.
+	 * <p/>
+	 * <ul>
+	 * <li>interpolate with token ${} and values from sysProps, project.properties, filters and project filters.</li>
+	 * <li>interpolate with token @ @ and values from sysProps, project.properties, filters and project filters.</li>
+	 * <li>interpolate with token ${} and values from mavenProject interpolation.</li>
+	 * <li>interpolation with token @ @ and values from mavenProject interpolation</li>
+	 * </ul>
+	 * <b>This method is now deprecated and no escape mechanism will be used.</b>
+	 *
+	 * @param mavenProject
+	 * @param filters      {@link java.util.List} of properties file
+	 * @return {@link java.util.List} of FileUtils.FilterWrapper
+	 * @deprecated use {@link #getDefaultFilterWrappers(org.apache.maven.project.MavenProject, java.util.List, boolean, org.apache.maven.execution.MavenSession, org.apache.maven.shared.filtering.MavenResourcesExecution)}
+	 */
+	@Nonnull List<FileUtils.FilterWrapper> getDefaultFilterWrappers(MavenProject mavenProject, List<String> filters,
+			boolean escapedBackslashesInFilePath,
+			MavenSession mavenSession)
+			throws MavenFilteringException;
+
+	/**
+	 * @param mavenProject
+	 * @param filters
+	 * @param escapedBackslashesInFilePath
+	 * @param mavenSession
+	 * @param mavenResourcesExecution
+	 * @return {@link java.util.List} of FileUtils.FilterWrapper
+	 * @throws org.apache.maven.shared.filtering.MavenFilteringException
+	 * @since 1.0-beta-2
+	 */
+	@Nonnull List<FileUtils.FilterWrapper> getDefaultFilterWrappers(MavenProject mavenProject, List<String> filters,
+			boolean escapedBackslashesInFilePath,
+			MavenSession mavenSession,
+			MavenResourcesExecution mavenResourcesExecution)
+			throws MavenFilteringException;
+
+	/**
+	 * @param request
+	 * @return {@link java.util.List} of FileUtils.FilterWrapper
+	 * @throws org.apache.maven.shared.filtering.MavenFilteringException
+	 * @since 1.0-beta-3
+	 */
+	@Nonnull List<FileUtils.FilterWrapper> getDefaultFilterWrappers(AbstractMavenFilteringRequest request)
+			throws MavenFilteringException;
+}

Modified: maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java?rev=1631834&r1=1631833&r2=1631834&view=diff
==============================================================================
--- maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java (original)
+++ maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java Tue Oct 14 18:49:30 2014
@@ -19,47 +19,50 @@ package org.apache.maven.shared.filterin
  * under the License.
  */
 
-import java.io.File;
-import java.io.IOException;
-import java.io.Reader;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Properties;
-
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.project.MavenProject;
-import org.apache.maven.settings.Settings;
 import org.apache.maven.shared.utils.StringUtils;
 import org.apache.maven.shared.utils.io.FileUtils;
 import org.apache.maven.shared.utils.io.FileUtils.FilterWrapper;
-import org.codehaus.plexus.interpolation.InterpolationPostProcessor;
-import org.codehaus.plexus.interpolation.PrefixAwareRecursionInterceptor;
-import org.codehaus.plexus.interpolation.PrefixedObjectValueSource;
-import org.codehaus.plexus.interpolation.PropertiesBasedValueSource;
-import org.codehaus.plexus.interpolation.RecursionInterceptor;
-import org.codehaus.plexus.interpolation.SimpleRecursionInterceptor;
-import org.codehaus.plexus.interpolation.SingleResponseValueSource;
-import org.codehaus.plexus.interpolation.ValueSource;
-import org.codehaus.plexus.interpolation.multi.MultiDelimiterStringSearchInterpolator;
-import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.apache.maven.shared.utils.io.IOUtil;
 import org.sonatype.plexus.build.incremental.BuildContext;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+import java.util.Arrays;
+import java.util.List;
+
 /**
  * @author Olivier Lamy
- *
  * @plexus.component role="org.apache.maven.shared.filtering.MavenFileFilter"
  * role-hint="default"
  */
 public class DefaultMavenFileFilter
-    extends AbstractLogEnabled
+    extends BaseFilter
     implements MavenFileFilter
 {
 
     /**
      * @plexus.requirement
      */
+    private MavenReaderFilter readerFilter;
+
+    /**
+     * @plexus.requirement
+     */
     private BuildContext buildContext;
 
     public void copyFile( File from, File to, boolean filtering, MavenProject mavenProject, List<String> filters,
@@ -109,9 +112,7 @@ public class DefaultMavenFileFilter
                 {
                     getLogger().debug( "filtering " + from.getPath() + " to " + to.getPath() );
                 }
-                FileUtils.FilterWrapper[] wrappers = filterWrappers.toArray(
-                    new FileUtils.FilterWrapper[filterWrappers.size()] );
-                FileUtils.copyFile( from, to, encoding, wrappers );
+                filterFile( from, to, encoding, filterWrappers );
             }
             else
             {
@@ -131,274 +132,66 @@ public class DefaultMavenFileFilter
 
     }
 
-    /**
-     * @see org.apache.maven.shared.filtering.MavenFileFilter#getDefaultFilterWrappers(org.apache.maven.project.MavenProject, java.util.List, boolean, org.apache.maven.execution.MavenSession)
-     * @deprecated
-     */
-    public List<FileUtils.FilterWrapper> getDefaultFilterWrappers( final MavenProject mavenProject,
-                                                                   List<String> filters,
-                                                                   final boolean escapedBackslashesInFilePath,
-                                                                   MavenSession mavenSession )
-        throws MavenFilteringException
-    {
-        return getDefaultFilterWrappers( mavenProject, filters, escapedBackslashesInFilePath, mavenSession, null );
-    }
-
-
-    public List<FileUtils.FilterWrapper> getDefaultFilterWrappers( final MavenProject mavenProject, List<String> filters,
-                                                                   final boolean escapedBackslashesInFilePath,
-                                                                   MavenSession mavenSession,
-                                                                   MavenResourcesExecution mavenResourcesExecution )
-        throws MavenFilteringException
-    {
-
-        MavenResourcesExecution mre =
-            mavenResourcesExecution == null ? new MavenResourcesExecution() : mavenResourcesExecution.copyOf();
-
-        mre.setMavenProject( mavenProject );
-        mre.setMavenSession( mavenSession );
-        mre.setFilters( filters );
-        mre.setEscapedBackslashesInFilePath( escapedBackslashesInFilePath );
-
-        return getDefaultFilterWrappers( mre );
-
-    }
-
-    public List<FileUtils.FilterWrapper> getDefaultFilterWrappers( final AbstractMavenFilteringRequest req )
-        throws MavenFilteringException
+    private void filterFile( @Nonnull File from, @Nonnull File to, @Nullable String encoding,
+                             @Nullable List<FilterWrapper> wrappers )
+        throws IOException, MavenFilteringException
     {
-        // backup values
-        boolean supportMultiLineFiltering = req.isSupportMultiLineFiltering();
-
-        // compensate for null parameter value.
-        final AbstractMavenFilteringRequest request = req == null ? new MavenFileFilterRequest() : req;
-
-        request.setSupportMultiLineFiltering( supportMultiLineFiltering );
-
-        // Here we build some properties which will be used to read some properties files
-        // to interpolate the expression ${ } in this properties file
-
-        // Take a copy of filterProperties to ensure that evaluated filterTokens are not propagated
-        // to subsequent filter files. Note: this replicates current behaviour and seems to make sense.
-
-        final Properties baseProps = new Properties();
-
-        // Project properties
-        if ( request.getMavenProject() != null )
-        {
-            baseProps.putAll( request.getMavenProject().getProperties() == null
-                                  ? Collections.emptyMap()
-                                  : request.getMavenProject().getProperties() );
-        }
-        // TODO this is NPE free but do we consider this as normal
-        // or do we have to throw an MavenFilteringException with mavenSession cannot be null
-        if ( request.getMavenSession() != null )
-        {
-            // execution properties wins
-            baseProps.putAll( request.getMavenSession().getExecutionProperties() );
-        }
-
-        // now we build properties to use for resources interpolation
-
-        final Properties filterProperties = new Properties();
-
-        File basedir = request.getMavenProject() != null ? request.getMavenProject().getBasedir() : new File( "." ); 
-
-        loadProperties( filterProperties, basedir, request.getFileFilters(), baseProps );
-        if ( filterProperties.size() < 1 )
-        {
-            filterProperties.putAll( baseProps );
-        }
-
-        if ( request.getMavenProject() != null )
+        if ( wrappers != null && wrappers.size() > 0 )
         {
-            if ( request.isInjectProjectBuildFilters() )
+            Reader fileReader = null;
+            Writer fileWriter = null;
+            try
             {
-                @SuppressWarnings( "unchecked" )
-                List<String> buildFilters = new ArrayList<String>( request.getMavenProject().getBuild().getFilters() );
+                fileReader = getFileReader( encoding, from );
+                fileWriter = getFileWriter( encoding, to );
+                Reader src = readerFilter.filter( fileReader, true, wrappers );
 
-                // JDK-8015656: (coll) unexpected NPE from removeAll 
-                if ( request.getFileFilters() != null )
-                {
-                    buildFilters.removeAll( request.getFileFilters() );
-                }
-
-                loadProperties( filterProperties, basedir, buildFilters, baseProps );
+                IOUtil.copy( src, fileWriter );
+            }
+            finally
+            {
+                IOUtil.close( fileReader );
+                IOUtil.close( fileWriter );
             }
-
-            // Project properties
-            filterProperties.putAll( request.getMavenProject().getProperties() == null
-                                         ? Collections.emptyMap()
-                                         : request.getMavenProject().getProperties() );
-        }
-        if ( request.getMavenSession() != null )
-        {
-            // execution properties wins
-            filterProperties.putAll( request.getMavenSession().getExecutionProperties() );
-        }
-
-        if ( request.getAdditionalProperties() != null )
-        {
-            // additional properties wins
-            filterProperties.putAll( request.getAdditionalProperties() );
-        }
-
-        List<FileUtils.FilterWrapper> defaultFilterWrappers = request == null
-            ? new ArrayList<FileUtils.FilterWrapper>( 1 )
-            : new ArrayList<FileUtils.FilterWrapper>( request.getDelimiters().size() + 1 );
-
-        if ( getLogger().isDebugEnabled() )
-        {
-            getLogger().debug( "properties used " + filterProperties );
         }
-
-        final ValueSource propertiesValueSource = new PropertiesBasedValueSource( filterProperties );
-
-        if ( request != null )
+        else
         {
-            FileUtils.FilterWrapper wrapper =
-                new Wrapper( request.getDelimiters(), request.getMavenProject(), request.getMavenSession(),
-                             propertiesValueSource, request.getProjectStartExpressions(), request.getEscapeString(),
-                             request.isEscapeWindowsPaths(), request.isSupportMultiLineFiltering() );
-
-            defaultFilterWrappers.add( wrapper );
+            if ( to.lastModified() < from.lastModified()  )
+            {
+                FileUtils.copyFile( from, to );
+            }
         }
-
-        return defaultFilterWrappers;
     }
 
-    /**
-     * default visibility only for testing reason !
-     */
-    void loadProperties( Properties filterProperties, File basedir, List<String> propertiesFilePaths, Properties baseProps )
-        throws MavenFilteringException
+    private Writer getFileWriter( String encoding, File to )
+        throws IOException
     {
-        if ( propertiesFilePaths != null )
+        if ( StringUtils.isEmpty( encoding ) )
+        {
+            return new FileWriter( to );
+        }
+        else
         {
-            Properties workProperties = new Properties();
-            workProperties.putAll( baseProps );
+            FileOutputStream outstream = new FileOutputStream( to );
 
-            for ( String filterFile : propertiesFilePaths )
-            {
-                if ( StringUtils.isEmpty( filterFile ) )
-                {
-                    // skip empty file name
-                    continue;
-                }
-                try
-                {
-                    File propFile = FileUtils.resolveFile( basedir, filterFile );
-                    Properties properties = PropertyUtils.loadPropertyFile( propFile, workProperties );
-                    filterProperties.putAll( properties );
-                    workProperties.putAll( properties );
-                }
-                catch ( IOException e )
-                {
-                    throw new MavenFilteringException( "Error loading property file '" + filterFile + "'", e );
-                }
-            }
+            return new OutputStreamWriter( outstream, encoding );
         }
     }
 
-    private static final class Wrapper
-        extends FileUtils.FilterWrapper
+    private Reader getFileReader( String encoding, File from )
+        throws FileNotFoundException, UnsupportedEncodingException
     {
-
-        private LinkedHashSet<String> delimiters;
-
-        private MavenProject project;
-
-        private ValueSource propertiesValueSource;
-
-        private List<String> projectStartExpressions;
-
-        private String escapeString;
-
-        private boolean escapeWindowsPaths;
-
-        private final MavenSession mavenSession;
-
-        private boolean supportMultiLineFiltering;
-
-        Wrapper( LinkedHashSet<String> delimiters, MavenProject project, MavenSession mavenSession,
-                 ValueSource propertiesValueSource, List<String> projectStartExpressions, String escapeString,
-                 boolean escapeWindowsPaths, boolean supportMultiLineFiltering )
+        // buffer so it isn't reading a byte at a time!
+        if ( StringUtils.isEmpty( encoding ) )
         {
-            super();
-            this.delimiters = delimiters;
-            this.project = project;
-            this.mavenSession = mavenSession;
-            this.propertiesValueSource = propertiesValueSource;
-            this.projectStartExpressions = projectStartExpressions;
-            this.escapeString = escapeString;
-            this.escapeWindowsPaths = escapeWindowsPaths;
-            this.supportMultiLineFiltering = supportMultiLineFiltering;
+            return new BufferedReader( new FileReader( from ) );
         }
-
-        public Reader getReader( Reader reader )
+        else
         {
-            MultiDelimiterStringSearchInterpolator interpolator = new MultiDelimiterStringSearchInterpolator();
-            interpolator.setDelimiterSpecs( delimiters );
-
-            RecursionInterceptor ri = null;
-            if ( projectStartExpressions != null && !projectStartExpressions.isEmpty() )
-            {
-                ri = new PrefixAwareRecursionInterceptor( projectStartExpressions, true );
-            }
-            else
-            {
-                ri = new SimpleRecursionInterceptor();
-            }
-
-            interpolator.addValueSource( propertiesValueSource );
-
-            if ( project != null )
-            {
-                interpolator.addValueSource( new PrefixedObjectValueSource( projectStartExpressions, project, true ) );
-            }
-
-            if ( mavenSession != null )
-            {
-                interpolator.addValueSource( new PrefixedObjectValueSource( "session", mavenSession ) );
-
-                final Settings settings = mavenSession.getSettings();
-                if ( settings != null )
-                {
-                    interpolator.addValueSource( new PrefixedObjectValueSource( "settings", settings ) );
-                    interpolator.addValueSource(
-                        new SingleResponseValueSource( "localRepository", settings.getLocalRepository() ) );
-                }
-            }
-
-            interpolator.setEscapeString( escapeString );
-
-            if ( escapeWindowsPaths )
-            {
-                interpolator.addPostProcessor( new InterpolationPostProcessor()
-                {
-                    public Object execute( String expression, Object value )
-                    {
-                        if ( value instanceof String )
-                        {
-                            return FilteringUtils.escapeWindowsPath( (String) value );
-                        }
-
-                        return value;
-                    }
-                } );
-            }
-
-            MultiDelimiterInterpolatorFilterReaderLineEnding filterReader =
-                new MultiDelimiterInterpolatorFilterReaderLineEnding( reader, interpolator, supportMultiLineFiltering );
-            filterReader.setRecursionInterceptor( ri );
-            filterReader.setDelimiterSpecs( delimiters );
-
-            filterReader.setInterpolateWithPrefixPattern( false );
-            filterReader.setEscapeString( escapeString );
-
-            return filterReader;
+            FileInputStream instream = new FileInputStream( from );
+            return new BufferedReader( new InputStreamReader( instream, encoding ) );
         }
-
     }
 
+
 }

Added: maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/DefaultMavenReaderFilter.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/DefaultMavenReaderFilter.java?rev=1631834&view=auto
==============================================================================
--- maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/DefaultMavenReaderFilter.java (added)
+++ maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/DefaultMavenReaderFilter.java Tue Oct 14 18:49:30 2014
@@ -0,0 +1,83 @@
+package org.apache.maven.shared.filtering;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import edu.emory.mathcs.backport.java.util.Collections;
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.shared.utils.io.FileUtils.FilterWrapper;
+
+import javax.annotation.Nonnull;
+import java.io.Reader;
+import java.util.List;
+
+/**
+ * @author Kristian Rosenvold
+ * @plexus.component role="org.apache.maven.shared.filtering.MavenReaderFilter"
+ * role-hint="default"
+ */
+public class DefaultMavenReaderFilter
+    extends BaseFilter
+    implements MavenReaderFilter
+{
+    @Nonnull
+    public Reader filter( @Nonnull Reader from, boolean filtering, MavenProject mavenProject, List<String> filters,
+                          boolean escapedBackslashesInFilePath, MavenSession mavenSession )
+        throws MavenFilteringException
+    {
+        MavenResourcesExecution mre = new MavenResourcesExecution();
+        mre.setMavenProject( mavenProject );
+        mre.setFileFilters( filters );
+        mre.setEscapeWindowsPaths( escapedBackslashesInFilePath );
+        mre.setMavenSession( mavenSession );
+        mre.setInjectProjectBuildFilters( true );
+
+        List<FilterWrapper> filterWrappers = getDefaultFilterWrappers( mre );
+        return filter( from, filtering, filterWrappers );
+    }
+
+
+    @Nonnull public Reader filter( @Nonnull MavenReaderFilterRequest mavenFileFilterRequest )
+        throws MavenFilteringException
+    {
+        List<FilterWrapper> filterWrappers = getDefaultFilterWrappers( mavenFileFilterRequest );
+        return filter( mavenFileFilterRequest.getFrom(), mavenFileFilterRequest.isFiltering(), filterWrappers );
+    }
+
+
+    @SuppressWarnings( "unchecked" )
+    public @Nonnull Reader filter( @Nonnull Reader from, boolean filtering, @Nonnull List<FilterWrapper> filterWrappers )
+    {
+        return filterWrap( from, filtering ? filterWrappers : Collections.<FilterWrapper>emptyList() );
+    }
+
+
+    private static @Nonnull Reader filterWrap( @Nonnull Reader from, @Nonnull Iterable<FilterWrapper> wrappers )
+    {
+        Reader reader = from;
+        for ( FilterWrapper wrapper : wrappers )
+        {
+            reader = wrapper.getReader( reader );
+        }
+        return reader;
+    }
+
+
+}

Modified: maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/MavenFileFilter.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/MavenFileFilter.java?rev=1631834&r1=1631833&r2=1631834&view=diff
==============================================================================
--- maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/MavenFileFilter.java (original)
+++ maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/MavenFileFilter.java Tue Oct 14 18:49:30 2014
@@ -30,7 +30,7 @@ import java.util.List;
  * @author Olivier Lamy
  *
  */
-public interface MavenFileFilter
+public interface MavenFileFilter extends DefaultFilterInfo
 {
 
     /**
@@ -81,51 +81,4 @@ public interface MavenFileFilter
     void copyFile( File from, final File to, boolean filtering, List<FileUtils.FilterWrapper> filterWrappers,
                    String encoding, boolean overwrite )
         throws MavenFilteringException;
-
-    /**
-     * Will return the default FileUtils.FilterWrappers.
-     * <p/>
-     * <ul>
-     * <li>interpolate with token ${} and values from sysProps, project.properties, filters and project filters.</li>
-     * <li>interpolate with token @ @ and values from sysProps, project.properties, filters and project filters.</li>
-     * <li>interpolate with token ${} and values from mavenProject interpolation.</li>
-     * <li>interpolation with token @ @ and values from mavenProject interpolation</li>
-     * </ul>
-     * <b>This method is now deprecated and no escape mechanism will be used.</b>
-     *
-     * @param mavenProject
-     * @param filters      {@link List} of properties file
-     * @return {@link List} of FileUtils.FilterWrapper
-     * @deprecated use {@link #getDefaultFilterWrappers(MavenProject, List, boolean, MavenSession, MavenResourcesExecution)}
-     */
-    List<FileUtils.FilterWrapper> getDefaultFilterWrappers( MavenProject mavenProject, List<String> filters,
-                                                            boolean escapedBackslashesInFilePath,
-                                                            MavenSession mavenSession )
-        throws MavenFilteringException;
-
-    /**
-     * @param mavenProject
-     * @param filters
-     * @param escapedBackslashesInFilePath
-     * @param mavenSession
-     * @param mavenResourcesExecution
-     * @return {@link List} of FileUtils.FilterWrapper
-     * @throws MavenFilteringException
-     * @since 1.0-beta-2
-     */
-    List<FileUtils.FilterWrapper> getDefaultFilterWrappers( MavenProject mavenProject, List<String> filters,
-                                                            boolean escapedBackslashesInFilePath,
-                                                            MavenSession mavenSession,
-                                                            MavenResourcesExecution mavenResourcesExecution )
-        throws MavenFilteringException;
-
-    /**
-     * @param request
-     * @return {@link List} of FileUtils.FilterWrapper
-     * @throws MavenFilteringException
-     * @since 1.0-beta-3
-     */
-    List<FileUtils.FilterWrapper> getDefaultFilterWrappers( AbstractMavenFilteringRequest request )
-        throws MavenFilteringException;
-
 }

Added: maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/MavenReaderFilter.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/MavenReaderFilter.java?rev=1631834&view=auto
==============================================================================
--- maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/MavenReaderFilter.java (added)
+++ maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/MavenReaderFilter.java Tue Oct 14 18:49:30 2014
@@ -0,0 +1,75 @@
+package org.apache.maven.shared.filtering;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.Reader;
+import java.util.List;
+
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.shared.utils.io.FileUtils;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * @author Olivier Lamy
+ * @author Kristian Rosenvold
+ * @since 1.3
+ */
+public interface MavenReaderFilter
+    extends DefaultFilterInfo
+{
+    /**
+     * Provides a new reader that applies filtering using defaultFilterWrappers.
+     *
+     * @param from  the source reader
+     * @param filtering    enable or not filering
+     * @param mavenProject the mavenproject
+     * @param filters      {@link java.util.List} of String which are path to a Property file
+     * @return an input stream that applies the filter
+     * @throws org.apache.maven.shared.filtering.MavenFilteringException
+     * @see #getDefaultFilterWrappers(org.apache.maven.project.MavenProject, java.util.List, boolean, org.apache.maven.execution.MavenSession)
+     */
+    @Nonnull Reader filter( @Nonnull Reader from, boolean filtering, @Nullable MavenProject mavenProject, List<String> filters,
+                   boolean escapedBackslashesInFilePath, MavenSession mavenSession )
+        throws MavenFilteringException;
+
+    /**
+     * Provides a new reader that applies filtering using defaultFilterWrappers.
+     *
+     * @param mavenFileFilterRequest The filter request
+     * @throws org.apache.maven.shared.filtering.MavenFilteringException
+     * @return an input stream that applies the filter
+     * @since 1.0-beta-3
+     */
+    @Nonnull Reader filter( @Nonnull MavenReaderFilterRequest mavenFileFilterRequest )
+        throws MavenFilteringException;
+
+    /**
+     * Provides a new reader that applies filtering using defaultFilterWrappers.
+     *
+     * @param from  the source reader
+     * @param filtering true to apply filtering
+     * @param filterWrappers {@link java.util.List} of FileUtils.FilterWrapper
+     * @return an input stream that applies the filter
+     */
+    @Nonnull Reader filter( @Nonnull Reader from, boolean filtering, @Nonnull List<FileUtils.FilterWrapper> filterWrappers );
+}

Added: maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/MavenReaderFilterRequest.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/MavenReaderFilterRequest.java?rev=1631834&view=auto
==============================================================================
--- maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/MavenReaderFilterRequest.java (added)
+++ maven/shared/trunk/maven-filtering/src/main/java/org/apache/maven/shared/filtering/MavenReaderFilterRequest.java Tue Oct 14 18:49:30 2014
@@ -0,0 +1,81 @@
+package org.apache.maven.shared.filtering;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+import java.io.InputStream;
+import java.io.Reader;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.project.MavenProject;
+
+/**
+ * @author Olivier Lamy
+ * @author Kristian Rosenvold
+ * @since 1.0-beta-3
+ */
+public class MavenReaderFilterRequest
+    extends AbstractMavenFilteringRequest
+{
+
+    private Reader from;
+
+    private boolean filtering;
+
+    public MavenReaderFilterRequest()
+    {
+        // nothing
+    }
+
+    public MavenReaderFilterRequest( Reader from, boolean filtering, MavenProject mavenProject, List<String> filters,
+                                     boolean escapedBackslashesInFilePath, String encoding, MavenSession mavenSession,
+                                     Properties additionalProperties )
+    {
+        super( mavenProject, filters, encoding, mavenSession );
+        this.from = from;
+        this.filtering = filtering;
+        setAdditionalProperties( additionalProperties );
+        setEscapeWindowsPaths( escapedBackslashesInFilePath );
+    }
+
+
+    public Reader getFrom()
+    {
+        return from;
+    }
+
+    public void setFrom( Reader from )
+    {
+        this.from = from;
+    }
+
+    public boolean isFiltering()
+    {
+        return filtering;
+    }
+
+    public void setFiltering( boolean filtering )
+    {
+        this.filtering = filtering;
+    }
+
+}

Added: maven/shared/trunk/maven-filtering/src/test/java/org/apache/maven/shared/filtering/DefaultMavenReaderFilterTest.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-filtering/src/test/java/org/apache/maven/shared/filtering/DefaultMavenReaderFilterTest.java?rev=1631834&view=auto
==============================================================================
--- maven/shared/trunk/maven-filtering/src/test/java/org/apache/maven/shared/filtering/DefaultMavenReaderFilterTest.java (added)
+++ maven/shared/trunk/maven-filtering/src/test/java/org/apache/maven/shared/filtering/DefaultMavenReaderFilterTest.java Tue Oct 14 18:49:30 2014
@@ -0,0 +1,34 @@
+package org.apache.maven.shared.filtering;
+
+import org.apache.maven.shared.utils.io.IOUtil;
+import org.codehaus.plexus.PlexusTestCase;
+
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.Properties;
+
+/**
+ * @author Kristian Rosenvold
+ *
+ */
+public class DefaultMavenReaderFilterTest
+    extends PlexusTestCase
+{
+    public void testJustDoSomeFiltering() throws Exception
+    {
+        assertNotNull(DefaultMavenReaderFilter.class);
+        MavenReaderFilter readerFilter = (MavenReaderFilter) lookup( MavenReaderFilter.class.getName(), "default" );
+
+        StringReader src = new StringReader( "toto@titi.com ${foo}" );
+        MavenReaderFilterRequest req = new MavenReaderFilterRequest();
+        Properties additionalProperties = new Properties();
+        additionalProperties.setProperty( "foo", "bar" );
+        req.setFrom( src );
+        req.setFiltering( true );
+        req.setAdditionalProperties( additionalProperties );
+
+        final Reader filter = readerFilter.filter( req );
+
+        assertEquals( "toto@titi.com bar", IOUtil.toString( filter ) );
+    }
+}