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

 -----------------------
 Custom License Matchers
 -----------------------

Custom License Matchers

  Rat comes with a set of predefined license matchers, that can be used
  some typical licenses. However, they will not always be sufficient.
  In such cases, you may use a custom license matcher.

  A custom license matcher is an implementation of
  <<<org.apache.rat.analysis.IHeaderMatcher>>>. Suggest that your
  source files must contain a header like the following:

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

  A very easy way to search for such headers would be to scan
  for the string "Yet Another Software License, 1.0". And here's
  how you would do that in your POM:

------------------------------------------------------------------
  <build>
    <plugins>
      ...
      <plugin>
        <groupId>org.apache.rat</groupId>
        <artifactId>apache-rat-plugin</artifactId>
        <version>${currentVersion}</version>
        <configuration>
          <licenses>
            <license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense">
              <licenseFamilyCategory>YASL1</licenseFamilyCategory>
              <licenseFamilyName>Yet Another Software License (YASL) 1.0</licenseFamilyName>
              <notes></notes>
              <patterns>
                <pattern>Yet Another Software License, 1.0</pattern>
              </patterns>
            </license>
          </licenses>
        </configuration>
      </plugin>
      ...
    </plugins>
  </build>
------------------------------------------------------------------

  The following terms are used in the example:

*-----------------------+-----------+
| licenseFamilyCategory | The license family category is a very short string (exactly 5 characters, preferrably no blanks),
|                       | which identifies the license. For example, this could be <<<AL20>>> to identify the
|                       |  Apache License, 2.0.
*-----------------------+-----------+
| licenseFamilyName     | The license family name is a longer string, which gives the licenses full name. For example,
|                       | this could be <<<Apache License, 2.0>>>.
*-----------------------+-----------+
| notes                 | You might specify additional notes here, like "Dual licensed GPL/MPL".
*-----------------------+-----------+
| patterns              | Specifies a set of patterns being searched. The source file is assumed to contain the
|                       | license header, if at least one of these patterns is found.
*-----------------------+-----------+

Approved License Families

  Detecting the license is not enough in many cases as the "new"
  license may not be considered approved by Rat.  In order to make a
  license approved you provide a custom implementation of
  <<<org.apache.rat.license.ILicenseFamily>>>.  Usually all you need
  to provide the name of the license, in which case the built-in
  <<<SimpleLicenseFamily>>> will do.

  To continue the example, in order to make the YASL1 license approved
  you'd use

------------------------------------------------------------------
  <build>
    <plugins>
      ...
      <plugin>
        <groupId>org.apache.rat</groupId>
        <artifactId>apache-rat-plugin</artifactId>
        <version>${currentVersion}</version>
        <configuration>
          <licenses>
            <license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense">
              <licenseFamilyCategory>YASL1</licenseFamilyCategory>
              <licenseFamilyName>Yet Another Software License (YASL) 1.0</licenseFamilyName>
              <notes></notes>
              <patterns>
                <pattern>Yet Another Software License, 1.0</pattern>
              </patterns>
            </license>
          </licenses>
          <licenseFamilies>
            <licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
              <familyName>Yet Another Software License</familyName>
            </licenseFamily>
          </licenseFamilies>
        </configuration>
      </plugin>
      ...
    </plugins>
  </build>
------------------------------------------------------------------

  The following terms are used in the example:

*-----------------------+-----------+
| familyName            | The name of the license family name that is approved.
|                       | This should match <<<licenseFamilyName>>> of your <<<licenseMatcher>>>
*-----------------------+-----------+

