package com.plectix.simulator.io; import java.io.PrintStream; import java.util.ArrayList; import java.util.List; import com.plectix.simulator.simulationclasses.action.Action; import com.plectix.simulator.simulationclasses.perturbations.ComplexPerturbation; import com.plectix.simulator.simulationclasses.solution.SolutionLine; import com.plectix.simulator.simulator.KappaSystem; import com.plectix.simulator.simulator.SimulationArguments; import com.plectix.simulator.simulator.SimulationData; import com.plectix.simulator.staticanalysis.Rule; import com.plectix.simulator.staticanalysis.Site; import com.plectix.simulator.util.Info; import com.plectix.simulator.util.OutputUtils; import com.plectix.simulator.util.Info.InfoType; public class ConsoleOutputManager { private final String PROGRESS_BAR_SYMBOL = "#"; private PrintStream printStream = null; private final SimulationData simulationData; private final List<Info> infoList = new ArrayList<Info>(); public ConsoleOutputManager(SimulationData simulationData) { this.simulationData = simulationData; } public boolean initialized() { return printStream != null; } public final void print(String text) { if (this.initialized()) { printStream.print(text); } } final void println() { if (this.initialized()) { printStream.println(); } } public final void println(String text) { this.print(text); this.println(); } public final void outputBar() { SimulationArguments simulationArguments = simulationData.getSimulationArguments(); if (simulationArguments.getOutputTypeForAdditionalInfo() != InfoType.DO_NOT_OUTPUT || !simulationArguments.needToStorify()) print(PROGRESS_BAR_SYMBOL); } public void setPrintStream(PrintStream printStream) { this.printStream = printStream; } public final void outputData() { outputRules(); outputPertubation(); outputSolution(); } private final void outputSolution() { println("INITIAL SOLUTION:"); for (SolutionLine sl : (simulationData.getKappaSystem().getSolution()).getSolutionLines()) { print("-"); print("" + sl.getNumber()); print("*["); print(sl.getLine()); println("]"); } } private final void outputRules() { for (Rule rule : simulationData.getKappaSystem().getRules()) { // int countAgentsInLHS = rule.getCountAgentsLHS(); // int indexNewAgent = countAgentsInLHS; for (Action action : rule.getActionList()) { switch (action.getType()) { case BREAK: { Site siteTo = ((Site) action.getSourceSite().getLinkState() .getConnectedSite()); if (action.getSourceSite().getParentAgent() .getIdInRuleHandside() < siteTo.getParentAgent() .getIdInRuleHandside()) { // BRK (#0,a) (#1,x) print("BRK (#"); print("" + (action.getSourceSite().getParentAgent() .getIdInRuleHandside() - 1)); print(","); print(action.getSourceSite().getName()); print(") "); print("(#"); print("" + (siteTo.getParentAgent() .getIdInRuleHandside() - 1)); print(","); print(siteTo.getName()); println(") "); } break; } case DELETE: { // DEL #0 print("DEL #"); println("" + (action.getSourceAgent().getIdInRuleHandside() - 1)); break; } case ADD: { // ADD a#0(x) print("ADD " + action.getTargetAgent().getName() + "#"); print("" + (action.getTargetAgent().getIdInRuleHandside() - 1)); print("("); int i = 1; for (Site site : action.getTargetAgent().getSites()) { print(site.getName()); if ((site.getInternalState() != null) && (!site.getInternalState().hasDefaultName())) print("~" + site.getInternalState().getName()); if (action.getTargetAgent().getSites().size() > i++) print(","); } println(") "); break; } case BOUND: { // BND (#1,x) (#0,a) Site siteTo = ((Site) action.getSourceSite().getLinkState() .getConnectedSite()); if (action.getSourceSite().getParentAgent() .getIdInRuleHandside() > siteTo.getParentAgent() .getIdInRuleHandside()) { print("BND (#"); print("" + (action.getSourceSite().getParentAgent() .getIdInRuleHandside() - 1)); print(","); print(action.getSourceSite().getName()); print(") "); print("(#"); print("" + (action.getTargetSite().getParentAgent() .getIdInRuleHandside() - 1)); print(","); print(siteTo.getName()); println(") "); } break; } case MODIFY: { // MOD (#1,x) with p print("MOD (#"); print("" + (action.getSourceSite().getParentAgent() .getIdInRuleHandside() - 1)); print(","); print(action.getSourceSite().getName()); print(") with "); println(action.getTargetSite().getInternalState().getName()); break; } } } StringBuffer sb = new StringBuffer(); boolean ocamlStyle = simulationData.getSimulationArguments().isOcamlStyleNameingInUse(); sb.append(OutputUtils.printPartRule(rule.getLeftHandSide(), ocamlStyle)); sb.append("->"); sb.append(OutputUtils.printPartRule(rule.getRightHandSide(), ocamlStyle)); StringBuffer ch = new StringBuffer(); for (int j = 0; j < sb.length(); j++) ch.append("-"); println(ch.toString()); if (rule.getName() != null) { print(rule.getName()); print(": "); } print(sb.toString()); println(); println(ch.toString()); println(); println(); } } private final void outputPertubation() { println("PERTURBATIONS:"); KappaSystem kappaSystem = simulationData.getKappaSystem(); for (ComplexPerturbation<?, ?> perturbation : kappaSystem.getPerturbations()) { println(OutputUtils.perturbationToString(perturbation, kappaSystem)); } } public PrintStream getPrintStream() { return printStream; } public final void addAdditionalInfo(InfoType type, String message) { InfoType outputType = simulationData.getSimulationArguments().getOutputTypeForAdditionalInfo(); this.addInfo(outputType, type, message); } public List<Info> getInfo() { return infoList; } private void addInfo(InfoType outputType, InfoType type, String message) { simulationData.addInfo(new Info(outputType, type, message, printStream)); } }