distributedtreedemo.java

来自「JGRoups源码」· Java 代码 · 共 500 行

JAVA
500
字号
// $Id: DistributedTreeDemo.java,v 1.8 2005/05/30 16:14:40 belaban Exp $package org.jgroups.demos;import org.jgroups.blocks.DistributedTree;import javax.swing.*;import javax.swing.event.TableModelEvent;import javax.swing.event.TableModelListener;import javax.swing.event.TreeSelectionEvent;import javax.swing.event.TreeSelectionListener;import javax.swing.table.DefaultTableModel;import javax.swing.tree.DefaultMutableTreeNode;import javax.swing.tree.DefaultTreeModel;import javax.swing.tree.TreeNode;import javax.swing.tree.TreePath;import java.awt.*;import java.awt.event.*;import java.io.Serializable;import java.util.Enumeration;import java.util.Properties;import java.util.StringTokenizer;import java.util.Vector;class MyNode extends DefaultMutableTreeNode {    String name="<unnamed>";    MyNode(String name) {	this.name=name;    }        MyNode(String name, Serializable user_obj) {	super(user_obj);	this.name=name;    }    void add(String fqn) {	add(fqn, null);    }    public void add(String fqn, Serializable user_obj) {	MyNode            curr, n;	StringTokenizer   tok;	String            child_name;	if(fqn == null) return;	curr=this;	tok=new StringTokenizer(fqn, "/");	while(tok.hasMoreTokens()) {	    child_name=tok.nextToken();	    n=curr.findChild(child_name);	    if(n == null) {		n=new MyNode(child_name, user_obj);		curr.add(n);	    }	    curr=n;	}	curr.userObject=user_obj;    }    void modify(String fqn, Serializable new_element) {	if(fqn == null || new_element == null) return;	MyNode n=findNode(fqn);	if(n != null)	    n.userObject=new_element;    }    void remove(String fqn) {	System.out.println("MyNode.remove(" + fqn + ')');	removeFromParent();    }            public MyNode findNode(String fqn) {	MyNode            curr, n;	StringTokenizer   tok;	String            child_name;	if(fqn == null) return null;	curr=this;	tok=new StringTokenizer(fqn, "/");	while(tok.hasMoreTokens()) {	    child_name=tok.nextToken();	    n=curr.findChild(child_name);	    if(n == null)		return null;	    curr=n;	}	return curr;    }    MyNode findChild(String relative_name) {	MyNode  child;	if(relative_name == null || getChildCount() == 0)	    return null;	for(int i=0; i < getChildCount(); i++) {	    child=(MyNode)getChildAt(i);	    if(child.name == null) {		System.err.println("MyNode.findChild(" + relative_name + "): child.name is null");		continue;	    }			    if(child.name.equals(relative_name))		return child;	}	return null;    }        String print(int indent) {	StringBuffer sb=new StringBuffer();	for(int i=0; i < indent; i++)	    sb.append(' ');	if(!isRoot()) {	    if(name == null) 		sb.append("/<unnamed>");	    else {		sb.append('/' + name);		if(userObject != null)		    sb.append(" --> " + userObject);	    }	}	sb.append('\n');	if(getChildCount() > 0) {	    if(isRoot()) indent=0;	    else indent+=4;	    for(int i=0; i < getChildCount(); i++)		sb.append(((MyNode)getChildAt(i)).print(indent));	}	return sb.toString();    }    public String toString() {	return name;    }}/** * Demo showing the DistributedTree class. It displays a panel with the tree structure in the upper half, * and the properties of a chosen node on the bottom half. All updates are broadcast to all members. */public class DistributedTreeDemo extends Frame implements WindowListener, 							  DistributedTree.DistributedTreeListener,							  TreeSelectionListener, TableModelListener {    DefaultTreeModel         tree_model=null;    JTree                    jtree=null;    final DefaultTableModel        table_model=new DefaultTableModel();    final JTable                   table=new JTable(table_model);    JScrollPane              scroll_pane=null;    final MyNode                   root=new MyNode("/");    DistributedTree          dt=null;    String                   props=null;    String                   selected_node=null;    boolean                  create=false;      public DistributedTreeDemo(boolean create) throws Exception {		// we need state transfer here	// props="UDP:PING:FD:STABLE:NAKACK:UNICAST:FRAG:FLUSH:GMS:VIEW_ENFORCER:STATE_TRANSFER:QUEUE";	// test for pbcast        props="UDP(mcast_addr=228.1.2.3;mcast_port=45566;ip_ttl=0):" +                "PING(timeout=5000;num_initial_members=6):" +                "FD_SOCK:" +                "VERIFY_SUSPECT(timeout=1500):" +                "pbcast.NAKACK(gc_lag=5;retransmit_timeout=3000):" +                "UNICAST(timeout=5000):" +                "pbcast.STABLE(desired_avg_gossip=10000):" +                "FRAG(down_thread=false;up_thread=false):" +                "pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;" +                "shun=false;print_local_addr=true):" +                "pbcast.STATE_TRANSFER";	this.create=create;	dt=new DistributedTree("DistributedTreeDemo", props);	dt.addDistributedTreeListener(this);	setLayout(new BorderLayout());        addNotify();	setSize(getInsets().left + getInsets().right + 485, 		getInsets().top + getInsets().bottom + 367);        setTitle("DistributedTree");                tree_model=new DefaultTreeModel(root);        jtree=new JTree(tree_model);        jtree.setDoubleBuffered(true);	        scroll_pane=new JScrollPane();        scroll_pane.getViewport().add(jtree);        scroll_pane.setDoubleBuffered(true);                add(scroll_pane, BorderLayout.CENTER);        addWindowListener(this);		table_model.setColumnIdentifiers(new String[]{"Name", "Value"});	table_model.addTableModelListener(this);	add(table, BorderLayout.SOUTH);			dt.start();	System.out.println("Constructing initial GUI tree");	populateTree(dt, ""); // creates initial GUI from model	System.out.println("Constructing initial GUI tree -- done");	Properties props1=new Properties();	props1.setProperty("name",   "EventService");	props1.setProperty("path",   "/usr/local/Orbix2000/bin/es");	props1.setProperty("up",     "true");	props1.setProperty("active", "false");	Properties props2=new Properties();	props2.setProperty("name", "NamingService");	props2.setProperty("path", "/usr/local/Orbix2000/bin/ns");	props2.setProperty("up",   "true");	props2.setProperty("active", "true");	Properties props3=new Properties();	props3.setProperty("name", "ORBIX daemon");	props3.setProperty("path", "/usr/local/Orbix2000/bin/orbixd");	props3.setProperty("up",   "true");	props3.setProperty("active", "true");	props3.setProperty("restart", "true");	props3.setProperty("restart_time", "3000");	props3.setProperty("restart_max", "10");	Properties props4=new Properties();	props4.setProperty("name", "Orbix2000 Version 1.1");	props4.setProperty("valid until", "11/12/2001");	props4.setProperty("up", "false");	props4.setProperty("active", "false");	Properties props5=new Properties();	props5.setProperty("name", "Orbix2000 Version 1.3b");	props5.setProperty("valid until", "12/31/2000");	props5.setProperty("up", "true");	props5.setProperty("active", "false");	if(create) {	    dt.add("/procs/NETSMART/es",                    props1);	    dt.add("/procs/NETSMART/ns",                    props2);	    dt.add("/procs/NETSMART/orbixd",                props3);	    dt.add("/procs/NETSMART/orbixd/Version_1.1",    props4);	    dt.add("/procs/NETSMART/orbixd/Version_1.2",    props5);	    Properties props6=(Properties)props5.clone();	    props6.setProperty("name", "osagent daemon");	    props6.setProperty("path", "/usr/local/Visigenics/bin/osagent");	    	    Properties props7=new Properties();	    props7.setProperty("name", "Visigenics latest product");	    props7.setProperty("license", "/vob/iem/Devp/etc/license.txt");	    	    dt.set("/procs/NETSMART/orbixd/Version_1.2",    props6);	    dt.add("/procs/NETSMART/orbixd/Version_2.0",    props7);	}	jtree.addTreeSelectionListener(this);			MouseListener ml = new MouseAdapter() {	    public void mouseClicked(MouseEvent e) {		int selRow = jtree.getRowForLocation(e.getX(), e.getY());		TreePath selPath = jtree.getPathForLocation(e.getX(), e.getY());		if(selRow != -1)		    selected_node=makeFQN(selPath.getPath());	    }	};	jtree.addMouseListener(ml);	    }    String makeFQN(Object[] path) {	StringBuffer sb=new StringBuffer("");	String       tmp_name;	if(path == null) return null;	for(int i=0; i < path.length; i++) {	    tmp_name=((MyNode)path[i]).name;	    if("/".equals(tmp_name))		continue;	    else		sb.append('/' + tmp_name);	}	tmp_name=sb.toString();	if(tmp_name.length() == 0)	    return "/";	else	    return tmp_name;    }    void clearTable() {	int num_rows=table.getRowCount();	if(num_rows > 0) {	    for(int i=0; i < num_rows; i++)		table_model.removeRow(0);	    table_model.fireTableRowsDeleted(0, num_rows-1);	    repaint();	}    }    void populateTable(Properties props) {	String key, val;	int    num_rows=0;	if(props == null) return;	num_rows=props.size();	clearTable();	if(num_rows > 0) {	    for(Enumeration e=props.keys(); e.hasMoreElements();) {		key=(String)e.nextElement();		val=(String)props.get(key);		if(val == null) val="<n/a>";		table_model.addRow(new Object[]{key, val});	    }	    	    table_model.fireTableRowsInserted(0, num_rows-1);	    validate();	}	    }    void populateTree(DistributedTree tree, String tmp_fqn) {	if(tree == null) return;	Vector        children=tree.getChildrenNames(tmp_fqn);	String        child_name, tmp_name;	Serializable  element;		for(int i=0; i < children.size(); i++) {	    child_name=(String)children.elementAt(i);	    tmp_name=tmp_fqn + '/' + child_name;	    root.add(tmp_name, tree.get(tmp_name));	    populateTree(tree, tmp_name);	}    }    public synchronized void setVisible(boolean show) {        setLocation(50, 50);        super.setVisible(show);    }       public void windowClosed(WindowEvent event) {}    public void windowDeiconified(WindowEvent event) {}    public void windowIconified(WindowEvent event) {}    public void windowActivated(WindowEvent event) {}    public void windowDeactivated(WindowEvent event) {}    public void windowOpened(WindowEvent event) {}      public void windowClosing(WindowEvent event) {	dt.stop();        System.exit(0);    }        public void tableChanged(TableModelEvent evt) {	int         row, col;	String      key, val;	if(evt.getType() == TableModelEvent.UPDATE) {	    row=evt.getFirstRow();	    col=evt.getColumn();	    Properties props=(Properties)dt.get(selected_node);	    	    if(col == 0) {  // set()		key=(String)table_model.getValueAt(row, col);		val=(String)table_model.getValueAt(row, col+1);		if(props != null && key != null && val != null) {		    props.setProperty(key, val);		    dt.set(selected_node, props);		}	    }	    else {          // add()		key=(String)table_model.getValueAt(row, col-1);		val=(String)table.getValueAt(row, col);		if(props != null && key != null && val != null) {		    props.setProperty(key, val);		    dt.add(selected_node, props);		}	    }	    System.out.println("key=" + key + ", val=" + val);	}    }        public void valueChanged(TreeSelectionEvent evt) {	TreePath    path=evt.getPath();	String      fqn="/";	String      component_name;	Properties  props=null;		for(int i=0; i < path.getPathCount(); i++) {	    component_name=((MyNode)path.getPathComponent(i)).name;	    if("/".equals(component_name))		continue;	    if("/".equals(fqn))		fqn+=component_name;	    else		fqn=fqn + '/' + component_name;	}	props=(Properties)dt.get(fqn);	if(props != null)	    populateTable(props);	else	    clearTable();    }    /* ------------------ DistributedTree.DistributedTreeListener interface ------------ */    public void nodeAdded(String fqn, Serializable element) {	MyNode n;	System.out.println("** nodeCreated(" + fqn + ')');	root.add(fqn, element);	n=root.findNode(fqn);	if(n != null)	    tree_model.reload(n.getParent());    }    public void nodeRemoved(String fqn) {	MyNode   n;	TreeNode par;	System.out.println("** nodeRemoved(" + fqn + ')');	n=root.findNode(fqn);	if(n != null) {	    n.removeAllChildren();	    	    par=n.getParent();	    n.removeFromParent();	    tree_model.reload(par);	}    }    public void nodeModified(String fqn, Serializable old_element, Serializable new_element) {	System.out.println("** nodeModified(" + fqn + ')');	root.modify(fqn, new_element);	populateTable((Properties)new_element);    }        /* ---------------- End of DistributedTree.DistributedTreeListener interface -------- */       public static void main(String args[]) {	DistributedTreeDemo demo;	boolean             create=false;	for(int i=0; i < args.length; i++) {	    if("-help".equals(args[i])) {		System.out.println("DistributedTreeDemo [-create] [-help]");		return;	    }	    if("-create".equals(args[i])) {		create=true;		continue;	    }	}	try {	    demo=new DistributedTreeDemo(create);	    demo.setVisible(true);	}	catch(Exception ex) {	    System.err.println(ex);	}    }  }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?