You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by kw...@apache.org on 2022/10/30 07:56:03 UTC
[maven] 01/01: [MNG-7588] generate reader and some beans automatically for plugin descriptor
This is an automated email from the ASF dual-hosted git repository.
kwin pushed a commit to branch feature/generate-plugin-descriptor-bean-and-reader-from-model
in repository https://gitbox.apache.org/repos/asf/maven.git
commit 6afdb47604cb70eed983979b1be3afd28c4844cb
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Mon Oct 24 13:21:30 2022 +0200
[MNG-7588] generate reader and some beans automatically for plugin
descriptor
WIP
---
maven-plugin-api/pom.xml | 70 +++-
.../InvalidPluginDescriptorException.java | 7 +-
.../maven/plugin/descriptor/MojoDescriptor.java | 376 ++++++++++++++++++++-
.../apache/maven/plugin/descriptor/Parameter.java | 207 ------------
.../maven/plugin/descriptor/PluginDescriptor.java | 216 +++++++++++-
.../plugin/descriptor/PluginDescriptorBuilder.java | 148 +-------
.../maven/plugin/descriptor/Requirement.java | 72 ----
maven-plugin-api/src/main/mdo/plugin.mdo | 78 ++++-
.../plugin/descriptor/MojoDescriptorTest.java | 8 +-
.../descriptor/PluginDescriptorBuilderTest.java | 2 +-
...st.java => PluginDescriptorXpp3ReaderTest.java} | 18 +-
11 files changed, 753 insertions(+), 449 deletions(-)
diff --git a/maven-plugin-api/pom.xml b/maven-plugin-api/pom.xml
index 198a90c10..1fa841f43 100644
--- a/maven-plugin-api/pom.xml
+++ b/maven-plugin-api/pom.xml
@@ -61,7 +61,7 @@ under the License.
<plugin>
<groupId>org.codehaus.modello</groupId>
<artifactId>modello-maven-plugin</artifactId>
- <version>2.0.0</version>
+ <version>2.1.0-SNAPSHOT</version>
<configuration>
<models>
<model>src/main/mdo/lifecycle.mdo</model>
@@ -69,10 +69,22 @@ under the License.
<version>1.0.0</version>
</configuration>
<executions>
- <execution>
- <id>modello</id>
- <phase>none</phase>
- </execution>
+<!-- <execution> -->
+<!-- <id>modello</id> -->
+<!-- <phase>none</phase> -->
+<!-- </execution> -->
+<!-- <execution> -->
+<!-- <id>modello-plugindescriptor-reader</id> -->
+<!-- <goals> -->
+<!-- <goal>xpp3-reader</goal> -->
+<!-- </goals> -->
+<!-- <configuration> -->
+<!-- <models> -->
+<!-- <model>src/main/mdo/plugin.mdo</model> -->
+<!-- </models> -->
+<!-- <version>1.1.0</version> -->
+<!-- </configuration> -->
+<!-- </execution> -->
<execution>
<id>modello-site-docs</id>
<phase>pre-site</phase>
@@ -90,7 +102,7 @@ under the License.
<artifactId>modello-plugin-velocity</artifactId>
<executions>
<execution>
- <id>velocity</id>
+ <id>velocity-lifecycle</id>
<phase>generate-sources</phase>
<goals>
<goal>velocity</goal>
@@ -112,6 +124,52 @@ under the License.
</params>
</configuration>
</execution>
+ <execution>
+ <id>velocity-plugin</id>
+ <phase>generate-sources</phase>
+ <goals>
+ <goal>velocity</goal>
+ </goals>
+ <configuration>
+ <version>1.1.0</version>
+ <models>
+ <model>src/main/mdo/plugin.mdo</model>
+ </models>
+ <templates>
+ <template>src/main/mdo/model.vm</template>
+ <template>src/main/mdo/reader.vm</template>
+ </templates>
+ <params>
+ <param>packageModelV3=org.apache.maven.plugin.descriptor</param>
+ <param>packageModelV4=org.apache.maven.plugin.descriptor</param>
+ <param>packageToolV4=org.apache.maven.plugin.descriptor.io.xpp3</param>
+ </params>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <artifactId>maven-clean-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>remove-superfluous-generated-classes</id>
+ <phase>generate-sources</phase>
+ <goals>
+ <goal>clean</goal>
+ </goals>
+ <configuration>
+ <excludeDefaultDirectories>true</excludeDefaultDirectories>
+ <filesets>
+ <fileset>
+ <directory>target/generated-sources/modello/org/apache/maven/plugin/descriptor</directory>
+ <includes>
+ <include>MojoDescriptor.java</include>
+ <include>PluginDescriptor.java</include>
+ </includes>
+ </fileset>
+ </filesets>
+ </configuration>
+ </execution>
</executions>
</plugin>
</plugins>
diff --git a/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/InvalidPluginDescriptorException.java b/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/InvalidPluginDescriptorException.java
index f63fd26ce..12f9655c5 100644
--- a/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/InvalidPluginDescriptorException.java
+++ b/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/InvalidPluginDescriptorException.java
@@ -19,18 +19,19 @@ package org.apache.maven.plugin.descriptor;
* under the License.
*/
-import org.codehaus.plexus.configuration.PlexusConfigurationException;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
/**
* InvalidPluginDescriptorException
*/
public class InvalidPluginDescriptorException
- extends PlexusConfigurationException
+ extends XmlPullParserException
{
public InvalidPluginDescriptorException( String message, Throwable cause )
{
- super( message, cause );
+ super( message );
+ this.initCause( cause );
}
public InvalidPluginDescriptorException( String message )
diff --git a/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/MojoDescriptor.java b/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/MojoDescriptor.java
index 80829332a..ea6c3d40d 100644
--- a/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/MojoDescriptor.java
+++ b/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/MojoDescriptor.java
@@ -20,15 +20,20 @@ package org.apache.maven.plugin.descriptor;
*/
import java.util.ArrayList;
+import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
+import org.apache.maven.api.annotations.Nonnull;
+import org.apache.maven.api.annotations.NotThreadSafe;
+import org.apache.maven.api.xml.Dom;
import org.apache.maven.plugin.Mojo;
import org.codehaus.plexus.component.repository.ComponentDescriptor;
import org.codehaus.plexus.configuration.PlexusConfiguration;
import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
+import org.codehaus.plexus.util.xml.Xpp3Dom;
/**
* The bean containing the Mojo descriptor.<br>
@@ -36,8 +41,8 @@ import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
* <a href="https://maven.apache.org/developers/mojo-api-specification.html">
* https://maven.apache.org/developers/mojo-api-specification.html</a>
*
- * TODO is there a need for the delegation of MavenMojoDescriptor to this?
- * Why not just extend ComponentDescriptor here?
+ * This file is not generated from the underlying Modello model as it needs to extend {@link ComponentDescriptor}
+ * which is not based on a model.
*/
public class MojoDescriptor
extends ComponentDescriptor<Mojo>
@@ -200,12 +205,13 @@ public class MojoDescriptor
* @param parameters the new list of parameters
* @throws DuplicateParameterException if any
*/
- public void setParameters( List<Parameter> parameters )
+ public void setParameters( Collection<Parameter> parameters )
throws DuplicateParameterException
{
this.parameters.clear();
for ( Parameter parameter : parameters )
{
+ // enrich parameter with information from configuration (already available?)
addParameter( parameter );
}
}
@@ -223,10 +229,24 @@ public class MojoDescriptor
+ " has been declared multiple times in mojo with goal: " + getGoal() + " (implementation: "
+ getImplementation() + ")" );
}
-
+ if ( mojoConfiguration != null )
+ {
+ setParameterValuesFromMojoConfiguration( parameter );
+ }
parameters.add( parameter );
}
+ private boolean setParameterValuesFromMojoConfiguration( Parameter parameter )
+ {
+ PlexusConfiguration paramConfig = mojoConfiguration.getChild( parameter.getName(), false );
+ if ( paramConfig != null )
+ {
+ parameter.setExpression( paramConfig.getValue( null ) );
+ parameter.setDefaultValue( paramConfig.getAttribute( "default-value" ) );
+ return true;
+ }
+ return false;
+ }
/**
* @return the list parameters as a Map (keyed by {@link Parameter#getName()}) that is built from
* {@link #parameters} list on each call. In other words, the map returned is built on fly and is a copy.
@@ -452,6 +472,10 @@ public class MojoDescriptor
public void setMojoConfiguration( PlexusConfiguration mojoConfiguration )
{
this.mojoConfiguration = mojoConfiguration;
+ for ( Parameter parameter : parameters )
+ {
+ setParameterValuesFromMojoConfiguration( parameter );
+ }
}
/** {@inheritDoc} */
@@ -668,6 +692,17 @@ public class MojoDescriptor
this.v4Api = v4Api;
}
+ public final void setMojoConfiguration( final Xpp3Dom configuration )
+ {
+ setMojoConfiguration( new XmlPlexusConfiguration( configuration ) );
+ }
+
+
+ public void setRequirements( Collection<Requirement> requirements )
+ {
+ requirements.stream().map( Requirement::toComponentRequirement ).forEach( this::addRequirement );
+ }
+
/**
* Creates a shallow copy of this mojo descriptor.
*/
@@ -684,4 +719,337 @@ public class MojoDescriptor
}
}
+
+ /**
+ * Creates a new MojoDescriptor instance.
+ * Equivalent to {@code newInstance( true )}.
+ * @throws DuplicateParameterException
+ * @see #newInstance(boolean)
+ */
+ @Nonnull
+ public static MojoDescriptor newInstance() throws DuplicateParameterException
+ {
+ return newInstance( true );
+ }
+
+ /**
+ * Creates a new MojoDescriptor instance using default values or not.
+ * Equivalent to {@code newBuilder( withDefaults ).build()}.
+ * @throws DuplicateParameterException
+ */
+ @Nonnull
+ public static MojoDescriptor newInstance( boolean withDefaults ) throws DuplicateParameterException
+ {
+ return newBuilder( withDefaults ).build();
+ }
+
+ /**
+ * Creates a new MojoDescriptor builder instance.
+ * Equivalent to {@code newBuilder( true )}.
+ * @see #newBuilder(boolean)
+ */
+ @Nonnull
+ public static Builder newBuilder()
+ {
+ return newBuilder( true );
+ }
+
+ /**
+ * Creates a new MojoDescriptor builder instance using default values or not.
+ */
+ @Nonnull
+ public static Builder newBuilder( boolean withDefaults )
+ {
+ return new Builder( withDefaults );
+ }
+
+ /**
+ * Builder class used to create MojoDescriptor instances.
+ * @see #with()
+ * @see #newBuilder()
+ */
+ @NotThreadSafe
+ public static class Builder
+ {
+ String goal;
+ String description;
+ String implementation;
+ String language;
+ String phase;
+ String executePhase;
+ String executeGoal;
+ String executeLifecycle;
+ String requiresDependencyResolution;
+ String requiresDependencyCollection;
+ Boolean requiresDirectInvocation;
+ Boolean requiresProject;
+ Boolean requiresReports;
+ Boolean requiresOnline;
+ Boolean aggregator;
+ Boolean inheritedByDefault;
+ Boolean threadSafe;
+ Boolean v4Api;
+ String instantiationStrategy;
+ String executionStrategy;
+ String since;
+ String deprecated;
+ String configurator;
+ String composer;
+ Collection<Parameter> parameters;
+ Dom configuration;
+ Collection<Requirement> requirements;
+
+ Builder( boolean withDefaults )
+ {
+ if ( withDefaults )
+ {
+ this.language = "java";
+ this.requiresDependencyResolution = "runtime";
+ this.requiresDirectInvocation = false;
+ this.requiresProject = true;
+ this.requiresReports = false;
+ this.requiresOnline = false;
+ this.aggregator = false;
+ this.inheritedByDefault = true;
+ this.threadSafe = false;
+ this.v4Api = false;
+ this.instantiationStrategy = "per-lookup";
+ this.executionStrategy = "once-per-session";
+ }
+ }
+
+ @Nonnull
+ public Builder goal( String goal )
+ {
+ this.goal = goal;
+ return this;
+ }
+
+ @Nonnull
+ public Builder description( String description )
+ {
+ this.description = description;
+ return this;
+ }
+
+ @Nonnull
+ public Builder implementation( String implementation )
+ {
+ this.implementation = implementation;
+ return this;
+ }
+
+ @Nonnull
+ public Builder language( String language )
+ {
+ this.language = language;
+ return this;
+ }
+
+ @Nonnull
+ public Builder phase( String phase )
+ {
+ this.phase = phase;
+ return this;
+ }
+
+ @Nonnull
+ public Builder executePhase( String executePhase )
+ {
+ this.executePhase = executePhase;
+ return this;
+ }
+
+ @Nonnull
+ public Builder executeGoal( String executeGoal )
+ {
+ this.executeGoal = executeGoal;
+ return this;
+ }
+
+ @Nonnull
+ public Builder executeLifecycle( String executeLifecycle )
+ {
+ this.executeLifecycle = executeLifecycle;
+ return this;
+ }
+
+ @Nonnull
+ public Builder requiresDependencyResolution( String requiresDependencyResolution )
+ {
+ this.requiresDependencyResolution = requiresDependencyResolution;
+ return this;
+ }
+
+ @Nonnull
+ public Builder requiresDependencyCollection( String requiresDependencyCollection )
+ {
+ this.requiresDependencyCollection = requiresDependencyCollection;
+ return this;
+ }
+
+ @Nonnull
+ public Builder requiresDirectInvocation( boolean requiresDirectInvocation )
+ {
+ this.requiresDirectInvocation = requiresDirectInvocation;
+ return this;
+ }
+
+ @Nonnull
+ public Builder requiresProject( boolean requiresProject )
+ {
+ this.requiresProject = requiresProject;
+ return this;
+ }
+
+ @Nonnull
+ public Builder requiresReports( boolean requiresReports )
+ {
+ this.requiresReports = requiresReports;
+ return this;
+ }
+
+ @Nonnull
+ public Builder requiresOnline( boolean requiresOnline )
+ {
+ this.requiresOnline = requiresOnline;
+ return this;
+ }
+
+ @Nonnull
+ public Builder aggregator( boolean aggregator )
+ {
+ this.aggregator = aggregator;
+ return this;
+ }
+
+ @Nonnull
+ public Builder inheritedByDefault( boolean inheritedByDefault )
+ {
+ this.inheritedByDefault = inheritedByDefault;
+ return this;
+ }
+
+ @Nonnull
+ public Builder threadSafe( boolean threadSafe )
+ {
+ this.threadSafe = threadSafe;
+ return this;
+ }
+
+ @Nonnull
+ public Builder v4Api( boolean v4Api )
+ {
+ this.v4Api = v4Api;
+ return this;
+ }
+
+ @Nonnull
+ public Builder instantiationStrategy( String instantiationStrategy )
+ {
+ this.instantiationStrategy = instantiationStrategy;
+ return this;
+ }
+
+ @Nonnull
+ public Builder executionStrategy( String executionStrategy )
+ {
+ this.executionStrategy = executionStrategy;
+ return this;
+ }
+
+ @Nonnull
+ public Builder since( String since )
+ {
+ this.since = since;
+ return this;
+ }
+
+ @Nonnull
+ public Builder deprecated( String deprecated )
+ {
+ this.deprecated = deprecated;
+ return this;
+ }
+
+ @Nonnull
+ public Builder configurator( String configurator )
+ {
+ this.configurator = configurator;
+ return this;
+ }
+
+ @Nonnull
+ public Builder composer( String composer )
+ {
+ this.composer = composer;
+ return this;
+ }
+
+ @Nonnull
+ public Builder parameters( Collection<Parameter> parameters )
+ {
+ this.parameters = parameters;
+ return this;
+ }
+
+ @Nonnull
+ public Builder configuration( Dom configuration )
+ {
+ this.configuration = configuration;
+ return this;
+ }
+
+ @Nonnull
+ public Builder requirements( Collection<Requirement> requirements )
+ {
+ this.requirements = requirements;
+ return this;
+ }
+
+ @Nonnull
+ public MojoDescriptor build() throws DuplicateParameterException
+ {
+ MojoDescriptor mojoDescriptor = new MojoDescriptor();
+ mojoDescriptor.setGoal( goal );
+ mojoDescriptor.setDescription( description );
+ mojoDescriptor.setImplementation( implementation );
+ mojoDescriptor.setLanguage( language );
+ mojoDescriptor.setPhase( phase );
+ mojoDescriptor.setExecutePhase( executePhase );
+ mojoDescriptor.setExecuteGoal( executeGoal );
+ mojoDescriptor.setExecuteLifecycle( executeLifecycle );
+ mojoDescriptor.setDependencyResolutionRequired( requiresDependencyResolution );
+ mojoDescriptor.setDependencyCollectionRequired( requiresDependencyCollection );
+ mojoDescriptor.setDirectInvocationOnly( requiresDirectInvocation );
+ mojoDescriptor.setProjectRequired( requiresProject );
+ mojoDescriptor.setRequiresReports( requiresReports );
+ mojoDescriptor.setOnlineRequired( requiresOnline );
+ mojoDescriptor.setAggregator( aggregator );
+ mojoDescriptor.setInheritedByDefault( inheritedByDefault );
+ mojoDescriptor.setThreadSafe( threadSafe );
+ mojoDescriptor.setV4Api( v4Api );
+ mojoDescriptor.setInstantiationStrategy( instantiationStrategy );
+ mojoDescriptor.setExecutionStrategy( executionStrategy );
+ mojoDescriptor.setSince( since );
+ mojoDescriptor.setDeprecated( deprecated );
+ mojoDescriptor.setComponentConfigurator( configurator );
+ mojoDescriptor.setComponentComposer( composer );
+ if ( parameters != null )
+ {
+ mojoDescriptor.setParameters( parameters );
+ }
+ if ( configuration != null )
+ {
+ mojoDescriptor.setMojoConfiguration( new Xpp3Dom( configuration ) );
+ }
+ if ( requirements != null )
+ {
+ mojoDescriptor.setRequirements( requirements );
+ }
+ return mojoDescriptor;
+
+ }
+ }
+
}
diff --git a/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/Parameter.java b/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/Parameter.java
deleted file mode 100644
index 14fd2f0ba..000000000
--- a/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/Parameter.java
+++ /dev/null
@@ -1,207 +0,0 @@
-package org.apache.maven.plugin.descriptor;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/**
- * @author Jason van Zyl
- */
-public class Parameter
- implements Cloneable
-{
- private String alias;
-
- private String name;
-
- private String type;
-
- private boolean required;
-
- private boolean editable = true;
-
- private String description;
-
- private String expression;
-
- private String deprecated;
-
- private String defaultValue;
-
- private String implementation;
-
- private Requirement requirement;
-
- private String since;
-
- // ----------------------------------------------------------------------
- //
- // ----------------------------------------------------------------------
-
- public String getName()
- {
- return name;
- }
-
- public void setName( String name )
- {
- this.name = name;
- }
-
- public String getType()
- {
- return type;
- }
-
- public void setType( String type )
- {
- this.type = type;
- }
-
- public boolean isRequired()
- {
- return required;
- }
-
- public void setRequired( boolean required )
- {
- this.required = required;
- }
-
- public String getDescription()
- {
- return description;
- }
-
- public void setDescription( String description )
- {
- this.description = description;
- }
-
- public String getExpression()
- {
- return expression;
- }
-
- public void setExpression( String expression )
- {
- this.expression = expression;
- }
-
- public String getDeprecated()
- {
- return deprecated;
- }
-
- public void setDeprecated( String deprecated )
- {
- this.deprecated = deprecated;
- }
-
- public int hashCode()
- {
- return name.hashCode();
- }
-
- public boolean equals( Object other )
- {
- return ( other instanceof Parameter ) && getName().equals( ( (Parameter) other ).getName() );
- }
-
- public String getAlias()
- {
- return alias;
- }
-
- public void setAlias( String alias )
- {
- this.alias = alias;
- }
-
- public boolean isEditable()
- {
- return editable;
- }
-
- public void setEditable( boolean editable )
- {
- this.editable = editable;
- }
-
- public void setDefaultValue( String defaultValue )
- {
- this.defaultValue = defaultValue;
- }
-
- public String getDefaultValue()
- {
- return defaultValue;
- }
-
- public String toString()
- {
- return "Mojo parameter [name: '" + getName() + "'; alias: '" + getAlias() + "']";
- }
-
- public Requirement getRequirement()
- {
- return requirement;
- }
-
- public void setRequirement( Requirement requirement )
- {
- this.requirement = requirement;
- }
-
- public String getImplementation()
- {
- return implementation;
- }
-
- public void setImplementation( String implementation )
- {
- this.implementation = implementation;
- }
-
- public String getSince()
- {
- return since;
- }
-
- public void setSince( String since )
- {
- this.since = since;
- }
-
- /**
- * Creates a shallow copy of this parameter.
- */
- @Override
- public Parameter clone()
- {
- try
- {
- return (Parameter) super.clone();
- }
- catch ( CloneNotSupportedException e )
- {
- throw new UnsupportedOperationException( e );
- }
- }
-
-}
diff --git a/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java b/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java
index 8c799419c..ccc2b9f0a 100644
--- a/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java
+++ b/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java
@@ -19,6 +19,9 @@ package org.apache.maven.plugin.descriptor;
* under the License.
*/
+
+import org.apache.maven.api.annotations.Nonnull;
+import org.apache.maven.api.annotations.NotThreadSafe;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.ArtifactUtils;
import org.apache.maven.model.Plugin;
@@ -26,6 +29,7 @@ import org.apache.maven.plugin.lifecycle.Lifecycle;
import org.apache.maven.plugin.lifecycle.LifecycleConfiguration;
import org.apache.maven.plugin.lifecycle.io.xpp3.LifecycleMappingsXpp3Reader;
import org.codehaus.plexus.classworlds.realm.ClassRealm;
+import org.codehaus.plexus.component.repository.ComponentDependency;
import org.codehaus.plexus.component.repository.ComponentSetDescriptor;
import org.codehaus.plexus.util.ReaderFactory;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
@@ -37,13 +41,18 @@ import java.io.InputStream;
import java.io.Reader;
import java.net.MalformedURLException;
import java.net.URL;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.stream.Collectors;
/**
+ * This file is not generated from the underlying Modello model as it needs to extend {@link ComponentSetDescriptor}
+ * which is not based on a model.
+ *
* @author Jason van Zyl
*/
public class PluginDescriptor
@@ -88,6 +97,7 @@ public class PluginDescriptor
private Map<String, Lifecycle> lifecycleMappings;
+ private List<Dependency> dependencies;
// ----------------------------------------------------------------------
//
// ----------------------------------------------------------------------
@@ -448,7 +458,7 @@ public class PluginDescriptor
}
}
- public void addMojos( List<MojoDescriptor> mojos )
+ public void setMojos( Collection<MojoDescriptor> mojos )
throws DuplicateMojoDescriptorException
{
for ( MojoDescriptor mojoDescriptor : mojos )
@@ -458,4 +468,208 @@ public class PluginDescriptor
}
+
+ public void setModelEncoding( String inputEncoding )
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void setDependencies2( Collection<Dependency> dependencies2 )
+ {
+ dependencies2.stream().map( Dependency::toComponentDependency ).forEach( this::addDependency );
+ }
+
+ public final List<ComponentDependency> getDependencies2()
+ {
+ return dependencies.stream().map( Dependency::toComponentDependency ).collect( Collectors.toList() );
+ }
+
+
+ /**
+ * Creates a new PluginDescriptor instance.
+ * Equivalent to {@code newInstance( true )}.
+ * @throws DuplicateMojoDescriptorException
+ * @see #newInstance(boolean)
+ */
+ @Nonnull
+ public static PluginDescriptor newInstance() throws DuplicateMojoDescriptorException
+ {
+ return newInstance( true );
+ }
+
+ /**
+ * Creates a new PluginDescriptor instance using default values or not.
+ * Equivalent to {@code newBuilder( withDefaults ).build()}.
+ * @throws DuplicateMojoDescriptorException
+ */
+ @Nonnull
+ public static PluginDescriptor newInstance( boolean withDefaults ) throws DuplicateMojoDescriptorException
+ {
+ return newBuilder( withDefaults ).build();
+ }
+
+ /**
+ * Creates a new PluginDescriptor builder instance.
+ * Equivalent to {@code newBuilder( true )}.
+ * @see #newBuilder(boolean)
+ */
+ @Nonnull
+ public static Builder newBuilder()
+ {
+ return newBuilder( true );
+ }
+
+ /**
+ * Creates a new PluginDescriptor builder instance using default values or not.
+ */
+ @Nonnull
+ public static Builder newBuilder( boolean withDefaults )
+ {
+ return new Builder( withDefaults );
+ }
+
+
+ /**
+ * Builder class used to create PluginDescriptor instances.
+ * @see #with()
+ * @see #newBuilder()
+ */
+ @NotThreadSafe
+ public static class Builder
+ {
+ String modelEncoding;
+ String name;
+ String description;
+ String groupId;
+ String artifactId;
+ String version;
+ String goalPrefix;
+ Boolean isolatedRealm;
+ Boolean inheritedByDefault;
+ String requiredJavaVersion;
+ String requiredMavenVersion;
+ Collection<MojoDescriptor> mojos;
+ Collection<Dependency> dependencies;
+
+ Builder( boolean withDefaults )
+ {
+ if ( withDefaults )
+ {
+ this.isolatedRealm = false;
+ this.inheritedByDefault = true;
+ }
+ }
+
+ @Nonnull
+ public Builder modelEncoding( String modelEncoding )
+ {
+ this.modelEncoding = modelEncoding;
+ return this;
+ }
+
+ @Nonnull
+ public Builder name( String name )
+ {
+ this.name = name;
+ return this;
+ }
+
+ @Nonnull
+ public Builder description( String description )
+ {
+ this.description = description;
+ return this;
+ }
+
+ @Nonnull
+ public Builder groupId( String groupId )
+ {
+ this.groupId = groupId;
+ return this;
+ }
+
+ @Nonnull
+ public Builder artifactId( String artifactId )
+ {
+ this.artifactId = artifactId;
+ return this;
+ }
+
+ @Nonnull
+ public Builder version( String version )
+ {
+ this.version = version;
+ return this;
+ }
+
+ @Nonnull
+ public Builder goalPrefix( String goalPrefix )
+ {
+ this.goalPrefix = goalPrefix;
+ return this;
+ }
+
+ @Nonnull
+ public Builder isolatedRealm( boolean isolatedRealm )
+ {
+ this.isolatedRealm = isolatedRealm;
+ return this;
+ }
+
+ @Nonnull
+ public Builder inheritedByDefault( boolean inheritedByDefault )
+ {
+ this.inheritedByDefault = inheritedByDefault;
+ return this;
+ }
+
+ @Nonnull
+ public Builder requiredJavaVersion( String requiredJavaVersion )
+ {
+ this.requiredJavaVersion = requiredJavaVersion;
+ return this;
+ }
+
+ @Nonnull
+ public Builder requiredMavenVersion( String requiredMavenVersion )
+ {
+ this.requiredMavenVersion = requiredMavenVersion;
+ return this;
+ }
+
+ @Nonnull
+ public Builder mojos( Collection<MojoDescriptor> mojos )
+ {
+ this.mojos = mojos;
+ return this;
+ }
+
+ @Nonnull
+ public Builder dependencies( Collection<Dependency> dependencies2 )
+ {
+ this.dependencies = dependencies2;
+ return this;
+ }
+
+
+ @Nonnull
+ public PluginDescriptor build() throws DuplicateMojoDescriptorException
+ {
+ PluginDescriptor pluginDescriptor = new PluginDescriptor();
+ pluginDescriptor.setName( name );
+ pluginDescriptor.setDescription( description );
+ pluginDescriptor.setGroupId( groupId );
+ pluginDescriptor.setArtifactId( artifactId );
+ pluginDescriptor.setVersion( version );
+ pluginDescriptor.setGoalPrefix( goalPrefix );
+ pluginDescriptor.setIsolatedRealm( isolatedRealm );
+ pluginDescriptor.setInheritedByDefault( inheritedByDefault );
+ pluginDescriptor.setRequiredJavaVersion( requiredJavaVersion );
+ pluginDescriptor.setRequiredMavenVersion( requiredMavenVersion );
+ pluginDescriptor.setMojos( mojos );
+ pluginDescriptor.setDependencies2( dependencies );
+ return pluginDescriptor;
+ }
+ }
}
diff --git a/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptorBuilder.java b/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptorBuilder.java
index 98021fa0c..a960ab192 100644
--- a/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptorBuilder.java
+++ b/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptorBuilder.java
@@ -21,21 +21,16 @@ package org.apache.maven.plugin.descriptor;
import java.io.IOException;
import java.io.Reader;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-
-import org.apache.maven.internal.xml.XmlPlexusConfiguration;
-import org.apache.maven.internal.xml.Xpp3DomBuilder;
-import org.codehaus.plexus.component.repository.ComponentDependency;
-import org.codehaus.plexus.component.repository.ComponentRequirement;
-import org.codehaus.plexus.configuration.PlexusConfiguration;
+
+import org.apache.maven.plugin.descriptor.io.xpp3.PluginDescriptorXpp3Reader;
import org.codehaus.plexus.configuration.PlexusConfigurationException;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
/**
+ * @deprecated Use {@link PluginDescriptorXpp3Reader} instead.
* @author Jason van Zyl
*/
+@Deprecated
public class PluginDescriptorBuilder
{
public PluginDescriptor build( Reader reader )
@@ -47,140 +42,17 @@ public class PluginDescriptorBuilder
public PluginDescriptor build( Reader reader, String source )
throws PlexusConfigurationException
{
- return build( source, buildConfiguration( reader ) );
- }
-
- private PluginDescriptor build( String source, PlexusConfiguration c )
- throws PlexusConfigurationException
- {
- PluginDescriptor pluginDescriptor = new PluginDescriptor();
-
- pluginDescriptor.setSource( source );
- pluginDescriptor.setGroupId( extractGroupId( c ) );
- pluginDescriptor.setArtifactId( extractArtifactId( c ) );
- pluginDescriptor.setVersion( extractVersion( c ) );
- pluginDescriptor.setGoalPrefix( extractGoalPrefix( c ) );
-
- pluginDescriptor.setName( extractName( c ) );
- pluginDescriptor.setDescription( extractDescription( c ) );
-
- pluginDescriptor.setIsolatedRealm( extractIsolatedRealm( c ) );
- pluginDescriptor.setInheritedByDefault( extractInheritedByDefault( c ) );
- pluginDescriptor.setRequiredJavaVersion( extractRequiredJavaVersion( c ).orElse( null ) );
- pluginDescriptor.setRequiredMavenVersion( extractRequiredMavenVersion( c ).orElse( null ) );
-
- pluginDescriptor.addMojos( extractMojos( c, pluginDescriptor ) );
-
- pluginDescriptor.setDependencies( extractComponentDependencies( c ) );
-
- return pluginDescriptor;
- }
-
- private String extractGroupId( PlexusConfiguration c )
- {
- return c.getChild( "groupId" ).getValue();
- }
-
- private String extractArtifactId( PlexusConfiguration c )
- {
- return c.getChild( "artifactId" ).getValue();
- }
-
- private String extractVersion( PlexusConfiguration c )
- {
- return c.getChild( "version" ).getValue();
- }
-
- private String extractGoalPrefix( PlexusConfiguration c )
- {
- return c.getChild( "goalPrefix" ).getValue();
- }
-
- private String extractName( PlexusConfiguration c )
- {
- return c.getChild( "name" ).getValue();
- }
-
- private String extractDescription( PlexusConfiguration c )
- {
- return c.getChild( "description" ).getValue();
- }
-
- private List<MojoDescriptor> extractMojos( PlexusConfiguration c, PluginDescriptor pluginDescriptor )
- throws PlexusConfigurationException
- {
- List<MojoDescriptor> mojos = new ArrayList<>();
-
- PlexusConfiguration[] mojoConfigurations = c.getChild( "mojos" ).getChildren( "mojo" );
-
- for ( PlexusConfiguration component : mojoConfigurations )
- {
- mojos.add( buildComponentDescriptor( component, pluginDescriptor ) );
-
- }
- return mojos;
- }
-
- private boolean extractInheritedByDefault( PlexusConfiguration c )
- {
- String inheritedByDefault = c.getChild( "inheritedByDefault" ).getValue();
-
- if ( inheritedByDefault != null )
- {
- return Boolean.parseBoolean( inheritedByDefault );
- }
- return false;
- }
-
- private boolean extractIsolatedRealm( PlexusConfiguration c )
- {
- String isolatedRealm = c.getChild( "isolatedRealm" ).getValue();
-
- if ( isolatedRealm != null )
+ try
{
- return Boolean.parseBoolean( isolatedRealm );
+ return new PluginDescriptorXpp3Reader().read( reader, false );
}
- return false;
- }
-
- private Optional<String> extractRequiredJavaVersion( PlexusConfiguration c )
- {
- return Optional.ofNullable( c.getChild( "requiredJavaVersion" ) ).map( PlexusConfiguration::getValue );
- }
-
- private Optional<String> extractRequiredMavenVersion( PlexusConfiguration c )
- {
- return Optional.ofNullable( c.getChild( "requiredMavenVersion" ) ).map( PlexusConfiguration::getValue );
- }
-
- private List<ComponentDependency> extractComponentDependencies( PlexusConfiguration c )
- {
-
- PlexusConfiguration[] dependencyConfigurations = c.getChild( "dependencies" ).getChildren( "dependency" );
-
- List<ComponentDependency> dependencies = new ArrayList<>();
-
- for ( PlexusConfiguration d : dependencyConfigurations )
+ catch ( IOException | XmlPullParserException e )
{
- dependencies.add( extractComponentDependency( d ) );
+ throw new PlexusConfigurationException( "Error reading plugin descriptor", e );
}
- return dependencies;
- }
-
- private ComponentDependency extractComponentDependency( PlexusConfiguration d )
- {
- ComponentDependency cd = new ComponentDependency();
-
- cd.setArtifactId( extractArtifactId( d ) );
-
- cd.setGroupId( extractGroupId( d ) );
-
- cd.setType( d.getChild( "type" ).getValue() );
-
- cd.setVersion( extractVersion( d ) );
- return cd;
}
+/*
@SuppressWarnings( "checkstyle:methodlength" )
public MojoDescriptor buildComponentDescriptor( PlexusConfiguration c, PluginDescriptor pluginDescriptor )
throws PlexusConfigurationException
@@ -427,5 +299,5 @@ public class PluginDescriptorBuilder
{
throw new PlexusConfigurationException( e.getMessage(), e );
}
- }
+ }*/
}
diff --git a/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/Requirement.java b/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/Requirement.java
deleted file mode 100644
index 1526b039e..000000000
--- a/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/Requirement.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.apache.maven.plugin.descriptor;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/**
- * Describes a component requirement.
- *
- * @author <a href="mailto:brett@apache.org">Brett Porter</a>
- */
-public class Requirement
- implements Cloneable
-{
- private final String role;
-
- private final String roleHint;
-
- public Requirement( String role )
- {
- this.role = role;
- this.roleHint = null;
- }
-
- public Requirement( String role, String roleHint )
- {
- this.role = role;
- this.roleHint = roleHint;
- }
-
- public String getRole()
- {
- return role;
- }
-
- public String getRoleHint()
- {
- return roleHint;
- }
-
- /**
- * Creates a shallow copy of this requirement.
- */
- @Override
- public Requirement clone()
- {
- try
- {
- return (Requirement) super.clone();
- }
- catch ( CloneNotSupportedException e )
- {
- throw new UnsupportedOperationException( e );
- }
- }
-
-}
diff --git a/maven-plugin-api/src/main/mdo/plugin.mdo b/maven-plugin-api/src/main/mdo/plugin.mdo
index ddb2fd62a..971d433c0 100644
--- a/maven-plugin-api/src/main/mdo/plugin.mdo
+++ b/maven-plugin-api/src/main/mdo/plugin.mdo
@@ -34,7 +34,7 @@ under the License.
<defaults>
<default>
<key>package</key>
- <value>plugin descriptor XML documentation (no java generation)</value><!-- intentionally non-buildable value -->
+ <value>org.apache.maven.plugin.descriptor</value><!-- intentionally non-buildable value -->
</default>
</defaults>
<classes>
@@ -240,7 +240,7 @@ under the License.
</field>
<field>
<name>requiresReports</name>
- <version>1.0.0</version><!-- no longer part of 1.1.0 -->
+ <version>1.0.0+</version><!-- no longer part of 1.1.0 -->
<type>boolean</type>
<description>Flags this Mojo to require running inside of a reports context. Unsupported since Maven 3.0.</description>
<defaultValue>false</defaultValue>
@@ -370,7 +370,7 @@ under the License.
<class xdoc.anchorName="parameter">
<name>Parameter</name>
<version>1.0.0+</version>
- <description>A phase mapping definition.</description>
+ <description>A parameter definition.</description>
<!-- see o.a.m.plugin.descriptor.Parameter -->
<fields>
<field>
@@ -455,6 +455,37 @@ under the License.
]]></description>
</field>
</fields>
+ <codeSegments>
+ <codeSegment>
+ <version>1.1.0+</version> <!--previously the model has been handcrafted -->
+ <comment>Add setters/getters for expression and default value coming from the mojo's configuration</comment>
+ <code><![CDATA[
+ /* getters exposing information originally comfing from the mojo's configuration */
+ private String expression;
+ private String defaultValue;
+
+ public String getExpression()
+ {
+ return expression;
+ }
+
+ public void setExpression( String expression )
+ {
+ this.expression = expression;
+ }
+
+ public void setDefaultValue( String defaultValue )
+ {
+ this.defaultValue = defaultValue;
+ }
+
+ public String getDefaultValue()
+ {
+ return defaultValue;
+ }]]>
+ </code>
+ </codeSegment>
+ </codeSegments>
</class>
<class>
@@ -512,6 +543,26 @@ under the License.
<description>The field name which has this requirement.</description>
</field>
</fields>
+ <codeSegments>
+ <codeSegment>
+ <version>1.1.0+</version> <!--previously the model has been handcrafted -->
+ <comment>Conversion to Plexus Component Requirement</comment>
+ <code><![CDATA[
+ /**
+ * Converts the given requirement to a Plexus Component Requirement
+ */
+ org.codehaus.plexus.component.repository.ComponentRequirement toComponentRequirement()
+ {
+ org.codehaus.plexus.component.repository.ComponentRequirement componentRequirement
+ = new org.codehaus.plexus.component.repository.ComponentRequirement();
+ componentRequirement.setRole( role );
+ componentRequirement.setRoleHint( roleHint );
+ componentRequirement.setFieldName( fieldName );
+ return componentRequirement;
+ }]]>
+ </code>
+ </codeSegment>
+ </codeSegments>
</class>
<class xdoc.anchorName="dependency">
@@ -547,6 +598,27 @@ under the License.
<description>The type of dependency.</description>
</field>
</fields>
+ <codeSegments>
+ <codeSegment>
+ <version>1.1.0+</version> <!--previously the model has been handcrafted -->
+ <comment>Conversion to Plexus Component Dependency</comment>
+ <code><![CDATA[
+ /**
+ * Converts the given dependency to a Plexus Component Dependency
+ */
+ org.codehaus.plexus.component.repository.ComponentDependency toComponentDependency()
+ {
+ org.codehaus.plexus.component.repository.ComponentDependency componentDependency
+ = new org.codehaus.plexus.component.repository.ComponentDependency();
+ componentDependency.setGroupId( groupId );
+ componentDependency.setArtifactId( artifactId );
+ componentDependency.setVersion( version );
+ componentDependency.setType( type );
+ return componentDependency;
+ }]]>
+ </code>
+ </codeSegment>
+ </codeSegments>
</class>
</classes>
</model>
diff --git a/maven-plugin-api/src/test/java/org/apache/maven/plugin/descriptor/MojoDescriptorTest.java b/maven-plugin-api/src/test/java/org/apache/maven/plugin/descriptor/MojoDescriptorTest.java
index 0aec7d372..4f2c94550 100644
--- a/maven-plugin-api/src/test/java/org/apache/maven/plugin/descriptor/MojoDescriptorTest.java
+++ b/maven-plugin-api/src/test/java/org/apache/maven/plugin/descriptor/MojoDescriptorTest.java
@@ -32,18 +32,14 @@ public class MojoDescriptorTest
public void getParameterMap() throws DuplicateParameterException
{
MojoDescriptor mojoDescriptor = new MojoDescriptor();
- Parameter param1 = new Parameter();
- param1.setName( "param1" );
- param1.setDefaultValue( "value1" );
+ Parameter param1 = Parameter.newBuilder().name( "param1" ).build();
mojoDescriptor.addParameter( param1 );
assertEquals( 1, mojoDescriptor.getParameters().size() );
assertEquals( mojoDescriptor.getParameters().size(), mojoDescriptor.getParameterMap().size() );
- Parameter param2 = new Parameter();
- param2.setName( "param2" );
- param2.setDefaultValue( "value2" );
+ Parameter param2 = Parameter.newBuilder().name( "param2" ).build();
mojoDescriptor.addParameter( param2 );
assertEquals( 2, mojoDescriptor.getParameters().size() );
diff --git a/maven-plugin-api/src/test/java/org/apache/maven/plugin/descriptor/PluginDescriptorBuilderTest.java b/maven-plugin-api/src/test/java/org/apache/maven/plugin/descriptor/PluginDescriptorBuilderTest.java
index 88d249069..17fe8b67d 100644
--- a/maven-plugin-api/src/test/java/org/apache/maven/plugin/descriptor/PluginDescriptorBuilderTest.java
+++ b/maven-plugin-api/src/test/java/org/apache/maven/plugin/descriptor/PluginDescriptorBuilderTest.java
@@ -131,7 +131,7 @@ public class PluginDescriptorBuilderTest
md = pd.getMojos().get( 1 );
assertEquals( "war", md.getGoal() );
- assertNull( md.getDependencyResolutionRequired() );
+ assertEquals( "runtime", md.getDependencyResolutionRequired() ); // default
assertNull( md.getDependencyCollectionRequired() );
assertTrue( md.isThreadSafe() );
}
diff --git a/maven-plugin-api/src/test/java/org/apache/maven/plugin/descriptor/PluginDescriptorBuilderTest.java b/maven-plugin-api/src/test/java/org/apache/maven/plugin/descriptor/PluginDescriptorXpp3ReaderTest.java
similarity index 90%
copy from maven-plugin-api/src/test/java/org/apache/maven/plugin/descriptor/PluginDescriptorBuilderTest.java
copy to maven-plugin-api/src/test/java/org/apache/maven/plugin/descriptor/PluginDescriptorXpp3ReaderTest.java
index 88d249069..3e6bfc463 100644
--- a/maven-plugin-api/src/test/java/org/apache/maven/plugin/descriptor/PluginDescriptorBuilderTest.java
+++ b/maven-plugin-api/src/test/java/org/apache/maven/plugin/descriptor/PluginDescriptorXpp3ReaderTest.java
@@ -20,13 +20,14 @@ package org.apache.maven.plugin.descriptor;
*/
import java.io.IOException;
-import java.io.Reader;
+import java.io.InputStream;
+import java.util.Objects;
import org.codehaus.plexus.component.repository.ComponentDependency;
import org.codehaus.plexus.component.repository.ComponentRequirement;
import org.codehaus.plexus.configuration.PlexusConfiguration;
import org.codehaus.plexus.configuration.PlexusConfigurationException;
-import org.codehaus.plexus.util.ReaderFactory;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -40,15 +41,16 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
*
* @author Benjamin Bentmann
*/
-public class PluginDescriptorBuilderTest
+public class PluginDescriptorXpp3ReaderTest
{
private PluginDescriptor build( String resource )
- throws IOException, PlexusConfigurationException
+ throws IOException, PlexusConfigurationException, XmlPullParserException
{
- Reader reader = ReaderFactory.newXmlReader( getClass().getResourceAsStream( resource ) );
-
- return new PluginDescriptorBuilder().build( reader );
+ try (InputStream input = Objects.requireNonNull( getClass().getResourceAsStream( resource ) ) )
+ {
+ return new org.apache.maven.plugin.descriptor.io.xpp3.PluginDescriptorXpp3Reader().read( input );
+ }
}
@Test
@@ -131,7 +133,7 @@ public class PluginDescriptorBuilderTest
md = pd.getMojos().get( 1 );
assertEquals( "war", md.getGoal() );
- assertNull( md.getDependencyResolutionRequired() );
+ assertEquals( "runtime", md.getDependencyResolutionRequired() ); // default
assertNull( md.getDependencyCollectionRequired() );
assertTrue( md.isThreadSafe() );
}