--- /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