package com.plectix.simulator.staticanalysis.subviews.base; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import com.plectix.simulator.staticanalysis.abstracting.AbstractAgent; import com.plectix.simulator.staticanalysis.abstracting.AbstractSite; import com.plectix.simulator.staticanalysis.graphs.Edge; import com.plectix.simulator.staticanalysis.graphs.Graph; import com.plectix.simulator.staticanalysis.graphs.Vertex; import com.plectix.simulator.staticanalysis.subviews.SubViewClass; import com.plectix.simulator.staticanalysis.subviews.storage.SubViewsInterface; import com.plectix.simulator.staticanalysis.subviews.storage.SubViewsLinkedlist; public abstract class AbstractClassSubViewBuilder { private final Map<String, List<SubViewsInterface>> subViewsMap = new LinkedHashMap<String, List<SubViewsInterface>>(); public AbstractClassSubViewBuilder() { } public final Map<String, List<SubViewsInterface>> getSubViews() { return subViewsMap; } protected final void constructClassesSubViews( List<AbstractionRule> abstractRules, Map<String, AbstractAgent> agentNameToAgent) { // CSubViewClass with one site = Vertex Map<String, Graph> graphsByAgent = new LinkedHashMap<String, Graph>(); Map<String, Map<String, SubViewClass>> agentVertexBySite = new LinkedHashMap<String, Map<String, SubViewClass>>(); // create graph for each agent for (Map.Entry<String, AbstractAgent> entery : agentNameToAgent .entrySet()) { String agentType = entery.getKey(); AbstractAgent agent = entery.getValue(); Graph graphForAgent = new Graph(); Map<String, SubViewClass> vertexBySite = new LinkedHashMap<String, SubViewClass>(); for (AbstractSite site : agent.getSitesMap().values()) { SubViewClass primitiveView = new SubViewClass(agentType); primitiveView.addSite(site.getName()); graphForAgent.addVertex(primitiveView); vertexBySite.put(site.getName(), primitiveView); } graphsByAgent.put(agentType, graphForAgent); agentVertexBySite.put(agentType, vertexBySite); List<SubViewsInterface> subViewsList = new LinkedList<SubViewsInterface>(); subViewsMap.put(agentType, subViewsList); } // draw edges in graphs for (AbstractionRule aRule : abstractRules) { List<AbstractAction> actions = aRule.getActions(); for (AbstractAction action : actions) { List<AbstractSite> modificatedSites = action .getModificatedSites(); List<AbstractSite> testedSites = action.getTestedSites(); if (modificatedSites == null) continue; String agentType = action.getLeftHandSideAgent().getName(); if (modificatedSites.isEmpty()) continue; for (AbstractSite modSite : modificatedSites) { for (AbstractSite testedSite : testedSites) { graphsByAgent.get(agentType).addEdge( new Edge(agentVertexBySite.get(agentType).get( modSite.getName()), agentVertexBySite .get(agentType).get( testedSite.getName()))); } for (AbstractSite mod2Site : modificatedSites) { if (modSite == mod2Site) continue; graphsByAgent.get(agentType).addEdge( new Edge(agentVertexBySite.get(agentType).get( modSite.getName()), agentVertexBySite .get(agentType).get( mod2Site.getName()))); } agentVertexBySite.get(agentType).get(modSite.getName()) .addRuleId(aRule.getRuleId()); } } } Map<String, ArrayList<SubViewClass>> agentTypeToClass = new LinkedHashMap<String, ArrayList<SubViewClass>>(); // extract classesSubView and write correspondence subview- rule for (String agentType : agentNameToAgent.keySet()) { if (agentNameToAgent.get(agentType).getSitesMap().isEmpty()) { ArrayList<SubViewClass> subViewsOfAgent = new ArrayList<SubViewClass>(); SubViewClass classSubView = new SubViewClass(agentType); subViewsOfAgent.add(classSubView); agentTypeToClass.put(agentType, subViewsOfAgent); continue; } ArrayList<SubViewClass> subViewsOfAgent = new ArrayList<SubViewClass>(); // is getAll... doing once? for (ArrayList<Vertex> subClass : graphsByAgent.get(agentType) .getAllWeakClosureComponent()) { SubViewClass classSubView = new SubViewClass(agentType); for (Vertex v : subClass) { classSubView.addSite(((SubViewClass) v).getSitesNames() .iterator().next()); classSubView.addRulesId(((SubViewClass) v).getRulesId()); } subViewsOfAgent.add(classSubView); } agentTypeToClass.put(agentType, subViewsOfAgent); } fillingSubViewsMap(agentTypeToClass); } // now filling by CSubViewsLinkedlist private final void fillingSubViewsMap( Map<String, ArrayList<SubViewClass>> agentTypeToClass) { for (Entry<String, ArrayList<SubViewClass>> entrySets : agentTypeToClass .entrySet()) { String key = entrySets.getKey(); ArrayList<SubViewClass> sets = entrySets.getValue(); for (SubViewClass subViewClass : sets) { // build map action- subview too SubViewsInterface subViews = new SubViewsLinkedlist( subViewClass); subViewsMap.get(key).add(subViews); } } } public boolean isEmpty(){ for(List<SubViewsInterface> list : subViewsMap.values()){ for(SubViewsInterface subView : list){ if(!subView.isEmpty()){ return false; } } } return true; } }