org.eclipse.rcptt.verifications.log.ui.ErrorLogVerificationEditor.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.rcptt.verifications.log.ui.ErrorLogVerificationEditor.java

Source

/*******************************************************************************
 * Copyright (c) 2009, 2015 Xored Software Inc 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:
 *     Xored Software Inc - initial API and implementation and/or initial documentation
 *******************************************************************************/
package org.eclipse.rcptt.verifications.log.ui;

import static com.google.common.base.Strings.nullToEmpty;

import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.databinding.EMFObservables;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.ui.dnd.LocalTransfer;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.ICellEditorValidator;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.rcptt.core.model.IQ7Element.HandleType;
import org.eclipse.rcptt.core.model.ModelException;
import org.eclipse.rcptt.internal.core.RcpttPlugin;
import org.eclipse.rcptt.internal.ui.Q7UIPlugin;
import org.eclipse.rcptt.launching.AutLaunch;
import org.eclipse.rcptt.ui.commons.EObjectTable;
import org.eclipse.rcptt.ui.controls.SectionWithToolbar;
import org.eclipse.rcptt.ui.editors.EditorHeader;
import org.eclipse.rcptt.ui.jface.providers.BooleanLabelProvider;
import org.eclipse.rcptt.ui.verification.BaseVerificationEditor;
import org.eclipse.rcptt.verifications.log.ErrorLogVerification;
import org.eclipse.rcptt.verifications.log.LogEntryPredicate;
import org.eclipse.rcptt.verifications.log.LogFactory;
import org.eclipse.rcptt.verifications.log.LogPackage;
import org.eclipse.rcptt.verifications.log.LogPackage.Literals;
import org.eclipse.rcptt.verifications.log.tools.ErrorLogUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IWorkbenchSite;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.ide.IGotoMarker;

import com.google.common.base.Objects;
import com.google.common.base.Strings;

public class ErrorLogVerificationEditor extends BaseVerificationEditor implements IGotoMarker {

    private static final String TRANSFER_TYPE = "org.eclipse.rcptt.verifications.log.ui.ErrorLogVerificationEditor.LOG_ENTRY_PREDICATE_TRANSFER";
    private static final Transfer LOG_ENTRY_PREDICATE_TRANSFER = new LocalTransfer() {
        private final int ID = registerType(TRANSFER_TYPE);

        @Override
        protected int[] getTypeIds() {
            return new int[] { ID };
        }

        @Override
        public String[] getTypeNames() {
            return new String[] { TRANSFER_TYPE };
        }

    };

    private ErrorLogVerification getVerification() {
        try {
            return (ErrorLogVerification) super.getElement().getNamedElement();
        } catch (ModelException e) {
            Q7UIPlugin.log(e);
            return null;
        }
    }

    private static final ICellEditorValidator INTEGER_VALIDATOR = new ICellEditorValidator() {
        @Override
        public String isValid(Object value) {
            String strValue = (String) value;
            if (Strings.isNullOrEmpty(strValue))
                return null;
            strValue = strValue.replaceAll(" ", "");
            try {
                Integer.parseInt(strValue);
            } catch (NumberFormatException e) {
                return e.getLocalizedMessage();
            }
            return null;
        }
    };

    class PredicateTable extends EObjectTable {

        private final String title;

        public PredicateTable(EStructuralFeature feature, String title) {
            super(getVerification(), feature);
            this.title = title;
        }

        @Override
        public String getName() {
            return title;
        }

        @Override
        protected int getStyle() {
            return super.getStyle() | SWT.FULL_SELECTION;
        }

        @Override
        public Image getImage() {
            return null;
        }

        @Override
        protected boolean allowDrag(IStructuredSelection selection) {
            return !selection.isEmpty();
        }

        class SeverityLabelProvider extends BooleanLabelProvider {

            private final int mask;

            public SeverityLabelProvider(int mask) {
                super();
                this.mask = mask;
            }

            @Override
            public boolean isChecked(Object element) {
                return (((LogEntryPredicate) element).getSeverityMask() & mask) != 0;
            }
        }

        class SeverityEditingSupport extends EditingSupport {

            private final int mask;

            public SeverityEditingSupport(ColumnViewer viewer, int mask) {
                super(viewer);
                this.mask = mask;
            }

            @Override
            protected CellEditor getCellEditor(Object element) {
                return new CheckboxCellEditor(viewer.getTable());
            }

            @Override
            protected boolean canEdit(Object element) {
                return true;
            }

            @Override
            protected Object getValue(Object element) {
                return (((LogEntryPredicate) element).getSeverityMask() & mask) != 0;
            }

