package org.jboss.seam.pageflow; import org.dom4j.Element; import org.jboss.seam.bpm.BusinessProcess; import org.jboss.seam.core.Conversation; import org.jboss.seam.core.Interpolator; import org.jbpm.graph.def.Node; import org.jbpm.graph.exe.ExecutionContext; import org.jbpm.jpdl.xml.JpdlXmlReader; import org.jbpm.jpdl.xml.Parsable; /** * A page node in a jPDL pageflow * * @author Tom Baeyens * @author Gavin King * */ public class Page extends Node implements Parsable { // This classname is configured in the jbpm configuration // file : org/jbpm/graph/node/node.types.xml inside // the jbpm-{version}.jar // In case it would be necessary, that file, can be customized // by updating the reference to it in the central jbpm configuration // file 'jbpm.cfg.xml' private static final long serialVersionUID = 1L; private String viewId; private boolean isConversationEnd = false; private boolean isConversationEndBeforeRedirect = false; private boolean isTaskEnd = false; private String transition; private String processToCreate; private boolean redirect; private String description; private Integer timeout; private boolean backEnabled; private boolean switchEnabled; private String noConversationViewId; /** * parses the dom4j element that corresponds to this page. */ @Override public void read(Element pageElement, JpdlXmlReader jpdlXmlReader) { super.read(pageElement, jpdlXmlReader); viewId = pageElement.attributeValue("view-id"); if (viewId==null) { throw new IllegalStateException("must specify view-id for <page/> node: " + pageElement.attributeValue("name")); } noConversationViewId = pageElement.attributeValue("no-conversation-view-id"); backEnabled = "enabled".equals( pageElement.attributeValue("back") ); switchEnabled = !"disabled".equals( pageElement.attributeValue("switch") ); Element endConversationElement = pageElement.element("end-conversation"); if ( endConversationElement!=null ) { isConversationEnd = true; isConversationEndBeforeRedirect = Boolean.parseBoolean( endConversationElement.attributeValue("before-redirect") ); processToCreate = endConversationElement.attributeValue("create-process"); } Element endTaskElement = pageElement.element("end-task"); if (endTaskElement!=null) { isTaskEnd = true; transition = endTaskElement.attributeValue("transition"); } redirect = Boolean.parseBoolean( pageElement.attributeValue("redirect") ); if ( pageElement.element("redirect")!=null ) { redirect = true; } Element descriptionElement = pageElement.element("description"); if (descriptionElement!=null) { description = descriptionElement.getTextTrim(); } String timeoutString = pageElement.attributeValue("timeout"); if ( timeoutString!=null ) { timeout = Integer.valueOf(timeoutString); } } /** * is executed when execution arrives in this page at runtime. */ @Override public void execute(ExecutionContext executionContext) { if ( isConversationEnd && processToCreate!=null ) { BusinessProcess.instance().createProcess(processToCreate); } if ( isTaskEnd ) { BusinessProcess.instance().endTask(transition); } if (isConversationEnd || isTaskEnd ) { if (isConversationEndBeforeRedirect) { Conversation.instance().endBeforeRedirect(); } else { Conversation.instance().end(); } } if (getAction() != null) { try { getAction().execute(executionContext); } catch (Exception e) { raiseException(e, executionContext); } } } public boolean isConversationEnd() { return isConversationEnd; } public String getTransition() { return transition; } public String getViewId() { return Interpolator.instance().interpolate(viewId); } public boolean isRedirect() { return redirect; } public boolean hasDescription() { return description!=null; } @Override public String getDescription() { return Interpolator.instance().interpolate(description); } public Integer getTimeout() { return timeout; } public boolean isBackEnabled() { return backEnabled; } public boolean isSwitchEnabled() { return switchEnabled; } public String getNoConversationViewId() { return noConversationViewId; } protected boolean isTaskEnd() { return isTaskEnd; } protected String getProcessToCreate() { return processToCreate; } public boolean isConversationEndBeforeRedirect() { return isConversationEndBeforeRedirect; } }