diff --git a/maven-mercury/pom.xml b/maven-mercury/pom.xml index 07df30829a..2d4de65f7a 100644 --- a/maven-mercury/pom.xml +++ b/maven-mercury/pom.xml @@ -41,6 +41,11 @@ org.codehaus.plexus plexus-component-annotations + + + org.sonatype.spice + model-builder + diff --git a/maven-mercury/src/main/java/org/apache/maven/mercury/PomProcessor.java b/maven-mercury/src/main/java/org/apache/maven/mercury/PomProcessor.java new file mode 100644 index 0000000000..e91d454afe --- /dev/null +++ b/maven-mercury/src/main/java/org/apache/maven/mercury/PomProcessor.java @@ -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 getRawPom(ArtifactBasicMetadata bmd, MetadataReader mdReader, Map env, Map sysProps) + throws MetadataReaderException, PomProcessorException; +} diff --git a/maven-mercury/src/main/java/org/apache/maven/mercury/PomProcessorException.java b/maven-mercury/src/main/java/org/apache/maven/mercury/PomProcessorException.java new file mode 100644 index 0000000000..63bb1b52f1 --- /dev/null +++ b/maven-mercury/src/main/java/org/apache/maven/mercury/PomProcessorException.java @@ -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 ); + } + +} diff --git a/maven-project/pom.xml b/maven-project/pom.xml index 156b5b45d9..abe2e83140 100644 --- a/maven-project/pom.xml +++ b/maven-project/pom.xml @@ -68,6 +68,10 @@ under the License. org.apache.maven maven-project-builder + + org.apache.maven + maven-mercury + commons-jxpath commons-jxpath diff --git a/maven-project/src/main/java/org/apache/maven/project/builder/impl/DefaultProjectBuilder.java b/maven-project/src/main/java/org/apache/maven/project/builder/impl/DefaultProjectBuilder.java index 94886020ee..dd1e6bac02 100644 --- a/maven-project/src/main/java/org/apache/maven/project/builder/impl/DefaultProjectBuilder.java +++ b/maven-project/src/main/java/org/apache/maven/project/builder/impl/DefaultProjectBuilder.java @@ -23,12 +23,17 @@ import java.io.IOException; import java.io.Reader; import java.io.StringReader; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; +import java.util.*; 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.InvalidRepositoryException; import org.apache.maven.artifact.factory.ArtifactFactory; @@ -61,7 +66,7 @@ */ @Component(role = ProjectBuilder.class) public class DefaultProjectBuilder - implements ProjectBuilder, Mixer, LogEnabled + implements ProjectBuilder, Mixer, PomProcessor, LogEnabled { @Requirement private ArtifactFactory artifactFactory; @@ -74,6 +79,84 @@ public class DefaultProjectBuilder private Logger logger; + public List 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 interpolatorProperties = new ArrayList(); + 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 domainModels = new ArrayList(); + 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 activeProfiles = domainModel.getActiveProfileContainers( interpolatorProperties ); + + for ( ModelContainer mc : activeProfiles ) + { + domainModels.add( new MavenDomainModel( transformProfiles( mc.getProperties() ) ) ); + } + + List 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, Collection interpolatorProperties, PomArtifactResolver resolver ) @@ -476,4 +559,39 @@ private static String getValueByUri(String uri, List modelPropert } return ""; } + + private static List getParentsOfDomainModel( MavenDomainModel domainModel, MetadataReader mdReader ) + throws IOException, MetadataReaderException, PomProcessorException + { + List domainModels = new ArrayList(); + 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 transformProfiles( List modelProperties ) + { + List properties = new ArrayList(); + 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; + } } diff --git a/pom.xml b/pom.xml index e23a9ad7d3..3f3166fa27 100644 --- a/pom.xml +++ b/pom.xml @@ -249,6 +249,11 @@ under the License. + + org.apache.maven + maven-mercury + ${project.version} + org.apache.maven maven-lifecycle