Hi,
I have been trying to create programmatically a new partition on Apache DS 2.0.
The partition seems to be successfully with the code below.
But when I shutdown and startup the service again it is no longer there.
I think that I need to add the new partition to config somehow but I do not know how.
Can anybody provide advice on this?
How can I create a new partition an add it permanently to a service from Java code?



import java.io.File;
import java.util.List;
import java.util.ArrayList;
import java.util.Properties;

import org.apache.directory.api.ldap.model.name.Dn;
import org.apache.directory.api.ldap.model.entry.Entry;
import org.apache.directory.api.ldap.model.entry.Attribute;
import org.apache.directory.api.ldap.model.entry.DefaultEntry;
import org.apache.directory.api.ldap.model.entry.Modification;
import org.apache.directory.api.ldap.model.entry.DefaultModification;
import org.apache.directory.api.ldap.model.entry.ModificationOperation;
import org.apache.directory.api.ldap.model.schema.SchemaManager;
import org.apache.directory.api.ldap.model.schema.registries.SchemaLoader;
import org.apache.directory.api.ldap.model.exception.LdapException;
import org.apache.directory.api.ldap.schemaloader.LdifSchemaLoader;
import org.apache.directory.api.ldap.schemamanager.impl.DefaultSchemaManager;
import org.apache.directory.api.util.exception.Exceptions;
import org.apache.directory.server.i18n.I18n;
import org.apache.directory.server.core.api.DnFactory;
import org.apache.directory.server.core.DefaultDirectoryService;
import org.apache.directory.server.core.api.CacheService;
import org.apache.directory.server.core.api.InstanceLayout;
import org.apache.directory.server.core.api.DirectoryService;
import org.apache.directory.server.core.api.schema.SchemaPartition;
import org.apache.directory.server.core.api.partition.Partition;
import org.apache.directory.server.core.api.interceptor.context.AddOperationContext; import org.apache.directory.server.core.api.interceptor.context.ModifyOperationContext;
import org.apache.directory.server.core.shared.DefaultDnFactory;
import org.apache.directory.server.core.factory.JdbmPartitionFactory;
import org.apache.directory.server.core.partition.ldif.LdifPartition;
import org.apache.directory.server.core.partition.ldif.SingleFileLdifPartition;
import org.apache.directory.server.config.LdifConfigExtractor;
import org.apache.directory.server.constants.ServerDNConstants;
import org.apache.directory.server.constants.SystemSchemaConstants;

import org.apache.directory.server.ldap.LdapServer;
import org.apache.directory.server.protocol.shared.transport.TcpTransport;

import com.knowgate.directory.LDAPApache;

public class ApacheDSPartitionerTest {

    private static void printUsage() {
        System.out.println("");
        System.out.println("Create Apache Directory partition");
        System.out.println("Usage:\n");
System.out.println("ApacheDSPartitionerTest working_directory partition_name");
        System.out.println("Example:\n");
System.out.println("ApacheDSPartitionerTest /var/lib/apacheds-2.0.0-M17 testPartition");
    }

public static DirectoryService createDirectoryService(File workDir) throws Exception {
            DirectoryService serv = new DefaultDirectoryService();
            serv.setAllowAnonymousAccess( true );
            serv.setInstanceLayout(new InstanceLayout(workDir));

            CacheService cache = new CacheService();
            cache.initialize( serv.getInstanceLayout() );

            // Init schema and system LdifPartitions
File schDir = new File( serv.getInstanceLayout().getPartitionsDirectory(), "schema" );
             SchemaLoader schLdr = new LdifSchemaLoader( schDir );
            SchemaManager schMan = new DefaultSchemaManager( schLdr );
            schMan.loadAllEnabled();

            List<Throwable> errors = schMan.getErrors();

            if ( errors.size() != 0 )
throw new Exception( I18n.err( I18n.ERR_317, Exceptions.printErrors( errors ) ) );

            serv.setSchemaManager(schMan);
serv.setDnFactory(new DefaultDnFactory(serv.getSchemaManager(), cache.getCache("dnCache")));

LdifPartition schLdifPart = new LdifPartition( serv.getSchemaManager(), serv.getDnFactory() );
            schLdifPart.setPartitionPath( schDir.toURI() );
SchemaPartition schPart = new SchemaPartition(serv.getSchemaManager());
            schPart.setWrappedPartition( schLdifPart );
            serv.setSchemaPartition( schPart );

LdifPartition sysPart = new LdifPartition( serv.getSchemaManager(), serv.getDnFactory() );
            sysPart.setId( SystemSchemaConstants.SCHEMA_NAME );
sysPart.setPartitionPath( new File(serv.getInstanceLayout().getPartitionsDirectory(), SystemSchemaConstants.SCHEMA_NAME).toURI() ); sysPart.setSuffixDn( serv.getDnFactory().create(ServerDNConstants.SYSTEM_DN) );
            serv.setSystemPartition( sysPart );

            return serv;
    }

public static void createContextEntry(DirectoryService serv, Partition part, String name, String suffix) throws LdapException {
        if ( !serv.getAdminSession().exists( part.getSuffixDn() ) ) {
            System.out.println("Creating context entry "+suffix);
            Dn contextDn = new Dn( suffix );
            Entry contextEntry = serv.newEntry( contextDn );
            contextEntry.add( "objectClass", "top", "organizationalUnit" );
            contextEntry.add( "ou", name );
            serv.getAdminSession().add( contextEntry );
        }
    }

public static void createUsersEntry(DirectoryService serv, String suffix) throws LdapException {
            System.out.println("Creating users entry dc=users,"+suffix);
            Dn usersDn = new Dn( "dc=users,"+suffix );
            Entry usersEntry = serv.newEntry( usersDn );
            usersEntry.add( "objectClass", "domain" );
            usersEntry.add( "dc", "users" );
            serv.getAdminSession().add( usersEntry );
    }

public static Partition createJdbmPartition(DirectoryService serv, File workDir, String name, String suffix) throws Exception {
        JdbmPartitionFactory fact = new JdbmPartitionFactory();
Partition part = fact.createPartition(serv.getSchemaManager(), serv.getDnFactory(), name, suffix, 1000, new File(workDir.getAbsolutePath()+File.separator+"partitions"+File.separator+name));
        fact.addIndex( part, "objectClass", 100 );
        fact.addIndex( part, "ou", 100 );
        part.initialize();
        serv.addPartition(part);

        return part;
    }

