package org.jboss.seam.flex;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.jboss.seam.contexts.ServletLifecycle;
import org.jboss.seam.core.ConversationPropagation;
import org.jboss.seam.core.Manager;
import org.jboss.seam.log.LogProvider;
import org.jboss.seam.log.Logging;
import org.jboss.seam.servlet.ServletRequestSessionMap;
import org.jboss.seam.web.ServletContexts;
import flex.messaging.FlexContext;
import flex.messaging.services.remoting.adapters.JavaAdapter;
import flex.messaging.messages.AcknowledgeMessage;
import flex.messaging.messages.Message;
/**
* The Seam adaptor should translate seam exceptions and do any other additional
* management needed
*/
public class SeamAdapter
extends JavaAdapter
{
public static final String SEAM_ADAPTER_ID = "seam-adapter";
private static final String CONVERSATION_ID = "conversationId";
private static final LogProvider log = Logging.getLogProvider(SeamAdapter.class);
@Override
public Object invoke(Message message) {
log.info("SeamAdapter: " + message);
try {
startSeamContexts(message, FlexContext.getHttpRequest());
Object result = wrapResult(super.invoke(message));
endSeamContexts(FlexContext.getHttpRequest());
return result;
} catch (RuntimeException e) {
// XXX end request properly....
e.printStackTrace();
throw e;
}
}
protected Object wrapResult(Object result)
{
AcknowledgeMessage response = new AcknowledgeMessage();
response.setHeader(CONVERSATION_ID, Manager.instance().getCurrentConversationId());
response.setBody(result);
return response;
}
protected void startSeamContexts(Message message, HttpServletRequest request)
{
ServletLifecycle.beginRequest(request);
ServletContexts.instance().setRequest(request);
Map conversationParameters = conversationMap(message);
ConversationPropagation.instance().restoreConversationId(conversationParameters);
Manager.instance().restoreConversation();
ServletLifecycle.resumeConversation(request);
Manager.instance().handleConversationPropagation(conversationParameters);
// Force creation of the session
if (request.getSession(false) == null) {
request.getSession(true);
}
}
protected void endSeamContexts(HttpServletRequest request)
{
Manager.instance().endRequest( new ServletRequestSessionMap(request) );
ServletLifecycle.endRequest(request);
}
protected Map conversationMap(Message message) {
Map result = new HashMap();
result.put(Manager.instance().getConversationIdParameter(), conversationId(message));
return result;
}
protected String conversationId(Message message) {
if (message == null) {
return null;
}
Object header = message.getHeader(CONVERSATION_ID);
return header == null ? null : header.toString();
}
}