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