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

<head>
  <meta http-equiv="Content-Language" content="en-us">
  <link rel="stylesheet" type="text/css" href="style.css">
  <title>Conditions</title>
</head>

<body>

  <h2>Conditions</h2>

  <p>The conditions that are part of this Antlib can be used with the
    core <a href="https://ant.apache.org/manual/CoreTasks/condition.html"><code>condition</code></a>
    task or any other task that uses conditions,
    like <a href="https://ant.apache.org/antlibs/antunit/">Apache
      AntUnit's</a> <code>assertTrue</code> task.</p>

  <p>The main purpose of these conditions is to support the Antlib's
    own tests, but they may be useful outside of that scope as
    well.</p>

  <h2><a name="hasgroupid">HasGroupId</a></h2>

  <p>Validates that the group id of a given archive entry matches an
    expected value.</p>

  <h3>Parameters</h3>
  <table border="1" cellpadding="2" cellspacing="0">
    <tr>
      <td valign="top"><b>Attribute</b></td>
      <td valign="top"><b>Description</b></td>
      <td align="center" valign="top"><b>Required</b></td>
    </tr>
    <tr>
      <td valign="top">id</td>
      <td valign="top">the expected numeric group id.</td>
      <td align="center" valign="top">Yes</td>
    </tr>
  </table>

  <h3>Parameters specified as nested elements</h3>

  <p>Exactly one
    of <a href="https://ant.apache.org/manual/CoreTypes/resources.html#tarentry">a
    core <code>tarentry</code></a> or
    an <a href="entry.html#arentry"><code>arentry</code></a>, <a href="entry.html#cpioentry"><code>cpioentry</code></a>
    or <a href="entry.html#tarentry"><code>tarentry</code></a> as
    defined by this Antlib specifies the resource to check.</p>

  <h2><a name="hasgroupname">HasGroupName</a></h2>

  <p>Validates that the group name of a given archive entry matches an
    expected value.</p>

  <h3>Parameters</h3>
  <table border="1" cellpadding="2" cellspacing="0">
    <tr>
      <td valign="top"><b>Attribute</b></td>
      <td valign="top"><b>Description</b></td>
      <td align="center" valign="top"><b>Required</b></td>
    </tr>
    <tr>
      <td valign="top">name</td>
      <td valign="top">the expected group name.</td>
      <td align="center" valign="top">Yes</td>
    </tr>
  </table>

  <h3>Parameters specified as nested elements</h3>

  <p>Exactly one <code>tarentry</code>
    of <a href="https://ant.apache.org/manual/CoreTypes/resources.html#tarentry">a
    Ant's core</a> or as defined by <a href="entry.html#tarentry">this
    Antlib</a> specifies the resource to check.</p>

  <h2><a name="hasmode">HasMode</a></h2>

  <p>Validates that the mode (or permissions) of a given archive entry
    matches an expected value.</p>

  <p>Archives store more than just the Unix permissions as a mode
    flag.  In general the last twelve bit of the mode correspond to
    the Unix permissions set (including sticky bits).  If
    the <code>mode</code> attribute of this condition specifies a
    number between 0 and 7777 (octal, inclusive) only the permissions
    part of the mode will be compared, if it is bigger than 7777
    (octal) the full mode value will be compared.</p>

  <h3>Parameters</h3>
  <table border="1" cellpadding="2" cellspacing="0">
    <tr>
      <td valign="top"><b>Attribute</b></td>
      <td valign="top"><b>Description</b></td>
      <td align="center" valign="top"><b>Required</b></td>
    </tr>
    <tr>
      <td valign="top">mode</td>
      <td valign="top">the expected mode as an octal number.</td>
      <td align="center" valign="top">Yes</td>
    </tr>
  </table>

  <h3>Parameters specified as nested elements</h3>

  <p>Exactly one of a
    core <a href="https://ant.apache.org/manual/CoreTypes/resources.html#tarentry"><code>tarentry</code></a>
    or
    <a href="https://ant.apache.org/manual/CoreTypes/resources.html#zipentry"><code>zipentry</code></a>
    or any <a href="entry.html">archive entry</a> as defined by this
    Antlib specifies the resource to check.</p>

  <h2><a name="hasuserid">HasUserId</a></h2>

  <p>Validates that the user id of a given archive entry matches an
    expected value.</p>

  <h3>Parameters</h3>
  <table border="1" cellpadding="2" cellspacing="0">
    <tr>
      <td valign="top"><b>Attribute</b></td>
      <td valign="top"><b>Description</b></td>
      <td align="center" valign="top"><b>Required</b></td>
    </tr>
    <tr>
      <td valign="top">id</td>
      <td valign="top">the expected numeric user id.</td>
      <td align="center" valign="top">Yes</td>
    </tr>
  </table>

  <h3>Parameters specified as nested elements</h3>

  <p>Exactly one
    of <a href="https://ant.apache.org/manual/CoreTypes/resources.html#tarentry">a
    core <code>tarentry</code></a> or
    an <a href="entry.html#arentry"><code>arentry</code></a>, <a href="entry.html#cpioentry"><code>cpioentry</code></a>
    or <a href="entry.html#tarentry"><code>tarentry</code></a> as
    defined by this Antlib specifies the resource to check.</p>

  <h2><a name="hasusername">HasUserName</a></h2>

  <p>Validates that the user name of a given archive entry matches an
    expected value.</p>

  <h3>Parameters</h3>
  <table border="1" cellpadding="2" cellspacing="0">
    <tr>
      <td valign="top"><b>Attribute</b></td>
      <td valign="top"><b>Description</b></td>
      <td align="center" valign="top"><b>Required</b></td>
    </tr>
    <tr>
      <td valign="top">name</td>
      <td valign="top">the expected user name.</td>
      <td align="center" valign="top">Yes</td>
    </tr>
  </table>

  <h3>Parameters specified as nested elements</h3>

  <p>Exactly one <code>tarentry</code>
    of <a href="https://ant.apache.org/manual/CoreTypes/resources.html#tarentry">a
    Ant's core</a> or as defined by <a href="entry.html#tarentry">this
    Antlib</a> specifies the resource to check.</p>

</body>
</html>
