1 package example.symphony;
\r
3 import java.util.Collection;
\r
4 import java.util.Collections;
\r
5 import java.util.HashSet;
\r
6 import java.util.LinkedList;
\r
7 import java.util.logging.Level;
\r
8 import java.util.logging.Logger;
\r
10 import example.symphony.SymphonyProtocol.BootstrapStatus;
\r
11 import peersim.config.Configuration;
\r
12 import peersim.core.Control;
\r
13 import peersim.core.Network;
\r
14 import peersim.core.Node;
\r
18 * @author Andrea Esposito <and1989@gmail.com>
\r
20 public class RingRouteTest implements Control, Handler {
\r
22 private static final String PAR_SYMPHONY = "symphony";
\r
23 private static final String PAR_STARTNODE = "startnode";
\r
24 private final int symphonyID;
\r
25 private final int indexStartNode;
\r
27 private boolean finished;
\r
28 private boolean flagTimeout;
\r
29 private HashSet<Node> antiLoopSet;
\r
31 public RingRouteTest(String prefix) {
\r
32 symphonyID = Configuration.getPid(prefix + "." + PAR_SYMPHONY);
\r
33 indexStartNode = Configuration.getInt(prefix + "." + PAR_STARTNODE, 0);
\r
36 flagTimeout = false;
\r
37 antiLoopSet = new HashSet<Node>();
\r
40 public boolean execute() {
\r
42 if (!finished && flagTimeout) {
\r
44 Logger.getLogger(RingRouteTest.class.getName()).log(Level.WARNING, "Sent msg but no aswer. Timeout. Ring Route Test terminated for Timeout.");
\r
47 flagTimeout = false;
\r
53 antiLoopSet.clear();
\r
55 int indexRealStartNode = indexStartNode;
\r
56 Node realStartNode = Network.get(indexStartNode);
\r
57 SymphonyProtocol symphony = (SymphonyProtocol) realStartNode.getProtocol(symphonyID);
\r
59 while (!symphony.isBootstrapped() || !realStartNode.isUp()) {
\r
60 indexRealStartNode = (indexRealStartNode + 1) % Network.size();
\r
61 realStartNode = Network.get(indexRealStartNode);
\r
62 symphony = (SymphonyProtocol) realStartNode.getProtocol(symphonyID);
\r
64 if (indexRealStartNode == indexStartNode) {
\r
65 Logger.getLogger(RingRouteTest.class.getName()).log(Level.WARNING, "No ONLINE nodes. The ring is vanished. Ring Route Terminated.");
\r
67 flagTimeout = false;
\r
72 start = realStartNode;
\r
75 Logger.getLogger(RingRouteTest.class.getName()).log(Level.INFO, "RingRoute started.");
\r
77 doRoute(start, true);
\r
83 public void handle(SymphonyProtocol symphony, Tuple<Node, Double> tuple) {
\r
85 if (tuple == null) {
\r
86 Logger.getLogger(RingRouteTest.class.getName()).log(Level.SEVERE, "FAIL RING ROUTING");
\r
91 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
93 doRoute(tuple.x, false);
\r
96 private void doRoute(Node node, boolean firstTime) {
\r
98 SymphonyProtocol symphonyStartNode = (SymphonyProtocol) start.getProtocol(symphonyID);
\r
100 if (!symphonyStartNode.isBootstrapped()) {
\r
101 Logger.getLogger(RingRouteTest.class.getName()).log(Level.INFO, "The node i started from left. Ring Route Terminated.");
\r
106 if (!firstTime && node.equals(start)) {
\r
107 Logger.getLogger(RingRouteTest.class.getName()).log(Level.INFO, "RingRoute Terminated");
\r
112 if (antiLoopSet.contains(node)) {
\r
113 Logger.getLogger(RingRouteTest.class.getName()).log(Level.INFO, "Not able to reach the node that i started from. Ring Route Terminated.");
\r
117 antiLoopSet.add(node);
\r
120 SymphonyProtocol symphony = (SymphonyProtocol) node.getProtocol(symphonyID);
\r
121 AdapterSymphonyNodeComparator adapterSymphonyNodeComparator = new AdapterSymphonyNodeComparator(new SymphonyNodeComparator(symphonyID, node));
\r
123 Collection<Tuple<Node, BootstrapStatus>> collection = (Collection<Tuple<Node, BootstrapStatus>>) symphony.leftShortRangeLinks.clone();
\r
124 LinkedList<Tuple<Node, BootstrapStatus>> list = new LinkedList<Tuple<Node, BootstrapStatus>>(collection);
\r
125 Collections.sort(list, adapterSymphonyNodeComparator);
\r
127 Node targetNode = null;
\r
128 for (Tuple<Node, BootstrapStatus> tuple : list) {
\r
129 if (tuple.y == BootstrapStatus.ONLINE) {
\r
130 targetNode = tuple.x;
\r
135 if (targetNode == null || !targetNode.isUp()) {
\r
136 Logger.getLogger(RingRouteTest.class.getName()).log(Level.WARNING, "Terminated Ring Route but not done completely");
\r
141 SymphonyProtocol symphonyTarget = (SymphonyProtocol) targetNode.getProtocol(symphonyID);
\r
143 symphony.route(node, symphonyTarget.getIdentifier(), this);
\r
144 Logger.getLogger(RingRouteTest.class.getName()).log(Level.FINEST, "Ring from: " + symphony.getIdentifier() + " to " + symphonyTarget.getIdentifier());
\r
145 } catch (RoutingException ex) {
\r
146 Logger.getLogger(RingRouteTest.class.getName()).log(Level.WARNING, "Finito AnelloRoute MA NON FATTO TUTTO");
\r