<!--
   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 git -
    <a href="https://gitbox.apache.org/repos/asf?p=ant-antlibs-props.git">https://gitbox.apache.org/repos/asf?p=ant-antlibs-props.git</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="https://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>
