You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by hb...@apache.org on 2018/03/11 08:16:26 UTC

[maven-studies] 01/01: initial consumer POM model cleanup from build model

This is an automated email from the ASF dual-hosted git repository.

hboutemy pushed a commit to branch consumer-pom
in repository https://gitbox.apache.org/repos/asf/maven-studies.git

commit f0d594a02db3d10feaa1f871dd99d1a58fb3067f
Author: Hervé Boutemy <hb...@apache.org>
AuthorDate: Sun Mar 11 09:04:15 2018 +0100

    initial consumer POM model cleanup from build model
---
 .gitignore                      |   15 +
 pom.xml                         |  119 ++
 src/main/mdo/maven-consumer.mdo | 1366 ++++++++++++++++++
 src/main/mdo/maven.mdo          | 3010 +++++++++++++++++++++++++++++++++++++++
 src/site/apt/index.apt          |   38 +
 src/site/site.xml               |   60 +
 6 files changed, 4608 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f79c928
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,15 @@
+target/
+.project
+.classpath
+.settings/
+.svn/
+bin/
+# Intellij
+*.ipr
+*.iml
+.idea
+out/
+.DS_Store
+/bootstrap
+/dependencies.xml
+.java-version
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..ff4361a
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+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.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.maven</groupId>
+    <artifactId>maven</artifactId>
+    <version>3.5.3</version>
+  </parent>
+
+  <artifactId>maven-consumer-pom</artifactId>
+
+  <name>Maven Consumer POM Model study</name>
+  <description>Consumer POM  Model study: see https://cwiki.apache.org/confluence/display/MAVEN/Build+vs+Consumer+POM</description>
+  <url>https://maven.apache.org/studies/consumer-pom/</url>
+
+  <scm>
+    <connection>scm:git:https://git-wip-us.apache.org/repos/asf/maven-studies.git</connection>
+    <developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/maven-studies.git</developerConnection>
+    <url>https://github.com/apache/maven-studies/tree/${project.scm.tag}</url>
+    <tag>consumer-pom</tag>
+  </scm>
+  <distributionManagement>
+    <site>
+      <id>apache.website</id>
+      <url>scm:svn:https://svn.apache.org/repos/infra/websites/production/maven/components/${maven.site.path}</url>
+    </site>
+  </distributionManagement>
+
+  <properties>
+    <checkstyle.violation.ignore>FileLength</checkstyle.violation.ignore>
+    <maven.site.path>studies/consumer-pom</maven.site.path>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-utils</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.modello</groupId>
+        <artifactId>modello-maven-plugin</artifactId>
+        <configuration>
+          <version>4.0.0</version>
+          <models>
+            <model>src/main/mdo/maven.mdo</model>
+            <model>src/main/mdo/maven-consumer.mdo</model>
+          </models>
+        </configuration>
+      </plugin>
+      <!-- don't install or deploy artifact: this study is not intended for that currently -->
+      <plugin>
+        <artifactId>maven-install-plugin</artifactId>
+        <configuration>
+          <skip>true</skip>
+        </configuration>
+      </plugin>
+      <plugin>
+        <artifactId>maven-deploy-plugin</artifactId>
+        <configuration>
+          <skip>true</skip>
+        </configuration>
+      </plugin>
+      <!-- site mono-module svnpubsub deployment optimization -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-site-plugin</artifactId>
+        <configuration>
+          <skipDeploy>true</skipDeploy><!-- don't deploy site with maven-site-plugin -->
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-scm-publish-plugin</artifactId>
+        <version>3.0.0</version>
+        <configuration>
+          <content>${project.reporting.outputDirectory}</content><!-- mono-module doesn't require site:stage -->
+        </configuration>
+        <executions>
+          <execution>
+            <id>scm-publish</id>
+            <phase>site-deploy</phase><!-- deploy site with maven-scm-publish-plugin -->
+            <goals>
+              <goal>publish-scm</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/src/main/mdo/maven-consumer.mdo b/src/main/mdo/maven-consumer.mdo
new file mode 100644
index 0000000..1075cd6
--- /dev/null
+++ b/src/main/mdo/maven-consumer.mdo
@@ -0,0 +1,1366 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  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.
+-->
+
+<!--
+  | Improvements:
+  |
+  | o add specification element to a field, this would be more a technical description of
+  |   what is allowed in the field.
+  |
+  | o validators: there could be several levels of validation. Simple type validation could
+  |   be done with a regex, but we need inter-field validation and rules which could be
+  |   dealt with by something like drools.
+  |
+  | o i18n: would be good to be able to have names/descriptions/specifications
+  |   in as many languages as possible. (see MNG-3626)
+  |
+  | o annotation mechanism so that changes to the model can be accurately tracked.
+  |
+  | o need to clean up all the descriptions, matching anything to the current project-descriptor.xml file and
+  |   improving on that
+  |
+  | o use enums where appropriate (eg dependency scope)
+  |
+  | o a number of elements have a groupId/artifactId and sometimes version. It would be good to have them all extend one
+  |   definition of these types
+  |
+-->
+<model xmlns="http://codehaus-plexus.github.io/MODELLO/1.4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://codehaus-plexus.github.io/MODELLO/1.4.0 http://codehaus-plexus.github.io/modello/xsd/modello-1.4.0.xsd"
+  xml.namespace="http://maven.apache.org/POM/${version}"
+  xml.schemaLocation="http://maven.apache.org/xsd/maven-consumer-${version}.xsd">
+  <id>maven-consumer</id>
+  <name>MavenConsumer</name>
+  <description>
+    <![CDATA[
+    <p>This is a reference for the Maven Consumer project descriptor used in Maven.</p>
+    <p>An XSD is available at:</p>
+    <ul>
+      <li><a href="https://maven.apache.org/xsd/maven-4.0.0.xsd">https://maven.apache.org/xsd/maven-4.0.0.xsd</a> for Maven 2.0.</li>
+    </ul>
+    ]]>
+  </description>
+  <defaults>
+    <default>
+      <key>package</key>
+      <value>org.apache.maven.consumer.model</value>
+    </default>
+  </defaults>
+  <classes>
+    <class rootElement="true" xml.tagName="project" java.clone.hook="cloneHook">
+      <name>Model</name>
+      <superClass>ModelBase</superClass>
+      <description>
+        <![CDATA[
+        The <code>&lt;project&gt;</code> element is the root of the descriptor.
+        The following table lists all of the possible child elements.
+        ]]>
+      </description>
+      <version>3.0.0+</version>
+      <fields>
+
+        <!-- ====================================================================== -->
+        <!-- Model Version                                                          -->
+        <!-- ====================================================================== -->
+
+        <field><!-- TBD keep in consumer? -->
+          <name>modelVersion</name>
+          <version>4.0.0+</version>
+          <required>true</required>
+          <description>Declares to which version of project descriptor this POM conforms.</description>
+          <type>String</type>
+        </field>
+
+        <!-- ====================================================================== -->
+        <!-- groupId/artifactId/Version/Packaging                                   -->
+        <!-- ====================================================================== -->
+
+        <field xdoc.separator="blank">
+          <name>groupId</name>
+          <version>3.0.0+</version>
+          <required>true</required>
+          <description>
+            <![CDATA[
+            A universally unique identifier for a project. It is normal to
+            use a fully-qualified package name to distinguish it from other
+            projects with a similar name (eg. <code>org.apache.maven</code>).
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>artifactId</name>
+          <version>3.0.0+</version>
+          <required>true</required>
+          <description>The identifier for this artifact that is unique within the group given by the
+            group ID. An artifact is something that is either produced or used by a project.
+            Examples of artifacts produced by Maven for a project include: JARs, source and binary
+            distributions, and WARs.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>version</name>
+          <version>4.0.0+</version>
+          <required>true</required>
+          <description>The current version of the artifact produced by this project.</description>
+          <type>String</type>
+        </field>
+        <field><!-- TBD keep in consumer? -->
+          <name>packaging</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            The type of artifact this project produces, for example <code>jar</code>
+              <code>war</code>
+              <code>ear</code>
+              <code>pom</code>.
+            Plugins can create their own packaging, and
+            therefore their own packaging types,
+            so this list does not contain all possible types.
+            ]]>
+          </description>
+          <type>String</type>
+          <defaultValue>jar</defaultValue>
+        </field>
+
+        <!-- ====================================================================== -->
+        <!-- Elements which describe a project                                      -->
+        <!-- ====================================================================== -->
+
+        <field xdoc.separator="blank">
+          <name>name</name>
+          <version>3.0.0+</version>
+          <required>true</required>
+          <description>The full name of the project.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>description</name>
+          <version>3.0.0+</version>
+          <description>A detailed description of the project, used by Maven whenever it needs to
+            describe the project, such as on the web site. While this element can be specified as
+            CDATA to enable the use of HTML tags within the description, it is discouraged to allow
+            plain text representation. If you need to modify the index page of the generated web
+            site, you are able to specify your own instead of adjusting this text.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>url</name>
+          <version>3.0.0+</version>
+          <description>
+            <![CDATA[
+            The URL to the project's homepage.
+            <br><b>Default value is</b>: parent value [+ path adjustment] + (artifactId or <code>project.directory</code> property)
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>inceptionYear</name>
+          <version>3.0.0+</version>
+          <required>true</required>
+          <description>The year of the project's inception, specified with 4 digits. This value is
+            used when generating copyright notices as well as being informational.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>organization</name>
+          <version>3.0.0+</version>
+          <description>This element describes various attributes of the organization to which the
+            project belongs. These attributes are utilized when documentation is created (for
+            copyright notices and links).</description>
+          <alias>organisation</alias>
+          <association>
+            <type>Organization</type>
+          </association>
+        </field>
+        <field>
+          <name>licenses</name>
+          <version>3.0.0+</version>
+          <description>
+            <![CDATA[
+            This element describes all of the licenses for this project.
+            Each license is described by a <code>license</code> element, which
+            is then described by additional elements.
+            Projects should only list the license(s) that applies to the project
+            and not the licenses that apply to dependencies.
+            If multiple licenses are listed, it is assumed that the user can select
+            any of them, not that they must accept all.
+            ]]>
+          </description>
+          <association>
+            <type>License</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field xdoc.separator="blank">
+          <name>developers</name>
+          <version>3.0.0+</version>
+          <description>Describes the committers of a project.</description>
+          <association>
+            <type>Developer</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field><!-- TBD keep in consumer? -->
+          <name>contributors</name>
+          <version>3.0.0+</version>
+          <description>Describes the contributors to a project that are not yet committers.</description>
+          <association>
+            <type>Contributor</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+
+        <!-- ====================================================================== -->
+        <!-- Build prerequisites                                                    -->
+        <!-- ====================================================================== -->
+
+        <field xdoc.separator="blank">
+          <name>prerequisites</name>
+          <version>4.0.0+</version>
+          <description>Describes the prerequisites in the build environment for this project.</description>
+          <association>
+            <type>Prerequisites</type>
+          </association>
+        </field>
+
+        <!-- ====================================================================== -->
+        <!-- SCM                                                                    -->
+        <!-- ====================================================================== -->
+
+        <field xdoc.separator="blank">
+          <name>scm</name>
+          <version>4.0.0+</version>
+          <description>Specification for the SCM used by the project, such as CVS, Subversion, etc.</description>
+          <association>
+            <type>Scm</type>
+          </association>
+        </field>
+
+        <!-- ====================================================================== -->
+        <!-- Issue Tracking                                                         -->
+        <!-- ====================================================================== -->
+
+        <field>
+          <name>issueManagement</name>
+          <version>4.0.0+</version>
+          <description>The project's issue management system information.</description>
+          <association>
+            <type>IssueManagement</type>
+          </association>
+        </field>
+
+        <!-- ====================================================================== -->
+        <!-- Profiles                                                               -->
+        <!-- ====================================================================== -->
+
+        <field xdoc.separator="blank" xml.insertParentFieldsUpTo="repositories">
+          <name>profiles</name>
+          <version>4.0.0+</version>
+          <description>A listing of project-local build profiles which will modify the build process
+            when activated.</description>
+          <association>
+            <type>Profile</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+    private void cloneHook( Model copy )
+    {
+        copy.pomFile = pomFile;
+    }
+
+    /**
+     * The POM from which this model originated. This is transient runtime state and therefore not managed by Modello.
+     */
+    private java.io.File pomFile;
+
+    /**
+     * Gets the POM file for the corresponding project (if any).
+     *
+     * @return The POM file from which this model originated or {@code null} if this model does not belong to a local
+     *         project (e.g. describes the metadata of some artifact from the repository).
+     */
+    public java.io.File getPomFile()
+    {
+        return pomFile;
+    }
+
+    public void setPomFile( java.io.File pomFile )
+    {
+        this.pomFile = ( pomFile != null ) ? pomFile.getAbsoluteFile() : null;
+    }
+
+    /**
+     * Gets the base directory for the corresponding project (if any).
+     *
+     * @return The base directory for the corresponding project or {@code null} if this model does not belong to a local
+     *         project (e.g. describes the metadata of some artifact from the repository).
+     */
+    public java.io.File getProjectDirectory()
+    {
+        return ( pomFile != null ) ? pomFile.getParentFile() : null;
+    }
+
+    /**
+     * @return the model id as <code>groupId:artifactId:packaging:version</code>
+     */
+    public String getId()
+    {
+        StringBuilder id = new StringBuilder( 64 );
+
+        id.append( ( getGroupId() == null ) ? "[inherited]" : getGroupId() );
+        id.append( ":" );
+        id.append( getArtifactId() );
+        id.append( ":" );
+        id.append( getPackaging() );
+        id.append( ":" );
+        id.append( ( getVersion() == null ) ? "[inherited]" : getVersion() );
+
+        return id.toString();
+    }
+
+    @Override
+    public String toString()
+    {
+        return getId();
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+    <class java.clone="deep">
+      <name>ModelBase</name>
+      <version>3.0.0+</version>
+      <description>
+        <![CDATA[
+        Base class for the <code>Model</code> and the <code>Profile</code> objects.
+        ]]>
+      </description>
+      <fields>
+        <field xdoc.separator="blank">
+          <name>dependencies</name>
+          <version>3.0.0+</version>
+          <description>
+            <![CDATA[
+            This element describes all of the dependencies associated with a
+            project.
+            These dependencies are used to construct a classpath for your
+            project during the build process. They are automatically downloaded from the
+            repositories defined in this project.
+            See <a href="https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html">the
+            dependency mechanism</a> for more information.
+            ]]>
+          </description>
+          <association>
+            <type>Dependency</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field xdoc.separator="blank"><!-- TBD keep in consumer? -->
+          <name>repositories</name>
+          <version>4.0.0+</version>
+          <description>The lists of the remote repositories for discovering dependencies and
+            extensions.</description>
+          <association>
+            <type>Repository</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>Contributor</name>
+      <description>Description of a person who has contributed to the project, but who does not have
+        commit privileges. Usually, these contributions come in the form of patches submitted.</description>
+      <version>3.0.0+</version>
+      <fields>
+        <field>
+          <name>name</name>
+          <version>3.0.0+</version>
+          <description>The full name of the contributor.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>email</name>
+          <version>3.0.0+</version>
+          <description>The email address of the contributor.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>url</name>
+          <version>3.0.0+</version>
+          <description>The URL for the homepage of the contributor.</description>
+          <type>String</type>
+        </field>
+        <!-- TODO: should this just be a single Organization element -->
+        <field>
+          <name>organization</name>
+          <alias>organisation</alias>
+          <version>3.0.0+</version>
+          <description>The organization to which the contributor belongs.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>organizationUrl</name>
+          <alias>organisationUrl</alias>
+          <version>3.0.0+</version>
+          <description>The URL of the organization.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>roles</name>
+          <version>3.0.0+</version>
+          <description>
+            <![CDATA[
+            The roles the contributor plays in the project. Each role is described by a
+            <code>role</code> element, the body of which is a role name. This can also be used to
+            describe the contribution.
+            ]]>
+          </description>
+          <association>
+            <type>String</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field>
+          <name>timezone</name>
+          <version>3.0.0+</version>
+          <description>
+            <![CDATA[
+              The timezone the contributor is in. Typically, this is a number in the range
+              <a href="http://en.wikipedia.org/wiki/UTC%E2%88%9212:00">-12</a> to <a href="http://en.wikipedia.org/wiki/UTC%2B14:00">+14</a>
+              or a valid time zone id like "America/Montreal" (UTC-05:00) or "Europe/Paris" (UTC+01:00).
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>properties</name>
+          <version>3.0.0+</version>
+          <description>Properties about the contributor, such as an instant messenger handle.</description>
+          <type>Properties</type>
+          <association xml.mapStyle="inline">
+            <type>String</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>Dependency</name>
+      <version>3.0.0+</version>
+      <description>
+        <![CDATA[
+        The <code>&lt;dependency&gt;</code> element contains information about a dependency
+        of the project.
+        ]]>
+      </description>
+      <fields>
+        <field>
+          <name>groupId</name>
+          <version>3.0.0+</version>
+          <required>true</required>
+          <description>
+            <![CDATA[
+            The project group that produced the dependency, e.g.
+            <code>org.apache.maven</code>.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>artifactId</name>
+          <version>3.0.0+</version>
+          <required>true</required>
+          <description>
+            <![CDATA[
+            The unique id for an artifact produced by the project group, e.g.
+            <code>maven-artifact</code>.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>version</name>
+          <version>3.0.0+</version>
+          <description>
+            <![CDATA[
+            The version of the dependency, e.g. <code>3.2.1</code>. In Maven 2, this can also be
+            specified as a range of versions.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>type</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            The type of dependency. While it
+            usually represents the extension on the filename of the dependency,
+            that is not always the case. A type can be mapped to a different
+            extension and a classifier.
+            The type often corresponds to the packaging used, though this is also
+            not always the case.
+            Some examples are <code>jar</code>, <code>war</code>, <code>ejb-client</code>
+            and <code>test-jar</code>: see <a href="../maven-core/artifact-handlers.html">default
+            artifact handlers</a> for a list.
+            New types can be defined by plugins that set
+            <code>extensions</code> to <code>true</code>, so this is not a complete list.
+            ]]>
+          </description>
+          <type>String</type>
+          <defaultValue>jar</defaultValue>
+        </field>
+        <field>
+          <name>classifier</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            The classifier of the dependency. It is appended to
+            the filename after the version. This allows:
+            <ul>
+            <li>referring to attached artifact, for example <code>sources</code> and <code>javadoc</code>:
+            see <a href="../maven-core/artifact-handlers.html">default artifact handlers</a> for a list,</li>
+            <li>distinguishing two artifacts
+            that belong to the same POM but were built differently.
+            For example, <code>jdk14</code> and <code>jdk15</code>.</li>
+            </ul>
+            ]]>
+          </description>
+          <type>String</type>
+          <required>false</required>
+        </field>
+        <field>
+          <name>scope</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            The scope of the dependency - <code>compile</code>, <code>runtime</code>,
+            <code>test</code>, <code>system</code>, and <code>provided</code>. Used to
+            calculate the various classpaths used for compilation, testing, and so on.
+            It also assists in determining which artifacts to include in a distribution of
+            this project. For more information, see
+            <a href="https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html">the
+            dependency mechanism</a>. The default scope is <code>compile</code>.
+            ]]>
+          </description>
+          <type>String</type>
+          <!-- This default has to be enforced at the maven-artifact layer, to allow
+            | injection of defaults from <dependencyManagement/>.
+            | TODO: how can we document it?
+            |-->
+          <!-- defaultValue>compile</defaultValue -->
+        </field>
+        <field>
+          <name>systemPath</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            FOR SYSTEM SCOPE ONLY. Note that use of this property is <b>discouraged</b>
+            and may be replaced in later versions. This specifies the path on the filesystem
+            for this dependency.
+            Requires an absolute path for the value, not relative.
+            Use a property that gives the machine specific absolute path,
+            e.g. <code>${java.home}</code>.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>exclusions</name>
+          <version>4.0.0+</version>
+          <description>Lists a set of artifacts that should be excluded from this dependency's
+            artifact list when it comes to calculating transitive dependencies.</description>
+          <association>
+            <type>Exclusion</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field>
+          <name>optional</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            Indicates the dependency is optional for use of this library. While the
+            version of the dependency will be taken into account for dependency calculation if the
+            library is used elsewhere, it will not be passed on transitively. Note: While the type
+            of this field is <code>String</code> for technical reasons, the semantic type is actually
+            <code>Boolean</code>. Default value is <code>false</code>.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+    public boolean isOptional()
+    {
+        return ( optional != null ) ? Boolean.parseBoolean( optional ) : false;
+    }
+
+    public void setOptional( boolean optional )
+    {
+        this.optional = String.valueOf( optional );
+    }
+
+    /**
+     * @see java.lang.Object#toString()
+     */
+    public String toString()
+    {
+        return "Dependency {groupId=" + groupId + ", artifactId=" + artifactId + ", version=" + version + ", type=" + type + "}";
+    }
+            ]]>
+          </code>
+        </codeSegment>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+    private String managementKey;
+
+    /**
+     * @return the management key as <code>groupId:artifactId:type</code>
+     */
+    public String getManagementKey()
+    {
+        if ( managementKey == null )
+        {
+            managementKey = groupId + ":" + artifactId + ":" + type + ( classifier != null ? ":" + classifier : "" );
+        }
+        return managementKey;
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+    <class>
+      <superClass>Contributor</superClass>
+      <name>Developer</name>
+      <description>Information about one of the committers on this project.</description>
+      <version>3.0.0+</version>
+      <fields>
+        <field>
+          <name>id</name>
+          <version>3.0.0+</version>
+          <description>The unique ID of the developer in the SCM.</description>
+          <type>String</type>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>Exclusion</name>
+      <version>4.0.0+</version>
+      <description>
+        <![CDATA[
+        The <code>&lt;exclusion&gt;</code> element contains informations required to exclude
+        an artifact to the project.
+        ]]>
+      </description>
+      <fields>
+        <field>
+          <name>artifactId</name>
+          <version>4.0.0+</version>
+          <description>The artifact ID of the project to exclude.</description>
+          <type>String</type>
+          <required>true</required>
+        </field>
+        <field>
+          <name>groupId</name>
+          <version>4.0.0+</version>
+          <description>The group ID of the project to exclude.</description>
+          <type>String</type>
+          <required>true</required>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>IssueManagement</name>
+      <description>Information about the issue tracking (or bug tracking) system used to manage this
+        project.</description>
+      <version>4.0.0+</version>
+      <fields>
+        <field>
+          <name>system</name>
+          <version>4.0.0+</version>
+          <description>The name of the issue management system, e.g. Bugzilla</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>url</name>
+          <version>4.0.0+</version>
+          <description>URL for the issue management system used by the project.</description>
+          <type>String</type>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>License</name>
+      <description>Describes the licenses for this project. This is used to generate the license
+        page of the project's web site, as well as being taken into consideration in other reporting
+        and validation. The licenses listed for the project are that of the project itself, and not
+        of dependencies.</description>
+      <version>3.0.0+</version>
+      <fields>
+        <field>
+          <name>name</name>
+          <version>3.0.0+</version>
+          <description>The full legal name of the license.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>url</name>
+          <version>3.0.0+</version>
+          <description>The official url for the license text.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>distribution</name>
+          <version>3.0.0+</version>
+          <description>
+            <![CDATA[
+            The primary method by which this project may be distributed.
+            <dl>
+              <dt>repo</dt>
+              <dd>may be downloaded from the Maven repository</dd>
+              <dt>manual</dt>
+              <dd>user must manually download and install the dependency.</dd>
+            </dl>
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>comments</name>
+          <description>Addendum information pertaining to this license.</description>
+          <version>3.0.0+</version>
+          <type>String</type>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>Organization</name>
+      <description>Specifies the organization that produces this project.</description>
+      <version>3.0.0+</version>
+      <fields>
+        <field>
+          <name>name</name>
+          <version>3.0.0+</version>
+          <description>The full name of the organization.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>url</name>
+          <version>3.0.0+</version>
+          <description>The URL to the organization's home page.</description>
+          <type>String</type>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>Scm</name>
+      <version>4.0.0+</version>
+      <description>
+        <![CDATA[
+        The <code>&lt;scm&gt;</code> element contains informations required to the SCM
+        (Source Control Management) of the project.
+        ]]>
+      </description>
+      <fields>
+        <field>
+          <name>connection</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            The source control management system URL
+            that describes the repository and how to connect to the
+            repository. For more information, see the
+            <a href="https://maven.apache.org/scm/scm-url-format.html">URL format</a>
+            and <a href="https://maven.apache.org/scm/scms-overview.html">list of supported SCMs</a>.
+            This connection is read-only.
+            <br><b>Default value is</b>: parent value [+ path adjustment] + (artifactId or <code>project.directory</code> property) 
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>developerConnection</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            Just like <code>connection</code>, but for developers, i.e. this scm connection
+            will not be read only.
+            <br><b>Default value is</b>: parent value [+ path adjustment] + (artifactId or <code>project.directory</code> property)
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>tag</name>
+          <version>4.0.0+</version>
+          <description>The tag of current code. By default, it's set to HEAD during development.</description>
+          <type>String</type>
+          <defaultValue>HEAD</defaultValue>
+        </field>
+        <field>
+          <name>url</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            The URL to the project's browsable SCM repository, such as ViewVC or Fisheye.
+            <br><b>Default value is</b>: parent value [+ path adjustment] + (artifactId or <code>project.directory</code> property)
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep"><!-- TBD keep in consumer? -->
+      <name>RepositoryBase</name>
+      <version>4.0.0+</version>
+      <description>A repository contains the information needed for establishing connections with
+        remote repository.</description>
+      <fields>
+        <field>
+          <name>id</name>
+          <version>4.0.0+</version>
+          <required>true</required>
+          <identifier>true</identifier>
+          <description>
+            <![CDATA[
+            A unique identifier for a repository. This is used to match the repository
+            to configuration in the <code>settings.xml</code> file, for example. Furthermore, the identifier is
+            used during POM inheritance and profile injection to detect repositories that should be merged.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>name</name>
+          <version>4.0.0+</version>
+          <description>Human readable name of the repository.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>url</name>
+          <version>4.0.0+</version>
+          <required>true</required>
+          <description>
+            <![CDATA[
+            The url of the repository, in the form <code>protocol://hostname/path</code>.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>layout</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            The type of layout this repository uses for locating and storing artifacts -
+            can be <code>legacy</code> or <code>default</code>.
+            ]]>
+          </description>
+          <type>String</type>
+          <defaultValue>default</defaultValue>
+        </field>
+      </fields>
+    </class>
+
+    <class><!-- TBD keep in consumer? -->
+      <name>Repository</name>
+      <superClass>RepositoryBase</superClass>
+      <version>4.0.0+</version>
+      <description>A repository contains the information needed for establishing connections with
+        remote repository.</description>
+      <fields>
+        <field>
+          <name>releases</name>
+          <version>4.0.0+</version>
+          <description>How to handle downloading of releases from this repository.</description>
+          <association>
+            <type>RepositoryPolicy</type>
+          </association>
+        </field>
+        <field>
+          <name>snapshots</name>
+          <version>4.0.0+</version>
+          <description>How to handle downloading of snapshots from this repository.</description>
+          <association>
+            <type>RepositoryPolicy</type>
+          </association>
+        </field>
+      </fields>
+    </class>
+
+    <class java.clone="deep"><!-- TBD keep in consumer? -->
+      <name>RepositoryPolicy</name>
+      <version>4.0.0+</version>
+      <description>Download policy.</description>
+      <fields>
+        <field>
+          <name>enabled</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            Whether to use this repository for downloading this type of artifact. Note: While the type
+            of this field is <code>String</code> for technical reasons, the semantic type is actually
+            <code>Boolean</code>. Default value is <code>true</code>.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>updatePolicy</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            The frequency for downloading updates - can be
+            <code>always,</code>
+            <code>daily</code>
+            (default),
+            <code>interval:XXX</code>
+            (in minutes) or
+            <code>never</code>
+            (only if it doesn't exist locally).
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>checksumPolicy</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            What to do when verification of an artifact checksum fails. Valid values are
+            <code>ignore</code>
+            ,
+            <code>fail</code>
+            or
+            <code>warn</code>
+            (the default).
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+
+    public boolean isEnabled()
+    {
+        return ( enabled != null ) ? Boolean.parseBoolean( enabled ) : true;
+    }
+
+    public void setEnabled( boolean enabled )
+    {
+        this.enabled = String.valueOf( enabled );
+    }
+
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+
+    <!-- Profile support -->
+    <class>
+      <name>Profile</name>
+      <superClass>ModelBase</superClass>
+      <version>4.0.0+</version>
+      <description>Modifications to the build process which is activated based on environmental
+        parameters or command line arguments.</description>
+      <fields>
+        <field>
+          <name>id</name>
+          <required>true</required>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <defaultValue>default</defaultValue>
+          <description>The identifier of this build profile. This is used for command line
+            activation, and identifies profiles to be merged.
+          </description>
+        </field>
+        <field><!-- TBD keep in consumer? -->
+          <name>activation</name>
+          <version>4.0.0+</version>
+          <description>The conditional logic which will automatically trigger the inclusion of this
+            profile.</description>
+          <association>
+            <type>Activation</type>
+          </association>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+    public static final String SOURCE_POM = "pom";
+
+    public static final String SOURCE_SETTINGS = "settings.xml";
+
+    // We don't want this to be parseable...it's sort of 'hidden'
+    // default source for this profile is in the pom itself.
+    private String source = SOURCE_POM;
+
+    public void setSource( String source )
+    {
+        this.source = source;
+    }
+
+    public String getSource()
+    {
+        return source;
+    }
+
+    /**
+     * @see java.lang.Object#toString()
+     */
+    public String toString()
+    {
+        return "Profile {id: " + getId() + ", source: " + getSource() + "}";
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+    <class java.clone="deep"><!-- TBD keep in consumer? -->
+      <name>Activation</name>
+      <version>4.0.0+</version>
+      <description>The conditions within the build runtime environment which will trigger the
+        automatic inclusion of the build profile. Multiple conditions can be defined, which must
+        be all satisfied to activate the profile.
+      </description>
+      <fields>
+        <field>
+          <name>activeByDefault</name>
+          <version>4.0.0+</version>
+          <type>boolean</type>
+          <description>If set to true, this profile will be active unless another profile in this
+            pom is activated using the command line -P option or by one of that profile's
+            activators.</description>
+        </field>
+        <field>
+          <name>jdk</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>
+            <![CDATA[
+            Specifies that this profile will be activated when a matching JDK is detected.
+            For example, <code>1.4</code> only activates on JDKs versioned 1.4,
+            while <code>!1.4</code> matches any JDK that is not version 1.4. Ranges are supported too:
+            <code>[1.5,)</code> activates when the JDK is 1.5 minimum.
+            ]]>
+          </description>
+        </field>
+        <field>
+          <name>os</name>
+          <version>4.0.0+</version>
+          <description>Specifies that this profile will be activated when matching operating system
+            attributes are detected.</description>
+          <association>
+            <type>ActivationOS</type>
+          </association>
+        </field>
+        <field>
+          <name>property</name>
+          <version>4.0.0+</version>
+          <description>Specifies that this profile will be activated when this system property is
+            specified.</description>
+          <association>
+            <type>ActivationProperty</type>
+          </association>
+        </field>
+        <field>
+          <name>file</name>
+          <version>4.0.0+</version>
+          <description>Specifies that this profile will be activated based on existence of a file.</description>
+          <association>
+            <type>ActivationFile</type>
+          </association>
+        </field>
+        <!--
+        This could be included once we teach Maven to deal with multiple versions of the model
+        <field>
+          <name>custom</name>
+          <version>4.0.0+</version>
+          <description>Describes a custom profile activation trigger, brought in via build
+            extension.</description>
+          <association>
+            <type>ActivationCustom</type>
+          </association>
+        </field>
+        -->
+      </fields>
+    </class>
+    <class java.clone="deep"><!-- TBD keep in consumer? -->
+      <name>ActivationProperty</name>
+      <version>4.0.0+</version>
+      <description>This is the property specification used to activate a profile. If the value field
+        is empty, then the existence of the named property will activate the profile, otherwise it
+        does a case-sensitive match against the property value as well.</description>
+      <fields>
+        <field>
+          <name>name</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <required>true</required>
+          <description>The name of the property to be used to activate a profile.</description>
+        </field>
+        <field>
+          <name>value</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>The value of the property required to activate a profile.</description>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep"><!-- TBD keep in consumer? -->
+      <name>ActivationOS</name>
+      <version>4.0.0+</version>
+      <description>This is an activator which will detect an operating system's attributes in order
+        to activate its profile.</description>
+      <fields>
+        <field>
+          <name>name</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>
+            <![CDATA[
+            The name of the operating system to be used to activate the profile. This must be an exact match
+            of the <code>${os.name}</code> Java property, such as <code>Windows XP</code>.
+            ]]>
+          </description>
+        </field>
+        <field>
+          <name>family</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>
+            <![CDATA[
+            The general family of the OS to be used to activate the profile, such as
+            <code>windows</code> or <code>unix</code>.
+            ]]>
+          </description>
+        </field>
+        <field>
+          <name>arch</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>The architecture of the operating system to be used to activate the
+          profile.</description>
+        </field>
+        <field>
+          <name>version</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>The version of the operating system to be used to activate the
+          profile.</description>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep"><!-- TBD keep in consumer? -->
+      <name>ActivationFile</name>
+      <version>4.0.0+</version>
+      <description><![CDATA[This is the file specification used to activate the profile. The <code>missing</code> value
+        is the location of a file that needs to exist, and if it doesn't, the profile will be
+        activated. On the other hand, <code>exists</code> will test for the existence of the file and if it is
+        there, the profile will be activated.<br>
+        Variable interpolation for these file specifications is limited to <code>${basedir}</code>,
+        System properties and request properties.]]></description>
+      <fields>
+        <field>
+          <name>missing</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>The name of the file that must be missing to activate the
+          profile.</description>
+        </field>
+        <field>
+          <name>exists</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>The name of the file that must exist to activate the profile.</description>
+        </field>
+      </fields>
+    </class>
+    <!--
+    This can be put back in when we figure out how to have multiple model versions
+    <class>
+      <name>ActivationCustom</name>
+      <version>4.0.0+</version>
+      <description>This activation allows users to specify their own custom trigger for a profile.</description>
+      <fields>
+        <field>
+          <name>configuration</name>
+          <version>4.0.0+</version>
+          <type>DOM</type>
+          <description>The specification for triggering the profile according to the rules of the
+            custom activation type.</description>
+        </field>
+        <field>
+          <name>type</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>The type (role-hint) of activation which is to be used to activate the
+            profile.</description>
+        </field>
+      </fields>
+    </class>
+    -->
+    <!-- /BuildProfile support -->
+    <class java.clone="deep">
+      <name>Prerequisites</name>
+      <version>4.0.0+</version>
+      <description>Describes the prerequisites a project can have.</description>
+      <fields>
+        <field>
+          <name>maven</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <defaultValue>2.0</defaultValue>
+          <description><![CDATA[
+            For a plugin project (packaging is <code>maven-plugin</code>), the minimum version of
+            Maven required to use the resulting plugin.<br>
+            In Maven 2, this was also specifying the minimum version of Maven required to build a
+            project, but this usage is <b>deprecated</b> in Maven 3 and not checked any more: use
+            the <a href="https://maven.apache.org/enforcer/enforcer-rules/requireMavenVersion.html">Maven Enforcer Plugin's
+            <code>requireMavenVersion</code> rule</a> instead.
+            ]]>
+          </description>
+          <required>false</required>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep"><!-- TBD keep in consumer? -->
+      <name>Relocation</name>
+      <version>4.0.0+</version>
+      <description>Describes where an artifact has moved to. If any of the values are omitted, it is
+        assumed to be the same as it was before.</description>
+      <fields>
+        <field>
+          <name>groupId</name>
+          <version>4.0.0+</version>
+          <description>The group ID the artifact has moved to.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>artifactId</name>
+          <version>4.0.0+</version>
+          <description>The new artifact ID of the artifact.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>version</name>
+          <version>4.0.0+</version>
+          <description>The new version of the artifact.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>message</name>
+          <version>4.0.0+</version>
+          <description>An additional message to show the user about the move, such as the reason.</description>
+          <type>String</type>
+        </field>
+      </fields>
+    </class>
+    <class locationTracker="locations" java.clone="shallow">
+      <name>InputLocation</name>
+      <version>4.0.0+</version>
+      <fields>
+        <!-- line, column and source fields are auto-generated by Modello -->
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+
+    @Override
+    public String toString()
+    {
+        return getLineNumber() + " : " + getColumnNumber() + ", " + getSource();
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+    <class sourceTracker="source" java.clone="shallow">
+      <name>InputSource</name>
+      <version>4.0.0+</version>
+      <fields>
+        <field>
+          <name>modelId</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>
+            <![CDATA[
+            The identifier of the POM in the format {@code <groupId>:<artifactId>:<version>}.
+            ]]>
+          </description>
+        </field>
+        <field>
+          <name>location</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>
+            <![CDATA[
+            The path/URL of the POM or {@code null} if unknown.
+            ]]>
+          </description>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+    @Override
+    public String toString()
+    {
+        return getModelId() + " " + getLocation();
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+  </classes>
+</model>
diff --git a/src/main/mdo/maven.mdo b/src/main/mdo/maven.mdo
new file mode 100644
index 0000000..7ba6106
--- /dev/null
+++ b/src/main/mdo/maven.mdo
@@ -0,0 +1,3010 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  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.
+-->
+
+<!--
+  | Improvements:
+  |
+  | o add specification element to a field, this would be more a technical description of
+  |   what is allowed in the field.
+  |
+  | o validators: there could be several levels of validation. Simple type validation could
+  |   be done with a regex, but we need inter-field validation and rules which could be
+  |   dealt with by something like drools.
+  |
+  | o i18n: would be good to be able to have names/descriptions/specifications
+  |   in as many languages as possible. (see MNG-3626)
+  |
+  | o annotation mechanism so that changes to the model can be accurately tracked.
+  |
+  | o need to clean up all the descriptions, matching anything to the current project-descriptor.xml file and
+  |   improving on that
+  |
+  | o use enums where appropriate (eg dependency scope)
+  |
+  | o a number of elements have a groupId/artifactId and sometimes version. It would be good to have them all extend one
+  |   definition of these types
+  |
+-->
+<model xmlns="http://codehaus-plexus.github.io/MODELLO/1.4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://codehaus-plexus.github.io/MODELLO/1.4.0 http://codehaus-plexus.github.io/modello/xsd/modello-1.4.0.xsd"
+  xml.namespace="http://maven.apache.org/POM/${version}"
+  xml.schemaLocation="http://maven.apache.org/xsd/maven-${version}.xsd">
+  <id>maven</id>
+  <name>Maven</name>
+  <description>
+    <![CDATA[
+    <p>This is a reference for the Maven project descriptor used in Maven.</p>
+    <p>An XSD is available at:</p>
+    <ul>
+      <li><a href="https://maven.apache.org/xsd/maven-v3_0_0.xsd">https://maven.apache.org/xsd/maven-v3_0_0.xsd</a> for Maven 1.1.</li>
+      <li><a href="https://maven.apache.org/xsd/maven-4.0.0.xsd">https://maven.apache.org/xsd/maven-4.0.0.xsd</a> for Maven 2.0.</li>
+    </ul>
+    ]]>
+  </description>
+  <defaults>
+    <default>
+      <key>package</key>
+      <value>org.apache.maven.model</value>
+    </default>
+  </defaults>
+  <classes>
+    <class rootElement="true" xml.tagName="project" java.clone.hook="cloneHook">
+      <name>Model</name>
+      <superClass>ModelBase</superClass>
+      <description>
+        <![CDATA[
+        The <code>&lt;project&gt;</code> element is the root of the descriptor.
+        The following table lists all of the possible child elements.
+        ]]>
+      </description>
+      <version>3.0.0+</version>
+      <fields>
+
+        <!-- ====================================================================== -->
+        <!-- Model Version                                                          -->
+        <!-- ====================================================================== -->
+
+        <field>
+          <name>modelVersion</name>
+          <version>4.0.0+</version>
+          <required>true</required>
+          <description>Declares to which version of project descriptor this POM conforms.</description>
+          <type>String</type>
+        </field>
+
+        <!-- ====================================================================== -->
+        <!-- Parent Model                                                           -->
+        <!-- ====================================================================== -->
+
+        <field xdoc.separator="blank">
+          <name>parent</name>
+          <version>4.0.0+</version>
+          <description>The location of the parent project, if one exists. Values from the parent
+            project will be the default for this project if they are left unspecified. The location
+            is given as a group ID, artifact ID and version.</description>
+          <association>
+            <type>Parent</type>
+          </association>
+        </field>
+
+        <!-- ====================================================================== -->
+        <!-- groupId/artifactId/Version/Packaging                                   -->
+        <!-- ====================================================================== -->
+
+        <field xdoc.separator="blank">
+          <name>groupId</name>
+          <version>3.0.0+</version>
+          <required>true</required>
+          <description>
+            <![CDATA[
+            A universally unique identifier for a project. It is normal to
+            use a fully-qualified package name to distinguish it from other
+            projects with a similar name (eg. <code>org.apache.maven</code>).
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>artifactId</name>
+          <version>3.0.0+</version>
+          <required>true</required>
+          <description>The identifier for this artifact that is unique within the group given by the
+            group ID. An artifact is something that is either produced or used by a project.
+            Examples of artifacts produced by Maven for a project include: JARs, source and binary
+            distributions, and WARs.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>version</name>
+          <version>4.0.0+</version>
+          <required>true</required>
+          <description>The current version of the artifact produced by this project.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>packaging</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            The type of artifact this project produces, for example <code>jar</code>
+              <code>war</code>
+              <code>ear</code>
+              <code>pom</code>.
+            Plugins can create their own packaging, and
+            therefore their own packaging types,
+            so this list does not contain all possible types.
+            ]]>
+          </description>
+          <type>String</type>
+          <defaultValue>jar</defaultValue>
+        </field>
+
+        <!-- ====================================================================== -->
+        <!-- Elements which describe a project                                      -->
+        <!-- ====================================================================== -->
+
+        <field xdoc.separator="blank">
+          <name>name</name>
+          <version>3.0.0+</version>
+          <required>true</required>
+          <description>The full name of the project.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>description</name>
+          <version>3.0.0+</version>
+          <description>A detailed description of the project, used by Maven whenever it needs to
+            describe the project, such as on the web site. While this element can be specified as
+            CDATA to enable the use of HTML tags within the description, it is discouraged to allow
+            plain text representation. If you need to modify the index page of the generated web
+            site, you are able to specify your own instead of adjusting this text.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>url</name>
+          <version>3.0.0+</version>
+          <description>
+            <![CDATA[
+            The URL to the project's homepage.
+            <br><b>Default value is</b>: parent value [+ path adjustment] + (artifactId or <code>project.directory</code> property)
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>inceptionYear</name>
+          <version>3.0.0+</version>
+          <required>true</required>
+          <description>The year of the project's inception, specified with 4 digits. This value is
+            used when generating copyright notices as well as being informational.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>organization</name>
+          <version>3.0.0+</version>
+          <description>This element describes various attributes of the organization to which the
+            project belongs. These attributes are utilized when documentation is created (for
+            copyright notices and links).</description>
+          <alias>organisation</alias>
+          <association>
+            <type>Organization</type>
+          </association>
+        </field>
+        <field>
+          <name>licenses</name>
+          <version>3.0.0+</version>
+          <description>
+            <![CDATA[
+            This element describes all of the licenses for this project.
+            Each license is described by a <code>license</code> element, which
+            is then described by additional elements.
+            Projects should only list the license(s) that applies to the project
+            and not the licenses that apply to dependencies.
+            If multiple licenses are listed, it is assumed that the user can select
+            any of them, not that they must accept all.
+            ]]>
+          </description>
+          <association>
+            <type>License</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field xdoc.separator="blank">
+          <name>developers</name>
+          <version>3.0.0+</version>
+          <description>Describes the committers of a project.</description>
+          <association>
+            <type>Developer</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field>
+          <name>contributors</name>
+          <version>3.0.0+</version>
+          <description>Describes the contributors to a project that are not yet committers.</description>
+          <association>
+            <type>Contributor</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field xdoc.separator="blank">
+          <name>mailingLists</name>
+          <version>3.0.0+</version>
+          <description>Contains information about a project's mailing lists.</description>
+          <association>
+            <type>MailingList</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+
+        <!-- ====================================================================== -->
+        <!-- Build prerequisites                                                    -->
+        <!-- ====================================================================== -->
+
+        <field xdoc.separator="blank">
+          <name>prerequisites</name>
+          <version>4.0.0+</version>
+          <description>Describes the prerequisites in the build environment for this project.</description>
+          <association>
+            <type>Prerequisites</type>
+          </association>
+        </field>
+
+        <!-- ====================================================================== -->
+        <!-- SCM                                                                    -->
+        <!-- ====================================================================== -->
+
+        <field xdoc.separator="blank" xml.insertParentFieldsUpTo="modules">
+          <name>scm</name>
+          <version>4.0.0+</version>
+          <description>Specification for the SCM used by the project, such as CVS, Subversion, etc.</description>
+          <association>
+            <type>Scm</type>
+          </association>
+        </field>
+
+        <!-- ====================================================================== -->
+        <!-- Issue Tracking                                                         -->
+        <!-- ====================================================================== -->
+
+        <field>
+          <name>issueManagement</name>
+          <version>4.0.0+</version>
+          <description>The project's issue management system information.</description>
+          <association>
+            <type>IssueManagement</type>
+          </association>
+        </field>
+
+        <!-- ====================================================================== -->
+        <!-- CI Management                                                          -->
+        <!-- ====================================================================== -->
+
+        <field>
+          <name>ciManagement</name>
+          <version>4.0.0+</version>
+          <description>The project's continuous integration information.</description>
+          <association>
+            <type>CiManagement</type>
+          </association>
+        </field>
+
+        <!-- ====================================================================== -->
+        <!-- Build                                                                  -->
+        <!-- ====================================================================== -->
+
+        <field xdoc.separator="blank" xml.insertParentFieldsUpTo="pluginRepositories">
+          <name>build</name>
+          <version>3.0.0+</version>
+          <required>true</required>
+          <description>Information required to build the project.</description>
+          <association>
+            <type>Build</type>
+          </association>
+        </field>
+
+        <!-- ====================================================================== -->
+        <!-- Profiles                                                               -->
+        <!-- ====================================================================== -->
+
+        <field xdoc.separator="blank" xml.insertParentFieldsUpTo="reporting">
+          <name>profiles</name>
+          <version>4.0.0+</version>
+          <description>A listing of project-local build profiles which will modify the build process
+            when activated.</description>
+          <association>
+            <type>Profile</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+    private void cloneHook( Model copy )
+    {
+        copy.pomFile = pomFile;
+    }
+
+    /**
+     * The POM from which this model originated. This is transient runtime state and therefore not managed by Modello.
+     */
+    private java.io.File pomFile;
+
+    /**
+     * Gets the POM file for the corresponding project (if any).
+     *
+     * @return The POM file from which this model originated or {@code null} if this model does not belong to a local
+     *         project (e.g. describes the metadata of some artifact from the repository).
+     */
+    public java.io.File getPomFile()
+    {
+        return pomFile;
+    }
+
+    public void setPomFile( java.io.File pomFile )
+    {
+        this.pomFile = ( pomFile != null ) ? pomFile.getAbsoluteFile() : null;
+    }
+
+    /**
+     * Gets the base directory for the corresponding project (if any).
+     *
+     * @return The base directory for the corresponding project or {@code null} if this model does not belong to a local
+     *         project (e.g. describes the metadata of some artifact from the repository).
+     */
+    public java.io.File getProjectDirectory()
+    {
+        return ( pomFile != null ) ? pomFile.getParentFile() : null;
+    }
+
+    /**
+     * @return the model id as <code>groupId:artifactId:packaging:version</code>
+     */
+    public String getId()
+    {
+        StringBuilder id = new StringBuilder( 64 );
+
+        id.append( ( getGroupId() == null ) ? "[inherited]" : getGroupId() );
+        id.append( ":" );
+        id.append( getArtifactId() );
+        id.append( ":" );
+        id.append( getPackaging() );
+        id.append( ":" );
+        id.append( ( getVersion() == null ) ? "[inherited]" : getVersion() );
+
+        return id.toString();
+    }
+
+    @Override
+    public String toString()
+    {
+        return getId();
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+    <class java.clone="deep">
+      <name>ModelBase</name>
+      <version>3.0.0+</version>
+      <description>
+        <![CDATA[
+        Base class for the <code>Model</code> and the <code>Profile</code> objects.
+        ]]>
+      </description>
+      <fields>
+        <field xdoc.separator="blank">
+          <name>modules</name>
+          <version>4.0.0+</version>
+          <description>The modules (sometimes called subprojects) to build as a part of this
+            project. Each module listed is a relative path to the directory containing the module.
+            To be consistent with the way default urls are calculated from parent, it is recommended
+            to have module names match artifact ids.</description>
+          <association>
+            <type>String</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field xdoc.separator="blank">
+          <name>distributionManagement</name>
+          <version>4.0.0+</version>
+          <description>Distribution information for a project that enables deployment of the site
+            and artifacts to remote web servers and repositories respectively.</description>
+          <association>
+            <type>DistributionManagement</type>
+          </association>
+        </field>
+        <field xdoc.separator="blank">
+          <name>properties</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            Properties that can be used throughout the POM as a substitution, and
+            are used as filters in resources if enabled.
+            The format is <code>&lt;name&gt;value&lt;/name&gt;</code>.
+            ]]>
+          </description>
+          <type>Properties</type>
+          <association xml.mapStyle="inline">
+            <type>String</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field xdoc.separator="blank">
+          <name>dependencyManagement</name>
+          <version>4.0.0+</version>
+          <required>false</required>
+          <description>Default dependency information for projects that inherit from this one. The
+            dependencies in this section are not immediately resolved. Instead, when a POM derived
+            from this one declares a dependency described by a matching groupId and artifactId, the
+            version and other values from this section are used for that dependency if they were not
+            already specified.</description>
+          <association>
+            <type>DependencyManagement</type>
+          </association>
+        </field>
+        <field>
+          <name>dependencies</name>
+          <version>3.0.0+</version>
+          <description>
+            <![CDATA[
+            This element describes all of the dependencies associated with a
+            project.
+            These dependencies are used to construct a classpath for your
+            project during the build process. They are automatically downloaded from the
+            repositories defined in this project.
+            See <a href="https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html">the
+            dependency mechanism</a> for more information.
+            ]]>
+          </description>
+          <association>
+            <type>Dependency</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field xdoc.separator="blank">
+          <name>repositories</name>
+          <version>4.0.0+</version>
+          <description>The lists of the remote repositories for discovering dependencies and
+            extensions.</description>
+          <association>
+            <type>Repository</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field>
+          <name>pluginRepositories</name>
+          <version>4.0.0+</version>
+          <description>The lists of the remote repositories for discovering plugins for builds and
+            reports.</description>
+          <association>
+            <type>Repository</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field xdoc.separator="blank">
+          <name>reports</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            <b>Deprecated</b>. Now ignored by Maven.
+            ]]>
+          </description>
+          <type>DOM</type>
+        </field>
+        <field>
+          <name>reporting</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            This element includes the specification of report plugins to use
+            to generate the reports on the Maven-generated site.
+            These reports will be run when a user executes <code>mvn site</code>.
+            All of the reports will be included in the navigation bar for browsing.
+            ]]>
+          </description>
+          <association>
+            <type>Reporting</type>
+          </association>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>PluginContainer</name>
+      <version>3.0.0+</version>
+      <description>Contains the plugins informations for the project.</description>
+      <fields>
+        <field>
+          <name>plugins</name>
+          <version>4.0.0+</version>
+          <description>The list of plugins to use.</description>
+          <association>
+            <type>Plugin</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+    java.util.Map<String, Plugin> pluginMap;
+
+    /**
+     * Reset the <code>pluginsMap</code> field to <code>null</code>
+     */
+    public synchronized void flushPluginMap()
+    {
+        this.pluginMap = null;
+    }
+
+    /**
+     * @return a Map of plugins field with <code>Plugins#getKey()</code> as key
+     * @see org.apache.maven.model.Plugin#getKey()
+     */
+    public synchronized java.util.Map<String, Plugin> getPluginsAsMap()
+    {
+        if ( pluginMap == null )
+        {
+            pluginMap = new java.util.LinkedHashMap<String, Plugin>();
+            if ( plugins != null )
+            {
+                for ( java.util.Iterator<Plugin> it = plugins.iterator(); it.hasNext(); )
+                {
+                    Plugin plugin = (Plugin) it.next();
+                    pluginMap.put( plugin.getKey(), plugin );
+                }
+            }
+        }
+
+        return pluginMap;
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+    <class>
+      <name>PluginConfiguration</name>
+      <version>3.0.0+</version>
+      <superClass>PluginContainer</superClass>
+      <description>Contains the plugins management informations for the project.</description>
+      <fields>
+        <!-- [ jdcasey:06-Mar-2005 ] Added to handle version management, etc. for
+          | plugins to be used in sub-projects. -->
+        <field>
+          <name>pluginManagement</name>
+          <version>4.0.0+</version>
+          <required>false</required>
+          <description>Default plugin information to be made available for reference by projects
+            derived from this one. This plugin configuration will not be resolved or bound to the
+            lifecycle unless referenced. Any local configuration for a given plugin will override
+            the plugin's entire definition here.</description>
+          <association>
+            <type>PluginManagement</type>
+          </association>
+        </field>
+      </fields>
+    </class>
+    <class>
+      <name>BuildBase</name>
+      <version>3.0.0+</version>
+      <superClass>PluginConfiguration</superClass>
+      <description>Generic informations for a build.</description>
+      <fields>
+        <field>
+          <name>defaultGoal</name>
+          <version>3.0.0+</version>
+          <description>The default goal (or phase in Maven 2) to execute when none is specified for
+            the project. Note that in case of a multi-module build, only the default goal of the top-level
+            project is relevant, i.e. the default goals of child modules are ignored. Since Maven 3,
+            multiple goals/phases can be separated by whitespace.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>resources</name>
+          <version>3.0.0+</version>
+          <description><![CDATA[
+            This element describes all of the classpath resources such as properties
+            files associated with a project. These resources are often included in the final
+            package.
+            The default value is <code>src/main/resources</code>.]]>
+          </description>
+          <association>
+            <type>Resource</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field>
+          <name>testResources</name>
+          <version>4.0.0+</version>
+          <description><![CDATA[
+            This element describes all of the classpath resources such as properties
+            files associated with a project's unit tests.
+            The default value is <code>src/test/resources</code>.]]>
+          </description>
+          <association>
+            <type>Resource</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field>
+          <name>directory</name>
+          <version>4.0.0+</version>
+          <description><![CDATA[
+            The directory where all files generated by the build are placed.
+            The default value is <code>target</code>.]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>finalName</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            The filename (excluding the extension, and with no path information) that
+            the produced artifact will be called.
+            The default value is <code>${artifactId}-${version}</code>.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>filters</name>
+          <version>4.0.0+</version>
+          <description>The list of filter properties files that are used when filtering is enabled.</description>
+          <association>
+            <type>String</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+      </fields>
+    </class>
+    <class>
+      <name>Build</name>
+      <version>3.0.0+</version>
+      <superClass>BuildBase</superClass>
+      <description>
+        <![CDATA[
+        The <code>&lt;build&gt;</code> element contains informations required to build the project.
+        Default values are defined in Super POM.
+        ]]>
+      </description>
+      <fields>
+        <field>
+          <name>sourceDirectory</name>
+          <version>3.0.0+</version>
+          <required>true</required>
+          <description><![CDATA[
+            This element specifies a directory containing the source of the project. The
+            generated build system will compile the sources from this directory when the project is
+            built. The path given is relative to the project descriptor.
+            The default value is <code>src/main/java</code>.]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>scriptSourceDirectory</name>
+          <version>4.0.0+</version>
+          <required>true</required>
+          <description><![CDATA[
+            This element specifies a directory containing the script sources of the
+            project. This directory is meant to be different from the sourceDirectory, in that its
+            contents will be copied to the output directory in most cases (since scripts are
+            interpreted rather than compiled).
+            The default value is <code>src/main/scripts</code>.]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>testSourceDirectory</name>
+          <version>4.0.0+</version>
+          <required>true</required>
+          <description><![CDATA[
+            This element specifies a directory containing the unit test source of the
+            project. The generated build system will compile these directories when the project is
+            being tested. The path given is relative to the project descriptor.
+            The default value is <code>src/test/java</code>.]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>outputDirectory</name>
+          <version>4.0.0+</version>
+          <description><![CDATA[
+            The directory where compiled application classes are placed.
+            The default value is <code>target/classes</code>.]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>testOutputDirectory</name>
+          <version>4.0.0+</version>
+          <description><![CDATA[
+            The directory where compiled test classes are placed.
+            The default value is <code>target/test-classes</code>.]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>extensions</name>
+          <version>4.0.0+</version>
+          <description>A set of build extensions to use from this project.</description>
+          <association>
+            <type>Extension</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>CiManagement</name>
+      <version>4.0.0+</version>
+      <description>
+        <![CDATA[
+        The <code>&lt;CiManagement&gt;</code> element contains informations required to the
+        continuous integration system of the project.
+        ]]>
+      </description>
+      <fields>
+        <field>
+          <name>system</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            The name of the continuous integration system, e.g. <code>continuum</code>.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>url</name>
+          <version>4.0.0+</version>
+          <description>URL for the continuous integration system used by the project if it has a web
+            interface.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>notifiers</name>
+          <version>4.0.0+</version>
+          <description>Configuration for notifying developers/users when a build is unsuccessful,
+            including user information and notification mode.</description>
+          <association>
+            <multiplicity>*</multiplicity>
+            <type>Notifier</type>
+          </association>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>Notifier</name>
+      <description>Configures one method for notifying users/developers when a build breaks.</description>
+      <version>4.0.0+</version>
+      <fields>
+        <field>
+          <name>type</name>
+          <version>4.0.0+</version>
+          <defaultValue>mail</defaultValue>
+          <type>String</type>
+          <description>The mechanism used to deliver notifications.</description>
+        </field>
+        <field>
+          <name>sendOnError</name>
+          <version>4.0.0+</version>
+          <defaultValue>true</defaultValue>
+          <type>boolean</type>
+          <description>Whether to send notifications on error.</description>
+        </field>
+        <field>
+          <name>sendOnFailure</name>
+          <version>4.0.0+</version>
+          <defaultValue>true</defaultValue>
+          <type>boolean</type>
+          <description>Whether to send notifications on failure.</description>
+        </field>
+        <field>
+          <name>sendOnSuccess</name>
+          <version>4.0.0+</version>
+          <defaultValue>true</defaultValue>
+          <type>boolean</type>
+          <description>Whether to send notifications on success.</description>
+        </field>
+        <field>
+          <name>sendOnWarning</name>
+          <version>4.0.0+</version>
+          <defaultValue>true</defaultValue>
+          <type>boolean</type>
+          <description>Whether to send notifications on warning.</description>
+        </field>
+        <!-- TODO: Remove it after continuum alpha-3 release -->
+        <field>
+          <name>address</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>
+            <![CDATA[
+            <b>Deprecated</b>. Where to send the notification to - eg email address.
+            ]]>
+          </description>
+        </field>
+        <field>
+          <name>configuration</name>
+          <description>Extended configuration specific to this notifier goes here.</description>
+          <type>Properties</type>
+          <association xml.mapStyle="inline">
+            <type>String</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>Contributor</name>
+      <description>Description of a person who has contributed to the project, but who does not have
+        commit privileges. Usually, these contributions come in the form of patches submitted.</description>
+      <version>3.0.0+</version>
+      <fields>
+        <field>
+          <name>name</name>
+          <version>3.0.0+</version>
+          <description>The full name of the contributor.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>email</name>
+          <version>3.0.0+</version>
+          <description>The email address of the contributor.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>url</name>
+          <version>3.0.0+</version>
+          <description>The URL for the homepage of the contributor.</description>
+          <type>String</type>
+        </field>
+        <!-- TODO: should this just be a single Organization element -->
+        <field>
+          <name>organization</name>
+          <alias>organisation</alias>
+          <version>3.0.0+</version>
+          <description>The organization to which the contributor belongs.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>organizationUrl</name>
+          <alias>organisationUrl</alias>
+          <version>3.0.0+</version>
+          <description>The URL of the organization.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>roles</name>
+          <version>3.0.0+</version>
+          <description>
+            <![CDATA[
+            The roles the contributor plays in the project. Each role is described by a
+            <code>role</code> element, the body of which is a role name. This can also be used to
+            describe the contribution.
+            ]]>
+          </description>
+          <association>
+            <type>String</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field>
+          <name>timezone</name>
+          <version>3.0.0+</version>
+          <description>
+            <![CDATA[
+              The timezone the contributor is in. Typically, this is a number in the range
+              <a href="http://en.wikipedia.org/wiki/UTC%E2%88%9212:00">-12</a> to <a href="http://en.wikipedia.org/wiki/UTC%2B14:00">+14</a>
+              or a valid time zone id like "America/Montreal" (UTC-05:00) or "Europe/Paris" (UTC+01:00).
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>properties</name>
+          <version>3.0.0+</version>
+          <description>Properties about the contributor, such as an instant messenger handle.</description>
+          <type>Properties</type>
+          <association xml.mapStyle="inline">
+            <type>String</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>Dependency</name>
+      <version>3.0.0+</version>
+      <description>
+        <![CDATA[
+        The <code>&lt;dependency&gt;</code> element contains information about a dependency
+        of the project.
+        ]]>
+      </description>
+      <fields>
+        <field>
+          <name>groupId</name>
+          <version>3.0.0+</version>
+          <required>true</required>
+          <description>
+            <![CDATA[
+            The project group that produced the dependency, e.g.
+            <code>org.apache.maven</code>.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>artifactId</name>
+          <version>3.0.0+</version>
+          <required>true</required>
+          <description>
+            <![CDATA[
+            The unique id for an artifact produced by the project group, e.g.
+            <code>maven-artifact</code>.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>version</name>
+          <version>3.0.0+</version>
+          <description>
+            <![CDATA[
+            The version of the dependency, e.g. <code>3.2.1</code>. In Maven 2, this can also be
+            specified as a range of versions.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>type</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            The type of dependency. While it
+            usually represents the extension on the filename of the dependency,
+            that is not always the case. A type can be mapped to a different
+            extension and a classifier.
+            The type often corresponds to the packaging used, though this is also
+            not always the case.
+            Some examples are <code>jar</code>, <code>war</code>, <code>ejb-client</code>
+            and <code>test-jar</code>: see <a href="../maven-core/artifact-handlers.html">default
+            artifact handlers</a> for a list.
+            New types can be defined by plugins that set
+            <code>extensions</code> to <code>true</code>, so this is not a complete list.
+            ]]>
+          </description>
+          <type>String</type>
+          <defaultValue>jar</defaultValue>
+        </field>
+        <field>
+          <name>classifier</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            The classifier of the dependency. It is appended to
+            the filename after the version. This allows:
+            <ul>
+            <li>referring to attached artifact, for example <code>sources</code> and <code>javadoc</code>:
+            see <a href="../maven-core/artifact-handlers.html">default artifact handlers</a> for a list,</li>
+            <li>distinguishing two artifacts
+            that belong to the same POM but were built differently.
+            For example, <code>jdk14</code> and <code>jdk15</code>.</li>
+            </ul>
+            ]]>
+          </description>
+          <type>String</type>
+          <required>false</required>
+        </field>
+        <field>
+          <name>scope</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            The scope of the dependency - <code>compile</code>, <code>runtime</code>,
+            <code>test</code>, <code>system</code>, and <code>provided</code>. Used to
+            calculate the various classpaths used for compilation, testing, and so on.
+            It also assists in determining which artifacts to include in a distribution of
+            this project. For more information, see
+            <a href="https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html">the
+            dependency mechanism</a>. The default scope is <code>compile</code>.
+            ]]>
+          </description>
+          <type>String</type>
+          <!-- This default has to be enforced at the maven-artifact layer, to allow
+            | injection of defaults from <dependencyManagement/>.
+            | TODO: how can we document it?
+            |-->
+          <!-- defaultValue>compile</defaultValue -->
+        </field>
+        <field>
+          <name>systemPath</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            FOR SYSTEM SCOPE ONLY. Note that use of this property is <b>discouraged</b>
+            and may be replaced in later versions. This specifies the path on the filesystem
+            for this dependency.
+            Requires an absolute path for the value, not relative.
+            Use a property that gives the machine specific absolute path,
+            e.g. <code>${java.home}</code>.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>exclusions</name>
+          <version>4.0.0+</version>
+          <description>Lists a set of artifacts that should be excluded from this dependency's
+            artifact list when it comes to calculating transitive dependencies.</description>
+          <association>
+            <type>Exclusion</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field>
+          <name>optional</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            Indicates the dependency is optional for use of this library. While the
+            version of the dependency will be taken into account for dependency calculation if the
+            library is used elsewhere, it will not be passed on transitively. Note: While the type
+            of this field is <code>String</code> for technical reasons, the semantic type is actually
+            <code>Boolean</code>. Default value is <code>false</code>.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+    public boolean isOptional()
+    {
+        return ( optional != null ) ? Boolean.parseBoolean( optional ) : false;
+    }
+
+    public void setOptional( boolean optional )
+    {
+        this.optional = String.valueOf( optional );
+    }
+
+    /**
+     * @see java.lang.Object#toString()
+     */
+    public String toString()
+    {
+        return "Dependency {groupId=" + groupId + ", artifactId=" + artifactId + ", version=" + version + ", type=" + type + "}";
+    }
+            ]]>
+          </code>
+        </codeSegment>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+    private String managementKey;
+
+    /**
+     * @return the management key as <code>groupId:artifactId:type</code>
+     */
+    public String getManagementKey()
+    {
+        if ( managementKey == null )
+        {
+            managementKey = groupId + ":" + artifactId + ":" + type + ( classifier != null ? ":" + classifier : "" );
+        }
+        return managementKey;
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+    <class>
+      <superClass>Contributor</superClass>
+      <name>Developer</name>
+      <description>Information about one of the committers on this project.</description>
+      <version>3.0.0+</version>
+      <fields>
+        <field>
+          <name>id</name>
+          <version>3.0.0+</version>
+          <description>The unique ID of the developer in the SCM.</description>
+          <type>String</type>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>Exclusion</name>
+      <version>4.0.0+</version>
+      <description>
+        <![CDATA[
+        The <code>&lt;exclusion&gt;</code> element contains informations required to exclude
+        an artifact to the project.
+        ]]>
+      </description>
+      <fields>
+        <field>
+          <name>artifactId</name>
+          <version>4.0.0+</version>
+          <description>The artifact ID of the project to exclude.</description>
+          <type>String</type>
+          <required>true</required>
+        </field>
+        <field>
+          <name>groupId</name>
+          <version>4.0.0+</version>
+          <description>The group ID of the project to exclude.</description>
+          <type>String</type>
+          <required>true</required>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>IssueManagement</name>
+      <description>Information about the issue tracking (or bug tracking) system used to manage this
+        project.</description>
+      <version>4.0.0+</version>
+      <fields>
+        <field>
+          <name>system</name>
+          <version>4.0.0+</version>
+          <description>The name of the issue management system, e.g. Bugzilla</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>url</name>
+          <version>4.0.0+</version>
+          <description>URL for the issue management system used by the project.</description>
+          <type>String</type>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>DistributionManagement</name>
+      <version>4.0.0+</version>
+      <description>This elements describes all that pertains to distribution for a project. It is
+        primarily used for deployment of artifacts and the site produced by the build.</description>
+      <fields>
+        <field>
+          <name>repository</name>
+          <version>4.0.0+</version>
+          <description>Information needed to deploy the artifacts generated by the project to a
+            remote repository.</description>
+          <association>
+            <type>DeploymentRepository</type>
+          </association>
+        </field>
+        <field>
+          <name>snapshotRepository</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            Where to deploy snapshots of artifacts to. If not given, it defaults to the
+            <code>repository</code> element.
+            ]]>
+          </description>
+          <association>
+            <type>DeploymentRepository</type>
+          </association>
+        </field>
+        <field>
+          <name>site</name>
+          <description>Information needed for deploying the web site of the project.</description>
+          <version>4.0.0+</version>
+          <association>
+            <type>Site</type>
+          </association>
+        </field>
+        <field>
+          <name>downloadUrl</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            The URL of the project's download page. If not given users will be
+            referred to the homepage given by <code>url</code>.
+            This is given to assist in locating artifacts that are not in the repository due to
+            licensing restrictions.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>relocation</name>
+          <version>4.0.0+</version>
+          <description>Relocation information of the artifact if it has been moved to a new group ID
+            and/or artifact ID.</description>
+          <association>
+            <type>Relocation</type>
+          </association>
+        </field>
+        <field>
+          <name>status</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            Gives the status of this artifact in the remote repository.
+            This must not be set in your local project, as it is updated by
+            tools placing it in the reposiory. Valid values are: <code>none</code> (default),
+            <code>converted</code> (repository manager converted this from an Maven 1 POM),
+            <code>partner</code>
+            (directly synced from a partner Maven 2 repository), <code>deployed</code> (was deployed from a Maven 2
+            instance), <code>verified</code> (has been hand verified as correct and final).
+            ]]>
+          </description>
+          <required>false</required>
+          <type>String</type>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>License</name>
+      <description>Describes the licenses for this project. This is used to generate the license
+        page of the project's web site, as well as being taken into consideration in other reporting
+        and validation. The licenses listed for the project are that of the project itself, and not
+        of dependencies.</description>
+      <version>3.0.0+</version>
+      <fields>
+        <field>
+          <name>name</name>
+          <version>3.0.0+</version>
+          <description>The full legal name of the license.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>url</name>
+          <version>3.0.0+</version>
+          <description>The official url for the license text.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>distribution</name>
+          <version>3.0.0+</version>
+          <description>
+            <![CDATA[
+            The primary method by which this project may be distributed.
+            <dl>
+              <dt>repo</dt>
+              <dd>may be downloaded from the Maven repository</dd>
+              <dt>manual</dt>
+              <dd>user must manually download and install the dependency.</dd>
+            </dl>
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>comments</name>
+          <description>Addendum information pertaining to this license.</description>
+          <version>3.0.0+</version>
+          <type>String</type>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>MailingList</name>
+      <version>3.0.0+</version>
+      <description>This element describes all of the mailing lists associated with a project. The
+        auto-generated site references this information.</description>
+      <fields>
+        <field>
+          <name>name</name>
+          <version>3.0.0+</version>
+          <description>
+            <![CDATA[
+            The name of the mailing list.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>subscribe</name>
+          <version>3.0.0+</version>
+          <description>
+            <![CDATA[
+            The email address or link that can be used to subscribe to
+            the mailing list.  If this is an email address, a
+            <code>mailto:</code> link will automatically be created
+            when the documentation is created.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>unsubscribe</name>
+          <version>3.0.0+</version>
+          <description>
+            <![CDATA[
+            The email address or link that can be used to unsubscribe to
+            the mailing list.  If this is an email address, a
+            <code>mailto:</code> link will automatically be created
+            when the documentation is created.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>post</name>
+          <version>3.0.0+</version>
+          <description>
+            <![CDATA[
+            The email address or link that can be used to post to
+            the mailing list.  If this is an email address, a
+            <code>mailto:</code> link will automatically be created
+            when the documentation is created.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>archive</name>
+          <version>3.0.0+</version>
+          <description>The link to a URL where you can browse the mailing list archive.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>otherArchives</name>
+          <version>3.0.0+</version>
+          <description>The link to alternate URLs where you can browse the list archive.</description>
+          <association>
+            <type>String</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+      </fields>
+      <comment>We could probably have a specific element for a dev mailing list for things like CI,
+        and maybe even a specific element for the user and scm mailing lists. Then leave the more
+        lose structure for any other type of mailing list.</comment>
+    </class>
+    <class java.clone="deep">
+      <name>Organization</name>
+      <description>Specifies the organization that produces this project.</description>
+      <version>3.0.0+</version>
+      <fields>
+        <field>
+          <name>name</name>
+          <version>3.0.0+</version>
+          <description>The full name of the organization.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>url</name>
+          <version>3.0.0+</version>
+          <description>The URL to the organization's home page.</description>
+          <type>String</type>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>PatternSet</name>
+      <version>3.0.0+</version>
+      <description>Definition of include or exclude patterns.</description>
+      <fields>
+        <field>
+          <name>includes</name>
+          <version>3.0.0+</version>
+          <description>
+            <![CDATA[
+            A list of patterns to include, e.g. <code>**&#47;*.xml</code>.
+            ]]>
+          </description>
+          <association>
+            <type>String</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field>
+          <name>excludes</name>
+          <version>3.0.0+</version>
+          <description>
+            <![CDATA[
+            A list of patterns to exclude, e.g. <code>**&#47;*.xml</code>
+            ]]>
+          </description>
+          <association>
+            <type>String</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+    /**
+     * @see java.lang.Object#toString()
+     */
+    public String toString()
+    {
+        StringBuilder sb = new StringBuilder( 128 );
+
+        sb.append("PatternSet [includes: {");
+        for (java.util.Iterator i = getIncludes().iterator(); i.hasNext(); )
+        {
+            String str = (String) i.next();
+            sb.append(str).append(", ");
+        }
+        if (sb.substring(sb.length() - 2).equals(", ")) sb.delete(sb.length() - 2, sb.length());
+
+        sb.append("}, excludes: {");
+        for (java.util.Iterator i = getExcludes().iterator(); i.hasNext(); )
+        {
+            String str = (String) i.next();
+            sb.append(str).append(", ");
+        }
+        if (sb.substring(sb.length() - 2).equals(", ")) sb.delete(sb.length() - 2, sb.length());
+
+        sb.append("}]");
+        return sb.toString();
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+    <class java.clone="deep">
+      <name>Parent</name>
+      <version>4.0.0+</version>
+      <description>
+        <![CDATA[
+        The <code>&lt;parent&gt;</code> element contains information required to locate the parent project from which
+        this project will inherit from.
+        <strong>Note:</strong> The children of this element are not interpolated and must be given as literal values.
+        ]]>
+      </description>
+      <fields>
+        <field>
+          <name>groupId</name>
+          <version>4.0.0+</version>
+          <description>The group id of the parent project to inherit from.</description>
+          <required>true</required>
+          <type>String</type>
+        </field>
+        <field>
+          <name>artifactId</name>
+          <version>4.0.0+</version>
+          <description>The artifact id of the parent project to inherit from.</description>
+          <required>true</required>
+          <type>String</type>
+        </field>
+        <field>
+          <name>version</name>
+          <version>4.0.0+</version>
+          <description>The version of the parent project to inherit.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>relativePath</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            The relative path of the parent <code>pom.xml</code> file within the check out.
+            If not specified, it defaults to <code>../pom.xml</code>.
+            Maven looks for the parent POM first in this location on
+            the filesystem, then the local repository, and lastly in the remote repo.
+            <code>relativePath</code> allows you to select a different location,
+            for example when your structure is flat, or deeper without an intermediate parent POM.
+            However, the group ID, artifact ID and version are still required,
+            and must match the file in the location given or it will revert to the repository for the POM.
+            This feature is only for enhancing the development in a local checkout of that project.
+            Set the value to an empty string in case you want to disable the feature and always resolve
+            the parent POM from the repositories.
+            ]]>
+          </description>
+          <type>String</type>
+          <defaultValue>../pom.xml</defaultValue>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+    /**
+     * @return the id as <code>groupId:artifactId:version</code>
+     */
+    public String getId()
+    {
+        StringBuilder id = new StringBuilder( 64 );
+
+        id.append( getGroupId() );
+        id.append( ":" );
+        id.append( getArtifactId() );
+        id.append( ":" );
+        id.append( "pom" );
+        id.append( ":" );
+        id.append( getVersion() );
+
+        return id.toString();
+    }
+
+    @Override
+    public String toString()
+    {
+        return getId();
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+
+    </class>
+    <class java.clone="deep">
+      <name>Scm</name>
+      <version>4.0.0+</version>
+      <description>
+        <![CDATA[
+        The <code>&lt;scm&gt;</code> element contains informations required to the SCM
+        (Source Control Management) of the project.
+        ]]>
+      </description>
+      <fields>
+        <field>
+          <name>connection</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            The source control management system URL
+            that describes the repository and how to connect to the
+            repository. For more information, see the
+            <a href="https://maven.apache.org/scm/scm-url-format.html">URL format</a>
+            and <a href="https://maven.apache.org/scm/scms-overview.html">list of supported SCMs</a>.
+            This connection is read-only.
+            <br><b>Default value is</b>: parent value [+ path adjustment] + (artifactId or <code>project.directory</code> property) 
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>developerConnection</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            Just like <code>connection</code>, but for developers, i.e. this scm connection
+            will not be read only.
+            <br><b>Default value is</b>: parent value [+ path adjustment] + (artifactId or <code>project.directory</code> property)
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>tag</name>
+          <version>4.0.0+</version>
+          <description>The tag of current code. By default, it's set to HEAD during development.</description>
+          <type>String</type>
+          <defaultValue>HEAD</defaultValue>
+        </field>
+        <field>
+          <name>url</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            The URL to the project's browsable SCM repository, such as ViewVC or Fisheye.
+            <br><b>Default value is</b>: parent value [+ path adjustment] + (artifactId or <code>project.directory</code> property)
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+      </fields>
+    </class>
+    <class>
+      <name>FileSet</name>
+      <version>3.0.0+</version>
+      <superClass>PatternSet</superClass>
+      <description>A PatternSet for files.</description>
+      <fields>
+        <field>
+          <name>directory</name>
+          <version>3.0.0+</version>
+          <description>Describe the directory where the resources are stored. The path is relative
+            to the POM.</description>
+          <type>String</type>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+    /**
+     * @see java.lang.Object#toString()
+     */
+    public String toString()
+    {
+        return "FileSet {directory: " + getDirectory() + ", " + super.toString() + "}";
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+    <class>
+      <name>Resource</name>
+      <description>This element describes all of the classpath resources associated with a project
+        or unit tests.</description>
+      <version>3.0.0+</version>
+      <superClass>FileSet</superClass>
+      <fields>
+        <field>
+          <name>targetPath</name>
+          <version>3.0.0+</version>
+          <description>
+            <![CDATA[
+            Describe the resource target path. The path is relative to the target/classes
+            directory (i.e. <code>${project.build.outputDirectory}</code>).
+            For example, if you want that resource to appear in a specific package
+            (<code>org.apache.maven.messages</code>), you must specify this
+            element with this value: <code>org/apache/maven/messages</code>.
+            This is not required if you simply put the resources in that directory
+            structure at the source, however.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>filtering</name>
+          <version>3.0.0+</version>
+          <description>
+            <![CDATA[
+            Whether resources are filtered to replace tokens with parameterised values or not.
+            The values are taken from the <code>properties</code> element and from the
+            properties in the files listed in the <code>filters</code> element. Note: While the type
+            of this field is <code>String</code> for technical reasons, the semantic type is actually
+            <code>Boolean</code>. Default value is <code>false</code>.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field xml.transient="true">
+          <name>mergeId</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            FOR INTERNAL USE ONLY. This is a unique identifier assigned to each
+            resource to allow Maven to merge changes to this resource that take
+            place during the execution of a plugin. This field must be managed
+            by the generated parser and formatter classes in order to allow it
+            to survive model interpolation.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+    private static int mergeIdCounter = 0;
+
+    public void initMergeId()
+    {
+        if ( getMergeId() == null )
+        {
+            setMergeId( "resource-" + (mergeIdCounter++) );
+        }
+    }
+
+    public boolean isFiltering()
+    {
+        return ( filtering != null ) ? Boolean.parseBoolean( filtering ) : false;
+    }
+
+    public void setFiltering( boolean filtering )
+    {
+        this.filtering = String.valueOf( filtering );
+    }
+
+    /**
+     * @see java.lang.Object#toString()
+     */
+    public String toString()
+    {
+        return "Resource {targetPath: " + getTargetPath() + ", filtering: " + isFiltering() + ", " + super.toString() + "}";
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+    <class java.clone="deep">
+      <name>RepositoryBase</name>
+      <version>4.0.0+</version>
+      <description>A repository contains the information needed for establishing connections with
+        remote repository.</description>
+      <fields>
+        <field>
+          <name>id</name>
+          <version>4.0.0+</version>
+          <required>true</required>
+          <identifier>true</identifier>
+          <description>
+            <![CDATA[
+            A unique identifier for a repository. This is used to match the repository
+            to configuration in the <code>settings.xml</code> file, for example. Furthermore, the identifier is
+            used during POM inheritance and profile injection to detect repositories that should be merged.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>name</name>
+          <version>4.0.0+</version>
+          <description>Human readable name of the repository.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>url</name>
+          <version>4.0.0+</version>
+          <required>true</required>
+          <description>
+            <![CDATA[
+            The url of the repository, in the form <code>protocol://hostname/path</code>.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>layout</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            The type of layout this repository uses for locating and storing artifacts -
+            can be <code>legacy</code> or <code>default</code>.
+            ]]>
+          </description>
+          <type>String</type>
+          <defaultValue>default</defaultValue>
+        </field>
+      </fields>
+    </class>
+
+    <class>
+      <name>Repository</name>
+      <superClass>RepositoryBase</superClass>
+      <version>4.0.0+</version>
+      <description>A repository contains the information needed for establishing connections with
+        remote repository.</description>
+      <fields>
+        <field>
+          <name>releases</name>
+          <version>4.0.0+</version>
+          <description>How to handle downloading of releases from this repository.</description>
+          <association>
+            <type>RepositoryPolicy</type>
+          </association>
+        </field>
+        <field>
+          <name>snapshots</name>
+          <version>4.0.0+</version>
+          <description>How to handle downloading of snapshots from this repository.</description>
+          <association>
+            <type>RepositoryPolicy</type>
+          </association>
+        </field>
+      </fields>
+    </class>
+
+    <class>
+      <name>DeploymentRepository</name>
+      <superClass>Repository</superClass>
+      <version>4.0.0+</version>
+      <description>Repository contains the information needed for deploying to the remote
+        repository.</description>
+      <fields>
+        <field>
+          <name>uniqueVersion</name>
+          <description>Whether to assign snapshots a unique version comprised of the timestamp and
+            build number, or to use the same version each time</description>
+          <type>boolean</type>
+          <defaultValue>true</defaultValue>
+          <version>4.0.0+</version>
+        </field>
+      </fields>
+    </class>
+
+    <class java.clone="deep">
+      <name>RepositoryPolicy</name>
+      <version>4.0.0+</version>
+      <description>Download policy.</description>
+      <fields>
+        <field>
+          <name>enabled</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            Whether to use this repository for downloading this type of artifact. Note: While the type
+            of this field is <code>String</code> for technical reasons, the semantic type is actually
+            <code>Boolean</code>. Default value is <code>true</code>.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>updatePolicy</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            The frequency for downloading updates - can be
+            <code>always,</code>
+            <code>daily</code>
+            (default),
+            <code>interval:XXX</code>
+            (in minutes) or
+            <code>never</code>
+            (only if it doesn't exist locally).
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>checksumPolicy</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            What to do when verification of an artifact checksum fails. Valid values are
+            <code>ignore</code>
+            ,
+            <code>fail</code>
+            or
+            <code>warn</code>
+            (the default).
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+
+    public boolean isEnabled()
+    {
+        return ( enabled != null ) ? Boolean.parseBoolean( enabled ) : true;
+    }
+
+    public void setEnabled( boolean enabled )
+    {
+        this.enabled = String.valueOf( enabled );
+    }
+
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+
+    <!--@todo find better solution for management of site deployments -->
+    <class java.clone="deep">
+      <name>Site</name>
+      <version>4.0.0+</version>
+      <description>Contains the information needed for deploying websites.</description>
+      <fields>
+        <field>
+          <name>id</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            A unique identifier for a deployment location. This is used to match the
+            site to configuration in the <code>settings.xml</code> file, for example.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>name</name>
+          <version>4.0.0+</version>
+          <description>Human readable name of the deployment location.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>url</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            The url of the location where website is deployed, in the form <code>protocol://hostname/path</code>.
+            <br><b>Default value is</b>: parent value [+ path adjustment] + (artifactId or <code>project.directory</code> property)
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+      </fields>
+    </class>
+
+    <class java.clone="deep">
+      <name>ConfigurationContainer</name>
+      <version>4.0.0+</version>
+      <description>Contains the configuration information of the container like Plugin.</description>
+      <fields>
+        <field>
+          <name>inherited</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            Whether any configuration should be propagated to child POMs. Note: While the type
+            of this field is <code>String</code> for technical reasons, the semantic type is actually
+            <code>Boolean</code>. Default value is <code>true</code>.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <description>
+            <![CDATA[
+            <p>The configuration as DOM object.</p>
+            <p>By default, every element content is trimmed, but starting with Maven 3.1.0, you can add
+            <code>xml:space="preserve"</code> to elements you want to preserve whitespace.</p>
+            <p>You can control how child POMs inherit configuration from parent POMs by adding <code>combine.children</code>
+            or <code>combine.self</code> attributes to the children of the configuration element:</p>
+            <ul>
+            <li><code>combine.children</code>: available values are <code>merge</code> (default) and <code>append</code>,</li>
+            <li><code>combine.self</code>: available values are <code>merge</code> (default) and <code>override</code>.</li>
+            </ul>
+            <p>See <a href="https://maven.apache.org/pom.html#Plugins">POM Reference documentation</a> and
+            <a href="https://codehaus-plexus.github.io/plexus-utils/apidocs/org/codehaus/plexus/util/xml/Xpp3DomUtils.html">Xpp3DomUtils</a>
+            for more information.</p>
+            ]]>
+          </description>
+          <name>configuration</name>
+          <type>DOM</type>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+    public boolean isInherited()
+    {
+        return ( inherited != null ) ? Boolean.parseBoolean( inherited ) : true;
+    }
+
+    public void setInherited( boolean inherited )
+    {
+        this.inherited = String.valueOf( inherited );
+    }
+
+    private boolean inheritanceApplied = true;
+
+    public void unsetInheritanceApplied()
+    {
+        this.inheritanceApplied = false;
+    }
+
+    public boolean isInheritanceApplied()
+    {
+        return inheritanceApplied;
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+    <class>
+      <name>Plugin</name>
+      <version>4.0.0+</version>
+      <superClass>ConfigurationContainer</superClass>
+      <description>
+        <![CDATA[
+        The <code>&lt;plugin&gt;</code> element contains informations required for a plugin.
+        ]]>
+      </description>
+      <fields>
+        <field>
+          <name>groupId</name>
+          <description>The group ID of the plugin in the repository.</description>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <defaultValue>org.apache.maven.plugins</defaultValue>
+        </field>
+        <field>
+          <name>artifactId</name>
+          <description>The artifact ID of the plugin in the repository.</description>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <required>true</required>
+        </field>
+        <field>
+          <name>version</name>
+          <version>4.0.0+</version>
+          <description>The version (or valid range of versions) of the plugin to be used.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>extensions</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>
+            <![CDATA[
+            Whether to load Maven extensions (such as packaging and type handlers) from
+            this plugin. For performance reasons, this should only be enabled when necessary. Note: While the type
+            of this field is <code>String</code> for technical reasons, the semantic type is actually
+            <code>Boolean</code>. Default value is <code>false</code>.
+            ]]>
+          </description>
+        </field>
+        <field>
+          <name>executions</name>
+          <version>4.0.0+</version>
+          <description>Multiple specifications of a set of goals to execute during the build
+            lifecycle, each having (possibly) a different configuration.</description>
+          <association>
+            <type>PluginExecution</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field>
+          <name>dependencies</name>
+          <description>Additional dependencies that this project needs to introduce to the plugin's
+            classloader.</description>
+          <version>4.0.0+</version>
+          <association>
+            <type>Dependency</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field>
+          <name>goals</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            <b>Deprecated</b>. Unused by Maven.
+            ]]>
+          </description>
+          <type>DOM</type>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+    public boolean isExtensions()
+    {
+        return ( extensions != null ) ? Boolean.parseBoolean( extensions ) : false;
+    }
+
+    public void setExtensions( boolean extensions )
+    {
+        this.extensions = String.valueOf( extensions );
+    }
+
+    private java.util.Map<String, PluginExecution> executionMap = null;
+
+    /**
+     * Reset the <code>executionMap</code> field to <code>null</code>
+     */
+    public void flushExecutionMap()
+    {
+        this.executionMap = null;
+    }
+
+    /**
+     * @return a Map of executions field with <code>PluginExecution#getId()</code> as key
+     * @see org.apache.maven.model.PluginExecution#getId()
+     */
+    public java.util.Map<String, PluginExecution> getExecutionsAsMap()
+    {
+        if ( executionMap == null )
+        {
+            executionMap = new java.util.LinkedHashMap<String, PluginExecution>();
+            if ( getExecutions() != null )
+            {
+                for ( java.util.Iterator<PluginExecution> i = getExecutions().iterator(); i.hasNext(); )
+                {
+                    PluginExecution exec = (PluginExecution) i.next();
+
+                    if ( executionMap.containsKey( exec.getId() ) )
+                    {
+                        throw new IllegalStateException( "You cannot have two plugin executions with the same (or missing) <id/> elements.\nOffending execution\n\nId: \'" + exec.getId() + "\'\nPlugin:\'" + getKey() + "\'\n\n" );
+                    }
+
+                    executionMap.put( exec.getId(), exec );
+                }
+            }
+        }
+
+        return executionMap;
+    }
+
+    /**
+     * Gets the identifier of the plugin.
+     *
+     * @return The plugin id in the form {@code <groupId>:<artifactId>:<version>}, never {@code null}.
+     */
+    public String getId()
+    {
+        StringBuilder id = new StringBuilder( 128 );
+
+        id.append( ( getGroupId() == null ) ? "[unknown-group-id]" : getGroupId() );
+        id.append( ":" );
+        id.append( ( getArtifactId() == null ) ? "[unknown-artifact-id]" : getArtifactId() );
+        id.append( ":" );
+        id.append( ( getVersion() == null ) ? "[unknown-version]" : getVersion() );
+
+        return id.toString();
+    }
+
+    //TODO we shall reset key variable when groupId/artifactId change
+    private String key = null;
+    /**
+     * @return the key of the plugin, ie <code>groupId:artifactId</code>
+     */
+    public String getKey()
+    {
+        if ( key == null )
+        {
+            key = constructKey( groupId, artifactId );
+        }
+        return key;
+    }
+
+    /**
+     * @param groupId
+     * @param artifactId
+     * @return the key of the plugin, ie <code>groupId:artifactId</code>
+     */
+    public static String constructKey( String groupId, String artifactId )
+    {
+        return groupId + ":" + artifactId;
+    }
+
+    /**
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    public boolean equals( Object other )
+    {
+        if ( other instanceof Plugin )
+        {
+            Plugin otherPlugin = (Plugin) other;
+
+            return getKey().equals( otherPlugin.getKey() );
+        }
+
+        return false;
+    }
+
+    /**
+     * @see java.lang.Object#hashCode()
+     */
+    public int hashCode()
+    {
+        return getKey().hashCode();
+    }
+
+    /**
+     * @see java.lang.Object#toString()
+     */
+    public String toString()
+    {
+        return "Plugin [" + getKey() + "]";
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+    <class>
+      <name>PluginExecution</name>
+      <version>4.0.0+</version>
+      <superClass>ConfigurationContainer</superClass>
+      <description>
+        <![CDATA[
+        The <code>&lt;execution&gt;</code> element contains informations required for the
+        execution of a plugin.
+        ]]>
+      </description>
+      <fields>
+        <field>
+          <name>id</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <defaultValue>default</defaultValue>
+          <description>The identifier of this execution for labelling the goals during the build,
+            and for matching executions to merge during inheritance and profile injection.</description>
+        </field>
+        <field>
+          <name>phase</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>The build lifecycle phase to bind the goals in this execution to. If omitted,
+            the goals will be bound to the default phase specified by the plugin. </description>
+        </field>
+        <field xml.transient="true">
+          <name>priority</name>
+          <version>4.0.0+</version>
+          <type>int</type>
+          <description>
+            <![CDATA[
+            The priority of this execution compared to other executions which are bound to the same phase.
+            <strong>Warning:</strong> This is an internal utility property that is only public for technical reasons,
+            it is not part of the public API. In particular, this property can be changed or deleted without prior
+            notice.
+            ]]>
+          </description>
+        </field>
+        <field>
+          <name>goals</name>
+          <version>4.0.0+</version>
+          <description>The goals to execute with the given configuration.</description>
+          <association>
+            <type>String</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+    public static final String DEFAULT_EXECUTION_ID = "default";
+
+    @Override
+    public String toString()
+    {
+        return getId();
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+    <class java.clone="deep">
+      <name>DependencyManagement</name>
+      <version>4.0.0+</version>
+      <description>Section for management of default dependency information for use in a group of
+        POMs.</description>
+      <fields>
+        <field>
+          <name>dependencies</name>
+          <version>4.0.0+</version>
+          <description>The dependencies specified here are not used until they are referenced in a
+            POM within the group. This allows the specification of a "standard" version for a
+            particular dependency.</description>
+          <association>
+            <type>Dependency</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+      </fields>
+    </class>
+    <class>
+      <name>PluginManagement</name>
+      <version>4.0.0+</version>
+      <superClass>PluginContainer</superClass>
+      <description>Section for management of default plugin information for use in a group of POMs.
+      </description>
+    </class>
+    <class java.clone="deep">
+      <name>Reporting</name>
+      <version>4.0.0+</version>
+      <description>Section for management of reports and their configuration.</description>
+      <fields>
+        <field>
+          <name>excludeDefaults</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>
+            <![CDATA[
+            If true, then the default reports are not included in the site generation.
+            This includes the reports in the "Project Info" menu. Note: While the type
+            of this field is <code>String</code> for technical reasons, the semantic type is actually
+            <code>Boolean</code>. Default value is <code>false</code>.
+            ]]>
+          </description>
+        </field>
+        <field>
+          <name>outputDirectory</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>
+            <![CDATA[
+            Where to store all of the generated reports. The default is
+            <code>${project.build.directory}/site</code>.
+            ]]>
+          </description>
+          <!-- TODO: why isn't default set here? -->
+        </field>
+        <field>
+          <name>plugins</name>
+          <version>4.0.0+</version>
+          <description>The reporting plugins to use and their configuration.</description>
+          <association>
+            <type>ReportPlugin</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+    public boolean isExcludeDefaults()
+    {
+        return ( excludeDefaults != null ) ? Boolean.parseBoolean( excludeDefaults ) : false;
+    }
+
+    public void setExcludeDefaults( boolean excludeDefaults )
+    {
+        this.excludeDefaults = String.valueOf( excludeDefaults );
+    }
+
+    java.util.Map<String, ReportPlugin> reportPluginMap;
+
+    /**
+     * Reset the <code>reportPluginMap</code> field to <code>null</code>
+     */
+    public synchronized void flushReportPluginMap()
+    {
+        this.reportPluginMap = null;
+    }
+
+    /**
+     * @return a Map of plugins field with <code>ReportPlugin#getKey()</code> as key
+     * @see org.apache.maven.model.ReportPlugin#getKey()
+     */
+    public synchronized java.util.Map<String, ReportPlugin> getReportPluginsAsMap()
+    {
+        if ( reportPluginMap == null )
+        {
+            reportPluginMap = new java.util.LinkedHashMap<String, ReportPlugin>();
+            if ( getPlugins() != null )
+            {
+                for ( java.util.Iterator<ReportPlugin> it = getPlugins().iterator(); it.hasNext(); )
+                {
+                    ReportPlugin reportPlugin = (ReportPlugin) it.next();
+                    reportPluginMap.put( reportPlugin.getKey(), reportPlugin );
+                }
+            }
+        }
+
+        return reportPluginMap;
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+    <!-- Profile support -->
+    <class>
+      <name>Profile</name>
+      <superClass>ModelBase</superClass>
+      <version>4.0.0+</version>
+      <description>Modifications to the build process which is activated based on environmental
+        parameters or command line arguments.</description>
+      <fields>
+        <field>
+          <name>id</name>
+          <required>true</required>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <defaultValue>default</defaultValue>
+          <description>The identifier of this build profile. This is used for command line
+            activation, and identifies profiles to be merged.
+          </description>
+        </field>
+        <field>
+          <name>activation</name>
+          <version>4.0.0+</version>
+          <description>The conditional logic which will automatically trigger the inclusion of this
+            profile.</description>
+          <association>
+            <type>Activation</type>
+          </association>
+        </field>
+        <field xml.tagName="build">
+          <name>build</name>
+          <version>4.0.0+</version>
+          <required>true</required>
+          <description>Information required to build the project.</description>
+          <association>
+            <type>BuildBase</type>
+          </association>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+    public static final String SOURCE_POM = "pom";
+
+    public static final String SOURCE_SETTINGS = "settings.xml";
+
+    // We don't want this to be parseable...it's sort of 'hidden'
+    // default source for this profile is in the pom itself.
+    private String source = SOURCE_POM;
+
+    public void setSource( String source )
+    {
+        this.source = source;
+    }
+
+    public String getSource()
+    {
+        return source;
+    }
+
+    /**
+     * @see java.lang.Object#toString()
+     */
+    public String toString()
+    {
+        return "Profile {id: " + getId() + ", source: " + getSource() + "}";
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+    <class java.clone="deep">
+      <name>Activation</name>
+      <version>4.0.0+</version>
+      <description>The conditions within the build runtime environment which will trigger the
+        automatic inclusion of the build profile. Multiple conditions can be defined, which must
+        be all satisfied to activate the profile.
+      </description>
+      <fields>
+        <field>
+          <name>activeByDefault</name>
+          <version>4.0.0+</version>
+          <type>boolean</type>
+          <description>If set to true, this profile will be active unless another profile in this
+            pom is activated using the command line -P option or by one of that profile's
+            activators.</description>
+        </field>
+        <field>
+          <name>jdk</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>
+            <![CDATA[
+            Specifies that this profile will be activated when a matching JDK is detected.
+            For example, <code>1.4</code> only activates on JDKs versioned 1.4,
+            while <code>!1.4</code> matches any JDK that is not version 1.4. Ranges are supported too:
+            <code>[1.5,)</code> activates when the JDK is 1.5 minimum.
+            ]]>
+          </description>
+        </field>
+        <field>
+          <name>os</name>
+          <version>4.0.0+</version>
+          <description>Specifies that this profile will be activated when matching operating system
+            attributes are detected.</description>
+          <association>
+            <type>ActivationOS</type>
+          </association>
+        </field>
+        <field>
+          <name>property</name>
+          <version>4.0.0+</version>
+          <description>Specifies that this profile will be activated when this system property is
+            specified.</description>
+          <association>
+            <type>ActivationProperty</type>
+          </association>
+        </field>
+        <field>
+          <name>file</name>
+          <version>4.0.0+</version>
+          <description>Specifies that this profile will be activated based on existence of a file.</description>
+          <association>
+            <type>ActivationFile</type>
+          </association>
+        </field>
+        <!--
+        This could be included once we teach Maven to deal with multiple versions of the model
+        <field>
+          <name>custom</name>
+          <version>4.0.0+</version>
+          <description>Describes a custom profile activation trigger, brought in via build
+            extension.</description>
+          <association>
+            <type>ActivationCustom</type>
+          </association>
+        </field>
+        -->
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>ActivationProperty</name>
+      <version>4.0.0+</version>
+      <description>This is the property specification used to activate a profile. If the value field
+        is empty, then the existence of the named property will activate the profile, otherwise it
+        does a case-sensitive match against the property value as well.</description>
+      <fields>
+        <field>
+          <name>name</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <required>true</required>
+          <description>The name of the property to be used to activate a profile.</description>
+        </field>
+        <field>
+          <name>value</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>The value of the property required to activate a profile.</description>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>ActivationOS</name>
+      <version>4.0.0+</version>
+      <description>This is an activator which will detect an operating system's attributes in order
+        to activate its profile.</description>
+      <fields>
+        <field>
+          <name>name</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>
+            <![CDATA[
+            The name of the operating system to be used to activate the profile. This must be an exact match
+            of the <code>${os.name}</code> Java property, such as <code>Windows XP</code>.
+            ]]>
+          </description>
+        </field>
+        <field>
+          <name>family</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>
+            <![CDATA[
+            The general family of the OS to be used to activate the profile, such as
+            <code>windows</code> or <code>unix</code>.
+            ]]>
+          </description>
+        </field>
+        <field>
+          <name>arch</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>The architecture of the operating system to be used to activate the
+          profile.</description>
+        </field>
+        <field>
+          <name>version</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>The version of the operating system to be used to activate the
+          profile.</description>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>ActivationFile</name>
+      <version>4.0.0+</version>
+      <description><![CDATA[This is the file specification used to activate the profile. The <code>missing</code> value
+        is the location of a file that needs to exist, and if it doesn't, the profile will be
+        activated. On the other hand, <code>exists</code> will test for the existence of the file and if it is
+        there, the profile will be activated.<br>
+        Variable interpolation for these file specifications is limited to <code>${basedir}</code>,
+        System properties and request properties.]]></description>
+      <fields>
+        <field>
+          <name>missing</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>The name of the file that must be missing to activate the
+          profile.</description>
+        </field>
+        <field>
+          <name>exists</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>The name of the file that must exist to activate the profile.</description>
+        </field>
+      </fields>
+    </class>
+    <!--
+    This can be put back in when we figure out how to have multiple model versions
+    <class>
+      <name>ActivationCustom</name>
+      <version>4.0.0+</version>
+      <description>This activation allows users to specify their own custom trigger for a profile.</description>
+      <fields>
+        <field>
+          <name>configuration</name>
+          <version>4.0.0+</version>
+          <type>DOM</type>
+          <description>The specification for triggering the profile according to the rules of the
+            custom activation type.</description>
+        </field>
+        <field>
+          <name>type</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>The type (role-hint) of activation which is to be used to activate the
+            profile.</description>
+        </field>
+      </fields>
+    </class>
+    -->
+    <!-- /BuildProfile support -->
+    <class xml.tagName="plugin" java.clone="deep">
+      <name>ReportPlugin</name>
+      <version>4.0.0+</version>
+      <superClass>ConfigurationContainer</superClass>
+      <description>
+        <![CDATA[
+        The <code>&lt;plugin&gt;</code> element contains informations required for a report plugin.
+        ]]>
+      </description>
+      <fields>
+        <field>
+          <name>groupId</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <required>true</required>
+          <defaultValue>org.apache.maven.plugins</defaultValue>
+          <description>The group ID of the reporting plugin in the repository.</description>
+        </field>
+        <field>
+          <name>artifactId</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <required>true</required>
+          <description>The artifact ID of the reporting plugin in the repository.</description>
+        </field>
+        <field>
+          <name>version</name>
+          <version>4.0.0+</version>
+          <description>The version of the reporting plugin to be used.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>reportSets</name>
+          <version>4.0.0+</version>
+          <description>
+            <![CDATA[
+            Multiple specifications of a set of reports, each having (possibly) different
+            configuration. This is the reporting parallel to an <code>execution</code> in the build.
+            ]]>
+          </description>
+          <association>
+            <type>ReportSet</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+    private java.util.Map<String, ReportSet> reportSetMap = null;
+
+    /**
+     * Reset the <code>reportSetMap</code> field to <code>null</code>
+     */
+    public void flushReportSetMap()
+    {
+        this.reportSetMap = null;
+    }
+
+    /**
+     * @return a Map of reportSets field with <code>ReportSet#getId()</code> as key
+     * @see org.apache.maven.model.ReportSet#getId()
+     */
+    public java.util.Map<String, ReportSet> getReportSetsAsMap()
+    {
+        if ( reportSetMap == null )
+        {
+            reportSetMap = new java.util.LinkedHashMap<String, ReportSet>();
+            if ( getReportSets() != null )
+            {
+                for ( java.util.Iterator<ReportSet> i = getReportSets().iterator(); i.hasNext(); )
+                {
+                    ReportSet reportSet = (ReportSet) i.next();
+                    reportSetMap.put( reportSet.getId(), reportSet );
+                }
+            }
+        }
+
+        return reportSetMap;
+    }
+
+    /**
+     * @return the key of the report plugin, ie <code>groupId:artifactId</code>
+     */
+    public String getKey()
+    {
+        return constructKey( groupId, artifactId );
+    }
+
+    /**
+     * @param groupId
+     * @param artifactId
+     * @return the key of the report plugin, ie <code>groupId:artifactId</code>
+     */
+    public static String constructKey( String groupId, String artifactId )
+    {
+        return groupId + ":" + artifactId;
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+    <class java.clone="deep">
+      <name>ReportSet</name>
+      <version>4.0.0+</version>
+      <superClass>ConfigurationContainer</superClass>
+      <description>Represents a set of reports and configuration to be used to generate them.</description>
+      <fields>
+        <field>
+          <name>id</name>
+          <type>String</type>
+          <required>true</required>
+          <description>The unique id for this report set, to be used during POM inheritance and profile injection
+            for merging of report sets.
+          </description>
+          <defaultValue>default</defaultValue>
+        </field>
+        <field>
+          <name>reports</name>
+          <version>4.0.0+</version>
+          <required>true</required>
+          <description>The list of reports from this plugin which should be generated from this set.</description>
+          <association>
+            <type>String</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+    @Override
+    public String toString()
+    {
+        return getId();
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+    <class java.clone="deep">
+      <name>Prerequisites</name>
+      <version>4.0.0+</version>
+      <description>Describes the prerequisites a project can have.</description>
+      <fields>
+        <field>
+          <name>maven</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <defaultValue>2.0</defaultValue>
+          <description><![CDATA[
+            For a plugin project (packaging is <code>maven-plugin</code>), the minimum version of
+            Maven required to use the resulting plugin.<br>
+            In Maven 2, this was also specifying the minimum version of Maven required to build a
+            project, but this usage is <b>deprecated</b> in Maven 3 and not checked any more: use
+            the <a href="https://maven.apache.org/enforcer/enforcer-rules/requireMavenVersion.html">Maven Enforcer Plugin's
+            <code>requireMavenVersion</code> rule</a> instead.
+            ]]>
+          </description>
+          <required>false</required>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>Relocation</name>
+      <version>4.0.0+</version>
+      <description>Describes where an artifact has moved to. If any of the values are omitted, it is
+        assumed to be the same as it was before.</description>
+      <fields>
+        <field>
+          <name>groupId</name>
+          <version>4.0.0+</version>
+          <description>The group ID the artifact has moved to.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>artifactId</name>
+          <version>4.0.0+</version>
+          <description>The new artifact ID of the artifact.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>version</name>
+          <version>4.0.0+</version>
+          <description>The new version of the artifact.</description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>message</name>
+          <version>4.0.0+</version>
+          <description>An additional message to show the user about the move, such as the reason.</description>
+          <type>String</type>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>Extension</name>
+      <version>4.0.0+</version>
+      <description>Describes a build extension to utilise.</description>
+      <fields>
+        <field>
+          <name>groupId</name>
+          <version>4.0.0+</version>
+          <description>The group ID of the extension's artifact.</description>
+          <required>true</required>
+          <type>String</type>
+        </field>
+        <field>
+          <name>artifactId</name>
+          <version>4.0.0+</version>
+          <description>The artifact ID of the extension.</description>
+          <required>true</required>
+          <type>String</type>
+        </field>
+        <field>
+          <name>version</name>
+          <version>4.0.0+</version>
+          <description>The version of the extension.</description>
+          <type>String</type>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+    /**
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    public boolean equals( Object o )
+    {
+        if ( this == o )
+        {
+            return true;
+        }
+
+        if ( !( o instanceof Extension ) )
+        {
+            return false;
+        }
+
+        Extension e = (Extension) o;
+
+        if ( !equal( e.getArtifactId(), getArtifactId() ) )
+        {
+            return false;
+        }
+        else if ( !equal( e.getGroupId(), getGroupId() ) )
+        {
+            return false;
+        }
+        else if ( !equal( e.getVersion(), getVersion() ) )
+        {
+            return false;
+        }
+        return true;
+    }
+
+    private static <T> boolean equal( T obj1, T obj2 )
+    {
+        return ( obj1 != null ) ? obj1.equals( obj2 ) : obj2 == null;
+    }
+
+    /**
+     * @see java.lang.Object#hashCode()
+     */
+    public int hashCode()
+    {
+        int result = 17;
+        result = 37 * result + ( getArtifactId() != null ? getArtifactId().hashCode() : 0 );
+        result = 37 * result + ( getGroupId() != null ? getGroupId().hashCode() : 0 );
+        result = 37 * result + ( getVersion() != null ? getVersion().hashCode() : 0 );
+        return result;
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+    <class locationTracker="locations" java.clone="shallow">
+      <name>InputLocation</name>
+      <version>4.0.0+</version>
+      <fields>
+        <!-- line, column and source fields are auto-generated by Modello -->
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+
+    @Override
+    public String toString()
+    {
+        return getLineNumber() + " : " + getColumnNumber() + ", " + getSource();
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+    <class sourceTracker="source" java.clone="shallow">
+      <name>InputSource</name>
+      <version>4.0.0+</version>
+      <fields>
+        <field>
+          <name>modelId</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>
+            <![CDATA[
+            The identifier of the POM in the format {@code <groupId>:<artifactId>:<version>}.
+            ]]>
+          </description>
+        </field>
+        <field>
+          <name>location</name>
+          <version>4.0.0+</version>
+          <type>String</type>
+          <description>
+            <![CDATA[
+            The path/URL of the POM or {@code null} if unknown.
+            ]]>
+          </description>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>4.0.0+</version>
+          <code>
+            <![CDATA[
+    @Override
+    public String toString()
+    {
+        return getModelId() + " " + getLocation();
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+  </classes>
+</model>
diff --git a/src/site/apt/index.apt b/src/site/apt/index.apt
new file mode 100644
index 0000000..b76417b
--- /dev/null
+++ b/src/site/apt/index.apt
@@ -0,0 +1,38 @@
+~~ 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.
+
+ -----
+ Introduction
+ -----
+ Jason van Zyl
+ Vincent Siveton
+ Hervé Boutemy
+ -----
+ 2011-06-12
+ -----
+
+Maven Build vs Consumer POM Study
+
+  For more details on the intent, see {{{https://cwiki.apache.org/confluence/display/MAVEN/Build+vs+Consumer+POM} Build vs Consumer POM}}
+  proposal in the {{{https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=5964567} Maven Backlog Wiki}}.
+
+* Build POM Model vs Consumer POM Model
+
+   * usual {{{./maven.html}<<Build POM Descriptor>> Reference}}
+
+   * new {{{./maven-consumer.html}<<Consumer POM Descriptor>> Reference}}
+   
\ No newline at end of file
diff --git a/src/site/site.xml b/src/site/site.xml
new file mode 100644
index 0000000..c12e5ec
--- /dev/null
+++ b/src/site/site.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+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.
+-->
+
+<project xmlns="http://maven.apache.org/DECORATION/1.8.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/DECORATION/1.8.0 http://maven.apache.org/xsd/decoration-1.8.0.xsd"
+  name="Maven Consumer Pom Study">
+
+  <bannerLeft>
+    <name>${project.name}</name>
+    <src>https://maven.apache.org/images/apache-maven-project.png</src>
+    <href>https://maven.apache.org/</href>
+  </bannerLeft>
+  <bannerRight>
+    <src>https://maven.apache.org/images/maventxt_logo_200.gif</src>
+  </bannerRight>
+
+  <skin>
+    <groupId>org.apache.maven.skins</groupId>
+    <artifactId>maven-fluido-skin</artifactId>
+    <version>1.7</version>
+  </skin>
+
+  <edit>${project.scm.url}</edit>
+
+  <body>
+    <breadcrumbs>
+      <item name="Studies" href="../" />
+      <item name="Maven Consumer POM" href="./" />
+    </breadcrumbs>
+
+    <menu name="Overview">
+      <item name="Introduction" href="index.html"/>
+    </menu>
+
+    <menu name="Descriptors Reference">
+      <item name="Build POM" href="./maven.html"/>
+      <item name="Consumer POM" href="./maven-consumer.html"/>
+    </menu>
+
+    <menu ref="reports"/>
+  </body>
+</project>
\ No newline at end of file

-- 
To stop receiving notification emails like this one, please contact
hboutemy@apache.org.