package com.polycom.rm.ds;

import java.io.File;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Set;

import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.InitialDirContext;

import org.apache.directory.server.configuration.MutableServerStartupConfiguration;
import org.apache.directory.server.core.configuration.PartitionConfiguration;
import org.apache.directory.server.core.configuration.ShutdownConfiguration;
import org.jboss.system.ServiceMBeanSupport;

public class DsService extends ServiceMBeanSupport implements DsServiceMBean
{
   // paths are relative from jboss/bin/
   private static final String LDIF_DIR = "../ads-ldif";
   private static final String WORK_DIR = "../ads-work";
   private static final int ADS_PORT = 389;
   
   @Override
   protected void startService()
      throws Exception
   {
      log.info("------------- DsService::startService");
      startApacheDS();
   }
   
   @Override
   protected void stopService()
      throws Exception
   {
      log.info("-------------- DsService::stopService");
      stopApacheDS();
   }

   private void startApacheDS()
      throws Exception
   {
      log.info("------------- DsService::startApacheDS");
      try
      {
         // Create a default configuration
         MutableServerStartupConfiguration cfg = new MutableServerStartupConfiguration();
         log.info("ldif directory ["+new File(LDIF_DIR).getAbsoluteFile()+"]");
               
         cfg.setWorkingDirectory(new File(WORK_DIR).getAbsoluteFile());
         cfg.setLdifDirectory(new File(LDIF_DIR).getAbsoluteFile());
         cfg.getLdapConfiguration().setIpPort(ADS_PORT);

         JdbcPartitionConfiguration seConfig = new JdbcPartitionConfiguration();
         seConfig.setId("ReadiManager Partition");
         seConfig.setCacheSize(100);
         seConfig.setSuffix("ou=ReadiManager");
         seConfig.setPartitionClassName("com.polycom.rm.ds.JdbcPartition");
         seConfig.setOptimizerEnabled(true);
         seConfig.setSynchOnWrite(true);

         Attributes attrs = new BasicAttributes(true);
         Attribute attr = new BasicAttribute("objectClass");
         attr.add("top");
         attr.add("organizationalUnit");
         attr.add("extensibleObject");
         attrs.put(attr);
         attr = new BasicAttribute("ou");
         attr.add("ReadiManager");
         attrs.put(attr);
         seConfig.setContextEntry(attrs);

         Set<PartitionConfiguration> pcfgs = new HashSet<PartitionConfiguration>();
         pcfgs.add(seConfig);

         cfg.setPartitionConfigurations(pcfgs);

         // Start the Server
         Hashtable<String,Object> env = EnvHelper.createEnv();
         env.putAll(cfg.toJndiEnvironment());
         new InitialDirContext(env);

      }
      catch (Exception e)
      {
         throw new RuntimeException(e);
      }
   }

   private void stopApacheDS()
      throws Exception
   {
      log.info("-------------- DsService::stopApacheDS");
      try
      {
         Hashtable<String,Object> env = EnvHelper.createEnv();
         ShutdownConfiguration cfg = new ShutdownConfiguration();
         env.putAll(cfg.toJndiEnvironment());
         new InitialDirContext(env);
      }
      catch (NamingException e)
      {
         throw new RuntimeException(e);
      }
   }
}
