diff --git a/maven-embedder/pom.xml b/maven-embedder/pom.xml
index 14ed1162ba..4a6cc2b5c5 100644
--- a/maven-embedder/pom.xml
+++ b/maven-embedder/pom.xml
@@ -59,6 +59,10 @@
easymock
easymock
+
+ commons-jxpath
+ commons-jxpath
+
diff --git a/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java b/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java
index 84fa894244..60cff2da10 100644
--- a/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java
+++ b/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java
@@ -91,6 +91,7 @@
import org.codehaus.plexus.component.repository.exception.ComponentRepositoryException;
import org.codehaus.plexus.configuration.PlexusConfigurationException;
import org.codehaus.plexus.configuration.PlexusConfiguration;
+import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
import org.codehaus.plexus.logging.LoggerManager;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.ReaderFactory;
@@ -250,7 +251,7 @@ public void writeModel( Writer writer,
}
public PlexusConfiguration getPluginConfiguration(String pluginId, String mojoId, Model model) throws Exception
- {
+ {
try {
return mixer.mixPluginAndReturnConfig(pluginRepository.findPluginById(pluginId, mojoId), model);
} catch (PlexusConfigurationException e) {
@@ -258,6 +259,24 @@ public PlexusConfiguration getPluginConfiguration(String pluginId, String mojoId
}
}
+ public Object getPluginConfigurationAsDom(String pluginId, String mojoId, Model model) throws Exception
+ {
+ try {
+ return mixer.mixPluginAndReturnConfigAsDom(pluginRepository.findPluginById(pluginId, mojoId), model);
+ } catch (PlexusConfigurationException e) {
+ throw new IOException(e.getMessage());
+ }
+ }
+
+ public Object getPluginConfigurationAsDom(String pluginId, String mojoId, Model model, String xpathExpression) throws Exception
+ {
+ try {
+ return mixer.mixPluginAndReturnConfigAsDom(pluginRepository.findPluginById(pluginId, mojoId), model, xpathExpression);
+ } catch (PlexusConfigurationException e) {
+ throw new IOException(e.getMessage());
+ }
+ }
+
// ----------------------------------------------------------------------
// Settings
// ----------------------------------------------------------------------
diff --git a/maven-project/pom.xml b/maven-project/pom.xml
index 4a90393b38..156b5b45d9 100644
--- a/maven-project/pom.xml
+++ b/maven-project/pom.xml
@@ -71,8 +71,6 @@ under the License.
commons-jxpath
commons-jxpath
- 1.3
- test
diff --git a/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java b/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
index db65634feb..2455c3876c 100644
--- a/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
+++ b/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
@@ -119,7 +119,17 @@ public MavenProject build( File project, ArtifactRepository localRepository, Pro
public MavenProject build( File projectDescriptor, ProjectBuilderConfiguration config )
throws ProjectBuildingException
- {
+ {
+ if(projectDescriptor == null)
+ {
+ throw new IllegalArgumentException("projectDescriptor: null");
+ }
+
+ if(config == null)
+ {
+ throw new IllegalArgumentException("config: null");
+ }
+
List artifactRepositories = new ArrayList( );
artifactRepositories.addAll( mavenTools.buildArtifactRepositories( projectBuilder.getSuperModel() ) );
if(config.getRemoteRepositories() != null)
@@ -398,7 +408,8 @@ private MavenProject readModelFromLocalPath( String projectId, File projectDescr
null,
interpolatorProperties,
resolver,
- config );
+ config,
+ this);
}
catch ( IOException e )
{
diff --git a/maven-project/src/main/java/org/apache/maven/project/MavenProject.java b/maven-project/src/main/java/org/apache/maven/project/MavenProject.java
index 4de28008a9..f967df0ab3 100644
--- a/maven-project/src/main/java/org/apache/maven/project/MavenProject.java
+++ b/maven-project/src/main/java/org/apache/maven/project/MavenProject.java
@@ -194,12 +194,41 @@ public MavenProject()
public MavenProject( Model model )
{
+ if(model == null)
+ {
+ throw new IllegalArgumentException("model: null");
+ }
setModel( model );
}
+ /**
+ * Constructor
+ *
+ * @param model - may not be null
+ * @param artifactFactory - may not be null
+ * @param mavenTools - may not be null
+ * @param mavenProjectBuilder
+ * @param projectBuilderConfiguration
+ * @throws InvalidRepositoryException
+ */
public MavenProject( Model model, ArtifactFactory artifactFactory, MavenTools mavenTools, MavenProjectBuilder mavenProjectBuilder, ProjectBuilderConfiguration projectBuilderConfiguration )
throws InvalidRepositoryException
{
+ if(model == null)
+ {
+ throw new IllegalArgumentException("model: null");
+ }
+
+ if(artifactFactory == null)
+ {
+ throw new IllegalArgumentException("artifactFactory: null");
+ }
+
+ if(mavenTools == null)
+ {
+ throw new IllegalArgumentException("mavenTools: null");
+ }
+
setModel( model );
this.mavenProjectBuilder = mavenProjectBuilder;
this.projectBuilderConfiguration = projectBuilderConfiguration;
@@ -330,7 +359,17 @@ public Model getModel()
public MavenProject getParent()
{
if ( parent == null )
- {
+ { /*
+ if(mavenProjectBuilder == null)
+ {
+ throw new IllegalArgumentException("mavenProjectBuilder: null");
+ }
+
+ if(projectBuilderConfiguration == null)
+ {
+ throw new IllegalArgumentException("projectBuilderConfiguration: null");
+ }
+ */
if ( parentFile != null )
{
try
diff --git a/maven-project/src/main/java/org/apache/maven/project/builder/Mixer.java b/maven-project/src/main/java/org/apache/maven/project/builder/Mixer.java
index e3b4715975..733a135fa3 100644
--- a/maven-project/src/main/java/org/apache/maven/project/builder/Mixer.java
+++ b/maven-project/src/main/java/org/apache/maven/project/builder/Mixer.java
@@ -4,6 +4,7 @@
import org.apache.maven.model.Plugin;
import org.apache.maven.model.Model;
import org.codehaus.plexus.configuration.PlexusConfiguration;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import java.io.IOException;
@@ -14,4 +15,10 @@ public interface Mixer
Model mixPlugin(Plugin plugin, Model model) throws IOException;
PlexusConfiguration mixPluginAndReturnConfig(Plugin plugin, Model model) throws IOException;
+
+ Object mixPluginAndReturnConfigAsDom(Plugin plugin, Model model) throws IOException,
+ XmlPullParserException;
+
+ Object mixPluginAndReturnConfigAsDom(Plugin plugin, Model model, String xpathExpression) throws IOException,
+ XmlPullParserException;
}
diff --git a/maven-project/src/main/java/org/apache/maven/project/builder/ProjectBuilder.java b/maven-project/src/main/java/org/apache/maven/project/builder/ProjectBuilder.java
index 452ba1bdf5..b8e99244ad 100644
--- a/maven-project/src/main/java/org/apache/maven/project/builder/ProjectBuilder.java
+++ b/maven-project/src/main/java/org/apache/maven/project/builder/ProjectBuilder.java
@@ -27,6 +27,7 @@
import org.apache.maven.model.Model;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectBuilderConfiguration;
+import org.apache.maven.project.MavenProjectBuilder;
import org.apache.maven.shared.model.InterpolatorProperty;
/**
@@ -54,7 +55,8 @@ MavenProject buildFromLocalPath( File pom,
List mixins,
Collection interpolatorProperties,
PomArtifactResolver resolver,
- ProjectBuilderConfiguration projectBuilderConfiguration )
+ ProjectBuilderConfiguration projectBuilderConfiguration,
+ MavenProjectBuilder mavenProjectBuilder)
throws IOException;
Model getSuperModel();
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 3c7fe6cde1..94886020ee 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
@@ -22,6 +22,7 @@
import java.io.File;
import java.io.IOException;
import java.io.Reader;
+import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -37,7 +38,9 @@
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectBuilderConfiguration;
+import org.apache.maven.project.MavenProjectBuilder;
import org.apache.maven.project.builder.*;
+import org.apache.maven.project.builder.ProjectUri;
import org.apache.maven.shared.model.*;
import org.apache.maven.shared.model.impl.DefaultModelDataSource;
import org.codehaus.plexus.component.annotations.Component;
@@ -46,9 +49,12 @@
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.ReaderFactory;
+import org.codehaus.plexus.util.xml.Xpp3DomBuilder;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import org.codehaus.plexus.configuration.PlexusConfiguration;
import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
import org.apache.maven.shared.model.ModelMarshaller;
+import org.apache.commons.jxpath.JXPathContext;
/**
* Default implementation of the project builder.
@@ -62,7 +68,7 @@ public class DefaultProjectBuilder
@Requirement
private MavenTools mavenTools;
-
+
@Requirement
List listeners;
@@ -170,7 +176,8 @@ public MavenProject buildFromLocalPath( File pom,
List mixins,
Collection interpolatorProperties,
PomArtifactResolver resolver,
- ProjectBuilderConfiguration projectBuilderConfiguration )
+ ProjectBuilderConfiguration projectBuilderConfiguration,
+ MavenProjectBuilder mavenProjectBuilder)
throws IOException
{
PomClassicDomainModel domainModel = buildModel( pom,
@@ -183,7 +190,7 @@ public MavenProject buildFromLocalPath( File pom,
MavenProject mavenProject = new MavenProject( domainModel.getModel(),
artifactFactory,
mavenTools,
- null,
+ mavenProjectBuilder,
projectBuilderConfiguration );
mavenProject.setParentFile( domainModel.getParentFile() );
@@ -385,13 +392,36 @@ public Model mixPlugin(Plugin plugin, Model model) throws IOException
null,
listeners ) );
return transformedDomainModel.getModel();
- // List pluginProperties = ModelMarshaller.marshallXmlToModelProperties(
- // (new PluginMixin(plugin)).getInputStream(), ProjectUri.Build.Plugins.xUri, null);
}
public PlexusConfiguration mixPluginAndReturnConfig(Plugin plugin, Model model) throws IOException
{
+ List mps = mixPluginAndReturnConfigAsProperties(plugin, model);
+ return !mps.isEmpty() ?
+ new XmlPlexusConfiguration(ModelMarshaller.unmarshalModelPropertiesToXml(mps, ProjectUri.Build.Plugins.Plugin.xUri)) : null;
+ }
+
+ public Object mixPluginAndReturnConfigAsDom(Plugin plugin, Model model) throws IOException, XmlPullParserException
+ {
+ List mps = mixPluginAndReturnConfigAsProperties(plugin, model);
+ return !mps.isEmpty() ? Xpp3DomBuilder.build(
+ new StringReader(ModelMarshaller.unmarshalModelPropertiesToXml(mps, ProjectUri.Build.Plugins.Plugin.xUri) ) ) : null;
+ }
+
+ public Object mixPluginAndReturnConfigAsDom(Plugin plugin, Model model, String xpathExpression) throws IOException,
+ XmlPullParserException
+ {
+ Object dom = mixPluginAndReturnConfigAsDom(plugin, model);
+ if(dom == null)
+ {
+ return null;
+ }
+ return JXPathContext.newContext( dom ).getValue(xpathExpression);
+ }
+
+ private List mixPluginAndReturnConfigAsProperties(Plugin plugin, Model model) throws IOException
+ {
List domainModels = new ArrayList();
domainModels.add( new PluginMixin(plugin) );
domainModels.add( new PomClassicDomainModel(model) );
@@ -420,12 +450,12 @@ public PlexusConfiguration mixPluginAndReturnConfig(Plugin plugin, Model model)
config.add(mp);
}
}
- return new XmlPlexusConfiguration(ModelMarshaller.unmarshalModelPropertiesToXml(config, ProjectUri.Build.Plugins.Plugin.xUri));
+ return config;
}
}
- return null;
- }
+ return new ArrayList();
+ }
private static boolean matchesIdOfPlugin(ModelContainer mc, Plugin plugin)
{
diff --git a/maven-project/src/test/java/org/apache/maven/project/builder/PomConstructionTest.java b/maven-project/src/test/java/org/apache/maven/project/builder/PomConstructionTest.java
index bf15e66ec1..5ef002d8c5 100644
--- a/maven-project/src/test/java/org/apache/maven/project/builder/PomConstructionTest.java
+++ b/maven-project/src/test/java/org/apache/maven/project/builder/PomConstructionTest.java
@@ -31,7 +31,12 @@
import org.apache.maven.model.Plugin;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.repository.DefaultArtifactRepository;
+import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
import org.apache.maven.project.harness.PomTestWrapper;
+import org.apache.maven.project.MavenProjectBuilder;
+import org.apache.maven.project.ProjectBuilderConfiguration;
+import org.apache.maven.project.DefaultProjectBuilderConfiguration;
import org.codehaus.plexus.PlexusTestCase;
import org.codehaus.plexus.configuration.PlexusConfiguration;
import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
@@ -49,6 +54,8 @@ public class PomConstructionTest
private ProjectBuilder projectBuilder;
+ private MavenProjectBuilder mavenProjectBuilder;
+
private Mixer mixer;
private MavenTools mavenTools;
@@ -64,6 +71,7 @@ protected void setUp()
{
testDirectory = new File( getBasedir(), BASE_POM_DIR );
testMixinDirectory = new File( getBasedir(), BASE_MIXIN_DIR );
+ mavenProjectBuilder = lookup( MavenProjectBuilder.class );
projectBuilder = lookup( ProjectBuilder.class );
mixer = (Mixer) projectBuilder;
mavenTools = lookup( MavenTools.class );
@@ -137,6 +145,24 @@ public void testDependenciesDifferentVersions()
}
*/
+ /* MNG-3567*/
+ public void testParentInterpolation()
+ throws Exception
+ {
+ PomTestWrapper pom = buildPomFromMavenProject( "parent-interpolation/sub" );
+ pom = new PomTestWrapper(pom.getMavenProject().getParent());
+ assertEquals( "1.3.0-SNAPSHOT", pom.getValue( "build/plugins[1]/version" ) );
+ }
+
+
+ /* MNG-3567*/
+ public void testPluginManagementInherited()
+ throws Exception
+ {
+ PomTestWrapper pom = buildPom( "pluginmanagement-inherited/sub" );
+ assertEquals( "1.0-alpha-21", pom.getValue( "build/plugins[1]/version" ) );
+ }
+
public void testPluginOrder()
throws Exception
{
@@ -760,6 +786,20 @@ private PomTestWrapper buildPom( String pomPath )
return new PomTestWrapper( pomFile, projectBuilder.buildModel( pomFile, null, pomArtifactResolver ) );
}
+ private PomTestWrapper buildPomFromMavenProject( String pomPath )
+ throws IOException
+ {
+ File pomFile = new File( testDirectory , pomPath );
+ if ( pomFile.isDirectory() )
+ {
+ pomFile = new File( pomFile, "pom.xml" );
+ }
+ ProjectBuilderConfiguration config = new DefaultProjectBuilderConfiguration();
+ config.setLocalRepository(new DefaultArtifactRepository("default", "", new DefaultRepositoryLayout()));
+ return new PomTestWrapper( pomFile, projectBuilder.buildFromLocalPath( pomFile, null, null, pomArtifactResolver,
+ config, mavenProjectBuilder ) );
+ }
+
private Model buildMixin( String mixinPath )
throws IOException, XmlPullParserException
{
diff --git a/maven-project/src/test/java/org/apache/maven/project/harness/PomTestWrapper.java b/maven-project/src/test/java/org/apache/maven/project/harness/PomTestWrapper.java
index 2074d3f908..2bd178aa10 100644
--- a/maven-project/src/test/java/org/apache/maven/project/harness/PomTestWrapper.java
+++ b/maven-project/src/test/java/org/apache/maven/project/harness/PomTestWrapper.java
@@ -30,6 +30,7 @@
import org.apache.commons.jxpath.ri.JXPathContextReferenceImpl;
import org.apache.maven.model.Model;
import org.apache.maven.project.builder.PomClassicDomainModel;
+import org.apache.maven.project.MavenProject;
import org.apache.maven.shared.model.ModelProperty;
public class PomTestWrapper
@@ -41,6 +42,8 @@ public class PomTestWrapper
private JXPathContext context;
+ private MavenProject mavenProject;
+
static
{
JXPathContextReferenceImpl.addNodePointerFactory( new Xpp3DomPointerFactory() );
@@ -64,6 +67,29 @@ public PomTestWrapper( File pomFile, PomClassicDomainModel domainModel )
context = JXPathContext.newContext( domainModel.getModel() );
}
+ public PomTestWrapper( File pomFile, MavenProject mavenProject )
+ throws IOException
+ {
+ if ( mavenProject == null )
+ {
+ throw new IllegalArgumentException( "mavenProject: null" );
+ }
+ this.mavenProject = mavenProject;
+ this.pomFile = pomFile;
+ context = JXPathContext.newContext( mavenProject.getModel() );
+ }
+
+ public PomTestWrapper( MavenProject mavenProject )
+ throws IOException
+ {
+ if ( mavenProject == null )
+ {
+ throw new IllegalArgumentException( "mavenProject: null" );
+ }
+ this.mavenProject = mavenProject;
+ context = JXPathContext.newContext( mavenProject.getModel() );
+ }
+
public PomTestWrapper( File file )
throws IOException
{
@@ -88,6 +114,11 @@ public PomTestWrapper( Model model )
context = JXPathContext.newContext( domainModel.getModel() );
}
+ public MavenProject getMavenProject()
+ {
+ return mavenProject;
+ }
+
public PomClassicDomainModel getDomainModel()
{
return this.domainModel;
diff --git a/maven-project/src/test/resources-project-builder/parent-interpolation/pom.xml b/maven-project/src/test/resources-project-builder/parent-interpolation/pom.xml
new file mode 100644
index 0000000000..7414d0234e
--- /dev/null
+++ b/maven-project/src/test/resources-project-builder/parent-interpolation/pom.xml
@@ -0,0 +1,15 @@
+
+ 4.0.0
+ org.sonatype.nexus
+ nexus
+ 1.3.0-SNAPSHOT
+
+
+
+ org.codehaus.modello
+ modello-maven-plugin
+ ${project.version}
+
+
+
+
\ No newline at end of file
diff --git a/maven-project/src/test/resources-project-builder/parent-interpolation/sub/pom.xml b/maven-project/src/test/resources-project-builder/parent-interpolation/sub/pom.xml
new file mode 100644
index 0000000000..752852b1b1
--- /dev/null
+++ b/maven-project/src/test/resources-project-builder/parent-interpolation/sub/pom.xml
@@ -0,0 +1,9 @@
+
+
+ org.sonatype.nexus
+ nexus
+ 1.3.0-SNAPSHOT
+
+ 4.0.0
+ a
+
\ No newline at end of file
diff --git a/maven-project/src/test/resources-project-builder/pluginmanagement-inherited/pom.xml b/maven-project/src/test/resources-project-builder/pluginmanagement-inherited/pom.xml
new file mode 100644
index 0000000000..65560c0763
--- /dev/null
+++ b/maven-project/src/test/resources-project-builder/pluginmanagement-inherited/pom.xml
@@ -0,0 +1,17 @@
+
+ 4.0.0
+ org.sonatype.nexus
+ nexus
+ 1.3.0-SNAPSHOT
+
+
+
+
+ org.codehaus.modello
+ modello-maven-plugin
+ 1.0-alpha-21
+
+
+
+
+
\ No newline at end of file
diff --git a/maven-project/src/test/resources-project-builder/pluginmanagement-inherited/sub/pom.xml b/maven-project/src/test/resources-project-builder/pluginmanagement-inherited/sub/pom.xml
new file mode 100644
index 0000000000..319e6adbf0
--- /dev/null
+++ b/maven-project/src/test/resources-project-builder/pluginmanagement-inherited/sub/pom.xml
@@ -0,0 +1,17 @@
+
+
+ org.sonatype.nexus
+ nexus
+ 1.3.0-SNAPSHOT
+
+ 4.0.0
+ a
+
+
+
+ org.codehaus.modello
+ modello-maven-plugin
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 55002cd7c6..e23a9ad7d3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -59,6 +59,7 @@ under the License.
1.0-alpha-1
3.2.6
1.0-alpha-22
+ 1.3
jira
@@ -400,6 +401,11 @@ under the License.
+
+ commons-jxpath
+ commons-jxpath
+ ${jxpathVersion}
+