/** * Copyright (c) 2012 AGETO Service GmbH and others. * All rights reserved. * * This program and the accompanying materials are made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Gunnar Wagenknecht - initial API and implementation * Peter Grube - rework to Admin UI */ package org.eclipse.gyrex.admin.ui.logback.internal; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.gyrex.admin.ui.internal.widgets.NonBlockingStatusDialog; import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.DialogField; import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.IDialogFieldListener; import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.IListAdapter; import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.LayoutUtil; import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.ListDialogField; import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.SelectionButtonDialogField; import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.SelectionButtonDialogFieldGroup; import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.Separator; import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.StringDialogField; import org.eclipse.gyrex.common.identifiers.IdHelper; import org.eclipse.gyrex.logback.config.model.Appender; import org.eclipse.gyrex.logback.config.model.Logger; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.window.Window; import org.eclipse.rap.rwt.widgets.DialogCallback; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.apache.commons.lang.StringUtils; import ch.qos.logback.classic.Level; public class LoggerSettingsDialog extends NonBlockingStatusDialog { /** serialVersionUID */ private static final long serialVersionUID = 1L; private final StringDialogField nameField = new StringDialogField(); private final SelectionButtonDialogField inheritAppendersField = new SelectionButtonDialogField(SWT.CHECK); private final SelectionButtonDialogFieldGroup levelField = new SelectionButtonDialogFieldGroup(SWT.RADIO, new String[] { "ALL", "DEBUG", "INFO", "WARN", "ERROR", "OFF" }, 6); private final ListDialogField appenderRefsField = new ListDialogField(new IListAdapter() { @Override public void customButtonPressed(final ListDialogField field, final int index) { if (index == 0) { addAppenderRefButtonPressed(); } } @Override public void doubleClicked(final ListDialogField field) { } @Override public void selectionChanged(final ListDialogField field) { } }, new String[] { "Add...", "Remove" }, new LogbackLabelProvider()); private final boolean isRoot; private final String originalName; private final Level originalLevel; private final boolean originalInherit; private final Collection<String> originalAppenderRefs; private final Collection<Appender> allAvailableAppenders; private Logger logger; public LoggerSettingsDialog(final Shell parent, final Collection<Appender> allAvailableAppenders) { this(parent, null, null, true, null, allAvailableAppenders, false); } public LoggerSettingsDialog(final Shell parent, final Level defaultLevel, final Collection<String> defaultAppenderRefs, final Collection<Appender> allAvailableAppenders) { this(parent, null, defaultLevel, false, defaultAppenderRefs, allAvailableAppenders, true); } public LoggerSettingsDialog(final Shell parent, final String name, final Level level, final boolean inheritOtherAppenders, final Collection<String> originalAppenderRefs, final Collection<Appender> allAvailableAppenders) { this(parent, name, level, inheritOtherAppenders, originalAppenderRefs, allAvailableAppenders, false); } private LoggerSettingsDialog(final Shell parent, final String originalName, final Level originalLevel, final boolean originalInherit, final Collection<String> originalAppenderRefs, final Collection<Appender> allAvailableAppenders, final boolean isRoot) { super(parent); this.originalName = originalName; this.originalLevel = originalLevel; this.originalInherit = originalInherit; this.originalAppenderRefs = originalAppenderRefs; this.allAvailableAppenders = allAvailableAppenders; this.isRoot = isRoot; if (isRoot) { setTitle("Default Logger Settings"); } else { setTitle(null != originalLevel ? "Edit Logger" : "New Logger"); } setShellStyle(SWT.DIALOG_TRIM | SWT.RESIZE | SWT.APPLICATION_MODAL); } void addAppenderRefButtonPressed() { final SelectAppenderDialog dialog = new SelectAppenderDialog(getShell(), allAvailableAppenders); dialog.openNonBlocking(new DialogCallback() { @Override public void dialogClosed(final int returnCode) { if (returnCode == Window.OK) { final Appender appender = (Appender) dialog.getFirstResult(); if (null != appender) { if (appenderRefsField.getElements().contains(appender.getName())) { return; } appenderRefsField.addElement(appender.getName()); } } } }); } @Override protected Control createDialogArea(final Composite parent) { final Composite composite = (Composite) super.createDialogArea(parent); final GridData gd = (GridData) composite.getLayoutData(); gd.minimumHeight = convertVerticalDLUsToPixels(200); gd.minimumWidth = convertHorizontalDLUsToPixels(400); nameField.setLabelText("Name:"); levelField.setLabelText("Level:"); inheritAppendersField.setLabelText("Inherit appenders from parent loggers."); inheritAppendersField.setSelection(true); appenderRefsField.setLabelText("Appenders:"); appenderRefsField.setRemoveButtonIndex(1); final IDialogFieldListener validateListener = new IDialogFieldListener() { @Override public void dialogFieldChanged(final DialogField field) { validate(); } }; nameField.setDialogFieldListener(validateListener); final Text warning = new Text(composite, SWT.WRAP | SWT.READ_ONLY); warning.setText("Warning: this dialog is ugly. Please help us improve the UI. Any mockups and/or patches are very much appreciated!"); warning.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false)); LayoutUtil.doDefaultLayout(composite, new DialogField[] { new Separator(), nameField, levelField, inheritAppendersField, appenderRefsField }, true); LayoutUtil.setHorizontalGrabbing(nameField.getTextControl(null)); LayoutUtil.setHorizontalGrabbing(levelField.getSelectionButtonsGroup(null)); LayoutUtil.setHorizontalGrabbing(appenderRefsField.getListControl(null)); final GridLayout masterLayout = (GridLayout) composite.getLayout(); masterLayout.marginWidth = 5; masterLayout.marginHeight = 5; LayoutUtil.setHorizontalSpan(warning, masterLayout.numColumns); if (isRoot) { nameField.setEnabled(false); nameField.setText("DEFAULT"); inheritAppendersField.setEnabled(false); inheritAppendersField.setSelection(false); } else { if (null != originalName) { nameField.setText(originalName); } inheritAppendersField.setSelection(originalInherit); } if (null != originalLevel) { levelField.setSelection(0, false); levelField.setSelection(1, false); levelField.setSelection(2, false); levelField.setSelection(3, false); levelField.setSelection(4, false); levelField.setSelection(5, false); levelField.setSelection(6, false); switch (originalLevel.levelInt) { case Level.ALL_INT: levelField.setSelection(0, true); break; case Level.DEBUG_INT: levelField.setSelection(1, true); break; case Level.INFO_INT: levelField.setSelection(2, true); break; case Level.WARN_INT: levelField.setSelection(3, true); break; case Level.ERROR_INT: levelField.setSelection(4, true); break; case Level.OFF_INT: levelField.setSelection(5, true); break; default: break; } } if (null != originalAppenderRefs) { appenderRefsField.setElements(new ArrayList<String>(originalAppenderRefs)); } return composite; } /** * Returns the logger. * * @return the logger */ public Logger getLogger() { return logger; } @Override protected void okPressed() { validate(); if (!getStatus().isOK()) { return; } try { logger = new Logger(); logger.setName(nameField.getText()); if (levelField.isSelected(0)) { logger.setLevel(Level.ALL); } else if (levelField.isSelected(1)) { logger.setLevel(Level.DEBUG); } else if (levelField.isSelected(2)) { logger.setLevel(Level.INFO); } else if (levelField.isSelected(3)) { logger.setLevel(Level.WARN); } else if (levelField.isSelected(4)) { logger.setLevel(Level.ERROR); } else if (levelField.isSelected(5)) { logger.setLevel(Level.OFF); } logger.setInheritOtherAppenders(inheritAppendersField.isSelected()); final List elements = appenderRefsField.getElements(); final List<String> appenderRefs = new ArrayList<String>(); for (final Object appenderRef : elements) { if (appenderRef instanceof String && !appenderRefs.contains(appenderRef)) { appenderRefs.add((String) appenderRef); } } logger.setAppenderReferences(appenderRefs); } catch (final Exception e) { logger = null; setError(e.getMessage()); return; } super.okPressed(); } void setError(final String message) { updateStatus(new Status(IStatus.ERROR, LogbackUiActivator.SYMBOLIC_NAME, message)); getShell().pack(true); } void setInfo(final String message) { updateStatus(new Status(IStatus.INFO, LogbackUiActivator.SYMBOLIC_NAME, message)); } void setWarning(final String message) { updateStatus(new Status(IStatus.WARNING, LogbackUiActivator.SYMBOLIC_NAME, message)); } void validate() { final String name = nameField.getText(); if (StringUtils.isBlank(name)) { setInfo("Please enter a name."); return; } if (!IdHelper.isValidId(name)) { setError("The entered appender name is invalid. It may only contain ASCII chars a-z, 0-9, '.', '-' and/or '_'."); return; } if (!levelField.isAnySelected()) { setInfo("Please select a log level."); return; } updateStatus(Status.OK_STATUS); } }