Author: jdcasey
Date: Mon Feb 18 11:43:52 2008
New Revision: 628851

URL: http://svn.apache.org/viewvc?rev=628851&view=rev
Log:
[MASSEMBLY-152] Add support for Ant '@' filter-token delimiters, and windows 
path escaping.
Submitted by: John Franey

Added:
    
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/format/ReflectionProperties.java
   (with props)
Modified:
    
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/format/FileFormatter.java
    
maven/plugins/trunk/maven-assembly-plugin/src/test/java/org/apache/maven/plugin/assembly/format/FileFormatterTest.java

Modified: 
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/format/FileFormatter.java
URL: 
http://svn.apache.org/viewvc/maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/format/FileFormatter.java?rev=628851&r1=628850&r2=628851&view=diff
==============================================================================
--- 
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/format/FileFormatter.java
 (original)
+++ 
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/format/FileFormatter.java
 Mon Feb 18 11:43:52 2008
@@ -26,16 +26,16 @@
 import org.codehaus.plexus.logging.Logger;
 import org.codehaus.plexus.util.FileUtils;
 import org.codehaus.plexus.util.IOUtil;
-import org.codehaus.plexus.util.interpolation.MapBasedValueSource;
-import org.codehaus.plexus.util.interpolation.ObjectBasedValueSource;
-import org.codehaus.plexus.util.interpolation.RegexBasedInterpolator;
+import org.codehaus.plexus.util.InterpolationFilterReader;
 
 import java.io.BufferedReader;
+import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
+import java.io.Reader;
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.util.Iterator;
@@ -93,7 +93,7 @@
 
             if ( filter )
             {
-                contents = filter( contents );
+                contents = filter( contents, source );
             }
 
             contentIsChanged = !contents.equals( rawContents );
@@ -182,27 +182,40 @@
         return fileWritten;
     }
 
