summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Gemmell <robbie@apache.org>2009-07-02 19:55:45 +0000
committerRobert Gemmell <robbie@apache.org>2009-07-02 19:55:45 +0000
commite68400e50bbee1765fd0c0344088e17dba79e2ec (patch)
tree907c943325db3986cc95dbf69e6d7856e59ec401
parentfe25b86ad2992cb30101882de07d22ffbaedd4a1 (diff)
downloadqpid-python-e68400e50bbee1765fd0c0344088e17dba79e2ec.tar.gz
QPID-1944: add initial Connections mbean view
git-svn-id: https://svn.apache.org/repos/asf/qpid/branches/jmx_mc_gsoc09@790726 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/MBeanTabFolderFactory.java9
-rw-r--r--qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/MBeanView.java2
-rw-r--r--qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/connection/ConnectionOperationsTabControl.java471
3 files changed, 480 insertions, 2 deletions
diff --git a/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/MBeanTabFolderFactory.java b/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/MBeanTabFolderFactory.java
index f17b7b60d8..c10f1449b3 100644
--- a/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/MBeanTabFolderFactory.java
+++ b/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/MBeanTabFolderFactory.java
@@ -45,6 +45,7 @@ import org.apache.qpid.management.ui.views.type.ExchangeTypeTabControl;
import org.apache.qpid.management.ui.views.type.QueueTypeTabControl;
import org.apache.qpid.management.ui.views.users.UserManagementTabControl;
import org.apache.qpid.management.ui.views.vhost.VHostTabControl;
+import org.apache.qpid.management.ui.views.connection.ConnectionOperationsTabControl;
import org.apache.qpid.management.ui.views.exchange.ExchangeOperationsTabControl;
import org.apache.qpid.management.ui.views.logging.ConfigurationFileTabControl;
import org.apache.qpid.management.ui.views.logging.RuntimeTabControl;
@@ -100,7 +101,13 @@ public class MBeanTabFolderFactory
tab.setData(TabControl.CONTROLLER, controller);
break;
case CONNECTION:
- tempCreateGeneric(tabFolder, mbean);
+ createAttributesTab(tabFolder, mbean);
+
+ tab = new TabItem(tabFolder, SWT.NONE);
+ tab.setText("Operations");
+ controller = new ConnectionOperationsTabControl(tabFolder, mbean, mbsc);
+ tab.setControl(controller.getControl());
+ tab.setData(TabControl.CONTROLLER, controller);
break;
case EXCHANGE:
tab = new TabItem(tabFolder, SWT.NONE);
diff --git a/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/MBeanView.java b/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/MBeanView.java
index 5801b142bd..c56cc4e278 100644
--- a/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/MBeanView.java
+++ b/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/MBeanView.java
@@ -389,7 +389,7 @@ public class MBeanView extends ViewPart
{
clearView();
ViewUtility.popupInfoMessage("MBean Unregistered",
- "The open MBean was been unregistered from the server.");
+ "The open MBean was unregistered from the server.");
}
}
diff --git a/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/connection/ConnectionOperationsTabControl.java b/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/connection/ConnectionOperationsTabControl.java
new file mode 100644
index 0000000000..5fb5af4502
--- /dev/null
+++ b/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/connection/ConnectionOperationsTabControl.java
@@ -0,0 +1,471 @@
+/*
+ *
+ * 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.connection;
+
+import java.util.Collection;
+
+import javax.management.MBeanServerConnection;
+import javax.management.MBeanServerInvocationHandler;
+import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.CompositeDataSupport;
+import javax.management.openmbean.TabularDataSupport;
+
+import org.apache.qpid.management.ui.ManagedBean;
+import org.apache.qpid.management.common.mbeans.ManagedConnection;
+import org.apache.qpid.management.ui.jmx.JMXManagedObject;
+import org.apache.qpid.management.ui.jmx.MBeanUtility;
+import org.apache.qpid.management.ui.views.TabControl;
+import org.apache.qpid.management.ui.views.ViewUtility;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.TabFolder;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.ui.forms.widgets.Form;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+
+/**
+ * Control class for the Connection mbean Operations tab.
+ */
+public class ConnectionOperationsTabControl extends TabControl
+{
+ private FormToolkit _toolkit;
+ private Form _form;
+ private Table _table = null;
+ private TableViewer _tableViewer = null;
+ private Composite _paramsComposite = null;
+
+ private TabularDataSupport _channels = null;
+ private ManagedConnection _cmb;
+
+ static final String CHAN_ID = ManagedConnection.COMPOSITE_ITEM_NAMES[0];
+ static final String TRANSACTIONAL = ManagedConnection.COMPOSITE_ITEM_NAMES[1];
+ static final String DEFAULT_QUEUE = ManagedConnection.COMPOSITE_ITEM_NAMES[2];
+ static final String UNACKED_COUNT = ManagedConnection.COMPOSITE_ITEM_NAMES[3];
+
+ public ConnectionOperationsTabControl(TabFolder tabFolder, JMXManagedObject mbean, MBeanServerConnection mbsc)
+ {
+ super(tabFolder);
+ _mbean = mbean;
+ _cmb = (ManagedConnection) MBeanServerInvocationHandler.newProxyInstance(mbsc,
+ mbean.getObjectName(), ManagedConnection.class, false);
+ _toolkit = new FormToolkit(_tabFolder.getDisplay());
+ _form = _toolkit.createForm(_tabFolder);
+ _form.getBody().setLayout(new GridLayout());
+ createComposites();
+ createWidgets();
+ }
+
+ private void createComposites()
+ {
+ _paramsComposite = _toolkit.createComposite(_form.getBody(), SWT.NONE);
+ _paramsComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+ _paramsComposite.setLayout(new GridLayout());
+ }
+
+ /**
+ * @see TabControl#getControl()
+ */
+ public Control getControl()
+ {
+ return _form;
+ }
+
+ /**
+ * @see TabControl#setFocus()
+ */
+ public void setFocus()
+ {
+ _table.setFocus();
+ }
+
+ @Override
+ public void refresh(ManagedBean mbean)
+ {
+ _mbean = mbean;
+ if (_mbean == null)
+ {
+ _tableViewer.setInput(null);
+ return;
+ }
+
+ _channels = null;
+ try
+ {
+ //gather a list of all channels on the connection for display and selection
+ _channels = (TabularDataSupport) _cmb.channels();
+ }
+ catch (Exception e)
+ {
+ MBeanUtility.handleException(mbean,e);
+ }
+
+ _form.setVisible(false);
+ _tableViewer.setInput(_channels);
+ _form.setVisible(true);
+ layout();
+ }
+
+ public void layout()
+ {
+ _form.layout(true);
+ _form.getBody().layout(true, true);
+ }
+
+ private void createWidgets()
+ {
+ Group viewChannelsGroup = new Group(_paramsComposite, SWT.SHADOW_NONE);
+ viewChannelsGroup.setBackground(_paramsComposite.getBackground());
+ viewChannelsGroup.setText("Channels");
+ viewChannelsGroup.setLayout(new GridLayout(2,false));
+ GridData gridData = new GridData(SWT.LEFT, SWT.TOP, true, false);
+ viewChannelsGroup.setLayoutData(gridData);
+
+ _table = new Table (viewChannelsGroup, SWT.SINGLE | SWT.SCROLL_LINE | SWT.BORDER | SWT.FULL_SELECTION);
+ _table.setLinesVisible (true);
+ _table.setHeaderVisible (true);
+ GridData data = new GridData(SWT.LEFT, SWT.TOP, true, true);
+ data.heightHint = 325;
+ _table.setLayoutData(data);
+
+ _tableViewer = new TableViewer(_table);
+ final TableSorter tableSorter = new TableSorter();
+
+ String[] titles = {"Channel Id", "Transactional", "Default Queue", "Num Of Unacked Msg"};
+ int[] bounds = { 110, 100, 175, 140 };
+ for (int i = 0; i < titles.length; i++)
+ {
+ final int index = i;
+ final TableColumn column = new TableColumn (_table, SWT.NONE);
+
+ column.setText(titles[i]);
+ column.setWidth(bounds[i]);
+ column.setResizable(true);
+
+ //Setting the right sorter
+ column.addSelectionListener(new SelectionAdapter()
+ {
+ @Override
+ public void widgetSelected(SelectionEvent e)
+ {
+ tableSorter.setColumn(index);
+ final TableViewer viewer = _tableViewer;
+ int dir = viewer .getTable().getSortDirection();
+ if (viewer.getTable().getSortColumn() == column)
+ {
+ dir = dir == SWT.UP ? SWT.DOWN : SWT.UP;
+ }
+ else
+ {
+ dir = SWT.UP;
+ }
+ viewer.getTable().setSortDirection(dir);
+ viewer.getTable().setSortColumn(column);
+ viewer.refresh();
+ }
+ });
+
+ }
+
+ _tableViewer.setContentProvider(new ContentProviderImpl());
+ _tableViewer.setLabelProvider(new LabelProviderImpl());
+ _tableViewer.setSorter(tableSorter);
+
+ Composite rightComposite = _toolkit.createComposite(viewChannelsGroup);
+ gridData = new GridData(SWT.LEFT, SWT.FILL, true, false);
+ rightComposite.setLayoutData(gridData);
+ rightComposite.setLayout(new GridLayout());
+
+ final Button commitButton = _toolkit.createButton(rightComposite, "Commit Transactions", SWT.PUSH);
+ commitButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
+ commitButton.setEnabled(false);
+ commitButton.addSelectionListener(new SelectionAdapter()
+ {
+ public void widgetSelected(SelectionEvent e)
+ {
+ int selectionIndex = _table.getSelectionIndex();
+
+ if (selectionIndex != -1)
+ {
+ final CompositeData selectedChannel = (CompositeData)_table.getItem(selectionIndex).getData();
+ Integer id = (Integer) selectedChannel.get(CHAN_ID);
+
+ int response = ViewUtility.popupOkCancelConfirmationMessage("Commit Transactions",
+ "Commit transactions for channel:" + id + " ?");
+
+ if (response == SWT.OK)
+ {
+ try
+ {
+ _cmb.commitTransactions(id);
+ }
+ catch (Exception e1)
+ {
+ MBeanUtility.handleException(_mbean, e1);
+ }
+ //TODO:display result
+ refresh(_mbean);;
+ }
+ }
+ }
+ });
+
+ final Button rollbackButton = _toolkit.createButton(rightComposite, "Rollback Transactions", SWT.PUSH);
+ rollbackButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
+ rollbackButton.setEnabled(false);
+ rollbackButton.addSelectionListener(new SelectionAdapter()
+ {
+ public void widgetSelected(SelectionEvent e)
+ {
+ int selectionIndex = _table.getSelectionIndex();
+
+ if (selectionIndex != -1)
+ {
+ final CompositeData selectedChannel = (CompositeData)_table.getItem(selectionIndex).getData();
+ Integer id = (Integer) selectedChannel.get(CHAN_ID);
+
+ int response = ViewUtility.popupOkCancelConfirmationMessage("Rollback Transactions",
+ "Rollback transactions for channel:" + id + " ?");
+
+ if (response == SWT.OK)
+ {
+ try
+ {
+ _cmb.rollbackTransactions(id);
+ }
+ catch (Exception e1)
+ {
+ MBeanUtility.handleException(_mbean, e1);
+ }
+ //TODO:display result
+ refresh(_mbean);;
+ }
+ }
+
+ }
+ });
+
+ _tableViewer.addSelectionChangedListener(new ISelectionChangedListener(){
+ public void selectionChanged(SelectionChangedEvent evt)
+ {
+ int selectionIndex = _table.getSelectionIndex();
+
+ if (selectionIndex != -1)
+ {
+ final CompositeData selectedChannel = (CompositeData)_table.getItem(selectionIndex).getData();
+ Boolean transactional = (Boolean) selectedChannel.get(TRANSACTIONAL);
+
+ if(transactional)
+ {
+ rollbackButton.setEnabled(true);
+ commitButton.setEnabled(true);
+ }
+ else
+ {
+ rollbackButton.setEnabled(false);
+ commitButton.setEnabled(false);
+ }
+ }
+ else
+ {
+ rollbackButton.setEnabled(false);
+ commitButton.setEnabled(true);
+ }
+ }
+ });
+
+ Composite opsComposite = _toolkit.createComposite(_paramsComposite);
+ gridData = new GridData(SWT.LEFT, SWT.FILL, false, true);
+ opsComposite.setLayoutData(gridData);
+ opsComposite.setLayout(new GridLayout(3,false));
+
+ Group closeConnectionGroup = new Group(opsComposite, SWT.SHADOW_NONE);
+ closeConnectionGroup.setBackground(opsComposite.getBackground());
+ closeConnectionGroup.setText("Close Connection");
+ gridData = new GridData(SWT.LEFT, SWT.TOP, true, false);
+ closeConnectionGroup.setLayoutData(gridData);
+ closeConnectionGroup.setLayout(new GridLayout());
+
+ final Button closeConnectionButton = _toolkit.createButton(closeConnectionGroup, "Close Connection", SWT.PUSH);
+ closeConnectionButton.addSelectionListener(new SelectionAdapter()
+ {
+ public void widgetSelected(SelectionEvent e)
+ {
+ int response = ViewUtility.popupOkCancelConfirmationMessage("Close Connection",
+ "Are you sure you wish to close the Connection?");
+
+ if (response == SWT.OK)
+ {
+ try
+ {
+ _cmb.closeConnection();
+ }
+ catch (Exception e1)
+ {
+ MBeanUtility.handleException(_mbean, e1);
+ }
+ }
+ }
+ });
+ }
+
+
+ /**
+ * Content Provider class for the table viewer
+ */
+ private class ContentProviderImpl implements IStructuredContentProvider
+ {
+
+ public void inputChanged(Viewer v, Object oldInput, Object newInput)
+ {
+
+ }
+
+ public void dispose()
+ {
+
+ }
+
+ public Object[] getElements(Object parent)
+ {
+ Collection<Object> rowCollection = ((TabularDataSupport) parent).values();
+
+ return rowCollection.toArray();
+ }
+ }
+
+ /**
+ * Label Provider class for the table viewer
+ */
+ private class LabelProviderImpl extends LabelProvider implements ITableLabelProvider
+ {
+ @Override
+ public String getColumnText(Object element, int columnIndex)
+ {
+ switch (columnIndex)
+ {
+ case 0 : // id column
+ return String.valueOf(((CompositeDataSupport) element).get(CHAN_ID));
+ case 1 : // transactional column
+ return String.valueOf(((CompositeDataSupport) element).get(TRANSACTIONAL));
+ case 2 : // default queue column
+ return String.valueOf(((CompositeDataSupport) element).get(DEFAULT_QUEUE));
+ case 3 : // num unacked msgs column
+ return String.valueOf(((CompositeDataSupport) element).get(UNACKED_COUNT));
+ default :
+ return "-";
+ }
+ }
+
+ @Override
+ public Image getColumnImage(Object element, int columnIndex)
+ {
+ return null;
+ }
+
+ }
+
+ /**
+ * Sorter class for the table viewer.
+ *
+ */
+ public class TableSorter extends ViewerSorter
+ {
+ private int column;
+ private static final int ASCENDING = 0;
+ private static final int DESCENDING = 1;
+
+ private int direction = DESCENDING;
+
+ public TableSorter()
+ {
+ this.column = 0;
+ direction = ASCENDING;
+ }
+
+ public void setColumn(int column)
+ {
+ if (column == this.column)
+ {
+ // Same column as last sort; toggle the direction
+ direction = 1 - direction;
+ }
+ else
+ {
+ // New column; do an ascending sort
+ this.column = column;
+ direction = ASCENDING;
+ }
+ }
+
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2)
+ {
+ CompositeData chan1 = (CompositeData) e1;
+ CompositeData chan2 = (CompositeData) e2;
+
+ int comparison = 0;
+ switch(column)
+ {
+ case 0:
+ comparison = ((Long) chan1.get(CHAN_ID)).compareTo((Long)chan2.get(CHAN_ID));
+ break;
+ case 1:
+ comparison = String.valueOf(chan1.get(TRANSACTIONAL)).compareTo(
+ String.valueOf(chan2.get(TRANSACTIONAL)));
+ break;
+ case 2:
+ comparison = String.valueOf(chan1.get(DEFAULT_QUEUE)).compareTo(
+ String.valueOf(chan2.get(DEFAULT_QUEUE)));
+ break;
+ case 3:
+ comparison = ((Long) chan1.get(UNACKED_COUNT)).compareTo((Long)chan2.get(UNACKED_COUNT));
+ break;
+ default:
+ comparison = 0;
+ }
+ // If descending order, flip the direction
+ if(direction == DESCENDING)
+ {
+ comparison = -comparison;
+ }
+ return comparison;
+ }
+ }
+
+}