<!--
  ~ 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>
  <id>continuum</id>
  <name>Continuum</name>
  <description>Continuum's object model.</description>
  <defaults>
    <default>
      <key>package</key>
      <value>org.apache.maven.continuum.model.project</value>
    </default>
  </defaults>

  <!-- Note: 1.0.9 is the format used in versions leading up to 1.1-alpha-1 which is still in use -->
  <!-- TODO: populate correct values for 1.0.3 -->
  <classes>
    <class rootElement="true" jpox.enabled="false" stash.storable="false">
      <name>ContinuumDatabase</name>
      <version>1.0.9+</version>
      <fields>
        <field>
          <name>projectGroups</name>
          <version>1.0.9+</version>
          <association>
            <type>ProjectGroup</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>systemConfiguration</name>
          <version>1.0.9+</version>
          <association>
            <type>SystemConfiguration</type>
          </association>
        </field>
        <!-- independent references -->
        <field>
          <name>installations</name>
          <version>1.1.0+</version>
          <association>
            <type>Installation</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>schedules</name>
          <version>1.0.9+</version>
          <association>
            <type>Schedule</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>profiles</name>
          <version>1.1.0+</version>
          <association>
            <type>Profile</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>localRepositories</name>
          <version>1.1.1+</version>
          <association>
            <type>LocalRepository</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>repositoryPurgeConfigurations</name>
          <version>1.1.1+</version>
          <association>
            <type>RepositoryPurgeConfiguration</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>directoryPurgeConfigurations</name>
          <version>1.1.1+</version>
          <association>
            <type>DirectoryPurgeConfiguration</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>distributedDirectoryPurgeConfigurations</name>
          <version>1.4.1+</version>
          <association>
            <type>DistributedDirectoryPurgeConfiguration</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>distributedRepositoryPurgeConfigurations</name>
          <version>1.5.0+</version>
          <association>
            <type>DistributedRepositoryPurgeConfiguration</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>projectScmRoots</name>
          <version>1.1.3+</version>
          <association java.init="field">
            <type>ProjectScmRoot</type>
            <multiplicity>*</multiplicity>
          </association>
          <defaultValue>new java.util.ArrayList()</defaultValue>
        </field>
        <field>
          <name>continuumReleaseResults</name>
          <version>1.1.3+</version>
          <association java.init="field">
            <type>ContinuumReleaseResult</type>
            <multiplicity>*</multiplicity>
          </association>
          <defaultValue>new java.util.ArrayList()</defaultValue>
        </field>
        <field>
          <name>buildDefinitionTemplates</name>
          <version>1.1.3+</version>
          <association java.init="field">
            <type>BuildDefinitionTemplate</type>
            <multiplicity>*</multiplicity>
          </association>
          <defaultValue>new java.util.ArrayList()</defaultValue>
        </field>
        <field>
          <name>buildQueues</name>
          <version>1.3.2+</version>
          <association java.init="field">
            <type>BuildQueue</type>
            <multiplicity>*</multiplicity>
          </association>
          <defaultValue>new java.util.ArrayList()</defaultValue>
        </field>
        <field>
          <name>buildDefinitions</name>
          <version>1.3.3+</version>
          <association java.init="field">
            <type>BuildDefinition</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
      </fields>
    </class>

    <class>
      <name>ProjectGroup</name>
      <version>1.0.9+</version>
      <fields>
        <field>
          <name>id</name>
          <version>1.0.9+</version>
          <required>true</required>
          <type>int</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>groupId</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>name</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field stash.maxSize="8192">
          <name>description</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field jpox.mapped-by="projectGroup"
               jpox.fetch-groups="projectgroup-projects project-build-details project-with-scm-result">
          <name>projects</name>
          <version>1.0.9+</version>
          <association jpox.join="false">
            <type>Project</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field jpox.fetch-groups="project-build-details">
          <name>notifiers</name>
          <version>1.0.9+</version>
          <association>
            <type>ProjectNotifier</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field jpox.fetch-groups="project-build-details">
          <name>buildDefinitions</name>
          <version>1.0.9+</version>
          <association>
            <type>BuildDefinition</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>localRepository</name>
          <version>1.1.1+</version>
          <association xml.reference="true" stash.part="true" jpox.dependent="false">
            <type>LocalRepository</type>
          </association>
        </field>
      </fields>
    </class>

    <class>
      <name>Project</name>
      <version>1.0.9+</version>
      <fields>
        <field>
          <name>id</name>
          <required>true</required>
          <identifier>true</identifier>
          <version>1.0.9+</version>
          <type>int</type>
        </field>
        <field>
          <name>groupId</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>artifactId</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>executorId</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>name</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field stash.maxSize="8192">
          <name>description</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field stash.maxSize="256">
          <name>url</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field stash.maxSize="256">
          <name>scmUrl</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>scmTag</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>scmUsername</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>scmPassword</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>scmUseCache</name>
          <version>1.1.0+</version>
          <type>boolean</type>
          <defaultValue>false</defaultValue>
        </field>
        <field>
          <name>version</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <!-- TODO: should these 3 just be queried from the builds list? -->
        <field>
          <name>state</name>
          <version>1.0.9</version>
          <type>int</type>
          <defaultValue>1</defaultValue>
        </field>
        <field jpox.column="projectstate">
          <name>state</name>
          <version>1.1.0+</version>
          <type>int</type>
          <defaultValue>1</defaultValue>
        </field>
        <field>
          <name>oldState</name>
          <version>1.0.9+</version>
          <type>int</type>
        </field>
        <!-- TODO: maybe buildresult itself? -->
        <field>
          <name>latestBuildId</name>
          <version>1.0.9+</version>
          <type>int</type>
        </field>
        <field>
          <name>buildNumber</name>
          <version>1.0.9+</version>
          <type>int</type>
        </field>
        <field stash.maxSize="256">
          <name>workingDirectory</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>relativePath</name>
          <version>1.1.0+</version>
          <type>String</type>
        </field>
        <field jpox.null-value="default">
          <name>checkedOutInSingleDirectory</name>
          <version>1.4.1+</version>
          <type>boolean</type>
          <defaultValue>false</defaultValue>
        </field>
        <field jpox.mapped-by="project" jpox.fetch-groups="project-with-builds">
          <name>buildResults</name>
          <version>1.0.9+</version>
          <association jpox.join="false">
            <type>BuildResult</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <!-- TODO: remove -->
        <field jpox.fetch-groups="project-with-checkout-result">
          <name>checkoutResult</name>
          <version>1.0.9+</version>
          <association>
            <type>ScmResult</type>
          </association>
        </field>
        <field jpox.fetch-groups="project-all-details">
          <name>developers</name>
          <version>1.0.9+</version>
          <association jpox.join="false">
            <type>ProjectDeveloper</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field jpox.fetch-groups="project-all-details project-dependencies">
          <name>parent</name>
          <version>1.0.9+</version>
          <association jpox.join="false">
            <type>ProjectDependency</type>
          </association>
        </field>
        <field jpox.fetch-groups="project-all-details project-dependencies">
          <name>dependencies</name>
          <version>1.0.9+</version>
          <association jpox.join="false">
            <type>ProjectDependency</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>projectGroup</name>
          <version>1.0.9+</version>
          <required>true</required>
          <association stash.part="true" xml.reference="true" jpox.dependent="false">
            <type>ProjectGroup</type>
          </association>
        </field>
        <field jpox.fetch-groups="project-build-details project-all-details">
          <name>notifiers</name>
          <version>1.0.9+</version>
          <association>
            <type>ProjectNotifier</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field jpox.fetch-groups="project-build-details project-all-details">
          <name>buildDefinitions</name>
          <version>1.0.9+</version>
          <association>
            <type>BuildDefinition</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
      </fields>
    </class>

    <class>
      <name>ProjectNotifier</name>
      <version>1.0.9+</version>
      <description>
        Configures one method for notifying users/developers when a build breaks.
      </description>
      <fields>
        <field>
          <name>id</name>
          <required>true</required>
          <identifier>true</identifier>
          <version>1.0.9+</version>
          <type>int</type>
        </field>
        <field>
          <name>type</name>
          <version>1.0.9</version>
          <defaultValue>mail</defaultValue>
          <type>String</type>
          <description>The mechanism used to deliver notifications.</description>
        </field>
        <field jpox.column="notifiertype">
          <name>type</name>
          <version>1.1.0+</version>
          <defaultValue>mail</defaultValue>
          <type>String</type>
          <description>The mechanism used to deliver notifications.</description>
        </field>
        <field jpox.column="notifierorigin">
          <name>from</name>
          <version>1.0.9+</version>
          <type>int</type>
          <description>The origin of the notifier (pom or user).</description>
        </field>
        <field>
          <name>enabled</name>
          <version>1.0.9+</version>
          <defaultValue>true</defaultValue>
          <type>boolean</type>
        </field>
        <field>
          <name>recipientType</name>
          <version>1.0.9+</version>
          <type>int</type>
        </field>
        <field>
          <name>sendOnSuccess</name>
          <version>1.0.9+</version>
          <type>boolean</type>
          <defaultValue>true</defaultValue>
        </field>
        <field>
          <name>sendOnFailure</name>
          <version>1.0.9+</version>
          <type>boolean</type>
          <defaultValue>true</defaultValue>
        </field>
        <field>
          <name>sendOnError</name>
          <version>1.0.9+</version>
          <type>boolean</type>
          <defaultValue>true</defaultValue>
        </field>
        <field>
          <name>sendOnWarning</name>
          <version>1.0.9+</version>
          <type>boolean</type>
          <defaultValue>true</defaultValue>
        </field>
        <field>
          <name>configuration</name>
          <version>1.0.9+</version>
          <description>Extended configuration specific to this notifier goes here.</description>
          <type>Map</type>
          <association xml.mapStyle="inline" stash.part="true" stash.keyType="java.lang.String">
            <type>String</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>sendOnScmFailure</name>
          <version>1.1.3+</version>
          <type>boolean</type>
          <defaultValue>false</defaultValue>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>1.0.9+</version>
          <code><![CDATA[

              public static final int FROM_PROJECT = 1;

              public static final int FROM_USER = 2;

              public boolean isFromProject()
              {
                  return from == FROM_PROJECT;
              }

              public boolean isFromUser()
              {
                  return from == FROM_USER;
              }
          ]]></code>
        </codeSegment>
      </codeSegments>
    </class>

    <class>
      <name>ProjectDeveloper</name>
      <version>1.0.9+</version>
      <fields>
        <field>
          <name>scmId</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>name</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>email</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>continuumId</name>
          <version>1.0.9+</version>
          <type>int</type>
        </field>
      </fields>
    </class>

    <class>
      <name>ProjectDependency</name>
      <version>1.0.9+</version>
      <fields>
        <field>
          <name>groupId</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>artifactId</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>version</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
      </fields>
    </class>

    <class>
      <name>BuildResult</name>
      <version>1.0.9+</version>
      <description><![CDATA[
        This class is a single continuum build.
      ]]></description>
      <fields>
        <field>
          <name>project</name>
          <version>1.0.9+</version>
          <!-- required>true</required -->
          <association xml.reference="true" stash.part="true" jpox.dependent="false">
            <type>Project</type>
          </association>
        </field>
        <field>
          <name>buildDefinition</name>
          <version>1.1.0+</version>
          <association xml.reference="true" stash.part="true" jpox.dependent="false">
            <type>BuildDefinition</type>
          </association>
          <defaultValue>null</defaultValue>
        </field>
        <field>
          <name>id</name>
          <version>1.0.9+</version>
          <type>int</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>buildNumber</name>
          <version>1.0.9+</version>
          <type>int</type>
        </field>
        <field>
          <name>state</name>
          <version>1.0.9</version>
          <type>int</type>
        </field>
        <field>
          <name>trigger</name>
          <version>1.0.9</version>
          <type>int</type>
        </field>
        <field>
          <name>username</name>
          <version>1.4.0+</version>
          <type>String</type>
        </field>
        <field jpox.column="resultstate">
          <name>state</name>
          <version>1.1.0+</version>
          <type>int</type>
        </field>
        <field jpox.column="resulttrigger">
          <name>trigger</name>
          <version>1.1.0+</version>
          <type>int</type>
        </field>
        <field>
          <name>startTime</name>
          <version>1.0.9+</version>
          <!-- TODO: Because JPOX persists as UTC and pulls back using the local time, we have to take over -->
          <type>long</type>
        </field>
        <field>
          <name>endTime</name>
          <version>1.0.9+</version>
          <!-- TODO: Because JPOX persists as UTC and pulls back using the local time, we have to take over -->
          <type>long</type>
        </field>
        <field stash.maxSize="8192">
          <name>error</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>success</name>
          <version>1.0.9+</version>
          <type>boolean</type>
        </field>
        <field>
          <name>exitCode</name>
          <version>1.0.9+</version>
          <type>int</type>
        </field>
        <!-- TODO: remove -->
        <field jpox.fetch-groups="build-result-with-details">
          <name>scmResult</name>
          <version>1.0.9+</version>
          <association>
            <type>ScmResult</type>
          </association>
        </field>
        <field jpox.fetch-groups="build-result-with-details">
          <name>modifiedDependencies</name>
          <version>1.1.0+</version>
          <association jpox.join="false">
            <type>ProjectDependency</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field jpox.null-value="default">
          <name>lastChangedDate</name>
          <version>1.3.2+</version>
          <type>long</type>
          <defaultValue>0</defaultValue>
        </field>
        <field jpox.null-value="default">
          <name>buildUrl</name>
          <version>1.3.2+</version>
          <type>String</type>
          <defaultValue></defaultValue>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>1.0.9+</version>
          <code><![CDATA[
            public String getElapsedTime()
            {
                return getTimeDifference( startTime, getSystemTime() );
            }

            public String getDurationTime()
            {
                return getTimeDifference( startTime, endTime );
            }
            private long getSystemTime()
            {
                return java.util.Calendar.getInstance().getTime().getTime();
            }

            private String getTimeDifference( long startTime, long endTime )
            {
                long start = startTime;
                long end = endTime;

                if ( start == 0 )
                {
                    return "";
                }

                if ( end == 0 )
                {
                    end = getSystemTime();
                }

                int timeInSeconds = (int) ( ( end - start ) / 1000 );
                int days, hours, minutes, seconds;
                days = timeInSeconds / 86400;
                timeInSeconds = timeInSeconds - ( days * 86400 );
                hours = timeInSeconds / 3600;
                timeInSeconds = timeInSeconds - ( hours * 3600 );
                minutes = timeInSeconds / 60;
                timeInSeconds = timeInSeconds - ( minutes * 60 );
                seconds = timeInSeconds;

                String elapsedTime = "";
                if ( days > 0 )
                {
                    elapsedTime = days + " d ";
                    elapsedTime += hours + " h ";
                    elapsedTime += minutes + " min ";
                    elapsedTime += seconds + " sec";
                }
                else
                {
                    if ( hours > 0 )
                    {
                        elapsedTime = hours + " h ";
                        elapsedTime += minutes + " min ";
                        elapsedTime += seconds + " sec";
                    }
                    else
                    {
                        if ( minutes > 0 )
                        {
                            elapsedTime = minutes + " min ";
                            elapsedTime += seconds + " sec";
                        }
                        else
                        {
                            elapsedTime = seconds + " sec";
                        }
                    }
                }

                return elapsedTime;
            }
          ]]></code>
        </codeSegment>
      </codeSegments>
    </class>

    <class>
      <name>ScmResult</name>
      <packageName>org.apache.maven.continuum.model.scm</packageName>
      <version>1.0.9+</version>
      <fields>
        <field>
          <name>success</name>
          <version>1.0.9+</version>
          <type>boolean</type>
        </field>
        <field stash.maxSize="1024">
          <name>commandLine</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field stash.maxSize="1024">
          <name>providerMessage</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <!-- TODO: page to disk? -->
        <field stash.maxSize="1024">
          <name>commandOutput</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field stash.maxSize="8192" jpox.column="exceptionstring">
          <name>exception</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>changes</name>
          <version>1.0.9+</version>
          <association stash.part="true" jpox.join="false">
            <type>ChangeSet</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
      </fields>
    </class>

    <class>
      <name>ChangeSet</name>
      <packageName>org.apache.maven.continuum.model.scm</packageName>
      <version>1.0.9+</version>
      <fields>
        <field>
          <name>id</name>
          <version>1.1.0+</version>
          <type>String</type>
          <identity>true</identity>
        </field>
        <field>
          <name>author</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field stash.maxSize="8192">
          <name>comment</name>
          <version>1.0.9</version>
          <type>String</type>
        </field>
        <field>
          <name>date</name>
          <version>1.0.9</version>
          <!-- TODO: Because JPOX persists as UTC and pulls back using the local time, we have to take over -->
          <type>long</type>
        </field>
        <field stash.maxSize="8192" jpox.column="changecomment">
          <name>comment</name>
          <version>1.1.0+</version>
          <type>String</type>
        </field>
        <field jpox.column="changedate">
          <name>date</name>
          <version>1.1.0+</version>
          <!-- TODO: Because JPOX persists as UTC and pulls back using the local time, we have to take over -->
          <type>long</type>
        </field>
        <field>
          <name>files</name>
          <version>1.0.9+</version>
          <association stash.part="true" jpox.join="false">
            <type>ChangeFile</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>1.0.9+</version>
          <code><![CDATA[
            /**
             * @return Returns string representation of the changeset
             */
            public String toString()
            {
                StringBuilder result = new StringBuilder();
                if ( author != null )
                {
                    result.append( author ).append( "\n" );
                }
                result.append( date ).append( "\n" );

                if ( files != null )
                {
                    for ( java.util.Iterator i = files.iterator(); i.hasNext(); )
                    {
                        ChangeFile file = (ChangeFile) i.next();

                        if (file != null)
                        {
                            result.append( file ).append( "\n" );
                        }
                    }
                }

                if ( comment != null )
                {
                    result.append( comment );
                }

                return result.toString();
            }

            /**
             * @see java.lang.Object#equals(java.lang.Object)
             */
            public boolean equals( Object obj )
            {
                if ( obj instanceof ChangeSet )
                {
                    ChangeSet changeSet = (ChangeSet) obj;

                    if ( toString().equals( changeSet.toString() ) )
                    {
                        return true;
                    }
                }

                return false;
            }

            public java.util.Date getDateAsDate()
            {
                if ( date > 0 )
                {
                    return new java.util.Date( date );
                }

                return null;
            }
          ]]></code>
        </codeSegment>
      </codeSegments>
    </class>

    <class>
      <name>ChangeFile</name>
      <packageName>org.apache.maven.continuum.model.scm</packageName>
      <version>1.0.9+</version>
      <fields>
        <field stash.maxSize="1024">
          <name>name</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>revision</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>status</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>1.0.9+</version>
          <code><![CDATA[
            /**
             * Provide a version of the object as a string for debugging purposes
             *
             * @return a {@link String}made up of the properties of the object
             */
            public String toString()
            {
                StringBuffer buffer = new StringBuffer( getName() );

                if ( getRevision() != null )
                {
                    buffer.append( ", " ).append( getRevision() );
                }

                return buffer.toString();
            }
          ]]></code>
        </codeSegment>
      </codeSegments>
    </class>

    <class>
      <name>BuildDefinition</name>
      <version>1.0.9+</version>
      <fields>
        <field>
          <name>id</name>
          <required>true</required>
          <identifier>true</identifier>
          <version>1.0.9+</version>
          <type>int</type>
        </field>
        <field>
          <name>defaultForProject</name>
          <version>1.0.9+</version>
          <type>boolean</type>
          <defaultValue>false</defaultValue>
        </field>
        <field>
          <name>goals</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>arguments</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>buildFile</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>buildFresh</name>
          <version>1.1.0+</version>
          <type>boolean</type>
          <defaultValue>false</defaultValue>
          <description>
            true if the build is to be smoked and checked back out from the scm each build
          </description>
        </field>
        <field>
          <name>description</name>
          <version>1.1.0+</version>
          <type>String</type>
          <description>description of the buid defintion</description>
        </field>
        <field jpox.column="builddefinition_type">
          <name>type</name>
          <version>1.1.0+</version>
          <type>String</type>
          <description>type of the buid defintion</description>
        </field>
        <field>
          <name>schedule</name>
          <version>1.0.9+</version>
          <association xml.reference="true" stash.part="true" jpox.dependent="false">
            <type>Schedule</type>
          </association>
        </field>
        <field jpox.column="buildprofile">
          <name>profile</name>
          <version>1.1.0+</version>
          <association xml.reference="true" stash.part="true" jpox.dependent="false">
            <type>Profile</type>
          </association>
        </field>
        <field jpox.null-value="default">
          <name>latestBuildId</name>
          <version>1.0.9</version>
          <type>int</type>
          <defaultValue>0</defaultValue>
        </field>
        <field>
          <name>alwaysBuild</name>
          <version>1.1.0+</version>
          <type>boolean</type>
          <defaultValue>false</defaultValue>
          <description>
            true if the build had to be forced even if there is no scm change
          </description>
        </field>
        <field jpox.column="is_template">
          <name>template</name>
          <version>1.1.0+</version>
          <type>boolean</type>
          <defaultValue>false</defaultValue>
          <description>
            true if this buildDefinition is a template
          </description>
        </field>
        <field jpox.null-value="default">
          <name>updatePolicy</name>
          <version>1.4.0+</version>
          <type>int</type>
          <defaultValue>0</defaultValue>
        </field>
      </fields>
    </class>
    <class>
      <name>BuildDefinitionTemplate</name>
      <version>1.1.0+</version>
      <description>Template which contains some buildDefinitions</description>
      <fields>
        <field>
          <name>id</name>
          <identifier>true</identifier>
          <version>1.1.0+</version>
          <type>int</type>
        </field>
        <field>
          <name>name</name>
          <version>1.1.0+</version>
          <type>String</type>
          <required>true</required>
        </field>
        <field>
          <name>continuumDefault</name>
          <version>1.1.0+</version>
          <type>boolean</type>
          <defaultValue>false</defaultValue>
          <description>
            true if this definition is a continuum default build def (cannot be removed)
          </description>
        </field>
        <field jpox.column="builddefinition_template_type">
          <name>type</name>
          <version>1.1.0+</version>
          <type>String</type>
          <description>type of the buid BuildDefinitionTemplate use for default</description>
        </field>
        <field xml.reference="true" stash.part="true" jpox.fetch-groups="build-template-build-definitions">
          <name>buildDefinitions</name>
          <version>1.1.0+</version>
          <association xml.reference="true" stash.part="true" jpox.dependent="false">
            <type>BuildDefinition</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
      </fields>
    </class>
    <class>
      <name>BuildQueue</name>
      <version>1.1.4+</version>
      <description><![CDATA[
       Build queue.
      ]]></description>
      <fields>
        <field>
          <name>id</name>
          <version>1.1.4+</version>
          <identifier>true</identifier>
          <type>int</type>
        </field>
        <field jpox.null-value="default">
          <name>name</name>
          <version>1.1.4+</version>
          <type>String</type>
          <required>true</required>
          <defaultValue></defaultValue>
        </field>
      </fields>
    </class>
    <class>
      <name>Schedule</name>
      <version>1.0.9+</version>
      <description><![CDATA[
        Schedule for a project.
      ]]></description>
      <fields>
        <field>
          <name>id</name>
          <identifier>true</identifier>
          <version>1.0.9+</version>
          <type>int</type>
        </field>
        <field>
          <name>active</name>
          <version>1.0.9+</version>
          <type>boolean</type>
        </field>
        <field>
          <name>name</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>description</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>delay</name>
          <description><![CDATA[
            Delay in seconds.
          ]]></description>
          <version>1.0.9</version>
          <type>int</type>
        </field>
        <field jpox.column="scheduledelay">
          <name>delay</name>
          <description><![CDATA[
            Delay in seconds.
          ]]></description>
          <version>1.1.0+</version>
          <type>int</type>
        </field>
        <field>
          <name>maxJobExecutionTime</name>
          <description>
            Maximum execution time of a job in seconds before it's
            terminated.
          </description>
          <version>1.0.9+</version>
          <type>int</type>
          <defaultValue>3600</defaultValue>
        </field>
        <field>
          <name>cronExpression</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field jpox.fetch-groups="schedule-build-queues" java.init="field">
          <name>buildQueues</name>
          <version>1.1.4+</version>
          <association xml.reference="true" stash.part="true" jpox.dependent="false">
            <type>BuildQueue</type>
            <multiplicity>*</multiplicity>
          </association>
          <defaultValue>new java.util.ArrayList()</defaultValue>
        </field>
      </fields>
    </class>

    <class jpox.table="profiles">
      <name>Profile</name>
      <packageName>org.apache.maven.continuum.model.system</packageName>
      <version>1.1.0+</version>
      <fields>
        <field>
          <name>id</name>
          <identifier>true</identifier>
          <version>1.1.0+</version>
          <type>int</type>
        </field>
        <field>
          <name>active</name>
          <version>1.1.0+</version>
          <type>boolean</type>
        </field>
        <field>
          <name>name</name>
          <version>1.1.0+</version>
          <type>String</type>
        </field>
        <field>
          <name>description</name>
          <version>1.1.0+</version>
          <type>String</type>
        </field>
        <field>
          <name>scmMode</name>
          <version>1.1.0+</version>
          <type>int</type>
        </field>
        <field>
          <name>buildWithoutChanges</name>
          <version>1.1.0+</version>
          <type>boolean</type>
        </field>
        <field jpox.null-value="default">
          <name>buildAgentGroup</name>
          <version>1.3.2+</version>
          <type>String</type>
          <required>false</required>
          <defaultValue></defaultValue>
        </field>
        <field>
          <name>jdk</name>
          <version>1.1.0+</version>
          <association xml.reference="true" stash.part="true" jpox.dependent="false">
            <type>Installation</type>
          </association>
        </field>
        <field>
          <name>builder</name>
          <version>1.1.0+</version>
          <association xml.reference="true" stash.part="true" jpox.dependent="false">
            <type>Installation</type>
          </association>
        </field>
        <field>
          <name>environmentVariables</name>
          <version>1.1.0+</version>
          <association xml.reference="true" stash.part="true" jpox.dependent="false">
            <type>Installation</type>
            <!-- org.apache.maven.continuum.model.system. -->
            <multiplicity>*</multiplicity>
          </association>
        </field>
      </fields>
    </class>

    <class jpox.use-identifiers-as-primary-key="false">
      <name>Installation</name>
      <packageName>org.apache.maven.continuum.model.system</packageName>
      <version>1.1.0+</version>
      <fields>
        <field jpox.column="installationtype">
          <name>type</name>
          <version>1.1.0+</version>
          <type>String</type>
        </field>
        <field jpox.column="varvalue">
          <name>varValue</name>
          <version>1.1.0+</version>
          <type>String</type>
        </field>
        <field jpox.column="varname">
          <name>varName</name>
          <version>1.1.0+</version>
          <type>String</type>
        </field>
        <field>
          <name>name</name>
          <version>1.1.0+</version>
          <type>String</type>
        </field>
        <field jpox.primary-key="true">
          <name>installationId</name>
          <version>1.1.0+</version>
          <type>int</type>
          <identifier>true</identifier>
        </field>
      </fields>
    </class>

    <class>
      <name>SystemConfiguration</name>
      <packageName>org.apache.maven.continuum.model.system</packageName>
      <version>1.0.9+</version>
      <fields>
        <field>
          <name>guestAccountEnabled</name>
          <version>1.0.9+</version>
          <type>boolean</type>
          <defaultValue>true</defaultValue>
        </field>
        <field>
          <name>defaultScheduleDescription</name>
          <version>1.0.9+</version>
          <type>String</type>
          <defaultValue>Run hourly</defaultValue>
        </field>
        <field>
          <name>defaultScheduleCronExpression</name>
          <version>1.0.9+</version>
          <type>String</type>
          <defaultValue>0 0 * * * ?</defaultValue>
        </field>
        <field>
          <name>workingDirectory</name>
          <version>1.0.9+</version>
          <type>String</type>
          <defaultValue>working-directory</defaultValue>
        </field>
        <field>
          <name>buildOutputDirectory</name>
          <version>1.0.9+</version>
          <type>String</type>
          <defaultValue>build-output-directory</defaultValue>
        </field>
        <field>
          <name>deploymentRepositoryDirectory</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>baseUrl</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>initialized</name>
          <version>1.0.9+</version>
          <type>boolean</type>
          <defaultValue>false</defaultValue>
        </field>
        <field>
          <name>releaseOutputDirectory</name>
          <version>1.1.2+</version>
          <type>String</type>
          <defaultValue>release-output-directory</defaultValue>
        </field>
        <field jpox.null-value="default">
          <name>numberOfBuildsInParallel</name>
          <version>1.1.4+</version>
          <type>int</type>
          <defaultValue>1</defaultValue>
        </field>
        <field>
          <name>distributedBuildEnabled</name>
          <version>1.1.4+</version>
          <type>boolean</type>
          <defaultValue>false</defaultValue>
        </field>
      </fields>
    </class>

    <class>
      <name>NotificationAddress</name>
      <version>1.0.9+</version>
      <packageName>org.apache.maven.continuum.model.system</packageName>
      <description>
        Configures one method for notifying users/developers when a build breaks.
      </description>
      <fields>
        <field>
          <name>type</name>
          <version>1.0.9</version>
          <defaultValue>mail</defaultValue>
          <type>String</type>
          <description>The mechanism used to deliver notifications.</description>
        </field>
        <field jpox.column="notifiertype">
          <name>type</name>
          <version>1.1.0+</version>
          <defaultValue>mail</defaultValue>
          <type>String</type>
          <description>The mechanism used to deliver notifications.</description>
        </field>
        <field>
          <name>address</name>
          <version>1.0.9+</version>
          <type>String</type>
        </field>
        <field>
          <name>configuration</name>
          <version>1.0.9+</version>
          <description>Extended configuration specific to this notifier goes here.</description>
          <type>Map</type>
          <association xml.mapStyle="inline" stash.part="true" stash.keyType="java.lang.String">
            <type>String</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
      </fields>
    </class>

    <!-- TODO: this isn't really appropriate to generate with Modello -->
    <class jpox.enabled="false" stash.storable="false">
      <name>ContinuumProjectState</name>
      <packageName>org.apache.maven.continuum.project</packageName>
      <version>1.1.0+</version>
      <fields>
        <field>
          <name>name</name>
          <version>1.1.0+</version>
          <type>String</type>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>1.1.0+</version>
          <code><![CDATA[
    public final static int NEW = 1;
    public final static int OK = 2;
    public final static int FAILED = 3;
    public final static int ERROR = 4;
    public final static int BUILDING = 6;
    public final static int CHECKING_OUT = 7;
    public final static int UPDATING = 8;
    public final static int WARNING = 9;
    public final static int CHECKEDOUT = 10;
    public final static int UPDATED = 5;
    public final static int CANCELLED = 11;

    // TODO: maybe move these to another class
    public static final int TRIGGER_FORCED = 1;

    // TODO: remove
    public static final int TRIGGER_SCHEDULED = 0;

    public static final int TRIGGER_UNKNOWN = TRIGGER_SCHEDULED;

    public String getI18nKey()
    {
        return "org.apache.maven.continuum.project.state." + name;
    }

    public boolean equals( Object object )
    {
        if ( !( object instanceof ContinuumProjectState ) )
        {
            return false;
        }

        ContinuumProjectState other = (ContinuumProjectState) object;

        return name.equals( other.name );
    }

    public int hashCode()
    {
        return name.hashCode();
    }

    public String toString()
    {
        return name;
    }
           ]]></code>
        </codeSegment>
      </codeSegments>
    </class>
    <class>
      <name>LocalRepository</name>
      <version>1.1.1+</version>
      <packageName>org.apache.continuum.model.repository</packageName>
      <fields>
        <field>
          <name>id</name>
          <version>1.1.1+</version>
          <type>int</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>name</name>
          <version>1.1.1+</version>
          <type>String</type>
          <required>true</required>
        </field>
        <field jpox.column="repoLocation">
          <name>location</name>
          <version>1.1.1+</version>
          <type>String</type>
          <required>true</required>
          <description>
            The file system location for this repository
          </description>
        </field>
        <field>
          <name>layout</name>
          <version>1.1.1+</version>
          <type>String</type>
          <defaultValue>default</defaultValue>
          <description>
            The layout of the repository. Valid values are "default" and "legacy"
          </description>
        </field>
      </fields>
    </class>

    <class>
      <name>AbstractPurgeConfiguration</name>
      <version>1.1.1+</version>
      <abstract>true</abstract>
      <packageName>org.apache.continuum.model.repository</packageName>
      <fields>
        <field>
          <name>id</name>
          <version>1.1.1+</version>
          <identifier>true</identifier>
          <type>int</type>
        </field>
        <field>
          <name>description</name>
          <version>1.1.1+</version>
          <type>String</type>
        </field>
        <field>
          <name>deleteAll</name>
          <version>1.1.1+</version>
          <type>boolean</type>
          <defaultValue>false</defaultValue>
        </field>
        <field>
          <name>retentionCount</name>
          <version>1.1.1+</version>
          <type>int</type>
          <defaultValue>2</defaultValue>
          <description>
            The total count of the artifact for each snapshot or the release/build output folder to be retained.
          </description>
        </field>
        <field>
          <name>daysOlder</name>
          <version>1.1.1+</version>
          <type>int</type>
          <defaultValue>100</defaultValue>
          <description>
            The number of days old which will be the basis for removing a snapshot or a folder.
          </description>
        </field>
        <field>
          <name>enabled</name>
          <version>1.1.1+</version>
          <type>boolean</type>
          <defaultValue>true</defaultValue>
        </field>
        <field>
          <name>schedule</name>
          <version>1.1.1+</version>
          <association xml.reference="true" stash.part="true" jpox.dependent="false">
            <type>Schedule</type>
          </association>
        </field>
        <field>
          <name>defaultPurge</name>
          <version>1.1.1+</version>
          <type>boolean</type>
          <defaultValue>false</defaultValue>
        </field>
      </fields>
    </class>
    <class>
      <name>RepositoryPurgeConfiguration</name>
      <version>1.1.1+</version>
      <superClass>AbstractPurgeConfiguration</superClass>
      <packageName>org.apache.continuum.model.repository</packageName>
      <fields>
        <field>
          <name>repository</name>
          <version>1.1.1+</version>
          <association xml.reference="true" stash.part="true" jpox.dependent="false">
            <type>LocalRepository</type>
          </association>
          <required>true</required>
        </field>
        <field>
          <name>deleteReleasedSnapshots</name>
          <version>1.1.1+</version>
          <type>boolean</type>
          <defaultValue>false</defaultValue>
          <description>
            True if the released snapshots are to be removed from the repo during repository purge.
          </description>
        </field>
      </fields>
    </class>
    <class>
      <name>DirectoryPurgeConfiguration</name>
      <version>1.1.1+</version>
      <superClass>AbstractPurgeConfiguration</superClass>
      <packageName>org.apache.continuum.model.repository</packageName>
      <fields>
        <field jpox.column="directoryLocation">
          <name>location</name>
          <version>1.1.1+</version>
          <type>String</type>
          <description>
            The file system path for this directory
          </description>
          <required>true</required>
        </field>
        <field>
          <name>directoryType</name>
          <version>1.1.1+</version>
          <type>String</type>
          <description>
            The type of directory. Valid values are "releases" and "buildOutput"
          </description>
        </field>
      </fields>
    </class>
    <class>
      <name>DistributedDirectoryPurgeConfiguration</name>
      <version>1.4.1+</version>
      <superClass>AbstractPurgeConfiguration</superClass>
      <packageName>org.apache.continuum.model.repository</packageName>
      <fields>
        <field>
          <name>buildAgentUrl</name>
          <version>1.4.1+</version>
          <type>String</type>
          <description>
            BuildAgent URL
          </description>
          <required>true</required>
        </field>
        <field>
          <name>directoryType</name>
          <version>1.4.1+</version>
          <type>String</type>
          <description>
            The type of directory. Valid values are "releases" and "working"
          </description>
        </field>
      </fields>
    </class>
    <class>
      <name>DistributedRepositoryPurgeConfiguration</name>
      <version>1.5.0+</version>
      <superClass>AbstractPurgeConfiguration</superClass>
      <packageName>org.apache.continuum.model.repository</packageName>
      <fields>
        <field>
          <name>repositoryName</name>
          <version>1.5.0+</version>
          <type>String</type>
          <description>
            The remote name of the repository to purge. Slave purge requests find configuration by this name.
          </description>
        </field>
        <field>
          <name>deleteReleasedSnapshots</name>
          <version>1.5.0+</version>
          <type>boolean</type>
          <defaultValue>false</defaultValue>
          <description>
            True if the released snapshots are to be removed from the repo during repository purge.
          </description>
        </field>
        <field>
          <name>buildAgentUrl</name>
          <version>1.5.0+</version>
          <type>String</type>
          <description>
            BuildAgent URL
          </description>
          <required>true</required>
        </field>
      </fields>
    </class>

    <class>
      <name>ContinuumReleaseResult</name>
      <version>1.1.2+</version>
      <packageName>org.apache.continuum.model.release</packageName>
      <fields>
        <field>
          <name>id</name>
          <version>1.1.2+</version>
          <identifier>true</identifier>
          <type>int</type>
        </field>
        <field>
          <name>startTime</name>
          <version>1.1.2+</version>
          <type>long</type>
        </field>
        <field>
          <name>endTime</name>
          <version>1.1.2+</version>
          <type>long</type>
        </field>
        <field>
          <name>resultCode</name>
          <version>1.1.2+</version>
          <type>int</type>
        </field>
        <field>
          <name>projectGroup</name>
          <version>1.1.2+</version>
          <association xml.reference="true" stash.part="true" jpox.dependent="false">
            <type>ProjectGroup</type>
          </association>
        </field>
        <field>
          <name>project</name>
          <version>1.1.2+</version>
          <association xml.reference="true" stash.part="true" jpox.dependent="false">
            <type>Project</type>
          </association>
        </field>
        <field>
          <name>releaseGoal</name>
          <version>1.1.2+</version>
          <type>String</type>
        </field>
        <field>
          <name>username</name>
          <version>1.4.0+</version>
          <type>String</type>
        </field>
      </fields>
    </class>

    <class>
      <name>ProjectScmRoot</name>
      <version>1.1.3+</version>
      <packageName>org.apache.continuum.model.project</packageName>
      <fields>
        <field>
          <name>id</name>
          <version>1.1.3+</version>
          <identifier>true</identifier>
          <type>int</type>
        </field>
        <field>
          <name>scmRootAddress</name>
          <version>1.1.3+</version>
          <type>String</type>
          <required>true</required>
        </field>
        <field>
          <name>oldState</name>
          <version>1.1.3+</version>
          <type>int</type>
        </field>
        <field jpox.column="scmRootState">
          <name>state</name>
          <version>1.1.3+</version>
          <type>int</type>
        </field>
        <field stash.maxSize="8192">
          <name>error</name>
          <version>1.1.3+</version>
          <type>String</type>
        </field>
        <field>
          <name>projectGroup</name>
          <version>1.1.3+</version>
          <association xml.reference="true" stash.part="true" jpox.dependent="false">
            <type>ProjectGroup</type>
          </association>
          <required>true</required>
        </field>
      </fields>
    </class>
  </classes>
</model>
