{
//It looks for cid parameter in the JSF request.
//If request contains cid, then it must restore conversation
//Otherwise create NonexistentException
WebBeansContext webBeansContext = WebBeansContext.getInstance();
ConversationManager conversationManager = webBeansContext.getConversationManager();
Conversation conversation = conversationManager.getConversationBeanReference();
String cid = JSFUtil.getConversationId();
ContextFactory contextFactory = webBeansContext.getContextFactory();
if (conversation.isTransient())
{
if (logger.isLoggable(Level.FINE))
{
logger.log(Level.FINE, "Creating a new transitional conversation with cid : [{0}]", conversation.getId());
}
contextFactory.initConversationContext(null);
//Not restore, throw exception
if(cid != null && !cid.equals(""))
{
throw new NonexistentConversationException("Propogated conversation with cid=" + cid + " is not restored. It creates a new transient conversation.");
}
}
else
{
if (logger.isLoggable(Level.FINE))
{
logger.log(Level.FINE, "Restoring conversation with cid : [{0}]", conversation.getId());
}
//Conversation must be used by one thread at a time
ConversationImpl owbConversation = (ConversationImpl)conversation;
if(!owbConversation.getInUsed().compareAndSet(false, true))
{
contextFactory.initConversationContext(null);
//Throw Busy exception
throw new BusyConversationException("Propogated conversation with cid=" + cid + " is used by other request. It creates a new transient conversation");
}
else
{
ConversationContext conversationContext = conversationManager.getConversationContext(conversation);
contextFactory.initConversationContext(conversationContext);
}
}
}
}