This section describes how to add your own data partition.
In ApacheDS entries are stored in partitions. Each partition contains a complete entry tree, also referred to as a DIT. Multiple partitions may exist and the entry trees they contain are disconnected from each other, meaning that changes to entries in partition A would never affect entries in partition B. The entries in a particular partition are stored below some naming context called the partition suffix.
The default implementation of partitions is based on JDBM B+Trees (but it's possible to add custom partition implementations). The ApacheDS default configuration contains a a data partition with the suffix "dc=example,dc=com". The image below shows the suffixes of a freshly installed ApacheDS within Apache Directory Studio.
The schema subsystem and ApacheDS itself store their information in special partitions, "ou=schema" and "ou=system" respectively.
For the examples in the following sections, we want to add a partition with the suffix "o=sevenSeas". This requires editing of the server.xml file, and injecting a first entry, associated with the root of this partition (here, "o=sevenseas") .
Open the server.xml file for your directory instance in your favorite editor and look for the following element with name partitions.
... <partitions> ... <jdbmPartition id="example" cacheSize="100" suffix="dc=example,dc=com" optimizerEnabled="true" syncOnWrite="true"> <indexedAttributes> ... </indexedAttributes> </jdbmPartition> </partitions> ...
Add another jdbmPartition element for the sevenSeas partition, just below the example partition:
... <partitions> <jdbmPartition ...> ... </jdbmPartition> <jdbmPartition id="sevenSeas" suffix="o=sevenSeas" /> </partitions> ...
Save the server.xml file and restart the server. The server has a new suffix now, but no context entry has been created for it. If you connect with an LDAP Browser (Apache Directory Studio for instance), the partition is only visible in the Root DSE. Below the Entry Editor of Directory Studio for the Root DSE after connecting to an ApacheDS instance configured like above.
Before using the partition (e.g. adding entries), you have to add a context entry. If you plan to load LDIF data to your partition anyway, simply provide the context entry (the "root" of your partition) as a first data set. In our example it might look like this:
dn: o=sevenSeas o: sevenSeas objectClass: top objectClass: organization description: The context entry for suffix o=sevenSeas
It is also possible to import a file to ApacheDS which only contains such an entry, of cause. Here is an example on how to procede for the seven seas :
In the LDAP Browser of Directory Studio, right click on the DIT entry and select "Import -> LDIF Import...". A file selections dialog appears. Browse to the LDIF file and click Finish. The entry (or entries, if you provide more of them) will be added to to partition.
The following image depicts the partitions after reconnecting with Apache Directory Studio (LDAP Browser view).
If you don't want to launch Apache Studio, or to inject the LDIF file using a command line tool, you can also tells the server to load the file when it will be laucnhed the first time. Just create a ldif file containing the context entry, and add some tag into the server.xml file. For instance, you have created the sevenSeasRoot.ldif file containing
# SevenSeas root context entry dn: o=sevenSeas o: sevenSeas objectClass: top objectClass: organization description: The context entry for suffix o=sevenSeas
Now just modify the server.xml file to add this line :
... <apacheDS id="apacheDS" synchPeriodMillis="15000" allowAnonymousAccess="false"> <directoryService>#directoryService</directoryService> <!-- We load the SevenSeas root context entry here --> <ldifDirectory>sevenSeasRoot.ldif</ldifDirectory> ...
The contextEntry will be loaded when the server will be started the first time.
The same o=sevenseas partition can be created through the application code using the Partition and DirectoryService API
Here is the sample code to create a new partition o=sevenseas and its context entry programmatically
JdbmPartition sevenseasPartition = new JdbmPartition(); sevenseasPartition.setId("sevenseas"); sevenseasPartition.setSuffix("o=sevenseas"); sevenseasPartition.setCacheSize(1000); sevenseasPartition.init(directoryService); // Create some indices (optional) Set<Index<?,ServerEntry>> indexedAttrs = new HashSet<Index<?, ServerEntry>>(); indexedAttrs.add( new JdbmIndex<Object, ServerEntry>("objectClass")); indexedAttrs.add( new JdbmIndex<Object, ServerEntry>("o")); sevenseasPartition.setIndexedAttributes( indexedAttrs ); //Add partition to the directory service directoryService.addPartition(sevenseasPartition); // start the directory service directoryService.startup(); // create the context entry ServerEntry entry = new DefaultServerEntry( directoryService.getRegistries(), new LdapDN( "o=sevenseas") ); entry.put( "objectClass", "top", "organization" ); entry.put("o","sevenseas"); // add the context entry AddContextPartitionOperationContext adOpContext = new AddContextPartitionOperationContext( directoryService.getAdminSession(), sevenseasPartition ); adOpContext.add( entry, null ); directoryService.getPartitionNexus().addContextPartition( adOpContext );
Here is a list of the used attributes, their default values and meaning