package org.mobicents.servlet.sip.seam.entrypoint;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Map;
import java.util.Set;
import javax.servlet.sip.SipServletMessage;
import javax.servlet.sip.SipSession;
import org.jboss.seam.ScopeType;
import org.jboss.seam.contexts.ApplicationContext;
import org.jboss.seam.contexts.BasicContext;
import org.jboss.seam.contexts.BusinessProcessContext;
import org.jboss.seam.contexts.Context;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.contexts.Lifecycle;
import org.jboss.seam.contexts.SessionContext;
import org.jboss.seam.core.Conversation;
import org.jboss.seam.core.ConversationEntries;
import org.jboss.seam.core.ConversationEntry;
import org.jboss.seam.core.Manager;
import org.jboss.seam.log.LogProvider;
import org.jboss.seam.log.Logging;
import org.jboss.seam.util.Id;
public class SeamEntrypointUtils {
private static LogProvider log = Logging.getLogProvider(SeamEntrypointUtils.class);
public static void setContext(String ctxName, Context newctx) {
Field field = null;
try {
field = Contexts.class.getDeclaredField(ctxName);
field.setAccessible(true);
ThreadLocal<Context> ctx = (ThreadLocal<Context>) field.get(null);
ctx.set(newctx);
field.setAccessible(false);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void destroyContext(Context context) {
try {
Method destroyMethod = Contexts.class.getDeclaredMethod("destroy", Context.class);
destroyMethod.setAccessible(true);
destroyMethod.invoke(null, context);
destroyMethod.setAccessible(false);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void beginEvent(SipServletMessage message) {
Context eventContext = new BasicContext(ScopeType.EVENT );
eventContext.set("sipServletMessage", message);
setContext("applicationContext", new ApplicationContext( Lifecycle.getApplication() ));
setContext("eventContext", eventContext);
setContext("sessionContext", new SessionContext( new SipSeamRequestSessionMap(message)));
setContext("conversationContext", new BasicContext(ScopeType.CONVERSATION));
setContext("businessProcessContext", new BusinessProcessContext() );
simulateConversationStart(message.getSession());
}
public static void beginEvent(SipSession sipSession) {
setContext("applicationContext", new ApplicationContext( Lifecycle.getApplication() ));
setContext("eventContext", new BasicContext(ScopeType.EVENT ));
setContext("sessionContext", new SessionContext(new SipSeamSessionMap(sipSession)));
setContext("conversationContext", new BasicContext(ScopeType.CONVERSATION));
setContext("businessProcessContext", new BusinessProcessContext() );
simulateConversationStart(sipSession);
}
private static void simulateConversationStart(SipSession session) {
if(!session.isValid()) return;
String cid = Id.nextId();
ArrayList<String> stack = new ArrayList<String>();
stack.add(cid);
Manager.instance().setCurrentConversationId(cid);
Manager.instance().setCurrentConversationIdStack(stack);
ConversationEntries.instance().createConversationEntry(cid, stack);
cid = Conversation.instance().getId();
ConversationEntries entries = ConversationEntries.instance();
ConversationEntry ce = entries.getConversationEntry(cid);
Manager.instance().setCurrentConversationIdStack(ce.getConversationIdStack());
Manager.instance().setCurrentConversationId(ce.getId());
}
public static void endEvent()
{
Lifecycle.endRequest();
}
}