com.evolveum.midpoint.web.page.admin.configuration.component.LoggingConfigPanel.java Source code

Java tutorial

Introduction

Here is the source code for com.evolveum.midpoint.web.page.admin.configuration.component.LoggingConfigPanel.java

Source

/*
 * Copyright (c) 2010-2013 Evolveum
 *
 * Licensed 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 com.evolveum.midpoint.web.page.admin.configuration.component;

import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.web.component.AjaxButton;
import com.evolveum.midpoint.web.component.DropDownMultiChoice;
import com.evolveum.midpoint.web.component.data.TablePanel;
import com.evolveum.midpoint.web.component.data.column.*;
import com.evolveum.midpoint.web.component.input.DropDownChoicePanel;
import com.evolveum.midpoint.web.component.input.ListMultipleChoicePanel;
import com.evolveum.midpoint.web.component.input.TextPanel;
import com.evolveum.midpoint.web.component.prism.InputPanel;
import com.evolveum.midpoint.web.component.util.Editable;
import com.evolveum.midpoint.web.component.util.ListDataProvider;
import com.evolveum.midpoint.web.component.util.LoadableModel;
import com.evolveum.midpoint.web.component.util.SimplePanel;
import com.evolveum.midpoint.web.page.admin.configuration.PageSystemConfiguration;
import com.evolveum.midpoint.web.page.admin.configuration.dto.*;
import com.evolveum.midpoint.web.util.WebMiscUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.apache.commons.lang.StringUtils;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider;
import org.apache.wicket.markup.html.form.*;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.w3c.dom.html.HTMLTableElement;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * @author lazyman
 */
public class LoggingConfigPanel extends SimplePanel<LoggingDto> {

    private static final String DOT_CLASS = LoggingConfigPanel.class.getName() + ".";
    private static final String OPERATION_LOAD_LOGGING_CONFIGURATION = DOT_CLASS + "loadLoggingConfiguration";
    private static final String OPERATION_UPDATE_LOGGING_CONFIGURATION = DOT_CLASS + "updateLoggingConfiguration";

    private static final String ID_LOGGERS_TABLE = "loggersTable";
    private static final String ID_ROOT_LEVEL = "rootLevel";
    private static final String ID_ROOT_APPENDER = "rootAppender";
    private static final String ID_TABLE_APPENDERS = "appendersTable";
    private static final String ID_BUTTON_ADD_CONSOLE_APPENDER = "addConsoleAppender";
    private static final String ID_BUTTON_ADD_FILE_APPENDER = "addFileAppender";
    private static final String ID_BUTTON_DELETE_APPENDER = "deleteAppender";
    private static final String ID_BUTTON_ADD_STANDARD_LOGGER = "addStandardLogger";

    public LoggingConfigPanel(String id) {
        super(id, null);
    }

    @Override
    public IModel<LoggingDto> createModel() {
        return new LoadableModel<LoggingDto>(false) {

            @Override
            protected LoggingDto load() {
                return initLoggingModel();
            }
        };
    }

    private LoggingDto initLoggingModel() {
        LoggingDto dto = null;
        OperationResult result = new OperationResult(OPERATION_LOAD_LOGGING_CONFIGURATION);
        try {
            Task task = getPageBase().createSimpleTask(OPERATION_LOAD_LOGGING_CONFIGURATION);

            PrismObject<SystemConfigurationType> config = getPageBase().getModelService().getObject(
                    SystemConfigurationType.class, SystemObjectsType.SYSTEM_CONFIGURATION.value(), null, task,
                    result);
            SystemConfigurationType systemConfiguration = config.asObjectable();
            LoggingConfigurationType logging = systemConfiguration.getLogging();
            dto = new LoggingDto(config, logging);

            result.recordSuccess();
        } catch (Exception ex) {
            result.recordFatalError("Couldn't load logging configuration.", ex);
        }

        if (!result.isSuccess()) {
            getPageBase().showResult(result);
        }

        if (dto == null) {
            dto = new LoggingDto();
        }

        return dto;
    }

    @Override
    protected void initLayout() {
        initLoggers();
        initAudit();
        initProfiling();
        initAppenders();
    }

