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