You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by sf...@apache.org on 2006/10/12 13:54:38 UTC

svn commit: r463216 - in /incubator/felix/trunk: mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/ mosgi.console.component/src/main/resources/icons/ mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/ mosgi...

Author: sfrenot
Date: Thu Oct 12 04:54:37 2006
New Revision: 463216

URL: http://svn.apache.org/viewvc?view=rev&rev=463216
Log:
FELIX-151

- RemoteLogger_jtree can now ask the remote logger to send the old log at connection time.
- A right click on remoteLogger_jtree now allows deleting log.
- Addition of an "add" and "remove" button into NodesTree.
- Improvement of propertyChangeEvent's in mosgi.console.gui.


Added:
    incubator/felix/trunk/mosgi.console.component/src/main/resources/icons/OLDLOG.gif   (with props)
Modified:
    incubator/felix/trunk/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/JtableCellRenderer.java
    incubator/felix/trunk/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/JtreeCellRenderer.java
    incubator/felix/trunk/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/RemoteLogger_jtable.java
    incubator/felix/trunk/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/RemoteLogger_jtree.java
    incubator/felix/trunk/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/Activator.java
    incubator/felix/trunk/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/NodeCellRenderer.java
    incubator/felix/trunk/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/NodePanel.java
    incubator/felix/trunk/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/NodesTree.java
    incubator/felix/trunk/mosgi.jmx.remotelogger/src/main/java/org/apache/felix/mosgi/jmx/remotelogger/Logger.java
    incubator/felix/trunk/mosgi.jmx.remotelogger/src/main/java/org/apache/felix/mosgi/jmx/remotelogger/LoggerMBean.java

Modified: incubator/felix/trunk/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/JtableCellRenderer.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/JtableCellRenderer.java?view=diff&rev=463216&r1=463215&r2=463216
==============================================================================
--- incubator/felix/trunk/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/JtableCellRenderer.java (original)
+++ incubator/felix/trunk/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/JtableCellRenderer.java Thu Oct 12 04:54:37 2006
@@ -40,8 +40,7 @@
     eventName.put(new Integer( Bundle.UNINSTALLED ), Color.black  );
   }
 
-  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
-  						 boolean hasFocus, int row, int column) {
+  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
     setOpaque(true);
     if (column==0){
       Integer state;
@@ -50,7 +49,11 @@
       }catch (NumberFormatException nfe) {
         state=new Integer(-1);
       }
-      setBackground((Color) eventName.get(state));
+      if (((String) value).equals("??/??/??")) {
+	setBackground(Color.white);
+      } else{
+	setBackground((Color) eventName.get(state));
+      }
     }
     setText((String) value);
 

