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