package com.robonobo.console.cmds; import static com.robonobo.common.util.FileUtil.*; import static com.robonobo.common.util.TextUtil.*; import static com.robonobo.common.util.TimeUtil.*; import java.io.PrintWriter; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.List; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import com.robonobo.common.concurrent.CatchingRunnable; import com.robonobo.common.util.TextUtil; import com.robonobo.common.util.TimeUtil; import com.robonobo.console.RobonoboConsole; import com.robonobo.core.RobonoboController; import com.robonobo.mina.external.ConnectedNode; public class network implements ConsoleCommand { static final char GAMMA = 0x03b3; public void printHelp(PrintWriter out) { out.println("'network' gives current network status\n" + "'network watch' outputs status every second"); } public void run(RobonoboConsole console, String[] args, final PrintWriter out) throws Exception { final RobonoboController controller = console.getController(); if (controller.isNetworkRunning()) { out.println("I am " + controller.getMyNodeId()); List<String> urls = controller.getMyEndPointUrls(); out.println("My listening endpoints:"); for (String url : urls) { out.println(url); } List<ConnectedNode> nodes = controller.getConnectedNodes(); out.println("\n"+numItems(nodes, "connection")+":"); if (nodes.size() > 0) out.println(rightPad("Id", 36) + rightPad(" Url", 37) + rightPad(" Super", 6) + rightPad(" Their Bid", 10) + rightPad(" Their " + GAMMA, 8) + rightPad(" Up", 12) + rightPad(" My Bid", 7) + rightPad(" My " + GAMMA, 6) + rightPad(" Down", 12) ); out.flush(); if (args.length == 0) { for (ConnectedNode node : nodes) { printNodeDetails(out, node); } } else if (args.length == 1 && args[0].equalsIgnoreCase("watch")) { final DateFormat df = new SimpleDateFormat("HH:mm:ss"); ScheduledFuture<?> task = controller.getExecutor().scheduleAtFixedRate(new CatchingRunnable() { public void doRun() throws Exception { out.println("["+df.format(now())+"]"); List<ConnectedNode> nodes = controller.getConnectedNodes(); for (ConnectedNode node : nodes) { printNodeDetails(out, node); } out.flush(); } }, 0, 1, TimeUnit.SECONDS); console.readLine(); task.cancel(false); } } else out.println("[Network stopped]"); } private void printNodeDetails(PrintWriter out, ConnectedNode node) { out.println(rightPadOrTruncate(node.getNodeId(), 36) + " " + rightPadOrTruncate(node.getEndPointUrl(), 36) + " " + rightPadOrTruncate((node.isSupernode()) ? "Yes" : "No", 5) + " " + rightPad(padToMinWidth(node.getTheirBid(), 4), 9) + " " + rightPad(padToMinWidth(node.getTheirGamma(), 4), 8) + rightPadOrTruncate(humanReadableSize(node.getUploadRate()) + "/s", 11) + " " + rightPad(padToMinWidth(node.getMyBid(), 4), 6) + " " + rightPad(padToMinWidth(node.getMyGamma(), 4), 5) + " " + rightPadOrTruncate(humanReadableSize(node.getDownloadRate()) + "/s", 11) + " " ); } }