<!--
   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

       https://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.
-->
<html>
  <head>
    <meta http-equiv="Content-Language" content="en-us"></meta>
    <link rel="stylesheet" type="text/css" href="style.css">
    <title>Props Ant Library</title>
  </head>

  <body>
    <h2>Introduction</h2>

    <p>This is a library of supplementary handlers for Ant properties resolution.</p>

    <h2>Requirements</h2>

    <p>The current version of this antlib is built against the Ant 1.8.0.</p>

    <h2>Where is it?</h2>

    <p>The source code for the library lives in the antlibs subspace of Ant's SVN -
    <a href="http://svn.apache.org/viewvc/ant/antlibs/props/trunk/">http://svn.apache.org/viewvc/ant/antlibs/props/trunk/</a>.</p>

    <h2>Installation</h2>

    <p>If you are building this from sources, run the antlib target
    and you'll get a file <code>ant-props.jar</code>.</p>

    <p>There are several ways to use the tasks:</p>

    <ul>
      <li><p>The traditional way:
        <pre>
          &lt;typedef resource="org/apache/ant/props/antlib.xml"
                   classpath="YOUR-PATH-TO/ant-props.jar"/&gt;
        </pre>

        Using this approach the provided extensions will live in the default namespace.</p>
      </li>

      <li><p>Similar, but assigning a namespace URI
        <pre>
          &lt;typedef uri="antlib:org.apache.ant.props"
                   resource="org/apache/ant/props/antlib.xml"
                   classpath="YOUR-PATH-TO/ant-props.jar"/&gt;
        </pre>

        Placing the properties extensions into their own namespace, usable e.g.:

        <pre>
          &lt;project xmlns:props="antlib:org.apache.ant.props"&gt;
            ...
            &lt;propertyhelper&gt;
              &lt;props:nested /&gt;
            &lt;/propertyhelper&gt;
        </pre>

        or a variation thereof.</p>
      </li>

      <li><p>Using Ant's autodiscovery.  Place <code>ant-props.jar</code>
      into a directory and use <code>ant -lib
      DIR-CONTAINING-THE-JAR</code> or copy it into
      <code>ANT_HOME/lib</code> - and then in your build file, simply
      declare the namespace on the <code>project</code> tag:

        <pre>
          &lt;project xmlns:props="antlib:org.apache.ant.props"&gt;
        </pre>

        And all tasks of this library will automatically be available
        in the <code>props</code> namespace without any <code>typedef</code>.</p>
      </li>
    </ul>

    <h2>Tasks and Types</h2>

    <p>The types provided are instances of
       <code>org.apache.tools.ant.PropertyHelper.Delegate</code> and can be invoked using the
       <code>&lt;<a href="http://ant.apache.org/manual/CoreTasks/propertyhelper.html">propertyhelper</a>&gt;</code>
       task provided by Ant:</p>

    <table border="1" cellspacing="0" cellpadding="2" width="100%">
      <tr>
        <th width="15%">Delegate</th>
        <th width="15%">Delegate Type</th>
        <th width="70%">Description</th>
      </tr>
      <tr>
        <a name="nested" />
        <td align="center">nested</td>
        <td align="center">PropertyExpander</td>
        <td>Implements nested property expansion; e.g. <code>${${double-expand-me}}</code>.</td>
      </tr>
      <tr>
        <a name="stringops" />
        <td align="center"><a href="stringops.html">stringops</a></td>
        <td align="center">PropertyEvaluator</td>
        <td>Implements *nix shell-inspired string operations.</td>
      </tr>
      <tr>
        <a name="types" />
        <td align="center">types</td>
        <td align="center">PropertyEvaluator</td>
        <td>Given <code><em>type</em>(<em>arg</em>)</code>, attempts to invoke
            <code><em>type</em></code> constructor <code>(Project, <em>arg</em>)</code>,
            then <code>(<em>arg</em>)</code>.</td>
      </tr>
      <tr>
        <a name="conditions" />
        <td align="center">conditions</td>
        <td align="center">PropertyEvaluator</td>
        <td>Given <code><em>condition</em>([<em>arg1=value1</em>,<em>arg2=value2</em>,...])</code>,
            attempts to invoke an Ant condition of the given name
            setting the given attibute values and evaluates to either
            Boolean.TRUE or Boolean.FALSE.  Usage looks
            like <em>${os(family=unix)}</em> / <em>${!os(family=unix)}</em>.
            Additionally, logical operations are supported.
            In order of precedence, these are !, &, ^, and |, with +
            being a secondary alias for & since & is a special character
            to the XML format. When you want to combine logical operations
            with typed Ant conditions, the typed conditions should be
            specified as nested properties and the <a href="#nested">nested
            evaluator</a> should be included with your active
            PropertyHelper delegates.
            This is probably most useful together with the
            <code>if</code>/<code>unless</code> attributes of tasks or targets.
        </td>
      </tr>
      <tr>
        <a name="encodeURL" />
        <td align="center">encodeURL</td>
        <td align="center">PropertyEvaluator</td>
        <td>Given <code>encodeURL:<em>arg</em></code>, attempts to encode <em>arg</em>
            as a URL per the suggested approach in the javadoc API of <code>java.net.URL</code>.
        </td>
      </tr>
    </table>
    <hr/>
  </body>
</html>
