<!--
 *   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>
      <title>Overview of the fortress programming samples</title>
   </head>
   <body>
      <p>
         This package contains samples that show how its APIs can be used.  These samples run as JUnit test cases inside of maven.
      <h3>Samples</h3>
          <ol>
          <li>{@link org.apache.directory.fortress.core.samples.AccessMgrSample} demonstrates {@code org.apache.directory.fortress.core.AccessMgr} APIs</li>
          <li>{@link org.apache.directory.fortress.core.samples.AllSamplesJUnitTest} will execute all tests in their proper order</li>
          <li>{@link org.apache.directory.fortress.core.samples.CreatePermOrgHierarchySample} demonstrates {@code org.apache.directory.fortress.core.DelegatedAdminMgr} APis to create Perm organizational unit hierarchies</li>
          <li>{@link org.apache.directory.fortress.core.samples.CreatePermOrgSample} demonstrates {@code org.apache.directory.fortress.core.DelegatedAdminMgr} APis to create a Perm organizational unit node</li>
          <li>{@link org.apache.directory.fortress.core.samples.CreatePermSample} demonstrates {@code org.apache.directory.fortress.core.AdminMgr} to create RBAC permissions</li>
          <li>{@link org.apache.directory.fortress.core.samples.CreateRoleHierarchySample} demonstrates {@code org.apache.directory.fortress.core.AdminMgr} to create RBAC Role hierarchies</li>
          <li>{@link org.apache.directory.fortress.core.samples.CreateRoleSample} demonstrates {@code org.apache.directory.fortress.core.AdminMgr} to create RBAC Roles and assign constraints</li>
          <li>{@link org.apache.directory.fortress.core.samples.CreateSessionSample} demonstrates various ways to create a session using {@code org.apache.directory.fortress.core.AccessMgr} APIs</li>
          <li>{@link org.apache.directory.fortress.core.samples.CreateUserOrgHierarchySample}  demonstrates {@code org.apache.directory.fortress.core.DelegatedAdminMgr} APis to create User organizational unit hierarchies</li>
          <li>{@link org.apache.directory.fortress.core.samples.CreateUserOrgSample} demonstrates {@code org.apache.directory.fortress.core.DelegatedAdminMgr} APis to create a User organizational unit node</li>
          <li>{@link org.apache.directory.fortress.core.samples.CreateUserRoleSample} demonstrates {@code org.apache.directory.fortress.core.AdminMgr} APIs to assign Roles to Users</li>
          <li>{@link org.apache.directory.fortress.core.samples.CreateUserSample} demonstrates {@code org.apache.directory.fortress.core.AdminMgr} APIs to create User object nodes</li>
          </ol>
      </p>
      <p>
         These samples can be executed by entering the following mvn command:
            <pre>
                <p style="font: monospace; color: black; background-color: lightgrey; font-size: 10pt">
mvn -Dtest=NameOfSample test
                </p>
            </pre>
        Where NameOfSample is the name of test to run, e.g. AllSamplesJUnitTest
      </p>
   </body>
</html>