package classes.holonControlUnit; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.UUID; import classes.AbstractCanvasObject; import classes.Edge; import classes.GroupNode; import classes.Holon; import classes.HolonObject; import classes.HolonSwitch; import classes.holonControlUnit.messages.NeighborhoodMsg; import classes.holonControlUnit.messages.Message; public class HierarchyControlUnit { private HolonControlUnit hcu; private String superHolon; private ArrayList subHolons; private ArrayList physicalNeighbors; private ArrayList virtualNeighbors; private Map switches; public HierarchyControlUnit(HolonControlUnit hcu) { this.hcu = hcu; this.subHolons = new ArrayList(); this.physicalNeighbors = new ArrayList(); this.virtualNeighbors = new ArrayList(); this.switches = new HashMap(); } public ArrayList getPhysicalNeighbors() { return physicalNeighbors; } public void setPhysicalNeighbors(ArrayList physicalNeighbors) { this.physicalNeighbors = physicalNeighbors; } public void addPhysicalNeighbor(String physicalNeighbor) { if(!this.physicalNeighbors.contains(physicalNeighbor)) { this.physicalNeighbors.add(physicalNeighbor); } } public ArrayList getVirtualNeighbors() { return virtualNeighbors; } public void setVirtualNeighbors(ArrayList virtualNeighbors) { this.virtualNeighbors = virtualNeighbors; } public void addSubHolon(String subHolon) { if(this.subHolons.contains(subHolon)) return; //propagate new virtual neighbor for all subholons ArrayList list = new ArrayList(); list.add(subHolon); String body = this.hcu.getCommunicator().getGson().toJson(new NeighborhoodMsg(NeighborhoodMsg.Type.NEW_VIRTUAL_NEIGHBOR, list)); for(String sub : this.subHolons) { this.hcu.getCommunicator().sendMsg(sub, Message.Type.NEIGHBORHOOD, body); } if(this.subHolons.size() > 0) { body = this.hcu.getCommunicator().getGson().toJson(new NeighborhoodMsg(NeighborhoodMsg.Type.NEW_VIRTUAL_NEIGHBOR, this.subHolons)); this.hcu.getCommunicator().sendMsg(subHolon, Message.Type.NEIGHBORHOOD, body); } this.subHolons.add(subHolon); } public void removeSubHolon(String subHolon) { if(!this.subHolons.remove(subHolon)) { System.err.println("Could not remove sub holon "+subHolon); return; } ArrayList list = new ArrayList(); list.add(subHolon); String body = this.hcu.getCommunicator().getGson().toJson(new NeighborhoodMsg(NeighborhoodMsg.Type.REMOVE_VIRTUAL_NEIGHBOR, list)); for(String sub : this.subHolons) { this.hcu.getCommunicator().sendMsg(sub, Message.Type.NEIGHBORHOOD, body); } } public String getSuperHolon() { return this.superHolon; } public void setSuperHolon(String parent) { this.superHolon = parent; } public ArrayList getSubHolons() { return this.subHolons; } public void addVirtualNeighbor(String virtualNeighbor) { if(!this.virtualNeighbors.contains(virtualNeighbor)) { this.virtualNeighbors.add(virtualNeighbor); } } public void addVirtualNeighbors(ArrayList virtualNeighbors) { for(int i=0; i virtualNeighbor) { this.virtualNeighbors.removeAll(virtualNeighbor); } public void addEdgeTo(AbstractCanvasObject b) { if(b instanceof HolonObject && ((HolonObject)b).holon != null) { //add holon of b as physical neighbor Holon ho = ((HolonObject) b).holon; if(!this.physicalNeighbors.contains(ho.getUniqueID())) { this.physicalNeighbors.add(ho.getUniqueID()); } } else if(b instanceof HolonSwitch) { //get edges of b and add them if switch is open HolonSwitch hs = (HolonSwitch) b; if(!this.physicalNeighbors.contains(hs.getUniqueID())) { this.physicalNeighbors.add(hs.getUniqueID()); this.switches.put(hs.getUniqueID(), hs); } } else if (b instanceof GroupNode) { //go inside groupnode and find the endpoint } } public void removeEdgeTo(AbstractCanvasObject b) { if(b instanceof HolonObject) { //add holon of b as physical neighbor Holon ho = ((HolonObject) b).holon; this.physicalNeighbors.remove(ho.getUniqueID()); } else if(b instanceof HolonSwitch) { //get edges of b and add them if switch is open HolonSwitch hs = (HolonSwitch) b; this.physicalNeighbors.remove(hs.getUniqueID()); this.switches.remove(hs.getUniqueID()); } else if (b instanceof GroupNode) { //go inside groupnode and find the endpoint } } }