<!--
 *   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>Package Documentation for org.openldap.fortress.samples</title>
   </head>
   <body>
      <p>
         This package contains samples that show how the Fortress APIs can be used.  The samples use JUnit
          and provide the following.
      <h3>Samples</h3>
          <ol>
              <li>{@link org.openldap.fortress.samples.AccessMgrSample} demonstrates {@code org.openldap.fortress.AccessMgr} APIs</li>
              <li>{@link org.openldap.fortress.samples.AllSamplesJUnitTest} will execute all tests in their proper order</li>
              <li>{@link org.openldap.fortress.samples.CreatePermOrgHierarchySample} demonstrates {@code org.openldap.fortress.DelegatedAdminMgr} APis to create Perm organizational unit hierarchies</li>
              <li>{@link org.openldap.fortress.samples.CreatePermOrgSample} demonstrates {@code org.openldap.fortress.DelegatedAdminMgr} APis to create a Perm organizational unit node</li>
              <li>{@link org.openldap.fortress.samples.CreatePermSample} demonstrates {@code org.openldap.fortress.AdminMgr} to create RBAC permissions</li>
              <li>{@link org.openldap.fortress.samples.CreateRoleHierarchySample} demonstrates {@code org.openldap.fortress.AdminMgr} to create RBAC Role hierarchies</li>
              <li>{@link org.openldap.fortress.samples.CreateRoleSample} demonstrates {@code org.openldap.fortress.AdminMgr} to create RBAC Roles and assign constraints</li>
              <li>{@link org.openldap.fortress.samples.CreateSessionSample} demonstrates various ways to create a session using {@code org.openldap.fortress.AccessMgr} APIs</li>
              <li>{@link org.openldap.fortress.samples.CreateUserOrgHierarchySample}  demonstrates {@code org.openldap.fortress.DelegatedAdminMgr} APis to create User organizational unit hierarchies</li>
              <li>{@link org.openldap.fortress.samples.CreateUserOrgSample} demonstrates {@code org.openldap.fortress.DelegatedAdminMgr} APis to create a User organizational unit node</li>
              <li>{@link org.openldap.fortress.samples.CreateUserRoleSample} demonstrates {@code org.openldap.fortress.AdminMgr} APIs to assign Roles to Users</li>
              <li>{@link org.openldap.fortress.samples.CreateUserSample} demonstrates {@code org.openldap.fortress.AdminMgr} APIs to create User object nodes</li>
          </ol>
      </p>
      <p>
         The <b>org.openldap.fortress.samples</b> package provides examples on proper usage of Fortress APIs, Each sample contains javadoc and JUnit test case that describes
          the use case and function for a particular entity.
          For more info, check out the javadoc pertaining to each sample.
      </p>
   </body>
</html>
