<?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="http://modello.codehaus.org/MODELLO/1.0.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://modello.codehaus.org/MODELLO/1.0.0 http://modello.codehaus.org/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-list.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 functionnality 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 functionnality 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 fix 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>

