| /******************************************************************************* |
| * 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.MoreObjects; |
| 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 MoreObjects.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; |
| } |
| |
| } |