<?xml version="1.0"?>
<!--
 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.
-->
<document>

  <properties>
    <author email="dev@commons.apache.org">commons-dev</author>
    <title>CLI2 - Validators</title>
  </properties>

  <body>
    <section name="Validators">
      <p>
        CLI2 provides a mechanism to validate argument values.  The <code>Validator</code>
        interface must be implemented to create an argument validator.  This interface has
        a single method <code>validate(java.util.List values) throws InvalidArgumentException</code>.
      </p>
      <p>
        CLI2 has some standard validators included.  They validate the following:
      </p>
      <ul>
        <li>Java class</li>
        <li>date</li>
        <li>enumeration</li>
        <li>file path</li>
        <li>number</li>
        <li>URL</li>
      </ul>
      
      <subsection name="ClassValidator">
        <p>
          The <code>ClassValidator</code> validates a value using three criteria:
        </p>
        <ol>
          <li>the value adheres to the Java Language Specification rules</li>
          <li>the class specified by the name is loadable</li>
          <li>the class specified by the name can be instantiated</li>
        </ol>
        <source>// 1.
ClassValidator validator = new ClassValidator();
// 2.
validator.setLoadable(true);
// 3.
validator.setLoadable(true);</source>
        <p>
        TODO: add section about values being replaced with class instances
        </p>
      </subsection>
      
      <subsection name="DateValidator">
        <p>
          The <code>DateValidator</code> validates values against a 
          <code>java.text.DateFormat</code>.  There are three helper methods
          that create built-in validators.
        </p>
        <ol>
          <li><code>getDateInstance</code> returns a validator for the default
          date format for the default locale.
          </li>
          <li><code>getTimeInstance</code> returns a validator for the default
          time format for the default locale.
          </li>
          <li><code>getDateTimeInstance</code> returns a validator for the default
          date and time format for the default locale.
          </li>
        </ol>
        <p>
          A <code>DateValidator</code> can also be created by passing your
          a custom <code>DateFormat</code> into the constructor.
        </p>
        <source>DateFormat myFormat = DateFormat.getDateInstance( DateFormat.LONG, Locale.UK );
DateValidator myValidator = new DateValidator( myFormat );</source>
        <p>
          In addition to basic format checking you can also check if the date/time specified
          is before/after a specific date/time.  The lower bound is set using the 
          <code>setMinimum( java.util.Date )</code>, and the upper bound is set using
          the <code>setMaximum( java.util.Date )</code>.
        </p>
        <p>
        TODO: add section about values being replaced with date instances
        </p>
      </subsection>
      
      <subsection name="EnumValidator">
        <p>
          The <code>EnumValidator</code> validates values against a list of
          allowed string values.  The values that are allowed are specified in
          a <code>java.util.Set</code> and passed in to the constructor.
        </p>
        <source>Set enumSet = new TreeSet();
enumSet.add("red");
enumSet.add("green");
enumSet.add("blue");
       
EnumValidator validator = new EnumValidator( enumSet );</source>
      </subsection>
      
      <subsection name="FileValidator">
        <p>
          The <code>FileValidator</code> validates that values represent
          existing files.  You can also specify a combination of the 
          following additional criteria:
        </p>
        <ol>
          <li>value is a file</li>
          <li>value is a directory</li>
          <li>the file is writable</li>
          <li>the file is readable</li>
          <li>the file is hidden</li>
        </ol>
        <p>
          Each of the criteria listed here are specified using the appropriate
          setter.
        </p>
        <p>
          There are three helper methods to create validators:
        </p>
        <ol>
          <li><code>getExistingInstance</code> returns a validator that ensures
          a value represents an existing file.
          </li>
          <li><code>getExistingFileInstance</code> returns a validator that ensures
          a value represents an existing file that is not a directory.
          </li>
          <li><code>getExistingDirectoryInstance</code> returns a validator that ensures
          a value represents an existing file this is a directory.
          </li>
        </ol>
        <source>// validate that the value represents a file that exists
FileValidator validator = FileValidator.getExistingInstance();

// ensure it's not a hidden file
validator.setHidden( false );

// ensure it's a writable file
validator.setWritable( true );</source>
        
      </subsection>
      
      <subsection name="NumberValidator">
        <p>
          The <code>NumberValidator</code> validates that values adhere to 
          certain rules like the following:
        </p>
        <ol>
          <li><code>getCurrencyInstance</code> returns a validator for the default
          currency format for the default locale.
          </li>
          <li><code>getPercentInstance</code> returns a validator for the default
          percent format for the default locale.
          </li>
          <li><code>getIntegerInstance</code> returns a validator for the default
          integer format for the default locale.
          </li>
          <li><code>getNumberInstance</code> returns a validator for the default
          number format for the default locale.
          </li>
        </ol>
        <p>
          A <code>NumberValidator</code> can also be created by passing your
          a custom <code>NumberFormat</code> into the constructor.
        </p>
        <source>NumberFormat myFormat = NumberFormat.getCurrencyInstance( Locale.UK );
NumberValidator myValidator = new NumberValidator( myFormat );</source>
        <p>
          In addition to basic format checking you can also check if the number specified
          is less than or greater than a specific number.  The lower bound is set using 
          the <code>setMinimum( Number )</code>, and the upper bound is set using
          the <code>setMaximum( Number )</code>.
        </p>
      </subsection>
      
      <subsection name="UrlValidator">
        <p>
          A <code>UrlValidator</code> validates that values are URLs and if you
          choose it will also validate the protocol is of the type you have
          specified.
        </p>
        <source>UrlValidator validator = new UrlValidator();

// only accept https URLs
validator.setProtocol("https");</source>
        
      </subsection>

    </section>
  </body>
</document>
