package com.plectix.simulator.staticanalysis.contactmap; import java.util.Collection; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import com.plectix.simulator.simulator.KappaSystem; import com.plectix.simulator.staticanalysis.LinkStatus; import com.plectix.simulator.staticanalysis.Rule; import com.plectix.simulator.staticanalysis.StaticAnalysisException; import com.plectix.simulator.staticanalysis.abstracting.AbstractAgent; import com.plectix.simulator.staticanalysis.abstracting.AbstractSite; import com.plectix.simulator.staticanalysis.subviews.AllSubViewsOfAllAgentsInterface; import com.plectix.simulator.staticanalysis.subviews.base.AbstractionRule; import com.plectix.simulator.staticanalysis.subviews.storage.SubViewsInterface; /** * Class implements contact map. * * @author avokhmin * */ public final class ContactMap { private ContactMapMode mode = ContactMapMode.SEMANTIC; private KappaSystem kappaSystem; private ContactMapAbstractSolution abstractSolution; private Rule focusRule; private boolean isInitialized = false; /** * This method sets mode of create contact map. * * @param newmode * given mode * @see ContactMapMode */ public final void setMode(ContactMapMode newmode) { mode = newmode; } /** * This method returns abstract solution. * * @return abstract solution. */ public final ContactMapAbstractSolution getAbstractSolution() { return abstractSolution; } /** * This method sets simulation data. * * @param simulationData * given simulation data */ public final void setSimulationData(KappaSystem newkappaSystem) { kappaSystem = newkappaSystem; } /** * This method sets "focus rule". * * @param newfocusRule * given rule * @see ContactMapMode */ public final void setFocusRule(Rule newfocusRule) { focusRule = newfocusRule; } public final void constructAbstractContactMapFromSubViews( AllSubViewsOfAllAgentsInterface subViews, List<Rule> rules) { switch (getMode()) { case SEMANTIC: // semantic contact map if (subViews != null && !subViews.isEmpty()) { Iterator<String> iterator = subViews.getAllTypesIdOfAgents(); while (iterator.hasNext()) { List<SubViewsInterface> listOfSubViews = subViews .getAllSubViewsByType(iterator.next()); abstractSolution.addData(listOfSubViews); } break; } else { //syntactic contact map abstractSolution.addAllRules(rules); break; } case SYNTACTIC: abstractSolution.addAllRules(rules); break; case FOCUS_ON_AGENT_OR_RULE: if (focusRule != null) { AbstractionRule abstractRule = new AbstractionRule(focusRule); Collection<AbstractAgent> agentsFromFocusedRule = abstractRule .getFocusedAgents(); abstractSolution.constructAbstractCard(rules, agentsFromFocusedRule); List<String> agentNames = new LinkedList<String>(); agentNames.addAll(abstractSolution.getAgentNameToAgentsList() .keySet()); abstractSolution.constructAbstractCard(rules, null); abstractSolution.clearCard(agentNames); break; } else { Iterator<String> iterator1 = subViews.getAllTypesIdOfAgents(); while (iterator1.hasNext()) { List<SubViewsInterface> listOfSubViews = subViews .getAllSubViewsByType(iterator1.next()); abstractSolution.addData(listOfSubViews); } abstractSolution.addAllRules(rules); break; } default: try { throw new StaticAnalysisException("unknown type of contact map"); } catch (StaticAnalysisException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * This method initializes abstract solution. */ public final void initAbstractSolution() { abstractSolution = new ContactMapAbstractSolution(kappaSystem); } public final List<AbstractAgent> getSideEffect(AbstractSite mainSite) { List<AbstractAgent> outList = new LinkedList<AbstractAgent>(); String mainAgentName = mainSite.getParentAgent().getName(); String mainSiteName = mainSite.getName(); Map<String, Map<String, List<ContactMapAbstractEdge>>> mapAll = abstractSolution .getEdgesInContactMap(); if (!mapAll.containsKey(mainAgentName)) return outList; if (!mapAll.get(mainAgentName).containsKey(mainSiteName)) return outList; for (ContactMapAbstractEdge edge : mapAll.get(mainAgentName).get( mainSiteName)) { /** * mainAgent(mainSite!linkSite.linkAgent) */ String linkSiteName = edge.getTargetVertexSiteName(); String connectedAgentName = edge.getTargetVertexAgentName(); AbstractAgent linkAgent = new AbstractAgent(connectedAgentName); AbstractSite linkSite = new AbstractSite(linkAgent, linkSiteName); linkAgent.addSite(linkSite); linkSite.getLinkState().setAgentName(mainAgentName); linkSite.getLinkState().setLinkSiteName(mainSiteName); linkSite.getLinkState().setStatusLink(LinkStatus.BOUND); outList.add(linkAgent); } return outList; } public final void fillContactMap(List<Rule> rules, AllSubViewsOfAllAgentsInterface subViews, KappaSystem kappaSystem) { if (!isInitialized) { setSimulationData(kappaSystem); initAbstractSolution(); constructAbstractContactMapFromSubViews(subViews, rules); } isInitialized = true; } public final boolean isInitialized() { return isInitialized; } public ContactMapMode getMode() { return mode; } }