package middleware.components.main.nodeview; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.net.UnknownHostException; import java.util.HashMap; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import middleware.agents.MetaAgent; import middleware.agents.Portal; import middleware.agents.Router; import middleware.agents.UserAgent; import middleware.components.main.nodelistener.NodeListener; import middleware.components.useragents.UserAgentUI; import middleware.nodemonitor.NodeMonitor; /** * GUI for NodeTrees * * @author Dan Lawrence */ public class NodeTree extends JTree implements MouseListener { DefaultTreeModel model; DefaultMutableTreeNode rootNode; NodeListener nodeListener; NodeMonitor nm; MetaAgent nmMetaAgent; HashMap MetaAgentMap = new HashMap(); HashMap UserAgentMap = new HashMap(); int id = 1; Router router = null; /** * Sets up a NodeTree GUI for given NodeListener * @param nodeListenerIn NodeListener */ public NodeTree(NodeListener nodeListenerIn) { nodeListener = nodeListenerIn; setUpComponent(); } private void setUpComponent() { rootNode = new DefaultMutableTreeNode("Agents"); model = new DefaultTreeModel(rootNode); addPortal(); setModel(model); setVisible(true); this.addMouseListener(this); } /** * Adds a Router to the nodetree * @param ipAddress ip address of router * @param port router port * @return index of new router * @throws UnknownHostException */ public int addRouter(int id, String ipAddress, int port) throws UnknownHostException { DefaultMutableTreeNode routerNode = new DefaultMutableTreeNode(); rootNode.add(routerNode); if (router == null) { router = new Router(10, (rootNode.getIndex(routerNode) + id) + ".0.0", port); router.start(); MetaAgentMap.put(router.getAddress().getAddress(), router); } else { router.connect(id + ".0.0", ipAddress, port); } this.id = id; routerNode.setUserObject("Router (" + id + ".0.0)"); updateUI(); return rootNode.getIndex(routerNode) + 1; } /** * Adds a new portal to the NodeTree * @return index of the new portal */ public int addPortal() { if (getSelectionPath() == null) return 0; DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) getSelectionPath().getLastPathComponent(); String nodeName = (String) selectedNode.getUserObject(); if (selectedNode.isRoot() || !nodeName.contains("Router")) return 0; DefaultMutableTreeNode portalNode = new DefaultMutableTreeNode(); selectedNode.add(portalNode); // Add Portals Here Portal p = new Portal(10, id + "." + (selectedNode.getIndex(portalNode) + 1) + ".0"); p.start(); MetaAgentMap.get(String.valueOf(id + ".0.0")).addAgent(p); MetaAgentMap.values().forEach((metaAgent) -> { if (metaAgent instanceof Portal) { metaAgent.addAgent(p); } }); MetaAgentMap.put(p.getAddress().getAddress(), p); portalNode.setUserObject("Portal (" + p.getAddress() + ")"); updateUI(); return rootNode.getIndex(portalNode) + 1; } /** * Adds a new user agent to the NodeTree * @return index of new UserAgent */ public int addUserAgent() { if (getSelectionPath() == null) return 0; DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) getSelectionPath().getLastPathComponent(); String nodeName = (String) selectedNode.getUserObject(); if (selectedNode.isRoot() || !nodeName.contains("Portal")) return 0; DefaultMutableTreeNode userAgentNode = new DefaultMutableTreeNode(); selectedNode.add(userAgentNode); UserAgent userAgent = new UserAgent((id) + "." + (selectedNode.getParent().getIndex(selectedNode) + 1) + "." + (selectedNode.getIndex(userAgentNode) + 1)); ((Portal) MetaAgentMap.get(id + "." + (selectedNode.getParent().getIndex(selectedNode)+ 1) + ".0")).addAgent(userAgent); UserAgentMap.put(userAgent.getAddress(), userAgent); userAgentNode.setUserObject("User Agent (" + userAgent.getAddress() + ")" ); updateUI(); return rootNode.getIndex(userAgentNode) + 1; } @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount()==2 && getSelectionPath() != null) { DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) getSelectionPath().getLastPathComponent(); String nodeName = (String) selectedNode.getUserObject(); if (nodeName.contains("Router") || nodeName.contains("Portal")) { if (nm != null && nmMetaAgent != null) { nmMetaAgent.detach(nm); } nodeListener.clear(); //Get Portal MetaAgent metaAgent = MetaAgentMap.get(nodeName.substring(nodeName.indexOf("(") + 1, nodeName.length() - 1)); //Attach NodeMonitor nm = new NodeMonitor(nodeListener); metaAgent.attach(nm); nmMetaAgent = metaAgent; } else if (nodeName.contains("User Agent")) { new UserAgentUI(UserAgentMap.get(nodeName.substring(nodeName.indexOf("(") + 1, nodeName.length()-1))); } } } @Override public void mousePressed(MouseEvent e) { //Useless. } @Override public void mouseReleased(MouseEvent e) { //Useless. } @Override public void mouseEntered(MouseEvent e) { //Useless. } @Override public void mouseExited(MouseEvent e) { //Useless. } }