package com.plectix.simulator.parser.builders; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import com.plectix.simulator.parser.ParseErrorException; import com.plectix.simulator.parser.ParseErrorMessage; import com.plectix.simulator.parser.abstractmodel.ModelAgent; import com.plectix.simulator.parser.abstractmodel.ModelSite; import com.plectix.simulator.simulator.KappaSystemInterface; import com.plectix.simulator.staticanalysis.Agent; import com.plectix.simulator.staticanalysis.InternalState; import com.plectix.simulator.staticanalysis.Site; import com.plectix.simulator.util.NameDictionary; /*package*/ public final class SubstanceBuilder { private final KappaSystemInterface kappaSystem; public SubstanceBuilder(KappaSystemInterface system) { this.kappaSystem = system; } public final List<Agent> buildAgents(List<ModelAgent> abstractAgents) throws ParseErrorException { if (abstractAgents == null) { return null; } List<Agent> actualAgents = new LinkedList<Agent>(); for (ModelAgent agent : abstractAgents) { Agent newAgent = this.convertAgent(agent); actualAgents.add(newAgent); } Map<Integer, Site> map = new LinkedHashMap<Integer, Site>(); for (Agent agent : actualAgents) { for (Site site : agent.getSites()) { int index = site.getLinkIndex(); if (index == -1) { continue; } Site connectedSite = map.get(index); if (connectedSite == null) { map.put(index, site); } else { connectedSite.getLinkState().connectSite(site); site.getLinkState().connectSite(connectedSite); if(site.getParentAgent()==connectedSite.getParentAgent()){ throw new ParseErrorException(ParseErrorMessage.AGENT_CONNECTED_WITH_HIMSELF, site.getParentAgent().toString()); } map.remove(site.getLinkIndex()); } } } return actualAgents; } private final Agent convertAgent(ModelAgent abstractAgent) { Agent resultAgent = new Agent(abstractAgent.getName(), kappaSystem.generateNextAgentId()); for (ModelSite site : abstractAgent.getSites()) { Site newSite = convertSite(site); resultAgent.addSite(newSite); } return resultAgent; } private final Site convertSite(ModelSite abstractSite) { Site newSite = new Site(abstractSite.getName()); newSite.getLinkState().setStatusLink(abstractSite.getLinkState().getStatusLink()); newSite.setLinkIndex(abstractSite.getLinkIndex()); String internalStateName = abstractSite.getInternalStateName(); if (!NameDictionary.isDefaultInternalStateName(internalStateName)) { newSite.setInternalState(new InternalState(internalStateName)); } return newSite; } }