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