/* * Copyright (c) 2014 Denis Mikhalkin. * * This software is provided 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 com.denismo.apacheds; import org.apache.directory.api.ldap.model.cursor.Cursor; import org.apache.directory.api.ldap.model.cursor.CursorException; import org.apache.directory.api.ldap.model.exception.LdapException; import org.apache.directory.api.ldap.model.name.Dn; import org.apache.directory.server.core.api.DirectoryService; import org.apache.directory.server.core.api.DnFactory; import org.apache.directory.server.core.api.partition.Partition; import org.apache.directory.server.core.partition.impl.btree.AbstractBTreePartition; 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.protocol.shared.store.LdifFileLoader; import org.apache.directory.server.xdbm.Index; import org.apache.directory.server.xdbm.IndexEntry; import org.apache.directory.server.xdbm.ParentIdAndRdn; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.util.HashSet; import java.util.Set; /** * User: Denis Mikhalkin * Date: 30/06/2014 * Time: 11:12 PM */ public class ApacheDSUtils { private static final Logger LOG = LoggerFactory.getLogger(ApacheDSUtils.class); private DirectoryService service; public ApacheDSUtils(DirectoryService service) { this.service = service; } /** * Add a new partition to the server * * @param partitionId The partition Id * @param partitionDn The partition DN * @param dnFactory the DN factory * @return The newly added partition * @throws Exception If the partition can't be added */ public Partition addPartition(String partitionId, String partitionDn, DnFactory dnFactory) throws Exception { // Create a new partition with the given partition id JdbmPartition partition = new JdbmPartition(service.getSchemaManager(), dnFactory); partition.setId(partitionId); partition.setPartitionPath(new File(service.getInstanceLayout().getPartitionsDirectory(), partitionId).toURI()); partition.setSuffixDn(new Dn(service.getSchemaManager(), partitionDn)); partition.initialize(); 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 */ public void addIndex(Partition partition, String... attrs) { // Index some attributes on the apache partition Set<Index<?,String>> indexedAttributes = new HashSet<Index<?,String>>(); for ( String attribute : attrs ) { indexedAttributes.add( new JdbmIndex( attribute, false ) ); } ( ( JdbmPartition ) partition ).setIndexedAttributes( indexedAttributes ); } boolean exists(String s) throws LdapException { return service.getAdminSession().exists(s); } public boolean exists(Dn dnIAM) { try { return service.getAdminSession().exists(dnIAM); } catch (LdapException e) { return false; } } public void loadLdif(String s) throws LdapException { if (getClass().getClassLoader().getResourceAsStream(s) == null) { s = new File("E:\\WS\\ApacheDS_AWSIAM\\dist\\apacheds\\" + s).getAbsolutePath(); } LdifFileLoader loader = new LdifFileLoader(service.getAdminSession(), s); loader.execute(); } public void dumpIndex(Partition part) { if (!LOG.isDebugEnabled()) return; Index<ParentIdAndRdn, String> rdnIdx = ((AbstractBTreePartition)part).getRdnIndex(); LOG.debug("Dumping index " + rdnIdx); try { Cursor<IndexEntry<ParentIdAndRdn, String>> cursor = rdnIdx.forwardCursor(); while (cursor.next()) { IndexEntry<ParentIdAndRdn, String> entry = cursor.get(); LOG.debug(" " + entry.getKey()); } } catch (LdapException e) { e.printStackTrace(); } catch (CursorException e) { e.printStackTrace(); } } }