MNG-3976 - Raw Pom Retreival for Mercury.

git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@740434 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Britton Isbell 2009-02-03 20:48:07 +00:00
parent adfb3ddeb9
commit 5eaab27857
6 changed files with 187 additions and 5 deletions

View File

@ -41,6 +41,11 @@
<groupId>org.codehaus.plexus</groupId> <groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-component-annotations</artifactId> <artifactId>plexus-component-annotations</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.sonatype.spice</groupId>
<artifactId>model-builder</artifactId>
</dependency>
<!-- test dependencies --> <!-- test dependencies -->
<dependency> <dependency>

View File

@ -0,0 +1,15 @@
package org.apache.maven.mercury;
import org.apache.maven.mercury.builder.api.MetadataReaderException;
import org.apache.maven.mercury.builder.api.MetadataReader;
import org.apache.maven.mercury.artifact.ArtifactBasicMetadata;
import org.apache.maven.shared.model.ModelProperty;
import java.util.Map;
import java.util.List;
public interface PomProcessor
{
List<ModelProperty> getRawPom(ArtifactBasicMetadata bmd, MetadataReader mdReader, Map env, Map sysProps)
throws MetadataReaderException, PomProcessorException;
}

View File

@ -0,0 +1,35 @@
package org.apache.maven.mercury;
public class PomProcessorException extends Exception
{
static final long serialVersionUID = 980457843528974352L;
/**
* Default constructor
*/
public PomProcessorException()
{
super();
}
/**
* Constructor
*
* @param message exception message
*/
public PomProcessorException( String message )
{
super( message );
}
/**
* Constructor
*
* @param message exception message
*/
public PomProcessorException( String message, Exception e )
{
super( message, e );
}
}

View File

@ -68,6 +68,10 @@ under the License.
<groupId>org.apache.maven</groupId> <groupId>org.apache.maven</groupId>
<artifactId>maven-project-builder</artifactId> <artifactId>maven-project-builder</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-mercury</artifactId>
</dependency>
<dependency> <dependency>
<groupId>commons-jxpath</groupId> <groupId>commons-jxpath</groupId>
<artifactId>commons-jxpath</artifactId> <artifactId>commons-jxpath</artifactId>

View File

