<!--
 *   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>Package Documentation for org.apache.directory.fortress.core.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.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>
         The <b>org.apache.directory.fortress.core.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>
