Package org.jboss.seam.security.external.dialogues

Source Code of org.jboss.seam.security.external.dialogues.DialogueContext

package org.jboss.seam.security.external.dialogues;

import java.lang.annotation.Annotation;
import java.util.UUID;

import javax.enterprise.context.ContextNotActiveException;
import javax.enterprise.context.spi.Context;
import javax.enterprise.context.spi.Contextual;
import javax.enterprise.context.spi.CreationalContext;
import javax.servlet.ServletContext;

import org.jboss.seam.security.external.contexts.ContextualInstance;
import org.jboss.seam.security.external.contexts.HashMapBeanStore;
import org.jboss.seam.security.external.dialogues.api.DialogueScoped;

/**
* @author Marcel Kolsteren
*/
public class DialogueContext implements Context {
    private static final String BEAN_STORE_ATTRIBUTE_NAME_PREFIX = "DialogueContextBeanStore";

    private ServletContext servletContext;

    private final ThreadLocal<String> dialogueIdThreadLocal;

    public DialogueContext() {
        dialogueIdThreadLocal = new ThreadLocal<String>();
    }

    protected HashMapBeanStore getBeanStore() {
        return getBeanStore(dialogueIdThreadLocal.get());
    }

    private HashMapBeanStore getBeanStore(String dialogueId) {
        HashMapBeanStore beanStore = (HashMapBeanStore) servletContext.getAttribute(getAttributeName(dialogueId));
        return beanStore;
    }

    private void createBeanStore(String dialogueId) {
        HashMapBeanStore beanStore = new HashMapBeanStore();
        servletContext.setAttribute(getAttributeName(dialogueId), beanStore);
    }

    private void removeBeanStore(String dialogueId) {
        servletContext.removeAttribute(getAttributeName(dialogueId));
    }

    private String getAttributeName(String dialogueId) {
        return BEAN_STORE_ATTRIBUTE_NAME_PREFIX + "_" + dialogueId;
    }

    public void initialize(ServletContext servletContext) {
        this.servletContext = servletContext;
    }

    public void destroy() {
        this.servletContext = null;
    }

    public String create() {
        if (this.dialogueIdThreadLocal.get() != null) {
            throw new RuntimeException("Already attached to a dialogue");
        }

        String dialogueId;
        do {
            dialogueId = UUID.randomUUID().toString();
        }
        while (getBeanStore(dialogueId) != null);

        this.dialogueIdThreadLocal.set(dialogueId);
        createBeanStore(dialogueId);
        return dialogueId;
    }

    public void remove() {
        getBeanStore().clear();
        removeBeanStore(this.dialogueIdThreadLocal.get());
        this.dialogueIdThreadLocal.set(null);
    }

    public boolean isExistingDialogue(String dialogueId) {
        return getBeanStore(dialogueId) != null;
    }

    /**
     * Attaches an existing dialogue to the current thread
     *
     * @param dialogueIdThreadLocal
     */
    public void attach(String dialogueId) {
        if (this.dialogueIdThreadLocal.get() != null) {
            throw new RuntimeException("Already attached to a dialogue");
        }
        if (!isExistingDialogue(dialogueId)) {
            throw new RuntimeException("There is no active context with request id " + dialogueId);
        }
        this.dialogueIdThreadLocal.set(dialogueId);
    }

    /**
     * Detaches the dialogue from the current thread
     */
    public void detach() {
        this.dialogueIdThreadLocal.set(null);
    }

    public boolean isAttached() {
        return dialogueIdThreadLocal.get() != null;
    }

    public <T> T get(Contextual<T> contextual, CreationalContext<T> creationalContext) {
        if (!isActive()) {
            throw new ContextNotActiveException();
        }
        ContextualInstance<T> beanInstance = getBeanStore().get(contextual);
        if (beanInstance != null) {
            return beanInstance.getInstance();
        } else if (creationalContext != null) {
            T instance = contextual.create(creationalContext);
            if (instance != null) {
                beanInstance = new ContextualInstance<T>(contextual, creationalContext, instance);
                getBeanStore().put(contextual, beanInstance);
            }
            return instance;
        } else {
            return null;
        }
    }

    public <T> T get(Contextual<T> contextual) {
        return get(contextual, null);
    }

    public Class<? extends Annotation> getScope() {
        return DialogueScoped.class;
    }

    public boolean isActive() {
        return dialogueIdThreadLocal.get() != null;
    }
}
TOP

Related Classes of org.jboss.seam.security.external.dialogues.DialogueContext

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.