~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~   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.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                -----
                Built-In Types
                -----

Built-In Types

 The Rat Antlib defines a few Ant types that can be used as nested
 elements to the {{{./report.html} Report Task}} as license matchers or
 license families.

 In order to stay compatible with Ant 1.7.1 these types are defined
 via {{{http://ant.apache.org/manual/Tasks/typedef.html}
 <<<typedef>>>}} rather than
 {{{http://ant.apache.org/manual/Tasks/componentdef.html}
 <<<componentdef>>>}} which means they can be defined outside of the
 Report task as well - but they will be completely useless there.

{License Matchers}

 The following types correspond to the built-in license matchers of Rat:

*-------*---------+-------------+
| Typename | Detected License | Corresponding class |
*-------*---------+-------------+
| asl20 | Apache License 2.0 | <<<org.apache.rat.analysis.license.ApacheSoftwareLicense20>>>
*-------*---------+-------------+
| dojo | {{{http://dojotoolkit.org/community/licensing.shtml}License of the Dojo Toolkit}} | <<<org.apache.rat.analysis.license.DojoLicenseHeader>>>
| <since Rat Antlib 0.8> | |
*-------*---------+-------------+
| generated | Generated documents that don't need a license | <<<org.apache.rat.analysis.generation.GeneratedLicenseNotRequired>>>
*-------*---------+-------------+
| gpl1 | {{{http://www.gnu.org/licenses/old-licenses/gpl-1.0.html}GNU General Public License, version 1}} | <<<org.apache.rat.analysis.license.GPL1License>>>
| <since Rat Antlib 0.9> | |
*-------*---------+-------------+
| gpl2 | {{{http://www.gnu.org/licenses/old-licenses/gpl-2.0.html}GNU General Public License, version 2}} | <<<org.apache.rat.analysis.license.GPL2License>>>
| <since Rat Antlib 0.9> | |
*-------*---------+-------------+
| gpl3 | {{{http://www.gnu.org/licenses/gpl.html}GNU General Public License, version 3}} | <<<org.apache.rat.analysis.license.GPL3License>>>
| <since Rat Antlib 0.9> | |
*-------*---------+-------------+
| javadoc | Javadocs that don't need a license | <<<org.apache.rat.analysis.generation.JavaDocLicenseNotRequired>>>
*-------*---------+-------------+
| mit | {{{http://www.opensource.org/licenses/MIT}The MIT License}} | <<<org.apache.rat.analysis.license.MITLicense>>>
| <since Rat Antlib 0.9> | |
*-------*---------+-------------+
| oasis | OASIS copyright claim plus derivative work clause | <<<org.apache.rat.analysis.license.OASISLicense>>>
| <since Rat Antlib 0.8> | |
*-------*---------+-------------+
| w3c | {{{http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231}W3C Software License}} | <<<org.apache.rat.analysis.license.W3CLicense>>>
*-------*---------+-------------+
| w3c-doc | {{{http://www.w3.org/Consortium/Legal/2002/copyright-documents-20021231}W3C Document License}} | <<<org.apache.rat.analysis.license.W3CDocLicense>>>
*-------*---------+-------------+

 While these types may technically provide attributes or nested
 elements you should use them as sole tags.

* {<<<substringMatcher>>>}

 <since Rat Antlib 0.8>

 For the simple case where a license can be detected by searching for
 a given string in a single line of the source code - in fact this is what
 many built-in implementations do - you can use the
 <<<substringMatcher>>> type.

**  Attributes of the Type

*-------------------------*-------------------------------+
|Name                     |Description                    |
*-------------------------*-------------------------------+
| licenseFamilyCategory | Short name of the detected license.  Should be at most five characters long if you want to keep the layout of the plain text report.
| | This will be printed next to to the checked file inside the plain text report and creates <<<header-type>>> elements inside the XML report.
| | <<REQUIRED>>
*-------------------------*-------------------------------+
| licenseFamilyName | Long name of the detected license.  The value is checked against the list of approved licenses.
| | This will not appear inside the plain text report and creates <<<license-family>>> elements inside the XML report.
| | <<REQUIRED>>
*-------------------------*-------------------------------+
| notes | Additional notes you want to provide.
| | This will not appear inside the plain text report and creates <<<header-sample>>> elements inside the XML report.
*-------------------------*-------------------------------+

**  Nested Elements Supported by the Type

 The substring(s) to look for are specified as nested <<<pattern>>>
 elements with a substring attribute.  You can specifiy multiple
 <<<pattern>>> elements and the <<<substringMatcher>>> will claim the
 license matches if at least one substring can be found.

 At least one pattern is required.

** Example

 Taking the example of {{{./examples/custom.html}the custom types page}}
 in order to detect

------------------------------------------------------------------
  /**
   * Yet Another Software License, 1.0
   *
   * Lots of text, specifying the users rights, and whatever ...
   */
------------------------------------------------------------------

  you could use

------------------------------------------------------------------
<rat:report>
    <fileset dir="src"/>
    <rat:substringMatcher licenseFamilyCategory="YASL1"
             licenseFamilyName="Yet Another Software License, Version 1.0">
        <pattern substring="Yet Another Software License, 1.0"/>
    </rat:substringMatcher>
</rat:report>
------------------------------------------------------------------

* {<<<fullTextMatcher>>>}

 <since Rat Antlib 0.9>

 This matcher searches for the full text given, ignoring everything
 that is not a character or a number (and for US-ASCII characters it
 is case-insensitive).  This allows licenses to be detected that can't
 be identified by a single line, even if the formatting has been
 changed.

**  Attributes of the Type

*-------------------------*-------------------------------+
|Name                     |Description                    |
*-------------------------*-------------------------------+
| licenseFamilyCategory | Short name of the detected license.  Should be at most five characters long if you want to keep the layout of the plain text report.
| | This will be printed next to to the checked file inside the plain text report and creates <<<header-type>>> elements inside the XML report.
| | <<REQUIRED>>
*-------------------------*-------------------------------+
| licenseFamilyName | Long name of the detected license.  The value is checked against the list of approved licenses.
| | This will not appear inside the plain text report and creates <<<license-family>>> elements inside the XML report.
| | <<REQUIRED>>
*-------------------------*-------------------------------+
| notes | Additional notes you want to provide.
| | This will not appear inside the plain text report and creates <<<header-sample>>> elements inside the XML report.
*-------------------------*-------------------------------+
| fullText | The license text to look for.
| | Everything that is not a character or a digit will be ignored.
| | <<REQUIRED>> unless the text is specified as nested content.
*-------------------------*-------------------------------+

 You can also nest the license text directly as content into the type.

** Example

 Taking the example of {{{./examples/custom.html}the custom types page}}
 in order to detect

------------------------------------------------------------------
  /**
   * Yet Another Software License, 1.0
   *
   * Lots of text, specifying the users rights, and whatever ...
   */
------------------------------------------------------------------

  you could use

------------------------------------------------------------------
<rat:report>
    <fileset dir="src"/>
    <rat:fullTextMatcher licenseFamilyCategory="YASL1"
             licenseFamilyName="Yet Another Software License, Version 1.0"
             fullText="Yet Another Software License, 1.0 Lots of text, specifying the users rights, and whatever">
    </rat:fullTextMatcher>
</rat:report>
------------------------------------------------------------------

  or

------------------------------------------------------------------
<rat:report>
    <fileset dir="src"/>
    <rat:fullTextMatcher licenseFamilyCategory="YASL1"
             licenseFamilyName="Yet Another Software License, Version 1.0">
Yet Another Software License, 1.0

Lots of text, specifying the users rights, and whatever
    </rat:fullTextMatcher>
</rat:report>
------------------------------------------------------------------

{License Families}

 The following types correspond to the built-in license families of Rat:

*-------*---------+-------------+
| Typename | License Family | Corresponding class |
*-------*---------+-------------+
*-------*---------+-------------+
| academic-free-21 | Academic Free License 2.1 | <<<org.apache.rat.license.AcademicFree21LicenseFamily>>>
| <since Rat Antlib 0.8> | |
*-------*---------+-------------+
| apache20-license | Apache License 2.0 | <<<org.apache.rat.license.Apache20LicenseFamily>>>
*-------*---------+-------------+
| gpl1-family | GNU General Public License, version 1 | <<<org.apache.rat.license.GPL1LicenseFamily>>>
| <since Rat Antlib 0.9> | |
*-------*---------+-------------+
| gpl2-family | GNU General Public License, version 2 | <<<org.apache.rat.license.GPL2LicenseFamily>>>
| <since Rat Antlib 0.9> | |
*-------*---------+-------------+
| gpl3-family | GNU General Public License, version 3 | <<<org.apache.rat.license.GPL3LicenseFamily>>>
| <since Rat Antlib 0.9> | |
*-------*---------+-------------+
| mit-family | The MIT License | <<<org.apache.rat.license.MITLicenseFamily>>>
| <since Rat Antlib 0.9> | |
*-------*---------+-------------+
| modified-bsd | Modified BSD License | <<<org.apache.rat.license.ModifiedBSDLicenseFamily>>>
| <since Rat Antlib 0.8> | |
*-------*---------+-------------+
| oasis-license | OASIS copyright claim plus derivative work clause | <<<org.apache.rat.license.OASISLicenseFamily>>>
| <since Rat Antlib 0.8> | |
*-------*---------+-------------+
| w3c-doc-license | {{{http://www.w3.org/Consortium/Legal/2002/copyright-documents-20021231}W3C Document License}} | <<<org.apache.rat.license.W3CDocumentLicenseFamily>>>
*-------*---------+-------------+
| w3c-soft-license | {{{http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231}W3C Software License}} | <<<org.apache.rat.license.W3CSoftwareLicenseFamily>>>
*-------*---------+-------------+

 While these types may technically provide attributes or nested
 elements you should use them as sole tags.

* {<<<approvedLicense>>>}

 <since Rat Antlib 0.8>

 This wrapper type makes it easy to specify a license name for new
 approved licenses.  The type has a single attribute <<<familyName>>>
 that must match the license family name returned by the license
 matcher to make a license approved.

** Example

 To make the YASL license of the {{substringMatcher}} Example approved
 you'd use

------------------------------------------------------------------
<rat:report>
    <fileset dir="src"/>
    <rat:substringMatcher licenseFamilyCategory="YASL1"
             licenseFamilyName="Yet Another Software License, Version 1.0">
        <pattern substring="Yet Another Software License, 1.0"/>
    </rat:substringMatcher>
    <rat:approvedLicense
             familyName="Yet Another Software License, Version 1.0"/>
</rat:report>
------------------------------------------------------------------