@ -23,12 +23,17 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.Reader; import java.io.Reader;
import java.io.StringReader; import java.io.StringReader;
import java.util.ArrayList; import java.util.*;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.apache.maven.MavenTools; import org.apache.maven.MavenTools;
import org.apache.maven.mercury.PomProcessor;
import org.apache.maven.mercury.PomProcessorException;
import org.apache.maven.mercury.MavenDomainModel;
import org.apache.maven.mercury.MavenDomainModelFactory;
import org.apache.maven.mercury.builder.api.MetadataReader;
import org.apache.maven.mercury.builder.api.MetadataReaderException;
import org.apache.maven.mercury.builder.api.DependencyProcessorException;
import org.apache.maven.mercury.artifact.ArtifactBasicMetadata;
import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.InvalidRepositoryException; import org.apache.maven.artifact.InvalidRepositoryException;
import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.factory.ArtifactFactory;
@ -61,7 +66,7 @@ import org.apache.commons.jxpath.JXPathContext;
*/ */
@Component(role = ProjectBuilder.class) @Component(role = ProjectBuilder.class)
public class DefaultProjectBuilder public class DefaultProjectBuilder
implements ProjectBuilder, Mixer, LogEnabled implements ProjectBuilder, Mixer, PomProcessor, LogEnabled
{ {
@Requirement @Requirement
private ArtifactFactory artifactFactory; private ArtifactFactory artifactFactory;
@ -74,6 +79,84 @@ public class DefaultProjectBuilder
private Logger logger; private Logger logger;
public List<ModelProperty> getRawPom(ArtifactBasicMetadata bmd, MetadataReader mdReader, Map system, Map user)
throws MetadataReaderException, PomProcessorException {
if ( bmd == null )
{
throw new IllegalArgumentException( "bmd: null" );
}
if ( mdReader == null )
{
throw new IllegalArgumentException( "mdReader: null" );
}
List<InterpolatorProperty> interpolatorProperties = new ArrayList<InterpolatorProperty>();
interpolatorProperties.add( new InterpolatorProperty( "${mavenVersion}", "3.0-SNAPSHOT",
PomInterpolatorTag.EXECUTION_PROPERTIES.name() ) );
if ( system != null )
{
interpolatorProperties.addAll(
InterpolatorProperty.toInterpolatorProperties( system, PomInterpolatorTag.EXECUTION_PROPERTIES.name() ) );
}
if ( user != null )
{
interpolatorProperties.addAll(
InterpolatorProperty.toInterpolatorProperties( user, PomInterpolatorTag.USER_PROPERTIES.name() ) );
}
List<DomainModel> domainModels = new ArrayList<DomainModel>();
try
{
// MavenDomainModel superPom =
// new MavenDomainModel(MavenDependencyProcessor.class.getResourceAsStream( "pom-4.0.0.xml" ));
// domainModels.add(superPom);
byte[] superBytes = mdReader.readMetadata( bmd );
if ( superBytes == null || superBytes.length < 1 )
throw new PomProcessorException( "cannot read metadata for " + bmd.getGAV() );
MavenDomainModel domainModel = new MavenDomainModel( superBytes );
domainModels.add( domainModel );
Collection<ModelContainer> activeProfiles = domainModel.getActiveProfileContainers( interpolatorProperties );
for ( ModelContainer mc : activeProfiles )
{
domainModels.add( new MavenDomainModel( transformProfiles( mc.getProperties() ) ) );
}
List<DomainModel> parentModels = getParentsOfDomainModel( domainModel, mdReader );
if( parentModels == null )
throw new PomProcessorException( "cannot read parent for " + bmd.getGAV() );
domainModels.addAll( parentModels );
}
catch ( IOException e )
{
throw new MetadataReaderException( "Failed to create domain model. Message = " + e.getMessage() );
}
PomTransformer transformer = new PomTransformer( new MavenDomainModelFactory() );
ModelTransformerContext ctx =
new ModelTransformerContext( PomTransformer.MODEL_CONTAINER_INFOS );
try
{
MavenDomainModel model =
( (MavenDomainModel) ctx.transform( domainModels, transformer, transformer, null,
interpolatorProperties, null ) );
return model.getModelProperties();
}
catch ( IOException e )
{
throw new MetadataReaderException( "Unable to transform model" );
}
}
public PomClassicDomainModel buildModel( File pom, public PomClassicDomainModel buildModel( File pom,
Collection<InterpolatorProperty> interpolatorProperties, Collection<InterpolatorProperty> interpolatorProperties,
PomArtifactResolver resolver ) PomArtifactResolver resolver )
@ -476,4 +559,39 @@ public class DefaultProjectBuilder
} }
return ""; return "";
} }
private static List<DomainModel> getParentsOfDomainModel( MavenDomainModel domainModel, MetadataReader mdReader )
throws IOException, MetadataReaderException, PomProcessorException
{
List<DomainModel> domainModels = new ArrayList<DomainModel>();
if ( domainModel.hasParent() )
{
byte[] b = mdReader.readMetadata( domainModel.getParentMetadata() );
if ( b == null || b.length < 1 )
throw new PomProcessorException( "cannot read metadata for " + domainModel.getParentMetadata() );
MavenDomainModel parentDomainModel =
new MavenDomainModel( b );
domainModels.add( parentDomainModel );
domainModels.addAll( getParentsOfDomainModel( parentDomainModel, mdReader ) );
}
return domainModels;
}
private static List<ModelProperty> transformProfiles( List<ModelProperty> modelProperties )
{
List<ModelProperty> properties = new ArrayList<ModelProperty>();
for ( ModelProperty mp : modelProperties )
{
if ( mp.getUri().startsWith( ProjectUri.Profiles.Profile.xUri )
&& !mp.getUri().equals( ProjectUri.Profiles.Profile.id )
&& !mp.getUri().startsWith( ProjectUri.Profiles.Profile.Activation.xUri ) )
{
properties.add( new ModelProperty( mp.getUri().replace( ProjectUri.Profiles.Profile.xUri,
ProjectUri.xUri ), mp.getResolvedValue() ) );
}
}
return properties;
}
} }

View File

@ -249,6 +249,11 @@ under the License.
<dependencies> <dependencies>
<!-- Maven Modules --> <!-- Maven Modules -->
<!--start--> <!--start-->
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-mercury</artifactId>
<version>${project.version}</version>
</dependency>
<dependency> <dependency>
<groupId>org.apache.maven</groupId> <groupId>org.apache.maven</groupId>
<artifactId>maven-lifecycle</artifactId> <artifactId>maven-lifecycle</artifactId>