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;
+ }
+}