Author: aramirez
Date: Thu Mar  2 22:59:40 2006
New Revision: 382695

URL: http://svn.apache.org/viewcvs?rev=382695&view=rev
Log:
PR: MASSEMBLY-40

-Interpolate project expressions in the assembly descriptor

Added:
    
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/interpolation/
    
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/interpolation/AssemblyInterpolationException.java
    
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/interpolation/AssemblyInterpolator.java
Modified:
    maven/plugins/trunk/maven-assembly-plugin/pom.xml
    
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AbstractAssemblyMojo.java
    
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/DirectoryMojo.java

Modified: maven/plugins/trunk/maven-assembly-plugin/pom.xml
URL: 
http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-assembly-plugin/pom.xml?rev=382695&r1=382694&r2=382695&view=diff
==============================================================================
--- maven/plugins/trunk/maven-assembly-plugin/pom.xml (original)
+++ maven/plugins/trunk/maven-assembly-plugin/pom.xml Thu Mar  2 22:59:40 2006
@@ -75,6 +75,7 @@
     <dependency>
       <groupId>org.codehaus.plexus</groupId>
       <artifactId>plexus-utils</artifactId>
+         <version>1.2-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.apache.maven</groupId>

Modified: 
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AbstractAssemblyMojo.java
URL: 
http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AbstractAssemblyMojo.java?rev=382695&r1=382694&r2=382695&view=diff
==============================================================================
--- 
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AbstractAssemblyMojo.java
 (original)
+++ 
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AbstractAssemblyMojo.java
 Thu Mar  2 22:59:40 2006
@@ -25,8 +25,11 @@
 import org.apache.maven.artifact.resolver.filter.ExcludesArtifactFilter;
 import org.apache.maven.artifact.resolver.filter.IncludesArtifactFilter;
 import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
+import org.apache.maven.model.Model;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
+import 
org.apache.maven.plugin.assembly.interpolation.AssemblyInterpolationException;
+import org.apache.maven.plugin.assembly.interpolation.AssemblyInterpolator;
 import org.apache.maven.plugins.assembly.model.Assembly;
 import org.apache.maven.plugins.assembly.model.DependencySet;
 import org.apache.maven.plugins.assembly.model.FileItem;
@@ -35,6 +38,11 @@
 import org.apache.maven.plugins.assembly.model.io.xpp3.AssemblyXpp3Reader;
 import org.apache.maven.plugins.assembly.model.io.xpp3.ComponentXpp3Reader;
 import org.apache.maven.project.MavenProjectHelper;
+import org.apache.maven.project.injection.DefaultModelDefaultsInjector;
+import org.apache.maven.project.injection.ModelDefaultsInjector;
+import org.apache.maven.project.interpolation.ModelInterpolationException;
+import org.apache.maven.project.interpolation.ModelInterpolator;
+import org.apache.maven.project.interpolation.RegexBasedModelInterpolator;
 import org.codehaus.plexus.archiver.Archiver;
 import org.codehaus.plexus.archiver.ArchiverException;
 import org.codehaus.plexus.archiver.jar.JarArchiver;
