<?xml version="1.0" encoding="UTF-8"?>

<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

<model xmlns="https://codehaus-plexus.github.io/MODELLO/1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://codehaus-plexus.github.io/MODELLO/1.4.1 https://codehaus-plexus.github.io/modello/xsd/modello-1.4.1.xsd"
  xml.namespace="http://maven.apache.org/SKIN/${version}"
  xml.schemaLocation="http://maven.apache.org/xsd/skin-${version}.xsd">
  <id>skin</id>
  <name>Skin</name>
  <description><![CDATA[
    <p>This is a reference for the skin descriptor used in Doxia Sitetools, stored as <code>META-INF/maven/skin.xml</code>.</p>
    <p>An XSD is available at:</p>
    <ul>
      <!-- There is no property filtering in Modello, this has to be updated manually. See DOXIASITETOOLS-98. -->
      <li><a href="http://maven.apache.org/xsd/skin-1.7.0.xsd">http://maven.apache.org/xsd/skin-1.7.0.xsd</a></li>
    </ul>
    ]]></description>

  <defaults>
    <default>
      <key>package</key>
      <value>org.apache.maven.doxia.site.skin</value>
    </default>
  </defaults>

  <classes>
    <class rootElement="true" xml.tagName="skin" java.clone="deep">
      <name>SkinModel</name>
      <description><![CDATA[
         The <code>&lt;skin&gt;</code> element is the root of the skin descriptor.
      ]]></description>
      <version>1.7.0+</version>
      <fields>
        <!-- ====================================================================== -->
        <!-- Build prerequisites                                                    -->
        <!-- ====================================================================== -->

        <field>
          <name>prerequisites</name>
          <version>1.7.0+</version>
          <description>Describes the prerequisites in the build environment for using this skin.</description>
          <association>
            <type>Prerequisites</type>
          </association>
        </field>
        <field xdoc.separator="blank">
          <name>encoding</name>
          <version>1.7.0+</version>
          <description>Encoding of text content, like the Velocity template itself.</description>
          <type>String</type>
          <required>false</required>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>1.7.0+</version>
          <code>
            <![CDATA[
    public static final String SKIN_DESCRIPTOR_LOCATION = "META-INF/maven/skin.xml";
            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>
    <class java.clone="deep">
      <name>Prerequisites</name>
      <version>1.7.0+</version>
      <description>Describes the prerequisites a skin can have.</description>
      <fields>
        <field xml.tagName="doxia-sitetools">
          <name>doxiaSitetools</name>
          <version>1.7.0+</version>
          <type>String</type>
          <defaultValue>1.7</defaultValue>
          <description><![CDATA[
            The minimum version of Doxia Sitetools required to use the resulting skin.
            ]]>
          </description>
          <required>false</required>
        </field>
      </fields>
    </class>
  </classes>
</model>