            @Override
            protected void setValue(Object element, Object value) {
                LogEntryPredicate entry = (LogEntryPredicate) element;
                // TODO: command stack
                if ((Boolean) value) {
                    entry.setSeverityMask(entry.getSeverityMask() | mask);
                } else {
                    entry.setSeverityMask(entry.getSeverityMask() & ~mask);
                }
                viewer.refresh(element);
            }

        }

        abstract class AttributeEditingSupport extends EditingSupport {

            protected final EAttribute property;

            public AttributeEditingSupport(ColumnViewer viewer, EAttribute property) {
                super(viewer);
                this.property = property;
            }

            @Override
            protected boolean canEdit(Object element) {
                return true;
            }
        }

        class StringEditingSupport extends AttributeEditingSupport {

            public StringEditingSupport(ColumnViewer viewer, EAttribute property) {
                super(viewer, property);
            }

            @Override
            protected Object getValue(Object element) {
                return Objects.firstNonNull(((EObject) element).eGet(property), "");
            }

            @Override
            protected CellEditor getCellEditor(Object element) {
                return new TextCellEditor((Composite) getViewer().getControl());
            }

            @Override
            protected void setValue(Object element, Object value) {
                // TODO: command stack
                ((EObject) element).eSet(property, value);
                getViewer().refresh(element);
            }

        }

        class IntegerEditingSupport extends AttributeEditingSupport {

            public IntegerEditingSupport(ColumnViewer viewer, EAttribute property) {
                super(viewer, property);
                // TODO Auto-generated constructor stub
            }

            @Override
            protected CellEditor getCellEditor(Object element) {
                TextCellEditor rv = new TextCellEditor((Composite) getViewer().getControl());
                rv.setValidator(INTEGER_VALIDATOR);
                return rv;
            }

            @Override
            protected Object getValue(Object element) {
                int rv = (Integer) ((EObject) element).eGet(property);
                if (property.getDefaultValue().equals(rv))
                    return "";
                return String.valueOf(rv);
            }

            @Override
            protected void setValue(Object element, Object value) {
                int code = (Integer) property.getDefaultValue();
                String strValue = nullToEmpty((String) value).replaceAll(" ", "");
                if (!Strings.isNullOrEmpty(strValue)) {
                    code = Integer.valueOf(strValue);
                }
                ((EObject) element).eSet(property, code);
                getViewer().refresh(element);
            }

        }

        @Override
        protected void configureViewer(TableViewer viewer) {
            viewer.setContentProvider(new ArrayContentProvider());
            viewer.getTable().setHeaderVisible(true);

            TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
            column.getColumn().setText("Error");
            column.getColumn().setWidth(30);
            column.setLabelProvider(new SeverityLabelProvider(IStatus.ERROR));
            column.setEditingSupport(new SeverityEditingSupport(viewer, IStatus.ERROR));

            column = new TableViewerColumn(viewer, SWT.NONE);
            column.getColumn().setWidth(30);
            column.getColumn().setText("Warning");
            column.setLabelProvider(new SeverityLabelProvider(IStatus.WARNING));
            column.setEditingSupport(new SeverityEditingSupport(viewer, IStatus.WARNING));

            column = new TableViewerColumn(viewer, SWT.NONE);
            column.getColumn().setText("Information");
            column.getColumn().setWidth(30);
            column.setLabelProvider(new SeverityLabelProvider(IStatus.INFO));
            column.setEditingSupport(new SeverityEditingSupport(viewer, IStatus.INFO));

            column = new TableViewerColumn(viewer, SWT.NONE);
            column.getColumn().setText("Plugin Pattern");
            column.getColumn().setWidth(100);
            column.setLabelProvider(new ColumnLabelProvider() {
                @Override
                public String getText(Object element) {
                    return ((LogEntryPredicate) element).getPluginPattern();
                }
            });
            column.setEditingSupport(
                    new StringEditingSupport(viewer, LogPackage.Literals.LOG_ENTRY_PREDICATE__PLUGIN_PATTERN) {

                        @Override
                        protected void setValue(Object element, Object value) {
                            super.setValue(element, nullToEmpty((String) value).replaceAll(" ", ""));
                        }

                    });

            column = new TableViewerColumn(viewer, SWT.NONE);
            column.getColumn().setText("Message Pattern");
            column.getColumn().setWidth(300);
            column.setLabelProvider(new ColumnLabelProvider() {
                @Override
                public String getText(Object element) {
                    return ((LogEntryPredicate) element).getMessagePattern();
                }
            });
            column.setEditingSupport(
                    new StringEditingSupport(viewer, LogPackage.Literals.LOG_ENTRY_PREDICATE__MESSAGE_PATTERN));

            column = new TableViewerColumn(viewer, SWT.NONE);
            column.getColumn().setText("Plugin Code");
            column.getColumn().setWidth(50);
            column.setLabelProvider(new ColumnLabelProvider() {
                @Override
                public String getText(Object element) {
                    int code = ((LogEntryPredicate) element).getCode();
                    if (LogPackage.Literals.LOG_ENTRY_PREDICATE__CODE.getDefaultValue().equals(code))
                        return "";
                    return "" + code;
                }
            });
            column.setEditingSupport(
                    new IntegerEditingSupport(viewer, LogPackage.Literals.LOG_ENTRY_PREDICATE__CODE));

        }

