You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by bh...@apache.org on 2006/12/04 15:19:16 UTC

svn commit: r482181 [4/5] - in /incubator/qpid/trunk/qpid/java/management/eclipse-plugin: ./ META-INF/ bin/ configuration/ configuration/org.eclipse.osgi/ configuration/org.eclipse.osgi/bundles/ configuration/org.eclipse.osgi/bundles/16/ configuration/...

Added: incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/MBeanView.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/MBeanView.java?view=auto&rev=482181
==============================================================================
--- incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/MBeanView.java (added)
+++ incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/MBeanView.java Mon Dec  4 06:19:10 2006
@@ -0,0 +1,431 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.management.ui.views;
+
+import java.util.HashMap;
+
+import org.apache.qpid.management.ui.ApplicationRegistry;
+import org.apache.qpid.management.ui.Constants;
+import org.apache.qpid.management.ui.ManagedBean;
+import org.apache.qpid.management.ui.exceptions.InfoRequiredException;
+import org.apache.qpid.management.ui.jmx.JMXServerRegistry;
+import org.apache.qpid.management.ui.jmx.MBeanUtility;
+import org.apache.qpid.management.ui.model.AttributeData;
+import org.apache.qpid.management.ui.model.OperationData;
+import org.apache.qpid.management.ui.model.OperationDataModel;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.TabFolder;
+import org.eclipse.swt.widgets.TabItem;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.forms.widgets.Form;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.part.ViewPart;
+
+
+public class MBeanView extends ViewPart
+{
+    public static final String ID = "org.apache.qpid.management.ui.mbeanView";
+    
+    private FormToolkit  _toolkit = null;
+    private Form _form = null;
+    private ManagedBean _mbean = null;
+    private HashMap<String, TabFolder> tabFolderMap = new HashMap<String, TabFolder>();
+    private ISelectionListener selectionListener = new SelectionListenerImpl();
+   
+    private static final String ATTRIBUTES_CONTROL = "AttributesTabControl";
+    private static final String OPERATIONS_CONTROL = "OperationsTabControl";
+    private static final String NOTIFICATIONS_CONTROL = "NotificationsTabControl";
+    
+    
+    /*
+     * Listener for the selection events in the navigation view
+     */ 
+    private class SelectionListenerImpl implements ISelectionListener
+    {
+        public void selectionChanged(IWorkbenchPart part, ISelection sel)
+        {
+            if (!(sel instanceof IStructuredSelection))
+                return;
+
+            IStructuredSelection ss = (IStructuredSelection) sel;
+            TreeObject node = (TreeObject)ss.getFirstElement();
+            showSelectedMBean(node);
+            /*
+            _mbean = null;
+            setInvisible();
+            
+            if (node == null)
+            {
+                _form.setText("Qpid Management Console");
+                return;
+            }
+            
+            if (Constants.NOTIFICATION.equals(node.getType()))
+            {
+                _mbean = (ManagedBean)node.getParent().getManagedObject();                
+            }
+            else if (Constants.MBEAN.equals(node.getType()))
+            {
+                _mbean = (ManagedBean)node.getManagedObject();                
+            }
+            else
+            {
+                _form.setText("Qpid Management Console");
+                return;
+            }
+            
+            setFocus();
+            try
+            {                
+                MBeanUtility.getMBeanInfo(_mbean);     
+            }
+            catch(Exception ex)
+            {
+                MBeanUtility.handleException(_mbean, ex);
+                return;
+            }
+
+            TabFolder tabFolder = tabFolderMap.get(_mbean.getType());
+            if (tabFolder == null)
+            {
+                tabFolder = createTabFolder();
+            }
+            
+            String text = _mbean.getType();
+            if (_mbean.getName() != null && _mbean.getName().length() != 0)
+            {
+                text = text + ": " + _mbean.getName();
+            }
+            _form.setText(text);
+            int tabIndex = 0;
+            if (Constants.NOTIFICATION.equals(node.getType()))
+            {
+                tabIndex = tabFolder.getItemCount() -1;
+            }
+           
+            TabItem tab = tabFolder.getItem(tabIndex);
+            // refreshTab(tab);
+            // If folder is being set as visible after tab refresh, then the tab 
+            // doesn't have the focus.
+                       
+            tabFolder.setSelection(tabIndex);
+            refreshTab(tab);
+            setVisible(tabFolder); 
+            _form.layout();
+            
+            // Set the focus on the first attribute in attributes table
+            if (tab.getText().equals(Constants.ATTRIBUTES))
+            {
+                ((TabControl)tabFolder.getData(ATTRIBUTES_CONTROL)).setFocus();
+            }*/
+        }
+    }
+
+    public void showSelectedMBean(TreeObject node)
+    {
+        _mbean = null;
+        setInvisible();
+        
+        if (node == null)
+        {
+            _form.setText("Qpid Management Console");
+            return;
+        }
+        
+        if (Constants.NOTIFICATION.equals(node.getType()))
+        {
+            _mbean = (ManagedBean)node.getParent().getManagedObject();                
+        }
+        else if (Constants.MBEAN.equals(node.getType()))
+        {
+            _mbean = (ManagedBean)node.getManagedObject();                
+        }
+        else
+        {
+            _form.setText("Qpid Management Console");
+            return;
+        }
+        
+        setFocus();
+        try
+        {                
+            MBeanUtility.getMBeanInfo(_mbean);     
+        }
+        catch(Exception ex)
+        {
+            MBeanUtility.handleException(_mbean, ex);
+            return;
+        }
+
+        TabFolder tabFolder = tabFolderMap.get(_mbean.getType());
+        if (tabFolder == null)
+        {
+            tabFolder = createTabFolder();
+        }
+        
+        String text = _mbean.getType();
+        if (_mbean.getName() != null && _mbean.getName().length() != 0)
+        {
+            text = text + ": " + _mbean.getName();
+        }
+        _form.setText(text);
+        int tabIndex = 0;
+        if (Constants.NOTIFICATION.equals(node.getType()))
+        {
+            tabIndex = tabFolder.getItemCount() -1;
+        }
+       
+        TabItem tab = tabFolder.getItem(tabIndex);
+        // refreshTab(tab);
+        // If folder is being set as visible after tab refresh, then the tab 
+        // doesn't have the focus.
+                   
+        tabFolder.setSelection(tabIndex);
+        refreshTab(tab);
+        setVisible(tabFolder); 
+        _form.layout();
+    }
+    
+    public void createPartControl(Composite parent)
+    {
+        // Create the Form
+        _toolkit = new FormToolkit(parent.getDisplay());
+        _form = _toolkit.createForm(parent);
+        _form.getBody().setLayout(new FormLayout());
+        _form.setText(Constants.APPLICATION_NAME);
+        
+        // Add selection listener for selection events in the Navigation view
+        getSite().getPage().addSelectionListener(NavigationView.ID, selectionListener); 
+    }
+    
+    public void refreshMBeanView()
+    {
+        if (_mbean == null)
+            return;
+        
+        TabFolder tabFolder = tabFolderMap.get(_mbean.getType());
+        if (tabFolder == null)
+            return;
+        
+        int index = tabFolder.getSelectionIndex();
+        TabItem tab = tabFolder.getItem(index);
+        if (tab == null)
+            return;
+                
+        refreshTab(tab);
+        _form.layout();
+    }
+    
+    private TabFolder createTabFolder()
+    {
+        TabFolder tabFolder = new TabFolder(_form.getBody(), SWT.NONE);
+        FormData layoutData = new FormData();
+        layoutData.left = new FormAttachment(0);
+        layoutData.top = new FormAttachment(0);
+        layoutData.right = new FormAttachment(100);
+        layoutData.bottom = new FormAttachment(100);
+        tabFolder.setLayoutData(layoutData);
+        tabFolder.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+        tabFolder.setVisible(false);
+        
+        createAttributesTab(tabFolder);
+        createOperationTabs(tabFolder);
+        createNotificationsTab(tabFolder);
+        
+        tabFolder.addListener(SWT.Selection, new Listener()
+        {
+            public void handleEvent(Event evt)
+            {
+                TabItem tab = (TabItem)evt.item;        
+                refreshTab(tab);
+            }
+        });
+        
+        tabFolderMap.put(_mbean.getType(), tabFolder);               
+        return tabFolder;
+    }
+    
+    private void refreshTab(TabItem tab)
+    {
+        // We can avoid refreshing the attributes tab because it's control
+        // already contains the required values. But it is added for now and 
+        // will remove if there is any perfornce or any such issue.
+        // The operations control should be refreshed because there is only one
+        // controller for all operations tab.
+        // The Notifications control needs to refresh with latest set of notifications
+        
+        if (tab == null)
+            return;
+        
+        TabFolder tabFolder = tab.getParent();
+        if (tab.getData() != null && (tab.getData() instanceof OperationData))
+        {           
+            // Refresh selected operation tab
+            TabControl control = (TabControl)tabFolder.getData(OPERATIONS_CONTROL);
+            if (control == null)
+                return;
+            
+            control.refresh(_mbean, (OperationData)tab.getData());
+        }
+        else if (tab.getText().equals(Constants.NOTIFICATION))
+        {
+            TabControl control = (TabControl)tabFolder.getData(NOTIFICATIONS_CONTROL);
+            if (control == null)
+                return;
+            
+            control.refresh(_mbean);
+        }        
+        else if (tab.getText().equals(Constants.ATTRIBUTES))
+        {
+            TabControl control = (TabControl)tabFolder.getData(ATTRIBUTES_CONTROL);
+            if (control == null)
+                return;
+            
+            control.refresh(_mbean);
+        }
+        
+    }
+    
+    public void setFocus()
+    {   
+        //_form.setFocus();
+    }
+
+    public void dispose()
+    {
+        _toolkit.dispose();
+        super.dispose();
+    }
+    
+    private void createAttributesTab(TabFolder tabFolder)
+    {
+        JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(_mbean);
+        if (serverRegistry.getAttributeModel(_mbean).getCount() == 0)
+        {
+            return;
+        }
+        
+        TabItem tab = new TabItem(tabFolder, SWT.NONE);
+        tab.setText(Constants.ATTRIBUTES);
+        AttributesTabControl control = new AttributesTabControl(tabFolder);
+        tab.setControl(control.getControl());
+        tabFolder.setData(ATTRIBUTES_CONTROL, control);      
+    }
+    
+    private void createOperationTabs(TabFolder tabFolder)
+    {
+        JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(_mbean);        
+        int operationsCount = serverRegistry.getOperationModel(_mbean).getCount();
+        if (operationsCount == 0)
+        {
+            return;
+        }
+        
+        OperationTabControl control = new OperationTabControl(tabFolder);
+        tabFolder.setData(OPERATIONS_CONTROL, control);
+        
+        OperationDataModel operationModel = serverRegistry.getOperationModel(_mbean);
+        for (OperationData operationData : operationModel.getOperations())
+        {
+            TabItem operationTab = new TabItem(tabFolder, SWT.NONE);
+            operationTab.setText(ViewUtility.getDisplayText(operationData.getName()));
+            operationTab.setData(operationData);
+            operationTab.setControl(control.getControl());
+        }
+    }
+    
+    private void createNotificationsTab(TabFolder tabFolder)
+    {
+        NotificationsTabControl controller = new NotificationsTabControl(tabFolder);
+        tabFolder.setData(NOTIFICATIONS_CONTROL, controller);
+        
+        TabItem tab = new TabItem(tabFolder, SWT.NONE);
+        tab.setText(Constants.NOTIFICATION);
+        tab.setControl(controller.getControl());
+    }
+    
+    /**
+     * For the EditAttribtue Action. Invoking this from action is same as clicking
+     * "EditAttribute" button from Attribute tab.
+     */
+    public void editAttribute() throws Exception
+    {
+       if (_mbean == null)
+           throw new InfoRequiredException("Please select the managed object and then attribute to be edited");
+       
+       String name = (_mbean.getName() != null) ? _mbean.getName() : _mbean.getType();
+       JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(_mbean);
+       if (serverRegistry.getAttributeModel(_mbean).getCount() == 0)
+       {
+           throw new InfoRequiredException("There are no attributes to be edited for " + name);
+       }
+       
+       TabFolder tabFolder = tabFolderMap.get(_mbean.getType());
+       int index = tabFolder.getSelectionIndex();
+       if (index != 0)
+       {
+           tabFolder.setSelection(0);
+           throw new InfoRequiredException("Please select the attribute to be edited");
+       }
+       
+       AttributesTabControl tabControl = (AttributesTabControl)tabFolder.getData(ATTRIBUTES_CONTROL);
+       AttributeData attribute = tabControl.getSelectionAttribute();
+       if (attribute == null)
+           throw new InfoRequiredException("Please select the attribute to be edited");
+       
+       tabControl.createDetailsPopup(attribute);
+    }
+    
+    
+    /**
+     * hides other folders and makes the given one visible.
+     * @param tabFolder
+     */
+    private void setVisible(TabFolder tabFolder)
+    {
+        for (TabFolder folder : tabFolderMap.values())
+        {
+            if (folder == tabFolder)
+                folder.setVisible(true);
+            else
+                folder.setVisible(false);
+        }
+    }
+    
+    private void setInvisible()
+    {
+        for (TabFolder folder : tabFolderMap.values())
+        {
+            folder.setVisible(false);
+        }
+    }
+    
+}

