+++ /dev/null
-package example.symphony;\r
-\r
-import java.util.Collection;\r
-import java.util.Collections;\r
-import java.util.HashSet;\r
-import java.util.LinkedList;\r
-import java.util.logging.Level;\r
-import java.util.logging.Logger;\r
-\r
-import example.symphony.SymphonyProtocol.BootstrapStatus;\r
-import peersim.config.Configuration;\r
-import peersim.core.Control;\r
-import peersim.core.Network;\r
-import peersim.core.Node;\r
-\r
-/**\r
- *\r
- * @author Andrea Esposito <and1989@gmail.com>\r
- */\r
-public class RingRouteTest implements Control, Handler {\r
-\r
- private static final String PAR_SYMPHONY = "symphony";\r
- private static final String PAR_STARTNODE = "startnode";\r
- private final int symphonyID;\r
- private final int indexStartNode;\r
- private Node start;\r
- private boolean finished;\r
- private boolean flagTimeout;\r
- private HashSet<Node> antiLoopSet;\r
-\r
- public RingRouteTest(String prefix) {\r
- symphonyID = Configuration.getPid(prefix + "." + PAR_SYMPHONY);\r
- indexStartNode = Configuration.getInt(prefix + "." + PAR_STARTNODE, 0);\r
-\r
- finished = true;\r
- flagTimeout = false;\r
- antiLoopSet = new HashSet<Node>();\r
- }\r
-\r
- public boolean execute() {\r
-\r
- if (!finished && flagTimeout) {\r
-\r
- Logger.getLogger(RingRouteTest.class.getName()).log(Level.WARNING, "Sent msg but no aswer. Timeout. Ring Route Test terminated for Timeout.");\r
-\r
- finished = true;\r
- flagTimeout = false;\r
- }\r
-\r
- if (finished) {\r
-\r
- flagTimeout = true;\r
- antiLoopSet.clear();\r
-\r
- int indexRealStartNode = indexStartNode;\r
- Node realStartNode = Network.get(indexStartNode);\r
- SymphonyProtocol symphony = (SymphonyProtocol) realStartNode.getProtocol(symphonyID);\r
-\r
- while (!symphony.isBootstrapped() || !realStartNode.isUp()) {\r
- indexRealStartNode = (indexRealStartNode + 1) % Network.size();\r
- realStartNode = Network.get(indexRealStartNode);\r
- symphony = (SymphonyProtocol) realStartNode.getProtocol(symphonyID);\r
-\r
- if (indexRealStartNode == indexStartNode) {\r
- Logger.getLogger(RingRouteTest.class.getName()).log(Level.WARNING, "No ONLINE nodes. The ring is vanished. Ring Route Terminated.");\r
- finished = true;\r
- flagTimeout = false;\r
- return false;\r
- }\r
- }\r
-\r
- start = realStartNode;\r
- finished = false;\r
-\r
- Logger.getLogger(RingRouteTest.class.getName()).log(Level.INFO, "RingRoute started.");\r
-\r
- doRoute(start, true);\r
- }\r
-\r
- return false;\r
- }\r
-\r
- public void handle(SymphonyProtocol symphony, Tuple<Node, Double> tuple) {\r
-\r
- if (tuple == null) {\r
- Logger.getLogger(RingRouteTest.class.getName()).log(Level.SEVERE, "FAIL RING ROUTING");\r
- finished = true;\r
- return;\r
- }\r
-\r
- Logger.getLogger(RingRouteTest.class.getName()).log(Level.FINER, symphony.getIdentifier() + " source find the manager of " + tuple.y + " and it is " + ((SymphonyProtocol) tuple.x.getProtocol(symphonyID)).getIdentifier());\r
-\r
- doRoute(tuple.x, false);\r
- }\r
-\r
- private void doRoute(Node node, boolean firstTime) {\r
-\r
- SymphonyProtocol symphonyStartNode = (SymphonyProtocol) start.getProtocol(symphonyID);\r
-\r
- if (!symphonyStartNode.isBootstrapped()) {\r
- Logger.getLogger(RingRouteTest.class.getName()).log(Level.INFO, "The node i started from left. Ring Route Terminated.");\r
- finished = true;\r
- return;\r
- }\r
-\r
- if (!firstTime && node.equals(start)) {\r
- Logger.getLogger(RingRouteTest.class.getName()).log(Level.INFO, "RingRoute Terminated");\r
- finished = true;\r
- return;\r
- }\r
-\r
- if (antiLoopSet.contains(node)) {\r
- Logger.getLogger(RingRouteTest.class.getName()).log(Level.INFO, "Not able to reach the node that i started from. Ring Route Terminated.");\r
- finished = true;\r
- return;\r
- } else {\r
- antiLoopSet.add(node);\r
- }\r
-\r
- SymphonyProtocol symphony = (SymphonyProtocol) node.getProtocol(symphonyID);\r
- AdapterSymphonyNodeComparator adapterSymphonyNodeComparator = new AdapterSymphonyNodeComparator(new SymphonyNodeComparator(symphonyID, node));\r
-\r
- Collection<Tuple<Node, BootstrapStatus>> collection = (Collection<Tuple<Node, BootstrapStatus>>) symphony.leftShortRangeLinks.clone();\r
- LinkedList<Tuple<Node, BootstrapStatus>> list = new LinkedList<Tuple<Node, BootstrapStatus>>(collection);\r
- Collections.sort(list, adapterSymphonyNodeComparator);\r
-\r
- Node targetNode = null;\r
- for (Tuple<Node, BootstrapStatus> tuple : list) {\r
- if (tuple.y == BootstrapStatus.ONLINE) {\r
- targetNode = tuple.x;\r
- break;\r
- }\r
- }\r
-\r
- if (targetNode == null || !targetNode.isUp()) {\r
- Logger.getLogger(RingRouteTest.class.getName()).log(Level.WARNING, "Terminated Ring Route but not done completely");\r
- finished = true;\r
- return;\r
- }\r
-\r
- SymphonyProtocol symphonyTarget = (SymphonyProtocol) targetNode.getProtocol(symphonyID);\r
- try {\r
- symphony.route(node, symphonyTarget.getIdentifier(), this);\r
- Logger.getLogger(RingRouteTest.class.getName()).log(Level.FINEST, "Ring from: " + symphony.getIdentifier() + " to " + symphonyTarget.getIdentifier());\r
- } catch (RoutingException ex) {\r
- Logger.getLogger(RingRouteTest.class.getName()).log(Level.WARNING, "Finito AnelloRoute MA NON FATTO TUTTO");\r
- finished = true;\r
- }\r
- }\r
-}\r