We have a lifecycle mapping for the packaging of *jar* below. You see that for this packaging we have a *default* lifecycle and a list of phases where each phase is a comma separated list of goals to run and they are in the form groupId:artifactId:version.

<configuration>
  <lifecycles>
    <lifecycle>
      <id>default</id>
      <phases>
        <process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources>
        <compile>org.apache.maven.plugins:maven-compiler-plugin:compile</compile>
        <process-test-resources>org.apache.maven.plugins:maven-resources-plugin:testResources</process-test-resources>
        <test-compile>org.apache.maven.plugins:maven-compiler-plugin:testCompile</test-compile>
        <test>org.apache.maven.plugins:maven-surefire-plugin:test</test>
        <package>org.apache.maven.plugins:maven-jar-plugin:jar</package>
        <install>org.apache.maven.plugins:maven-install-plugin:install</install>
        <deploy>org.apache.maven.plugins:maven-deploy-plugin:deploy</deploy>
      </phases>
    </lifecycle>
  </lifecycles>
</configuration>

We need to turn this list of phases into a set of plugin objects that have an XML representation like the following:

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <executions>
      <execution>
        <goals>
          <goal>process</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
  .
  .
  .
</plugins>

We need this form so that the model builder can make the first pass at merging. Full merging cannot be done because we don't know what the version of the plugin is yet that the user has requested. For plugins in the default lifecycle they are typically defined in the plugin management section of the parent POM. When the merging is complete we are going to have something that looks like the following:

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>1.0</version</version>
    <executions>
      <execution>
        <goals>
          <goal>process</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
  .
  .
  .
</plugins>

Once we have the version of the plugins the appropriate call to the plugin manager can be made to get the MojoDescriptor for the goal that needs to be run. In the MojoDescriptor we are interested in the <configuration/> element and <parameters/> element. From these elements we need to make a component configuration for the MojoExecution. The actual DOM like structure we create is of type PlexusConfiguration and is the type we use with the ComponentConfigurator to initialize fields in a Plexus component. Typically this is done within Plexus with the configuration supplied with component configuration, but in Maven we take configuration values from the POM. So we have to use the ComponentConfigurator outside of Plexus in order to configure the Maven Mojo which is just a Plexus component. We can use the information from the MojoDescriptor along with the merged configuration information that is now present in the POM to create the complete PlexusConfiguration used to populate values in the Maven Mojo.