Propchange: incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/MBeanView.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/NavigationView.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/NavigationView.java?view=auto&rev=482181
==============================================================================
--- incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/NavigationView.java (added)
+++ incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/NavigationView.java Mon Dec  4 06:19:10 2006
@@ -0,0 +1,787 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.management.ui.views;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import javax.management.MBeanServerConnection;
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+
+import org.apache.qpid.management.ui.ApplicationRegistry;
+import org.apache.qpid.management.ui.Constants;
+import org.apache.qpid.management.ui.ManagedBean;
+import org.apache.qpid.management.ui.ManagedServer;
+import org.apache.qpid.management.ui.ServerRegistry;
+import org.apache.qpid.management.ui.exceptions.InfoRequiredException;
+import org.apache.qpid.management.ui.jmx.JMXManagedObject;
+import org.apache.qpid.management.ui.jmx.JMXServerRegistry;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.IFontProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.ITreeViewerListener;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TreeExpansionEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.part.ViewPart;
+
+
+public class NavigationView extends ViewPart
+{
+	public static final String ID = "org.apache.qpid.management.ui.navigationView";    
+    public static final String INI_FILENAME = System.getProperty("user.home") + File.separator + "qpidManagementConsole.ini";
+    
+    private TreeViewer _treeViewer = null;
+    private TreeObject _rootNode = null;
+    private TreeObject _serversRootNode = null;
+    // List of all server nodes (connecged or removed)
+    //private List<TreeObject> _serverNodeList = new ArrayList<TreeObject>();
+    // Map of connected servers
+    private HashMap<ManagedServer, TreeObject> _managedServerMap = new HashMap<ManagedServer, TreeObject>();
+    
+    private void createTreeViewer(Composite parent)
+    {
+        _treeViewer = new TreeViewer(parent);
+        _treeViewer.setContentProvider(new ContentProviderImpl());
+        _treeViewer.setLabelProvider(new LabelProviderImpl());        
+        _treeViewer.setSorter(new ViewerSorterImpl());
+        
+        // layout the tree viewer below the label field, to cover the area
+        GridData layoutData = new GridData();
+        layoutData = new GridData();
+        layoutData.grabExcessHorizontalSpace = true;
+        layoutData.grabExcessVerticalSpace = true;
+        layoutData.horizontalAlignment = GridData.FILL;
+        layoutData.verticalAlignment = GridData.FILL;
+        _treeViewer.getControl().setLayoutData(layoutData);
+        _treeViewer.setUseHashlookup(true);
+        
+        createListeners();
+    }
+    
+    private void createListeners()
+    {
+        _treeViewer.addDoubleClickListener(new IDoubleClickListener()
+            {
+                public void doubleClick(DoubleClickEvent event)
+                {
+                    IStructuredSelection ss = (IStructuredSelection)event.getSelection();
+                    if (ss == null || ss.getFirstElement() == null)
+                    {
+                        return;
+                    }
+                    boolean state = _treeViewer.getExpandedState(ss.getFirstElement());
+                    _treeViewer.setExpandedState(ss.getFirstElement(), !state);
+                }
+            });
+        
+        _treeViewer.addTreeListener(new ITreeViewerListener()
+        {
+            public void treeExpanded(TreeExpansionEvent event)
+            {
+                _treeViewer.setExpandedState(event.getElement(), true);
+                // Following will cause the selection event to be sent, so commented
+                //_treeViewer.setSelection(new StructuredSelection(event.getElement()));
+                _treeViewer.refresh();
+            }
+
+            public void treeCollapsed(TreeExpansionEvent event)
+            {
+                _treeViewer.setExpandedState(event.getElement(), false);
+                _treeViewer.refresh();
+            }
+        });
+    }   
+    
+    private void createRMIServerConnection(ManagedServer server) throws Exception
+    {     
+        try
+        {
+            // Currently Qpid Management Console only supports JMX MBeanServer
+            JMXServerRegistry serverRegistry = new JMXServerRegistry(server);  
+            ApplicationRegistry.addServer(server, serverRegistry);         
+        }
+        catch(Exception ex)
+        {
+            throw new Exception("Error in connecting to Qpid broker at " + server.getUrl(), ex);
+        }
+    }
+    
+    private String getRMIURL(String host)
+    {
+        return "service:jmx:rmi:///jndi/rmi://" + host + "/jmxrmi";
+    }
+    
+    
+    public void addNewServer(String transportProtocol, String host, String port, String domain)
+        throws Exception
+    {
+        if ("RMI".equals(transportProtocol))
+        {
+            String serverAddress = host + ":" + port;
+            String url = getRMIURL(serverAddress);
+            List<TreeObject> list = _serversRootNode.getChildren();
+            for (TreeObject node : list)
+            {
+                if (url.equals(node.getUrl()))
+                    throw new InfoRequiredException("Server " + serverAddress + " is already added");
+            }
+            
+            ManagedServer managedServer = new ManagedServer(url, domain);
+            managedServer.setName(serverAddress);
+            createRMIServerConnection(managedServer); 
+            
+            // RMI server connection is successful. Now add the server in the tree
+            TreeObject serverNode = new TreeObject(serverAddress, Constants.SERVER);
+            serverNode.setUrl(url);
+            serverNode.setManagedObject(managedServer);
+            _serversRootNode.addChild(serverNode);
+            
+            // Add server in the connected server map
+            _managedServerMap.put(managedServer, serverNode);
+            populateServer(serverNode); 
+            _treeViewer.refresh();
+            
+            // save server address in file            
+            addServerAddressInFile(serverAddress);
+        }
+        else
+        {
+            throw new InfoRequiredException(transportProtocol + " transport is not supported");
+        }
+    }
+    
+    private void addServerAddressInFile(String serverAddress)
+    {
+        File file = new File(INI_FILENAME);
+        try
+        {
+            if (!file.exists())
+                file.createNewFile();
+            
+            BufferedWriter out = new BufferedWriter(new FileWriter(file, true));
+            out.write(serverAddress + "\n");
+            out.close();
+
+        }
+        catch(Exception ex)
+        {
+            System.out.println("Could not write to the file " + INI_FILENAME);
+            System.out.println(ex);
+        }
+    }    
+
+    
+    private void populateServer(TreeObject serverNode)
+    {
+        ManagedServer server = (ManagedServer)serverNode.getManagedObject();
+        JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(server);
+        String domain = server.getDomain();
+        try
+        {
+            if (!domain.equals("All"))
+            {
+                TreeObject domainNode = new TreeObject(domain, Constants.DOMAIN);
+                domainNode.setParent(serverNode);
+
+                populateDomain(domainNode); 
+            }
+            else
+            {
+                List<TreeObject> domainList = new ArrayList<TreeObject>();
+                MBeanServerConnection mbsc = serverRegistry.getServerConnection();
+                String[] domains = mbsc.getDomains();           
+                for (int i = 0; i < domains.length; i++)
+                {       
+                    TreeObject domainNode = new TreeObject(domains[i], Constants.DOMAIN);
+                    domainNode.setParent(serverNode);
+
+                    domainList.add(domainNode);
+                    populateDomain(domainNode);               
+                }
+            }
+        }
+        catch(Exception ex)
+        {
+            System.out.println("\nError in connecting to Qpid broker ");
+            System.out.println("\n" + ex.toString());
+        }
+    }
+    
+    @SuppressWarnings("unchecked")
+    private void populateDomain(TreeObject domain) throws IOException, Exception
+    {
+        ManagedServer server = (ManagedServer)domain.getParent().getManagedObject();
+        JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(server);
+        
+        String domainName = domain.getName();
+        MBeanServerConnection mbsc = serverRegistry.getServerConnection();
+        
+    
+        ObjectName objName = new ObjectName(domainName + ":*");
+        Set queryMBeans = mbsc.queryMBeans(objName, null);
+        final Set<ObjectInstance> objectInstances = queryMBeans;
+
+        for (Iterator<ObjectInstance> itr = objectInstances.iterator(); itr.hasNext();)
+        {
+            ObjectInstance instance = itr.next();
+            ManagedBean obj = new JMXManagedObject(instance.getObjectName());
+            obj.setServer(server);
+            addManagedBean(domain, obj);                   
+        }
+    }
+    
+    private TreeObject getIfTypeAlreadyExists(TreeObject domain, String type)
+    {
+        List<TreeObject> types = domain.getChildren();
+        
+        for (TreeObject child : types)
+        {
+            if (Constants.TYPE.equals(child.getType()) && type.equals(child.getName()))
+                return child;
+        }
+        return null;
+    }
+    
+    private void addManagedBean(TreeObject domain, ManagedBean obj)
+    {
+        ManagedServer server = (ManagedServer)domain.getParent().getManagedObject();
+        JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(server);
+        serverRegistry.addManagedObject(obj);
+        
+        String type = obj.getType();
+        String name = obj.getName();
+        
+        TreeObject typeChild = getIfTypeAlreadyExists(domain, type);
+        TreeObject mbeanNode = null;
+        if (typeChild != null) // if type is already added as a TreeItem
+        {
+            if (name == null)
+            {
+                System.out.println("Two mbeans can't exist without a name and with same type");
+                return;
+            }
+            mbeanNode = new TreeObject(obj);
+            mbeanNode.setParent(typeChild);
+        }
+        else
+        {
+            if (name != null)  // An managedObject with type and name
+            {
+                typeChild = new TreeObject(type, Constants.TYPE);
+                typeChild.setParent(domain);
+                mbeanNode = new TreeObject(obj);
+                mbeanNode.setParent(typeChild);               
+            }
+            else              // An managedObject with only type
+            {
+                mbeanNode = new TreeObject(obj);
+                mbeanNode.setParent(domain);
+            }
+        }
+        
+        // Add notification node
+        // TODO: show this only of the mbean sends any notification
+        TreeObject notificationNode = new TreeObject(Constants.NOTIFICATION, Constants.NOTIFICATION);
+        notificationNode.setParent(mbeanNode);
+    }
+    
+    /**
+     * Removes all the child nodes of the given parent node
+     * @param parent
+     */
+    private void removeManagedObject(TreeObject parent)
+    {
+        List<TreeObject> list = parent.getChildren();
+        for (TreeObject child : list)
+        {
+            removeManagedObject(child);
+        }
+        
+        list.clear();
+    }
+
+    /**
+     * Removes the mbean from the tree
+     * @param parent
+     * @param mbean
+     */
+    private void removeManagedObject(TreeObject parent, ManagedBean mbean)
+    {
+        List<TreeObject> list = parent.getChildren();
+        TreeObject objectToRemove = null;
+        for (TreeObject child : list)
+        {
+            if (Constants.MBEAN.equals(child.getType()))
+            {
+                String name = mbean.getName() != null ? mbean.getName() : mbean.getType();
+                if (child.getName().equals(name))
+                {
+                    objectToRemove = child;
+                    break;
+                }
+            }
+            else
+            {
+                removeManagedObject(child, mbean);
+            }
+        }
+        
+        if (objectToRemove != null)
+        {
+            list.remove(objectToRemove);
+        }
+        
+    }
+    
+    public void disconnect() throws Exception
+    {
+        TreeObject selectedNode = getSelectedServerNode();        
+        ManagedServer managedServer = (ManagedServer)selectedNode.getManagedObject();
+        if (!_managedServerMap.containsKey(managedServer))
+            return;
+
+        // Close server connection
+        ServerRegistry serverRegistry = ApplicationRegistry.getServerRegistry(managedServer);
+        if (serverRegistry == null)  // server connection is already closed
+            return;
+        
+        serverRegistry.closeServerConnection();
+        // Add server to the closed server list and the worker thread will remove the server from required places.
+        ApplicationRegistry.serverConnectionClosed(managedServer);
+    }
+    
+    /**
+     * Connects the selected server node
+     * @throws Exception
+     */
+    public void reconnect() throws Exception
+    {
+        TreeObject selectedNode = getSelectedServerNode();
+        ManagedServer managedServer = (ManagedServer)selectedNode.getManagedObject();
+        if(_managedServerMap.containsKey(managedServer))
+        {
+            throw new InfoRequiredException("Server " + managedServer.getName() + " is already connected");
+        }           
+        createRMIServerConnection(managedServer);
+        _managedServerMap.put(managedServer, selectedNode);
+        populateServer(selectedNode);
+        _treeViewer.refresh();  
+    }
+    
+    public void removeServer() throws Exception
+    {
+        disconnect();
+        
+        // Remove from the Tree
+        String serverNodeName = getSelectedServerNode().getName();        
+        List<TreeObject> list = _serversRootNode.getChildren();
+        TreeObject objectToRemove = null;
+        for (TreeObject child : list)
+        {
+            if (child.getName().equals(serverNodeName))
+            {
+                objectToRemove = child;
+                break;
+            }
+        }
+        
+        if (objectToRemove != null)
+        {
+            list.remove(objectToRemove);
+        }
+        
+        //_serverNodeList.remove(objectToRemove);
+        _treeViewer.refresh();
+        
+        // Remove from the ini file
+        List<String> serversList = getServerListFromFile();
+        serversList.remove(serverNodeName);
+        
+        BufferedWriter out = new BufferedWriter(new FileWriter(INI_FILENAME));
+        for (String serverAddress : serversList)
+        {
+            out.write(serverAddress + "\n");
+        }
+        out.close();
+    }
+    
+    private List<String> getServerListFromFile() throws Exception
+    {
+        BufferedReader in = new BufferedReader(new FileReader(INI_FILENAME));
+        List<String> serversList = new ArrayList<String>();
+        String str;
+        while ((str = in.readLine()) != null)
+        {
+            serversList.add(str);
+        }
+        in.close();
+        
+        return serversList;
+    }
+    
+    private TreeObject getSelectedServerNode() throws Exception
+    {
+        IStructuredSelection ss = (IStructuredSelection)_treeViewer.getSelection();
+        TreeObject selectedNode = (TreeObject)ss.getFirstElement();
+        if (ss.isEmpty() || selectedNode == null || (!selectedNode.getType().equals(Constants.SERVER)))
+        {
+            throw new InfoRequiredException("Please select the server");
+        }
+
+        return selectedNode;
+    }
+	/**
+     * This is a callback that will allow us to create the viewer and initialize
+     * it.
+     */
+	public void createPartControl(Composite parent)
+    {
+        Composite composite = new Composite(parent, SWT.NONE);
+        GridLayout gridLayout = new GridLayout();
+        gridLayout.marginHeight = 2;
+        gridLayout.marginWidth = 2;
+        gridLayout.horizontalSpacing = 0; 
+        gridLayout.verticalSpacing = 2;        
+        composite.setLayout(gridLayout);
+        
+        createTreeViewer(composite);
+        _rootNode = new TreeObject("ROOT", "ROOT");
+        _serversRootNode = new TreeObject(Constants.NAVIGATION_ROOT, "ROOT");
+        _serversRootNode.setParent(_rootNode);
+        
+        _treeViewer.setInput(_rootNode);
+        // set viewer as selection event provider for MBeanView
+        getSite().setSelectionProvider(_treeViewer);      
+        
+        // Start worker thread to refresh tree for added or removed objects
+        (new Thread(new Worker())).start();     
+        
+        try
+        {
+            // load the list of servers already added from file
+            List<String> serversList = getServerListFromFile();
+            for (String serverAddress : serversList)
+            {
+                try
+                {
+                    String url = getRMIURL(serverAddress);
+                    ManagedServer managedServer = new ManagedServer(url, "org.apache.qpid");
+                    managedServer.setName(serverAddress);
+                    TreeObject serverNode = new TreeObject(serverAddress, Constants.SERVER);
+                    serverNode.setUrl(url);
+                    serverNode.setManagedObject(managedServer);
+                    _serversRootNode.addChild(serverNode);
+                }
+                catch(Exception ex)
+                {
+                    System.out.println(ex);
+                }
+            }
+            _treeViewer.refresh();
+        }
+        catch(Exception ex)
+        {
+            System.out.println(ex);
+        }
+	}
+
+	/**
+	 * Passing the focus request to the viewer's control.
+	 */
+	public void setFocus()
+    {
+
+	}
+    
+    public void refresh()
+    {
+        _treeViewer.refresh();
+    }
+    
+    private class ContentProviderImpl implements ITreeContentProvider
+    {
+        public Object[] getElements(Object parent)
+        {
+            return getChildren(parent);
+        }
+        
+        public Object[] getChildren(final Object parentElement)
+        {
+            final TreeObject node = (TreeObject)parentElement;
+            return node.getChildren().toArray(new TreeObject[0]);
+        }
+        
+        public Object getParent(final Object element)
+        {
+            final TreeObject node = (TreeObject)element;
+            return node.getParent();
+        }
+        
+        public boolean hasChildren(final Object element)
+        {
+            final TreeObject node = (TreeObject) element;
+            return !node.getChildren().isEmpty();
+        }
+        
+        public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput)
+        {
+            // Do nothing
+        }
+        
+        public void dispose()
+        {
+            // Do nothing
+        }
+    }
+    
+    private class LabelProviderImpl extends LabelProvider implements IFontProvider
+    {
+        public Image getImage(Object element)
+        {
+            TreeObject node = (TreeObject)element;
+            if (node.getType().equals(Constants.NOTIFICATION))
+            {
+                return ApplicationRegistry.getImage(Constants.NOTIFICATION_IMAGE);
+            }
+            else if (!node.getType().equals(Constants.MBEAN))
+            {
+               if (_treeViewer.getExpandedState(node))
+                   return ApplicationRegistry.getImage(Constants.OPEN_FOLDER_IMAGE);
+               else
+                   return ApplicationRegistry.getImage(Constants.CLOSED_FOLDER_IMAGE);
+                   
+            }
+            else
+            {
+                return ApplicationRegistry.getImage(Constants.MBEAN_IMAGE);
+            }
+        }
+        
+        public String getText(Object element)
+        {
+            TreeObject node = (TreeObject)element;
+            return node.getName();
+        }
+        
+        public Font getFont(Object element)
+        {
+            TreeObject node = (TreeObject)element;
+            if (node.getType().equals(Constants.SERVER))
+            {
+                if (node.getChildren().isEmpty())
+                    return ApplicationRegistry.getFont(Constants.FONT_NORMAL);
+                else
+                    return ApplicationRegistry.getFont(Constants.FONT_BOLD);
+            }
+            return ApplicationRegistry.getFont(Constants.FONT_NORMAL);
+        }
+        
+        /*
+        public Color getForeground(Object element)
+        {
+            TreeObject node = (TreeObject)element;
+            if (node.getType().equals(Constants.SERVER))
+            {
+                if (!node.getChildren().isEmpty())
+                    return Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GREEN);
+                else
+                    return Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GRAY);
+            }
+            return Display.getCurrent().getSystemColor(SWT.COLOR_BLACK);
+        }
+        public Color getBackground(Object element)
+        {
+            return _treeViewer.getControl().getBackground();
+        }*/
+    } // End of LabelProviderImpl
+    
+    
+    private class ViewerSorterImpl extends ViewerSorter
+    {
+        public int category(Object element)
+        {
+            TreeObject node = (TreeObject)element;
+           if (node.getType().equals(Constants.MBEAN))
+                return 1;
+            return 2;
+        }
+    }
+    
+    /**
+     * Worker thread, which keeps looking for new ManagedObjects to be added and 
+     * unregistered objects to be removed from the tree.
+     * @author Bhupendra Bhardwaj
+     */
+    private class Worker implements Runnable
+    {
+        public void run()
+        {
+            while(true)
+            {
+                if (_managedServerMap.isEmpty())
+                    continue;
+                
+                try
+                {
+                    Thread.sleep(2000);
+                }
+                catch(Exception ex)
+                {
+
+                }               
+                refreshAddedObjects();                
+                refreshRemovedObjects();                               
+                refreshClosedServerConnections();                                
+            }// end of while loop
+        }// end of run method.        
+    }// end of Worker class
+    
+    
+    private void refreshAddedObjects()
+    {
+        for (ManagedServer server : _managedServerMap.keySet())
+        {
+            JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(server);
+            if (serverRegistry == null) // server connection is closed
+                continue;
+            
+            final List<ManagedBean> list = serverRegistry.getObjectsToBeAdded();
+            if (list != null)
+            {
+                Display display = getSite().getShell().getDisplay();
+                display.syncExec(new Runnable()
+                    {
+                        public void run()
+                        {
+                            for (ManagedBean obj : list)
+                            {
+                                System.out.println("adding " + obj.getName() + " " + obj.getType());
+                                TreeObject treeServerObject = _managedServerMap.get(obj.getServer());
+                                List<TreeObject> domains = treeServerObject.getChildren();
+                                TreeObject domain = null;
+                                for (TreeObject child : domains)
+                                {
+                                    if (child.getName().equals(obj.getDomain()))
+                                    {
+                                        domain = child;
+                                        break;
+                                    }
+                                }
+                                
+                                addManagedBean(domain, obj);
+                            }
+                            _treeViewer.refresh();
+                        }
+                    });
+            }
+        }
+    }
+    
+    private void refreshRemovedObjects()
+    {
+        for (ManagedServer server : _managedServerMap.keySet())
+        {
+            final JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(server);
+            if (serverRegistry == null)  // server connection is closed
+                continue;
+            
+            final List<ManagedBean> removalList = serverRegistry.getObjectsToBeRemoved();
+            if (removalList != null)
+            {
+                Display display = getSite().getShell().getDisplay();
+                display.syncExec(new Runnable()
+                    {
+                        public void run()
+                        {
+                            for (ManagedBean mbean : removalList)
+                            {
+                                System.out.println("removing  " + mbean.getName() + " " + mbean.getType());
+                                TreeObject treeServerObject = _managedServerMap.get(mbean.getServer());
+                                List<TreeObject> domains = treeServerObject.getChildren();
+                                TreeObject domain = null;
+                                for (TreeObject child : domains)
+                                {
+                                    if (child.getName().equals(mbean.getDomain()))
+                                    {
+                                        domain = child;
+                                        break;
+                                    }
+                                }
+                                removeManagedObject(domain, mbean);
+                                serverRegistry.removeManagedObject(mbean);
+                            }
+                            _treeViewer.refresh();
+                        }
+                    });
+            }
+        }
+    }
+    
+    /**
+     * 
+     *
+     */
+    private void refreshClosedServerConnections()
+    {
+        final List<ManagedServer> closedServers = ApplicationRegistry.getClosedServers();
+        if (closedServers != null)
+        {
+            Display display = getSite().getShell().getDisplay();
+            display.syncExec(new Runnable()
+            {
+                public void run()
+                {
+                    for (ManagedServer server : closedServers)
+                    {
+                        removeManagedObject(_managedServerMap.get(server));
+                        _managedServerMap.remove(server);
+                        ApplicationRegistry.removeServer(server);
+                    }
+                    
+                    _treeViewer.refresh();
+                }
+            });
+        }
+    }
+    
+}
\ No newline at end of file

