package com.plectix.simulator.util; import java.util.ArrayList; import java.util.Collection; import java.util.List; import com.plectix.simulator.interfaces.ConnectedComponentInterface; import com.plectix.simulator.staticanalysis.Agent; import com.plectix.simulator.staticanalysis.ConnectedComponent; import com.plectix.simulator.staticanalysis.Site; public final class SpeciesManager { /** * This method takes a set of properly connected agents and "regroup" them * so each group forms connected component. * @param agents collection of somehow connected agents * @return resulting connected components */ public static final List<ConnectedComponentInterface> formConnectedComponents( Collection<Agent> agents) { if (agents == null || agents.isEmpty()) { return null; } List<Agent> agentsCopy = new ArrayList<Agent>(agents); List<ConnectedComponentInterface> result = new ArrayList<ConnectedComponentInterface>(); int index = 1; for (Agent agent : agentsCopy) agent.setIdInRuleSide(index++); while (!agentsCopy.isEmpty()) { List<Agent> connectedAgents = new ArrayList<Agent>(); findConnectedComponent(agentsCopy.get(0), agentsCopy, connectedAgents); // It needs recursive tree search of connected component result.add(new ConnectedComponent(connectedAgents)); } return result; } private static final void findConnectedComponent(Agent rootAgent, List<Agent> agentsFromRules, List<Agent> agents) { agents.add(rootAgent); rootAgent.setIdInConnectedComponent(agents.size() - 1); agentsFromRules.remove(rootAgent); // hsRulesList.remove(rootAgent); for (Site site : rootAgent.getSites()) { if (site.getLinkIndex() != -1) { Agent linkedAgent = findAgentByLinkIndex(agentsFromRules, site.getLinkIndex()); if (linkedAgent != null) { if (!agents.contains(linkedAgent)); findConnectedComponent(linkedAgent, agentsFromRules, agents); } } } } private static final Agent findAgentByLinkIndex(List<Agent> agents, int linkIndex) { for (Agent tmp : agents) { for (Site s : tmp.getSites()) { if (s.getLinkIndex() == linkIndex) { return tmp; } } } return null; } }