@@ -61,9 +69,12 @@
 import java.io.InputStreamReader;
 import java.io.Reader;
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -190,8 +201,16 @@
     public void execute()
         throws MojoExecutionException, MojoFailureException
     {
-        List assemblies = readAssemblies();
-
+        List assemblies;
+        try
+        {
+            assemblies = readAssemblies();
+        }
+        catch( AssemblyInterpolationException e )
+        {
+            throw new MojoExecutionException( "Failed to interpolate assembly 
descriptor", e );
+        }
+        
         // TODO: include dependencies marked for distribution under certain 
formats
         // TODO: how, might we plug this into an installer, such as NSIS?
 
@@ -320,7 +339,7 @@
     }
 
     protected List readAssemblies()
-        throws MojoFailureException, MojoExecutionException
+        throws MojoFailureException, MojoExecutionException, 
AssemblyInterpolationException
     {
         List assemblies = new ArrayList();
 
@@ -370,7 +389,7 @@
     }
 
     private Assembly getAssembly( String ref )
-        throws MojoFailureException, MojoExecutionException
+        throws MojoFailureException, MojoExecutionException, 
AssemblyInterpolationException
     {
         InputStream resourceAsStream = getClass().getResourceAsStream( 
"/assemblies/" + ref + ".xml" );
         if ( resourceAsStream == null )
@@ -381,7 +400,7 @@
     }
 
     private Assembly getAssembly( File file )
-        throws MojoFailureException, MojoExecutionException
+        throws MojoFailureException, MojoExecutionException, 
AssemblyInterpolationException
     {
         Reader r;
         try
@@ -397,13 +416,20 @@
     }
 
     private Assembly getAssembly( Reader reader )
-        throws MojoFailureException, MojoExecutionException
+        throws MojoFailureException, MojoExecutionException, 
AssemblyInterpolationException
     {
         Assembly assembly;
+        
         try
         {
+            Map context = new HashMap( System.getProperties() );
+                
+            context.put( "basedir", basedir.getAbsolutePath() );
+
             AssemblyXpp3Reader r = new AssemblyXpp3Reader();
             assembly = r.read( reader );
+            
+            assembly = new AssemblyInterpolator().interpolate( assembly, 
project.getModel(), context );   
         }
         catch ( IOException e )
         {

Modified: 
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/DirectoryMojo.java
URL: 
http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/DirectoryMojo.java?rev=382695&r1=382694&r2=382695&view=diff
==============================================================================
--- 
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/DirectoryMojo.java
 (original)
+++ 
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/DirectoryMojo.java
 Thu Mar  2 22:59:40 2006
@@ -18,6 +18,7 @@
 
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
+import 
org.apache.maven.plugin.assembly.interpolation.AssemblyInterpolationException;
 import org.apache.maven.plugins.assembly.model.Assembly;
 import org.apache.maven.project.MavenProject;
 import org.codehaus.plexus.archiver.Archiver;
@@ -54,7 +55,15 @@
     public void execute()
         throws MojoExecutionException, MojoFailureException
     {
-        List assemblies = readAssemblies();
+        List assemblies;
+        try
+        {
+            assemblies = readAssemblies();
+        }
+        catch( AssemblyInterpolationException e )
+        {
+            throw new MojoExecutionException( "Failed to interpolate assembly 
descriptor", e );
+        }
         for ( Iterator i = assemblies.iterator(); i.hasNext(); )
         {
             Assembly assembly = (Assembly) i.next();

Added: 
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/interpolation/AssemblyInterpolationException.java
URL: 
http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/interpolation/AssemblyInterpolationException.java?rev=382695&view=auto
==============================================================================
--- 
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/interpolation/AssemblyInterpolationException.java
 (added)
+++ 
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/interpolation/AssemblyInterpolationException.java
 Thu Mar  2 22:59:40 2006
@@ -0,0 +1,47 @@
+package org.apache.maven.plugin.assembly.interpolation;
+
+import org.apache.maven.project.interpolation.ModelInterpolationException;
+
+public class AssemblyInterpolationException
+    extends Exception
+{
+    private String expression;
+
+    private String originalMessage;
+    
+    public AssemblyInterpolationException( String message )
+    {
+        super( message );
+    }
+
+    public AssemblyInterpolationException( String message, Throwable cause )
+    {
+        super( message, cause );
+    }
+    
+    public AssemblyInterpolationException( String expression, String message, 
Throwable cause )
+    {
+        super( "The Assembly expression: " + expression + " could not be 
evaluated. Reason: " + message, cause );
+
+        this.expression = expression;
+        this.originalMessage = message;
+    }
+
+    public AssemblyInterpolationException( String expression, String message )
+    {
+        super( "The Assembly expression: " + expression + " could not be 
evaluated. Reason: " + message );
+
+        this.expression = expression;
+        this.originalMessage = message;
+    }
+    
+    public String getExpression()
+    {
+        return expression;
+    }
+
+    public String getOriginalMessage()
+    {
+        return originalMessage;
+    }
+}

Added: 
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/interpolation/AssemblyInterpolator.java
URL: 
http://svn.apache.org/viewcvs/maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/interpolation/AssemblyInterpolator.java?rev=382695&view=auto
==============================================================================
--- 
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/interpolation/AssemblyInterpolator.java
 (added)
+++ 
maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/interpolation/AssemblyInterpolator.java
 Thu Mar  2 22:59:40 2006
@@ -0,0 +1,140 @@
+package org.apache.maven.plugin.assembly.interpolation;
+
+import org.apache.maven.model.Model;
+import org.apache.maven.plugins.assembly.model.Assembly;
+import org.apache.maven.plugins.assembly.model.io.xpp3.AssemblyXpp3Reader;
+import org.apache.maven.plugins.assembly.model.io.xpp3.AssemblyXpp3Writer;
+import org.codehaus.plexus.logging.Logger;
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.codehaus.plexus.util.StringUtils;
+import org.codehaus.plexus.util.cli.CommandLineUtils;
+import org.codehaus.plexus.util.introspection.ReflectionValueExtractor;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.Map;
+import java.util.Properties;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class AssemblyInterpolator
+    extends AbstractLogEnabled
+{
+    private static final Pattern EXPRESSION_PATTERN = Pattern.compile( 
"\\$\\{(pom\\.|project\\.|env\\.)?([^}]+)\\}" );
+    
+    private Properties envars;
+    
+    public AssemblyInterpolator( Properties envars )
+    {
+        this.envars = envars;
+    }
+
+    public AssemblyInterpolator()
+        throws IOException
+    {
+        envars = CommandLineUtils.getSystemEnvVars();
+    }
+      
+    public Assembly interpolate( Assembly assembly, Model model, Map context )
+        throws AssemblyInterpolationException
+    {
+        return interpolate( assembly, model, context, true );
+    }    
+    
+    public Assembly interpolate( Assembly assembly, Model model, Map context, 
boolean strict )
+        throws AssemblyInterpolationException
+    {
+        StringWriter sWriter = new StringWriter();
+        
+        AssemblyXpp3Writer writer = new AssemblyXpp3Writer();
+        
+        try
+        {
+            writer.write( sWriter, assembly );
+        }
+        catch ( IOException e )
+        {
+            throw new AssemblyInterpolationException ( "Cannot serialize 
assembly descriptor for interpolation.", e );
+        }
+        
+        String serializedAssembly = sWriter.toString();
+        
+        serializedAssembly = interpolateInternal( serializedAssembly, 
assembly, model, context );
+
+        StringReader sReader = new StringReader( serializedAssembly );
+
+        AssemblyXpp3Reader assemblyReader = new AssemblyXpp3Reader();
+        try
+        {
+            assembly = assemblyReader.read( sReader );
+        }
+        catch ( IOException e )
+        {
+            throw new AssemblyInterpolationException(
+                "Cannot read assembly descriptor from interpolating filter of 
serialized version.", e );
+        }
+        catch ( XmlPullParserException e )
+        {
+            throw new AssemblyInterpolationException(
+                "Cannot read assembly descriptor from interpolating filter of 
serialized version.", e );
+        }
+        return assembly;        
+    }
+    
+    private String interpolateInternal( String result, Assembly assembly, 
Model model, Map context )
+        throws AssemblyInterpolationException
+    {
+        Matcher matcher = EXPRESSION_PATTERN.matcher( result );
+        while ( matcher.find() )
+        {
+            String wholeExpr = matcher.group( 0 );
+            String realExpr = matcher.group( 2 );
+            
+            Object value = context.get( realExpr );
+
+            if ( value == null )
+            {
+                value = model.getProperties().getProperty( realExpr );
+            }
+            
+            if ( value == null )
+            {
+                try
+                {
+                    value = ReflectionValueExtractor.evaluate( realExpr, model 
);
+                }
+                catch ( Exception e )
+                {
+                    Logger logger = getLogger();
+                    if ( logger != null )
+                    {
+                        logger.debug( "Assembly descriptor interpolation 
cannot proceed with expression: " + wholeExpr + ". Skipping...", e );
+                    }
+                }
+            }
+    
+            if ( value == null )
+            {
+                value = envars.getProperty( realExpr );
+            }
+    
+            // if the expression refers to itself, skip it.
+            if ( wholeExpr.equals( value ) )
+            {
+                throw new AssemblyInterpolationException( wholeExpr, 
assembly.getId() + " references itself." );
+            }
+    
+            if ( value != null )
+            {
+                result = StringUtils.replace( result, wholeExpr, 
String.valueOf( value ) );
+                // could use:
+                // result = matcher.replaceFirst( stringValue );
+                // but this could result in multiple lookups of stringValue, 
and replaceAll is not correct behaviour
+                matcher.reset( result );
+            }
+        }
+        return result;
+    }
+}


Reply via email to