Modified: incubator/felix/trunk/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/JtreeCellRenderer.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/JtreeCellRenderer.java?view=diff&rev=463216&r1=463215&r2=463216
==============================================================================
--- incubator/felix/trunk/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/JtreeCellRenderer.java (original)
+++ incubator/felix/trunk/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/JtreeCellRenderer.java Thu Oct 12 04:54:37 2006
@@ -39,16 +39,18 @@
 public class JtreeCellRenderer extends DefaultTreeCellRenderer {
 
   private boolean isLeaf=false;
-  //private int maxL;
 
   private String[] states=new String[]{"ACTIVE","INSTALLED","RESOLVED","STARTING","STOPPING","UNINSTALLED"};
   private Color[] colors=new Color[]{Color.green,Color.orange,Color.red,Color.white,Color.white,Color.black};
   private ImageIcon[] ii=new ImageIcon[6];
+  private ImageIcon iiOldLog=null;
 
   public JtreeCellRenderer(BundleContext bdlCtx){
     for (int i=0 ; i<states.length ; i++){
       this.ii[i]=new ImageIcon(Toolkit.getDefaultToolkit().getImage(bdlCtx.getBundle().getResource("icons/"+states[i]+".gif")));
     }
+    this.iiOldLog=new ImageIcon(Toolkit.getDefaultToolkit().getImage(bdlCtx.getBundle().getResource("icons/OLDLOG.gif")));
+
   }
 
   public Dimension getPreferredSize() {
@@ -65,6 +67,7 @@
     setOpaque(true);
     setBackground(Color.white);
     setFont(new Font("Monospaced",Font.BOLD,12));
+    setToolTipText(null);
 
     StringTokenizer st=null;
     DefaultMutableTreeNode dmtn=(DefaultMutableTreeNode)value;
@@ -77,17 +80,21 @@
     }
 
     if(st!=null){
-      st.nextToken();
+      String date=st.nextToken();
       st.nextToken();
       String state=st.nextToken();
       for (int i=0 ; i<states.length ; i++){
         if (state.equals(states[i])){
           if (lvl==4){
-            setIcon(ii[i]);
+	    if(!date.equals("??/??/??")){
+	      setIcon(ii[i]);
+	    }else{
+	      setIcon(iiOldLog);
+	    }
 	    setFont(new Font("Monospaced",Font.PLAIN,10));
           }else{ 
             StringTokenizer st2 = new StringTokenizer(((DefaultMutableTreeNode)dmtn.getFirstChild()).toString()," | ");
-            setToolTipText("<html><B>IP = </B>"+/*IP=<ip> Profil=<port>/<profil>*/dmtn.getParent().getParent()+"<B> Profil =</B>"+dmtn.getParent()+"<br><B>Bundle : </B>"+/*Bundle : Id=<bundleId> : <bundleSymbolicName>*/dmtn+"<br><B>Date : </B>"+/*<date> - <time>*/st2.nextToken()+" - "+st2.nextToken()+"<br><B>State : </B>"+/*<bundleState>*/st2.nextToken()+"<B><br>Event "+/*Event <eventNumber> : <logLevel> : <message>*/dmtn.getChildCount()+" : "+st2.nextToken()+" : "+st2.nextToken()+"</B></html>");
+            setToolTipText("<html><B>IP = </B>"+/*IP=<ip> Profil=<port>/<profil>*/dmtn.getParent().getParent()+"<B> Profil =</B>"+dmtn.getParent()+"<br><B>Bundle : </B>"+/*Bundle : Id=<bundleId> : <bundleSymbolicName>*/dmtn+"<br><B>Date : </B>"+/*<date> - <time>*/st2.nextToken()+" - "+st2.nextToken()+"<br><B>State : "+/*<bundleState>*/st2.nextToken()+"<br>Event "+/*Event <eventNumber> : <logLevel> : <message>*/dmtn.getChildCount()+" : "+st2.nextToken()+" : "+st2.nextToken()+"</B></html>");
             setBackground(colors[i]);
           }
 	break;

Modified: incubator/felix/trunk/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/RemoteLogger_jtable.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/RemoteLogger_jtable.java?view=diff&rev=463216&r1=463215&r2=463216
==============================================================================
--- incubator/felix/trunk/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/RemoteLogger_jtable.java (original)
+++ incubator/felix/trunk/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/RemoteLogger_jtable.java Thu Oct 12 04:54:37 2006
@@ -153,7 +153,7 @@
       try{
         MBeanServerConnection mbs=(MBeanServerConnection)e.getNewValue();
         if (nodes.get(mbs)==null){
-	  System.out.println("Ajout d'un listener " +mbs);
+	  //System.out.println("Ajout d'un listener " +mbs);
           ((MBeanServerConnection)e.getNewValue()).addNotificationListener(new ObjectName("OSGI:name=Remote Logger"), this, null, e.getOldValue());
           nodes.put(mbs, "ok");
         }
@@ -164,18 +164,24 @@
   }
 
   public void handleNotification(Notification notification, Object handback) {
-    StringTokenizer st = new StringTokenizer(notification.getMessage(),":");
-    Date d=new Date(notification.getTimeStamp());
-    //DateFormat dateFormat = new SimpleDateFormat("hh'h'mm dd-MM-yy");
-    DateFormat df = DateFormat.getTimeInstance(DateFormat.MEDIUM); // utilise le format de date local
-    DateFormat df2 = DateFormat.getDateInstance(DateFormat.SHORT);
+    StringTokenizer st = new StringTokenizer(notification.getMessage(),"*");
+    
+    long ts=notification.getTimeStamp();
+    String date="??/??/??";
+    String time="??/??/??";
+    if (ts!=0){ // means it's not an old log
+      Date d=new Date(ts);
+      //DateFormat dateFormat = new SimpleDateFormat("hh'h'mm dd-MM-yy");
+      date=DateFormat.getDateInstance(DateFormat.SHORT).format(d);
+      time=DateFormat.getTimeInstance(DateFormat.MEDIUM).format(d);
+    }
     String id=st.nextToken();
     String name=st.nextToken();
     String shortName=name.substring(name.lastIndexOf(".")+1,name.length());
     String state=st.nextToken();
     String lvl=st.nextToken();
     String msg=st.nextToken();
-    Object [] event = new Object []{df2.format(d),df.format(d),handback,id,shortName,state,lvl,msg};
+    Object [] event = new Object []{date,time,handback,id,shortName,state,lvl,msg};
 				    
     this.insertRow(0,event); 
     this.fireTableRowsInserted(0, 0);

Modified: incubator/felix/trunk/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/RemoteLogger_jtree.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/RemoteLogger_jtree.java?view=diff&rev=463216&r1=463215&r2=463216
==============================================================================
--- incubator/felix/trunk/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/RemoteLogger_jtree.java (original)
+++ incubator/felix/trunk/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/RemoteLogger_jtree.java Thu Oct 12 04:54:37 2006
@@ -61,16 +61,24 @@
 import javax.swing.JFrame;
 import javax.swing.tree.DefaultMutableTreeNode;
 import javax.swing.tree.TreePath;
-
+import javax.swing.JOptionPane;
 //import org.osgi.service.prefs.Preferences;
 
+import java.awt.event.MouseListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import javax.swing.JPopupMenu;
+import javax.swing.JMenuItem;
+
 public class RemoteLogger_jtree extends DefaultTreeModel implements CommonPlugin, NotificationListener{
 
   private MyTree logTree;
+  private MouseListener ml;
+  private TreePath selPath;
   private JPanel jp;
-  private Hashtable nodes=new Hashtable();
   private DefaultMutableTreeNode rootNode=new DefaultMutableTreeNode("root");
   private Hashtable eventName=new Hashtable();
+  private Hashtable nodes=new Hashtable();
 
   public RemoteLogger_jtree (BundleContext bdlCtx){
     super(null);
@@ -84,11 +92,31 @@
     JtreeCellRenderer treeCellRenderer=new JtreeCellRenderer(bdlCtx);
     this.logTree.setCellRenderer(treeCellRenderer);
     this.logTree.setLargeModel(true);
-    this.logTree.setToggleClickCount(1); 
+    this.logTree.setToggleClickCount(2); 
     this.logTree.setRootVisible(false);
     // this create an invisible tree even if I use *expand* so...
     // I use expand after the first insert into the tree
-  
+
+    MouseListener ml = new MouseAdapter() {
+      public void mousePressed(MouseEvent e) {
+        int selRow = logTree.getRowForLocation(e.getX(), e.getY());
+        selPath = logTree.getPathForLocation(e.getX(), e.getY());
+        if(selRow != -1 & e.getButton()>1) {
+	  String nodeString="\""+((DefaultMutableTreeNode) selPath.getLastPathComponent()).getUserObject()+"\"";
+	  JMenuItem itemm=new JMenuItem("Delete logs "+nodeString+"");
+	  itemm.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+	      removeNodeFromParent((DefaultMutableTreeNode) selPath.getLastPathComponent());
+	    }
+	  });
+	  JPopupMenu jpopup=new JPopupMenu();
+	  jpopup.add(itemm);
+          jpopup.show(jp, e.getX(), e.getY());
+        }
+      }
+    };
+    this.logTree.addMouseListener(ml);
+
     jp.add(new JScrollPane(logTree), BorderLayout.CENTER);    
     
     eventName.put(new Integer(Bundle.ACTIVE),     "ACTIVE     ");
@@ -112,16 +140,24 @@
   public void registerServicePlugin(){}
   public void unregisterServicePlugin(){}
 /* fin a supprimer */
-
-  
+ 
   public void propertyChange(PropertyChangeEvent e){
+    //System.out.println("PCE : "+e.getPropertyName());
     if (e.getPropertyName().equals(Plugin.NEW_NODE_CONNECTION)){
       try{
         MBeanServerConnection mbs=(MBeanServerConnection)e.getNewValue();
         if (nodes.get(mbs)==null){
-System.out.println("Ajout d'un listener " +mbs);
-          ((MBeanServerConnection)e.getNewValue()).addNotificationListener(new ObjectName("OSGI:name=Remote Logger"), this, null, e.getOldValue());
+          //System.out.println("RemoteLogger_jtree add a notification listener on this Remote Logger : "+mbs);
+	  ((MBeanServerConnection)e.getNewValue()).addNotificationListener(new ObjectName("OSGI:name=Remote Logger"), this, null, e.getOldValue());
           nodes.put(mbs, "ok");
+          if(JOptionPane.showConfirmDialog(null,"Do you want \""+this.getName()+"\" ask old log to this gateway :\n"+((String) e.getOldValue())+" ?")==JOptionPane.YES_OPTION) {
+            try {
+	      //System.out.println("   => mosgi.console.component.RemoteLoger_jtree gonna ask the oldLog");
+	      mbs.invoke(new ObjectName("OSGI:name=Remote Logger"), "sendOldLog", new Object[]{}, new String[]{});
+	    } catch (Exception ee) {
+	      System.out.println("   => mosgi.console.component.RemoteLoger_jtree : getOldLog : "+ee);
+	    }
+	  }
         }
       }catch(Exception ex){
         ex.printStackTrace();
@@ -129,59 +165,72 @@
     }
   }
 
-  private DefaultMutableTreeNode createIfNeed(String nodeToCreateAndGet, DefaultMutableTreeNode parent){
+  private DefaultMutableTreeNode createIfNeed(String nodeToCreateAndGet, DefaultMutableTreeNode parent, boolean isOldLog){
     int childNumber=this.getChildCount(parent);
     DefaultMutableTreeNode theNode=null;
     for (int i=0 ; i<childNumber ; i++){ // is node even exist ?
       String string_pool=((DefaultMutableTreeNode)(this.getChild(parent, i))).toString();
       if (string_pool.equals(nodeToCreateAndGet)){
         theNode=(DefaultMutableTreeNode) (this.getChild(parent, i));
-          break;
+        break;
       }
     }
     if (theNode==null){ // create the node
-      theNode=new DefaultMutableTreeNode(nodeToCreateAndGet);	
-      // Unable to set tree expand whithout a first node
+      theNode=new DefaultMutableTreeNode(nodeToCreateAndGet);
+      // Unable to set tree expand whithout a first node:
       if (rootNode.getChildCount()==0){
         this.insertNodeInto(theNode, parent, 0);
         logTree.expandPath(new TreePath(rootNode.getPath()));
-      }else{
-        this.insertNodeInto(theNode, parent, 0);
+      } else{
+        if(isOldLog){
+          this.insertNodeInto(theNode, parent, parent.getChildCount());
+        } else {
+          this.insertNodeInto(theNode, parent, 0);
+        }
       }
     }
-  return theNode;
+    return theNode;
   }
 
   public void handleNotification(Notification notification, Object handback) {
     StringTokenizer st=new StringTokenizer(handback.toString(),":");
+    boolean isOldLog=false;
     String ip=st.nextToken();
     String ref=st.nextToken();
     
-    st = new StringTokenizer(notification.getMessage(),":");
-    Date timeDate=new Date(notification.getTimeStamp());
-    //DateFormat dateFormat = new SimpleDateFormat("hh'h'mm dd-MM-yy");
-    DateFormat df = DateFormat.getTimeInstance(DateFormat.MEDIUM); // use local date format 
-    DateFormat df2 = DateFormat.getDateInstance(DateFormat.SHORT);
-    String time=df.format(timeDate);
-    String date=df2.format(timeDate);
-
+    st = new StringTokenizer(notification.getMessage(),"*");
+    long ts=notification.getTimeStamp();
+    String time="??:??:??";
+    String date="??/??/??";
+    if (ts==0) {
+      isOldLog=true;
+    }
+    if (!isOldLog){
+      Date timeDate=new Date(ts);
+      //DateFormat dateFormat = new SimpleDateFormat("hh'h'mm dd-MM-yy");
+      DateFormat df = DateFormat.getTimeInstance(DateFormat.MEDIUM); // use local date format
+      DateFormat df2 = DateFormat.getDateInstance(DateFormat.SHORT);
+      time=df.format(timeDate);
+      date=df2.format(timeDate);
+    }
     String id=st.nextToken();
     String name=st.nextToken();
     String idname=new String(id+" : "+name);
     String state=""+eventName.get(new Integer((int) Integer.parseInt(st.nextToken())));
     String lvl=st.nextToken();
     String msg=st.nextToken();
-
     // Get and maybe create parents nodes : ip, ref, idname
-    DefaultMutableTreeNode dmtn_ip=createIfNeed(ip, rootNode);
-    DefaultMutableTreeNode dmtn_ref=createIfNeed(ref, dmtn_ip);
-    DefaultMutableTreeNode dmtn_idname=createIfNeed(idname, dmtn_ref);
-
+    DefaultMutableTreeNode dmtn_ip=createIfNeed(ip, rootNode, isOldLog);
+    DefaultMutableTreeNode dmtn_ref=createIfNeed(ref, dmtn_ip, isOldLog);
+    DefaultMutableTreeNode dmtn_idname=createIfNeed(idname, dmtn_ref, isOldLog);
     // insert the leaf with message under id/ref/idname
-    DefaultMutableTreeNode dmtn=new DefaultMutableTreeNode(date+" | "+time+" | "+state+" | "+lvl+" | "+msg,false); 
-    this.insertNodeInto(dmtn, dmtn_idname, 0);
-
-    this.reload(dmtn_idname);
+    DefaultMutableTreeNode dmtn=new DefaultMutableTreeNode(date+" | "+time+" | "+state+" | "+lvl+" | "+msg,false);
+    if (isOldLog){
+      this.insertNodeInto(dmtn, dmtn_idname, dmtn_idname.getChildCount());
+    } else{
+      this.insertNodeInto(dmtn, dmtn_idname, 0);
     }
+    this.reload(dmtn_idname);
+  }
   
 }

Added: incubator/felix/trunk/mosgi.console.component/src/main/resources/icons/OLDLOG.gif
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/mosgi.console.component/src/main/resources/icons/OLDLOG.gif?view=auto&rev=463216
==============================================================================
Binary file - no diff available.

Propchange: incubator/felix/trunk/mosgi.console.component/src/main/resources/icons/OLDLOG.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: incubator/felix/trunk/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/Activator.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/Activator.java?view=diff&rev=463216&r1=463215&r2=463216
==============================================================================
--- incubator/felix/trunk/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/Activator.java (original)
+++ incubator/felix/trunk/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/Activator.java Thu Oct 12 04:54:37 2006
@@ -41,12 +41,13 @@
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 
-
 public class Activator implements BundleActivator {
   protected BundleContext m_context = null;
+
   protected ArrayList m_pluginList = null;
   protected ArrayList m_commonpluginList = null; //TODO To I need this table ?
   private EventListenerList m_listenerList = null;
+  
   private JFrame m_frame = null;
   private NodesTree nodesTree=null;
 
@@ -71,6 +72,9 @@
               if(svcObj instanceof CommonPlugin){
                 m_commonpluginList.add(svcObj);
                 firePropertyChangedEvent(CommonPlugin.COMMON_PLUGIN_ADDED, null, svcObj);
+		//evite d'attendre le Thread pr que le common plugin remotelogger_jtree/jtable chope le MBean remote logger :
+		//nodesTree.tryToConnectAllNodes();
+		//createDefaultNodes(false);
               }else if (svcObj instanceof Plugin){
                 m_pluginList.add(svcObj);
                 firePropertyChangedEvent(Plugin.PLUGIN_ADDED, null, svcObj);
@@ -154,7 +158,8 @@
     m_frame.setVisible(true);
   }
 
-  private synchronized void initializePlugins() {
+  private synchronized void initializePlugins() { // Never used ?
+    System.out.println("??? private synchronized void initializePlugins() ???");
     try {
       // Get all model services.
       Object svcObj=null;
@@ -166,6 +171,7 @@
           if (!m_pluginList.contains(svcObj)) {
             m_pluginList.add(svcObj);
             firePropertyChangedEvent(Plugin.PLUGIN_ADDED, null, (Plugin)svcObj);
+	    //this.nodesTree.valueChanged(null);
           }
         }
       }
@@ -177,6 +183,7 @@
           if (!m_commonpluginList.contains(svcObj)) {
             m_commonpluginList.add(svcObj);
             firePropertyChangedEvent(CommonPlugin.COMMON_PLUGIN_ADDED, null, (CommonPlugin)svcObj);
+	    //this.nodesTree.valueChanged(null);
           }
         }
       }
@@ -196,9 +203,9 @@
     }
   }
 
-  //
-  // Event methods.
-  //
+  //////////////////////////////
+  // Event methods.           //
+  //////////////////////////////
   public void addPropertyChangeListener(PropertyChangeListener l) {
     m_listenerList.add(PropertyChangeListener.class, l);
   }
@@ -209,12 +216,23 @@
 
   public void firePropertyChangedEvent(String name, Object oldValue, Object newValue) {
     PropertyChangeEvent event = null;
-
     // Guaranteed to return a non-null array
     Object[] listeners = m_listenerList.getListenerList();
 
+/* a supprimer de ici
+    String mb="";
+    //System.out.println("name="+name);
+    if(name.equals("pluggin_added") | name.equals("pluggin_removed")){
+      mb="java.awt.Component";
+    } else {
+      mb=newValue.toString();
+      mb=mb.substring((mb.indexOf("$")==-1)?0:mb.indexOf("$")+1,mb.length());
+    }
+    System.out.println("console.gui whill firePCE "+(int)(listeners.length/2)+"* : (this,"+name+","+oldValue+","+mb+")");
+/* a ici */
+
     // Process the listeners last to first, notifying
-    // those that are interested in this event
+    // those that are interested in this event 
     for (int i = listeners.length - 2; i >= 0; i -= 2) {
       if (listeners[i] == PropertyChangeListener.class) {
         // Lazily create the event:

Modified: incubator/felix/trunk/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/NodeCellRenderer.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/NodeCellRenderer.java?view=diff&rev=463216&r1=463215&r2=463216
==============================================================================
--- incubator/felix/trunk/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/NodeCellRenderer.java (original)
+++ incubator/felix/trunk/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/NodeCellRenderer.java Thu Oct 12 04:54:37 2006
@@ -38,12 +38,8 @@
     this.nodesTree=nt;
   }
 
-	public Component getTreeCellRendererComponent(JTree tree, Object value,
-			boolean sel, boolean expanded, boolean leaf, int row,
-			boolean hasFocus) {
-
-		super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf,
-				row, hasFocus);
+  public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
+    super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
     String val=value.toString();
     if (!val.equals(NodesTree.TOP_NAME)){ 
       if (nodesTree.isNodeConnected(val)){

Modified: incubator/felix/trunk/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/NodePanel.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/NodePanel.java?view=diff&rev=463216&r1=463215&r2=463216
==============================================================================
--- incubator/felix/trunk/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/NodePanel.java (original)
+++ incubator/felix/trunk/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/NodePanel.java Thu Oct 12 04:54:37 2006
@@ -48,152 +48,149 @@
 
 public class NodePanel extends JTabbedPane implements PropertyChangeListener, ChangeListener {
   //private String repo;
-  private Activator m_activator = null;
-  private BundleContext m_context = null;
+  private Activator a=null;
+  private BundleContext m_context=null;
   
-  private Hashtable pluginList = null;
+  private Hashtable pluginList=null;
 
   public NodePanel(Activator activator, BundleContext context){
-    m_context = context;
-    m_activator = activator;
-    m_activator.addPropertyChangeListener(this);
-    this.pluginList = new Hashtable();
+    this.m_context=context;
+    this.a=activator;
+    a.addPropertyChangeListener(this);
+    this.pluginList=new Hashtable();
     //repo = m_context.getProperty("mosgi.jmxconsole.repository");
     this.addChangeListener(this);
   }
 
   //////////////////////////////////////
-  // ChangeListener Implementation
+  // ChangeListener Implementation    //
   //////////////////////////////////////
   public void stateChanged(ChangeEvent e){
-//   System.out.println("coucou => "+((JTabbedPane)e.getSource()).getSelectedIndex()+":"+((JTabbedPane)e.getSource()).getSelectedComponent().getName());
-   if (this.getSelectedComponent()!=null){
-     m_activator.firePropertyChangedEvent(Plugin.PLUGIN_ACTIVATED, null, this.getSelectedComponent().getName());
-   }
+    //   System.out.println("coucou => "+((JTabbedPane)e.getSource()).getSelectedIndex()+":"+((JTabbedPane)e.getSource()).getSelectedComponent().getName());
+    if (this.getSelectedComponent()!=null){
+      a.firePropertyChangedEvent(Plugin.PLUGIN_ACTIVATED, null, this.getSelectedComponent().getName());
+    }
   }
 
-
   public void propertyChange(PropertyChangeEvent event) {
     if (event.getPropertyName().equals(Plugin.PLUGIN_ADDED)) {
-      Plugin cp = (Plugin) event.getNewValue();
+      Plugin cp=(Plugin) event.getNewValue();
       this.add(cp.getName(), cp.getGUI());
-System.out.println("add gui "+cp.getName()+" :: "+cp.getGUI());      
-      this.m_activator.addPropertyChangeListener(cp);
-      this.pluginList.put(cp.pluginLocation(), cp);
-      
+      System.out.println("Add gui \""+cp.getName()+"\" into NodePanel"/*+" :: "+cp.getGUI()*/);      
+      this.a.addPropertyChangeListener(cp);
+      this.pluginList.put(cp.pluginLocation(), cp); 
     }else if(event.getPropertyName().equals(Plugin.PLUGIN_REMOVED)) {
       Plugin cp = (Plugin) event.getNewValue();
       this.remove(cp.getGUI());
-      this.m_activator.removePropertyChangeListener(cp);
-//			this.pluginList.remove(cp.pluginLocation());
-      
+      this.a.removePropertyChangeListener(cp);
+      //	this.pluginList.remove(cp.pluginLocation());
     }else if(event.getPropertyName().equals(Plugin.EMPTY_NODE)) {
-System.out.println("******* Debug No node selected");
+      System.out.println("******* Debug No node selected");
       this.clean();
     }else if (event.getPropertyName().equals(Plugin.NEW_NODE_SELECTED)) {
-//System.out.println("Event NEW_NODE_SELECTED");
-    /* Update the tabs (Plugin) in the JTabbedPane (NodePanel) */
+      //System.out.println("Event NEW_NODE_SELECTED");
+      /* Update the tabs (Plugin) in the JTabbedPane (NodePanel) */
       MBeanServerConnection mbsc = (MBeanServerConnection)event.getNewValue();
       try {
 	this.clean();
-
         Set ons = mbsc.queryNames( null, null );
+        String msg="";
         for( Iterator i=ons.iterator(); i.hasNext(); ) {
-          ObjectName name = ( ObjectName )i.next();
-System.out.println("Queried name: "+name.toString());
+	  ObjectName name = ( ObjectName )i.next();
+          msg="Queried name: "+name.toString();
           if ( "TabUI".equals(name.getDomain()) ) {
-System.out.println("New tab: "+name.toString());
+            msg+=" New tab: "+name.toString();
 	    /* Get the plugin implementation via a bundle */
 	    String tabBundle = (String) mbsc.getAttribute(name, "BundleName");
-System.out.println("Bundle name for current Plugin: "+tabBundle);
+            msg+=" Bundle name for current Plugin: "+tabBundle;
 	    if (tabBundle!=null){
               Plugin p = (Plugin) this.pluginList.get(tabBundle);
               if (p == null){
   	          Bundle b = m_context.installBundle(tabBundle);
 		  b.start();
-System.out.println("Bundle started");
-//Thread.sleep(5000);
-               }else{
-System.out.println("register service plugin: " + p);
-                 p.registerServicePlugin();
-               }
-
-//             ServiceReference[] sr = b.getRegisteredServices();
-//             System.out.println(sr);
-//             Plugin p;
-//             for (int j=0 ; j < sr.length ; j++) {
-//               p=(Plugin)m_context.getService(sr[j]);
-//               this.add(p.getName(), p.getGUI());
-//               this.m_activator.addPropertyChangeListener(p);
-//             }
-
-//               System.out.println("Delegation for this");
-//               printcl = this.getClass().getClassLoader();
-//               while (printcl != null) {
-//                 System.out.println(printcl);
-//                 printcl = printcl.getParent();
-//               }
-//               System.out.println("{bootstrap loader}");
-//               System.out.println("");
+                  System.out.println(msg+" Bundle started");
+                  //Thread.sleep(5000);
+              }else{
+                System.out.println(msg+" Register service plugin: " + p);
+                p.registerServicePlugin();
+              }
+
+//            ServiceReference[] sr = b.getRegisteredServices();
+//            System.out.println(sr);
+//            Plugin p;
+//            for (int j=0 ; j < sr.length ; j++) {
+//              p=(Plugin)m_context.getService(sr[j]);
+//              this.add(p.getName(), p.getGUI());
+//              this.a.addPropertyChangeListener(p);
+//            }
+
+//            System.out.println("Delegation for this");
+//            printcl = this.getClass().getClassLoader();
+//            while (printcl != null) {
+//              System.out.println(printcl);
+//              printcl = printcl.getParent();
+//            }
+//            System.out.println("{bootstrap loader}");
+//            System.out.println("");
 
-					/* Get the tab object */
-//             Object tabObj = mbsc.getAttribute(name, "Tab");
+              /* Get the tab object */
+//            Object tabObj = mbsc.getAttribute(name, "Tab");
 // 
-//               System.out.println("Delegation for tabObj: " + tabObj);
-//               printcl = tabObj.getClass().getClassLoader();
-//               while (printcl != null) {
-//                 System.out.println(printcl);
-//                 printcl = printcl.getParent();
-//               }
-//               System.out.println("{bootstrap loader}");
-//               System.out.println("");
+//            System.out.println("Delegation for tabObj: " + tabObj);
+//            printcl = tabObj.getClass().getClassLoader();
+//            while (printcl != null) {
+//              System.out.println(printcl);
+//              printcl = printcl.getParent();
+//            }
+//            System.out.println("{bootstrap loader}");
+//            System.out.println("");
   
-//          System.out.println("tabObj.getName(): " + ((fr.inria.ares.managedelements.testprobe.tab.TestProbeTabUI) tabObj).getName());
+//            System.out.println("tabObj.getName(): " + ((fr.inria.ares.managedelements.testprobe.tab.TestProbeTabUI) tabObj).getName());
               
-          /* Cast the tab */  
+              /* Cast the tab */  
 //            Plugin tab = (Plugin)tabObj;
-          /* register the tab on the JTabbedPane */
+              /* register the tab on the JTabbedPane */
 //            this.add(tab.getName(), tab.getGUI());
             }else{
-	      System.out.println("No "+tabBundle+" property defined. I cannot install "+tabBundle+" tab");
+	      System.out.println(msg+" No "+tabBundle+" property defined. I cannot install "+tabBundle+" tab");
             }
           }
         }
-        m_activator.firePropertyChangedEvent(Plugin.NEW_NODE_READY, null, mbsc);
-        m_activator.firePropertyChangedEvent(Plugin.PLUGIN_ACTIVATED, null, this.getComponentAt(0).getName());
-
+        a.firePropertyChangedEvent(Plugin.NEW_NODE_READY, null, mbsc);
+        a.firePropertyChangedEvent(Plugin.PLUGIN_ACTIVATED, null, this.getComponentAt(0).getName());
 
       } catch (MBeanException e) {
-          System.err.println(e);
-//        } catch (MalformedObjectNameException e) {
-//          System.err.println(e);
+        System.err.println("MBeanException : "+e);
+//    } catch (MalformedObjectNameException e) {
+//      System.err.println(e);
       } catch (AttributeNotFoundException e) {
-        System.err.println(e);
+        System.err.println("AttributeNotFoundException : "+e);
       } catch (InstanceNotFoundException e) {
-        System.err.println(e);
+        System.err.println("InstanceNotFoundException : "+e);
       } catch (ReflectionException e) {
-        System.err.println(e);
+        System.err.println("ReflectionException : "+e);
       } catch (IOException e) {
-        System.err.println(e);
+        System.err.println("IOException : "+e);
       } catch (BundleException e) {
-        System.err.println(e);
+        System.err.println("BundleException : "+e);
+      } catch (Exception e) {
+        System.err.println("Exception : "+e);
       }
-      
-//       catch (java.lang.InterruptedException e) {
-// 	      System.err.println(e);
-//       }
+//    } catch (java.lang.InterruptedException e) {
+//      System.err.println(e);
+//    }
     }
   }
 
   private void clean(){
     this.removeAll();
     for ( Iterator i=pluginList.keySet().iterator(); i.hasNext();) {
-     Object o=i.next();
-     try {
-      ((Plugin) pluginList.get(o)).unregisterServicePlugin();
-     }catch(Exception e){
-      System.out.println("INFO Something went wrong when unregistering the Plugin. Please control the beavior of the unregisterServicePlugin function of this tab"+o);
-     }
+      Object o=i.next();
+      try {
+        ((Plugin) pluginList.get(o)).unregisterServicePlugin();
+      } catch(Exception e){
+        System.out.println("INFO Something went wrong when unregistering the Plugin. Please control the beavior of the unregisterServicePlugin function of this tab"+o);
+      }
     }
   }
 

Modified: incubator/felix/trunk/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/NodesTree.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/NodesTree.java?view=diff&rev=463216&r1=463215&r2=463216
==============================================================================
--- incubator/felix/trunk/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/NodesTree.java (original)
+++ incubator/felix/trunk/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/NodesTree.java Thu Oct 12 04:54:37 2006
@@ -18,8 +18,14 @@
  */
 package org.apache.felix.mosgi.console.gui;
 
-import java.awt.GridLayout;
-import java.util.Hashtable;
+//import java.awt.GridLayout;
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import javax.swing.JOptionPane;
+
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.JTree;
@@ -28,10 +34,14 @@
 import javax.swing.tree.DefaultMutableTreeNode;
 import javax.swing.tree.DefaultTreeModel;
 import javax.swing.tree.TreeSelectionModel;
+import javax.swing.tree.TreePath;
+import javax.swing.JButton;
 
+import java.util.Hashtable;
+import java.util.Enumeration;
 import org.osgi.framework.BundleContext;
-
 import org.apache.felix.mosgi.console.ifc.Plugin;
+import org.apache.felix.framework.cache.BundleCache;
 
 import javax.management.MBeanServerConnection;
 import javax.management.ObjectName;
@@ -43,91 +53,105 @@
 import javax.management.remote.JMXServiceURL;
 import javax.management.remote.JMXConnectionNotification;
 
-import org.apache.felix.framework.cache.BundleCache;
+//import javax.jmdns.ServiceInfo;
 
+public class NodesTree extends JPanel implements TreeSelectionListener, NotificationListener, ActionListener {
 
-public class NodesTree extends JPanel implements TreeSelectionListener, NotificationListener {
   static String TOP_NAME="Servers";
-  static int POOLING_TIME=10000;
-
-	protected JTree tree;
-  private DefaultTreeModel dtm;
-	private Hashtable connectedNodes = new Hashtable();
-	private Hashtable jmxConnectors = new Hashtable();
-	private DefaultMutableTreeNode top = null;
-  protected boolean cont=true;
+  static int POOLING_TIME=2000;
+  static String JMX_SERVICE_URL="service:jmx:rmi:///jndi/rmi://";
+  private static boolean useSystemLookAndFeel = false;
   
-	private static boolean useSystemLookAndFeel = false;
-
   private Activator a;
   private BundleContext bc;
-  private PoolingThread pt;
-  protected Thread poolThread;
+  
+  protected JTree tree;
+  private DefaultTreeModel dtm;
+  private DefaultMutableTreeNode top = null;
   private NodeCellRenderer ncr;
-  private Hashtable nodes=new Hashtable();
+  private JButton addNodeButton;
+  private JButton removeNodeButton;
 
+  private Hashtable connectedNodes = new Hashtable();
+  private Hashtable jmxConnectors = new Hashtable();
+  private Hashtable nodes=new Hashtable();
+ 
+  protected boolean cont=true; 
+  private PoolingThread pt;
+  protected Thread poolThread;
+  
+  private boolean isAllNodesConnected=false;
 
-	public NodesTree(Activator a,BundleContext bc) {
-		super(new GridLayout(1, 0));
+  public NodesTree(Activator a,BundleContext bc) {
+    super(new BorderLayout());
+    //super(new GridLayout(1, 0));
     this.a=a;
     this.bc=bc;
     this.pt=new PoolingThread();
     
-		System.setProperty("java.security.policy", "client.policy");
-		top = new DefaultMutableTreeNode(NodesTree.TOP_NAME);
+    System.setProperty("java.security.policy", "client.policy");
+    top=new DefaultMutableTreeNode(NodesTree.TOP_NAME);
     dtm=new DefaultTreeModel(top);
-		tree = new JTree(dtm);
+    tree=new JTree(dtm);
     tree.setCellRenderer(ncr=new NodeCellRenderer(bc,this));
-		tree.addTreeSelectionListener(this);
-		tree.getSelectionModel().setSelectionMode(
-				TreeSelectionModel.SINGLE_TREE_SELECTION);
+    tree.addTreeSelectionListener(this);
+    tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
 
-		JScrollPane treeView = new JScrollPane(tree);
-		add(treeView);
-	}
+    JScrollPane treeView=new JScrollPane(tree);
+    add(createButtonPanel(), BorderLayout.NORTH);
+    add(treeView, BorderLayout.CENTER);
+  }
 
   public void runDiscovery(){
-	this.createDefaultNodes(true);
+    this.createDefaultNodes();
     poolThread=new Thread(this.pt);
     poolThread.start();
   }
 
+
+
+
   //////////////////////////////////////////////////////
-  //               TreeSelectionListener //
+  //               TreeSelectionListener              //
   //////////////////////////////////////////////////////
-	public void valueChanged(TreeSelectionEvent e) {
-//    System.out.println("coucou, value changed");
-		DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
-	  String selectedNode=(String)node.getUserObject();
-    if (!selectedNode.equals(NodesTree.TOP_NAME)){
-      Object mbsc=connectedNodes.get(selectedNode);
-      if (mbsc!=null){
-        a.firePropertyChangedEvent(Plugin.NEW_NODE_SELECTED, selectedNode, mbsc);
-      }else{
-        a.firePropertyChangedEvent(Plugin.EMPTY_NODE, null, "null");
+  public void valueChanged(TreeSelectionEvent e) {
+    //System.out.println("Value changed : e="+e);
+    DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
+    if (node!=null) {
+      String selectedNode=(String)node.getUserObject();
+      if (!selectedNode.equals(NodesTree.TOP_NAME)){
+        Object mbsc=connectedNodes.get(selectedNode);
+        if (mbsc!=null){
+	  //tryToConnectAllNodes();
+	  //createDefaultNodes(false);
+          a.firePropertyChangedEvent(Plugin.NEW_NODE_SELECTED, selectedNode, mbsc);
+        }else{
+          a.firePropertyChangedEvent(Plugin.EMPTY_NODE, null, "null");
+        }
       }
     }
-	}
+  }
 
   ////////////////////////////////////////////////////
   //            NotificationListener                //
   ////////////////////////////////////////////////////
   public void handleNotification(Notification notification, Object handback) {
-//    System.out.println("Connection ==> "+notification.getMessage()+":"+((JMXConnectionNotification)notification).getConnectionId()+":"+handback);
+    //    System.out.println("Connection ==> "+notification.getMessage()+":"+((JMXConnectionNotification)notification).getConnectionId()+":"+handback);
     if ( !JMXConnectionNotification.OPENED.equals(notification.getType()) ){
       this.disconnectFromNode((String)handback);
       tree.treeDidChange();
+      isAllNodesConnected=false;
     }
   }
   
   ////////////////////////////////////////////////////
-  //            Friend methods //
-  ///////////////////////////////////////////////////
-  void stop(){
+  //            Friend methods                      //
+  ////////////////////////////////////////////////////
+  void stop(){ //Never used ... ???
     this.cont=false;
   }
 
-  boolean isNodeConnected(String s){
+  boolean isNodeConnected(String s){//Never used ... ???
     if (this.connectedNodes.get(s)==null){
       return false;
     }else{
@@ -135,80 +159,80 @@
     }
   }
 
+  public void actionPerformed(ActionEvent e) {
+    Object object = e.getSource();
+    if (object==addNodeButton) {
+      String connString = JOptionPane.showInputDialog("Please input a connection string : ", "127.0.0.1:1099/vosgi");
+      TreePath tp=tree.getSelectionPath();
+      if (connString!=null) {
+	createTreeNode(connString,null,null);
+	dtm.reload(top);
+	isAllNodesConnected=false;
+	tree.setSelectionPath(tp);
+      }
+    } else if (object==removeNodeButton) {
+      DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
+      String connString=(String) node.getUserObject();
+      if (connString!=null){
+        if (!node.equals(top)){
+	  if(JOptionPane.showConfirmDialog(null,"Sure we remove \""+connString+"\" node ?")==JOptionPane.YES_OPTION) {
+	    if (top.getChildCount()>1){
+              disconnectFromNode(connString);
+	      dtm.removeNodeFromParent(node);
+	      System.out.println("Remove node : "+(String) (node.getUserObject()));
+	    }
+          }
+	}
+      }
+    }
+  }
+
   ///////////////////////////////////////////////////
-  //           Private part //
+  //           Private part                        //
   ///////////////////////////////////////////////////
-  protected void createDefaultNodes(boolean createTreeNode) {
-    String profile;
-    String rmiPort;
-    String ip;
-    
-    int i=1;
-    profile=bc.getProperty("mosgi.jmxconsole.profile." + i);
-
-    while (profile!=null){
-      rmiPort=bc.getProperty("mosgi.jmxconsole.rmiport."+profile);
-      if (rmiPort==null){rmiPort="1099";}
-      String virtual=bc.getProperty("mosgi.jmxconsole.core."+profile);
-      ip=bc.getProperty("mosgi.jmxconsole.ip." + i);
-      String connString=ip+":"+rmiPort+"/"+profile;
-      if (createTreeNode){
-        DefaultMutableTreeNode dmtn=new DefaultMutableTreeNode(connString);
-        DefaultMutableTreeNode parent=top;
-        if (virtual==null){
-          nodes.put(connString, dmtn);
-        }else{
-          String parentString=ip+":"+virtual;
-          parent=(DefaultMutableTreeNode)nodes.get(parentString);
+  protected void tryToConnectAllNodes(){
+    //boolean oldTreeState=isAllNodesConnected;
+    isAllNodesConnected=true;
+    String connString="";
+    Enumeration enu=top.breadthFirstEnumeration();
+    while (enu.hasMoreElements()) {
+      DefaultMutableTreeNode dmtn_tmp=(DefaultMutableTreeNode) enu.nextElement();
+      if (dmtn_tmp!=top) {
+        connString=(String) dmtn_tmp.getUserObject();
+        if (!this.connectToNode(connString)) {
+          isAllNodesConnected=false;
         }
-        parent.add(dmtn);
       }
-      this.connectToNode(connString);
-      i++;
-      profile=bc.getProperty("mosgi.jmxconsole.profile." + i);
     }
-      
-    if (i==1){
-      try{
-        System.out.println("No property mosgi.jmxconsole.profile., managing local profile");
-		String prof=bc.getProperty(BundleCache.CACHE_PROFILE_PROP);
-    	if (prof==null){
-	      prof=System.getProperty(BundleCache.CACHE_PROFILE_PROP);
-		}
-        String connString=java.net.InetAddress.getLocalHost().getHostAddress()+":1099/"+prof;
-        if (createTreeNode){
-          top.add(new DefaultMutableTreeNode(connString));
+    /*Enumeration dmtns_std=top.children();
+    while (dmtns_std.hasMoreElements()){
+      DefaultMutableTreeNode dmtn_std=(DefaultMutableTreeNode) dmtns_std.nextElement();
+      connString=(String) dmtn_std.getUserObject();
+      //System.out.println("   -connectToNode("+connString+")");
+      if (!this.connectToNode(connString)) {
+        isAllNodesConnected=false;
+      }
+      Enumeration dmtns_virtual=dmtn_std.children();
+      while (dmtns_virtual.hasMoreElements()){
+        DefaultMutableTreeNode dmtn_virtual=(DefaultMutableTreeNode) dmtns_virtual.nextElement();
+        connString=(String) dmtn_virtual.getUserObject();
+	//System.out.println("      -connectToNode("+connString+")");
+        if (!this.connectToNode(connString)) {
+          isAllNodesConnected=false;
         }
-//        this.connectToNode(connString);
-      }catch(Exception e){
-        e.printStackTrace();
       }
-    }
+    }*/
+    //if(oldTreeState!=isAllNodesConnected){
+    //  System.out.println("AllNodesConnected="+isAllNodesConnected);
+    //}
   }
 
-  private void disconnectFromNode(String connString){
-    JMXConnector jmxc=(JMXConnector)this.jmxConnectors.remove(connString);
-    MBeanServerConnection mbscl=(MBeanServerConnection)this.connectedNodes.remove(connString);
-    try{
-      jmxc.removeConnectionNotificationListener(this);
-      //mbscl.removeNotificationListener(new ObjectName("OSGI:name=OSGi
-      // Server"), this); // Does not work since the connexion is lost !!
-      jmxc.close();
-      a.firePropertyChangedEvent(Plugin.EMPTY_NODE, null, "null");
-    }catch (Exception e){
-      e.printStackTrace();
-    }
-    jmxc=null;
-    mbscl=null;
-  }
-     
-  private void connectToNode(String connString){
+  private boolean connectToNode(String connString){
     Object ls=this.connectedNodes.get(connString);
     if (ls==null){
-      JMXConnector jmxc = null;
+      JMXConnector jmxc=null;
       try {
-
-        JMXServiceURL surl = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + connString);
+        JMXServiceURL surl=new JMXServiceURL(NodesTree.JMX_SERVICE_URL+connString);
 /*
 Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
 System.out.println("=====> "+java.util.logging.Logger.getLogger("javax.management.remote.misc"));
@@ -219,39 +243,53 @@
 ch.setLevel(java.util.logging.Level.FINEST);
 java.util.logging.Logger.getLogger("javax.management.remote.misc").addHandler(ch);
 java.util.logging.Logger.getLogger("javax.management.remote.rmi").addHandler(ch);
-*/
-				
+*/				
         jmxc = JMXConnectorFactory.connect(surl);
         MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
         if (mbsc.isRegistered(new ObjectName("OSGI:name=Remote Logger"))){
           jmxc.addConnectionNotificationListener(this, null, connString);
-          mbsc.addNotificationListener(new ObjectName("TabUI:name=OsgiProbes"), this, null, null); //Needed,
-
+          mbsc.addNotificationListener(new ObjectName("TabUI:name=OsgiProbes"), this, null, null); //Needed ???
           this.connectedNodes.put(connString, mbsc);
           this.jmxConnectors.put(connString, jmxc);
           a.firePropertyChangedEvent(Plugin.NEW_NODE_CONNECTION, connString, mbsc);
- System.out.println("Node "+connString+" connected");
+	  // If new connected is the selected one then create a false valueChanged in order to load the NodePanel :
+	  DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent(); 
+	  if (node!=null) {
+  	    if (connString.equals((String)node.getUserObject())){
+	      this.valueChanged(null);
+            }
+	  }
+	  System.out.println("Node "+connString+" connected");
+	  return true;
         }else {
-System.out.println("The Remote Logger of "+connString+" is not started");
+          System.out.println("The Remote Logger of "+connString+" is not started");
+	  return false;
         }
       }catch(java.io.IOException ex){
-System.out.println("Impossible to connect to "+connString);
+        //System.out.println("Impossible to connect to "+connString);
       }catch(MalformedObjectNameException e){
         e.printStackTrace();
       }catch(Exception e){
-        e.printStackTrace();
+        //e.printStackTrace();
+	System.out.println("gui.NodesTree.connectToNode("+connString+") : "+e);
+	System.out.println("  => Delete this node ? to implement... ?");
+
       }
     }else{
-      a.firePropertyChangedEvent(Plugin.NEW_NODE_CONNECTION, connString, ls);
+      // a.firePCE(NEW_NODE_CONNECTION, connString, ls) inutile maintenant je sais plus pourqouoi ca l'etait d'ailleur ???
+      return true;
     }
+  return false;
   }
 
   protected class PoolingThread implements Runnable{
     public void run(){
       while (cont){
-        createDefaultNodes(false);
-        tree.treeDidChange();
-        try{
+        if (!isAllNodesConnected) {
+	  tryToConnectAllNodes();
+          tree.treeDidChange();
+        } 
+	try{
           Thread.sleep(POOLING_TIME);
         }catch(InterruptedException e){
           e.printStackTrace();
@@ -259,4 +297,101 @@
       }
     }
   }
+
+  private void createTreeNode(String connString, String ip, String virtual){
+    System.out.println("Add a gateway : ip="+ip+" connString="+connString+" virtual="+virtual);
+    DefaultMutableTreeNode dmtn=new DefaultMutableTreeNode(connString);
+    DefaultMutableTreeNode parent=top;
+    if (virtual==null){
+      nodes.put(connString, dmtn);
+    }else{
+      String parentString=ip+":"+virtual;
+      parent=(DefaultMutableTreeNode)nodes.get(parentString);
+    }
+    parent.add(dmtn);
+  }
+
+  protected void createDefaultNodes() {
+    String profile;
+    String rmiPort;
+    String ip;
+    int i=1;
+    profile=bc.getProperty("mosgi.jmxconsole.profile." + i);
+
+    while (profile!=null){
+      rmiPort=bc.getProperty("mosgi.jmxconsole.rmiport."+profile);
+      if (rmiPort==null) {rmiPort="1099";}
+      String virtual=bc.getProperty("mosgi.jmxconsole.core."+profile);
+      ip=bc.getProperty("mosgi.jmxconsole.ip."+i);
+      String connString=ip+":"+rmiPort+"/"+profile;
+      createTreeNode(connString, ip, virtual);
+      i++;
+      profile=bc.getProperty("mosgi.jmxconsole.profile." + i);
+    }
+
+    // Kesako ???
+    if (i==1){
+      try{
+        System.out.println("No property mosgi.jmxconsole.profile., managing local profile");
+	String prof=bc.getProperty(BundleCache.CACHE_PROFILE_PROP);
+    	if (prof==null){
+	  prof=System.getProperty(BundleCache.CACHE_PROFILE_PROP);
+	}
+        String connString=java.net.InetAddress.getLocalHost().getHostAddress()+":1099/"+prof;
+        top.add(new DefaultMutableTreeNode(connString));
+      }catch(Exception e){
+        e.printStackTrace();
+      }
+    }
+  }
+
+  private void disconnectFromNode(String connString){
+    JMXConnector jmxc=(JMXConnector)this.jmxConnectors.remove(connString);
+    MBeanServerConnection mbscl=(MBeanServerConnection)this.connectedNodes.remove(connString);
+    System.out.println("mbscl="+mbscl);
+    if (jmxc!=null) {
+      try{
+        jmxc.removeConnectionNotificationListener(this);
+        //mbscl.removeNotificationListener(new ObjectName("OSGI:name=OSGi
+        // Server"), this); // Does not work since the connexion is lost !!
+        jmxc.close();
+
+        // firePCE Plugin.EMPTY_NODE only if it's the selected one
+        DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent(); 
+        if (node!=null) {
+	  if (connString.equals((String)node.getUserObject())){
+            a.firePropertyChangedEvent(Plugin.EMPTY_NODE, null, "null");
+	  }
+        }
+      }catch (Exception e){
+        e.printStackTrace();
+      }
+      jmxc=null;
+    }
+    mbscl=null;
+  }
+     
+  private JPanel createButtonPanel(){
+    JPanel buttonPanel=new JPanel(new FlowLayout(FlowLayout.CENTER,2,2));
+    //border...
+    addNodeButton=new MyButton('a', " + ", this, buttonPanel);
+    removeNodeButton=new MyButton('d', " - ", this, buttonPanel);
+    return buttonPanel;
+  }
+
+  static class MyButton extends JButton {
+    private int W =55;
+    private int H = 25;
+
+    public MyButton(char c, String name, NodesTree listener, JPanel panel) {
+      super.setText(name);
+      super.setMnemonic(c);
+      super.setMinimumSize(new Dimension(W, H));
+      super.setPreferredSize(new Dimension(W, H));
+      super.setMaximumSize(new Dimension(W, H));
+      super.addActionListener(listener);
+      panel.add(this);
+    }
+  }
+
 }

Modified: incubator/felix/trunk/mosgi.jmx.remotelogger/src/main/java/org/apache/felix/mosgi/jmx/remotelogger/Logger.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/mosgi.jmx.remotelogger/src/main/java/org/apache/felix/mosgi/jmx/remotelogger/Logger.java?view=diff&rev=463216&r1=463215&r2=463216
==============================================================================
--- incubator/felix/trunk/mosgi.jmx.remotelogger/src/main/java/org/apache/felix/mosgi/jmx/remotelogger/Logger.java (original)
+++ incubator/felix/trunk/mosgi.jmx.remotelogger/src/main/java/org/apache/felix/mosgi/jmx/remotelogger/Logger.java Thu Oct 12 04:54:37 2006
@@ -38,6 +38,7 @@
 import javax.management.MalformedObjectNameException;
 
 import java.io.Serializable;
+import java.util.Enumeration;
 
 public class Logger extends NotificationBroadcasterSupport implements LogListener,BundleActivator,ServiceListener, LoggerMBean, Serializable{
 
@@ -58,6 +59,15 @@
   private MBeanServer agent=null;
   private ObjectName remoteLoggerON=null;
 
+//LogerMBean Interface
+  public void sendOldLog(){
+    System.out.println("mosgi.jmx.remoteLogger.Logger : send old log");
+    Enumeration oldLog = this.lrs.getLog();
+    while(oldLog.hasMoreElements()) {
+      logged((LogEntry)(oldLog.nextElement()),true);
+    }
+  }
+
 //ServiceListener Interface
   public void serviceChanged(ServiceEvent serviceevent) {
     ServiceReference servicereference= serviceevent.getServiceReference();
@@ -72,7 +82,7 @@
 	break;
       case ServiceEvent.UNREGISTERING :
         if (as[0].equals(LogReaderService.class.getName())){
-				  this.unRegisterLogReaderService(servicereference);
+	  this.unRegisterLogReaderService(servicereference);
         }else if (as[0].equals(MBeanServer.class.getName())){
           this.unRegisterFromAgent();
         }
@@ -83,13 +93,21 @@
 
 //LogListener Interface
   public void logged(LogEntry log){
-    String reg=new String(":");
+    logged(log, false);
+  }
+  public void logged(LogEntry log, boolean oldLog){
+    String reg=new String("*");
     StringBuffer message=new StringBuffer();
     //System.out.print("mosgi.jmx.remotelogger : new log : ");
 
     synchronized (logMutex){
       try{
-        message.append(""+log.getBundle().getBundleId());
+        long id=log.getBundle().getBundleId();
+	if (id<10) {
+	  message.append(" "+id);
+	} else{
+          message.append(""+id);
+	}
       }catch(NullPointerException e){
         message.append("Unknown source");
       }
@@ -115,23 +133,30 @@
       }else {
         message.append(reg+"NOLEVEL");
       }
-
-      message.append(reg+log.getMessage());
+	 
+      // into log.getMessage() replaceAll regex char by an other
+      String msg=log.getMessage();
+      if (msg!=null){
+	message.append(reg+msg.replace('*','X'));
+      } else {
+	message.append(reg+"\"null\"");
+      }
     }
     //System.out.println(message.toString());
     if (this.agent!=null){ // On envoie tous les logs a un MBeanServer
       //System.out.println("this.agent != null => remoteLogger.Logger.sendNotifiaction(...."+message.toString());
+      //System.out.println("RemoteLogger send notification : "+oldLog+" : "+message.toString()); 
       this.sendNotification(new  AttributeChangeNotification(this.remoteLoggerON, 0, 
-						             System.currentTimeMillis(),
+						             (oldLog)?0:System.currentTimeMillis(),
 						             message.toString(), null, "Log", null, null));
     }
   }
 
 //BundleActivator Interface
   public void start(BundleContext bc) throws Exception{
-		this.version=(String)bc.getBundle().getHeaders().get(Constants.BUNDLE_VERSION);
+    this.version=(String)bc.getBundle().getHeaders().get(Constants.BUNDLE_VERSION);
     this.bc=bc;
-		this.log(LogService.LOG_INFO, "Remote Logger starting "+version);
+    this.log(LogService.LOG_INFO, "Remote Logger starting "+version);
     try{
       this.remoteLoggerON=new ObjectName(Logger.REMOTE_LOGGER_ON_STRING);
     }catch(MalformedObjectNameException e){
@@ -157,7 +182,7 @@
   }
      
   public void stop(BundleContext bc) throws Exception{
-	this.log(LogService.LOG_INFO, "Stopping remote Logger "+version);
+   this.log(LogService.LOG_INFO, "Stopping remote Logger "+version);
    if (this.lrs==null){
       System.out.println("ERROR : Logger.stop : there is no logger or reader to stop");
    } else {
@@ -178,16 +203,6 @@
     //System.out.println("mosgi.jmx.remoteLogger.Logger.registerLogReaderService("+sr.toString()+") : oldLog=");
     this.lrs=(LogReaderService)this.bc.getService(sr);
     this.lrs.addLogListener(this);
-   
-    /*// old log :
-    System.out.println("oldLog=");
-    java.util.Enumeration oldLog = this.lrs.getLog();
-    int i=0;
-    while(oldLog.hasMoreElements()) {
-      LogEntry oldLogEntry = ((LogEntry) oldLog.nextElement());
-      System.out.println("   -"+(i++)+" : "+oldLogEntry.getMessage());
-      //logged(oldLogEntry);
-    }*/
   }
   
   private void unRegisterLogReaderService(ServiceReference sr) {
@@ -201,15 +216,6 @@
     this.agent=(MBeanServer)bc.getService(sr);
     try{   
       this.agent.registerMBean(this, this.remoteLoggerON); 
-      /*// old log :
-      System.out.println("oldLog=");
-      java.util.Enumeration oldLog = this.lrs.getLog();
-      int i=0;
-      while(oldLog.hasMoreElements()) {
-        LogEntry oldLogEntry = ((LogEntry) oldLog.nextElement());
-        System.out.println("   -"+(i++)+" : "+oldLogEntry.getMessage());
-        //logged(oldLogEntry);
-      }*/
     }catch(Exception e){
       e.printStackTrace();
     }
@@ -232,6 +238,5 @@
       System.out.println("ERROR : Logger.start : No service "+LogService.class.getName()+" is present");
     }
   }
-
 
 } 

Modified: incubator/felix/trunk/mosgi.jmx.remotelogger/src/main/java/org/apache/felix/mosgi/jmx/remotelogger/LoggerMBean.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/mosgi.jmx.remotelogger/src/main/java/org/apache/felix/mosgi/jmx/remotelogger/LoggerMBean.java?view=diff&rev=463216&r1=463215&r2=463216
==============================================================================
--- incubator/felix/trunk/mosgi.jmx.remotelogger/src/main/java/org/apache/felix/mosgi/jmx/remotelogger/LoggerMBean.java (original)
+++ incubator/felix/trunk/mosgi.jmx.remotelogger/src/main/java/org/apache/felix/mosgi/jmx/remotelogger/LoggerMBean.java Thu Oct 12 04:54:37 2006
@@ -18,4 +18,8 @@
  */
 package org.apache.felix.mosgi.jmx.remotelogger;
 
-public interface LoggerMBean{}
+public interface LoggerMBean{
+
+  public void sendOldLog();
+
+}