-    private String filter( String rawContents )
-        throws AssemblyFormattingException
+    private String filter( String rawContents, File source )
+        throws IOException, AssemblyFormattingException
     {
         initializeFiltering();
 
-        String contents = rawContents;
+        Reader reader  = new BufferedReader(new StringReader(rawContents));
 
         // support ${token}
-        RegexBasedInterpolator interpolator = new RegexBasedInterpolator();
-        interpolator.addValueSource( new MapBasedValueSource( filterProperties 
) );
-        interpolator.addValueSource( new ObjectBasedValueSource( 
configSource.getProject() ) );
+        reader = new InterpolationFilterReader( reader, filterProperties, 
"${", "}" );
+
+        // support @token@
+        reader = new InterpolationFilterReader( reader, filterProperties, "@", 
"@" );
+
+        boolean isPropertiesFile = false;
+
+        if ( source.isFile() && source.getName().endsWith( ".properties" ) )
+        {
+            isPropertiesFile = true;
+        }
+
+        reader = new InterpolationFilterReader( reader, new 
ReflectionProperties( configSource.getProject(), isPropertiesFile ), "${", "}" 
);
+
+        StringWriter sw = new StringWriter();
+        IOUtil.copy( reader, new BufferedWriter(sw));
+
+        return sw.getBuffer().toString();
 
-        contents = interpolator.interpolate( contents, "project" );
 
-        return contents;
     }
 
     private void initializeFiltering()
         throws AssemblyFormattingException
     {
-        logger.info( "Initializing assembly filters..." );
+        logger.debug( "Initializing assembly filters..." );
 
         if ( filterProperties == null )
         {
@@ -215,7 +228,7 @@
 
             List filters = configSource.getFilters();
 
-            if ( filters != null && !filters.isEmpty() )
+            if ( ( filters != null ) && !filters.isEmpty() )
             {
                 for ( Iterator i = filters.iterator(); i.hasNext(); )
                 {

Added: 
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/format/ReflectionProperties.java
URL: 
http://svn.apache.org/viewvc/maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/format/ReflectionProperties.java?rev=628851&view=auto
==============================================================================
--- 
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/format/ReflectionProperties.java
 (added)
+++ 
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/format/ReflectionProperties.java
 Mon Feb 18 11:43:52 2008
@@ -0,0 +1,73 @@
+package org.apache.maven.plugin.assembly.format;
+
+/*
+ * Copyright 2001-2005 The Apache Software Foundation.
+ *
+ * Licensed 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 org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.util.StringUtils;
+import org.codehaus.plexus.util.introspection.ReflectionValueExtractor;
+
+import java.util.Properties;
+
+
+/**
+ * @author Andreas Hoheneder (ahoh_at_inode.at)
+ * @version $Id$
+ */
+public class ReflectionProperties
+    extends Properties
+{
+
+    private MavenProject project;
+
+    boolean escapedBackslashesInFilePath;
+
+    public ReflectionProperties( MavenProject aProject, boolean 
escapedBackslashesInFilePath ) 
+    {
+       super();
+
+       project = aProject;
+
+       this.escapedBackslashesInFilePath = escapedBackslashesInFilePath;
+    }
+    
+    public Object get( Object key )
+    {
+        Object value = null;
+        try 
+        {
+            value = ReflectionValueExtractor.evaluate( "" + key , project );
+
+            if ( escapedBackslashesInFilePath && value != null &&
+                "java.lang.String".equals( value.getClass().getName() ) )
+            {
+                String val = (String) value;
+
+                // Check if it's a windows path
+                if ( val.indexOf( ":\\" ) == 1 )
+                {
+                    value = StringUtils.replace( (String)value, "\\", "\\\\" );
+                    value = StringUtils.replace( (String)value, ":", "\\:" );
+                }
+            }
+        }
+        catch ( Exception e ) 
+        {
+            //TODO: remove the try-catch block when 
ReflectionValueExtractor.evaluate() throws no more exceptions
+        } 
+        return value;
+    }
+}

Propchange: 
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/format/ReflectionProperties.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/format/ReflectionProperties.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Modified: 
maven/plugins/trunk/maven-assembly-plugin/src/test/java/org/apache/maven/plugin/assembly/format/FileFormatterTest.java
URL: 
http://svn.apache.org/viewvc/maven/plugins/trunk/maven-assembly-plugin/src/test/java/org/apache/maven/plugin/assembly/format/FileFormatterTest.java?rev=628851&r1=628850&r2=628851&view=diff
==============================================================================
--- 
maven/plugins/trunk/maven-assembly-plugin/src/test/java/org/apache/maven/plugin/assembly/format/FileFormatterTest.java
 (original)
+++ 
maven/plugins/trunk/maven-assembly-plugin/src/test/java/org/apache/maven/plugin/assembly/format/FileFormatterTest.java
 Mon Feb 18 11:43:52 2008
@@ -25,6 +25,7 @@
 import java.util.Collections;
 import java.util.List;
 
+import org.apache.maven.model.Build;
 import org.apache.maven.model.Model;
 import org.apache.maven.plugin.assembly.AssemblerConfigurationSource;
 import org.apache.maven.plugin.assembly.testutils.MockManager;
@@ -160,17 +161,67 @@
 
         enableBasicFilteringConfiguration( basedir, Collections.EMPTY_LIST );
 
-        File file = fileManager.createFile( basedir, "one.txt", "This is a 
test for project: ${artifactId}." );
+        File file = fileManager.createFile( basedir, "one.txt", "This is a 
test for project: ${artifactId} @[EMAIL PROTECTED]" );
 
         mockManager.replayAll();
 
         File result = new FileFormatter( configSource, logger ).format( file, 
true, null );
 
-        assertEquals( "This is a test for project: artifact.", 
fileManager.getFileContents( result ) );
+        assertEquals( "This is a test for project: artifact @[EMAIL 
PROTECTED]", fileManager.getFileContents( result ) );
 
         mockManager.verifyAll();
     }
 
+    public void testShouldFilterExpressionInPropertiesFileWithWindowsEscapes()
+      throws IOException, AssemblyFormattingException
+    {
+
+       File sourceDir = fileManager.createTempDir();
+       MavenProject project = createBasicMavenProject();
+       Build build = new Build();
+       
+       // project.build.outputDirectory = C:\out\deeper
+       build.setOutputDirectory( "C:\\out\\deeper" );
+       project.setBuild(build);
+       
+       enableBasicFilteringConfiguration(project, sourceDir, 
Collections.EMPTY_LIST);
+
+       File file = fileManager.createFile(sourceDir, "one.properties", 
"out=${project.build.outputDirectory}");
+
+       mockManager.replayAll();
+
+       File result = new FileFormatter(configSource, logger).format(file, 
true, null);
+
+       // expect: C\:\\out\\deeper
+       
assertEquals("out=C\\:\\\\out\\\\deeper",fileManager.getFileContents(result));
+
+       mockManager.verifyAll();
+   }
+
+    public void 
testShouldFilterExpressionInPropertiesFileWithoutWindowsEscapes()
+      throws IOException, AssemblyFormattingException
+    {
+
+       File sourceDir = fileManager.createTempDir();
+       MavenProject project = createBasicMavenProject();
+       Build build = new Build();
+       build.setOutputDirectory( "C:\\out\\deeper" );
+       project.setBuild(build);
+     
+       enableBasicFilteringConfiguration(project, sourceDir, 
Collections.EMPTY_LIST);
+
+       File file = fileManager.createFile(sourceDir, "one.txt", 
"project.basedirA=${project.build.outputDirectory}");
+
+       mockManager.replayAll();
+
+       File result = new FileFormatter(configSource, logger).format(file, 
true, null);
+
+       
assertEquals("project.basedirA=C:\\out\\deeper",fileManager.getFileContents(result));
+
+       mockManager.verifyAll();
+    }
+
+    
     public void testShouldFilterExpressionFromFiltersFileInFile()
         throws IOException, AssemblyFormattingException
     {
@@ -180,16 +231,36 @@
 
         enableBasicFilteringConfiguration( basedir, Collections.singletonList( 
filterProps.getCanonicalPath() ) );
 
-        File file = fileManager.createFile( basedir, "one.txt", "This is a 
test for project: ${property}." );
+        File file = fileManager.createFile( basedir, "one.txt", "This is a 
test for project: ${property} @[EMAIL PROTECTED]" );
 
         mockManager.replayAll();
 
         File result = new FileFormatter( configSource, logger ).format( file, 
true, null );
 
-        assertEquals( "This is a test for project: Test.", 
fileManager.getFileContents( result ) );
+        assertEquals( "This is a test for project: Test Test.", 
fileManager.getFileContents( result ) );
 
         mockManager.verifyAll();
     }
+    
+    public void 
testShouldFilterExpressionFromFiltersFileInPropertiesFileWithoutWindowsEscapes()
+       throws IOException, AssemblyFormattingException
+    {
+       File basedir = fileManager.createTempDir();
+
+       File filterProps = fileManager.createFile( basedir, 
"filter.properties", "property=C:\\\\Test" );
+
+       enableBasicFilteringConfiguration( basedir, Collections.singletonList( 
filterProps.getCanonicalPath() ) );
+
+       File file = fileManager.createFile( basedir, "one.properties", "This is 
a test for project: ${property} @[EMAIL PROTECTED]" );
+
+       mockManager.replayAll();
+
+       File result = new FileFormatter( configSource, logger ).format( file, 
true, null );
+
+       assertEquals( "This is a test for project: C:\\Test C:\\Test.", 
fileManager.getFileContents( result ) );
+
+       mockManager.verifyAll();
+    }
 
     public void testShouldFilterExpressionsFromTwoFiltersFilesInFile()
         throws IOException, AssemblyFormattingException
@@ -206,13 +277,13 @@
         enableBasicFilteringConfiguration( basedir, filters );
 
         File file = fileManager.createFile( basedir, "one.txt",
-                                            "property: ${property}  
otherProperty: ${otherProperty}." );
+                                            "property: ${property} @property@ 
otherProperty: ${otherProperty} @[EMAIL PROTECTED]" );
 
         mockManager.replayAll();
 
         File result = new FileFormatter( configSource, logger ).format( file, 
true, null );
 
-        assertEquals( "property: Test  otherProperty: OtherValue.", 
fileManager.getFileContents( result ) );
+        assertEquals( "property: Test Test otherProperty: OtherValue 
OtherValue.", fileManager.getFileContents( result ) );
 
         mockManager.verifyAll();
     }
@@ -231,13 +302,13 @@
 
         enableBasicFilteringConfiguration( basedir, filters );
 
-        File file = fileManager.createFile( basedir, "one.txt", "property: 
${property}." );
+        File file = fileManager.createFile( basedir, "one.txt", "property: 
${property} @[EMAIL PROTECTED]" );
 
         mockManager.replayAll();
 
         File result = new FileFormatter( configSource, logger ).format( file, 
true, null );
 
-        assertEquals( "property: OtherValue.", fileManager.getFileContents( 
result ) );
+        assertEquals( "property: OtherValue OtherValue.", 
fileManager.getFileContents( result ) );
 
         mockManager.verifyAll();
     }
@@ -254,35 +325,44 @@
 
         enableBasicFilteringConfiguration( basedir, filters );
 
-        File file = fileManager.createFile( basedir, "one.txt", "project 
artifact-id: ${artifactId}." );
+        File file = fileManager.createFile( basedir, "one.txt", "project 
artifact-id: ${artifactId} @[EMAIL PROTECTED]" );
 
         mockManager.replayAll();
 
         File result = new FileFormatter( configSource, logger ).format( file, 
true, null );
 
-        assertEquals( "project artifact-id: Test.", 
fileManager.getFileContents( result ) );
+        assertEquals( "project artifact-id: Test Test.", 
fileManager.getFileContents( result ) );
 
         mockManager.verifyAll();
     }
 
-    private void enableBasicFilteringConfiguration( File basedir, List 
filterFilenames )
-    {
-        configSource.getTemporaryRootDirectory();
-        configSourceControl.setReturnValue( basedir );
-
+    private MavenProject createBasicMavenProject() {
         Model model = new Model();
         model.setArtifactId( "artifact" );
         model.setGroupId( "group" );
         model.setVersion( "version" );
 
-        MavenProject project = new MavenProject( model );
+        return new MavenProject( model );
+    }
+    
+    private void enableBasicFilteringConfiguration(MavenProject project, File 
basedir, List filterFilenames)
+    {
+       configSource.getTemporaryRootDirectory();
+       configSourceControl.setReturnValue( basedir );
 
-        configSource.getProject();
-        configSourceControl.setReturnValue( project, MockControl.ONE_OR_MORE );
+       configSource.getProject();
+       configSourceControl.setReturnValue( project, MockControl.ONE_OR_MORE );
 
-        // list of filenames that contain filter definitions.
-        configSource.getFilters();
-        configSourceControl.setReturnValue( filterFilenames );
+       // list of filenames that contain filter definitions.
+       configSource.getFilters();
+       configSourceControl.setReturnValue( filterFilenames );
+      
+    }
+    
+    private void enableBasicFilteringConfiguration( File basedir, List 
filterFilenames )
+    {
+        MavenProject project = createBasicMavenProject();
+        enableBasicFilteringConfiguration( project, basedir, filterFilenames );
     }
 
 }


Reply via email to