package org.jboss.seam.navigation; import java.util.ArrayList; import java.util.List; import javax.faces.context.FacesContext; import org.jboss.seam.core.Events; import org.jboss.seam.core.Expressions.ValueExpression; import org.jboss.seam.util.Strings; /** * Metadata for an <rule/> in pages.xml * * @author Gavin King * */ public final class Rule { private String outcomeValue; private ValueExpression condition; private List<Output> outputs = new ArrayList<Output>(); private ConversationControl conversationControl = new ConversationControl(); private TaskControl taskControl = new TaskControl(); private ProcessControl processControl = new ProcessControl(); private List<NavigationHandler> navigationHandlers = new ArrayList<NavigationHandler>(); private List<String> eventTypes = new ArrayList<String>(); public boolean matches(String actualValue) { return ( actualValue!=null || condition!=null ) && ( outcomeValue==null || outcomeValue.equals(actualValue) ) && ( condition==null || Boolean.TRUE.equals( condition.getValue() ) ); } public List<NavigationHandler> getNavigationHandlers() { return navigationHandlers; } public void addNavigationHandler(NavigationHandler navigationHandler) { this.navigationHandlers.add(navigationHandler); } public ConversationControl getConversationControl() { return conversationControl; } public TaskControl getTaskControl() { return taskControl; } public ProcessControl getProcessControl() { return processControl; } public ValueExpression getCondition() { return condition; } public void setCondition(ValueExpression expression) { this.condition = expression; } public String getOutcomeValue() { return outcomeValue; } public void setOutcomeValue(String value) { this.outcomeValue = value; } public List<Output> getOutputs() { return outputs; } public boolean execute(FacesContext context) { getConversationControl().beginOrEndConversation(); getTaskControl().beginOrEndTask(); getProcessControl().createOrResumeProcess(); for ( Output output: getOutputs() ) { output.out(); } for (String eventType : eventTypes) { Events.instance().raiseEvent(eventType); } for ( NavigationHandler nh: getNavigationHandlers() ) { if ( nh.navigate(context) ) return true; } return false; } public List<String> getEventTypes() { return eventTypes; } public void addEventType(String eventType) { if (!Strings.isEmpty(eventType)) { eventTypes.add(eventType); } } }