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