<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
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.
-->
<model xmlns="https://codehaus-plexus.github.io/MODELLO/1.0.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="https://codehaus-plexus.github.io/MODELLO/1.0.0 https://codehaus-plexus.github.io/modello/xsd/modello-1.0.0.xsd"
       xsd.namespace="http://maven.apache.org/changes/1.0.0"
       xsd.targetNamespace="http://maven.apache.org/changes/1.0.0">
  <id>changes</id>
  <name>Changes</name>
  <description>
    A recording of changes made during each release of a project. This
    file should record every changes made to the project.
  </description>
  <defaults>
    <default>
      <key>package</key>
      <value>org.apache.maven.plugins.changes.model</value>
    </default>
  </defaults>
  <classes>
    <class rootElement="true" xml.tagName="document">
      <name>ChangesDocument</name>
      <description>
        Record every release with their subsequent changes.
      </description>
      <version>1.0.0</version>
      <fields>
        <field>
          <name>properties</name>
          <version>1.0.0</version>
          <association>
            <type>Properties</type>
            <multiplicity>1</multiplicity>
          </association>
          <description>
            Contains the properties of this document.
          </description>
        </field>
        <field>
          <name>body</name>
          <version>1.0.0</version>
          <required>true</required>
          <association>
            <type>Body</type>
          </association>
          <description>
            Contains the releases of this project with the actions taken
            for each of the releases.
          </description>
        </field>
      </fields>
    </class>
    <class>
      <name>Properties</name>
      <version>1.0.0</version>
      <fields>
        <field>
          <name>title</name>
          <version>1.0.0</version>
          <required>true</required>
          <type>String</type>
          <description>The page title.</description>
        </field>
        <field>
          <name>author</name>
          <version>1.0.0</version>
          <description>The page author.</description>
          <association>
            <type>Author</type>
            <multiplicity>1</multiplicity>
          </association>
        </field>
      </fields>
    </class>
    <class xsd.compositor="sequence">
      <name>Body</name>
      <version>1.0.0</version>
      <fields>
        <field>
          <name>releases</name>
          <version>1.0.0</version>
          <association xml.itemsStyle="flat">
            <type>Release</type>
            <multiplicity>*</multiplicity>
          </association>
          <description>The list of releases for this project.</description>
        </field>
      </fields>
    </class>
    <class xsd.compositor="sequence">
      <name>Release</name>
      <version>1.0.0</version>
      <description>A single release of this project.</description>
      <fields>
        <field xml.attribute="true">
          <name>version</name>
          <version>1.0.0</version>
          <required>true</required>
          <type>String</type>
          <description>
            The version number associated with this release.
          </description>
        </field>
        <field xml.attribute="true" xml.tagName="date">
          <name>dateRelease</name>
          <version>1.0.0</version>
          <required>true</required>
          <type>String</type>
          <description>
            <![CDATA[
            The date of this release.
            <p>This field can be any string, such as "in SVN" when the version isn't yet released but the ISO 8601 date format is recommended.</p>
          ]]>
          </description>
        </field>
        <field xml.attribute="true">
          <name>description</name>
          <version>1.0.0</version>
          <type>String</type>
          <description>
            A short description of this release.
          </description>
        </field>
        <field>
          <name>actions</name>
          <version>1.0.0</version>
          <association xml.itemsStyle="flat">
            <type>Action</type>
            <multiplicity>*</multiplicity>
          </association>
          <description>The list of actions taken for this release.</description>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>1.0.0</version>
          <code><![CDATA[
            public java.util.List<Action> getActions(String type)
            {
                java.util.List<Action> actions = new java.util.ArrayList<Action>();
                for (Action action : getActions())
                {
                  if ( action.getType() != null && action.getType().equalsIgnoreCase( type ) )
                  {
                      actions.add( action );
                  }
                }
                return actions;
            }
          ]]></code>
        </codeSegment>
        <codeSegment>
          <version>1.0.0</version>
          <code><![CDATA[
              private final java.util.List<Component> components = new java.util.ArrayList<Component>();

              public void addComponent(String name, Release release)
              {
                  final Component component = new Component();
                  component.setName(name);
                  component.setDescription(release.getDescription());
                  component.setActions(release.getActions());
                  components.add(component);
              }

              public java.util.List<Component> getComponents()
              {
                  return components;
              }
          ]]></code>
        </codeSegment>
      </codeSegments>

    </class>
    <class>
      <name>Author</name>
      <version>1.0.0</version>
      <description>
        A description of the author page.
      </description>
      <fields>
        <field>
          <name>name</name>
          <version>1.0.0</version>
          <type>Content</type>
          <description>
            The page author name.
          </description>
        </field>
        <field xml.attribute="true" xml.tagName="email">
          <name>authorEmail</name>
          <version>1.0.0</version>
          <type>String</type>
          <description>
            The page author email.
          </description>
        </field>
      </fields>
    </class>
    <class>
      <name>Component</name>
      <version>1.0.0</version>
      <description>
        A component as a part of current release.
      </description>
      <fields>
        <field>
          <name>name</name>
          <version>1.0.0</version>
          <type>String</type>
          <description>
            The component name.
          </description>
        </field>
        <field>
          <name>description</name>
          <version>1.0.0</version>
          <type>String</type>
          <description>
            The component description.
          </description>
        </field>
        <field>
          <name>actions</name>
          <version>1.0.0</version>
          <association>
            <type>Action</type>
            <multiplicity>*</multiplicity>
          </association>
          <description>The list of actions for this component.</description>
        </field>
      </fields>
    </class>
    <class xsd.compositor="sequence">
      <name>Action</name>
      <version>1.0.0</version>
      <description>
        A single action done on the project, during this release.
      </description>
      <fields>
        <field>
          <name>action</name>
          <version>1.0.0</version>
          <type>Content</type>
          <description>
            A short description of the action taken.
          </description>
        </field>
        <field xml.attribute="true">
          <name>dev</name>
          <version>1.0.0</version>
          <required>true</required>
          <type>String</type>
          <description>
            <![CDATA[
            Name of developer who committed the change.
            <p>This can be either the id of the developer, as specified in the developers section of the pom.xml file, or the name of the developer. If you generate a changes report and specify the id of the developer, a link is created to that developer in the team.html page.</p>
            ]]>
          </description>
        </field>
        <field xml.attribute="true" xml.tagName="due-to">
          <name>dueTo</name>
          <version>1.0.0</version>
          <type>String</type>
          <description>
            Name of the person to be credited for this change. This can be used when a patch is submitted by a non-committer.
          </description>
        </field>
        <field xml.attribute="true" xml.tagName="due-to-email">
          <name>dueToEmail</name>
          <version>1.0.0</version>
          <type>String</type>
          <description>
            Email of the person to be credited for this change.
          </description>
        </field>
        <field xml.attribute="true">
          <name>issue</name>
          <version>1.0.0</version>
          <required>true</required>
          <type>String</type>
          <description>
            <![CDATA[
              Id of the issue related to this change. This is the id in your issue tracking system.
              <p>The Changes plugin will generate a URL out of this id. The URL is constructed using the value of the issueLinkTemplate parameter.</p>
              <p>See the <a href="changes-report.html">changes-report mojo</a> for more details.</p>
            ]]>
          </description>
        </field>
        <field xml.attribute="true">
          <name>type</name>
          <version>1.0.0</version>
          <required>true</required>
          <type>String</type>
          <description>
            <![CDATA[
            Supported action types are the following:
            <ul>
              <li>add: added functionality to the project.</li>
              <li>fix: bug fix for the project.</li>
              <li>update: updated some part of the project.</li>
              <li>remove: removed some functionality from the project.</li>
            </ul>
            ]]>
          </description>
        </field>
        <field xml.attribute="true">
          <name>system</name>
          <version>1.0.0</version>
          <type>String</type>
          <description>
            <![CDATA[
              Id of issue tracking system. If empty 'default' value will be used.
              <p>The Changes plugin will generate a URL out of this id. The URL is constructed using the value of the issueLinkTemplatePerSystem parameter.</p>
              <p>See the <a href="changes-report.html">changes-report mojo</a> for more details.</p>
            ]]>
          </description>
        </field>
        <field xml.attribute="true">
          <name>date</name>
          <version>1.0.0</version>
          <type>String</type>
          <description>fix date</description>
        </field>
        <field>
          <name>fixedIssues</name>
          <version>1.0.0</version>
          <association xml.itemsStyle="flat" xml.tagName="fixes">
            <type>FixedIssue</type>
            <multiplicity>*</multiplicity>
          </association>
          <description>A list of fixed issues.</description>
        </field>
        <field>
          <name>dueTos</name>
          <version>1.0.0</version>
          <association xml.itemsStyle="flat" xml.tagName="dueto">
            <type>DueTo</type>
            <multiplicity>*</multiplicity>
          </association>
          <description>A list of contributors for this issue.</description>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>1.0.9+</version>
          <code><![CDATA[
            public static final String ADD_ACTION = "add";

            public static final String FIX_ACTION = "fix";

            public static final String UPDATE_ACTION = "update";

            public static final String REMOVE_ACTION = "remove";
          ]]></code>
        </codeSegment>
      </codeSegments>
    </class>
    <class xsd.compositor="sequence">
      <name>DueTo</name>
      <version>1.0.0</version>
      <description>
        Name and email of the person to be credited for this change. This can be used when a patch is submitted by a non-committer.
      </description>
      <fields>
        <field xml.attribute="true">
          <name>name</name>
          <version>1.0.0</version>
          <type>String</type>
          <description>Name of the person to be credited for this change.</description>
        </field>
        <field xml.attribute="true">
          <name>email</name>
          <version>1.0.0</version>
          <type>String</type>
          <description>Email of the person to be credited for this change.</description>
        </field>
      </fields>
    </class>
    <class xsd.compositor="sequence">
      <name>FixedIssue</name>
      <version>1.0.0</version>
      <description>
        A fixed issue.
      </description>
      <fields>
        <field xml.attribute="true">
          <name>issue</name>
          <version>1.0.0</version>
          <type>String</type>
          <description>
            <![CDATA[
              Id of the issue related to this change. This is the id in your issue tracking system.
              <p>The Changes plugin will generate a URL out of this id. The URL is constructed using the value of the issueLinkTemplate parameter.</p>
              <p>See the <a href="changes-report.html">changes-report mojo</a> for more details.</p>
            ]]>
          </description>
        </field>
      </fields>
    </class>
  </classes>
</model>

