/**
   * create the singelton EventService object if it doesn't exist already. Check if directory server
   * supports the Persistent Search Control and the Proxy Auth Control
   *
   * @supported.api
   */
  public static synchronized EventService getEventService() throws EventException, LDAPException {

    if (_shutdownCalled) {
      return null;
    }

    // Make sure only one instance of this class is created.
    if (_instance == null) {
      // Determine the Idle time out value for Event Service (LB/Firewall)
      // scenarios. Value == 0 imples no idle timeout.
      _idleTimeOut = getPropertyIntValue(EVENT_IDLE_TIMEOUT_INTERVAL, _idleTimeOut);
      _idleTimeOutMills = _idleTimeOut * 60000;
      ShutdownManager shutdownMan = ShutdownManager.getInstance();
      if (shutdownMan.acquireValidLock()) {
        try {
          if (_idleTimeOut == 0) {
            _instance = new EventService();
          } else {
            _instance = new EventServicePolling();
          }
          shutdownMan.addShutdownListener(
              new ShutdownListener() {
                public void shutdown() {
                  if (_instance != null) {
                    _instance.finalize();
                  }
                }
              });
        } finally {
          shutdownMan.releaseLockAndNotify();
        }
      }
    }
    return _instance;
  }
 public void destroy() {
   ShutdownManager shutdownMan = ShutdownManager.getInstance();
   if (shutdownMan.acquireValidLock()) {
     try {
       shutdownMan.shutdown();
     } finally {
       shutdownMan.releaseLockAndNotify();
     }
   }
 }
  /**
   * Starts the embedded <code>OpenDJ</code> instance.
   *
   * @param odsRoot File system directory where <code>OpenDJ</code> is installed.
   * @throws Exception upon encountering errors.
   */
  public static void startServer(String odsRoot) throws Exception {
    if (isStarted()) {
      return;
    }
    Debug debug = Debug.getInstance(SetupConstants.DEBUG_NAME);
    debug.message("EmbeddedOpenDS.startServer(" + odsRoot + ")");

    DirectoryEnvironmentConfig config = new DirectoryEnvironmentConfig();
    config.setServerRoot(new File(odsRoot));
    config.setForceDaemonThreads(true);
    config.setConfigClass(ConfigFileHandler.class);
    config.setConfigFile(new File(odsRoot + "/config", "config.ldif"));
    debug.message("EmbeddedOpenDS.startServer:starting DS Server...");
    EmbeddedUtils.startServer(config);
    debug.message("...EmbeddedOpenDS.startServer:DS Server started.");

    int sleepcount = 0;
    while (!EmbeddedUtils.isRunning() && (sleepcount < 60)) {
      sleepcount++;
      SetupProgress.reportStart("emb.waitingforstarted", null);
      Thread.sleep(1000);
    }

    if (EmbeddedUtils.isRunning()) {
      SetupProgress.reportEnd("emb.success", null);
    } else {
      SetupProgress.reportEnd("emb.failed", null);
    }

    serverStarted = true;

    ShutdownManager shutdownMan = com.sun.identity.common.ShutdownManager.getInstance();

    shutdownMan.addShutdownListener(
        new ShutdownListener() {
          public void shutdown() {
            try {
              shutdownServer("Graceful Shutdown");
            } catch (Exception ex) {
              Debug debug = Debug.getInstance(SetupConstants.DEBUG_NAME);
              debug.error("EmbeddedOpenDS:shutdown hook failed", ex);
            }
          }
        },
        ShutdownPriority.LOWEST);
  }