blob: 58d286be7ccd6fc07926c8760c28f8b7bf42d0dc [file] [log] [blame]
/*
* 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();
}
}
}