diff options
author | Robert Gemmell <robbie@apache.org> | 2009-06-23 10:02:09 +0000 |
---|---|---|
committer | Robert Gemmell <robbie@apache.org> | 2009-06-23 10:02:09 +0000 |
commit | d4a13453731946c03c2a130055ccecb345042226 (patch) | |
tree | 3bee46131ca48c504e442fd87d51d1bac42329a2 | |
parent | 93d8d461634725d0079435f4f7d123e055253be4 (diff) | |
download | qpid-python-d4a13453731946c03c2a130055ccecb345042226.tar.gz |
QPID-1931: add initial Logging Management mbean view
git-svn-id: https://svn.apache.org/repos/asf/qpid/branches/jmx_mc_gsoc09@787617 13f79535-47bb-0310-9956-ffa450edef68
6 files changed, 1144 insertions, 1 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 8bb081ba83..acafc3b7b2 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 @@ -37,6 +37,8 @@ import org.apache.qpid.management.ui.model.NotificationInfoModel; import org.apache.qpid.management.ui.model.OperationData; import org.apache.qpid.management.ui.model.OperationDataModel; import org.apache.qpid.management.ui.views.users.UserManagementTabControl; +import org.apache.qpid.management.ui.views.logging.ConfigurationFileTabControl; +import org.apache.qpid.management.ui.views.logging.RuntimeTabControl; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; @@ -92,7 +94,17 @@ public class MBeanTabFolderFactory tempCreateGeneric(tabFolder, mbean); break; case LOGGING_MANAGEMENT: - tempCreateGeneric(tabFolder, mbean); + tab = new TabItem(tabFolder, SWT.NONE); + tab.setText("Runtime Options"); + controller = new RuntimeTabControl(tabFolder, mbean, mbsc); + tab.setControl(controller.getControl()); + tab.setData(TabControl.CONTROLLER, controller); + + tab = new TabItem(tabFolder, SWT.NONE); + tab.setText("ConfigurationFile Options"); + controller = new ConfigurationFileTabControl(tabFolder, mbean, mbsc); + tab.setControl(controller.getControl()); + tab.setData(TabControl.CONTROLLER, controller); break; case USER_MANAGEMENT: tab = new TabItem(tabFolder, SWT.NONE); diff --git a/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/logging/ConfigurationFileTabControl.java b/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/logging/ConfigurationFileTabControl.java new file mode 100644 index 0000000000..0265d42816 --- /dev/null +++ b/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/logging/ConfigurationFileTabControl.java @@ -0,0 +1,481 @@ +/* + * + * 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.logging; + +import javax.management.MBeanServerConnection; +import javax.management.MBeanServerInvocationHandler; +import javax.management.openmbean.CompositeData; +import javax.management.openmbean.TabularDataSupport; + +import static org.apache.qpid.management.ui.Constants.FONT_BOLD; + +import org.apache.qpid.management.ui.ApplicationRegistry; +import org.apache.qpid.management.ui.ManagedBean; +import org.apache.qpid.management.common.mbeans.LoggingManagement; +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.SelectionChangedEvent; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.TableViewerColumn; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +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.Group; +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.ui.forms.widgets.Form; +import org.eclipse.ui.forms.widgets.FormToolkit; + + +/** + * Control class for the LoggingManagement mbean ConfigFile Options tab. + */ +public class ConfigurationFileTabControl extends TabControl +{ + private FormToolkit _toolkit; + private Form _form; + private Table _table = null; + private TableViewer _tableViewer = null; + private Composite _headerComposite = null; + private Composite _paramsComposite = null; + + private Label _configFileRootLoggerLevelLabel = null; + private Label _logWatchIntervalLabel = null; + private String[] _availableLoggerLevels; + private TabularDataSupport _configFileLoggerLevels = null; + private LoggingManagement _lmmb; + + static final String LOGGER_NAME = LoggingManagement.COMPOSITE_ITEM_NAMES[0]; + static final String LOGGER_LEVEL = LoggingManagement.COMPOSITE_ITEM_NAMES[1]; + + public ConfigurationFileTabControl(TabFolder tabFolder, JMXManagedObject mbean, MBeanServerConnection mbsc) + { + super(tabFolder); + _mbean = mbean; + _lmmb = (LoggingManagement) + MBeanServerInvocationHandler.newProxyInstance(mbsc, mbean.getObjectName(), + LoggingManagement.class, false); + _toolkit = new FormToolkit(_tabFolder.getDisplay()); + _form = _toolkit.createForm(_tabFolder); + _form.getBody().setLayout(new GridLayout()); + createComposites(); + createWidgets(); + } + + private void createComposites() + { + + _headerComposite = _toolkit.createComposite(_form.getBody(), SWT.NONE); + _headerComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + _headerComposite.setLayout(new GridLayout()); + + _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; + } + + String configFileRootLoggerLevel = "-"; + try + { + configFileRootLoggerLevel = _lmmb.getConfigFileRootLoggerLevel(); + } + catch (Exception e1) + { + MBeanUtility.handleException(_mbean, e1); + } + + int log4jLogWatchInterval = -1; + try + { + log4jLogWatchInterval = _lmmb.getLog4jLogWatchInterval(); + } + catch (Exception e2) + { + MBeanUtility.handleException(_mbean, e2); + } + + _configFileLoggerLevels = null; + try + { + _configFileLoggerLevels = (TabularDataSupport) _lmmb.viewConfigFileLoggerLevels(); + } + catch (Exception e3) + { + MBeanUtility.handleException(_mbean, e3); + } + + _form.setVisible(false); + _configFileRootLoggerLevelLabel.setText(String.valueOf(configFileRootLoggerLevel)); + if (log4jLogWatchInterval == 0) + { + _logWatchIntervalLabel.setText("Disabled (0 sec)"); + } + else + { + _logWatchIntervalLabel.setText(String.valueOf(log4jLogWatchInterval) + " seconds"); + } + _tableViewer.setInput(_configFileLoggerLevels); + _form.setVisible(true); + layout(); + } + + public void layout() + { + _form.layout(true); + _form.getBody().layout(true, true); + } + + private void createWidgets() + { + try + { + _availableLoggerLevels = _lmmb.getAvailableLoggerLevels(); + } + catch(Exception e) + { + _availableLoggerLevels = new String[]{"ALL","TRACE","DEBUG","INFO","WARN","ERROR","FATAL","OFF"}; + } + + Label noteLabel = _toolkit.createLabel(_headerComposite, + "NOTE: These options modify only the configuration file. " + + "Changes made here will only take effect if either LogWatch " + + "is enabled or the broker is restarted."); + GridData gridData = new GridData(SWT.FILL, SWT.FILL, false, true); + noteLabel.setLayoutData(gridData); + + Group configFileLoggerLevelsGroup = new Group(_paramsComposite, SWT.SHADOW_NONE); + configFileLoggerLevelsGroup.setBackground(_paramsComposite.getBackground()); + configFileLoggerLevelsGroup.setText("Config File Logger Levels"); + configFileLoggerLevelsGroup.setLayout(new GridLayout()); + gridData = new GridData(SWT.LEFT, SWT.TOP, true, false); + configFileLoggerLevelsGroup.setLayoutData(gridData); + + Composite tableComposite = _toolkit.createComposite(configFileLoggerLevelsGroup); + gridData = new GridData(SWT.FILL, SWT.FILL, false, true); + tableComposite .setLayoutData(gridData); + GridLayout gridLayout = new GridLayout(); + gridData.heightHint = 250; + tableComposite .setLayout(gridLayout); + + _table = new Table (tableComposite, SWT.SINGLE | SWT.SCROLL_LINE | SWT.BORDER | SWT.FULL_SELECTION); + _table.setLinesVisible (true); + _table.setHeaderVisible (true); + GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); + data.heightHint = 350; + _table.setLayoutData(data); + + _tableViewer = new TableViewer(_table); + final LoggingTableSorter tableSorter = new LoggingTableSorter(); + + String[] titles = { LOGGER_NAME, LOGGER_LEVEL }; + int[] bounds = { 600, 60 }; + for (int i = 0; i < titles.length; i++) + { + final int index = i; + final TableViewerColumn viewerColumn = new TableViewerColumn(_tableViewer, SWT.NONE); + final TableColumn column = viewerColumn.getColumn(); + + 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 LoggingTableContentProvider()); + _tableViewer.setLabelProvider(new LoggingTableLabelProvider()); + _tableViewer.setSorter(tableSorter); + _table.setSortColumn(_table.getColumn(0)); + _table.setSortDirection(SWT.UP); + _table.addMouseListener(new MouseListener() + { + public void mouseDoubleClick(MouseEvent event) + { + editLoggerLevel(_table.getShell()); + } + + public void mouseDown(MouseEvent e){} + public void mouseUp(MouseEvent e){} + }); + + final Button logLevelEditButton = _toolkit.createButton(configFileLoggerLevelsGroup, "Edit Selected Logger...", SWT.PUSH); + logLevelEditButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false)); + logLevelEditButton.setEnabled(false); + logLevelEditButton.addSelectionListener(new SelectionAdapter() + { + public void widgetSelected(SelectionEvent e) + { + editLoggerLevel(logLevelEditButton.getShell()); + } + }); + + _tableViewer.addSelectionChangedListener(new ISelectionChangedListener(){ + public void selectionChanged(SelectionChangedEvent evt) + { + int selectionIndex = _table.getSelectionIndex(); + + if(selectionIndex != -1) + { + logLevelEditButton.setEnabled(true); + } + else + { + logLevelEditButton.setEnabled(false); + } + } + }); + + + Composite attributesComposite = _toolkit.createComposite(_paramsComposite); + gridData = new GridData(SWT.LEFT, SWT.FILL, false, true); + attributesComposite.setLayoutData(gridData); + gridLayout = new GridLayout(3,false); + attributesComposite.setLayout(gridLayout); + + Group configFileRootLoggerLevelGroup = new Group(attributesComposite, SWT.SHADOW_NONE); + configFileRootLoggerLevelGroup.setBackground(attributesComposite.getBackground()); + configFileRootLoggerLevelGroup.setText("Config File RootLogger Level"); + gridData = new GridData(SWT.LEFT, SWT.TOP, true, false); + configFileRootLoggerLevelGroup.setLayoutData(gridData); + configFileRootLoggerLevelGroup.setLayout(new GridLayout(2,false)); + + _configFileRootLoggerLevelLabel = _toolkit.createLabel(configFileRootLoggerLevelGroup, "-"); + _configFileRootLoggerLevelLabel.setFont(ApplicationRegistry.getFont(FONT_BOLD)); + _configFileRootLoggerLevelLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false)); + + final Button configFileRootLoggerLevelButton = _toolkit.createButton(configFileRootLoggerLevelGroup, "Edit ...", SWT.PUSH); + configFileRootLoggerLevelButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false)); + configFileRootLoggerLevelButton.addSelectionListener(new SelectionAdapter() + { + public void widgetSelected(SelectionEvent e) + { + editRootLoggerLevel(configFileRootLoggerLevelButton.getShell()); + } + }); + + + Group logWatchIntervalGroup = new Group(attributesComposite, SWT.SHADOW_NONE); + logWatchIntervalGroup.setBackground(attributesComposite.getBackground()); + logWatchIntervalGroup.setText("Log Watch Interval"); + gridData = new GridData(SWT.LEFT, SWT.TOP, true, false); + logWatchIntervalGroup.setLayoutData(gridData); + logWatchIntervalGroup.setLayout(new GridLayout()); + + _logWatchIntervalLabel = _toolkit.createLabel(logWatchIntervalGroup, "-"); + _logWatchIntervalLabel.setFont(ApplicationRegistry.getFont(FONT_BOLD)); + _logWatchIntervalLabel.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false)); + } + + + + private void editLoggerLevel(Shell parent) + { + int selectionIndex = _table.getSelectionIndex(); + + if (selectionIndex != -1) + { + final CompositeData selectedLogger = (CompositeData)_table.getItem(selectionIndex).getData(); + String loggerName = selectedLogger.get(LOGGER_NAME).toString(); + + final Shell shell = ViewUtility.createModalDialogShell(parent, "Set Config File Logger Level"); + + Composite loggerComp = _toolkit.createComposite(shell); + loggerComp.setBackground(shell.getBackground()); + loggerComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + loggerComp.setLayout(new GridLayout(2,false)); + + _toolkit.createLabel(loggerComp, "Logger: ").setBackground(shell.getBackground()); + _toolkit.createLabel(loggerComp, loggerName).setBackground(shell.getBackground()); + + Composite levelComp = _toolkit.createComposite(shell); + levelComp.setBackground(shell.getBackground()); + levelComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + levelComp.setLayout(new GridLayout(2,false)); + + _toolkit.createLabel(levelComp,"Level: ").setBackground(levelComp.getBackground()); + final Combo levelCombo = new Combo (levelComp, SWT.READ_ONLY ); + levelCombo.setItems(_availableLoggerLevels); + levelCombo.select(0); + + Composite okCancelButtonsComp = _toolkit.createComposite(shell); + okCancelButtonsComp.setBackground(shell.getBackground()); + okCancelButtonsComp.setLayoutData(new GridData(SWT.RIGHT, SWT.FILL, true, true)); + okCancelButtonsComp.setLayout(new GridLayout(2,false)); + + Button okButton = _toolkit.createButton(okCancelButtonsComp, "OK", SWT.PUSH); + okButton.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false)); + Button cancelButton = _toolkit.createButton(okCancelButtonsComp, "Cancel", SWT.PUSH); + cancelButton.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false)); + + okButton.addSelectionListener(new SelectionAdapter() + { + public void widgetSelected(SelectionEvent e) + { + String logger = selectedLogger.get(LOGGER_NAME).toString(); + String level = levelCombo.getItem(levelCombo.getSelectionIndex()).toString(); + + shell.close(); + + try + { + _lmmb.setConfigFileLoggerLevel(logger, level); + //TODO: display result? + } + catch (Exception e4) + { + MBeanUtility.handleException(_mbean, e4); + } + + refresh(_mbean); + } + }); + + cancelButton.addSelectionListener(new SelectionAdapter() + { + public void widgetSelected(SelectionEvent e) + { + shell.dispose(); + } + }); + + shell.pack(); + shell.open(); + } + } + + private void editRootLoggerLevel(Shell parent) + { + final Shell shell = ViewUtility.createModalDialogShell(parent, "ConfigFile RootLogger Level"); + + Composite levelComp = _toolkit.createComposite(shell); + levelComp.setBackground(shell.getBackground()); + levelComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + levelComp.setLayout(new GridLayout(2,false)); + + _toolkit.createLabel(levelComp,"RootLogger level: ").setBackground(levelComp.getBackground()); + final Combo levelCombo = new Combo (levelComp, SWT.READ_ONLY ); + levelCombo.setItems(_availableLoggerLevels); + levelCombo.select(0); + + Composite okCancelButtonsComp = _toolkit.createComposite(shell); + okCancelButtonsComp.setBackground(shell.getBackground()); + okCancelButtonsComp.setLayoutData(new GridData(SWT.RIGHT, SWT.FILL, true, true)); + okCancelButtonsComp.setLayout(new GridLayout(2,false)); + + Button okButton = _toolkit.createButton(okCancelButtonsComp, "OK", SWT.PUSH); + okButton.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false)); + Button cancelButton = _toolkit.createButton(okCancelButtonsComp, "Cancel", SWT.PUSH); + cancelButton.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false)); + + okButton.addSelectionListener(new SelectionAdapter() + { + public void widgetSelected(SelectionEvent e) + { + String selection = levelCombo.getItem(levelCombo.getSelectionIndex()).toString(); + shell.dispose(); + try + { + _lmmb.setConfigFileRootLoggerLevel(selection); + //TODO: display result? + } + catch (Exception e5) + { + MBeanUtility.handleException(_mbean, e5); + } + refresh(_mbean); + } + }); + + cancelButton.addSelectionListener(new SelectionAdapter() + { + public void widgetSelected(SelectionEvent e) + { + shell.dispose(); + } + }); + + shell.setDefaultButton(okButton); + shell.pack(); + shell.open(); + } +} diff --git a/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/logging/LoggingTableContentProvider.java b/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/logging/LoggingTableContentProvider.java new file mode 100644 index 0000000000..6ef3ab70a7 --- /dev/null +++ b/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/logging/LoggingTableContentProvider.java @@ -0,0 +1,52 @@ +/* + * + * 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.logging; + +import java.util.Collection; + +import javax.management.openmbean.TabularDataSupport; + +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.Viewer; + +/** + * Content Provider class for theLogging Management table viewers + */ +public class LoggingTableContentProvider 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(); + } +}
\ No newline at end of file diff --git a/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/logging/LoggingTableLabelProvider.java b/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/logging/LoggingTableLabelProvider.java new file mode 100644 index 0000000000..27f6040d7d --- /dev/null +++ b/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/logging/LoggingTableLabelProvider.java @@ -0,0 +1,59 @@ +/* + * + * 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.logging; + +import javax.management.openmbean.CompositeDataSupport; + +import org.apache.qpid.management.common.mbeans.LoggingManagement; +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.swt.graphics.Image; + +/** + * Label Provider class for the LoggingManagement table viewers + */ +public class LoggingTableLabelProvider extends LabelProvider implements ITableLabelProvider +{ + private static final String LOGGER_NAME = LoggingManagement.COMPOSITE_ITEM_NAMES[0]; + private static final String LOGGER_LEVEL = LoggingManagement.COMPOSITE_ITEM_NAMES[1]; + + @Override + public String getColumnText(Object element, int columnIndex) + { + switch (columnIndex) + { + case 0 : // logger name column + return (String) ((CompositeDataSupport) element).get(LOGGER_NAME); + case 1 : // logger level column + return (String) ((CompositeDataSupport) element).get(LOGGER_LEVEL); + default : + return "-"; + } + } + + @Override + public Image getColumnImage(Object element, int columnIndex) + { + return null; + } + + +} diff --git a/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/logging/LoggingTableSorter.java b/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/logging/LoggingTableSorter.java new file mode 100644 index 0000000000..c1833148d7 --- /dev/null +++ b/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/logging/LoggingTableSorter.java @@ -0,0 +1,90 @@ +/* + * + * 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.logging; + +import javax.management.openmbean.CompositeData; + +import org.apache.qpid.management.common.mbeans.LoggingManagement; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerSorter; + +/** + * Sorter class for the Logging Management table viewers. + */ +public class LoggingTableSorter extends ViewerSorter +{ + private static final String LOGGER_NAME = LoggingManagement.COMPOSITE_ITEM_NAMES[0]; + private static final String LOGGER_LEVEL = LoggingManagement.COMPOSITE_ITEM_NAMES[1]; + private static final int ASCENDING = 0; + private static final int DESCENDING = 1; + + private int column; + private int direction; + + public LoggingTableSorter() + { + 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 logger1 = (CompositeData) e1; + CompositeData logger2 = (CompositeData) e2; + + int comparison = 0; + switch(column) + { + case 0: + comparison = String.valueOf(logger1.get(LOGGER_NAME)).compareTo( + String.valueOf(logger2.get(LOGGER_NAME))); + break; + case 1: + comparison = String.valueOf(logger1.get(LOGGER_LEVEL)).compareTo( + String.valueOf(logger2.get(LOGGER_LEVEL))); + break; + default: + comparison = 0; + } + // If descending order, flip the direction + if (direction == DESCENDING) + { + comparison = -comparison; + } + return comparison; + } +} diff --git a/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/logging/RuntimeTabControl.java b/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/logging/RuntimeTabControl.java new file mode 100644 index 0000000000..9c829765d0 --- /dev/null +++ b/qpid/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/logging/RuntimeTabControl.java @@ -0,0 +1,449 @@ +/* + * + * 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.logging; + +import javax.management.MBeanServerConnection; +import javax.management.MBeanServerInvocationHandler; +import javax.management.openmbean.CompositeData; +import javax.management.openmbean.TabularDataSupport; + +import static org.apache.qpid.management.ui.Constants.FONT_BOLD; + +import org.apache.qpid.management.ui.ApplicationRegistry; +import org.apache.qpid.management.ui.ManagedBean; +import org.apache.qpid.management.common.mbeans.LoggingManagement; +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.SelectionChangedEvent; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.TableViewerColumn; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +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.Group; +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.ui.forms.widgets.Form; +import org.eclipse.ui.forms.widgets.FormToolkit; + + +/** + * Control class for the LoggingManagement mbean Runtime Options tab. + */ +public class RuntimeTabControl extends TabControl +{ + private FormToolkit _toolkit; + private Form _form; + private Table _table = null; + private TableViewer _tableViewer = null; + private Composite _headerComposite = null; + private Composite _paramsComposite = null; + + private Label _runtimeRootLoggerLevelLabel = null; + private String[] _availableLoggerLevels; + private TabularDataSupport _runtimeLoggerLevels = null; + private LoggingManagement _lmmb; + + static final String LOGGER_NAME = LoggingManagement.COMPOSITE_ITEM_NAMES[0]; + static final String LOGGER_LEVEL = LoggingManagement.COMPOSITE_ITEM_NAMES[1]; + + public RuntimeTabControl(TabFolder tabFolder, JMXManagedObject mbean, MBeanServerConnection mbsc) + { + super(tabFolder); + _mbean = mbean; + _lmmb = (LoggingManagement) + MBeanServerInvocationHandler.newProxyInstance(mbsc, mbean.getObjectName(), + LoggingManagement.class, false); + _toolkit = new FormToolkit(_tabFolder.getDisplay()); + _form = _toolkit.createForm(_tabFolder); + _form.getBody().setLayout(new GridLayout()); + createComposites(); + createWidgets(); + } + + private void createComposites() + { + + _headerComposite = _toolkit.createComposite(_form.getBody(), SWT.NONE); + _headerComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + _headerComposite.setLayout(new GridLayout()); + + _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; + } + + String runtimeRootLoggerLevel = "-"; + try + { + runtimeRootLoggerLevel = _lmmb.getRuntimeRootLoggerLevel(); + } + catch(Exception e1) + { + MBeanUtility.handleException(_mbean, e1); + } + + _runtimeLoggerLevels = null; + try + { + _runtimeLoggerLevels = (TabularDataSupport) _lmmb.viewEffectiveRuntimeLoggerLevels(); + } + catch(Exception e2) + { + MBeanUtility.handleException(_mbean, e2); + } + + _form.setVisible(false); + _runtimeRootLoggerLevelLabel.setText(String.valueOf(runtimeRootLoggerLevel)); + _tableViewer.setInput(_runtimeLoggerLevels); + _form.setVisible(true); + layout(); + } + + public void layout() + { + _form.layout(true); + _form.getBody().layout(true, true); + } + + private void createWidgets() + { + try + { + _availableLoggerLevels = _lmmb.getAvailableLoggerLevels(); + } + catch(Exception e) + { + _availableLoggerLevels = new String[]{"ALL","TRACE","DEBUG","INFO","WARN","ERROR","FATAL","OFF"}; + } + + Label noteLabel = _toolkit.createLabel(_headerComposite, + "NOTE: These options modify only the live runtime settings. " + + "Changes made here will be lost following broker restart if " + + "they introduce non-default values."); + GridData gridData = new GridData(SWT.FILL, SWT.FILL, false, true); + noteLabel.setLayoutData(gridData); + + Group effectiveRuntimeLoggerLevelsGroup = new Group(_paramsComposite, SWT.SHADOW_NONE); + effectiveRuntimeLoggerLevelsGroup.setBackground(_paramsComposite.getBackground()); + effectiveRuntimeLoggerLevelsGroup.setText("Effective Runtime Logger Levels"); + effectiveRuntimeLoggerLevelsGroup.setLayout(new GridLayout()); + gridData = new GridData(SWT.LEFT, SWT.TOP, true, false); + effectiveRuntimeLoggerLevelsGroup.setLayoutData(gridData); + + Composite tableComposite = _toolkit.createComposite(effectiveRuntimeLoggerLevelsGroup); + gridData = new GridData(SWT.FILL, SWT.FILL, false, true); + tableComposite .setLayoutData(gridData); + GridLayout gridLayout = new GridLayout(); + gridData.heightHint = 250; + tableComposite .setLayout(gridLayout); + + _table = new Table (tableComposite, SWT.SINGLE | SWT.SCROLL_LINE | SWT.BORDER | SWT.FULL_SELECTION); + _table.setLinesVisible (true); + _table.setHeaderVisible (true); + GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); + data.heightHint = 350; + _table.setLayoutData(data); + + _tableViewer = new TableViewer(_table); + final LoggingTableSorter tableSorter = new LoggingTableSorter(); + + String[] titles = { LOGGER_NAME, LOGGER_LEVEL }; + int[] bounds = { 600, 60 }; + for (int i = 0; i < titles.length; i++) + { + final int index = i; + final TableViewerColumn viewerColumn = new TableViewerColumn(_tableViewer, SWT.NONE); + final TableColumn column = viewerColumn.getColumn(); + + 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 LoggingTableContentProvider()); + _tableViewer.setLabelProvider(new LoggingTableLabelProvider()); + _tableViewer.setSorter(tableSorter); + _table.setSortColumn(_table.getColumn(0)); + _table.setSortDirection(SWT.UP); + _table.addMouseListener(new MouseListener() + { + public void mouseDoubleClick(MouseEvent event) + { + editLoggerLevel(_table.getShell()); + } + + public void mouseDown(MouseEvent e){} + public void mouseUp(MouseEvent e){} + }); + + final Button logLevelEditButton = _toolkit.createButton(effectiveRuntimeLoggerLevelsGroup, "Edit Selected Logger...", SWT.PUSH); + logLevelEditButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false)); + logLevelEditButton.setEnabled(false); + logLevelEditButton.addSelectionListener(new SelectionAdapter() + { + public void widgetSelected(SelectionEvent e) + { + editLoggerLevel(logLevelEditButton.getShell()); + } + }); + + _tableViewer.addSelectionChangedListener(new ISelectionChangedListener(){ + public void selectionChanged(SelectionChangedEvent evt) + { + int selectionIndex = _table.getSelectionIndex(); + + if (selectionIndex != -1) + { + logLevelEditButton.setEnabled(true); + } + else + { + logLevelEditButton.setEnabled(false); + } + } + }); + + Composite attributesComposite = _toolkit.createComposite(_paramsComposite); + gridData = new GridData(SWT.FILL, SWT.FILL, false, true); + attributesComposite.setLayoutData(gridData); + gridLayout = new GridLayout(3,false); + attributesComposite.setLayout(gridLayout); + + Group runtimeRootLoggerGroup = new Group(attributesComposite, SWT.SHADOW_NONE); + runtimeRootLoggerGroup.setBackground(attributesComposite.getBackground()); + runtimeRootLoggerGroup.setText("Runtime RootLogger Level"); + gridData = new GridData(SWT.LEFT, SWT.CENTER, true, false); + runtimeRootLoggerGroup.setLayoutData(gridData); + runtimeRootLoggerGroup.setLayout(new GridLayout(2,false)); + + _runtimeRootLoggerLevelLabel = _toolkit.createLabel(runtimeRootLoggerGroup, "-"); + _runtimeRootLoggerLevelLabel.setFont(ApplicationRegistry.getFont(FONT_BOLD)); + _runtimeRootLoggerLevelLabel.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false)); + + final Button runtimeRootLoggerLevelButton = _toolkit.createButton(runtimeRootLoggerGroup, "Edit ...", SWT.PUSH); + runtimeRootLoggerLevelButton.addSelectionListener(new SelectionAdapter() + { + public void widgetSelected(SelectionEvent e) + { + editRootLoggerLevel(runtimeRootLoggerLevelButton.getShell()); + } + }); + } + + private void editLoggerLevel(Shell parent) + { + int selectionIndex = _table.getSelectionIndex(); + + if (selectionIndex != -1) + { + final CompositeData selectedLogger = (CompositeData)_table.getItem(selectionIndex).getData(); + String loggerName = selectedLogger.get(LOGGER_NAME).toString(); + + final Shell shell = ViewUtility.createModalDialogShell(parent, "Set Runtime Logger Level"); + + Composite loggerComp = _toolkit.createComposite(shell); + loggerComp.setBackground(shell.getBackground()); + loggerComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + loggerComp.setLayout(new GridLayout(2,false)); + + _toolkit.createLabel(loggerComp, "Logger: ").setBackground(shell.getBackground()); + _toolkit.createLabel(loggerComp, loggerName).setBackground(shell.getBackground()); + + Composite levelComp = _toolkit.createComposite(shell); + levelComp.setBackground(shell.getBackground()); + levelComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + levelComp.setLayout(new GridLayout(2,false)); + + _toolkit.createLabel(levelComp,"Level: ").setBackground(levelComp.getBackground()); + final Combo levelCombo = new Combo (levelComp, SWT.READ_ONLY ); + levelCombo.setItems(_availableLoggerLevels); + levelCombo.select(0); + + Composite okCancelButtonsComp = _toolkit.createComposite(shell); + okCancelButtonsComp.setBackground(shell.getBackground()); + okCancelButtonsComp.setLayoutData(new GridData(SWT.RIGHT, SWT.FILL, true, true)); + okCancelButtonsComp.setLayout(new GridLayout(2,false)); + + Button okButton = _toolkit.createButton(okCancelButtonsComp, "OK", SWT.PUSH); + okButton.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false)); + Button cancelButton = _toolkit.createButton(okCancelButtonsComp, "Cancel", SWT.PUSH); + cancelButton.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false)); + + okButton.addSelectionListener(new SelectionAdapter() + { + public void widgetSelected(SelectionEvent e) + { + String logger = selectedLogger.get(LOGGER_NAME).toString(); + String level = levelCombo.getItem(levelCombo.getSelectionIndex()).toString(); + + shell.close(); + + try + { + _lmmb.setRuntimeLoggerLevel(logger, level); + } + catch(Exception e3) + { + MBeanUtility.handleException(_mbean, e3); + } + //TODO: display result? + + refresh(_mbean); + } + }); + + cancelButton.addSelectionListener(new SelectionAdapter() + { + public void widgetSelected(SelectionEvent e) + { + shell.dispose(); + } + }); + + shell.setDefaultButton(okButton); + shell.pack(); + shell.open(); + } + } + + private void editRootLoggerLevel(Shell parent) + { + final Shell shell = ViewUtility.createModalDialogShell(parent, "Runtime RootLogger Level"); + + Composite levelComp = _toolkit.createComposite(shell); + levelComp.setBackground(shell.getBackground()); + levelComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + levelComp.setLayout(new GridLayout(2,false)); + + _toolkit.createLabel(levelComp,"RootLogger level: ").setBackground(levelComp.getBackground()); + final Combo levelCombo = new Combo (levelComp, SWT.READ_ONLY ); + levelCombo.setItems(_availableLoggerLevels); + levelCombo.select(0); + + Composite okCancelButtonsComp = _toolkit.createComposite(shell); + okCancelButtonsComp.setBackground(shell.getBackground()); + okCancelButtonsComp.setLayoutData(new GridData(SWT.RIGHT, SWT.FILL, true, true)); + okCancelButtonsComp.setLayout(new GridLayout(2,false)); + + Button okButton = _toolkit.createButton(okCancelButtonsComp, "OK", SWT.PUSH); + okButton.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false)); + Button cancelButton = _toolkit.createButton(okCancelButtonsComp, "Cancel", SWT.PUSH); + cancelButton.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false)); + + okButton.addSelectionListener(new SelectionAdapter() + { + public void widgetSelected(SelectionEvent e) + { + String selection = levelCombo.getItem(levelCombo.getSelectionIndex()).toString(); + shell.dispose(); + + try + { + _lmmb.setRuntimeRootLoggerLevel(selection); + } + catch(Exception e4) + { + MBeanUtility.handleException(_mbean, e4); + } + + refresh(_mbean); + //TODO: display result? + } + }); + + cancelButton.addSelectionListener(new SelectionAdapter() + { + public void widgetSelected(SelectionEvent e) + { + shell.dispose(); + } + }); + + shell.setDefaultButton(okButton); + shell.pack(); + shell.open(); + } +} |