o sample app to demonstrate how to embed the directory service using the code from current trunk
  (current version is 1.5.8-SNAPSHOT) 


git-svn-id: https://svn.apache.org/repos/asf/directory/samples/trunk@1027297 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/embedded-sample-trunk/pom.xml b/embedded-sample-trunk/pom.xml
new file mode 100644
index 0000000..9a56197
--- /dev/null
+++ b/embedded-sample-trunk/pom.xml
@@ -0,0 +1,218 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  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.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.directory.server</groupId>
+  <artifactId>apacheds-embedded-sample-trunk</artifactId>
+  <version>1.5.8-SNAPSHOT</version>
+
+  <name>ApacheDS embedded sample for trunk ( current version 1.5.8-SNAPSHOT )</name>
+  <description>ApacheDS embedded sample</description>
+  <packaging>jar</packaging>  
+
+  <dependencies>
+     <dependency>
+      <groupId>org.apache.directory.server</groupId>
+      <artifactId>apacheds-all</artifactId>
+      <version>1.5.8-SNAPSHOT</version>
+        <!-- shared-ldap-schema module needs to be excluded to avoid multiple schema resources on the classpath-->
+      <exclusions>
+        <exclusion>
+          <groupId>org.apache.directory.shared</groupId>
+          <artifactId>shared-ldap-schema</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <version>1.5.6</version>
+    </dependency>
+    
+    <!-- un-comment the below dependencies after commenting the above apacheds-all dependency
+         if you want to debug
+     -->
+<!-- 
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-core</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-core-annotations</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-core-api</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-core-avl</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-core-constants</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-core-jndi</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-interceptor-kerberos</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-jdbm</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-jdbm-partition</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-kerberos-shared</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-ldif-partition</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-protocol-changepw</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-protocol-dhcp</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-protocol-dns</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-protocol-kerberos</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-protocol-ldap</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-protocol-ntp</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-protocol-shared</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-server-annotations</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-server-jndi</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-server-replication</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-test-framework</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-xdbm-partition</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>apacheds-xdbm-tools</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+-->
+  </dependencies>
+
+  <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-compiler-plugin</artifactId>
+          <configuration>
+
+            <source>1.5</source>
+            <target>1.5</target>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
+</project>
+
diff --git a/embedded-sample-trunk/src/main/java/org/apache/directory/seserver/EmbeddedADSVerTrunk.java b/embedded-sample-trunk/src/main/java/org/apache/directory/seserver/EmbeddedADSVerTrunk.java
new file mode 100644
index 0000000..58d286b
--- /dev/null
+++ b/embedded-sample-trunk/src/main/java/org/apache/directory/seserver/EmbeddedADSVerTrunk.java
@@ -0,0 +1,292 @@
+/*
+ * 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.
+ */
+package org.apache.directory.seserver;
+
+
+import java.io.File;
+import java.util.HashSet;
+import java.util.List;
+
+import org.apache.directory.server.constants.ServerDNConstants;
+import org.apache.directory.server.core.DefaultDirectoryService;
+import org.apache.directory.server.core.DirectoryService;
+import org.apache.directory.server.core.partition.Partition;
+import org.apache.directory.server.core.partition.impl.btree.jdbm.JdbmIndex;
+import org.apache.directory.server.core.partition.impl.btree.jdbm.JdbmPartition;
+import org.apache.directory.server.core.partition.ldif.LdifPartition;
+import org.apache.directory.server.core.schema.SchemaPartition;
+import org.apache.directory.server.ldap.LdapServer;
+import org.apache.directory.server.protocol.shared.transport.TcpTransport;
+import org.apache.directory.server.xdbm.Index;
+import org.apache.directory.shared.ldap.entry.Entry;
+import org.apache.directory.shared.ldap.exception.LdapException;
+import org.apache.directory.shared.ldap.name.DN;
+import org.apache.directory.shared.ldap.schema.SchemaManager;
+import org.apache.directory.shared.ldap.schema.ldif.extractor.SchemaLdifExtractor;
+import org.apache.directory.shared.ldap.schema.ldif.extractor.impl.DefaultSchemaLdifExtractor;
+import org.apache.directory.shared.ldap.schema.loader.ldif.LdifSchemaLoader;
+import org.apache.directory.shared.ldap.schema.manager.impl.DefaultSchemaManager;
+import org.apache.directory.shared.ldap.schema.registries.SchemaLoader;
+
+
+/**
+ * A simple example exposing how to embed Apache Directory Server from the bleeding trunk
+ * into an application.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class EmbeddedADSVerTrunk
+{
+    /** The directory service */
+    private DirectoryService service;
+
+    /** The LDAP server */
+    private LdapServer server;
+
+
+    /**
+     * Add a new partition to the server
+     *
+     * @param partitionId The partition Id
+     * @param partitionDn The partition DN
+     * @return The newly added partition
+     * @throws Exception If the partition can't be added
+     */
+    private Partition addPartition( String partitionId, String partitionDn ) throws Exception
+    {
+        // Create a new partition named 'foo'.
+        JdbmPartition partition = new JdbmPartition();
+        partition.setId( partitionId );
+        partition.setPartitionDir( new File( service.getWorkingDirectory(), partitionId ) );
+        partition.setSuffix( new DN( partitionDn ) );
+        // schema manager will be automatically set while adding the partition to the service
+        service.addPartition( partition );
+        
+        return partition;
+    }
+
+
+    /**
+     * Add a new set of index on the given attributes
+     *
+     * @param partition The partition on which we want to add index
+     * @param attrs The list of attributes to index
+     */
+    private void addIndex( Partition partition, String... attrs )
+    {
+        // Index some attributes on the apache partition
+        HashSet<Index<?, Entry, Long>> indexedAttributes = new HashSet<Index<?, Entry, Long>>();
+
+        for ( String attribute : attrs )
+        {
+            indexedAttributes.add( new JdbmIndex<String, Entry>( attribute ) );
+        }
+
+        ( ( JdbmPartition ) partition ).setIndexedAttributes( indexedAttributes );
+    }
+
+    
+    /**
+     * initialize the schema manager and add the schema partition to diectory service
+     *
+     * @throws Exception if the schema LDIF files are not found on the classpath
+     */
+    private void initSchemaPartition() throws Exception
+    {
+        SchemaPartition schemaPartition = service.getSchemaService().getSchemaPartition();
+
+        // Init the LdifPartition
+        LdifPartition ldifPartition = new LdifPartition();
+        String workingDirectory = service.getWorkingDirectory().getPath();
+        ldifPartition.setWorkingDirectory( workingDirectory + "/schema" );
+
+        // Extract the schema on disk (a brand new one) and load the registries
+        File schemaRepository = new File( workingDirectory, "schema" );
+        SchemaLdifExtractor extractor = new DefaultSchemaLdifExtractor( new File( workingDirectory ) );
+        extractor.extractOrCopy( true );
+
+        schemaPartition.setWrappedPartition( ldifPartition );
+
+        SchemaLoader loader = new LdifSchemaLoader( schemaRepository );
+        SchemaManager schemaManager = new DefaultSchemaManager( loader );
+        service.setSchemaManager( schemaManager );
+
+        // We have to load the schema now, otherwise we won't be able
+        // to initialize the Partitions, as we won't be able to parse 
+        // and normalize their suffix DN
+        schemaManager.loadAllEnabled();
+
+        schemaPartition.setSchemaManager( schemaManager );
+
+        List<Throwable> errors = schemaManager.getErrors();
+
+        if ( errors.size() != 0 )
+        {
+            throw new Exception( "Schema load failed : " + errors );
+        }
+    }
+    
+    
+    /**
+     * Initialize the server. It creates the partition, adds the index, and
+     * injects the context entries for the created partitions.
+     *
+     * @param workDir the directory to be used for storing the data
+     * @throws Exception if there were some problems while initializing the system
+     */
+    private void initDirectoryService( File workDir ) throws Exception
+    {
+        // Initialize the LDAP service
+        service = new DefaultDirectoryService();
+        service.setWorkingDirectory( workDir );
+        
+        // first load the schema
+        initSchemaPartition();
+        
+        // then the system partition
+        // this is a MANDATORY partition
+        // DO NOT add this via addPartition() method, trunk code complains about duplicate partition
+        // while initializing 
+        JdbmPartition systemPartition = new JdbmPartition();
+        systemPartition.setId( "system" );
+        systemPartition.setPartitionDir( new File( service.getWorkingDirectory(), systemPartition.getId() ) );
+        systemPartition.setSuffix( new DN( ServerDNConstants.SYSTEM_DN ) );
+        systemPartition.setSchemaManager( service.getSchemaManager() );
+        
+        // mandatory to call this method to set the system partition
+        // Note: this system partition might be removed from trunk
+        service.setSystemPartition( systemPartition );
+        
+        // Disable the ChangeLog system
+        service.getChangeLog().setEnabled( false );
+        service.setDenormalizeOpAttrsEnabled( true );
+
+        // Now we can create as many partitions as we need
+        // Create some new partitions named 'foo', 'bar' and 'apache'.
+        Partition fooPartition = addPartition( "foo", "dc=foo,dc=com" );
+        Partition barPartition = addPartition( "bar", "dc=bar,dc=com" );
+        Partition apachePartition = addPartition( "apache", "dc=apache,dc=org" );
+
+        // Index some attributes on the apache partition
+        addIndex( apachePartition, "objectClass", "ou", "uid" );
+
+        // And start the service
+        service.startup();
+
+        // Inject the foo root entry if it does not already exist
+        try
+        {
+            service.getAdminSession().lookup( fooPartition.getSuffix() );
+        }
+        catch ( LdapException lnnfe )
+        {
+            DN dnFoo = new DN( "dc=foo,dc=com" );
+            Entry entryFoo = service.newEntry( dnFoo );
+            entryFoo.add( "objectClass", "top", "domain", "extensibleObject" );
+            entryFoo.add( "dc", "foo" );
+            service.getAdminSession().add( entryFoo );
+        }
+
+        // Inject the bar root entry
+        try
+        {
+            service.getAdminSession().lookup( barPartition.getSuffix() );
+        }
+        catch ( LdapException lnnfe )
+        {
+            DN dnBar = new DN( "dc=bar,dc=com" );
+            Entry entryBar = service.newEntry( dnBar );
+            entryBar.add( "objectClass", "top", "domain", "extensibleObject" );
+            entryBar.add( "dc", "bar" );
+            service.getAdminSession().add( entryBar );
+        }
+
+        // Inject the apache root entry
+        if ( !service.getAdminSession().exists( apachePartition.getSuffix() ) )
+        {
+            DN dnApache = new DN( "dc=Apache,dc=Org" );
+            Entry entryApache = service.newEntry( dnApache );
+            entryApache.add( "objectClass", "top", "domain", "extensibleObject" );
+            entryApache.add( "dc", "Apache" );
+            service.getAdminSession().add( entryApache );
+        }
+
+        // We are all done !
+    }
+
+
+    /**
+     * Creates a new instance of EmbeddedADS. It initializes the directory service.
+     *
+     * @throws Exception If something went wrong
+     */
+    public EmbeddedADSVerTrunk( File workDir ) throws Exception
+    {
+        initDirectoryService( workDir );
+    }
+
+    
+    /**
+     * starts the LdapServer
+     *
+     * @throws Exception
+     */
+    public void startServer() throws Exception
+    {
+        server = new LdapServer();
+        int serverPort = 10389;
+        server.setTransports( new TcpTransport( serverPort ) );
+        server.setDirectoryService( service );
+        
+        server.start();
+    }
+
+    
+    /**
+     * Main class.
+     *
+     * @param args Not used. 
+     */
+    public static void main( String[] args ) 
+    {
+        try
+        {
+            File workDir = new File( System.getProperty( "java.io.tmpdir" ) + "/server-work" );
+            workDir.mkdirs();
+            
+            // Create the server
+            EmbeddedADSVerTrunk ads = new EmbeddedADSVerTrunk( workDir );
+
+            // Read an entry
+            Entry result = ads.service.getAdminSession().lookup( new DN( "dc=apache,dc=org" ) );
+
+            // And print it if available
+            System.out.println( "Found entry : " + result );
+            
+            // optionally we can start a server too
+            ads.startServer();
+        }
+        catch ( Exception e )
+        {
+            // Ok, we have something wrong going on ...
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/embedded-sample-trunk/src/main/resources/log4j.properties b/embedded-sample-trunk/src/main/resources/log4j.properties
new file mode 100644
index 0000000..6476bd2
--- /dev/null
+++ b/embedded-sample-trunk/src/main/resources/log4j.properties
@@ -0,0 +1,59 @@
+#############################################################################
+#    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.
+#############################################################################
+log4j.rootCategory=WARN, stdout, R
+
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+
+log4j.appender.R=org.apache.log4j.RollingFileAppender
+log4j.appender.R.File=apacheds-rolling.log
+
+log4j.appender.R.MaxFileSize=1024KB
+# Keep some backup files
+log4j.appender.R.MaxBackupIndex=5
+
+log4j.appender.R.layout=org.apache.log4j.PatternLayout
+log4j.appender.R.layout.ConversionPattern=[%d{HH:mm:ss}] %p [%c] - %m%n
+
+log4j.appender.stdout.layout.ConversionPattern=[%d{HH:mm:ss}] %p [%c] - %m%n
+
+# with these we'll not get innundated when switching to DEBUG
+log4j.logger.org.apache.mina=WARN
+log4j.logger.org.apache.directory.server.config=WARN
+log4j.logger.org.apache.directory.shared.asn1=WARN
+log4j.logger.org.apache.directory.shared.ldap.codec=WARN
+
+log4j.logger.org.apache.directory.shared.ldap.name=FATAL
+log4j.logger.org.apache.directory.shared.codec=FATAL
+log4j.logger.org.apache.directory.server.schema.registries=FATAL
+log4j.logger.org.apache.directory.shared.ldap.schema=WARN
+log4j.logger.org.apache.directory.shared.ldap.ldif=WARN
+log4j.logger.org.apache.directory.ldap.client.api=WARN
+log4j.logger.JdbmTable=WARN
+log4j.logger.JdbmIndex=WARN
+log4j.logger.LOG_CHANGES=WARN
+log4j.logger.org.apache.directory.server.core.partition.impl.btree.jdbm=WARN
+log4j.logger.org.apache.directory.server.core.DefaultOperationManager=WARN
+log4j.logger.org.apache.directory.server.core.partition.ldif=WARN
+log4j.logger.org.apache.directory.server.core.security.TlsKeyGenerator=WARN
+log4j.logger.org.apache.directory.shared.ldap.entry.StringValue=WARN
+log4j.logger.aci-logger=WARN
+log4j.logger.org.apache.directory.shared.ldap.subtree=WARN
+log4j.logger.org.apache.directory.shared.ldap.aci=WARN
+log4j.logger.org.apache.directory.server.xdbm.impl.avl=WARN
+log4j.logger.org.apache.directory.server.ldap=WARN
+log4j.logger.org.apache.activemq=WARN
\ No newline at end of file