/** {@inheritDoc} */
  public synchronized void destroy() {

    String s = config.getInitParameter(ApplicationConfig.SHARED);
    if (s != null && s.equalsIgnoreCase("true")) {
      logger.warn(
          "Factory shared, will not be destroyed. That can possibly cause memory leaks if"
              + "Broadcaster where created. Make sure you destroy them manually.");
      return;
    }

    Enumeration<Broadcaster> e = store.elements();
    Broadcaster b;
    // We just need one when shared.
    BroadcasterConfig bc = null;
    while (e.hasMoreElements()) {
      try {
        b = e.nextElement();
        b.resumeAll();
        b.destroy();
        bc = b.getBroadcasterConfig();
      } catch (Throwable t) {
        // Shield us from any bad behaviour
        logger.trace("Destroy", t);
      }
    }

    try {
      if (bc != null) bc.forceDestroy();
    } catch (Throwable t) {
      logger.trace("Destroy", t);
    }

    store.clear();
    factory = null;
  }
  private Broadcaster createBroadcaster(Class<? extends Broadcaster> c, Object id)
      throws BroadcasterCreationException {
    try {
      Broadcaster b =
          c.getConstructor(String.class, AtmosphereConfig.class).newInstance(id.toString(), config);
      InjectorProvider.getInjector().inject(b);

      if (b.getBroadcasterConfig() == null) {
        b.setBroadcasterConfig(
            new BroadcasterConfig(config.framework().broadcasterFilters, config));
      }

      b.setBroadcasterLifeCyclePolicy(policy);
      if (DefaultBroadcaster.class.isAssignableFrom(clazz)) {
        DefaultBroadcaster.class.cast(b).start();
      }

      for (BroadcasterListener l : broadcasterListeners) {
        b.addBroadcasterListener(l);
      }
      notifyOnPostCreate(b);
      return b;
    } catch (Throwable t) {
      throw new BroadcasterCreationException(t);
    }
  }