<!--
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"
  xml.namespace="http://maven.apache.org/PROFILES/${version}"
  xml.schemaLocation="http://maven.apache.org/xsd/profiles-${version}.xsd">
  <id>profiles</id>
  <name>Profiles</name>
  <description><![CDATA[
    Project-local overrides to the build process based on detected or user-provided environmental parameters.
    This is the model specification for ${basedir}/profiles.xml.
  ]]></description>
  <defaults>
    <default>
      <key>package</key>
      <value>org.apache.maven.profiles</value>
    </default>
  </defaults>
  <classes>
    <class rootElement="true" xml.tagName="profilesXml">
      <name>ProfilesRoot</name>
      <version>1.0.0</version>
      <description>Root element of the profiles.xml file.</description>
      <fields>
        <field>
          <name>profiles</name>
          <version>1.0.0</version>
          <description><![CDATA[
            Configuration of build profiles for adjusting the build
            according to environmental parameters
          ]]></description>
          <association>
            <type>Profile</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>activeProfiles</name>
          <version>1.0.0</version>
          <description><![CDATA[
            List of manually-activated build profiles, specified in the order in which
            they should be applied.
          ]]></description>
          <association>
            <type>String</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
      </fields>
    </class>
    <class>
      <name>Profile</name>
      <version>1.0.0</version>
      <description><![CDATA[
        Modifications to the build process which is keyed on some
        sort of environmental parameter.
      ]]></description>
      <fields>
        <field>
          <name>id</name>
          <required>true</required>
          <version>1.0.0</version>
          <type>String</type>
          <description>The ID of this build profile, for activation
            purposes.</description>
        </field>
        <field>
          <name>activation</name>
          <version>1.0.0</version>
          <description><![CDATA[The conditional logic which will automatically
            trigger the inclusion of this profile.]]></description>
          <association>
            <type>Activation</type>
          </association>
        </field>
        <field>
          <name>properties</name>
          <description>Extended configuration specific to this profile goes
            here.</description>
          <type>Properties</type>
          <association xml.mapStyle="inline">
            <type>String</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>repositories</name>
          <version>1.0.0</version>
          <description><![CDATA[The lists of the remote repositories]]>
          </description>
          <association>
            <type>Repository</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>pluginRepositories</name>
          <version>1.0.0</version>
          <description><![CDATA[
          The lists of the remote repositories for discovering plugins
        ]]></description>
          <association>
            <type>Repository</type>
            <multiplicity>*</multiplicity>
          </association>
          <comment><![CDATA[ This may be removed or relocated in the near
            future. It is undecided whether plugins really need a remote
            repository set of their own. ]]></comment>
        </field>
      </fields>
    </class>
    <class>
      <name>Activation</name>
      <version>1.0.0</version>
      <description><![CDATA[
        The conditions within the build runtime environment which will trigger
        the automatic inclusion of the parent build profile.
      ]]></description>
      <fields>
        <field>
          <name>activeByDefault</name>
          <version>1.0.0</version>
          <type>boolean</type>
          <description>Flag specifying whether this profile is active as a default.</description>
        </field>
        <field>
          <name>jdk</name>
          <version>1.0.0</version>
          <type>String</type>
          <description><![CDATA[
            Specifies that this profile will be activated when a matching JDK is detected.
          ]]></description>
        </field>
        <field>
          <name>os</name>
          <version>1.0.0</version>
          <description><![CDATA[
            Specifies that this profile will be activated when matching OS attributes are detected.
          ]]></description>
          <association>
            <type>ActivationOS</type>
          </association>
        </field>
        <field>
          <name>property</name>
          <version>1.0.0</version>
          <description><![CDATA[
            Specifies that this profile will be activated when this System property is specified.
          ]]></description>
          <association>
            <type>ActivationProperty</type>
          </association>
        </field>
        <field>
          <name>file</name>
          <version>1.0.0</version>
          <description><![CDATA[
             Specifies that this profile will be activated based on existence of a file.
             ]]></description>
          <association>
            <type>ActivationFile</type>
          </association>
        </field>
      </fields>
    </class>

    <!-- TODO: reproduced from maven-model/maven.mdo, instead should inherit code and link to external docs -->
    <class>
      <name>RepositoryBase</name>
      <version>1.0.0</version>
      <description><![CDATA[
         Repository contains the information needed
         for establishing connections with remote repository
      ]]></description>
      <fields>
        <field>
          <name>id</name>
          <version>1.0.0</version>
          <description><![CDATA[
            A unique identifier for a repository.
          ]]></description>
          <type>String</type>
        </field>
        <field>
          <name>name</name>
          <version>1.0.0</version>
          <description><![CDATA[
            Human readable name of the repository
          ]]></description>
          <type>String</type>
        </field>
        <field>
          <name>url</name>
          <version>1.0.0</version>
          <description><![CDATA[
             The url of the repository
          ]]></description>
          <type>String</type>
        </field>
        <field>
          <name>layout</name>
          <version>1.0.0</version>
          <description>The type of layout this repository uses for locating and storing artifacts - can be "legacy" or
            "default".</description>
          <type>String</type>
          <defaultValue>default</defaultValue>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>1.0.0</version>
          <code><![CDATA[
            public boolean equals( Object obj )
            {
                RepositoryBase other =  (RepositoryBase) obj;

                boolean retValue = false;

                if ( id != null )
                {
                    retValue = id.equals( other.id );
                }

                return retValue;
            }
          ]]></code>
        </codeSegment>
      </codeSegments>
    </class>
    <class>
      <name>Repository</name>
      <superClass>RepositoryBase</superClass>
      <version>1.0.0</version>
      <description>
        Repository contains the information needed for establishing connections with remote repository
      </description>
      <fields>
        <field>
          <name>releases</name>
          <version>1.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>1.0.0</version>
          <description>How to handle downloading of snapshots from this repository</description>
          <association>
            <type>RepositoryPolicy</type>
          </association>
        </field>
      </fields>
      <!-- prevent modello generation of an incorrect equals method. Could be avoided by using <identity/> tags to mark ID as the only identity field -->
      <codeSegments>
        <codeSegment>
          <version>1.0.0</version>
          <code><![CDATA[
            public boolean equals( Object obj )
            {
                return super.equals( obj );
            }
          ]]></code>
        </codeSegment>
      </codeSegments>
    </class>

    <class>
      <name>RepositoryPolicy</name>
      <version>1.0.0</version>
      <description>Download policy</description>
      <fields>
        <field>
          <name>enabled</name>
          <version>1.0.0</version>
          <description>Whether to use this repository for downloading this type of artifact</description>
          <type>boolean</type>
          <defaultValue>true</defaultValue>
        </field>
        <field>
          <name>updatePolicy</name>
          <version>1.0.0</version>
          <description>
            The frequency for downloading updates - can be "always", "daily" (default), "interval:XXX" (in minutes) or
            "never" (only if it doesn't exist locally).
          </description>
          <type>String</type>
        </field>
        <field>
          <name>checksumPolicy</name>
          <version>1.0.0</version>
          <description>
            What to do when verification of an artifact checksum fails. Valid values are "fail" (default for Maven 4 and
            above), "warn" (default for Maven 2 and 3) or "ignore".
          </description>
          <type>String</type>
        </field>
      </fields>
    </class>
    <class>
      <name>ActivationProperty</name>
      <version>1.0.0</version>
      <description><![CDATA[
        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>1.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>1.0.0</version>
          <type>String</type>
          <description>The value of the property to be used to activate a profile</description>
        </field>
      </fields>
    </class>
    <class>
      <name>ActivationFile</name>
      <version>1.0.0</version>
      <description><![CDATA[
        This is the file specification used to activate a profile. The missing value will be a the location
        of a file that needs to exist, and if it doesn't the profile must run.  On the other hand exists will test
        for the existence of the file and if it is there will run the profile.
      ]]></description>
      <fields>
        <field>
          <name>missing</name>
          <version>1.0.0</version>
          <type>String</type>
          <description>The name of the file that should be missing to activate a profile</description>
        </field>
        <field>
          <name>exists</name>
          <version>1.0.0</version>
          <type>String</type>
          <description>The name of the file that should exist to activate a profile</description>
        </field>
      </fields>
    </class>
    <class>
      <name>ActivationOS</name>
      <version>1.0.0</version>
      <description><![CDATA[
        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>1.0.0</version>
          <type>String</type>
          <description>The name of the OS to be used to activate a profile</description>
        </field>
        <field>
          <name>family</name>
          <version>1.0.0</version>
          <type>String</type>
          <description>The general family of the OS to be used to activate a profile (e.g. 'windows')</description>
        </field>
        <field>
          <name>arch</name>
          <version>1.0.0</version>
          <type>String</type>
          <description>The architecture of the OS to be used to activate a profile</description>
        </field>
        <field>
          <name>version</name>
          <version>1.0.0</version>
          <type>String</type>
          <description>The version of the OS to be used to activate a profile</description>
        </field>
      </fields>
    </class>
  </classes>
</model>
