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