/******************************************************************************* * Copyright (c) 2011 The University of York. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Louis Rose - initial API and implementation ******************************************************************************/ package simulator.execution.model.actions; import simulator.execution.model.state.State; import simulator.scl.AndCondition; import simulator.scl.Condition; import simulator.scl.DisplayMatchesCondition; import simulator.scl.Displayable; import simulator.scl.IndicatorMatchesCondition; import simulator.scl.NotCondition; import simulator.scl.OrCondition; import simulator.scl.VariableEqualsCondition; public abstract class EvaluatableCondition { public static EvaluatableCondition createFrom(Condition condition) { return condition == null ? new TautologicalCondition() : new ConfigurableCondition(condition); } public abstract boolean isSatisfied(State state); private static class ConfigurableCondition extends EvaluatableCondition { private final Condition condition; private ConfigurableCondition(Condition condition) { this.condition = condition; } public boolean isSatisfied(State state) { if (condition instanceof DisplayMatchesCondition) { return isSatisfied((DisplayMatchesCondition)condition, state); } else if (condition instanceof IndicatorMatchesCondition) { return isSatisfied((IndicatorMatchesCondition)condition, state); } else if (condition instanceof VariableEqualsCondition) { return isSatisfied((VariableEqualsCondition)condition, state); } else if (condition instanceof NotCondition) { return isSatisfied((NotCondition)condition, state); } else if (condition instanceof OrCondition) { return isSatisfied((OrCondition)condition, state); } else if (condition instanceof AndCondition) { return isSatisfied((AndCondition)condition, state); } else { throw new IllegalStateException("Unknown type of Condition: " + condition); } } private boolean isSatisfied(DisplayMatchesCondition condition, State state) { return equalOrBothNull(state.getDisplayText(), extractValue(condition.getValueToMatch(), state)); } private boolean isSatisfied(IndicatorMatchesCondition condition, State state) { return equalOrBothNull(state.getIndicatorText(), extractValue(condition.getValueToMatch(), state)); } private boolean isSatisfied(VariableEqualsCondition condition, State state) { return equalOrBothNull(extractValue(condition.getVariable(), state), extractValue(condition.getValue(), state)); } private boolean isSatisfied(NotCondition condition, State state) { return !new ConfigurableCondition(condition.getSubcondition()).isSatisfied(state); } private boolean isSatisfied(OrCondition condition, State state) { for (Condition subcondition : condition.getSubconditions()) { if (new ConfigurableCondition(subcondition).isSatisfied(state)) { return true; } } return false; } private boolean isSatisfied(AndCondition condition, State state) { for (Condition subcondition : condition.getSubconditions()) { if (!new ConfigurableCondition(subcondition).isSatisfied(state)) { return false; } } return true; } private String extractValue(Displayable newValue, State state) { return new ReadableDisplayable(newValue).extractValue(state); } private static boolean equalOrBothNull(String first, String second) { return first == null ? second == null : first.equals(second); } } private static class TautologicalCondition extends EvaluatableCondition { private TautologicalCondition() {} @Override public boolean isSatisfied(State state) { return true; } } }