package org.concordion.internal.command; import org.concordion.api.Element; import org.concordion.api.Evaluator; import org.concordion.api.Resource; import org.concordion.api.ResultRecorder; import org.concordion.internal.CommandCall; import org.concordion.internal.util.Announcer; public class SpecificationCommand extends AbstractCommand { @Override public void setUp(CommandCall commandCall, Evaluator evaluator, ResultRecorder resultRecorder) { throw new IllegalStateException("Unexpected call to " + getClass().getSimpleName() + "'s setUp() method. Only the execute() method should be called."); } @Override public void execute(CommandCall commandCall, Evaluator evaluator, ResultRecorder resultRecorder) { announceBeforeProcessingEvent(commandCall.getResource(), commandCall.getElement()); commandCall.getChildren().processSequentially(evaluator, resultRecorder); announceAfterProcessingEvent(commandCall.getResource(), commandCall.getElement()); } @Override public void verify(CommandCall commandCall, Evaluator evaluator, ResultRecorder resultRecorder) { throw new IllegalStateException("Unexpected call to " + getClass().getSimpleName() + "'s verify() method. Only the execute() method should be called."); } private Announcer<SpecificationProcessingListener> listeners = Announcer.to(SpecificationProcessingListener.class); public void addSpecificationListener(SpecificationProcessingListener listener) { listeners.addListener(listener); } public void removeSpecificationListener(SpecificationProcessingListener listener) { listeners.removeListener(listener); } private void announceAfterProcessingEvent(Resource resource, Element element) { listeners.announce().afterProcessingSpecification(new SpecificationProcessingEvent(resource, element)); } private void announceBeforeProcessingEvent(Resource resource, Element element) { listeners.announce().beforeProcessingSpecification(new SpecificationProcessingEvent(resource, element)); } }