/*******************************************************************************
* Copyright (c) 2013 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
*******************************************************************************/
package org.eclipse.gyrex.admin.ui.logback.internal.commonapenders;
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.LayoutUtil;
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.admin.ui.logback.configuration.wizard.AppenderConfigurationWizardSession;
import org.eclipse.gyrex.common.identifiers.IdHelper;
import org.eclipse.gyrex.logback.config.model.Appender;
import org.eclipse.gyrex.logback.config.model.FileAppender;
import org.eclipse.gyrex.logback.config.model.FileAppender.RotationPolicy;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.apache.commons.lang.StringUtils;
/**
*
*/
public class FileAppenderWizardPage extends WizardPage {
/** serialVersionUID */
private static final long serialVersionUID = 1L;
private final StringDialogField fileNameField = new StringDialogField();
private final SelectionButtonDialogField compressField = new SelectionButtonDialogField(SWT.CHECK);
private final SelectionButtonDialogFieldGroup rotationTypeField = new SelectionButtonDialogFieldGroup(SWT.RADIO, new String[] { "never", "daily", "weekly", "monthly", "based on size" }, 5);
private final StringDialogField maxFileSizeField = new StringDialogField();
private final StringDialogField maxHistoryField = new StringDialogField();
private final StringDialogField siftingPropertyNameField = new StringDialogField();
private final StringDialogField siftingPropertyDefaultField = new StringDialogField();
private FileAppender appender;
public FileAppenderWizardPage(final AppenderConfigurationWizardSession session) {
super("file");
setTitle("File Appender");
setDescription("Configure log file details like name and rotation.");
final Appender appender = session.getAppender();
if (appender instanceof FileAppender) {
this.appender = (FileAppender) appender;
} else {
this.appender = new FileAppender();
session.setAppender(this.appender);
}
setPageComplete(false); // initial status is incomplete
}
@Override
public void createControl(final Composite parent) {
final Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(GridLayoutFactory.fillDefaults().create());
composite.setLayoutData(GridDataFactory.fillDefaults().minSize(convertVerticalDLUsToPixels(200), convertHorizontalDLUsToPixels(400)).create());
setControl(composite);
fileNameField.setLabelText("File Name:");
rotationTypeField.setLabelText("Rotate log files:");
compressField.setLabelText("Compress rotated logs");
maxHistoryField.setLabelText("Number of rotated logs to keep:");
maxFileSizeField.setLabelText("Rotate when log file is greater then:");
siftingPropertyNameField.setLabelText("Separate log files based on MDC property:");
siftingPropertyDefaultField.setLabelText("Default value if MDC property is not set:");
final IDialogFieldListener validateListener = new IDialogFieldListener() {
@Override
public void dialogFieldChanged(final DialogField field) {
updateEnabledFields();
validate();
}
};
fileNameField.setDialogFieldListener(validateListener);
rotationTypeField.setDialogFieldListener(validateListener);
maxFileSizeField.setDialogFieldListener(validateListener);
maxHistoryField.setDialogFieldListener(validateListener);
siftingPropertyNameField.setDialogFieldListener(validateListener);
compressField.setSelection(true);
updateEnabledFields();
LayoutUtil.doDefaultLayout(composite, new DialogField[] { fileNameField, new Separator(), rotationTypeField, compressField, maxHistoryField, maxFileSizeField, new Separator(), siftingPropertyNameField, siftingPropertyDefaultField }, false);
LayoutUtil.setHorizontalGrabbing(fileNameField.getTextControl(null));
}
private void updateAppender() {
appender.setFileName(fileNameField.getText());
if (rotationTypeField.isSelected(1) || rotationTypeField.isSelected(2) || rotationTypeField.isSelected(3)) {
if (rotationTypeField.isSelected(1)) {
appender.setRotationPolicy(RotationPolicy.DAILY);
} else if (rotationTypeField.isSelected(2)) {
appender.setRotationPolicy(RotationPolicy.WEEKLY);
} else if (rotationTypeField.isSelected(3)) {
appender.setRotationPolicy(RotationPolicy.MONTHLY);
}
appender.setMaxHistory(StringUtils.trimToNull(maxHistoryField.getText()));
} else if (rotationTypeField.isSelected(4)) {
appender.setRotationPolicy(RotationPolicy.SIZE);
appender.setMaxFileSize(StringUtils.trimToNull(maxFileSizeField.getText()));
}
appender.setCompressRotatedLogs(compressField.isSelected());
final String siftingMdcPropertyName = StringUtils.trimToNull(siftingPropertyNameField.getText());
if (null != siftingMdcPropertyName) {
appender.setSiftingMdcPropertyName(siftingMdcPropertyName);
appender.setSiftingMdcPropertyDefaultValue(StringUtils.trimToNull(siftingPropertyDefaultField.getText()));
}
}
void updateEnabledFields() {
siftingPropertyDefaultField.setEnabled(StringUtils.isNotBlank(siftingPropertyNameField.getText()));
if (rotationTypeField.isSelected(1) || rotationTypeField.isSelected(2) || rotationTypeField.isSelected(3)) {
maxFileSizeField.setEnabled(false);
maxHistoryField.setEnabled(true);
compressField.setEnabled(true);
} else if (rotationTypeField.isSelected(4)) {
maxFileSizeField.setEnabled(true);
maxHistoryField.setEnabled(false);
compressField.setEnabled(true);
} else {
maxFileSizeField.setEnabled(false);
maxHistoryField.setEnabled(false);
compressField.setEnabled(false);
}
}
void validate() {
final String fileName = fileNameField.getText();
if (StringUtils.isBlank(fileName)) {
setMessage("Please enter a file name.", INFORMATION);
setPageComplete(false);
return;
}
if (!IdHelper.isValidId(fileName)) {
setMessage("The entered file name is invalid. It may only contain ASCII chars a-z, 0-9, '.', '-' and/or '_'.", ERROR);
return;
}
updateAppender();
setMessage(null);
setPageComplete(true);
}
}