summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Gemmell <robbie@apache.org>2009-07-10 11:26:19 +0000
committerRobert Gemmell <robbie@apache.org>2009-07-10 11:26:19 +0000
commitebbb4a97b13fa788ccd8371aa01209100a032f9e (patch)
tree5f9ebbeca7f4284d72feb054ad0ae750cf42dbcb
parentcd5bf7500eaa59ff18e7a8ffc52447f196a042c1 (diff)
downloadqpid-python-jmx_mc_gsoc09.tar.gz
QPID-1932: updated queue view: modified component layout, removed deleteMessageFromTop() usage, allow selecting which messages are to be moved using the message tablejmx_mc_gsoc09
git-svn-id: https://svn.apache.org/repos/asf/qpid/branches/jmx_mc_gsoc09@792886 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/queue/QueueOperationsTabControl.java363
1 files changed, 208 insertions, 155 deletions
diff --git a/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/queue/QueueOperationsTabControl.java b/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/queue/QueueOperationsTabControl.java
index 74f802af2b..c98b5731e5 100644
--- a/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/queue/QueueOperationsTabControl.java
+++ b/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/queue/QueueOperationsTabControl.java
@@ -23,8 +23,11 @@ package org.apache.qpid.management.ui.views.queue;
import static org.apache.qpid.management.ui.Constants.CONSOLE_IMAGE;
import static org.apache.qpid.management.ui.Constants.RESULT;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
+import java.util.SortedSet;
+import java.util.TreeSet;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
@@ -37,7 +40,6 @@ import org.apache.qpid.management.ui.ManagedBean;
import org.apache.qpid.management.common.mbeans.ManagedQueue;
import org.apache.qpid.management.ui.jmx.JMXManagedObject;
import org.apache.qpid.management.ui.jmx.MBeanUtility;
-import org.apache.qpid.management.ui.views.NumberVerifyListener;
import org.apache.qpid.management.ui.views.TabControl;
import org.apache.qpid.management.ui.views.ViewUtility;
import org.eclipse.jface.viewers.ISelectionChangedListener;
@@ -67,8 +69,8 @@ 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;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
/**
@@ -77,7 +79,7 @@ import org.eclipse.ui.forms.widgets.FormToolkit;
public class QueueOperationsTabControl extends TabControl
{
private FormToolkit _toolkit;
- private Form _form;
+ private ScrolledForm _form;
private Table _table = null;
private TableViewer _tableViewer = null;
private Composite _paramsComposite = null;
@@ -97,7 +99,7 @@ public class QueueOperationsTabControl extends TabControl
_qmb = (ManagedQueue) MBeanServerInvocationHandler.newProxyInstance(mbsc,
mbean.getObjectName(), ManagedQueue.class, false);
_toolkit = new FormToolkit(_tabFolder.getDisplay());
- _form = _toolkit.createForm(_tabFolder);
+ _form = _toolkit.createScrolledForm(_tabFolder);
_form.getBody().setLayout(new GridLayout());
createComposites();
createWidgets();
@@ -106,7 +108,7 @@ public class QueueOperationsTabControl extends TabControl
private void createComposites()
{
_paramsComposite = _toolkit.createComposite(_form.getBody(), SWT.NONE);
- _paramsComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+ _paramsComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
_paramsComposite.setLayout(new GridLayout());
}
@@ -166,25 +168,31 @@ public class QueueOperationsTabControl extends TabControl
private void createWidgets()
{
- Group viewMessagesGroup = new Group(_paramsComposite, SWT.SHADOW_NONE);
- viewMessagesGroup.setBackground(_paramsComposite.getBackground());
- viewMessagesGroup.setText("View Messages");
- viewMessagesGroup.setLayout(new GridLayout(2,false));
- GridData gridData = new GridData(SWT.LEFT, SWT.TOP, true, false);
- viewMessagesGroup.setLayoutData(gridData);
+ Group messagesGroup = new Group(_paramsComposite, SWT.SHADOW_NONE | SWT.SCROLL_LINE);
+ messagesGroup.setBackground(_paramsComposite.getBackground());
+ messagesGroup.setText("Messages");
+ messagesGroup.setLayout(new GridLayout());
+ GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ messagesGroup.setLayoutData(gridData);
+
+ Composite tableAndButtonsComposite = _toolkit.createComposite(messagesGroup);
+ gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gridData.minimumHeight = 220;
+ gridData.heightHint = 220;
+ tableAndButtonsComposite.setLayoutData(gridData);
+ tableAndButtonsComposite.setLayout(new GridLayout(2,false));
- _table = new Table (viewMessagesGroup, SWT.SINGLE | SWT.SCROLL_LINE | SWT.BORDER | SWT.FULL_SELECTION);
+ _table = new Table (tableAndButtonsComposite, SWT.MULTI | 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;
+ GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
_table.setLayoutData(data);
_tableViewer = new TableViewer(_table);
final TableSorter tableSorter = new TableSorter();
String[] titles = {"AMQ ID", "Size(bytes)"};
- int[] bounds = { 110, 110 };
+ int[] bounds = { 175, 175 };
for (int i = 0; i < titles.length; i++)
{
final int index = i;
@@ -223,24 +231,90 @@ public class QueueOperationsTabControl extends TabControl
_tableViewer.setLabelProvider(new LabelProviderImpl());
_tableViewer.setSorter(tableSorter);
- Composite rightComposite = _toolkit.createComposite(viewMessagesGroup);
- gridData = new GridData(SWT.LEFT, SWT.FILL, true, false);
- gridData.heightHint = 325;
- rightComposite.setLayoutData(gridData);
- rightComposite.setLayout(new GridLayout(2,false));
+ //Side Buttons
+ Composite buttonsComposite = _toolkit.createComposite(tableAndButtonsComposite);
+ gridData = new GridData(SWT.FILL, SWT.FILL, false, true);
+ buttonsComposite.setLayoutData(gridData);
+ buttonsComposite.setLayout(new GridLayout());
- final Text headerText = new Text(rightComposite,SWT.WRAP | SWT.BORDER );
+ final Button viewSelectedMsgButton = _toolkit.createButton(buttonsComposite, "View Message Content ...", SWT.PUSH);
+ viewSelectedMsgButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
+ viewSelectedMsgButton.setEnabled(false);
+ viewSelectedMsgButton.addSelectionListener(new SelectionAdapter()
+ {
+ public void widgetSelected(SelectionEvent e)
+ {
+ if (_table.getSelectionIndex() == -1)
+ {
+ return;
+ }
+
+ viewMessageContent();
+ }
+ });
+
+ final Button moveMessagesButton = _toolkit.createButton(buttonsComposite, "Move Message(s) ...", SWT.PUSH);
+ moveMessagesButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
+ moveMessagesButton.setEnabled(false);
+ moveMessagesButton.addSelectionListener(new SelectionAdapter()
+ {
+ public void widgetSelected(SelectionEvent e)
+ {
+ if (_table.getSelectionIndex() == -1)
+ {
+ return;
+ }
+
+ moveMessages(moveMessagesButton.getShell());
+ }
+ });
+
+ final Button clearQueueButton = _toolkit.createButton(buttonsComposite, "Clear Queue", SWT.PUSH);
+ clearQueueButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
+ clearQueueButton.addSelectionListener(new SelectionAdapter()
+ {
+ public void widgetSelected(SelectionEvent e)
+ {
+ int response = ViewUtility.popupOkCancelConfirmationMessage("Clear Queue",
+ "Clear queue ?");
+ if (response == SWT.OK)
+ {
+ try
+ {
+ _qmb.clearQueue();
+ }
+ catch (Exception e2)
+ {
+ MBeanUtility.handleException(_mbean, e2);
+ }
+ //TODO:display result
+ refresh(_mbean);;
+ }
+ }
+ });
+
+ _toolkit.createLabel(messagesGroup, "Message Header: ");
+
+ //Redelivered status and header
+ Composite headerEtcComposite = _toolkit.createComposite(messagesGroup);
+ gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
+ headerEtcComposite.setLayoutData(gridData);
+ headerEtcComposite.setLayout(new GridLayout());
+
+ final Text headerText = new Text(headerEtcComposite, SWT.WRAP | SWT.BORDER );
headerText.setText("Select a message to view its header.");
headerText.setEditable(false);
- data = new GridData(SWT.FILL, SWT.TOP, true, false);
- data.widthHint = 440;
- data.heightHint = 300;
- data.horizontalSpan = 2;
+ data = new GridData(SWT.LEFT, SWT.TOP, false, false);
+ data.minimumHeight = 230;
+ data.heightHint = 230;
+ data.minimumWidth = 500;
+ data.widthHint = 500;
headerText.setLayoutData(data);
- Composite redeliveryComposite = _toolkit.createComposite(rightComposite);
+ Composite redeliveryComposite = _toolkit.createComposite(headerEtcComposite);
redeliveryComposite.setLayout(new GridLayout(2,false));
data = new GridData(SWT.LEFT, SWT.FILL, false, false);
+ data.minimumWidth = 150;
data.widthHint = 150;
redeliveryComposite.setLayoutData(data);
@@ -249,18 +323,8 @@ public class QueueOperationsTabControl extends TabControl
redeliveredText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
redeliveredText.setText("-");
redeliveredText.setEditable(false);
-
- final Button viewSelectedMsgButton = _toolkit.createButton(rightComposite, "View Selected Message Contents ...", SWT.PUSH);
- viewSelectedMsgButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
- viewSelectedMsgButton.setEnabled(false);
- viewSelectedMsgButton.addSelectionListener(new SelectionAdapter()
- {
- public void widgetSelected(SelectionEvent e)
- {
- viewMessageContent();
- }
- });
+ //listener for double clicking to view message content
_table.addMouseListener(new MouseListener()
{
// MouseListener implementation
@@ -273,20 +337,29 @@ public class QueueOperationsTabControl extends TabControl
public void mouseUp(MouseEvent e){}
});
+ //selection listener to enable and disable buttons, update header and redelivered info
_tableViewer.addSelectionChangedListener(new ISelectionChangedListener(){
public void selectionChanged(SelectionChangedEvent evt)
{
int selectionIndex = _table.getSelectionIndex();
- if (selectionIndex != -1)
+ if (selectionIndex == -1)
{
- viewSelectedMsgButton.setEnabled(true);
+ headerText.setText("Select a message to view its header.");
+ redeliveredText.setText("-");
+ viewSelectedMsgButton.setEnabled(false);
+ moveMessagesButton.setEnabled(false);
- final CompositeData selectedMsg = (CompositeData)_table.getItem(selectionIndex).getData();
+ return;
+ }
+ else
+ {
+ moveMessagesButton.setEnabled(true);
+ final CompositeData selectedMsg = (CompositeData)_table.getItem(selectionIndex).getData();
Boolean redelivered = (Boolean) selectedMsg.get(MSG_REDELIVERED);
redeliveredText.setText(redelivered.toString());
-
+
String[] msgHeader = (String[]) selectedMsg.get(MSG_HEADER);
headerText.setText("");
for(String s: msgHeader)
@@ -294,89 +367,19 @@ public class QueueOperationsTabControl extends TabControl
headerText.append(s + "\n");
}
}
- else
+
+ if (_table.getSelectionCount() > 1)
{
- headerText.setText("Select a message to view its header.");
- redeliveredText.setText("-");
viewSelectedMsgButton.setEnabled(false);
}
- }
- });
-
- Composite opsComposite = _toolkit.createComposite(_paramsComposite);
- gridData = new GridData(SWT.LEFT, SWT.FILL, false, true);
- opsComposite.setLayoutData(gridData);
- opsComposite.setLayout(new GridLayout(3,false));
-
- Group moveMessagesGroup = new Group(opsComposite, SWT.SHADOW_NONE);
- moveMessagesGroup.setBackground(opsComposite.getBackground());
- moveMessagesGroup.setText("Move Messages");
- gridData = new GridData(SWT.LEFT, SWT.TOP, true, false);
- moveMessagesGroup.setLayoutData(gridData);
- moveMessagesGroup.setLayout(new GridLayout(2,false));
-
- final Button moveMessagesButton = _toolkit.createButton(moveMessagesGroup, "Move Message(s) ...", SWT.PUSH);
- moveMessagesButton.addSelectionListener(new SelectionAdapter()
- {
- public void widgetSelected(SelectionEvent e)
- {
- moveMessages(moveMessagesButton.getShell());
- }
- });
-
-
- Group deleteMessagesGroup = new Group(opsComposite, SWT.SHADOW_NONE);
- deleteMessagesGroup.setBackground(opsComposite.getBackground());
- deleteMessagesGroup.setText("Delete Messages");
- gridData = new GridData(SWT.LEFT, SWT.TOP, true, false);
- deleteMessagesGroup.setLayoutData(gridData);
- deleteMessagesGroup.setLayout(new GridLayout(2, false));
-
- final Button deleteFromTopButton = _toolkit.createButton(deleteMessagesGroup, "Delete Message From Top of Queue", SWT.PUSH);
- deleteFromTopButton.addSelectionListener(new SelectionAdapter()
- {
- public void widgetSelected(SelectionEvent e)
- {
- int response = ViewUtility.popupOkCancelConfirmationMessage("Delete From Top",
- "Delete message from top of queue?");
- if (response == SWT.OK)
- {
- try
- {
- _qmb.deleteMessageFromTop();
- }
- catch (Exception e1)
- {
- MBeanUtility.handleException(_mbean, e1);
- }
- //TODO:display result
- refresh(_mbean);;
- }
- }
- });
-
- final Button clearQueueButton = _toolkit.createButton(deleteMessagesGroup, "Clear Queue", SWT.PUSH);
- clearQueueButton.addSelectionListener(new SelectionAdapter()
- {
- public void widgetSelected(SelectionEvent e)
- {
- int response = ViewUtility.popupOkCancelConfirmationMessage("Clear Queue",
- "Clear queue ?");
- if (response == SWT.OK)
+ else
{
- try
- {
- _qmb.clearQueue();
- }
- catch (Exception e2)
- {
- MBeanUtility.handleException(_mbean, e2);
- }
- //TODO:display result
- refresh(_mbean);;
+ viewSelectedMsgButton.setEnabled(true);
}
+
}
});
+
}
@@ -535,22 +538,21 @@ public class QueueOperationsTabControl extends TabControl
private void moveMessages(final Shell parent)
{
- final Shell shell = ViewUtility.createModalDialogShell(parent, "Move Messages");
+ final ArrayList<Long> rangeStarts = new ArrayList<Long>();
+ final ArrayList<Long> rangeEnds = new ArrayList<Long>();
+
+ gatherSelectedAMQMsgIDRanges(rangeStarts,rangeEnds);
+ String rangeString = getRangesString(rangeStarts,rangeEnds);
+ final Shell shell = ViewUtility.createModalDialogShell(parent, "Move Messages");
+
Composite idComposite = _toolkit.createComposite(shell, SWT.NONE);
idComposite.setBackground(shell.getBackground());
idComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
- idComposite.setLayout(new GridLayout(4,false));
-
- _toolkit.createLabel(idComposite,"From AMQ ID:").setBackground(shell.getBackground());
- final Text fromText = new Text(idComposite, SWT.BORDER);
- fromText.addVerifyListener(new NumberVerifyListener());
- fromText.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, false));
+ idComposite.setLayout(new GridLayout());
- _toolkit.createLabel(idComposite,"To AMQ ID:").setBackground(shell.getBackground());
- final Text toText = new Text(idComposite, SWT.BORDER);
- toText.addVerifyListener(new NumberVerifyListener());
- toText.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, false));
+ _toolkit.createLabel(idComposite,"Move message(s) with AMQ ID:").setBackground(shell.getBackground());
+ _toolkit.createLabel(idComposite,rangeString).setBackground(shell.getBackground());
Composite destinationComposite = _toolkit.createComposite(shell, SWT.NONE);
destinationComposite.setBackground(shell.getBackground());
@@ -589,38 +591,19 @@ public class QueueOperationsTabControl extends TabControl
{
public void widgetSelected(SelectionEvent e)
{
- String from = fromText.getText();
- String to = toText.getText();
String destQueue = destinationCombo.getItem(destinationCombo.getSelectionIndex()).toString();
-
- if (from == null || from.length() == 0)
- {
- ViewUtility.popupErrorMessage("Move Messages", "Please enter a valid 'from' ID");
- return;
- }
- if (Long.valueOf(from) == 0)
- {
- ViewUtility.popupErrorMessage("Move Messages", "Enter a 'from' ID greater than 0");
- return;
- }
-
- if (to == null || to.length() == 0)
- {
- ViewUtility.popupErrorMessage("Move Messages", "Please enter a valid 'to' ID");
- return;
- }
-
- if (Long.valueOf(to) == 0)
- {
- ViewUtility.popupErrorMessage("Move Messages", "Enter a 'to' ID greater than 0");
- return;
- }
-
shell.dispose();
try
{
- _qmb.moveMessages(Long.valueOf(from), Long.valueOf(to), destQueue);
+ for(int i=0 ; i < rangeStarts.size() ; i++)
+ {
+ Long from = rangeStarts.get(i);
+ Long to = rangeEnds.get(i);
+
+ _qmb.moveMessages(Long.valueOf(from), Long.valueOf(to), destQueue);
+ }
+
}
catch (Exception e4)
{
@@ -645,4 +628,74 @@ public class QueueOperationsTabControl extends TabControl
shell.open();
}
+ private void gatherSelectedAMQMsgIDRanges(ArrayList<Long> starts, ArrayList<Long> ends)
+ {
+ SortedSet<Long> amqIDs = new TreeSet<Long>();
+
+ for(Integer i : _table.getSelectionIndices())
+ {
+ CompositeData selectedMsg = (CompositeData)_table.getItem(i).getData();
+ amqIDs.add((Long)selectedMsg.get(MSG_AMQ_ID));
+ }
+
+ //initialise the first range
+ Long start = amqIDs.first();
+ Long end = amqIDs.first();
+
+ for(Long id : amqIDs)
+ {
+ if(id == amqIDs.first())
+ {
+ //skip first check, already initialised range
+ continue;
+ }
+
+ if(id == end +1)
+ {
+ //part of previous range, append
+ end = id;
+ }
+ else
+ {
+ //not in previous range, record existing start and end msg id values
+ starts.add(start);
+ ends.add(end);
+
+ //begin new range with this msg id
+ start = id;
+ end = id;
+ }
+ }
+
+ //record the last range created
+ starts.add(start);
+ ends.add(end);
+ }
+
+ private String getRangesString(ArrayList<Long> starts, ArrayList<Long> ends)
+ {
+ String idRangesString = new String("");
+
+ for(int i=0 ; i < starts.size() ; i++)
+ {
+ long start = starts.get(i);
+ long end = ends.get(i);
+
+ if(i != 0)
+ {
+ idRangesString = idRangesString.concat(", ");
+ }
+
+ if(start == end)
+ {
+ idRangesString = idRangesString.concat(String.valueOf(starts.get(i)));
+ }
+ else
+ {
+ idRangesString = idRangesString.concat(starts.get(i) + "-" + ends.get(i));
+ }
+ }
+
+ return idRangesString.concat(".");
+ }
}