<!--
 *   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 org.openldap.fortress programming samples</title>
   </head>
   <body>
      <p>
         This package contains samples that show how the Fortress APIs can be used.  The samples use JUnit
         test harness.
      <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 Fortress samples can be executed by running the <b>test</b> target in the <b>build.xml</b> located in the <b>src/test</b> folder.
      </p>
      <p>
         Over time more samples will be added.  The build.xml in the src/test folder contains targets to compile and run these samples, or they may
          be executed directly within an IDE.
      </p>
      <p>

      <h2>What can Fortress SDK do?</h2>

       Contained within this SDK are APIs and utilities to perform authentication, authorization, administration audit and password policies.
       The most important package in this system is <b>org.openldap.fortress</b> which contains all of the public APIs that need to be called by outside programs.

      <h2>What technologies are used?</h2>
      <p>
         Fortress SDK runs on any platform that supports Java technology and LDAP v3 protocols.  Functionality that extends beyond
          LDAP v3 is provided via <a href="http://openldap.org/">OpenLDAP</a> specific features.  In other words Fortress was optimized to run on OpenLDAP.
      </p>
      <h2>What are the conditions of use?</h2>
      <p>
         This software development kit is open source, thus free to use and distribute via the <a href="http://en.wikipedia.org/wiki/BSD_licenses">New BSD License</a>.
         It was developed and tested on open systems like <a href="http://www.ubuntu.com/">Ubuntu</a> and <a href="http://www.centos.org/">Centos</a> and and was helped along
         by open source contributions from the following:
          <ol>
          <li><a href="http://www.openldap.org/project/">The OpenLDAP Project</a></li>
          <li><a href="http://www.apache.org/">The Apache Software Foundation</a></li>
          <li><a href="http://www.eigenbase.org/">The Eigenbase Project</a></li>
          </ol>
      </p>
      <p>
         Check out the <b>org.openldap.fortress.samples</b> in the test package for how to use these APIs within Java programs.  The
         <b>dist</b> target in build.xml will create a samples package in the /dist folder of this project.
      </p>
   </body>
</html>