Propchange: incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/NavigationView.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/NotificationsTabControl.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/NotificationsTabControl.java?view=auto&rev=482181
==============================================================================
--- incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/NotificationsTabControl.java (added)
+++ incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/NotificationsTabControl.java Mon Dec  4 06:19:10 2006
@@ -0,0 +1,708 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.management.ui.views;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.qpid.management.ui.ApplicationRegistry;
+import org.apache.qpid.management.ui.Constants;
+import org.apache.qpid.management.ui.ManagedBean;
+import org.apache.qpid.management.ui.ServerRegistry;
+import org.apache.qpid.management.ui.jmx.MBeanUtility;
+import org.apache.qpid.management.ui.model.NotificationInfoModel;
+import org.apache.qpid.management.ui.model.NotificationObject;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.TabFolder;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.widgets.Form;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * 
+ * @author Bhupendra Bhardwaj
+ *
+ */
+public class NotificationsTabControl extends TabControl
+{
+    private FormToolkit  _toolkit;
+    private Form _form;
+    private Table table = null;
+    private TableViewer _tableViewer  = null;
+    
+    private IStructuredContentProvider contentProvider = new ContentProviderImpl();
+    private SelectionListener selectionListener = new SelectionListenerImpl();
+    private SelectionListener comboListener = new ComboSelectionListener();
+    
+    private Thread worker = null;
+    
+    private List<NotificationObject> _notifications = null;
+    private static final String COLUMN_SEQ  = "Sequence No";
+    private static final String COLUMN_TIME = "TimeStamp";
+    private static final String COLUMN_TYPE  = "Type";
+    private static final String COLUMN_MSG  = "Notification Message";
+    private static final String[] _tableTitles = new String [] {
+            COLUMN_SEQ,
+            COLUMN_TIME,
+            COLUMN_TYPE,
+            COLUMN_MSG
+         };
+    
+    private Combo notificationNameCombo = null;
+    private Combo typesCombo = null;
+    private Label descriptionLabel = null;
+    private Button _subscribeButton   = null;
+    private Button _unsubscribeButton = null;
+    private Button _clearButton       = null;
+    private Button _refreshButton       = null;
+    
+    
+    public NotificationsTabControl(TabFolder tabFolder)
+    {
+        super(tabFolder);
+        _toolkit = new FormToolkit(_tabFolder.getDisplay());
+        _form = _toolkit.createForm(_tabFolder);
+        GridLayout gridLayout = new GridLayout();      
+        gridLayout.marginWidth = 0;
+        gridLayout.marginHeight = 0;       
+        _form.getBody().setLayout(gridLayout);
+        
+        createWidgets();
+        worker = new Thread(new Worker()); 
+        worker.start();
+    }
+    
+    private void createWidgets()
+    {       
+        createNotificationInfoComposite();
+        //addFilterComposite();
+        addButtons();  
+        createTableViewer();
+    }
+    
+    public Control getControl()
+    {
+        return _form;
+    }
+    
+    private void createNotificationInfoComposite()
+    {
+        Composite composite = _toolkit.createComposite(_form.getBody(), SWT.NONE);
+        composite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+        composite.setLayout(new FormLayout());
+        
+        Label label = _toolkit.createLabel(composite, "Select the notification to subscribe or unsubscribe");
+        label.setFont(ApplicationRegistry.getFont(Constants.FONT_BOLD));
+        FormData formData = new FormData();
+        formData.top = new FormAttachment(0, 10);
+        formData.left = new FormAttachment(0, 10);
+        label.setLayoutData(formData);
+        
+        notificationNameCombo = new Combo(composite, SWT.READ_ONLY | SWT.DROP_DOWN);
+        formData = new FormData();
+        formData.top = new FormAttachment(label, 10);
+        formData.left = new FormAttachment(0, 10);
+        formData.right = new FormAttachment(40);
+        notificationNameCombo.setLayoutData(formData);
+        notificationNameCombo.addSelectionListener(comboListener);
+        
+        typesCombo = new Combo(composite, SWT.READ_ONLY | SWT.DROP_DOWN);
+        formData = new FormData();
+        formData.top = new FormAttachment(label, 10);
+        formData.left = new FormAttachment(notificationNameCombo, 5);
+        formData.right = new FormAttachment(65);
+        typesCombo.setLayoutData(formData);
+        typesCombo.addSelectionListener(comboListener);
+        
+        _subscribeButton = new Button(composite, SWT.PUSH | SWT.CENTER);
+        _subscribeButton.setFont(ApplicationRegistry.getFont(Constants.FONT_BUTTON));
+        _subscribeButton.setText(Constants.SUBSCRIBE_BUTTON);
+        formData = new FormData();
+        formData.top = new FormAttachment(label, 10);
+        formData.left = new FormAttachment(65, 10);
+        formData.width = 80;
+        _subscribeButton.setLayoutData(formData);
+        _subscribeButton.addSelectionListener(selectionListener);
+        
+        _unsubscribeButton = new Button(composite, SWT.PUSH | SWT.CENTER);
+        _unsubscribeButton.setFont(ApplicationRegistry.getFont(Constants.FONT_BUTTON));
+        _unsubscribeButton.setText(Constants.UNSUBSCRIBE_BUTTON);
+        formData = new FormData();
+        formData.top = new FormAttachment(label, 10);
+        formData.left = new FormAttachment(_subscribeButton, 10);
+        formData.width = 80;
+        _unsubscribeButton.setLayoutData(formData);
+        _unsubscribeButton.addSelectionListener(selectionListener);
+        
+        Label fixedLabel = _toolkit.createLabel(composite, "");
+        formData = new FormData();
+        formData.top = new FormAttachment(notificationNameCombo, 5);
+        formData.left = new FormAttachment(0, 10);
+        fixedLabel.setLayoutData(formData);
+        fixedLabel.setText(Constants.DESCRIPTION);
+        fixedLabel.setFont(ApplicationRegistry.getFont(Constants.FONT_BOLD));
+        
+        descriptionLabel = _toolkit.createLabel(composite, "");
+        formData = new FormData();
+        formData.top = new FormAttachment(notificationNameCombo, 5);
+        formData.left = new FormAttachment(fixedLabel, 10);
+        formData.right = new FormAttachment(80);
+        descriptionLabel.setLayoutData(formData);
+        descriptionLabel.setText("      ");
+        descriptionLabel.setFont(ApplicationRegistry.getFont(Constants.FONT_ITALIC));
+    }
+    
+    private void addButtons()
+    {    
+        Composite composite = _toolkit.createComposite(_form.getBody(), SWT.NONE);
+        composite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+        composite.setLayout(new GridLayout(2, true));
+        
+        // Add Clear Button
+        _clearButton = _toolkit.createButton(composite, Constants.BUTTON_CLEAR, SWT.PUSH | SWT.CENTER);
+        _clearButton.setFont(ApplicationRegistry.getFont(Constants.FONT_BUTTON));
+        GridData gridData = new GridData(SWT.LEAD, SWT.TOP, true, false);
+        gridData.widthHint = 80;
+        _clearButton.setLayoutData(gridData);
+        _clearButton.addSelectionListener(new SelectionAdapter()
+            {
+                public void widgetSelected(SelectionEvent e)
+                {    
+                    if (_mbean == null)
+                        return;
+                    
+                    ServerRegistry serverRegistry = ApplicationRegistry.getServerRegistry(_mbean);
+                    serverRegistry.clearNotifications(_mbean);
+                    refresh();
+                }
+            });
+        
+        // Add Refresh Button
+        _refreshButton = _toolkit.createButton(composite, Constants.BUTTON_REFRESH, SWT.PUSH | SWT.CENTER);
+        _refreshButton.setFont(ApplicationRegistry.getFont(Constants.FONT_BUTTON));
+        gridData = new GridData(SWT.TRAIL, SWT.TOP, true, false);
+        gridData.widthHint = 80;
+        _refreshButton.setLayoutData(gridData);
+        _refreshButton.addSelectionListener(new SelectionAdapter()
+            {
+                public void widgetSelected(SelectionEvent e)
+                {    
+                    if (_mbean == null)
+                        return;
+                    
+                    refresh();
+                }
+            });
+    }
+    
+    private void createTable()
+    {
+        table = _toolkit.createTable(_form.getBody(),  SWT.FULL_SELECTION);
+        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+        
+        TableColumn column = new TableColumn(table, SWT.NONE);
+        column.setText(_tableTitles[0]);
+        column.pack();        //column.setWidth(200);
+
+        column = new TableColumn(table, SWT.NONE);
+        column.setText(_tableTitles[1]);
+        column.setWidth(150);
+        
+        column = new TableColumn(table, SWT.NONE);
+        column.setText(_tableTitles[2]);
+        column.setWidth(100);
+        
+        column = new TableColumn(table, SWT.NONE);
+        column.setText(_tableTitles[3]);
+        column.setWidth(500);
+        
+        table.setHeaderVisible(true);
+        table.setLinesVisible(true);
+    }
+    
+    protected void createTableViewer()
+    {
+        createTable();
+        _tableViewer = new TableViewer(table);
+        //_tableViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+        _tableViewer.setUseHashlookup(true);
+        _tableViewer.setContentProvider(contentProvider);
+        _tableViewer.setLabelProvider(new LabelProviderImpl());
+        _tableViewer.setColumnProperties(_tableTitles);
+        /*
+        CellEditor[] cellEditors = new CellEditor[_tableTitles.length];
+        TextCellEditor textEditor = new TextCellEditor(table);
+        cellEditors[0] = textEditor;
+        textEditor = new TextCellEditor(table);
+        cellEditors[1] = textEditor;
+        textEditor = new TextCellEditor(table);
+        cellEditors[2] = textEditor;
+        textEditor = new TextCellEditor(table);
+        cellEditors[3] = textEditor;
+        
+        // Assign the cell editors to the viewer 
+        _tableViewer.setCellEditors(cellEditors);
+        _tableViewer.setCellModifier(new TableCellModifier());
+        */
+        
+        addTableListeners();
+        
+        //_tableViewer.addSelectionChangedListener(new );
+        
+        //_notificationDetails = new Composite(_tabControl, SWT.BORDER);
+        //_notificationDetails.setLayoutData(new GridData(GridData.FILL_BOTH));
+        
+        //_tabControl.layout();
+        //viewerComposite.layout();
+    }
+    
+    private void addTableListeners()
+    {
+        _tableViewer.addDoubleClickListener(new IDoubleClickListener()
+            {
+                Display display = null;
+                Shell   shell = null;
+                public void doubleClick(DoubleClickEvent event)
+                {
+                    System.out.println("DoubleClickEvent" + event);
+                    display = Display.getCurrent();
+                    shell = new Shell(display, SWT.BORDER | SWT.CLOSE | SWT.MIN |
+                            SWT.MAX | SWT.RESIZE);
+                    shell.setText("Notification");
+
+                    int x = display.getBounds().width;
+                    int y = display.getBounds().height;
+                    shell.setBounds(x/4, y/4, x/2, y/3);
+                    StructuredSelection selection = (StructuredSelection)event.getSelection();
+                    createPopupContents((NotificationObject)selection.getFirstElement());
+                    shell.open();
+                    while (!shell.isDisposed()) {
+                        if (!display.readAndDispatch()) {
+                            display.sleep();
+                        }
+                    }
+                    
+                    //If you create it, you dispose it.
+                    shell.dispose();
+                }
+
+                private void createPopupContents(NotificationObject obj)
+                {                    
+                    shell.setLayout(new GridLayout());
+                    
+                    Composite parent = new Composite(shell, SWT.NONE);
+                    parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+                    GridLayout layout = new GridLayout(4, true);
+                    parent.setLayout(layout);
+
+                    Label key = new Label(parent, SWT.TRAIL);               
+                    key.setText(COLUMN_SEQ);
+                    GridData layoutData = new GridData(SWT.TRAIL, SWT.TOP, false, false,1,1);
+                    key.setLayoutData(layoutData);
+                    Text  value = new Text(parent, SWT.BEGINNING | SWT.BORDER |SWT.READ_ONLY);
+                    value.setText(""+obj.getSequenceNo());
+                    value.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false,3,1));
+
+                    // Time row
+                    key = new Label(parent, SWT.TRAIL);
+                    key.setText(COLUMN_TIME);
+                    key.setLayoutData(new GridData(SWT.TRAIL, SWT.TOP, true, false,1,1));
+                    value = new Text(parent, SWT.BEGINNING | SWT.BORDER | SWT.READ_ONLY);
+                    value.setText(""+obj.getTimeStamp());
+                    value.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false,3,1));
+
+                    key = new Label(parent, SWT.TRAIL);
+                    key.setText(COLUMN_TYPE);
+                    key.setLayoutData(new GridData(SWT.TRAIL, SWT.TOP, true, false,1,1));
+                    value = new Text(parent, SWT.BEGINNING | SWT.BORDER | SWT.READ_ONLY);
+                    value.setText(""+obj.getType());
+                    value.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false,3,1));
+
+                    key = new Label(parent, SWT.TRAIL);
+                    key.setText(COLUMN_MSG);
+                    key.setLayoutData(new GridData(SWT.TRAIL, SWT.TOP, true, false,1,1));
+                    value = new Text(parent, SWT.MULTI | SWT.WRAP| SWT.BORDER | SWT.V_SCROLL | SWT.READ_ONLY);
+                    value.setText(""+obj.getMessage());
+                    GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1);
+                    gridData.heightHint = 100;
+                    value.setLayoutData(gridData);
+                }
+            });
+    }
+    
+    @Override
+    public void refresh(ManagedBean mbean)
+    {
+        _mbean = mbean;
+        _notifications = null;
+        _tableViewer.getTable().clearAll();
+        
+        if (_mbean == null)
+        {            
+            _tableViewer.getTable().clearAll();
+            _subscribeButton.setEnabled(false);
+            _unsubscribeButton.setEnabled(false);
+            return;
+        }        
+        
+        if (!doesMBeanSendsNotification())
+        {
+            Control[] children = _form.getBody().getChildren();        
+            for (int i = 0; i < children.length; i++)
+            {
+                children[i].setVisible(false);
+            }
+            
+            String name = (_mbean.getName() != null) ? _mbean.getName() : _mbean.getType();
+            _form.setText(name + " does not send any notification");
+            return;
+        }
+        
+        Control[] children = _form.getBody().getChildren();        
+        for (int i = 0; i < children.length; i++)
+        {
+            children[i].setVisible(true);
+        }
+        
+        populateNotificationInfo();        
+        /*
+        ServerRegistry serverRegistry = ApplicationRegistry.getServerRegistry(_mbean);        
+        _notifications = serverRegistry.getNotifications(_mbean);
+        if (_notifications != null)
+        {
+            _tableViewer.setInput(_notifications);
+            
+        }*/
+        //_tableViewer.setInput(null);
+        workerRunning = true;
+        _form.layout();       
+    }
+    
+    private void refresh()
+    {
+        _notifications = null;
+        _tableViewer.getTable().clearAll();
+    }
+    
+    private void populateNotificationInfo()
+    {
+        notificationNameCombo.removeAll();
+        NotificationInfoModel[] items = MBeanUtility.getNotificationInfo(_mbean);
+        notificationNameCombo.add("Select Notification");
+        for (int i = 0; i < items.length; i++)
+        {
+            notificationNameCombo.add(items[i].getName());
+            notificationNameCombo.setData(items[i].getName(), items[i]);
+        } 
+        notificationNameCombo.select(0);
+        
+        typesCombo.removeAll();
+        typesCombo.add("Select Type", 0);
+        typesCombo.select(0);
+        typesCombo.setEnabled(false);
+        
+        checkForEnablingButtons();
+    }
+    
+    private void checkForEnablingButtons()
+    {
+        int nameIndex = notificationNameCombo.getSelectionIndex();
+        if (nameIndex == 0)
+        {
+            _subscribeButton.setEnabled(false);
+            _unsubscribeButton.setEnabled(false);
+            descriptionLabel.setText("");
+            return;
+        }
+        
+        int typeIndex = typesCombo.getSelectionIndex();
+        if (typeIndex == 0)
+        {
+            _subscribeButton.setEnabled(false);
+            _unsubscribeButton.setEnabled(false);
+            return;
+        }
+        
+        String type = typesCombo.getItem(typeIndex);
+        String name = notificationNameCombo.getItem(nameIndex);
+        ServerRegistry serverRegistry = ApplicationRegistry.getServerRegistry(_mbean);
+        
+        if (serverRegistry.hasSubscribedForNotifications(_mbean, name, type))
+        {
+            _subscribeButton.setEnabled(false);
+            _unsubscribeButton.setEnabled(true);
+        }
+        else
+        {
+            _subscribeButton.setEnabled(true);
+            _unsubscribeButton.setEnabled(false);
+        }
+    }
+    
+    private boolean doesMBeanSendsNotification()
+    {
+        NotificationInfoModel[] items = MBeanUtility.getNotificationInfo(_mbean);
+        if (items == null || items.length == 0)
+            return false;
+        else
+            return true;
+    }
+    
+    private class SelectionListenerImpl extends SelectionAdapter
+    {
+        public void widgetSelected(SelectionEvent e)
+        {
+            if (_mbean == null)
+                return;
+            
+            Button source = (Button)e.getSource();
+            String type = typesCombo.getItem(typesCombo.getSelectionIndex());
+            String name = notificationNameCombo.getItem(notificationNameCombo.getSelectionIndex());
+            if (source == _unsubscribeButton)
+            {
+                try
+                {
+                    MBeanUtility.removeNotificationListener(_mbean, name, type);
+                }
+                catch(Exception ex)
+                {
+                    MBeanUtility.handleException(ex);
+                }
+            }
+            else if (source == _subscribeButton)
+            {
+                try
+                {
+                    MBeanUtility.createNotificationlistener(_mbean, name, type);
+                }
+                catch(Exception ex)
+                {
+                    MBeanUtility.handleException(ex);
+                }
+            }
+            checkForEnablingButtons();
+        }
+    }
+    
+    
+    private class ComboSelectionListener extends SelectionAdapter
+    {
+        public void widgetSelected(SelectionEvent e)
+        {
+            if (_mbean == null)
+                return;
+            
+            Combo combo = (Combo)e.getSource();
+            if (combo == notificationNameCombo)
+            {
+                if (combo.getSelectionIndex() == 0)
+                {
+                    descriptionLabel.setText("");
+                    typesCombo.select(0);
+                    typesCombo.setEnabled(false);
+                    return;
+                }
+                String index = combo.getItem(combo.getSelectionIndex());                
+                NotificationInfoModel data = (NotificationInfoModel)combo.getData(index);
+                descriptionLabel.setText(data.getDescription());
+                typesCombo.removeAll();       
+                typesCombo.setItems(data.getTypes());
+                typesCombo.add("Select Type", 0);
+                typesCombo.select(0);
+                typesCombo.setEnabled(true);
+            }
+            checkForEnablingButtons();
+        }
+    }
+    
+    private class ContentProviderImpl implements IStructuredContentProvider, INotificationViewer
+    {
+        public void inputChanged(Viewer v, Object oldInput, Object newInput)
+        {
+            
+        }
+        public void dispose()
+        {
+            
+        }
+        public Object[] getElements(Object parent) 
+        {
+            return _notifications.toArray(new NotificationObject[0]);
+        }
+        public void addNotification(NotificationObject notification)
+        {
+            _tableViewer.add(notification);
+        }
+        
+        public void addNotification(List<NotificationObject> notificationList)
+        {
+            _tableViewer.add(notificationList.toArray(new NotificationObject[0]));
+        }
+    }
+    
+    private class LabelProviderImpl implements ITableLabelProvider
+    {
+        List<ILabelProviderListener> listeners = new ArrayList<ILabelProviderListener>();       
+        public void addListener(ILabelProviderListener listener)
+        {
+            listeners.add(listener);
+        }
+        
+        public void dispose(){
+            
+        }
+        
+        public Image getColumnImage(Object element, int columnIndex)
+        {
+            return null;
+        }
+        
+        public String getColumnText(Object element, int columnIndex)
+        {
+            String result = null;
+            NotificationObject t = (NotificationObject)element;
+            switch(columnIndex)
+            {
+            case 0 : 
+                result = String.valueOf(t.getSequenceNo());
+                break;
+            case 1 :
+                result = String.valueOf(t.getTimeStamp());
+                break;
+            case 2 : 
+                result = t.getType();
+                break;
+            case 3 : 
+                result = t.getMessage();
+                break;
+            default : 
+                result = "";
+            }
+            
+            return result;
+        }
+        
+        public boolean isLabelProperty(Object element, String property)
+        {
+            return false;
+        }
+        
+        public void removeListener(ILabelProviderListener listener)
+        {
+            listeners.remove(listener);
+        }
+    } // end of LabelProviderImpl
+    
+    private boolean workerRunning = false;
+    private void setWorkerRunning(boolean running)
+    {
+        workerRunning = running;
+    }
+    
+    private class Worker implements Runnable
+    {
+        public void run()
+        {
+            Display display = _tabFolder.getDisplay();
+            while(true)
+            {
+                if (!workerRunning || _mbean == null || display == null)
+                {
+                    sleep();
+                    continue;
+                }
+                
+                display.syncExec(new Runnable()
+                {
+                    public void run()
+                    {
+                        setWorkerRunning(_form.isVisible());
+                        if (!workerRunning) return;
+                        
+                        updateTableViewer();
+                    }
+                });     
+            
+                sleep();
+            }
+        }
+        
+        private void sleep()
+        {
+            try
+            {
+                Thread.sleep(2000);
+            }
+            catch(Exception ex)
+            {
+
+            }  
+        }
+    }
+    
+    private void updateTableViewer()
+    {
+        ServerRegistry serverRegistry = ApplicationRegistry.getServerRegistry(_mbean);        
+        List<NotificationObject> newList = serverRegistry.getNotifications(_mbean);
+        if (newList == null)
+            return;
+        
+        /*
+        int notificationCount = 0;
+        if (_notifications != null)
+            notificationCount = _notifications.size();
+        
+        for (int i = notificationCount; i < newList.size(); i++)
+        {
+            ((INotificationViewer)contentProvider).addNotification(newList.get(i));
+        }*/
+        
+        _notifications = newList;
+        _tableViewer.setInput(_notifications);
+        _tableViewer.refresh();
+    }
+}

Propchange: incubator/qpid/trunk/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/NotificationsTabControl.java
------------------------------------------------------------------------------
    svn:eol-style = native