X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=server%2Fruntime%2Forg.argeo.server.ads%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fserver%2Fads%2FAdsContainer.java;fp=server%2Fruntime%2Forg.argeo.server.ads%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fserver%2Fads%2FAdsContainer.java;h=4a36f721db3c749c133fede75eb40e5c5dafac5d;hb=c6c3aa132f6559ac1e2fa015cf2efba92802eba0;hp=0000000000000000000000000000000000000000;hpb=72cba68a5b5eb36a63bd59a297e3d1d432760a4e;p=lgpl%2Fargeo-commons.git diff --git a/server/runtime/org.argeo.server.ads/src/main/java/org/argeo/server/ads/AdsContainer.java b/server/runtime/org.argeo.server.ads/src/main/java/org/argeo/server/ads/AdsContainer.java new file mode 100644 index 000000000..4a36f721d --- /dev/null +++ b/server/runtime/org.argeo.server.ads/src/main/java/org/argeo/server/ads/AdsContainer.java @@ -0,0 +1,138 @@ +package org.argeo.server.ads; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.naming.NamingException; +import javax.naming.directory.InitialDirContext; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.directory.server.configuration.MutableServerStartupConfiguration; +import org.apache.directory.server.core.configuration.ShutdownConfiguration; +import org.apache.directory.server.jndi.ServerContextFactory; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.core.io.Resource; +import org.springframework.util.Assert; + +public class AdsContainer implements InitializingBean, DisposableBean { + private final static Log log = LogFactory.getLog(AdsContainer.class); + + private MutableServerStartupConfiguration configuration; + private Properties environment = null; + private File workingDirectory = new File(System + .getProperty("java.io.tmpdir") + + File.separator + "argeo-apacheDirectoryServer"); + private List ldifs = new ArrayList(); + private File ldifDirectory; + private Boolean deleteWorkingDirOnExit = false; + + @SuppressWarnings("unchecked") + public void afterPropertiesSet() throws Exception { + + log.info("Starting directory server with id '" + + configuration.getInstanceId() + "' in directory " + + workingDirectory.getAbsolutePath()); + + if (deleteWorkingDirOnExit && workingDirectory.exists()) { + log.warn("Found existing directory " + workingDirectory + + " deleting it..."); + FileUtils.deleteDirectory(workingDirectory); + } + configuration.setWorkingDirectory(workingDirectory); + workingDirectory.mkdirs(); + + if (ldifDirectory != null) + configuration.setLdifDirectory(ldifDirectory); + else + configuration.setLdifDirectory(new File(workingDirectory + .getAbsolutePath() + + File.separator + "ldif")); + + if (ldifs.size() > 0) + configuration.getLdifDirectory().mkdirs(); + for (Resource ldif : ldifs) { + FileUtils.copyURLToFile(ldif.getURL(), new File(configuration + .getLdifDirectory().getAbsolutePath() + + File.separator + ldif.getFilename().replace(':', '_'))); + if (log.isDebugEnabled()) + log.debug("Copied " + ldif + " to LDIF directory " + + configuration.getLdifDirectory()); + } + + Properties env = new Properties(); + env.setProperty(Context.INITIAL_CONTEXT_FACTORY, + ServerContextFactory.class.getName()); + Assert.notNull(environment); + env.putAll(environment); + env.putAll(configuration.toJndiEnvironment()); + + try { + new InitialDirContext(env); + } catch (NamingException e) { + throw new RuntimeException( + "Failed to start Apache Directory server", e); + } + } + + @SuppressWarnings("unchecked") + public void destroy() throws Exception { + ShutdownConfiguration shutdown = new ShutdownConfiguration( + configuration.getInstanceId()); + + Properties env = new Properties(); + env.setProperty(Context.INITIAL_CONTEXT_FACTORY, + ServerContextFactory.class.getName()); + Assert.notNull(environment); + env.putAll(environment); + env.putAll(shutdown.toJndiEnvironment()); + + log.info("Shutting down directory server with id '" + + configuration.getInstanceId() + "'"); + + try { + new InitialContext(env); + } catch (NamingException e) { + throw new RuntimeException( + "Failed to stop Apache Directory server", e); + } + + if (workingDirectory.exists() && deleteWorkingDirOnExit) { + if (log.isDebugEnabled()) + log.debug("Delete Apache DS working dir " + workingDirectory); + FileUtils.deleteDirectory(workingDirectory); + } + + } + + public void setConfiguration(MutableServerStartupConfiguration configuration) { + this.configuration = configuration; + } + + public void setWorkingDirectory(File workingDirectory) { + this.workingDirectory = workingDirectory; + } + + public void setEnvironment(Properties environment) { + this.environment = environment; + } + + public void setLdifs(List ldifs) { + this.ldifs = ldifs; + } + + public void setLdifDirectory(File ldifDirectory) { + this.ldifDirectory = ldifDirectory; + } + + public void setDeleteWorkingDirOnExit(Boolean deleteWorkingDirOnExit) { + this.deleteWorkingDirOnExit = deleteWorkingDirOnExit; + } + +}