/**
   * Configures the specified application
   *
   * @param application
   * @return
   */
  public CdiContainer configure(Application application) {
    if (beanManager == null) {
      throw new IllegalStateException(
          "Configuration does not have a BeanManager instance configured");
    }

    CdiContainer container = new CdiContainer(beanManager, nonContextualManager);
    container.bind(application);

    RequestCycleListenerCollection listeners = new RequestCycleListenerCollection();
    application.getRequestCycleListeners().add(listeners);

    // enable conversation propagation
    if (getPropagation() != ConversationPropagation.NONE) {
      listeners.add(new ConversationPropagator(application, container, getPropagation()));
      application
          .getComponentPreOnBeforeRenderListeners()
          .add(new ConversationExpiryChecker(container));
      SeamConversationContextFactory.setDisableNoopInstance(true);
    }

    // enable detach event
    listeners.add(new DetachEventEmitter(container));

    // inject application instance
    if (isInjectApplication()) {
      container.getNonContextualManager().postConstruct(application);
    }

    // enable injection of various framework components

    if (isInjectSession()) {
      application.getSessionListeners().add(new SessionInjector(container));
    }

    if (isInjectComponents()) {
      application.getComponentInstantiationListeners().add(new ComponentInjector(container));
    }

    if (isInjectBehaviors()) {
      application.getBehaviorInstantiationListeners().add(new BehaviorInjector(container));
    }

    // enable cleanup

    application
        .getApplicationListeners()
        .add(new CdiShutdownCleaner(beanManager, isInjectApplication()));

    return container;
  }
  private static String getContainerDetails() {
    StringBuilder result = new StringBuilder();

    Class containerClass;
    for (CdiContainer cdiContainer : ServiceLoader.load(CdiContainer.class)) {
      containerClass = cdiContainer.getClass();
      result.append(
          containerClass.getProtectionDomain().getCodeSource().getLocation().toExternalForm());
      result.append(containerClass.getName());

      result.append(System.getProperty("line.separator"));
    }

    return result.toString();
  }
  public void onRequestHandlerResolved(RequestCycle cycle, IRequestHandler handler) {
    String cid = cycle.getRequest().getRequestParameters().getParameterValue("cid").toString();
    Page page = getPage(handler);

    if (cid == null && page != null) {
      cid = page.getMetaData(CID_KEY);
    }

    container.activateConversationalContext(cycle, cid);
  }
  @Override
  public void onUrlMapped(RequestCycle cycle, IRequestHandler handler, Url url) {
    Conversation conversation = container.getCurrentConversation(cycle);

    if (conversation == null || conversation.isTransient()) {
      return;
    }

    if (propagation == ConversationPropagation.ALL) {
      // propagate cid to bookmarkable pages via urls
      url.setQueryParameter(CID, conversation.getId());
    }
  }
  @Override
  public void onRequestHandlerExecuted(RequestCycle cycle, IRequestHandler handler) {
    Conversation conversation = container.getCurrentConversation(cycle);

    if (conversation == null) {
      return;
    }

    // propagate a conversation across non-bookmarkable page instances

    Page page = getPage(handler);
    if (!conversation.isTransient() && page != null) {
      page.setMetaData(CID_KEY, conversation.getId());
    }
  }
  public void onRequestHandlerScheduled(RequestCycle cycle, IRequestHandler handler) {
    Conversation conversation = container.getCurrentConversation(cycle);

    if (conversation == null || conversation.isTransient()) {
      return;
    }

    // propagate a converastion across non-bookmarkable page instances

    Page page = getPage(handler);
    if (page != null && !conversation.isTransient()) {
      page.setMetaData(CID_KEY, conversation.getId());
    }

    if (propagation == ConversationPropagation.ALL) {
      // propagate cid to a scheduled bookmarkable page

      PageParameters parameters = getPageParameters(handler);
      if (parameters != null) {
        parameters.add(CID, conversation.getId());
      }
    }
  }
 @Override
 public void onEndRequest(RequestCycle cycle) {
   container.deactivateConversationalContext(cycle);
 }