ru.codeinside.adm.ui.LogSettings.java Source code

Java tutorial

Introduction

Here is the source code for ru.codeinside.adm.ui.LogSettings.java

Source

/*
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 * Copyright (c) 2014, MPL CodeInside http://codeinside.ru
 */

package ru.codeinside.adm.ui;

import com.vaadin.data.Property;
import com.vaadin.data.Validator;
import com.vaadin.ui.Button;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Layout;
import com.vaadin.ui.OptionGroup;
import com.vaadin.ui.Panel;
import com.vaadin.ui.TextArea;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
import com.vaadin.ui.themes.Reindeer;
import ru.codeinside.adm.AdminServiceProvider;
import ru.codeinside.adm.LogScheduler;
import ru.codeinside.gses.API;
import ru.codeinside.gses.webui.components.api.IRefresh;
import ru.codeinside.gses.webui.osgi.LogCustomizer;
import ru.codeinside.gws.api.Packet.Status;

import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

final class LogSettings extends CustomComponent implements IRefresh {

    final OptionGroup logErrors;
    final OptionGroup logStatus;
    final TextArea ipSet;
    final TextField tf;

    final Block b1;
    final Block b2;
    final Block b3;

    LogSettings() {

        logErrors = new OptionGroup("? ? :", Arrays.asList(Status.FAILURE.name()));
        logErrors.setItemCaption(Status.FAILURE.name(), "");
        logErrors.setImmediate(true);
        logErrors.setMultiSelect(true);

        logStatus = new OptionGroup("?  ?  '':", statusKeys());
        logStatus.setItemCaption(Status.REQUEST.name(), "?");
        logStatus.setItemCaption(Status.RESULT.name(), "");
        logStatus.setItemCaption(Status.PING.name(), "?");
        logStatus.setMultiSelect(true);
        logStatus.setImmediate(true);

        ipSet = new TextArea("? IP ?:");
        ipSet.setWordwrap(true);
        ipSet.setNullRepresentation("");
        ipSet.setWidth(100f, UNITS_PERCENTAGE);
        ipSet.setRows(10);

        tf = new TextField(" , :");
        tf.setRequired(true);
        tf.addValidator(new Validator() {
            public void validate(Object value) throws InvalidValueException {
                if (!isValid(value)) {
                    throw new InvalidValueException(
                            "  ? ");
                }
            }

            public boolean isValid(Object value) {
                return value instanceof String && ((String) value).matches("[1-9][0-9]*");
            }
        });

        b1 = new Block("") {

            @Override
            void onLayout(Layout layout) {
                layout.addComponent(logErrors);
                layout.addComponent(logStatus);
            }

            @Override
            void onChange() {
                logErrors.setReadOnly(false);
                logStatus.setReadOnly(false);
            }

            @Override
            void onRefresh() {
                boolean _logErrors = AdminServiceProvider.getBoolProperty(API.LOG_ERRORS);
                if (_logErrors) {
                    logErrors.setReadOnly(false);
                    logErrors.setValue(Arrays.asList(Status.FAILURE.name()));
                } else {
                    logErrors.setValue(Collections.emptySet());
                }
                logErrors.setReadOnly(true);

                String _logStatus = AdminServiceProvider.get().getSystemProperty(API.LOG_STATUS);
                if (_logStatus != null) {
                    Set<String> set = new HashSet<String>();
                    for (String key : statusKeys()) {
                        if (_logStatus.contains(key)) {
                            set.add(key);
                        }
                    }
                    logStatus.setReadOnly(false);
                    logStatus.setValue(set);
                } else {
                    logStatus.setValue(Collections.emptySet());
                }
                logStatus.setReadOnly(true);
            }

            @Override
            void onApply() {
                Collection logErrorsValue = (Collection) logErrors.getValue();
                boolean errorsEnabled = logErrorsValue.contains(Status.FAILURE.name());
                AdminServiceProvider.get().saveSystemProperty(API.LOG_ERRORS, Boolean.toString(errorsEnabled));
                LogCustomizer.setShouldWriteServerLogErrors(errorsEnabled);

                Collection logStatusValue = (Collection) logStatus.getValue();

                Set<Status> statuses = new TreeSet<Status>();

                if (logStatusValue.contains(Status.REQUEST.name())) {
                    statuses.add(Status.REQUEST);
                    statuses.add(Status.ACCEPT);
                    statuses.add(Status.CANCEL);
                }

                if (logStatusValue.contains(Status.RESULT.name())) {
                    statuses.add(Status.RESULT);
                    statuses.add(Status.REJECT);
                    statuses.add(Status.STATE);
                    statuses.add(Status.NOTIFY);
                }

                if (logStatusValue.contains(Status.PING.name())) {
                    statuses.add(Status.PING);
                    statuses.add(Status.PROCESS);
                    statuses.add(Status.PACKET);
                }

                StringBuilder statusBuilder = new StringBuilder();
                for (Status status : statuses) {
                    if (statusBuilder.length() > 0) {
                        statusBuilder.append(", ");
                    }
                    statusBuilder.append(status);
                }
                String status = statusBuilder.toString();

                AdminServiceProvider.get().saveSystemProperty(API.LOG_STATUS, status);
                LogCustomizer.setServerLogStatus(status);

                boolean enabled = !status.isEmpty();
                LogCustomizer.setShouldWriteServerLog(enabled);
                AdminServiceProvider.get().saveSystemProperty(API.ENABLE_CLIENT_LOG, Boolean.toString(enabled));
            }
        };

        b2 = new Block("? ") {
            @Override
            void onLayout(Layout layout) {
                layout.addComponent(ipSet);
            }

            @Override
            void onRefresh() {
                String ips = AdminServiceProvider.get().getSystemProperty(API.SKIP_LOG_IPS);
                ipSet.setReadOnly(false);
                ipSet.setValue(ips);
                ipSet.setReadOnly(true);
            }

            @Override
            void onChange() {
                ipSet.setReadOnly(false);
            }

            @Override
            void onApply() {
                String value = (String) ipSet.getValue();
                TreeSet<String> items = new TreeSet<String>();
                if (value != null) {
                    for (String item : value.split("[,;\\s]+")) {
                        items.add(item);
                    }
                    StringBuilder sb = new StringBuilder();
                    for (String item : items) {
                        if (sb.length() > 0) {
                            sb.append(", ");
                        }
                        sb.append(item);
                    }
                    value = sb.toString();
                }
                AdminServiceProvider.get().saveSystemProperty(API.SKIP_LOG_IPS, value);
                LogCustomizer.setIgnoreSet(items);
            }
        };

        b3 = new Block("?   ") {
            @Override
            void onButtons(Layout layout) {
                layout.addComponent(new Button("? ", new Button.ClickListener() {
                    @Override
                    public void buttonClick(Button.ClickEvent event) {
                        LogScheduler.cleanLog();
                        getWindow().showNotification("?? ",
                                Window.Notification.TYPE_HUMANIZED_MESSAGE);
                    }
                }));
            }

            @Override
            void onLayout(Layout layout) {
                layout.addComponent(tf);
            }

            @Override
            void onRefresh() {
                String logDepth = AdminServiceProvider.get().getSystemProperty(API.LOG_DEPTH);
                tf.setReadOnly(false);
                if (logDepth != null && logDepth.matches("[1-9][0-9]*")) {
                    tf.setValue(logDepth);
                } else {
                    tf.setValue(String.valueOf(API.DEFAULT_LOG_DEPTH));
                }
                tf.setReadOnly(true);
            }

            @Override
            void onChange() {
                tf.setReadOnly(false);
            }

            @Override
            void onApply() {
                tf.validate();
                AdminServiceProvider.get().saveSystemProperty(API.LOG_DEPTH, tf.getValue().toString());
            }
        };

        final CheckBox logSpSign = new CheckBox(" ? ");
        logSpSign.setValue(Boolean.valueOf(AdminServiceProvider.get().getSystemProperty(API.LOG_SP_SIGN)));
        logSpSign.addListener(new Property.ValueChangeListener() {
            @Override
            public void valueChange(Property.ValueChangeEvent valueChangeEvent) {
                AdminServiceProvider.get().saveSystemProperty(API.LOG_SP_SIGN,
                        String.valueOf(valueChangeEvent.getProperty().getValue()));
                notifySuccess();
            }
        });
        logSpSign.setImmediate(true);

        final CheckBox logOvSign = new CheckBox(" ? ");
        logOvSign.setValue(Boolean.valueOf(AdminServiceProvider.get().getSystemProperty(API.LOG_OV_SIGN)));
        logOvSign.addListener(new Property.ValueChangeListener() {
            @Override
            public void valueChange(Property.ValueChangeEvent valueChangeEvent) {
                AdminServiceProvider.get().saveSystemProperty(API.LOG_OV_SIGN,
                        String.valueOf(valueChangeEvent.getProperty().getValue()));
                notifySuccess();
            }
        });
        logOvSign.setImmediate(true);

        Label userSignsLabel = new Label("? ?");
        userSignsLabel.addStyleName(Reindeer.LABEL_H2);

        VerticalLayout userSignsVl = new VerticalLayout();
        userSignsVl.setMargin(true);
        userSignsVl.setSpacing(true);
        userSignsVl.addComponent(userSignsLabel);
        userSignsVl.addComponent(logSpSign);
        userSignsVl.addComponent(logOvSign);

        Panel userSingsWrapper = new Panel();
        userSingsWrapper.setScrollable(true);
        userSingsWrapper.setContent(userSignsVl);
        userSingsWrapper.setSizeFull();

        VerticalLayout vl = new VerticalLayout();
        vl.addComponent(b1);
        vl.addComponent(userSingsWrapper);
        vl.setExpandRatio(b1, 0.7f);
        vl.setExpandRatio(userSingsWrapper, 0.3f);
        vl.setSizeFull();

        HorizontalLayout layout = new HorizontalLayout();
        layout.setSpacing(true);
        layout.addComponent(vl);
        layout.addComponent(b2);
        layout.addComponent(b3);
        layout.setSizeFull();
        layout.setExpandRatio(vl, 0.333f);
        layout.setExpandRatio(b2, 0.333f);
        layout.setExpandRatio(b3, 0.333f);

        Panel wrapper = new Panel(" ", layout);
        wrapper.addStyleName(Reindeer.PANEL_LIGHT);
        wrapper.setSizeFull();

        setCompositionRoot(wrapper);
        setSizeFull();
    }