    private void initLoggers() {
        initRoot();

        ISortableDataProvider<LoggerConfiguration, String> provider = new ListDataProvider<LoggerConfiguration>(
                this, new PropertyModel<List<LoggerConfiguration>>(getModel(), "loggers"));
        TablePanel table = new TablePanel<LoggerConfiguration>(ID_LOGGERS_TABLE, provider, initLoggerColumns());
        table.setOutputMarkupId(true);
        table.setShowPaging(false);
        add(table);

        AjaxButton addStandardLogger = new AjaxButton(ID_BUTTON_ADD_STANDARD_LOGGER,
                createStringResource("LoggingConfigPanel.button.addStandardLogger")) {

            @Override
            public void onClick(AjaxRequestTarget target) {
                addStandardLoggerPerformed(target);
            }
        };
        add(addStandardLogger);

        AjaxButton addComponentLogger = new AjaxButton("addComponentLogger",
                createStringResource("LoggingConfigPanel.button.addComponentLogger")) {

            @Override
            public void onClick(AjaxRequestTarget target) {
                addComponentLoggerPerformed(target);
            }
        };
        add(addComponentLogger);

        AjaxButton addClassLogger = new AjaxButton("addClassLogger",
                createStringResource("LoggingConfigPanel.button.addClassLogger")) {

            @Override
            public void onClick(AjaxRequestTarget target) {
                addClassLoggerPerformed(target);
            }
        };
        add(addClassLogger);

        AjaxButton deleteLogger = new AjaxButton("deleteLogger",
                createStringResource("LoggingConfigPanel.button.deleteLogger")) {

            @Override
            public void onClick(AjaxRequestTarget target) {
                deleteLoggerPerformed(target);
            }
        };
        add(deleteLogger);

        //initProfiling();
    }