foreach configuration element:
 - if read only and being set squawk

 - find the parameter
 - get value from expression or default
 - if required and null squawk

      <configuration>
        <attached implementation="boolean" default-value="true"/>
        <localRepository implementation="org.apache.maven.artifact.repository.ArtifactRepository">${localRepository}</localRepository>
        <resources implementation="java.util.List">${project.resources}</resources>
        <repositories implementation="java.util.List">${project.repositories}</repositories>
        <remoteArtifactRepositories implementation="java.util.List">${project.remoteArtifactRepositories}</remoteArtifactRepositories>
        <appendedResourcesDirectory implementation="java.io.File">${basedir}/src/main/appended-resources</appendedResourcesDirectory>
        <excludeScope implementation="java.lang.String" default-value="">${excludeScope}</excludeScope>
        <includeScope implementation="java.lang.String" default-value="runtime">${includeScope}</includeScope>
        <excludeGroupIds implementation="java.lang.String" default-value="">${excludeGroupIds}</excludeGroupIds>
        <skip implementation="boolean" default-value="false">${remoteresources.skip}</skip>
        <outputDirectory implementation="java.io.File">${project.build.directory}/maven-shared-archive-resources</outputDirectory>
        <excludeArtifactIds implementation="java.lang.String" default-value="">${excludeArtifactIds}</excludeArtifactIds>
        <excludeTransitive implementation="boolean" default-value="false">${excludeTransitive}</excludeTransitive>
        <includeGroupIds implementation="java.lang.String" default-value="">${includeGroupIds}</includeGroupIds>
        <mavenSession implementation="org.apache.maven.execution.MavenSession">${session}</mavenSession>
        <project implementation="org.apache.maven.project.MavenProject">${project}</project>
        <includeArtifactIds implementation="java.lang.String" default-value="">${includeArtifactIds}</includeArtifactIds>
      </configuration>

      <parameters>
        <parameter>
          <name>appendedResourcesDirectory</name>
          <type>java.io.File</type>
          <required>false</required>
          <editable>true</editable>
        </parameter>
        <parameter>
          <name>attached</name>
          <type>boolean</type>
          <required>false</required>
          <editable>true</editable>
        </parameter>
        <parameter>
          <name>excludeArtifactIds</name>
          <type>java.lang.String</type>
          <required>false</required>
          <editable>true</editable>
        </parameter>
        <parameter>
          <name>excludeGroupIds</name>
          <type>java.lang.String</type>
          <required>false</required>
          <editable>true</editable>
        </parameter>
        <parameter>
          <name>excludeScope</name>
          <type>java.lang.String</type>
          <required>false</required>
          <editable>true</editable>
        </parameter>
        <parameter>
          <name>excludeTransitive</name>
          <type>boolean</type>
          <required>false</required>
          <editable>true</editable>
        </parameter>
        <parameter>
          <name>includeArtifactIds</name>
          <type>java.lang.String</type>
          <required>false</required>
          <editable>true</editable>
        </parameter>
        <parameter>
          <name>includeGroupIds</name>
          <type>java.lang.String</type>
          <required>false</required>
          <editable>true</editable>
        </parameter>
        <parameter>
          <name>includeScope</name>
          <type>java.lang.String</type>
          <required>false</required>
          <editable>true</editable>
        </parameter>
        <parameter>
          <name>localRepository</name>
          <type>org.apache.maven.artifact.repository.ArtifactRepository</type>
          <required>true</required>
          <editable>false</editable>
        </parameter>
        <parameter>
          <name>mavenSession</name>
          <type>org.apache.maven.execution.MavenSession</type>
          <required>true</required>
          <editable>false</editable>
          <description>The Maven session.</description>
        </parameter>
        <parameter>
          <name>outputDirectory</name>
          <type>java.io.File</type>
          <required>false</required>
          <editable>true</editable>
        </parameter>
        <parameter>
          <name>project</name>
          <type>org.apache.maven.project.MavenProject</type>
          <required>true</required>
          <editable>false</editable>
        </parameter>
        <parameter>
          <name>properties</name>
          <type>java.util.Map</type>
          <required>false</required>
          <editable>true</editable>
        </parameter>
        <parameter>
          <name>remoteArtifactRepositories</name>
          <type>java.util.List</type>
          <required>true</required>
          <editable>false</editable>
        </parameter>
        <parameter>
          <name>repositories</name>
          <type>java.util.List</type>
          <required>true</required>
          <editable>false</editable>
        </parameter>
        <parameter>
          <name>resourceBundles</name>
          <type>java.util.List</type>
          <required>true</required>
          <editable>true</editable>
        </parameter>
        <parameter>
          <name>resources</name>
          <type>java.util.List</type>
          <required>true</required>
          <editable>false</editable>
        </parameter>
        <parameter>
          <name>skip</name>
          <type>boolean</type>
          <required>false</required>
          <editable>true</editable>
        </parameter>
        <parameter>
          <name>supplementalModels</name>
          <type>java.lang.String[]</type>
          <required>false</required>
          <editable>true</editable>
        </parameter>
      </parameters>

- we need to know what came from the POM, and validate those
- plugin in any default values
- check to see if anything is missing

In the case of something like Modello where it is common to specify the configuration for all the goals outside the execution block we need to account for creating the right configuration element which includes only those configuration elements for a particular goal that that particular goal understands. We need to walk through the parameters of the Mojo in question and only take the configuration options that apply.
