// Copyright (C) 2003-2009 by Object Mentor, Inc. All rights reserved. // Released under the terms of the CPL Common Public License version 1.0. package fitnesse.slim; import fitnesse.slim.instructions.Instruction; import fitnesse.slim.instructions.InstructionFactory; import fitnesse.slim.instructions.InstructionResult; import java.util.ArrayList; import java.util.List; import static java.util.Arrays.asList; /** * executes a list of SLIM statements, and returns a list of return values. */ public class ListExecutor { private StatementExecutorInterface executor; private NameTranslator methodNameTranslator; private boolean verbose; public ListExecutor(SlimFactory slimFactory) { this(false, slimFactory); } protected ListExecutor(boolean verbose, SlimFactory slimFactory) { this.verbose = verbose; this.executor = slimFactory.getStatementExecutor(); this.methodNameTranslator = slimFactory.getMethodNameTranslator(); } protected void setVerbose() { verbose = true; } private class Executive { public void prepareToExecute() { } public List<Object> executeStatements(List<Object> statements) { List<Object> result = new ArrayList<>(); for (Object statement : statements) if (!executor.stopHasBeenRequested()) result.add(executeStatement(statement)); return result; } public Object executeStatement(Object statement) { Instruction instruction = InstructionFactory.createInstruction(asStatementList(statement), methodNameTranslator); InstructionResult result = instruction.execute(executor); Object resultObject; if (result.hasResult() || result.hasError()) { resultObject = result.getResult(); } else { resultObject = null; } return asList(instruction.getId(), resultObject); } public void finalizeExecution() { if (executor.stopHasBeenRequested()) executor.reset(); } } private class LoggingExecutive extends Executive { @Override public void prepareToExecute() { verboseMessage("!1 Instructions"); } @Override public Object executeStatement(Object statement) { List<Object> statementList = asStatementList(statement); verboseMessage(statementList + "\n"); Object retVal = super.executeStatement(statement); verboseMessage(retVal); verboseMessage("------"); return retVal; } } public List<Object> execute(List<Object> statements) { Executive e = verbose ? new LoggingExecutive() : new Executive(); e.prepareToExecute(); List<Object> result = e.executeStatements(statements); e.finalizeExecution(); return result; } private List<Object> asStatementList(Object statement) { return (List<Object>) statement; } private void verboseMessage(Object message) { if (verbose) System.out.println(message); } }