    private void initRoot() {
        DropDownChoice<LoggingLevelType> rootLevel = new DropDownChoice<LoggingLevelType>(ID_ROOT_LEVEL,
                new PropertyModel<LoggingLevelType>(getModel(), LoggingDto.F_ROOT_LEVEL),
                WebMiscUtil.createReadonlyModelFromEnum(LoggingLevelType.class));

        add(rootLevel);

        DropDownChoice<String> rootAppender = new DropDownChoice<String>(ID_ROOT_APPENDER,
                new PropertyModel<String>(getModel(), LoggingDto.F_ROOT_APPENDER), createAppendersListModel());
        rootAppender.setNullValid(true);
        rootAppender.add(new OnChangeAjaxBehavior() {

            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                rootAppenderChangePerformed(target);
            }
        });
        add(rootAppender);
    }

    private void initAudit() {
        CheckBox auditLog = new CheckBox("auditLog", new PropertyModel<Boolean>(getModel(), "auditLog"));
        add(auditLog);

        CheckBox auditDetails = new CheckBox("auditDetails",
                new PropertyModel<Boolean>(getModel(), "auditDetails"));
        add(auditDetails);

        DropDownChoice<String> auditAppender = new DropDownChoice<String>("auditAppender",
                new PropertyModel<String>(getModel(), "auditAppender"), createAppendersListModel());
        auditAppender.setNullValid(true);
        add(auditAppender);
    }

    private void initProfiling() {
        //Entry-Exit profiling init
        DropDownChoice<ProfilingLevel> profilingLevel = new DropDownChoice<ProfilingLevel>("profilingLevel",
                new PropertyModel<ProfilingLevel>(getModel(), "profilingLevel"),
                WebMiscUtil.createReadonlyModelFromEnum(ProfilingLevel.class), new EnumChoiceRenderer(this));
        add(profilingLevel);

        DropDownChoice<String> profilingAppender = new DropDownChoice<String>("profilingAppender",
                new PropertyModel<String>(getModel(), "profilingAppender"), createAppendersListModel());
        profilingAppender.setNullValid(true);
        add(profilingAppender);

        //Subsystem and general profiling init
        CheckBox requestFilter = new CheckBox("requestFilter",
                new PropertyModel<Boolean>(getModel(), "requestFilter"));
        CheckBox performanceStatistics = new CheckBox("performanceStatistics",
                new PropertyModel<Boolean>(getModel(), "performanceStatistics"));
        CheckBox subsystemModel = new CheckBox("subsystemModel",
                new PropertyModel<Boolean>(getModel(), "subsystemModel"));
        CheckBox subsystemRepository = new CheckBox("subsystemRepository",
                new PropertyModel<Boolean>(getModel(), "subsystemRepository"));
        CheckBox subsystemProvisioning = new CheckBox("subsystemProvisioning",
                new PropertyModel<Boolean>(getModel(), "subsystemProvisioning"));
        CheckBox subsystemUcf = new CheckBox("subsystemUcf",
                new PropertyModel<Boolean>(getModel(), "subsystemUcf"));
        CheckBox subsystemResourceObjectChangeListener = new CheckBox("subsystemResourceObjectChangeListener",
                new PropertyModel<Boolean>(getModel(), "subsystemResourceObjectChangeListener"));
        CheckBox subsystemTaskManager = new CheckBox("subsystemTaskManager",
                new PropertyModel<Boolean>(getModel(), "subsystemTaskManager"));
        CheckBox subsystemWorkflow = new CheckBox("subsystemWorkflow",
                new PropertyModel<Boolean>(getModel(), "subsystemWorkflow"));
        add(requestFilter);
        add(performanceStatistics);
        add(subsystemModel);
        add(subsystemRepository);
        add(subsystemProvisioning);
        add(subsystemUcf);
        add(subsystemResourceObjectChangeListener);
        add(subsystemTaskManager);
        add(subsystemWorkflow);

        TextField<Integer> dumpInterval = new TextField<Integer>("dumpInterval",
                new PropertyModel<Integer>(getModel(), "dumpInterval"));
        add(dumpInterval);
    }

    private void addStandardLoggerPerformed(AjaxRequestTarget target) {
        LoggingDto dto = getModel().getObject();
        StandardLogger logger = new StandardLogger(new ClassLoggerConfigurationType());
        logger.setEditing(true);
        dto.getLoggers().add(logger);

        target.add(getLoggersTable());
    }

    private void addComponentLoggerPerformed(AjaxRequestTarget target) {
        LoggingDto dto = getModel().getObject();
        ComponentLogger logger = new ComponentLogger(new ClassLoggerConfigurationType());
        logger.setEditing(true);
        dto.getLoggers().add(logger);

        target.add(getLoggersTable());
    }

    private void addClassLoggerPerformed(AjaxRequestTarget target) {
        LoggingDto dto = getModel().getObject();
        ClassLogger logger = new ClassLogger(new ClassLoggerConfigurationType());
        logger.setEditing(true);
        dto.getLoggers().add(logger);

        target.add(getLoggersTable());
    }

    private TablePanel getLoggersTable() {
        return (TablePanel) get(ID_LOGGERS_TABLE);
    }

    private TablePanel getAppendersTable() {
        return (TablePanel) get(ID_TABLE_APPENDERS);
    }

    private List<IColumn<LoggerConfiguration, String>> initLoggerColumns() {
        List<IColumn<LoggerConfiguration, String>> columns = new ArrayList<IColumn<LoggerConfiguration, String>>();
        IColumn column = new CheckBoxHeaderColumn<LoggerConfiguration>();
        columns.add(column);

        //name editing column
        columns.add(new EditableLinkColumn<LoggerConfiguration>(createStringResource("LoggingConfigPanel.logger"),
                "name") {

            @Override
            protected Component createInputPanel(String componentId, final IModel<LoggerConfiguration> model) {
                if (model.getObject() instanceof StandardLogger) {
                    DropDownChoicePanel dropDownChoicePanel = new DropDownChoicePanel(componentId,
                            new PropertyModel(model, "logger"),
                            WebMiscUtil.createReadonlyModelFromEnum(StandardLoggerType.class),
                            new IChoiceRenderer<StandardLoggerType>() {

                                @Override
                                public Object getDisplayValue(StandardLoggerType item) {
                                    return createStringResource("StandardLoggerType." + item).getString();
                                }

                                @Override
                                public String getIdValue(StandardLoggerType item, int index) {
                                    return Integer.toString(index);
                                }
                            });

                    FormComponent<StandardLoggerType> input = dropDownChoicePanel.getBaseFormComponent();
                    input.add(new LoggerValidator());
                    input.add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
                    return dropDownChoicePanel;

                } else if (model.getObject() instanceof ComponentLogger) {
                    DropDownChoicePanel dropDownChoicePanel = new DropDownChoicePanel(componentId,
                            new PropertyModel(model, "component"),
                            WebMiscUtil.createReadonlyModelFromEnum(LoggingComponentType.class),
                            new IChoiceRenderer<LoggingComponentType>() {

                                @Override
                                public Object getDisplayValue(LoggingComponentType item) {
                                    return getComponenLoggerDisplayValue(item);
                                }

                                @Override
                                public String getIdValue(LoggingComponentType item, int index) {
                                    return Integer.toString(index);
                                }
                            });

                    FormComponent<LoggingComponentType> input = dropDownChoicePanel.getBaseFormComponent();
                    input.add(new LoggerValidator());
                    input.add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
                    return dropDownChoicePanel;

                } else {
                    TextPanel<String> textPanel = new TextPanel(componentId,
                            new PropertyModel(model, getPropertyExpression()));
                    FormComponent input = textPanel.getBaseFormComponent();
                    input.add(new AttributeAppender("style", "width: 100%"));
                    input.add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
                    input.add(new InputStringValidator());
                    return textPanel;
                }
            }

            @Override
            public void onClick(AjaxRequestTarget target, IModel<LoggerConfiguration> rowModel) {
                loggerEditPerformed(target, rowModel);
            }
        });

        //level editing column
        columns.add(new EditableLinkColumn<LoggerConfiguration>(
                createStringResource("LoggingConfigPanel.loggersLevel"), "level") {

            @Override
            protected Component createInputPanel(String componentId, IModel<LoggerConfiguration> model) {
                DropDownChoicePanel dropDownChoicePanel = new DropDownChoicePanel(componentId,
                        new PropertyModel(model, getPropertyExpression()),
                        WebMiscUtil.createReadonlyModelFromEnum(LoggingLevelType.class));
                FormComponent<LoggingLevelType> input = dropDownChoicePanel.getBaseFormComponent();
                input.add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
                input.add(new LevelValidator());
                return dropDownChoicePanel;
            }

            @Override
            public void onClick(AjaxRequestTarget target, IModel<LoggerConfiguration> rowModel) {
                loggerEditPerformed(target, rowModel);
            }

            @Override
            protected IModel<String> createLinkModel(IModel<LoggerConfiguration> rowModel) {
                LoggerConfiguration configuration = rowModel.getObject();
                return WebMiscUtil.createLocalizedModelForEnum(configuration.getLevel(), getPageBase());
            }
        });

        //appender editing column
        columns.add(new EditableLinkColumn<LoggerConfiguration>(
                createStringResource("LoggingConfigPanel.loggersAppender"), "appenders") {

            @Override
            protected IModel<String> createLinkModel(IModel<LoggerConfiguration> rowModel) {
                final LoggerConfiguration configuration = rowModel.getObject();

                if (configuration.getAppenders().isEmpty()) {
                    return createStringResource("LoggingConfigPanel.appenders.Inherit");
                } else {
                    return new LoadableModel<String>() {

                        @Override
                        protected String load() {
                            StringBuilder builder = new StringBuilder();
                            for (String appender : configuration.getAppenders()) {
                                if (configuration.getAppenders().indexOf(appender) != 0) {
                                    builder.append(", ");
                                }
                                builder.append(appender);
                            }

                            return builder.toString();
                        }
                    };
                }
            }

            @Override
            protected InputPanel createInputPanel(String componentId, IModel<LoggerConfiguration> model) {
                IModel<Map<String, String>> options = new Model(null);
                ListMultipleChoicePanel panel = new ListMultipleChoicePanel<String>(componentId,
                        new PropertyModel<List<String>>(model, getPropertyExpression()),
                        createNewLoggerAppendersListModel(), new IChoiceRenderer<String>() {

                            @Override
                            public String getDisplayValue(String o) {
                                return o;
                            }

                            @Override
                            public String getIdValue(String o, int index) {
                                return Integer.toString(index);
                            }
                        }, options);

                FormComponent<AppenderConfigurationType> input = panel.getBaseFormComponent();
                input.add(new EmptyOnChangeAjaxFormUpdatingBehavior());

                return panel;
            }

            public void onClick(AjaxRequestTarget target, IModel<LoggerConfiguration> rowModel) {
                loggerEditPerformed(target, rowModel);
            }
        });

        return columns;
    }

    private String getComponenLoggerDisplayValue(LoggingComponentType item) {
        //LoggingConfigPanel.this.getString("LoggingConfigPanel.logger." + item);
        return createStringResource("LoggingComponentType." + item).getString();
    }

    private IModel<List<String>> createNewLoggerAppendersListModel() {
        return new AbstractReadOnlyModel<List<String>>() {

            @Override
            public List<String> getObject() {
                List<String> list = new ArrayList<String>();

                LoggingDto dto = getModel().getObject();

                //list.add(PageSystemConfiguration.ROOT_APPENDER_INHERITANCE_CHOICE);
                for (AppenderConfiguration appender : dto.getAppenders()) {

                    if (!appender.getName().equals(dto.getRootAppender())) {
                        list.add(appender.getName());
                    }
                }

                return list;
            }
        };
    }

    private IModel<List<String>> createAppendersListModel() {
        return new AbstractReadOnlyModel<List<String>>() {

            @Override
            public List<String> getObject() {
                List<String> list = new ArrayList<String>();

                LoggingDto dto = getModel().getObject();
                for (AppenderConfiguration appender : dto.getAppenders()) {
                    list.add(appender.getName());
                }

                return list;
            }
        };
    }

    private void deleteLoggerPerformed(AjaxRequestTarget target) {
        Iterator<LoggerConfiguration> iterator = getModel().getObject().getLoggers().iterator();
        while (iterator.hasNext()) {
            LoggerConfiguration item = iterator.next();
            if (item.isSelected()) {
                iterator.remove();
            }
        }
        target.add(getLoggersTable());
    }

    private void initAppenders() {
        ISortableDataProvider<AppenderConfiguration, String> provider = new ListDataProvider<AppenderConfiguration>(
                this, new PropertyModel<List<AppenderConfiguration>>(getModel(), LoggingDto.F_APPENDERS));

        TablePanel table = new TablePanel<AppenderConfiguration>(ID_TABLE_APPENDERS, provider,
                initAppenderColumns());
        table.setOutputMarkupId(true);
        table.setShowPaging(false);
        add(table);

        AjaxButton addConsoleAppender = new AjaxButton(ID_BUTTON_ADD_CONSOLE_APPENDER,
                createStringResource("LoggingConfigPanel.button.addConsoleAppender")) {

            @Override
            public void onClick(AjaxRequestTarget target) {
                addConsoleAppenderPerformed(target);
            }
        };
        add(addConsoleAppender);

        AjaxButton addFileAppender = new AjaxButton(ID_BUTTON_ADD_FILE_APPENDER,
                createStringResource("LoggingConfigPanel.button.addFileAppender")) {

            @Override
            public void onClick(AjaxRequestTarget target) {
                addFileAppenderPerformed(target);
            }
        };
        add(addFileAppender);

        AjaxButton deleteAppender = new AjaxButton(ID_BUTTON_DELETE_APPENDER,
                createStringResource("LoggingConfigPanel.button.deleteAppender")) {

            @Override
            public void onClick(AjaxRequestTarget target) {
                deleteAppenderPerformed(target);
            }
        };
        add(deleteAppender);
    }

    private List<IColumn<AppenderConfiguration, String>> initAppenderColumns() {
        List<IColumn<AppenderConfiguration, String>> columns = new ArrayList<>();

        IColumn column = new CheckBoxHeaderColumn<AppenderConfiguration>();
        columns.add(column);

        //name columns (editable)
        column = new EditableLinkColumn<AppenderConfiguration>(
                createStringResource("LoggingConfigPanel.appenders.name"), "name") {

            @Override
            public void onClick(AjaxRequestTarget target, IModel<AppenderConfiguration> rowModel) {
                appenderEditPerformed(target, rowModel);
            }

            @Override
            protected Component createInputPanel(String componentId, IModel<AppenderConfiguration> model) {
                TextPanel<String> panel = new TextPanel<String>(componentId,
                        new PropertyModel(model, getPropertyExpression()));
                panel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
                panel.add(new InputStringValidator());
                return panel;
            }

        };
        columns.add(column);

        //pattern column (editable)
        column = new EditablePropertyColumn(createStringResource("LoggingConfigPanel.appenders.pattern"),
                "pattern") {

            @Override
            protected InputPanel createInputPanel(String componentId, IModel model) {
                InputPanel panel = super.createInputPanel(componentId, model);
                panel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
                panel.add(new InputStringValidator());
                return panel;
            }
        };
        columns.add(column);

        //file path column (editable)
        column = new FileAppenderColumn(createStringResource("LoggingConfigPanel.appenders.filePath"), "filePath");
        columns.add(column);

        //file pattern column (editable)                                                                               jj
        column = new FileAppenderColumn(createStringResource("LoggingConfigPanel.appenders.filePattern"),
                "filePattern");
        columns.add(column);

        //max history column (editable)
        column = new FileAppenderColumn(createStringResource("LoggingConfigPanel.appenders.maxHistory"),
                "maxHistory") {

            @Override
            protected InputPanel createInputPanel(String componentId, IModel model) {
                TextPanel panel = new TextPanel(componentId, new PropertyModel(model, getPropertyExpression()));
                FormComponent component = panel.getBaseFormComponent();
                component.add(new AttributeModifier("size", 5));
                component.add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
                return panel;
            }
        };
        columns.add(column);

        //max file size column (editable)
        column = new FileAppenderColumn(createStringResource("LoggingConfigPanel.appenders.maxFileSize"),
                "maxFileSize") {

            @Override
            protected InputPanel createInputPanel(String componentId, IModel model) {
                TextPanel<String> panel = new TextPanel(componentId,
                        new PropertyModel(model, getPropertyExpression()));
                FormComponent component = panel.getBaseFormComponent();
                component.add(new AttributeModifier("size", 5));
                component.add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
                component.add(new InputStringValidator());
                return panel;
            }
        };
        columns.add(column);

        CheckBoxColumn check = new EditableCheckboxColumn(
                createStringResource("LoggingConfigPanel.appenders.appending"), "appending") {

            @Override
            protected InputPanel createInputPanel(String componentId, IModel model) {
                InputPanel panel = super.createInputPanel(componentId, model);
                panel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
                panel.add(new InputStringValidator());
                return panel;
            }
        };
        check.setEnabled(false);
        columns.add(check);

        return columns;
    }

    private IModel<LoggingComponentType> createFilterModel(final IModel<FilterConfiguration> model) {
        return new Model<LoggingComponentType>() {

            @Override
            public LoggingComponentType getObject() {
                String name = model.getObject().getName();
                if (StringUtils.isEmpty(name)) {
                    return null;
                }
                return LoggingComponentType.fromValue(name);
            }

            @Override
            public void setObject(LoggingComponentType object) {
                model.getObject().setName(object.name());
            }
        };
    }

    private void loggerEditPerformed(AjaxRequestTarget target, IModel<LoggerConfiguration> rowModel) {
        LoggerConfiguration config = rowModel.getObject();
        config.setEditing(true);
        target.add(getLoggersTable());
    }

    private static class EmptyOnChangeAjaxFormUpdatingBehavior extends AjaxFormComponentUpdatingBehavior {

        public EmptyOnChangeAjaxFormUpdatingBehavior() {
            super("onChange");
        }

        @Override
        protected void onUpdate(AjaxRequestTarget target) {

        }
    }

    private static class EmptyOnBlurAjaxFormUpdatingBehaviour extends AjaxFormComponentUpdatingBehavior {

        public EmptyOnBlurAjaxFormUpdatingBehaviour() {
            super("onBlur");
        }

        @Override
        protected void onUpdate(AjaxRequestTarget target) {
        }
    }

    private static class FileAppenderColumn<T extends Editable> extends EditablePropertyColumn<T> {

        private FileAppenderColumn(IModel<String> displayModel, String propertyExpression) {
            super(displayModel, propertyExpression);
        }

        @Override
        protected boolean isEditing(IModel<T> rowModel) {
            return super.isEditing(rowModel) && (rowModel.getObject() instanceof FileAppenderConfig);
        }

        @Override
        protected InputPanel createInputPanel(String componentId, IModel iModel) {
            InputPanel panel = super.createInputPanel(componentId, iModel);
            panel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
            panel.add(new InputStringValidator());
            return panel;
        }
    }

    private void rootAppenderChangePerformed(AjaxRequestTarget target) {
        target.add(getLoggersTable());
    }

    private void addConsoleAppenderPerformed(AjaxRequestTarget target) {
        LoggingDto dto = getModel().getObject();
        AppenderConfiguration appender = new AppenderConfiguration(new AppenderConfigurationType());
        appender.setEditing(true);
        dto.getAppenders().add(appender);

        target.add(getAppendersTable());
    }

    private void addFileAppenderPerformed(AjaxRequestTarget target) {
        LoggingDto dto = getModel().getObject();
        FileAppenderConfig appender = new FileAppenderConfig(new FileAppenderConfigurationType());
        appender.setEditing(true);
        dto.getAppenders().add(appender);

        target.add(getAppendersTable());
    }

    private void deleteAppenderPerformed(AjaxRequestTarget target) {
        Iterator<AppenderConfiguration> iterator = getModel().getObject().getAppenders().iterator();
        while (iterator.hasNext()) {
            AppenderConfiguration item = iterator.next();
            if (item.isSelected()) {
                iterator.remove();
            }
        }
        target.add(getAppendersTable());
    }

    private void appenderEditPerformed(AjaxRequestTarget target, IModel<AppenderConfiguration> model) {
        AppenderConfiguration config = model.getObject();
        config.setEditing(true);
        target.add(getAppendersTable());
    }
}