/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package org.redPandaLib.test; import java.awt.Font; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextArea; import javax.swing.UIManager; import javax.swing.text.StyleConstants; import javax.swing.text.StyleContext; import org.redPandaLib.NewMessageListener; import org.redPandaLib.core.ConnectionHandler; import org.redPandaLib.core.Log; import org.redPandaLib.core.MessageHolder; import org.redPandaLib.core.Peer; import org.redPandaLib.core.PeerTrustData; import org.redPandaLib.core.Saver; import org.redPandaLib.core.Settings; import org.redPandaLib.core.Test; import static org.redPandaLib.core.Test.NAT_OPEN; import static org.redPandaLib.core.Test.getClonedPeerList; import static org.redPandaLib.core.Test.inBytes; import static org.redPandaLib.core.Test.messagesToSync; import static org.redPandaLib.core.Test.outBytes; import static org.redPandaLib.core.Test.peerList; import static org.redPandaLib.core.Test.peerTrusts; import org.redPandaLib.core.messages.TextMessageContent; import org.redPandaLib.services.MessageDownloader; import org.redPandaLib.services.MessageVerifierHsqlDb; /** * * @author rflohr */ public class StatsGUI { public static void main(String[] args) { // StyleContext sc = new StyleContext(); //StyleConstants.setFontFamily(sc.getStyle(StyleContext.DEFAULT_STYLE), "Monospaced"); // StyleConstants.setFontFamily(sc.getStyle(StyleContext.DEFAULT_STYLE), "Lucida Console"); JFrame meinFrame = new JFrame("redPanda"); meinFrame.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); meinFrame.setSize(1600, 800); final JMultilineLabel jLabel = new JMultilineLabel("loading..."); meinFrame.add(jLabel); meinFrame.setVisible(true); new Thread() { @Override public void run() { while (true) { try { sleep(500); } catch (InterruptedException ex) { Logger.getLogger(StatsGUI.class.getName()).log(Level.SEVERE, null, ex); } if (peerList == null) { continue; } String format = String.format("Status listenPort: " + Test.MY_PORT + " NONCE: " + Test.NONCE + "\n"); int actCons = 0; ArrayList<Peer> list = getClonedPeerList(); try { Collections.sort(list, new Comparator<Peer>() { @Override public int compare(Peer t, Peer t1) { if (t.peerTrustData == null) { return 1000; } if (t1.peerTrustData == null) { return -1000; } return (int) (t1.peerTrustData.rating - t.peerTrustData.rating); } }); } catch (IllegalArgumentException e) { //System.out.println("konnte nicht sortieren!!"); } // System.out.println("IP:PORT \t\t\t\t\t\t Nonce \t\t\t Last Answer \t Alive \t retries \t LoadedMsgs \t Ping \t Authed \t PMSG\n"); format += String.format("%50s %22s %12s %12s %7s %8s %10s %10s %10s %10s %8s %10s %10s %10s %10s\n", "[IP]:PORT", "nonce", "last answer", "conntected", "retries", "ping", "loaded Msg", "pendingMsg", "bytes out", "bytes in", "bad Msg", "ToSyncM", "intrMsgs", "RSM", "BackSyncdT"); for (Peer peer : list) { if (peer.isConnected() && peer.authed && peer.writeBufferCrypted != null) { actCons++; } //System.out.println("Peer: " + InetAddress.getByName(peer.ip) + ":" + peer.port + " Nonce: " + peer.nonce + " Last Answer: " + (System.currentTimeMillis() - peer.lastActionOnConnection) + " Alive: " + peer.isConnected() + " LastGetAllMsgs: " + peer.lastAllMsgsQuerried + " retries: " + peer.retries + " LoadedMsgs: " + peer.loadedMsgs + " ping: " + (Math.round(peer.ping * 100) / 100.)); String c; if (peer.lastActionOnConnection != 0) { c = "" + (System.currentTimeMillis() - peer.lastActionOnConnection); } else { c = "-"; } if (peer.getPeerTrustData() == null) { format += String.format("%50s %22d %12s %12s %7d %8s %10s %10s %10d %10d %10d\n", "[" + peer.ip + "]:" + peer.port, peer.nonce, c, "" + peer.isConnected() + "/" + (peer.authed && peer.writeBufferCrypted != null), peer.retries, (Math.round(peer.ping * 100) / 100.), "-", "-", peer.sendBytes, peer.receivedBytes, peer.removedSendMessages.size()); } else { //format += String.format("%50s %22d %12s %12s %7d %8s %10d %10d %10d %8s %10d %10d %10s\n", "[" + peer.ip + "]:" + peer.port, peer.nonce, c, "" + peer.isConnected() + "/" + (peer.authed && peer.writeBufferCrypted != null), peer.retries, (Math.round(peer.ping * 100) / 100.), peer.getPeerTrustData().loadedMsgs.size(), peer.sendBytes, peer.receivedBytes, peer.getPeerTrustData().badMessages, messagesToSync(peer.peerTrustData.internalId), peer.removedSendMessages.size(), formatInterval(System.currentTimeMillis() - peer.peerTrustData.backSyncedTill)); format += String.format("%50s %22d %12s %12s %7d %8s %10d %10s %10d %10d %8s %10d %10d %10s %10s %10s %10s\n", "[" + peer.ip + "]:" + peer.port, peer.nonce, c, "" + peer.isConnected() + "/" + (peer.authed && peer.writeBufferCrypted != null), peer.retries, (Math.round(peer.ping * 100) / 100.), peer.getPeerTrustData().getMessageLoadedCount(), peer.getPeerTrustData().pendingMessages.size() + " " + peer.getPeerTrustData().pendingMessagesPublic.size() + " " + peer.getPeerTrustData().pendingMessagesTimedOut.size(), peer.sendBytes, peer.receivedBytes, peer.getPeerTrustData().badMessages, messagesToSync(peer.peerTrustData.internalId), peer.peerTrustData.rating, peer.removedSendMessages.size(), peer.peerTrustData.backSyncedTill == Long.MAX_VALUE ? "-" : formatInterval(System.currentTimeMillis() - peer.peerTrustData.backSyncedTill), peer.peerTrustData.pendingMessagesTimedOut.size(), peer.peerTrustData.pendingMessagesTimedOut.size()); } // while (c.length() < 15) { // c += " \t"; // } // if (peer.getPeerTrustData() == null) { // output += "" + a + " \t " + b + "\t " + c + "\t " + + "\t " + peer.retries + "\t " + "--" + " \t " + (Math.round(peer.ping * 100) / 100.) + "\t " + peer.authed + "\t " + "--" + " \t" + peer.requestedMsgs + " \t" + "--" + "\n"; // } else { // output += "" + a + " \t " + b + "\t " + c + "\t " + peer.isConnected() + "\t " + peer.retries + "\t " + peer.getLoadedMsgs().size() + " \t " + (Math.round(peer.ping * 100) / 100.) + "\t " + peer.authed + "\t " + peer.getPendingMessages().size() + " \t" + peer.requestedMsgs + " \t" + peer.getPeerTrustData().synchronizedMessages + "\n"; // } } format += String.format("\nNot connected trust data:\n"); ArrayList<Peer> clonedPeerList = getClonedPeerList(); format += String.format("%12s %25s %12s %12s\n", "ID", "Last Seen", "SyncedMsgs", "ToSync"); ArrayList<PeerTrustData> peerTrustsCloned = (ArrayList<PeerTrustData>) peerTrusts.clone(); Collections.sort(peerTrustsCloned, new Comparator<PeerTrustData>() { @Override public int compare(PeerTrustData o1, PeerTrustData o2) { return (int) (o2.lastSeen - o1.lastSeen); } }); for (PeerTrustData ptd : peerTrustsCloned) { boolean found = false; for (Peer p : clonedPeerList) { if (p.isFullConnected() && p.peerTrustData == ptd) { found = true; break; } } if (found) { continue; } int messagesToSync = messagesToSync(ptd.internalId); format += String.format("%12d %25s %12d %12d\n", ptd.internalId, formatInterval(System.currentTimeMillis() - ptd.lastSeen), ptd.synchronizedMessages, messagesToSync); } format += String.format("\n\nConnected to " + actCons + " peers. (NAT type: " + (NAT_OPEN ? "open" : "closed") + ")\n"); format += String.format("Traffic: " + inBytes / 1024. + " kb / " + outBytes / 1024. + " kb.\n"); format += String.format("\nServices last run: ConnectionHandler: " + Math.round((System.currentTimeMillis() - ConnectionHandler.lastRun) / 1000.) + " MessageDownloader: " + Math.round((System.currentTimeMillis() - MessageDownloader.lastRun) / 1000.) + " MessageVerifierHsqlDb: " + Math.round((System.currentTimeMillis() - MessageVerifierHsqlDb.lastRun) / 1000.) + "\n"); //System.out.println("Processed messages: " + msgs.size()); // int unverifiedMsgs = 0; // // for (RawMsg m : MessageHolder.getAllNotVerifiedMessages()) { // if (m.verified) { // continue; // } // unverifiedMsgs++; // } // //System.out.println("Saved Sockets: " + ConnectionHandler.allSockets.size()); // try { // Test.messageStore.getConnection().close(); // } catch (SQLException ex) { // Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); // } // Main.useHsqlDatabase(); format += String.format("Processed messages: " + MessageHolder.getMessageCount() + " - Queue to verify: " + MessageHolder.getMessageCountToVerify()); format += String.format("\nLRU Cache size: " + MessageDownloader.channelIdToLatestBlockTime.size()); //MessageVerifierHsqlDb.sem.release(); //String replaceAll = format.replaceAll("\n", "<br/>"); // jLabel.setText("<html>" + replaceAll + "</html>"); jLabel.setText(format); } } }.start(); System.out.println( "delay: " + Settings.pingDelay + " timeout: " + Settings.pingTimeout); Saver saver = new Saver(); org.redPandaLib.Main.addListener( new NewMessageListener() { @Override public void newMessage(TextMessageContent msg) { System.out.println("###################\n# Neue Nachricht [" + msg.channel.getName() + " -- " + msg.identity + "]\n# " + msg.text + "\n###################"); } }); Settings.readGeneralDotDat(); //org.redPandaLib.Main.useMysqlDatabase(); org.redPandaLib.Main.useHsqlDatabase(); Log.LEVEL = 0000; Settings.lightClient = false; Settings.SUPERNODE = true; Settings.REDUCE_TRAFFIC = false; Settings.MIN_CONNECTIONS = 10; Settings.MAX_CONNECTIONS = 12; Settings.pingDelay = 10; try { org.redPandaLib.Main.startUp( true, saver); } catch (IOException ex) { Logger.getLogger(StatsGUI.class.getName()).log(Level.SEVERE, null, ex); } } private static String formatInterval(final long l) { final long hr = TimeUnit.MILLISECONDS.toHours(l); final long min = TimeUnit.MILLISECONDS.toMinutes(l - TimeUnit.HOURS.toMillis(hr)); final long sec = TimeUnit.MILLISECONDS.toSeconds(l - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min)); final long ms = TimeUnit.MILLISECONDS.toMillis(l - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min) - TimeUnit.SECONDS.toMillis(sec)); return String.format("%02d:%02d:%02d.%03d", hr, min, sec, ms); } public static class JMultilineLabel extends JTextArea { private static final long serialVersionUID = 1L; public JMultilineLabel(String text) { super(text); setEditable(false); setCursor(null); setOpaque(false); setFocusable(false); //setFont("Monospaced"); setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12)); setWrapStyleWord(true); setLineWrap(true); } } }