package org.infinispan.test.integration.security.utils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.directory.api.ldap.model.entry.DefaultEntry;
import org.apache.directory.api.ldap.model.ldif.LdifEntry;
import org.apache.directory.api.ldap.model.ldif.LdifReader;
import org.apache.directory.api.ldap.model.schema.SchemaManager;
import org.apache.directory.server.annotations.CreateLdapServer;
import org.apache.directory.server.annotations.CreateTransport;
import org.apache.directory.server.core.annotations.AnnotationUtils;
import org.apache.directory.server.core.annotations.ContextEntry;
import org.apache.directory.server.core.annotations.CreateDS;
import org.apache.directory.server.core.annotations.CreateIndex;
import org.apache.directory.server.core.annotations.CreatePartition;
import org.apache.directory.server.core.api.DirectoryService;
import org.apache.directory.server.core.factory.DSAnnotationProcessor;
import org.apache.directory.server.factory.ServerAnnotationProcessor;
import org.apache.directory.server.ldap.LdapServer;
import org.infinispan.commons.logging.Log;
import org.infinispan.commons.logging.LogFactory;
/**
* @author <a href="mailto:vjuranek@redhat.com">Vojtech Juranek</a>
* @since 7.0
*/
public class ApacheDsLdap {
public static final int LDAP_PORT = 10389;
public static final String LDAP_INIT_FILE = "ldif/ispn-test.ldif";
private static Log log = LogFactory.getLog(ApacheDsLdap.class);
protected DirectoryService directoryService;
protected LdapServer ldapServer;
public ApacheDsLdap() throws Exception {
createDs();
createLdap();
}
public void start() throws Exception {
ldapServer.start();
}
public void stop() throws Exception {
ldapServer.stop();
directoryService.shutdown();
FileUtils.deleteDirectory(directoryService.getInstanceLayout().getInstanceDirectory());
}
@CreateDS(
name = "InfinispanDS",
partitions = {
@CreatePartition(
name = "infinispan",
suffix = "dc=infinispan,dc=org",
contextEntry = @ContextEntry(
entryLdif =
"dn: dc=infinispan,dc=org\n" +
"dc: infinispan\n" +
"objectClass: top\n" +
"objectClass: domain\n\n" ),
indexes = {
@CreateIndex( attribute = "objectClass" ),
@CreateIndex( attribute = "dc" ),
@CreateIndex( attribute = "ou" )
}
)
}
)
public void createDs() throws Exception {
directoryService = DSAnnotationProcessor.getDirectoryService();
}
@CreateLdapServer(transports = { @CreateTransport( protocol = "LDAP", port = LDAP_PORT) })
public void createLdap() throws Exception {
final String initFile = System.getProperty("ldap.init.file", LDAP_INIT_FILE);
final String ldifContent = IOUtils.toString(getClass().getClassLoader().getResource(initFile));
final SchemaManager schemaManager = directoryService.getSchemaManager();
try {
for (LdifEntry ldifEntry : new LdifReader(IOUtils.toInputStream(ldifContent))) {
directoryService.getAdminSession().add(new DefaultEntry(schemaManager, ldifEntry.getEntry()));
}
} catch (Exception e) {
log.error("Error adding ldif entries", e);
throw e;
}
final CreateLdapServer createLdapServer = (CreateLdapServer) AnnotationUtils.getInstance(CreateLdapServer.class);
ldapServer = ServerAnnotationProcessor.instantiateLdapServer(createLdapServer, directoryService);
}
}