        @Override
        protected ILabelProvider createLabelProvider() {
            return null;
        }

        @Override
        protected Object[] handleAdd() {
            LogEntryPredicate rv = LogFactory.eINSTANCE.createLogEntryPredicate();
            rv.setSeverityMask(IStatus.ERROR | IStatus.WARNING | IStatus.INFO);
            rv.setMessagePattern(".*");
            rv.setPluginPattern(".*");
            return new Object[] { rv };
        }

        @Override
        protected Class<?> getContentsType() {
            return LogEntryPredicate.class;
        }

        @Override
        protected Transfer getContentTransfer() {
            return LOG_ENTRY_PREDICATE_TRANSFER;
        }

        @Override
        protected HandleType getAppropriateHandleType() {
            return null;
        }

    }

    PredicateTable requiredTable;
    PredicateTable allowedTable;
    PredicateTable deniedTable;

    @Override
    public Control create(Composite parent, FormToolkit toolkit, IWorkbenchSite site, EditorHeader header) {
        int style = ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE | ExpandableComposite.EXPANDED;
        Button includeContextsCheckbox = toolkit.createButton(parent, "Take into account Context events",
                SWT.CHECK);
        GridDataFactory.swtDefaults().hint(SWT.DEFAULT, 50).applyTo(includeContextsCheckbox);
        dbc.bindValue(WidgetProperties.selection().observe(includeContextsCheckbox), EMFObservables
                .observeValue(getVerification(), LogPackage.Literals.ERROR_LOG_VERIFICATION__INCLUDE_CONTEXTS));
        requiredTable = new PredicateTable(LogPackage.Literals.ERROR_LOG_VERIFICATION__REQUIRED, "Require");
        new SectionWithToolbar(requiredTable, style).create(parent, toolkit)
                .setToolTipText("Every pattern should match at least one log entry for verification to succeed");
        allowedTable = new PredicateTable(LogPackage.Literals.ERROR_LOG_VERIFICATION__ALLOWED, "Allow");
        new SectionWithToolbar(allowedTable, style).create(parent, toolkit)
                .setToolTipText("These patterns are not denied by next section");
        deniedTable = new PredicateTable(LogPackage.Literals.ERROR_LOG_VERIFICATION__DENIED, "Deny");
        new SectionWithToolbar(deniedTable, style).create(parent, toolkit).setToolTipText(
                "A log entry matching any of these patterns causes verification to fail if it is not allowed by the previous section");
        return null;
    }

    PredicateTable tableByFeature(EReference feature) {
        assert requiredTable != null;
        assert allowedTable != null;
        assert deniedTable != null;
        if (feature == Literals.ERROR_LOG_VERIFICATION__REQUIRED) {
            return requiredTable;
        } else if (feature == Literals.ERROR_LOG_VERIFICATION__ALLOWED) {
            return allowedTable;
        } else if (feature == Literals.ERROR_LOG_VERIFICATION__DENIED) {
            return deniedTable;
        }
        throw new IllegalArgumentException("Not a predicate reference");
    }

    @Override
    public void setSelectionAtLine(int line) {
        LogEntryPredicate predicate = ErrorLogUtil.getPredicateByIndex(getVerification(), line);
        if (predicate == null)
            return;
        EReference feature = (EReference) predicate.eContainingFeature();
        PredicateTable table = tableByFeature(feature);
        table.setSelection(new Object[] { predicate }, true);
        table.getControl().setFocus();
    }

    @Override
    public void gotoMarker(IMarker marker) {
        try {
            Integer line = (Integer) marker.getAttribute(IMarker.LINE_NUMBER);
            if (line != null)
                setSelectionAtLine(line);
        } catch (CoreException e) {
            RcpttPlugin.log(e);
        }
    }

    @Override
    public void dispose() {
        allowedTable.dispose();
        deniedTable.dispose();
        requiredTable.dispose();
        super.dispose();
    }

    @Override
    public EObject getCreateParam(AutLaunch launch) {
        ErrorLogVerification param = LogFactory.eINSTANCE.createErrorLogVerification();
        param.setIncludeContexts(getVerification().isIncludeContexts());
        return param;
    }

}