    public static void main(String[] argv) throws Exception {

        if (argv.length!=2) {

            printUsage();

        } else {

            File workDir = new File(argv[0]);
            if (!workDir.exists()) {
System.out.println("Working directory " + argv[0] + " does not exist");
                    return;
            }

            DirectoryService serv = createDirectoryService(workDir);

            boolean alreadyExists = false;
            for (Partition part : serv.getPartitions()) {
                System.out.println("Loaded partition "+part.getId());
alreadyExists = alreadyExists || part.getId().equals(argv[1]);
            }

            if (alreadyExists) {

                System.out.println("Partition "+argv[1]+" already exists");

            } else {
                final String partitionName = argv[1];
                final String suffix = "ou=" + partitionName;

                if (!serv.isStarted()) serv.startup();

Partition part = createJdbmPartition(serv, workDir, partitionName, suffix);

                createContextEntry(serv, part, partitionName, suffix);
                createUsersEntry(serv, suffix);

                for (Partition part2 : serv.getPartitions()) {
                    System.out.println("Got partition "+part2.getId());
                }

Entry result = serv.getAdminSession().lookup( new Dn( suffix ) );
                if (result==null)
System.out.println("Could not create context entry "+suffix);
                else
                    System.out.println("Created context entry "+suffix);
result = serv.getAdminSession().lookup( new Dn( "dc=users,"+suffix ) );
                if (result==null)
System.out.println("Could not create users domain dc=user,"+suffix);
                else
System.out.println("Created users domain dc=users,"+suffix);

                LdapServer ldapSrv = new LdapServer();
                ldapSrv.setDirectoryService( serv );

                // Set LDAP port to 10389
                int port = 10389;
                TcpTransport ldapTransport = new TcpTransport( port );
                ldapSrv.setTransports( ldapTransport );

                ldapSrv.start();

                Properties props = new Properties();
props.put( "ldapconnect", "ldap://localhost:"; + String.valueOf(port) + "/" + suffix );
                LDAPApache ldap = new LDAPApache();
                ldap.connectAndBind(props);
                if (ldap.exists("objectClass=*"))
System.out.println("Partition "+suffix+" is successfully populated");
                else
System.out.println("ERROR: Partition "+suffix+" is empty");
                if (ldap.exists("dc=users"))
System.out.println("Entry dc=users is successfully created");
              else
System.out.println("ERROR: Entry dc=users does not exist");
                ldap.disconnect();

                ldapSrv.stop();
                serv.sync();
                serv.shutdown();

                serv = createDirectoryService(workDir);
                serv.startup();

                ldapSrv = new LdapServer();
                ldapSrv.setDirectoryService( serv );
                ldapSrv.setTransports( ldapTransport );

                for (Partition part2 : serv.getPartitions()) {
System.out.println("Reloaded partition "+part2.getId());
                }

                ldapSrv.start();

                ldap = new LDAPApache();
                ldap.connectAndBind(props);
                if (ldap.exists("objectClass=*"))
System.out.println("Partition "+suffix+" was successfully repopulated");
                else
System.out.println("ERROR: Reloaded partition "+suffix+" is empty");
                if (ldap.exists("dc=users"))
System.out.println("Entry dc=users was successfully reloaded");
              else
System.out.println("ERROR: Could not reload entry dc=users");
                ldap.disconnect();

                ldapSrv.stop();
                serv.shutdown();

            }

        } // fi
    } // main
}

Reply via email to