package com.plectix.simulator.parser.builders; import java.util.ArrayList; import java.util.Collection; import java.util.List; import com.plectix.simulator.parser.ParseErrorException; import com.plectix.simulator.parser.abstractmodel.ModelAgent; import com.plectix.simulator.parser.abstractmodel.ModelRule; import com.plectix.simulator.simulator.KappaSystemInterface; import com.plectix.simulator.staticanalysis.Agent; import com.plectix.simulator.staticanalysis.Rule; import com.plectix.simulator.util.SpeciesManager; public final class RuleBuilder { private final SubstanceBuilder substanceBuilder; private final KappaSystemInterface kappaSystem; public RuleBuilder(KappaSystemInterface system) { this.kappaSystem = system; this.substanceBuilder = new SubstanceBuilder(system); } public final List<Rule> build(Collection<ModelRule> rules, MasterSolutionModel masterSolutionModel) throws ParseErrorException { List<Rule> result = new ArrayList<Rule>(); for (ModelRule rule : rules) { Rule newRule = convert(rule); if(masterSolutionModel != null) masterSolutionModel.checkCorrect(newRule, rule.toString()); result.add(newRule); } return result; } public final Rule convert(ModelRule abstractRule) throws ParseErrorException { String name = abstractRule.getName(); List<ModelAgent> lhs = abstractRule.getLHS(); List<ModelAgent> rhs = abstractRule.getRHS(); double rate = abstractRule.getRate(); int id = abstractRule.getID(); boolean isStorify = abstractRule.isStorify(); List<Agent> lhsAgents = substanceBuilder.buildAgents(lhs); List<Agent> rhsAgents = substanceBuilder.buildAgents(rhs); Rule newRule = buildRule(lhsAgents, rhsAgents, name, rate, id, isStorify); newRule.setAdditionalRate(abstractRule.getBinaryRate()); kappaSystem.generateNextRuleId(); return newRule; } private static final Rule buildRule(List<Agent> leftHandSideAgents, List<Agent> rightHandSideAgents, String name, double activity, int id, boolean isStorify) { return new Rule( SpeciesManager.formConnectedComponents(leftHandSideAgents), SpeciesManager.formConnectedComponents(rightHandSideAgents), name, activity, id, isStorify); } }