<?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="http://modello.codehaus.org/MODELLO/1.4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://modello.codehaus.org/MODELLO/1.4.0 http://modello.codehaus.org/xsd/modello-1.4.0.xsd">
  <id>fileset</id>
  <name>FileSet</name>
  <description>
    <![CDATA[
    <p>
      A definition of a file-set. This model defines how file-sets can be
      captured, using directory, includes, and excludes.
    </p>
    ]]>
  </description>
  <defaults>
    <default>
      <key>package</key>
      <value>org.apache.maven.shared.model.fileset</value>
    </default>
  </defaults>
  <classes>
    <class>
      <name>SetBase</name>
      <version>1.1.0</version>
      <fields>
        <field>
          <name>followSymlinks</name>
          <version>1.0.0+</version>
          <type>boolean</type>
          <defaultValue>false</defaultValue>
          <description>
            Specifies whether symbolic links should be traversed, or handled as-is.
          </description>
        </field>
        <field>
          <name>outputDirectory</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>
            Specifies the output directory relative to the root
            of the root directory of the assembly.  For example,
            "log" will put the specified files in the log directory.
          </description>
        </field>
        <field>
          <name>useDefaultExcludes</name>
          <version>1.1.0</version>
          <type>boolean</type>
          <defaultValue>true</defaultValue>
          <description>
            Whether to include exclusion patterns for common temporary and SCM control
            files (true by default).
          </description>
        </field>
        <field>
          <name>includes</name>
          <version>1.0.0+</version>
          <association>
            <type>String</type>
            <multiplicity>*</multiplicity>
          </association>
          <description>
            <![CDATA[
            When &lt;include&gt; subelements are present, they define
            a set of files and directory to include.
            ]]>
          </description>
        </field>
        <field>
          <name>excludes</name>
          <version>1.0.0+</version>
          <association>
            <type>String</type>
            <multiplicity>*</multiplicity>
          </association>
          <description>
            <![CDATA[
            When &lt;exclude&gt; subelements are present, they define
            a set of files and directory to exclude.
            ]]>
          </description>
        </field>
        <field>
          <name>fileMode</name>
          <version>1.0.0+</version>
          <type>String</type>
          <defaultValue>0644</defaultValue>
          <description>
            <![CDATA[
            Similar to a UNIX permission.  Format: (User)(Group)(Other) where each
            component is a sum of Read = 4, Write = 2, and Execute = 1.  For example,
            the default value of 0644 translates to User read-write, Group and Other
            read-only.
            <a href="http://www.onlamp.com/pub/a/bsd/2000/09/06/FreeBSD_Basics.html">(more on unix-style
            permissions)</a>
            ]]>
          </description>
        </field>
        <field>
          <name>directoryMode</name>
          <version>1.0.0+</version>
          <type>String</type>
          <defaultValue>0755</defaultValue>
          <description>
            <![CDATA[
            Similar to a UNIX permission.  Format: (User)(Group)(Other) where each
            component is a sum of Read = 4, Write = 2, and Execute = 1.  For example,
            the default value of 0755 translates to User read-write, Group and Other
            read-only.
            <a href="http://www.onlamp.com/pub/a/bsd/2000/09/06/FreeBSD_Basics.html">(more on unix-style
            permissions)</a>
            ]]>
          </description>
        </field>
        <field>
          <name>mapper</name>
          <version>1.1.0</version>
          <association>
            <type>Mapper</type>
          </association>
          <defaultValue>new Mapper()</defaultValue>
          <description>
            Specifies the mapper used.
          </description>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>1.0.0+</version>
          <code><![CDATA[
    /**
     * @return the file-set inclusion rules in array form.
     */
    public String[] getIncludesArray()
    {
        String[] includesArry = null;
        java.util.List<String> includes = getIncludes();
        if ( includes != null && !includes.isEmpty() )
        {
            includesArry = (String[]) includes.toArray( new String[0] );
        }
        else if ( includes != null )
        {
            includesArry = new String[0];
        }

        return includesArry;
    }

    /**
     * @return the file-set exclusion rules in array form.
     */
    public String[] getExcludesArray()
    {
        String[] excludesArry = null;
        java.util.List<String> excludes = getExcludes();
        if ( excludes != null && !excludes.isEmpty() )
        {
            excludesArry = (String[]) excludes.toArray( new String[0] );
        }
        else if ( excludes != null )
        {
            excludesArry = new String[0];
        }

        return excludesArry;
    }

          ]]></code>
        </codeSegment>
      </codeSegments>
    </class>
    <class>
      <name>Mapper</name>
      <version>1.1.0</version>
      <fields>
        <field>
          <name>type</name>
          <version>1.1.0</version>
          <type>String</type>
          <defaultValue>identity</defaultValue>
          <description>
            <![CDATA[
            Specifies a built-in mapper implementation.
            <br/>
            Valid values:
            <ul>
              <li><b>"flatten"</b> -
                  The target file name is identical to the source file name, with all leading
                  directory information stripped off. Both to and from will be ignored.
              </li>
              <li><b>"glob"</b> -
                  Both to and from define patterns that may contain at most one *. For each source
                  file that matches the from pattern, a target file name will be constructed from
                  the to pattern by substituting the * in the to pattern with the text that matches
                  the * in the from pattern. Source file names that don't match the from pattern
                  will be ignored.
              </li>
              <li><b>"regexp"</b> -
                  Both to and from define regular expressions. If the source file name matches the
                  from pattern, the target file name will be constructed from the to pattern, using
                  \0 to \9 as back-references for the full match (\0) or the matches of the
                  subexpressions in parentheses. Source files not matching the from pattern will be
                  ignored.
              </li>
              <li><b>"merge"</b> -
                  The target file name will always be the same, as defined by to. from will be
                  ignored.
              </li>
              <li><b>"package"</b> -
                  Sharing the same syntax as the glob mapper, the package mapper replaces directory
                  separators found in the matched source pattern with dots in the target pattern
                  placeholder.
              </li>
              <li><b>"unpackage"</b> -
                  This mapper is the inverse of the package mapper. It replaces the dots in a
                  package name with directory separators. This is useful for matching XML formatter
                  results against their JUnit test test cases. The mapper shares the sample syntax
                  as the glob mapper.
              </li>
            </ul>
            ]]>
          </description>
        </field>
        <field>
          <name>from</name>
          <version>1.1.0</version>
          <type>String</type>
          <description>
              Specifies a type-specific pattern for matching source paths which should be mapped.
          </description>
        </field>
        <field>
          <name>to</name>
          <version>1.1.0</version>
          <type>String</type>
          <description>
          Specifies a type-specific pattern for producing paths based on source paths.
          </description>
        </field>
        <field>
          <name>classname</name>
          <version>1.1.0</version>
          <type>String</type>
          <description>
          Allows specification of a custom mapper implementation. The class must be of type
          org.apache.maven.shared.model.fileset.mappers.FileNameMapper, from the artifact
          org.apache.maven.shared:file-management.
          </description>
        </field>
      </fields>
    </class>
    <class rootElement="true" xml.tagName="fileSet">
      <name>FileSet</name>
      <version>1.1.0</version>
      <superClass>SetBase</superClass>
      <description>
        Defines the rules for matching and working with files in a given base directory.
      </description>
      <fields>
        <field>
          <name>directory</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>
            Absolute or relative from the module's directory.  For
            example, "src/main/bin" would select this subdirectory
            of the project in which this dependency is defined.
          </description>
          <required>true</required>
        </field>
        <field>
          <name>lineEnding</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>
            <![CDATA[
            Controls the line-endings of files in this fileSet.
            <br/>
            Valid values:
            <ul>
              <li><b>"keep"</b> - Preserve all line endings</li>
              <li><b>"unix"</b> - Use Unix-style line endings</li>
              <li><b>"lf"</b> - Use a single line-feed line endings</li>
              <li><b>"dos"</b> - Use DOS-style line endings</li>
              <li><b>"crlf"</b> - Use Carraige-return, line-feed line endings</li>
            </ul>
            ]]>
          </description>
        </field>
      </fields>
    </class>
  </classes>
</model>
