<!--
   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="http://ant.apache.org/manual/CoreTasks/condition.html"><code>condition</code></a>
    task or any other task that uses conditions,
    like <a href="http://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="http://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="http://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="http://ant.apache.org/manual/CoreTypes/resources.html#tarentry"><code>tarentry</code></a>
    or
    <a href="http://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="http://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="http://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>
