<!--
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://codehaus-plexus.github.io/MODELLO/1.4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://codehaus-plexus.github.io/MODELLO/1.4.0 http://codehaus-plexus.github.io/modello/xsd/modello-1.4.0.xsd"
  xsd.namespace="http://maven.apache.org/METADATA/${version}"
  xml.schemaLocation="http://maven.apache.org/xsd/metadata-${version}.xsd">
  <id>repository-metadata</id>
  <name>Metadata</name>
  <description><![CDATA[
    <p>Per-directory repository metadata, for directories representing un-versioned artifact, snapshot artifact
    or a group containing Maven plugins.</p>
    <p>Notice that most metadata content has a meaning when the directory represents
    an artifact (<code>groupId</code>, <code>artifactId</code>, <code>versioning</code>), but
    <code>plugins</code> is used when the directory represents a group.</p>]]>
  </description>
  <defaults>
    <default>
      <key>package</key>
      <value>org.apache.maven.artifact.repository.metadata</value>
    </default>
  </defaults>
  <classes>
    <class rootElement="true" java.clone="deep">
      <name>Metadata</name>
      <version>1.0.0+</version>
      <fields>
        <field xml.attribute="true">
          <name>modelVersion</name>
          <version>1.1.0+</version>
          <type>String</type>
          <description>The version of the underlying metadata model.</description>
        </field>
        <field>
          <name>groupId</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>The groupId that this directory represents, if any.</description>
        </field>
        <field>
          <name>artifactId</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>The artifactId that this directory represents, if any.</description>
        </field>
        <field>
          <name>version</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>The version that this directory represents, if any. It is used for artifact snapshots only.</description>
        </field>
        <field>
          <name>versioning</name>
          <version>1.0.0+</version>
          <association>
            <type>Versioning</type>
          </association>
          <description>Versioning information for the artifact.</description>
        </field>
        <field xdoc.separator="blank">
          <name>plugins</name>
          <version>1.0.0+</version>
          <description>The set of plugin mappings for the group represented by this directory</description>
          <association>
            <type>Plugin</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>1.0.0+</version>
          <code><![CDATA[
    public boolean merge( Metadata sourceMetadata )
    {
        boolean changed = false;

        for ( Plugin plugin : sourceMetadata.getPlugins() )
        {
            boolean found = false;

            for ( Plugin preExisting : getPlugins() )
            {
                if ( preExisting.getPrefix().equals( plugin.getPrefix() ) )
                {
                    found = true;
                    break;
                }
            }

            if ( !found )
            {
                Plugin mappedPlugin = new Plugin();

                mappedPlugin.setArtifactId( plugin.getArtifactId() );

                mappedPlugin.setPrefix( plugin.getPrefix() );

                mappedPlugin.setName( plugin.getName() );

                addPlugin( mappedPlugin );

                changed = true;
            }
        }

        Versioning versioning = sourceMetadata.getVersioning();
        if ( versioning != null )
        {
            Versioning v = getVersioning();
            if ( v == null )
            {
                v = new Versioning();
                setVersioning( v );
                changed = true;
            }

            for ( String version : versioning.getVersions() )
            {
                if ( !v.getVersions().contains( version ) )
                {
                    changed = true;
                    v.getVersions().add( version );
                }
            }

            if ( "null".equals( versioning.getLastUpdated() ) )
            {
                versioning.setLastUpdated( null );
            }

            if ( "null".equals( v.getLastUpdated() ) )
            {
                v.setLastUpdated( null );
            }

            if ( versioning.getLastUpdated() == null || versioning.getLastUpdated().length() == 0 )
            {
                // this should only be for historical reasons - we assume local is newer
                versioning.setLastUpdated( v.getLastUpdated() );
            }

            if ( v.getLastUpdated() == null || v.getLastUpdated().length() == 0
                 || versioning.getLastUpdated().compareTo( v.getLastUpdated() ) >= 0 )
            {
                changed = true;
                v.setLastUpdated( versioning.getLastUpdated() );

                if ( versioning.getRelease() != null )
                {
                    changed = true;
                    v.setRelease( versioning.getRelease() );
                }
                if ( versioning.getLatest() != null )
                {
                    changed = true;
                    v.setLatest( versioning.getLatest() );
                }

                Snapshot s = v.getSnapshot();
                Snapshot snapshot = versioning.getSnapshot();
                if ( snapshot != null )
                {
                    if ( s == null )
                    {
                        s = new Snapshot();
                        v.setSnapshot( s );
                        changed = true;
                    }

                    // overwrite
                    if ( s.getTimestamp() == null ? snapshot.getTimestamp() != null
                        : !s.getTimestamp().equals( snapshot.getTimestamp() ) )
                    {
                        s.setTimestamp( snapshot.getTimestamp() );
                        changed = true;
                    }
                    if ( s.getBuildNumber() != snapshot.getBuildNumber() )
                    {
                        s.setBuildNumber( snapshot.getBuildNumber() );
                        changed = true;
                    }
                    if ( s.isLocalCopy() != snapshot.isLocalCopy() )
                    {
                        s.setLocalCopy( snapshot.isLocalCopy() );
                        changed = true;
                    }
                }
            }
        }
        return changed;
    }
          ]]></code>
        </codeSegment>
      </codeSegments>
    </class>
    <class java.clone="deep">
      <name>Versioning</name>
      <version>1.0.0+</version>
      <description>Versioning information for an artifact (un-versioned or snapshot)</description>
      <fields>
        <field>
          <name>latest</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>What the latest version in the directory is, including snapshots</description>
        </field>
        <field>
          <name>release</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>What the latest version in the directory is, of the releases only</description>
        </field>
        <field>
          <name>snapshot</name>
          <version>1.0.0+</version>
          <association>
            <type>Snapshot</type>
          </association>
          <description>The current snapshot data in use for this version (artifact snapshots only)</description>
        </field>
        <field>
          <name>versions</name>
          <version>1.0.0+</version>
          <description>Versions available of the artifact (both releases and snapshots)</description>
          <association>
            <type>String</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>lastUpdated</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>When the metadata was last updated</description>
        </field>
        <field>
          <name>snapshotVersions</name>
          <version>1.1.0+</version>
          <description>Information for each sub-artifact available in this artifact snapshot.</description>
          <association>
            <type>SnapshotVersion</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>1.0.0+</version>
          <code><![CDATA[
    public void updateTimestamp()
    {
        setLastUpdatedTimestamp( new java.util.Date() );
    }

    public void setLastUpdatedTimestamp( java.util.Date date )
    {
        java.util.TimeZone timezone = java.util.TimeZone.getTimeZone( "UTC" );
        java.text.DateFormat fmt = new java.text.SimpleDateFormat( "yyyyMMddHHmmss" );
        fmt.setTimeZone( timezone );
        setLastUpdated( fmt.format( date ) );
    }
          ]]></code>
        </codeSegment>
      </codeSegments>
    </class>
    <class java.clone="deep">
      <name>Snapshot</name>
      <version>1.0.0+</version>
      <description>Snapshot data for the current artifact version</description>
      <fields>
        <field>
          <name>timestamp</name>
          <version>1.0.0+</version>
          <description>The time it was deployed</description>
          <type>String</type>
        </field>
        <field>
          <name>buildNumber</name>
          <version>1.0.0+</version>
          <description>The incremental build number</description>
          <type>int</type>
        </field>
        <field>
          <name>localCopy</name>
          <version>1.0.0+</version>
          <description>Whether to use a local copy instead (with filename that includes the base version)</description>
          <type>boolean</type>
          <defaultValue>false</defaultValue>
        </field>
      </fields>
    </class>
    <class java.clone="deep">
      <name>SnapshotVersion</name>
      <version>1.1.0+</version>
      <description>Versioning information for a sub-artifact of the current snapshot artifact.</description>
      <fields>
        <field>
          <name>classifier</name>
          <version>1.1.0+</version>
          <type>String</type>
          <description>The classifier of the sub-artifact.</description>
          <defaultValue></defaultValue>
        </field>
        <field>
          <name>extension</name>
          <version>1.1.0+</version>
          <type>String</type>
          <description>The file extension of thesub-artifact.</description>
        </field>
        <field xml.tagName="value">
          <name>version</name>
          <version>1.1.0+</version>
          <type>String</type>
          <description>The resolved snapshot version of the sub-artifact.</description>
        </field>
        <field>
          <name>updated</name>
          <version>1.1.0+</version>
          <type>String</type>
          <description>The timestamp when this version information was last updated. The timestamp is expressed using UTC in the format yyyyMMddHHmmss.</description>
        </field>
      </fields>
    </class>
    <class java.clone="deep">
      <name>Plugin</name>
      <version>1.0.0+</version>
      <description>Mapping information for a single plugin within this group</description>
      <comment>NOTE: plugin version is _NOT_ included here, since it is resolved using a separate algorithm in plugins' artifact.</comment>
      <fields>
        <field>
          <name>name</name>
          <type>String</type>
          <required>true</required>
          <version>1.0.0+</version>
          <description>Display name for the plugin.</description>
        </field>
        <field>
          <name>prefix</name>
          <type>String</type>
          <required>true</required>
          <version>1.0.0+</version>
          <description>The plugin invocation prefix (i.e. eclipse for eclipse:eclipse)</description>
        </field>
        <field>
          <name>artifactId</name>
          <type>String</type>
          <required>true</required>
          <version>1.0.0+</version>
          <description>The plugin artifactId</description>
        </field>
      </fields>
    </class>
  </classes>
</model>
