<?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/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://codehaus-plexus.github.io/MODELLO/2.0.0 https://codehaus-plexus.github.io/modello/xsd/modello-2.0.0.xsd"
  xml.namespace="http://maven.apache.org/POM/${version}"
  xml.schemaLocation="https://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>
      <li><a href="https://maven.apache.org/xsd/maven-4.1.0.xsd">https://maven.apache.org/xsd/maven-4.1.0.xsd</a> for Maven 4.0.</li>
    </ul>
    ]]>
  </description>
  <defaults>
    <default>
      <key>package</key>
      <value>org.apache.maven.model</value>
    </default>
  </defaults>
  <classes>
    <class rootElement="true" xml.tagName="project">
      <name>Model</name>
      <superClass>ModelBase</superClass>
      <description>
        The {@code &lt;project>} element is the root of the descriptor.
        The following table lists all of the possible child elements.
      </description>
      <version>3.0.0+</version>
      <fields>

        <field xml.transient="true">
          <name>pomFile</name>
          <version>4.1.0+</version>
          <required>false</required>
          <description>Originating POM file</description>
          <type>DOM</type> <!-- This is transformed to a File/Path in the template -->
        </field>

        <!-- ====================================================================== -->
        <!-- 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>
            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}).
          </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>
            The type of artifact this project produces, for example {@code jar},
              {@code war},
              {@code ear},
              {@code pom}.
            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 website. 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 website,
            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.
            <p><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"}</p>
            ]]>
          </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 children inherit from project's url, append path or not? Note: While the type
            of this field is {@code String} for technical reasons, the semantic type is actually
            {@code Boolean}
            <p><b>Default value is</b>: {@code true}</p>
            @since Maven 3.6.1
            ]]>
          </description>
          <type>String</type>
        </field>
        <field xml.attribute="true" xml.tagName="root">
          <name>root</name>
          <version>4.1.0+</version>
          <description>
            Indicates that this project is the root project, located in the upper directory of the source tree.
            This is the directory which may contain the .mvn directory.

            @since Maven 4.0.0
          </description>
          <type>boolean</type>
          <defaultValue>false</defaultValue>
        </field>
        <field xml.attribute="true" xml.tagName="preserve.model.version">
          <name>preserveModelVersion</name>
          <version>4.1.0+</version>
          <description>
            Indicates if the build POM for this project should be preserved or downgraded to the lowest
            compatible version.
            @since Maven 4.0.0
          </description>
          <type>boolean</type>
          <defaultValue>false</defaultValue>
        </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 the licenses for this project.
            Each license is described by a {@code license} 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/4.0.99</version>
          <code>
            <![CDATA[
    /**
     * 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).
     */
    @Deprecated
    public java.io.File getPomFile() {
        return (getDelegate().getPomFile() != null) ? getDelegate().getPomFile().toFile() : null;
    }

    @Deprecated
    public void setPomFile(java.io.File pomFile) {
        update( getDelegate().withPomFile(pomFile != null ? pomFile.toPath() : null));
    }

    /**
     * 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.nio.file.Path getPomPath() {
        return (getDelegate().getPomFile() != null) ? getDelegate().getPomFile() : null;
    }

    public void setPomPath(java.nio.file.Path pomPath) {
        update( getDelegate().withPomFile(pomPath));
    }

    public void setModelEncoding(String modelEncoding) {
        update(getDelegate().with().modelEncoding(modelEncoding).build());
    }

    /**
     * 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).
     */
    @Deprecated
    public java.io.File getProjectDirectory() {
        return (getDelegate().getProjectDirectory() != null) ? getDelegate().getProjectDirectory().toFile() : 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.nio.file.Path getProjectDirectoryPath() {
        return getDelegate().getProjectDirectory();
    }

    /**
     * @return the model id as {@code groupId:artifactId:packaging:version}
     */
    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();
    }

    public boolean isChildProjectUrlInheritAppendPath() {
        return getDelegate().isChildProjectUrlInheritAppendPath();
    }

    public void setChildProjectUrlInheritAppendPath(boolean childProjectUrlInheritAppendPath) {
        delegate = getDelegate().withChildProjectUrlInheritAppendPath(String.valueOf(childProjectUrlInheritAppendPath));
    }

            ]]>
          </code>
        </codeSegment>
        <codeSegment>
          <version>4.1.0+</version>
          <code>
            <![CDATA[
    /**
     * 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 Path getProjectDirectory() {
        return (pomFile != null) ? pomFile.getParent() : null;
    }

    /**
     * @return the model id as {@code groupId:artifactId:packaging:version}
     */
    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();
    }

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

            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>
    <class>
      <name>ModelBase</name>
      <version>3.0.0+</version>
      <description>
        Base class for the {@code Model} and the {@code Profile} 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>
            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>value&lt;/name>}.
          </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>
            This element describes all 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 &lt;a href="https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html">Dependency mechanism&lt;/a>
          </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>
            @deprecated Now ignored by Maven.
          </description>
          <type>DOM</type>
        </field>
        <field>
          <name>reporting</name>
          <version>4.0.0+</version>
          <description>
            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}.
            All the reports will be included in the navigation bar for browsing.
          </description>
          <association>
            <type>Reporting</type>
          </association>
        </field>
      </fields>
    </class>
    <class>
      <name>PluginContainer</name>
      <version>3.0.0+</version>
      <description>Contains the plugins information 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/4.0.99</version>
          <code>
            <![CDATA[
    /**
     * Reset the {@code pluginsMap} field to {@code null}
     */
    public void flushPluginMap() {
    }

    /**
     * @return a Map of plugins field with {@code Plugins#getKey()} as key
     * @see Plugin#getKey()
     */
    public Map<String, Plugin> getPluginsAsMap() {
        return getPlugins().stream().collect(Collectors.toMap(plugin -> plugin.getKey(), plugin -> plugin));
    }
            ]]>
          </code>
        </codeSegment>
        <codeSegment>
          <version>4.1.0+</version>
          <code>
            <![CDATA[
    volatile Map<String, Plugin> pluginMap;

    /**
     * @return a Map of plugins field with {@code Plugins#getKey()} as key
     * @see Plugin#getKey()
     */
    public Map<String, Plugin> getPluginsAsMap() {
        if (pluginMap == null) {
            synchronized (this) {
                if (pluginMap == null) {
                    pluginMap = ImmutableCollections.copy(plugins.stream().collect(
                            java.util.stream.Collectors.toMap(
                                Plugin::getKey, java.util.function.Function.identity())));
                }
            }
        }
        return pluginMap;
    }
            ]]>
          </code>
        </codeSegment>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[
     @Override
     public String toString()
     {
         return "PluginContainer {}";
     }
            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>
    <class>
      <name>PluginConfiguration</name>
      <version>3.0.0+</version>
      <superClass>PluginContainer</superClass>
      <description>Contains the plugins management information 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>
      <codeSegments>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[
    /**
     * @see java.lang.Object#toString()
     */
    public String toString()
    {
        return "PluginConfiguration {" + super.toString() + "}";
    }
            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>
    <class xdoc.anchorName="profile_build">
      <name>BuildBase</name>
      <version>3.0.0+</version>
      <superClass>PluginConfiguration</superClass>
      <description>Build configuration in a profile.</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>
            This element describes all 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}.
          </description>
          <association>
            <type>Resource</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>testResources</name>
          <version>4.0.0+</version>
          <description>
            This element describes all the classpath resources such as properties
            files associated with a project's unit tests.
            The default value is {@code src/test/resources}.
          </description>
          <association>
            <type>Resource</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>directory</name>
          <version>4.0.0+</version>
          <description>
            The directory where all files generated by the build are placed.
            The default value is {@code target}.
          </description>
          <type>String</type>
        </field>
        <field>
          <name>finalName</name>
          <version>4.0.0+</version>
          <description>
            The filename (excluding the extension, and with no path information) that
            the produced artifact will be called.
            The default value is {@code ${artifactId}-${version}}.
          </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>
      <codeSegments>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[
    /**
     * @see java.lang.Object#toString()
     */
    public String toString()
    {
        return "BuildBase {" + super.toString() + "}";
    }
            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>
    <class>
      <name>Build</name>
      <version>3.0.0+</version>
      <superClass>BuildBase</superClass>
      <description>
        The {@code &lt;build>} element contains information 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>
            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}.
          </description>
          <type>String</type>
        </field>
        <field>
          <name>scriptSourceDirectory</name>
          <version>4.0.0+</version>
          <required>true</required>
          <description>
            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}.
          </description>
          <type>String</type>
        </field>
        <field>
          <name>testSourceDirectory</name>
          <version>4.0.0+</version>
          <required>true</required>
          <description>
            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}.
          </description>
          <type>String</type>
        </field>
        <field>
          <name>outputDirectory</name>
          <version>4.0.0+</version>
          <description>
            The directory where compiled application classes are placed.
            The default value is {@code target/classes}.
          </description>
          <type>String</type>
        </field>
        <field>
          <name>testOutputDirectory</name>
          <version>4.0.0+</version>
          <description>
            The directory where compiled test classes are placed.
            The default value is {@code target/test-classes}.
          </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>
      <codeSegments>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[
    /**
     * @see java.lang.Object#toString()
     */
    public String toString()
    {
        return "Build {" + super.toString() + "}";
    }
            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>
    <class>
      <name>CiManagement</name>
      <version>4.0.0+</version>
      <description>
        <![CDATA[
        The {@code <ciManagement>} element contains information required to the
        continuous integration system of the project.
        ]]>
      </description>
      <fields>
        <field>
          <name>system</name>
          <version>4.0.0+</version>
          <description>
            The name of the continuous integration system, e.g. {@code continuum}.
          </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>
      <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>
            @deprecated 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>
      <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>
            The roles the contributor plays in the project. Each role is described by a
            {@code role} 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>
      <codeSegments>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[
    /**
     * @see java.lang.Object#toString()
     */
    public String toString()
    {
        return "Contributor {name=" + getName() + ", email=" + getEmail() + "}";
    }
            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>
    <class>
      <name>Dependency</name>
      <version>3.0.0+</version>
      <description>
        <![CDATA[
        The {@code <dependency>} 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}.
            ]]>
          </description>
          <type>String</type>
        </field>
        <field>
          <name>artifactId</name>
          <version>3.0.0+</version>
          <required>true</required>
          <description>
            The unique id for an artifact produced by the project group, e.g.
            {@code maven-artifact}.
          </description>
          <type>String</type>
        </field>
        <field>
          <name>version</name>
          <version>3.0.0+</version>
          <description>
            The version of the dependency, e.g. {@code 3.2.1}. Since 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, that will be mapped to a file extension, an optional classifier, and a few other attributes.
            Some examples are {@code jar}, {@code war}, {@code ejb-client}
            and {@code test-jar}: see <a href="../maven-core/artifact-handlers.html">default
            artifact handlers</a> for a list. New types can be defined by extensions, 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} and {@code javadoc}:
            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} and {@code jdk15}.</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 runtime},
            {@code test}, {@code system}, and {@code provided}. 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}.
            ]]>
          </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}}.
            ]]>
          </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>
            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} for technical reasons, the semantic type is actually
            {@code Boolean}. Default value is {@code false}.
          </description>
          <type>String</type>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[
    public boolean isOptional() {
        return (getOptional() != null) ? Boolean.parseBoolean(getOptional()) : false;
    }

            ]]>
          </code>
        </codeSegment>
        <codeSegment>
          <version>4.0.0/4.0.99</version>
          <code>
            <![CDATA[
    public void setOptional(boolean optional) {
        setOptional(String.valueOf(optional));
    }

            ]]>
          </code>
        </codeSegment>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[
    /**
     * @see java.lang.Object#toString()
     */
    public String toString() {
        return "Dependency {groupId=" + getGroupId() + ", artifactId=" + getArtifactId() + ", version=" + getVersion() + ", type=" + getType() + "}";
    }
            ]]>
          </code>
        </codeSegment>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[
    private volatile String managementKey;

    /**
     * @return the management key as {@code groupId:artifactId:type}
     */
    public String getManagementKey() {
        if (managementKey == null) {
            managementKey = getGroupId() + ":" + getArtifactId() + ":" + getType() + (getClassifier() != null ? ":" + getClassifier() : "");
        }
        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>
      <codeSegments>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[
    /**
     * @see java.lang.Object#toString()
     */
    public String toString() {
        return "Developer {id=" + getId() + ", " + super.toString() + "}";
    }
            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>
    <class>
      <name>Exclusion</name>
      <version>4.0.0+</version>
      <description>
        <![CDATA[
        The {@code <exclusion>} element contains information required to exclude
        an artifact to the project.
        <p>
        The {@code groupId} and {@code artifactId} fields are interpreted as glob patterns.

        @see java.nio.file.FileSystem#getPathMatcher
        ]]>
      </description>
      <fields>
        <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>
        <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>
      </fields>
    </class>
    <class>
      <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>
      <codeSegments>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[
    /**
     * @see java.lang.Object#toString()
     */
    public String toString()
    {
        return "IssueManagement {system=" + getSystem() + ", url=" + getUrl() + "}";
    }
            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>
    <class>
      <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>
            Where to deploy snapshots of artifacts to. If not given, it defaults to the
            {@code repository} 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>
            The URL of the project's download page. If not given users will be
            referred to the homepage given by {@code url}.
            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>
            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 repository. Valid values are: {@code none} (default),
            {@code converted} (repository manager converted this from an Maven 1 POM),
            {@code partner}
            (directly synced from a partner Maven 2 repository), {@code deployed} (was deployed from a Maven 2
            instance), {@code verified} (has been hand verified as correct and final).
          </description>
          <required>false</required>
          <type>String</type>
        </field>
      </fields>
    </class>
    <class>
      <name>License</name>
      <description>Describes the licenses for this project. This is used to generate the license
        page of the project's website, 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>
      <codeSegments>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[
    /**
     * @see java.lang.Object#toString()
     */
    public String toString()
    {
        return "License {name=" + getName() + ", url=" + getUrl() + "}";
    }
            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>
    <class>
      <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>
            The name of the mailing list.
          </description>
          <type>String</type>
        </field>
        <field>
          <name>subscribe</name>
          <version>3.0.0+</version>
          <description>
            The email address or link that can be used to subscribe to
            the mailing list.  If this is an email address, a
            {@code mailto:} 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>
            The email address or link that can be used to unsubscribe to
            the mailing list.  If this is an email address, a
            {@code mailto:} 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>
            The email address or link that can be used to post to
            the mailing list.  If this is an email address, a
            {@code mailto:} 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>
      <codeSegments>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[
    /**
     * @see java.lang.Object#toString()
     */
    public String toString()
    {
        return "MailingList {name=" + getName() + ", archive=" + getArchive() + "}";
    }
            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>
    <class>
      <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>
      <codeSegments>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[
    /**
     * @see java.lang.Object#toString()
     */
    public String toString()
    {
        return "Organization {name=" + getName() + ", url=" + getUrl() + "}";
    }
            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>
    <class>
      <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>
            A list of patterns to include, e.g. {@code **&amp;#47;*.xml}.
          </description>
          <association>
            <type>String</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>excludes</name>
          <version>3.0.0+</version>
          <description>
            A list of patterns to exclude, e.g. {@code **&amp;#47;*.xml}
          </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() {
        return "PatternSet [" +
            "includes: {" + getIncludes().stream().collect(java.util.stream.Collectors.joining(", ")) + "}, " +
            "excludes: {" + getExcludes().stream().collect(java.util.stream.Collectors.joining(", ")) + "}]";
    }
            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>
    <class>
      <name>Parent</name>
      <version>4.0.0+</version>
      <description>
        <![CDATA[
        The {@code <parent>} element contains information required to locate the parent project from which
        this project will inherit from.
        <p><strong>Note:</strong> The children of this element are not interpolated and must be given as literal values.</p>
        ]]>
      </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>
            The relative path of the parent {@code pom.xml} file within the checkout.
            If not specified, it defaults to {@code ../pom.xml}.
            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} 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>..</defaultValue>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[
    /**
     * @return the id as {@code groupId:artifactId:version}
     */
    public String getId() {
        return getGroupId() + ":" + getArtifactId() + ":pom:" + getVersion();
    }

    @Override
    public String toString() {
        return getId();
    }
            ]]>
          </code>
        </codeSegment>
      </codeSegments>

    </class>
    <class>
      <name>Scm</name>
      <version>4.0.0+</version>
      <description>
        The {@code &lt;scm>} element contains information 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.
            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"}
            @see <a href="https://maven.apache.org/scm/scm-url-format.html">URL format</a>
            @see <a href="https://maven.apache.org/scm/scms-overview.html">list of supported SCMs</a>
            ]]>
          </description>
          <type>String</type>
        </field>
        <field>
          <name>developerConnection</name>
          <version>4.0.0+</version>
          <description>
            <![CDATA[
            Just like {@code connection}, but for developers, i.e. this scm connection
            will not be read only.
            <p><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"}.</p>
            ]]>
          </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.
            <p><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"}</p>
            ]]>
          </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 children inherit from scm connection, append path or not? Note: While the type
            of this field is {@code String} for technical reasons, the semantic type is actually
            {@code Boolean}
            <p><b>Default value is</b>: {@code true}</p>
            @since 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 children inherit from scm developer connection, append path or not? Note: While the type
            of this field is {@code String} for technical reasons, the semantic type is actually
            {@code Boolean}
            <p><b>Default value is</b>: {@code true}</p>
            @since 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 children inherit from scm url, append path or not? Note: While the type
            of this field is {@code String} for technical reasons, the semantic type is actually
            {@code Boolean}
            <br><b>Default value is</b>: {@code true}
            @since Maven 3.6.1
            ]]>
          </description>
          <type>String</type>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[

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

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

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

            ]]>
          </code>
        </codeSegment>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[
    /**
     * @see java.lang.Object#toString()
     */
    public String toString() {
        return "Scm {connection=" + getConnection() + "}";
    }
            ]]>
          </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>
            Describe the resource target path. The path is relative to the target/classes
            directory (i.e. {@code ${project.build.outputDirectory}}).
            For example, if you want that resource to appear in a specific package
            ({@code org.apache.maven.messages}), you must specify this
            element with this value: {@code org/apache/maven/messages}.
            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>
            Whether resources are filtered to replace tokens with parameterised values or not.
            The values are taken from the {@code properties} element and from the
            properties in the files listed in the {@code filters} element. Note: While the type
            of this field is {@code String} for technical reasons, the semantic type is actually
            {@code Boolean}. Default value is {@code false}.
          </description>
          <type>String</type>
        </field>
        <field xml.transient="true">
          <name>mergeId</name>
          <version>4.0.0+</version>
          <description>
            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[
    public boolean isFiltering() {
        return (getFiltering() != null) ? Boolean.parseBoolean(getFiltering()) : false;
    }
            ]]>
          </code>
        </codeSegment>
        <codeSegment>
          <version>4.0.0/4.0.99</version>
          <code>
            <![CDATA[
    public void setFiltering(boolean filtering) {
        setFiltering(String.valueOf(filtering));
    }
            ]]>
          </code>
        </codeSegment>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[
    /**
     * @see java.lang.Object#toString()
     */
    public String toString() {
        return "Resource {targetPath: " + getTargetPath() + ", filtering: " + isFiltering() + ", " + super.toString() + "}";
    }
            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>
    <class>
      <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>
            A unique identifier for a repository. This is used to match the repository
            to configuration in the {@code settings.xml} 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>
            The url of the repository, in the form {@code protocol://hostname/path}.
          </description>
          <type>String</type>
        </field>
        <field>
          <name>layout</name>
          <version>4.0.0+</version>
          <description>
            The type of layout this repository uses for locating and storing artifacts -
            can be {@code legacy} or {@code default}.
          </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 xdoc.anchorName="deployment_repository">
      <name>DeploymentRepository</name>
      <superClass>Repository</superClass>
      <version>4.0.0+</version>
      <description>Deployment repository contains the information needed for deploying to the remote
        repository, which adds uniqueVersion property to usual repositories for download.</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>
      <name>RepositoryPolicy</name>
      <version>4.0.0+</version>
      <description>Download policy.</description>
      <fields>
        <field>
          <name>enabled</name>
          <version>4.0.0+</version>
          <description>
            Whether to use this repository for downloading this type of artifact. Note: While the type
            of this field is {@code String} for technical reasons, the semantic type is actually
            {@code Boolean}. Default value is {@code true}.
          </description>
          <type>String</type>
        </field>
        <field>
          <name>updatePolicy</name>
          <version>4.0.0+</version>
          <description>
            The frequency for downloading updates - can be
            {@code always},
            {@code daily} (default),
            {@code interval:XXX} (in minutes) or
            {@code never} (only if it doesn't exist locally).
          </description>
          <type>String</type>
        </field>
        <field>
          <name>checksumPolicy</name>
          <version>4.0.0+</version>
          <description>
            What to do when verification of an artifact checksum fails. Valid values are
            {@code ignore},
            {@code fail} (default for Maven 4 and above) or
            {@code warn} (default for Maven 2 and 3).
          </description>
          <type>String</type>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[
    public boolean isEnabled() {
        return (getEnabled() != null) ? Boolean.parseBoolean(getEnabled()) : true;
    }

            ]]>
          </code>
        </codeSegment>
        <codeSegment>
          <version>4.0.0/4.0.99</version>
          <code>
            <![CDATA[
    public void setEnabled(boolean enabled) {
        setEnabled(String.valueOf(enabled));
    }

            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>

    <!--@todo find better solution for management of site deployments -->
    <class>
      <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>
            A unique identifier for a deployment location. This is used to match the
            site to configuration in the {@code settings.xml} 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}.
            <p><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"}.</p>
            ]]>
          </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 children inherit from distribution management site url, append path or not? Note: While the type
            of this field is {@code String} for technical reasons, the semantic type is actually
            {@code Boolean}
            <p><b>Default value is</b>: {@code true}</p>
            @since Maven 3.6.1
            ]]>
          </description>
          <type>String</type>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[

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

            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>

    <class>
      <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>
            Whether any configuration should be propagated to child POMs. Note: While the type
            of this field is {@code String} for technical reasons, the semantic type is actually
            {@code Boolean}. Default value is {@code true}.
          </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"} 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}
            or {@code combine.self} attributes to the children of the configuration element:</p>
            <ul>
            <li>{@code combine.children}: available values are {@code merge} (default) and {@code append},</li>
            <li>{@code combine.self}: available values are {@code merge} (default) and {@code override}.</li>
            </ul>

            @see <a href="https://maven.apache.org/pom.html#Plugins">POM Reference documentation</a>
            @see <a href="https://codehaus-plexus.github.io/plexus-utils/apidocs/org/codehaus/plexus/util/xml/Xpp3DomUtils.html">Xpp3DomUtils</a>
            ]]>
          </description>
          <name>configuration</name>
          <type>DOM</type>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[
    public boolean isInherited() {
        return ( getInherited() != null ) ? Boolean.parseBoolean( getInherited() ) : true;
    }

            ]]>
          </code>
        </codeSegment>
        <codeSegment>
          <version>4.0.0/4.0.99</version>
          <code>
            <![CDATA[
    @Deprecated
    public void unsetInheritanceApplied() {
    }

            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>
    <class>
      <name>Plugin</name>
      <version>4.0.0+</version>
      <superClass>ConfigurationContainer</superClass>
      <description>
        The {@code &lt;plugin>} element contains information 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>
            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} for technical reasons, the semantic type is actually
            {@code Boolean}. Default value is {@code false}.
          </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>goals</name>
          <version>4.0.0</version>
          <description>
            @deprecated Unused by Maven.
          </description>
          <type>DOM</type>
        </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>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[
    public boolean isExtensions() {
        return (getExtensions() != null) ? Boolean.parseBoolean(getExtensions()) : false;
    }
            ]]>
          </code>
        </codeSegment>
        <codeSegment>
          <version>4.0.0/4.0.99</version>
          <code>
            <![CDATA[
    public void setExtensions(boolean extensions) {
        setExtensions(String.valueOf(extensions));
    }

    /**
     * Reset the {@code executionMap} field to {@code null}
     */
     @Deprecated
    public void flushExecutionMap() {
    }

    /**
     * @return a Map of executions field with {@code PluginExecution#getId()} as key
     * @see PluginExecution#getId()
     */
    public Map<String, PluginExecution> getExecutionsAsMap() {
        return getExecutions().stream().collect(Collectors.toMap(exec -> exec.getId(), exec -> exec));
    }
            ]]>
          </code>
        </codeSegment>
        <codeSegment>
          <version>4.0.0+</version>
          <code>
            <![CDATA[
    /**
     * Gets the identifier of the plugin.
     *
     * @return the plugin id in the form {@code <groupId>:<artifactId>:<version>}, never {@code null}
     */
    public String getId() {
        return new StringBuilder(128)
            .append((getGroupId() == null) ? "[unknown-group-id]" : getGroupId())
            .append(":")
            .append((getArtifactId() == null) ? "[unknown-artifact-id]" : getArtifactId())
            .append(":")
            .append((getVersion() == null) ? "[unknown-version]" : getVersion())
            .toString();
    }

    /**
     * @return the key of the plugin, ie {@code groupId:artifactId}
     */
    public String getKey() {
        return constructKey(getGroupId(), getArtifactId());
    }

    /**
     * @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}
     */
    public static String constructKey(String groupId, String artifactId) {
        return groupId + ":" + artifactId;
    }

            ]]>
          </code>
        </codeSegment>
        <codeSegment>
          <version>4.1.0+</version>
          <code>
            <![CDATA[
    /**
     * @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>
        The {@code @lt;execution>} element contains information 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/4.0.99</version>
          <type>int</type>
          <description>
            <![CDATA[
            The priority of this execution compared to other executions which are bound to the same phase.
            <p><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.</p>
            ]]>
          </description>
        </field>
        <field>
          <name>priority</name>
          <version>4.1.0+</version>
          <type>int</type>
          <description>
            The priority of this execution compared to other executions which are bound to the same phase.
            Executions derived from the default lifecycle have a negative priority by default so that they are executed
            before any custom plugin executions.
            @since Maven 4.0.0
          </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>
      <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>
      <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>
            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} for technical reasons, the semantic type is actually
            {@code Boolean}. Default value is {@code false}.
          </description>
        </field>
        <field>
          <name>outputDirectory</name>
          <version>4.0.0+</version>
          <type>String</type>
          <description>
            Where to store all the generated reports. The default is
            {@code ${project.build.directory}/site}.
          </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 (getExcludeDefaults() != null) ? Boolean.parseBoolean(getExcludeDefaults()) : false;
    }

            ]]>
          </code>
        </codeSegment>
        <codeSegment>
          <version>4.0.0/4.0.99</version>
          <code>
            <![CDATA[
    public void setExcludeDefaults(boolean excludeDefaults) {
        setExcludeDefaults(String.valueOf(excludeDefaults));
    }

    /**
     * Reset the <code>reportPluginMap</code> field to <code>null</code>
     */
    @Deprecated
    public void flushReportPluginMap() {
    }

    /**
     * @return a Map of plugins field with <code>ReportPlugin#getKey()</code> as key
     * @see org.apache.maven.model.ReportPlugin#getKey()
     */
    public java.util.Map<String, ReportPlugin> getReportPluginsAsMap() {
        return getPlugins().stream().collect(Collectors.toMap(report -> report.getKey(), report -> report));
    }
            ]]>
          </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/4.0.99</version>
          <code>
            <![CDATA[
    public static final String SOURCE_POM = "pom";

    public static final String SOURCE_SETTINGS = "settings.xml";

    public void setSource(String source) {
        getDelegate().setSource(source);
    }

    public String getSource() {
        return getDelegate().getSource();
    }

    /**
     * @see java.lang.Object#toString()
     */
    public String toString() {
        return "Profile {id: " + getId() + ", source: " + getSource() + "}";
    }
            ]]>
          </code>
        </codeSegment>
        <codeSegment>
          <version>4.1.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>
      <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>
            Specifies that this profile will be activated when a matching JDK is detected.
            For example, {@code 1.4} only activates on JDKs versioned 1.4,
            while {@code !1.4} matches any JDK that is not version 1.4. Ranges are supported too:
            {@code [1.5,)} 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 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>
        <field>
          <name>packaging</name>
          <version>4.1.0+</version>
          <type>String</type>
          <description>Specifies that this profile will be activated based on the project's packaging.</description>
        </field>
        <!--
        This could be included once we teach Maven to deal with multiple versions of the model
        <field>
          <name>custom</name>
          <version>4.1.0+</version>
          <description>Describes a custom profile activation trigger, brought in via build
            extension.</description>
          <association>
            <type>ActivationCustom</type>
          </association>
        </field>
        -->
      </fields>
    </class>
    <class>
      <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>
      <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>
            The name of the operating system to be used to activate the profile. This must be an exact match
            of the {@code ${os.name}} Java property, such as {@code Windows XP}.
          </description>
        </field>
        <field>
          <name>family</name>
          <version>4.0.0+</version>
          <type>String</type>
          <description>
            The general family of the OS to be used to activate the profile, such as
            {@code windows} or {@code unix}.
          </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>
      <name>ActivationFile</name>
      <version>4.0.0+</version>
      <description>This is the file specification used to activate the profile. The {@code missing} 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} will test for the existence of the file and if it is
        there, the profile will be activated.
        &lt;p>Variable interpolation for these file specifications is limited to {@code ${project.basedir}},
        system properties and user properties.&lt;/p></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.1.0+</version>
      <description>This activation allows users to specify their own custom trigger for a profile.</description>
      <fields>
        <field>
          <name>configuration</name>
          <version>4.1.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.1.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" xdoc.anchorName="report_plugin" java.clone="deep">
      <name>ReportPlugin</name>
      <version>4.0.0+</version>
      <superClass>ConfigurationContainer</superClass>
      <description>
        <![CDATA[
        The {@code <plugin>} element in {@code <reporting><plugins>} contains information 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. Starting with Maven 3, if no version is defined explicitly,
            version is searched in {@code build/plugins} then in {@code build/pluginManagement}.
          </description>
          <type>String</type>
        </field>
        <field>
          <name>reportSets</name>
          <version>4.0.0+</version>
          <description>
            Multiple specifications of a set of reports, each having (possibly) different
            configuration. This is the reporting parallel to an {@code execution} 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} field to {@code null}
     */
    public void flushReportSetMap() {
        this.reportSetMap = null;
    }

    /**
     * @return a Map of reportSets field with {@code ReportSet#getId()} as key
     * @see 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}
     */
    public String getKey() {
        return constructKey(getGroupId(), getArtifactId());
    }

    /**
     * @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}
     */
    public static String constructKey(String groupId, String artifactId) {
        return groupId + ":" + artifactId;
    }
            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>
    <class>
      <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>
      <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}), 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} rule</a> instead.
            ]]>
          </description>
          <required>false</required>
        </field>
      </fields>
    </class>
    <class>
      <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>
      <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>
        <field>
          <name>configuration</name>
          <version>4.1.0+</version>
          <description>
            The configuration of the extension.
            @since Maven 4.0.0
          </description>
          <type>DOM</type>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>4.1.0+</version>
          <code>
            <![CDATA[
    /**
     * @see java.lang.Object#equals(java.lang.Object)
     */
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        } else if (!(o instanceof Extension)) {
            return false;
        } else {
            Extension e = (Extension) o;
            return java.util.Objects.equals(e.getArtifactId(), getArtifactId())
                && java.util.Objects.equals(e.getGroupId(), getGroupId())
                && java.util.Objects.equals(e.getVersion(), getVersion());
        }
    }

    /**
     * @see java.lang.Object#hashCode()
     */
    public int hashCode() {
        return java.util.Objects.hash(getArtifactId(), getGroupId(), getVersion());
    }
            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>
    <class locationTracker="locations">
      <name>InputLocation</name>
      <version>4.0.0/4.0.99</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">
      <name>InputSource</name>
      <version>4.0.0/4.0.99</version>
      <fields>
        <field>
          <name>modelId</name>
          <version>4.0.0+</version>
          <type>String</type>
          <description>
            The identifier of the POM in the format {@code &lt;groupId>:&lt;artifactId>:&lt;version>}.
          </description>
        </field>
        <field>
          <name>location</name>
          <version>4.0.0+</version>
          <type>String</type>
          <description>
            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>
