package org.jboss.seam.faces; import static org.jboss.seam.annotations.Install.BUILT_IN; import java.io.Serializable; import org.jboss.seam.Component; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Install; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; import org.jboss.seam.annotations.intercept.BypassInterceptors; import org.jboss.seam.contexts.Contexts; import org.jboss.seam.core.Init; import org.jboss.seam.core.Manager; import org.jboss.seam.pageflow.Pageflow; import org.jboss.seam.web.Session; /** * Book-keeping component that persists information * about the conversation associated with the current * page. * * @author Gavin King * */ @Name("org.jboss.seam.faces.facesPage") @BypassInterceptors @Install(precedence=BUILT_IN, classDependencies="javax.faces.context.FacesContext") @Scope(ScopeType.PAGE) public class FacesPage implements Serializable { private static final long serialVersionUID = 4807114041808347239L; private String pageflowName; private Integer pageflowCounter; private String pageflowNodeName; private String conversationId; private boolean conversationIsLongRunning; //private Map<String, Object> pageParameters; public String getConversationId() { return conversationId; } public void discardTemporaryConversation() { conversationId = null; conversationIsLongRunning = false; } public void discardNestedConversation(String outerConversationId) { conversationId = outerConversationId; conversationIsLongRunning = true; } public void storeConversation(String conversationId) { this.conversationId = conversationId; conversationIsLongRunning = true; } public void storePageflow() { if ( Init.instance().isJbpmInstalled() ) { Pageflow pageflow = Pageflow.instance(); if ( pageflow.isInProcess() /*&& !pageflow.getProcessInstance().hasEnded()*/ && Manager.instance().isLongRunningConversation() ) { pageflowName = pageflow.getSubProcessInstance().getProcessDefinition().getName(); pageflowNodeName = pageflow.getNode().getName(); pageflowCounter = pageflow.getPageflowCounter(); } else { pageflowName = null; pageflowNodeName = null; pageflowCounter = null; } } } public static FacesPage instance() { if ( !Contexts.isPageContextActive() ) { throw new IllegalStateException("No page context active"); } return (FacesPage) Component.getInstance(FacesPage.class, ScopeType.PAGE); } public boolean isConversationLongRunning() { return conversationIsLongRunning; } public Integer getPageflowCounter() { return pageflowCounter; } public String getPageflowName() { return pageflowName; } public String getPageflowNodeName() { return pageflowNodeName; } public void storeConversation() { Manager manager = Manager.instance(); //we only need to execute this code when we are in the //RENDER_RESPONSE phase, ie. not before redirects Session session = Session.getInstance(); boolean sessionInvalid = session!=null && session.isInvalid(); if ( !sessionInvalid && manager.isLongRunningConversation() ) { storeConversation( manager.getCurrentConversationId() ); } else if ( !sessionInvalid && manager.isNestedConversation() ) { discardNestedConversation( manager.getParentConversationId() ); } else { discardTemporaryConversation(); } /*if ( !sessionInvalid && Init.instance().isClientSideConversations() ) { // if we are using client-side conversations, put the // map containing the conversation context variables // into the view root (or remove it for a temp // conversation context) Contexts.getConversationContext().flush(); }*/ } /*public Map<String, Object> getPageParameters() { return pageParameters==null ? Collections.EMPTY_MAP : pageParameters; } public void setPageParameters(Map<String, Object> pageParameters) { this.pageParameters = pageParameters.isEmpty() ? null : pageParameters; } /** * Used by test harness * * @param name the page parameter name * @param value the value */ /*public void setPageParameter(String name, Object value) { if (pageParameters==null) { pageParameters = new HashMap<String, Object>(); } pageParameters.put(name, value); }*/ }