Applying partial patch for MNG-266. Thanks Andreas.

git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@216282 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
John Dennis Casey 2005-07-13 22:58:28 +00:00
parent beff5623f2
commit 99c8250b8f
2 changed files with 67 additions and 11 deletions

View File

@ -17,6 +17,8 @@
*/ */
import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
import org.apache.maven.artifact.resolver.filter.AndArtifactFilter; import org.apache.maven.artifact.resolver.filter.AndArtifactFilter;
import org.apache.maven.artifact.resolver.filter.ExcludesArtifactFilter; import org.apache.maven.artifact.resolver.filter.ExcludesArtifactFilter;
import org.apache.maven.artifact.resolver.filter.IncludesArtifactFilter; import org.apache.maven.artifact.resolver.filter.IncludesArtifactFilter;
@ -32,6 +34,7 @@
import org.codehaus.plexus.archiver.jar.JarArchiver; import org.codehaus.plexus.archiver.jar.JarArchiver;
import org.codehaus.plexus.archiver.tar.TarArchiver; import org.codehaus.plexus.archiver.tar.TarArchiver;
import org.codehaus.plexus.archiver.zip.ZipArchiver; import org.codehaus.plexus.archiver.zip.ZipArchiver;
import org.codehaus.plexus.util.introspection.ReflectionValueExtractor;
import org.codehaus.plexus.util.IOUtil; import org.codehaus.plexus.util.IOUtil;
import java.io.File; import java.io.File;
@ -48,6 +51,8 @@
import java.util.Set; import java.util.Set;
import java.util.jar.JarEntry; import java.util.jar.JarEntry;
import java.util.jar.JarFile; import java.util.jar.JarFile;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** /**
* @author <a href="mailto:brett@apache.org">Brett Porter</a> * @author <a href="mailto:brett@apache.org">Brett Porter</a>
@ -104,6 +109,14 @@ public class AssemblyMojo
*/ */
private File workDirectory; private File workDirectory;
/**
* Handler to get the file extension matching a given artifactType
*
* @parameter expression="${component.org.apache.maven.artifact.handler.manager.ArtifactHandlerManager}"
* @required
*/
private ArtifactHandlerManager artifactHandlerManager;
public void execute() public void execute()
throws MojoExecutionException throws MojoExecutionException
{ {
@ -176,23 +189,23 @@ else if ( descriptorId != null )
} }
private void processDependencySets( Archiver archiver, List dependencySets, boolean includeBaseDirectory ) private void processDependencySets( Archiver archiver, List dependencySets, boolean includeBaseDirectory )
throws ArchiverException, IOException throws ArchiverException, IOException, Exception
{ {
for ( Iterator i = dependencySets.iterator(); i.hasNext(); ) for ( Iterator i = dependencySets.iterator(); i.hasNext(); )
{ {
DependencySet depedencySet = (DependencySet) i.next(); DependencySet dependencySet = (DependencySet) i.next();
String output = depedencySet.getOutputDirectory(); String output = dependencySet.getOutputDirectory();
output = getOutputDirectory( output, includeBaseDirectory ); output = getOutputDirectory( output, includeBaseDirectory );
AndArtifactFilter filter = new AndArtifactFilter(); AndArtifactFilter filter = new AndArtifactFilter();
filter.add( new ScopeArtifactFilter( depedencySet.getScope() ) ); filter.add( new ScopeArtifactFilter( dependencySet.getScope() ) );
if ( !depedencySet.getIncludes().isEmpty() ) if ( !dependencySet.getIncludes().isEmpty() )
{ {
filter.add( new IncludesArtifactFilter( depedencySet.getIncludes() ) ); filter.add( new IncludesArtifactFilter( dependencySet.getIncludes() ) );
} }
if ( !depedencySet.getExcludes().isEmpty() ) if ( !dependencySet.getExcludes().isEmpty() )
{ {
filter.add( new ExcludesArtifactFilter( depedencySet.getExcludes() ) ); filter.add( new ExcludesArtifactFilter( dependencySet.getExcludes() ) );
} }
// TODO: includes and excludes // TODO: includes and excludes
@ -203,7 +216,7 @@ private void processDependencySets( Archiver archiver, List dependencySets, bool
if ( filter.include( artifact ) ) if ( filter.include( artifact ) )
{ {
String name = artifact.getFile().getName(); String name = artifact.getFile().getName();
if ( depedencySet.isUnpack() ) if ( dependencySet.isUnpack() )
{ {
// TODO: something like zipfileset in plexus-archiver // TODO: something like zipfileset in plexus-archiver
// archiver.addJar( ) // archiver.addJar( )
@ -229,13 +242,50 @@ else if ( artifact.getFile().lastModified() > tempLocation.lastModified() )
} }
else else
{ {
archiver.addFile( artifact.getFile(), output + name ); archiver.addFile( artifact.getFile(), output + evaluateFileNameMapping( dependencySet.getOutputFileNameMapping(), artifact ));
} }
} }
} }
} }
} }
private String evaluateFileNameMapping( String expression, Artifact artifact )
throws Exception
{
// this matches the last ${...} string
Pattern pat = Pattern.compile( "^(.*)\\$\\{([^\\}]+)\\}(.*)$" );
Matcher mat = pat.matcher(expression);
String left,right;
Object middle;
if ( mat.matches() )
{
left = evaluateFileNameMapping( mat.group(1), artifact );
middle = ReflectionValueExtractor.evaluate( "dep." + mat.group(2), artifact );
right = mat.group(3);
if ( middle == null )
{
// TODO: There should be a more generic way dealing with that. Having magic words is not good at all.
// probe for magic word
if ( mat.group(2).trim().equals( "extension" ))
{
ArtifactHandler artifactHandler = artifactHandlerManager.getArtifactHandler( artifact.getType() );
middle = artifactHandler.getExtension();
}
else
{
middle = "${" + mat.group(2) + "}";
}
}
return left + middle + right;
}
return expression;
}
private void unpackJar( File file, File tempLocation ) private void unpackJar( File file, File tempLocation )
throws IOException throws IOException
{ {

View File

@ -94,6 +94,12 @@
<version>1.0.0</version> <version>1.0.0</version>
<type>String</type> <type>String</type>
</field> </field>
<field>
<name>outputFileNameMapping</name>
<version>1.0.0</version>
<type>String</type>
<defaultValue>${artifactId}-${version}.${extension}</defaultValue>
</field>
<field> <field>
<name>unpack</name> <name>unpack</name>
<type>boolean</type> <type>boolean</type>