/*
*
* 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 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;
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 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;
/**
* 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);
}
}
}