<?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 project.directory property), or just parent value if
            project's <code>child.project.url.inherit.append.path="false"</code>
            ]]>
          </description>
          <type>String</type>
        </field>
        <field xml.attribute="true" xml.tagName="child.project.url.inherit.append.path">
          <name>childProjectUrlInheritAppendPath</name>
          <version>4.0.0+</version>
          <description>
            <![CDATA[
            When childs inherit from project's url, append path or not? Note: While the type
            of this field is <code>String</code> for technical reasons, the semantic type is actually
            <code>Boolean</code>
            <br><b>Default value is</b>: <code>true</code>
            <br><b>Since</b>: Maven 3.6.1
            ]]>
          </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>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[

    public boolean isChildProjectUrlInheritAppendPath()
    {
        return ( childProjectUrlInheritAppendPath != null ) ? Boolean.parseBoolean( childProjectUrlInheritAppendPath ) : true;
    }

    public void setChildProjectUrlInheritAppendPath( boolean childProjectUrlInheritAppendPath )
    {
        this.childProjectUrlInheritAppendPath = String.valueOf( childProjectUrlInheritAppendPath );
    }

            ]]>
          </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 project.directory property), or just parent value if
            scm's <code>child.scm.connection.inherit.append.path="false"</code>
            ]]>
          </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 project.directory property), or just parent value if
            scm's <code>child.scm.developerConnection.inherit.append.path="false"</code>
            ]]>
          </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 project.directory property), or just parent value if
            scm's <code>child.scm.url.inherit.append.path="false"</code>
            ]]>
          </description>
          <type>String</type>
        </field>
        <field xml.attribute="true" xml.tagName="child.scm.connection.inherit.append.path">
          <name>childScmConnectionInheritAppendPath</name>
          <version>4.0.0+</version>
          <description>
            <![CDATA[
            When childs inherit from scm connection, append path or not? Note: While the type
            of this field is <code>String</code> for technical reasons, the semantic type is actually
            <code>Boolean</code>
            <br><b>Default value is</b>: <code>true</code>
            <br><b>Since</b>: Maven 3.6.1
            ]]>
          </description>
          <type>String</type>
        </field>
        <field xml.attribute="true" xml.tagName="child.scm.developerConnection.inherit.append.path">
          <name>childScmDeveloperConnectionInheritAppendPath</name>
          <version>4.0.0+</version>
          <description>
            <![CDATA[
            When childs inherit from scm developer connection, append path or not? Note: While the type
            of this field is <code>String</code> for technical reasons, the semantic type is actually
            <code>Boolean</code>
            <br><b>Default value is</b>: <code>true</code>
            <br><b>Since</b>: Maven 3.6.1
            ]]>
          </description>
          <type>String</type>
        </field>
        <field xml.attribute="true" xml.tagName="child.scm.url.inherit.append.path">
          <name>childScmUrlInheritAppendPath</name>
          <version>4.0.0+</version>
          <description>
            <![CDATA[
            When childs inherit from scm url, append path or not? Note: While the type
            of this field is <code>String</code> for technical reasons, the semantic type is actually
            <code>Boolean</code>
            <br><b>Default value is</b>: <code>true</code>
            <br><b>Since</b>: Maven 3.6.1
            ]]>
          </description>
          <type>String</type>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[

    public boolean isChildScmConnectionInheritAppendPath()
    {
        return ( childScmConnectionInheritAppendPath != null ) ? Boolean.parseBoolean( childScmConnectionInheritAppendPath ) : true;
    }

    public void setChildScmConnectionInheritAppendPath( boolean childScmConnectionInheritAppendPath )
    {
        this.childScmConnectionInheritAppendPath = String.valueOf( childScmConnectionInheritAppendPath );
    }

    public boolean isChildScmDeveloperConnectionInheritAppendPath()
    {
        return ( childScmDeveloperConnectionInheritAppendPath != null ) ? Boolean.parseBoolean( childScmDeveloperConnectionInheritAppendPath ) : true;
    }

    public void setChildScmDeveloperConnectionInheritAppendPath( boolean childScmDeveloperConnectionInheritAppendPath )
    {
        this.childScmDeveloperConnectionInheritAppendPath = String.valueOf( childScmDeveloperConnectionInheritAppendPath );
    }

    public boolean isChildScmUrlInheritAppendPath()
    {
        return ( childScmUrlInheritAppendPath != null ) ? Boolean.parseBoolean( childScmUrlInheritAppendPath ) : true;
    }

    public void setChildScmUrlInheritAppendPath( boolean childScmUrlInheritAppendPath )
    {
        this.childScmUrlInheritAppendPath = String.valueOf( childScmUrlInheritAppendPath );
    }

            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </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 project.directory property), or just parent value if
            site's <code>child.site.url.inherit.append.path="false"</code>
            ]]>
          </description>
          <type>String</type>
        </field>
        <field xml.attribute="true" xml.tagName="child.site.url.inherit.append.path">
          <name>childSiteUrlInheritAppendPath</name>
          <version>4.0.0+</version>
          <description>
            <![CDATA[
            When childs inherit from distribution management site url, append path or not? Note: While the type
            of this field is <code>String</code> for technical reasons, the semantic type is actually
            <code>Boolean</code>
            <br><b>Default value is</b>: <code>true</code>
            <br><b>Since</b>: Maven 3.6.1
            ]]>
          </description>
          <type>String</type>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[

    public boolean isChildSiteUrlInheritAppendPath()
    {
        return ( childSiteUrlInheritAppendPath != null ) ? Boolean.parseBoolean( childSiteUrlInheritAppendPath ) : true;
    }

    public void setChildSiteUrlInheritAppendPath( boolean childSiteUrlInheritAppendPath )
    {
        this.childSiteUrlInheritAppendPath = String.valueOf( childSiteUrlInheritAppendPath );
    }

            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </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 The group ID of the plugin in the repository
     * @param artifactId The artifact ID of the reporting plugin in the repository
     * @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 The group ID of the plugin in the repository
     * @param artifactId The artifact ID of the reporting plugin in the repository
     * @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>
