package sample;

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.enterprise.context.Destroyed;
import javax.enterprise.context.Initialized;
import javax.enterprise.context.NonexistentConversationException;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;

@ApplicationScoped
public class ConversationBean {

    /** CDI Conversation */
    @Inject
    private Conversation conversation;
    
    @Inject
    private ConversationScopedBean bean;

    public void begin(ServletRequest request) {
        try {
            if (conversation.isTransient()) {
                conversation.begin();
                System.out.println("Conversation begun. cid:" + conversation.getId()
                        + ", timeout:" + conversation.getTimeout());
                
                bean.getMsg();
            }
        } catch (NonexistentConversationException e) {
            String cidParam = request.getParameter("cid");
            System.out.println("NonexistentConversation!! cidParam:" + cidParam);

            conversation.begin(cidParam);
            System.out.println("Conversation begun. cid:" + conversation.getId()
                    + ", timeout:" + conversation.getTimeout());
        }
    }

    public void end() {
        conversation.end();
    }

    void onInitialized(@Observes @Initialized(ConversationScoped.class) Object obj, HttpServletRequest request) {
        System.out.println("Conversation initialized.");
        conversation.setTimeout(60 * 60 * 1000);
    }

    void onDestroyed(@Observes @Destroyed(ConversationScoped.class) String cid) {
        System.out.println("Conversation destroyed. cid:" + cid);
    }
}