    public void refresh() {
        b1.refresh();
        b2.refresh();
        b3.refresh();
    }

    static List<String> statusKeys() {
        return Arrays.asList(Status.REQUEST.name(), Status.RESULT.name(), Status.PING.name());
    }

    private void notifySuccess() {
        getWindow().showNotification("?? ?",
                Window.Notification.TYPE_HUMANIZED_MESSAGE);
    }

    static class Block extends CustomComponent {

        boolean editMode;

        Block(String caption) {

            VerticalLayout layout = new VerticalLayout();

            Label label = new Label(caption);
            label.addStyleName(Reindeer.LABEL_H2);

            final Button change = new Button("");
            final Button cancel = new Button("");
            final Button apply = new Button("");

            cancel.setImmediate(true);
            cancel.setVisible(false);
            cancel.addListener(new Button.ClickListener() {
                @Override
                public void buttonClick(Button.ClickEvent event) {
                    cancel.setVisible(false);
                    apply.setVisible(false);
                    change.setVisible(true);
                    editMode = false;
                    onRefresh();
                }
            });

            apply.setImmediate(true);
            apply.setVisible(false);
            apply.addListener(new Button.ClickListener() {
                @Override
                public void buttonClick(Button.ClickEvent event) {
                    try {
                        onApply();
                    } catch (Validator.InvalidValueException ignore) {
                        return;
                    }
                    getWindow().showNotification("?? ?",
                            Window.Notification.TYPE_HUMANIZED_MESSAGE);
                    cancel.setVisible(false);
                    apply.setVisible(false);
                    change.setVisible(true);
                    editMode = false;
                    onRefresh();
                }
            });

            change.addStyleName(Reindeer.BUTTON_SMALL);
            change.setImmediate(true);
            change.addListener(new Button.ClickListener() {
                @Override
                public void buttonClick(Button.ClickEvent event) {
                    cancel.setVisible(true);
                    apply.setVisible(true);
                    change.setVisible(false);
                    onChange();
                    editMode = true;
                }
            });

            layout.setMargin(true);
            layout.setSpacing(true);
            layout.addComponent(label);
            onLayout(layout);

            HorizontalLayout buttons = new HorizontalLayout();
            buttons.setSpacing(true);
            buttons.addComponent(change);
            buttons.addComponent(apply);
            buttons.addComponent(cancel);
            onButtons(buttons);
            layout.addComponent(buttons);

            Panel panel = new Panel(layout);
            panel.setSizeFull();
            setCompositionRoot(panel);
            setSizeFull();
        }

        void onButtons(Layout layout) {

        }

        void onLayout(Layout layout) {

        }

        void onRefresh() {
        }

        void onChange() {

        }

        void onApply() {

        }

        final public void refresh() {
            if (!editMode) {
                onRefresh();
            }
        }
    }
}