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} +