diff options
Diffstat (limited to 'qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/NotificationsTabControl.java')
-rw-r--r-- | qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/NotificationsTabControl.java | 388 |
1 files changed, 388 insertions, 0 deletions
diff --git a/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/NotificationsTabControl.java b/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/NotificationsTabControl.java new file mode 100644 index 0000000000..ea49a5c006 --- /dev/null +++ b/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/NotificationsTabControl.java @@ -0,0 +1,388 @@ +/* + * + * 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 static org.apache.qpid.management.ui.Constants.BUTTON_CLEAR; +import static org.apache.qpid.management.ui.Constants.DESCRIPTION; +import static org.apache.qpid.management.ui.Constants.FONT_BOLD; +import static org.apache.qpid.management.ui.Constants.FONT_BUTTON; +import static org.apache.qpid.management.ui.Constants.FONT_ITALIC; +import static org.apache.qpid.management.ui.Constants.SUBSCRIBE_BUTTON; +import static org.apache.qpid.management.ui.Constants.UNSUBSCRIBE_BUTTON; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.qpid.management.ui.ApplicationRegistry; +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.IStructuredSelection; +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.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.Label; +import org.eclipse.swt.widgets.TabFolder; + +/** + * Creates control composite for Notifications tab + * @author Bhupendra Bhardwaj + */ +public class NotificationsTabControl extends VHNotificationsTabControl +{ + private static final String SELECT_NOTIFICATIONNAME = "Select Notification"; + private static final String SELECT_NOTIFICATIONTYPE = "Select Type"; + private SelectionListener selectionListener; + private SelectionListener comboListener; + + private Combo _notificationNameCombo; + private Combo _typesCombo; + private Label _descriptionLabel; + private Button _subscribeButton; + private Button _unsubscribeButton; + + public NotificationsTabControl(TabFolder tabFolder, ManagedBean mbean) + { + super(tabFolder); + _mbean = mbean; + + populateNotificationInfo(); + } + + protected void createWidgets() + { + selectionListener = new SelectionListenerImpl(); + comboListener = new ComboSelectionListener(); + createNotificationInfoComposite(); + addButtons(); + createTableViewer(); + } + + /** + * Creates composite and populates for displaying Notification Information (name, type, description) + * and creates buttons for subscribing or unsubscribing for notifications + */ + 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(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(FONT_BUTTON)); + _subscribeButton.setText(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(FONT_BUTTON)); + _unsubscribeButton.setText(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(DESCRIPTION + " : "); + fixedLabel.setFont(ApplicationRegistry.getFont(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(100); + _descriptionLabel.setLayoutData(formData); + _descriptionLabel.setText(" "); + _descriptionLabel.setFont(ApplicationRegistry.getFont(FONT_ITALIC)); + } + + /** + * Creates clear button + */ + protected void addButtons() + { + Composite composite = _toolkit.createComposite(_form.getBody(), SWT.NONE); + composite.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false)); + composite.setLayout(new GridLayout(2,false)); + + // Add Clear Button + _clearButton = _toolkit.createButton(composite, BUTTON_CLEAR, SWT.PUSH | SWT.CENTER); + _clearButton.setFont(ApplicationRegistry.getFont(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(MBeanView.getServer()); + IStructuredSelection ss = (IStructuredSelection)_tableViewer.getSelection(); + if(!ss.isEmpty()) + { + //clear selected Notifications + serverRegistry.clearNotifications(_mbean, ss.toList()); + } + else if(_notifications != null) + { + //clear all the notifications, if there are any + + //check the user is certain of this clear-all operation + int response = ViewUtility.popupOkCancelConfirmationMessage( + "Clear Notifications", "Clear all Notifications for this MBean?"); + if(response != SWT.OK) + { + return; + } + + synchronized(this) + { + List<NotificationObject> newList = new ArrayList<NotificationObject>(); + newList.addAll(_notifications); + serverRegistry.clearNotifications(_mbean, newList); + } + } + + refresh(); + } + }); + //add description + Label desc = _toolkit.createLabel(composite,"Clears the selected Notifications, or all if none are selected"); + desc.setLayoutData(new GridData(SWT.LEFT,SWT.CENTER, false, false)); + } + + @Override + public void refresh(ManagedBean mbean) + { + refresh(); + } + + /** + * Fills the notification information widgets for selected mbean + */ + private void populateNotificationInfo() + { + _notificationNameCombo.removeAll(); + NotificationInfoModel[] items = MBeanUtility.getNotificationInfo(_mbean); + if (items.length > 1) + { + _notificationNameCombo.add(SELECT_NOTIFICATIONNAME); + } + + 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); + + populateNotificationType(_notificationNameCombo.getItem(0)); + checkForEnablingButtons(); + } + + /** + * Checks and the enabing/disabling of buttons + */ + private void checkForEnablingButtons() + { + int nameIndex = _notificationNameCombo.getSelectionIndex(); + int itemCount = _notificationNameCombo.getItems().length; + if ((itemCount > 1) && (nameIndex == 0)) + { + _subscribeButton.setEnabled(false); + _unsubscribeButton.setEnabled(false); + _descriptionLabel.setText(""); + return; + } + + int typeIndex = _typesCombo.getSelectionIndex(); + itemCount = _typesCombo.getItems().length; + if ((itemCount > 1) && (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); + } + } + + /** + * Selection listener for subscribing or unsubscribing the notifications + */ + 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(); + } + } + + /** + * Selection listener class for the Notification Name. The notification type and description will be + * displayed accordingly + */ + private class ComboSelectionListener extends SelectionAdapter + { + public void widgetSelected(SelectionEvent e) + { + if (_mbean == null) + return; + + Combo combo = (Combo)e.getSource(); + if (combo == _notificationNameCombo) + { + String selectedItem = combo.getItem(combo.getSelectionIndex()); + populateNotificationType(selectedItem); + } + checkForEnablingButtons(); + } + } + + private void populateNotificationType(String notificationName) + { + NotificationInfoModel data = (NotificationInfoModel)_notificationNameCombo.getData(notificationName); + if (data == null) + { + _descriptionLabel.setText(""); + _typesCombo.select(0); + _typesCombo.setEnabled(false); + return; + } + _descriptionLabel.setText(data.getDescription()); + _typesCombo.removeAll(); + _typesCombo.setItems(data.getTypes()); + if (_typesCombo.getItemCount() > 1) + { + _typesCombo.add(SELECT_NOTIFICATIONTYPE, 0); + } + _typesCombo.select(0); + _typesCombo.setEnabled(true); + } + + /** + * Updates the table with new notifications received from mbean server for the selected mbean + */ + protected void updateTableViewer() + { + ServerRegistry serverRegistry = ApplicationRegistry.getServerRegistry(_mbean); + List<NotificationObject> newList = serverRegistry.getNotifications(_mbean); + synchronized(this) + { + _notifications = newList; + _tableViewer.setInput(_notifications); + } + } +} |