Adding JMCR-Stable version
[Benchmarks_CSolver.git] / JMCR-Stable / real-world application / jigsaw / src / org / w3c / jigadm / gui / ServerBrowser.java
diff --git a/JMCR-Stable/real-world application/jigsaw/src/org/w3c/jigadm/gui/ServerBrowser.java b/JMCR-Stable/real-world application/jigsaw/src/org/w3c/jigadm/gui/ServerBrowser.java
new file mode 100644 (file)
index 0000000..92fb9bf
--- /dev/null
@@ -0,0 +1,765 @@
+// ServerBrowser.java\r
+// $Id: ServerBrowser.java,v 1.1 2010/06/15 12:27:17 smhuang Exp $\r
+// (c) COPYRIGHT MIT and INRIA, 1997.\r
+// Please first read the full copyright statement in file COPYRIGHT.html\r
+\r
+package org.w3c.jigadm.gui ;\r
+\r
+import java.awt.BorderLayout;\r
+import java.awt.Button;\r
+import java.awt.Color;\r
+import java.awt.Component;\r
+import java.awt.Container;\r
+import java.awt.Cursor;\r
+import java.awt.Dimension;\r
+import java.awt.Frame;\r
+import java.awt.GridBagConstraints;\r
+import java.awt.GridBagLayout;\r
+import java.awt.GridLayout;\r
+import java.awt.Image;\r
+import java.awt.Insets;\r
+import java.awt.Label;\r
+import java.awt.Menu;\r
+import java.awt.MenuBar;\r
+import java.awt.MenuComponent;\r
+import java.awt.MenuItem;\r
+import java.awt.Panel;\r
+import java.awt.Scrollbar;\r
+import java.awt.TextComponent;\r
+import java.awt.TextField;\r
+import java.awt.Toolkit;\r
+import java.awt.Window;\r
+\r
+import java.awt.event.ActionEvent;\r
+import java.awt.event.ActionListener;\r
+import java.awt.event.WindowAdapter;\r
+import java.awt.event.WindowEvent;\r
+\r
+import java.util.EventObject;\r
+import java.util.Hashtable;\r
+import java.util.Properties;\r
+\r
+import java.io.PrintStream;\r
+\r
+import java.net.URL;\r
+\r
+import org.w3c.jigadm.PropertyManager;\r
+import org.w3c.jigadm.RemoteResourceWrapper;\r
+\r
+import org.w3c.jigsaw.admin.AdminContext;\r
+import org.w3c.jigsaw.admin.RemoteAccessException;\r
+import org.w3c.jigsaw.admin.RemoteResource;\r
+\r
+import org.w3c.tools.sorter.Sorter;\r
+\r
+import org.w3c.tools.widgets.MessagePopup;\r
+import org.w3c.tools.widgets.NodeHandler;\r
+import org.w3c.tools.widgets.TreeBrowser;\r
+import org.w3c.tools.widgets.TreeNode;\r
+\r
+class UrlPopup extends Frame implements ActionListener {\r
+  ServerBrowser browser = null;\r
+  Frame frame           = null;\r
+  TextField url         = null;\r
+  Button okB            = null; \r
+  Button cancelB        = null;\r
+  boolean keepOnCancel  = true;\r
+\r
+    private class Openner extends Thread {\r
+       ServerBrowser browser = null;\r
+       AdminContext  ac      = null;\r
+\r
+       public void run() {\r
+           browser.open(ac);\r
+       }\r
+\r
+       private Openner(ServerBrowser browser,\r
+                       AdminContext ac) {\r
+           this.browser = browser;\r
+           this.ac = ac;\r
+       }\r
+    }\r
+\r
+    private String getAdminUrl() {\r
+       String adminUrl = url.getText();\r
+       if (adminUrl.length() < 1)\r
+           return null;\r
+       else  if (! adminUrl.startsWith("http")) {\r
+           adminUrl = "http://"+adminUrl;\r
+       }\r
+       return adminUrl;\r
+    }\r
+\r
+    public void actionPerformed(ActionEvent evt) {\r
+       Object target = evt.getSource();\r
+       if ((target == url) || (target == okB)) {\r
+           String adminUrl = getAdminUrl();\r
+           if (adminUrl != null) {\r
+               AdminContext ac = null;\r
+               try {\r
+                   ac = new AdminContext(new URL(adminUrl));\r
+               } catch (RemoteAccessException ex) {\r
+                   browser.errorPopup("RemoteAccessException", ex);\r
+                   //    (new MessagePopup("RemoteAccessException : "+\r
+                   //                      ex.getMessage())).show();\r
+                   ex.printStackTrace();\r
+                   return;\r
+               } catch (java.net.MalformedURLException ex) {\r
+                   browser.errorPopup("MalformedURLException", ex);\r
+                   //  (new MessagePopup("MalformedURL : "+adminUrl)).show();\r
+                   return;\r
+               }\r
+               dispose();\r
+               frame.setTitle("Server Browser: " +adminUrl);\r
+               frame.show();\r
+               ( new Openner(browser,ac)).start();\r
+           }\r
+       } else  if (target == cancelB) {\r
+           if (! keepOnCancel) {\r
+               frame.dispose();\r
+               WindowCloser.windows--;\r
+               if (WindowCloser.windows < 0) {\r
+                   dispose();\r
+                   System.exit(0);\r
+               }\r
+           }\r
+           dispose();\r
+       }\r
+    }\r
+\r
+    /**\r
+     * create the URL popup\r
+     */\r
+\r
+    UrlPopup(String title, \r
+            ServerBrowser browser, \r
+            Frame frame, \r
+            boolean keepOnCancel) {\r
+           super(title);\r
+           setBackground(Color.lightGray);\r
+           this.browser = browser;\r
+           this.frame = frame;\r
+           this.keepOnCancel = keepOnCancel;\r
+           Label label = new Label("Location :");\r
+           url = new TextField(20);\r
+           url.addActionListener(this);\r
+           okB = new Button("Ok");\r
+           okB.addActionListener(this);\r
+           cancelB = new Button("Cancel");\r
+           cancelB.addActionListener(this);\r
+\r
+           GridBagLayout gbl = new GridBagLayout();\r
+           GridBagConstraints gbc = new GridBagConstraints();\r
+\r
+           setLayout(gbl);\r
+           gbc.insets = new Insets(10,0,10,0);\r
+           gbc.fill = GridBagConstraints.NONE;\r
+           gbc.gridwidth = GridBagConstraints.RELATIVE;\r
+           gbl.setConstraints(label,gbc);\r
+           add(label);\r
+\r
+           gbc.gridwidth = GridBagConstraints.REMAINDER;\r
+           gbl.setConstraints(url,gbc);\r
+           add(url);\r
+\r
+           gbc.gridwidth = GridBagConstraints.RELATIVE;\r
+           gbc.anchor = GridBagConstraints.EAST;\r
+           gbl.setConstraints(okB,gbc);\r
+           add(okB);\r
+\r
+           gbc.gridwidth = GridBagConstraints.REMAINDER;\r
+           gbc.anchor = GridBagConstraints.WEST;\r
+           gbl.setConstraints(cancelB,gbc);\r
+           add(cancelB);\r
+\r
+           pack();\r
+           show();\r
+\r
+           url.requestFocus();\r
+    }\r
+}\r
+\r
+class WindowCloser extends WindowAdapter {\r
+\r
+    protected static int windows = 0;\r
+\r
+    Frame window = null;\r
+\r
+    public void windowClosing(WindowEvent e) {\r
+       if (e.getWindow() == window) {\r
+           window.setVisible(false);\r
+           window.dispose();\r
+           windows--;\r
+           if (windows < 0)\r
+               System.exit(0);\r
+       }\r
+    }\r
+\r
+    WindowCloser(Frame window) {\r
+       this.window = window;\r
+    }\r
+\r
+}\r
+\r
+class ServerMenu extends MenuBar implements ActionListener {\r
+\r
+  ServerBrowser browser = null;\r
+\r
+    public void actionPerformed(ActionEvent evt) {\r
+       String command = evt.getActionCommand();\r
+       if (command.equals("open")) {\r
+           new UrlPopup("Open new Admin-server", browser, \r
+                        (Frame)getParent(), true);\r
+       } else  if(command.equals("new")) {\r
+           try { \r
+               Frame f = new Frame("New Server Browser");\r
+               f.setBackground(Color.lightGray);\r
+               Panel editor = new Panel();\r
+               Panel newbrowser = new Panel(new BorderLayout());\r
+               TreeListener tl = new TreeListener(editor);\r
+               ServerBrowser sb = null;\r
+               sb = new ServerBrowser(f,tl);\r
+               Scrollbar sv = new Scrollbar(Scrollbar.VERTICAL);\r
+               sb.setVerticalScrollbar(sv);\r
+               Scrollbar sh = new Scrollbar(Scrollbar.HORIZONTAL);\r
+               sb.setHorizontalScrollbar(sh);\r
+               newbrowser.add("Center", sb);\r
+               newbrowser.add("East", sv);\r
+               newbrowser.add("South", sh);\r
+               editor.setLayout(new BorderLayout());\r
+               // Add a menubar\r
+               ServerMenu menu = new ServerMenu(sb);\r
+               GridLayout g = new GridLayout(1, 2) ;\r
+               f.setLayout(g);\r
+               f.setMenuBar(menu);\r
+               f.add(newbrowser);\r
+               f.add(editor);\r
+               f.setSize(new Dimension(850,600));\r
+               WindowCloser.windows++;\r
+               f.addWindowListener(new WindowCloser(f));\r
+           } catch (Exception ex) {\r
+               ex.printStackTrace();\r
+           }  \r
+       } else  if(command.equals("close")) {\r
+           Frame cont = (Frame)getParent();\r
+           cont.setVisible(false);\r
+           cont.dispose();\r
+           WindowCloser.windows--;\r
+           if (WindowCloser.windows < 0)\r
+               System.exit(0);\r
+       } else  if(command.equals("quit")) {\r
+           Frame cont = (Frame)getParent();\r
+           cont.setVisible(false);\r
+           cont.dispose();\r
+           WindowCloser.windows = 0;\r
+           System.exit(0);\r
+       }\r
+    }\r
+\r
+    ServerMenu(ServerBrowser browser) {\r
+       super();\r
+       this.browser = browser;\r
+       Menu server = new Menu("Admin-Server");\r
+       add(server);\r
+       MenuItem open = new MenuItem("Open");\r
+       open.setActionCommand("open");\r
+       open.addActionListener(this);\r
+       server.add( open );\r
+       MenuItem newOpen = new MenuItem("Open in new window");\r
+       newOpen.setActionCommand("new");\r
+       newOpen.addActionListener(this);\r
+       server.add( newOpen );\r
+       server.addSeparator();\r
+       MenuItem close = new MenuItem("Close window");\r
+       close.setActionCommand("close");\r
+       close.addActionListener(this);\r
+       server.add( close );\r
+       MenuItem quit = new MenuItem("Exit");\r
+       quit.setActionCommand("quit");\r
+       quit.addActionListener(this);\r
+       server.add( quit );\r
+    }\r
+}\r
+\r
+public class ServerBrowser extends TreeBrowser implements NodeHandler {\r
+\r
+    class Expander extends Thread {\r
+       TreeBrowser browser;\r
+       TreeNode nd;\r
+\r
+        public void run() {\r
+           if(getLock()) {\r
+               notifyExpander(browser, nd);\r
+               unlock();\r
+           }\r
+       }\r
+\r
+        Expander(TreeBrowser browser, TreeNode nd) {\r
+           this.browser = browser;\r
+           this.nd = nd;\r
+       }\r
+    }\r
+\r
+    public static final boolean debug = false;\r
+    Image diricon = null;\r
+    Image diropenedicon = null;\r
+    Image fileicon = null;\r
+    AdminContext admin = null;\r
+    TreeListener tl = null;\r
+    TreeNode lastn = null;\r
+    RemoteResourceWrapper rootResource;\r
+    boolean locked;\r
+    private Frame popup = null;\r
+\r
+    protected void errorPopup(String name, Exception ex) {\r
+      (new MessagePopup(name+" : "+ex.getMessage())).show();\r
+    }\r
+\r
+    /**\r
+     * gets a lock to avoid adding node while removing other nodes\r
+     * it sets also the Cursor to WAIT_CURSOR\r
+     */\r
+\r
+    protected synchronized boolean getLock() {\r
+       if(locked)\r
+           return false;\r
+       setCursor(Frame.WAIT_CURSOR);\r
+       locked = true;\r
+       return true;\r
+    }\r
+\r
+    /**\r
+     * release the lock and sets the Cursor to the default\r
+     */\r
+\r
+    protected synchronized void unlock() {\r
+       locked = false;\r
+       setCursor(Frame.DEFAULT_CURSOR);\r
+    }\r
+\r
+    // get rid of the Auth Popup\r
+\r
+    protected void dispose(boolean Ok) {\r
+      if (! Ok) {\r
+       Frame f = getFrame(this);\r
+       if (f != null)\r
+         f.dispose();\r
+       WindowCloser.windows--;\r
+       popup.dispose();\r
+       if (WindowCloser.windows < 0)\r
+         System.exit(0);\r
+      } else  if (popup != null) {\r
+       popup.dispose();\r
+       popup = null;\r
+      }\r
+    } \r
+\r
+    // pops up a new Auth popup\r
+\r
+    public void popupDialog(String name) {\r
+       if(popup == null) {\r
+           AuthPopup ap = new AuthPopup(this, name);\r
+           popup = new Frame("Authorization for jigadm");\r
+           popup.setBackground(Color.lightGray);\r
+           popup.setSize(new Dimension(300, 200));\r
+           popup.setLayout(new BorderLayout());\r
+           popup.add("Center", ap);\r
+           popup.show();\r
+           ap.user.requestFocus();\r
+           while(!ap.waitForCompletion());\r
+       }\r
+    }    \r
+\r
+    /**\r
+     * give the Root Resource of the browser\r
+     */\r
+\r
+    public RemoteResourceWrapper getRootWrapper() {\r
+       return rootResource;\r
+    }\r
+\r
+    public void renameNode(RemoteResourceWrapper rw, String label) {\r
+        try {\r
+         if (rw.getResource().isContainer()) {\r
+           (new MessagePopup("WARNING: you have changed the identifier. "+\r
+                             "To access the sons, close and reopen the node")\r
+             ).show();\r
+         }\r
+       } catch (RemoteAccessException ex) {\r
+         // ??\r
+       }\r
+       TreeNode tn = getNode(rw);\r
+       // if it is a visible node, change the label and repaint\r
+       if (tn != null) {\r
+           tn.setLabel(label);\r
+           repaint();\r
+       }\r
+    }\r
+\r
+    public void removeNode(RemoteResourceWrapper rw) {\r
+       if(getLock()) {\r
+         if (getNode(rw) != null) {\r
+           removeBranch(getNode(rw));\r
+           tl.nodeRemoved(rw);\r
+         }\r
+         unlock();\r
+         repaint();\r
+       }\r
+    }\r
+\r
+    public void insertNode(RemoteResourceWrapper father, \r
+                          RemoteResourceWrapper son,\r
+                          String name) {\r
+       TreeNode fatherNode;\r
+       boolean ic = false;\r
+\r
+       if(father == null)\r
+           System.out.println("Error null father");\r
+       fatherNode = getNode(father);\r
+       if(fatherNode.getChildren() == TreeNode.NOCHILD)\r
+           return;\r
+       \r
+       if (fatherNode == null)\r
+           return; // this should never happen, but...\r
+       try {\r
+           ic = son.getResource().isContainer();\r
+       } catch (RemoteAccessException ex) {\r
+           // fancy thing\r
+           errorPopup("RemoteAccessException",ex);\r
+       }\r
+\r
+       if(ic)\r
+           insert(fatherNode, son, this, name, diricon);\r
+       else\r
+           insert(fatherNode, son, this, name, fileicon);\r
+       repaint();\r
+    }\r
+\r
+    protected RemoteResourceWrapper getResources(\r
+       RemoteResourceWrapper rw,String name) {\r
+\r
+       RemoteResource resource = null;\r
+       if(rw != null) {\r
+           try {\r
+               resource = rw.getResource().loadResource(name);\r
+           } catch (RemoteAccessException ex) {\r
+             errorPopup("RemoteAccessException", ex);\r
+             ex.printStackTrace();\r
+           }\r
+       }\r
+       return new RemoteResourceWrapper(rw, resource, this);\r
+    }\r
+\r
+    private final Image getImage(String name) {\r
+       Image img;\r
+       img = Toolkit.getDefaultToolkit().getImage(name);\r
+       return img;\r
+    }\r
+\r
+    private final Frame getFrame(Component c) {\r
+       while(! (c instanceof Frame)) {\r
+           c = c.getParent();\r
+           if (c == null)\r
+             return null;\r
+       }\r
+       return (Frame)c;\r
+    }\r
+    /*   private final*/ public void setCursor(int cursor) {\r
+       getFrame(this).setCursor(new Cursor(cursor));\r
+       Toolkit.getDefaultToolkit().sync();\r
+    }\r
+\r
+    protected void open(AdminContext ac) {\r
+       RemoteResource rr = null;\r
+       admin   = ac;\r
+       locked = false;\r
+       boolean authorized = false;\r
+\r
+       if (rootResource != null)\r
+           removeNode(rootResource);\r
+       tl.focusChanged( null );\r
+       while (!authorized) {\r
+           try {\r
+               authorized = true;\r
+               ac.initialize();\r
+           } catch (RemoteAccessException ex) {\r
+               if(ex.getMessage().equals("Unauthorized")) {\r
+                   authorized = false;\r
+               } else {\r
+                   ex.printStackTrace();\r
+               }\r
+           } finally {\r
+               if(!authorized) {\r
+                   popupDialog("admin");\r
+               }\r
+           }\r
+       }\r
+       try {\r
+           rr = ac.getAdminResource();\r
+       } catch (RemoteAccessException ex) { \r
+           errorPopup("RemoteAccessException", ex);\r
+           //( new MessagePopup("RemoteAccessException : "+\r
+           //ex.getMessage())).show();\r
+           return;\r
+       }\r
+       rootResource = new RemoteResourceWrapper(rr, this);\r
+       initialize(rootResource, "Root", this, diricon);\r
+       tl.focusChanged(rootResource);\r
+       repaint();\r
+    }\r
+\r
+    public ServerBrowser(Frame frame, TreeListener tl) {\r
+       PropertyManager pm = PropertyManager.getPropertyManager();\r
+       this.tl = tl;\r
+\r
+       diricon = getImage(pm.getIconLocation("smalldir"));\r
+       fileicon = getImage(pm.getIconLocation("smallfile"));\r
+       diropenedicon = getImage(pm.getIconLocation("smalldiropened"));\r
+\r
+       new UrlPopup("Open Admin Server : ", this, frame, false);\r
+    }\r
+\r
+    public ServerBrowser(AdminContext ac, TreeListener tl) {\r
+       boolean authorized = false;\r
+       RemoteResource rr = null;\r
+       PropertyManager pm = PropertyManager.getPropertyManager();\r
+       admin   = ac;\r
+       this.tl = tl;\r
+\r
+       locked = false;\r
+       diricon = getImage(pm.getIconLocation("smalldir"));\r
+       fileicon = getImage(pm.getIconLocation("smallfile"));\r
+       diropenedicon = getImage(pm.getIconLocation("smalldiropened"));\r
+       while (!authorized) {\r
+           try {\r
+               authorized = true;\r
+               ac.initialize();\r
+           } catch (RemoteAccessException ex) {\r
+               if(ex.getMessage().equals("Unauthorized")) {\r
+                   authorized = false;\r
+               } else {\r
+                   ex.printStackTrace();\r
+               }\r
+           } finally {\r
+               if(!authorized) {\r
+                   popupDialog("admin");\r
+               }\r
+           }\r
+       }\r
+       try {\r
+           rr = ac.getAdminResource();\r
+       } catch (RemoteAccessException ex) { \r
+           // Unable to connect for whatever reason... exit!\r
+           ex.printStackTrace();\r
+           System.exit(0);\r
+       }\r
+       rootResource = new RemoteResourceWrapper(rr, this);\r
+       initialize(rootResource, "Root", this, diricon);\r
+    }\r
+\r
+    public void notifySelect(TreeBrowser browser, TreeNode nd) {\r
+       if(tl != null) {\r
+           tl.editedChanged(this, (RemoteResourceWrapper)nd.getItem());\r
+       }\r
+       browser.unselect(lastn);\r
+       browser.select(nd);\r
+       browser.repaint();\r
+       lastn = nd;\r
+   }\r
+\r
+   /**\r
+    * Handles Select notifications.\r
+    *\r
+    * we simply select the node and redraw the browser.\r
+    */    \r
+    public void notifyExecute(TreeBrowser browser, TreeNode node) {\r
+       if(tl != null) {\r
+           tl.focusChanged((RemoteResourceWrapper)node.getItem());\r
+       }\r
+       if(!node.equals(lastn)) {\r
+           browser.unselect(lastn);\r
+           lastn = null;\r
+       }\r
+       browser.repaint();\r
+    }\r
+\r
+    public void notifyExpand(TreeBrowser browser, TreeNode nd) {\r
+       (new Expander(browser, nd)).start();\r
+    }\r
+\r
+   /**\r
+    * Handles Expand notifications\r
+    *\r
+    * if the node is a directory, we list its content and insert the\r
+    * directories and files in the browser.\r
+    */\r
+    public void notifyExpander(TreeBrowser browser, TreeNode nd) {\r
+       if(tl != null) {\r
+           tl.focusChanged((RemoteResourceWrapper)nd.getItem());\r
+       }\r
+       RemoteResourceWrapper rrw = null;\r
+       RemoteResource rr = null;\r
+       boolean ic = false;\r
+       boolean authorized;\r
+\r
+       rrw = (RemoteResourceWrapper)nd.getItem();\r
+       if(rrw == null)\r
+           return;\r
+       rr = rrw.getResource();\r
+       try {\r
+           ic = rr.isContainer();\r
+       } catch(Exception ex) {\r
+           ex.printStackTrace();\r
+       }\r
+       if(ic) {\r
+           String names[] = null;\r
+           setCursor(Frame.WAIT_CURSOR);\r
+           authorized = false;\r
+           while(!authorized) {\r
+               authorized = true;\r
+               try {\r
+                   names = rr.enumerateResourceIdentifiers();\r
+               } catch (RemoteAccessException ex) {\r
+                   if( ex.getMessage().equals("Unauthorized")) {\r
+                       authorized = false;\r
+                   } else {\r
+                     names = new String[0];\r
+                     errorPopup("RemoteAccessException", ex);\r
+                     ex.printStackTrace();\r
+                   }\r
+               } finally {\r
+                   if(!authorized) {\r
+                       popupDialog("admin");\r
+                   }\r
+               }\r
+           }\r
+           Sorter.sortStringArray(names, true);\r
+           if (debug)\r
+               System.out.println("Found "+names.length+" identifiers");\r
+            for(int i = 0; i <names.length; i++) {\r
+               boolean nic = false;\r
+               RemoteResourceWrapper nrrw = getResources(rrw, names[i]);\r
+               RemoteResource nrr = nrrw.getResource();\r
+               try {\r
+                   nic = nrr.isContainer();\r
+               } catch(Exception ex) {\r
+                   ex.printStackTrace();\r
+               }\r
+               if(nic) {\r
+                   browser.insert(nd, nrrw, this, names[i], diricon);\r
+               }\r
+               else {\r
+                   browser.insert(nd, nrrw, this, names[i], fileicon);\r
+               }\r
+           }\r
+           if(!nd.equals(lastn)) {\r
+               browser.unselect(lastn);\r
+               lastn = null;\r
+           }\r
+           setCursor(Frame.DEFAULT_CURSOR);\r
+           browser.repaint();\r
+       }\r
+       if(isDirectory(this, nd))\r
+          nd.setIcon(diropenedicon);\r
+    }\r
+\r
+    public boolean isDirectory(TreeBrowser browser, TreeNode nd) {\r
+       RemoteResourceWrapper rrw = null;\r
+       boolean ic = false;\r
+       rrw = (RemoteResourceWrapper)nd.getItem();\r
+       if(rrw == null)\r
+           return false;\r
+       try {\r
+           return rrw.getResource().isContainer();\r
+       } catch (Exception ex) {\r
+           ex.printStackTrace();\r
+       }\r
+       return false;\r
+    }\r
+\r
+   /**\r
+    * Handles Collapse notifications\r
+    *\r
+    * we simply collapse the given node and repaint the browser.\r
+    */    \r
+    public void notifyCollapse(TreeBrowser browser, TreeNode node) {\r
+       if(getLock()) {\r
+           if(tl != null) {\r
+               tl.focusChanged((RemoteResourceWrapper)node.getItem());\r
+           }\r
+           browser.collapse(node);\r
+           if(!node.equals(lastn)) {\r
+               browser.unselect(lastn);\r
+               lastn = null;\r
+           }\r
+           unlock();\r
+           browser.repaint();\r
+           node.setIcon(diricon);\r
+       }\r
+    }\r
+\r
+    static public void main(String args[]) {\r
+       String baseURL=null;\r
+       String jigadmRoot = null;\r
+       \r
+       for (int i = 0 ; i < args.length ; i++) {\r
+           if (args[i].equals("-root")) {\r
+               Properties p = System.getProperties();\r
+               jigadmRoot = args[++i];\r
+               p.put(PropertyManager.ROOT_P, jigadmRoot);\r
+               System.setProperties(p);\r
+           }\r
+           baseURL = args[i];\r
+       }\r
+       try {\r
+           Frame f = new Frame("Server Browser: " + baseURL);\r
+           f.setBackground(Color.lightGray);\r
+           Panel editor = new Panel();\r
+           Panel browser = new Panel(new BorderLayout());\r
+           TreeListener tl = new TreeListener(editor);\r
+           ServerBrowser sb = null;\r
+           Scrollbar sv = new Scrollbar(Scrollbar.VERTICAL);\r
+           Scrollbar sh = new Scrollbar(Scrollbar.HORIZONTAL);\r
+           try {\r
+             AdminContext ac = new AdminContext(new URL(baseURL));\r
+             sb = new ServerBrowser(ac, tl);\r
+             sb.setVerticalScrollbar(sv);\r
+             sb.setHorizontalScrollbar(sh);\r
+             browser.add("Center", sb);\r
+             browser.add("East", sv);\r
+             browser.add("South", sh);\r
+             editor.setLayout(new BorderLayout());\r
+             ServerMenu menu = new ServerMenu(sb);\r
+\r
+             GridLayout g = new GridLayout(1, 2) ;\r
+             f.setLayout(g);\r
+             f.setMenuBar(menu);\r
+             f.add(browser);\r
+             f.add(editor);          \r
+             f.setSize(new Dimension(850,600));\r
+             f.addWindowListener(new WindowCloser(f));\r
+             f.show();\r
+\r
+           } catch (java.net.MalformedURLException ex) {\r
+             sb = new ServerBrowser(f,tl);\r
+             sb.setVerticalScrollbar(sv);\r
+             sb.setHorizontalScrollbar(sh);\r
+             browser.add("Center", sb);\r
+             browser.add("East", sv);\r
+             browser.add("South", sh);\r
+             editor.setLayout(new BorderLayout());\r
+             ServerMenu menu = new ServerMenu(sb);\r
+             GridLayout g = new GridLayout(1, 2) ;\r
+             f.setLayout(g);\r
+             f.setMenuBar(menu);\r
+             f.add(browser);\r
+             f.add(editor);\r
+             f.setSize(new Dimension(850,600));\r
+           }\r
+       } catch (Exception ex) {\r
+           ex.printStackTrace();\r
+       }\r
+    }\r
+}\r
+\r
+\r