org.switchyard.tools.ui.debug.TransformBreakpointEditor.java Source code

Java tutorial

Introduction

Here is the source code for org.switchyard.tools.ui.debug.TransformBreakpointEditor.java

Source

/******************************************************************************* 
 * Copyright (c) 2014 Red Hat, Inc. 
 *  All rights reserved. 
 * This program is 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: 
 * Red Hat, Inc. - initial API and implementation 
 *
 ******************************************************************************/
package org.switchyard.tools.ui.debug;

import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.EnumSet;
import java.util.LinkedHashSet;
import java.util.Set;

import javax.xml.XMLConstants;
import javax.xml.namespace.QName;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.jdt.internal.debug.ui.breakpoints.AbstractJavaBreakpointEditor;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.switchyard.tools.models.switchyard1_0.switchyard.DocumentRoot;
import org.switchyard.tools.models.switchyard1_0.switchyard.SwitchYardType;
import org.switchyard.tools.models.switchyard1_0.switchyard.TransformType;
import org.switchyard.tools.models.switchyard1_0.switchyard.util.SwitchyardResourceFactoryImpl;
import org.switchyard.tools.ui.SwitchYardModelUtils;
import org.switchyard.tools.ui.common.ISwitchYardProject;
import org.switchyard.tools.ui.common.impl.SwitchYardProjectManager;
import org.switchyard.tools.ui.debug.IInteractionConfiguration.TriggerType;
import org.switchyard.tools.ui.debug.TransformConfigurationBuilder.DummyTransformType;

/**
 * TransformBreakpointEditor
 * <p/>
 * Editor for transform breakpoints.
 */
@SuppressWarnings("restriction")
public class TransformBreakpointEditor extends AbstractJavaBreakpointEditor {

    /** The property ID for triggers. */
    public static final int TRIGGER_PROP = 1;
    /** The property ID for transforms. */
    public static final int TRANSFORMS_PROP = 2;

    private TransformSequenceBreakpoint _breakpoint;
    private Button _inButton;
    private Button _outButton;
    private Button _faultButton;
    private CheckboxTableViewer _typesTable;
    private Set<TriggerType> _triggers;
    private boolean _updating;

    @Override
    public Control createControl(Composite parent) {
        final ScrolledComposite scrollable = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
        scrollable.setLayout(new GridLayout());
        scrollable.setLayoutData(new GridData(GridData.FILL_BOTH));

        final Composite content = new Composite(scrollable, SWT.NONE);
        content.setLayout(new GridLayout());
        content.setLayoutData(new GridData(GridData.FILL_BOTH));
        content.setBackground(parent.getBackground());
        content.setBackgroundMode(SWT.INHERIT_DEFAULT);

        final Group phaseGroup = new Group(content, SWT.NONE);
        phaseGroup.setLayout(new GridLayout(3, false));
        phaseGroup.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
        phaseGroup.setText("Triggering phase");

        _inButton = new Button(phaseGroup, SWT.CHECK);
        _inButton.setText("IN");
        _inButton.addSelectionListener(new TriggerSelectionListener(TriggerType.IN));

        _outButton = new Button(phaseGroup, SWT.CHECK);
        _outButton.setText("OUT");
        _outButton.addSelectionListener(new TriggerSelectionListener(TriggerType.OUT));

        _faultButton = new Button(phaseGroup, SWT.CHECK);
        _faultButton.setText("FAULT");
        _faultButton.addSelectionListener(new TriggerSelectionListener(TriggerType.FAULT));

        _typesTable = CheckboxTableViewer.newCheckList(content, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
        _typesTable.getTable().setHeaderVisible(true);

        TableViewerColumn fromColumn = new TableViewerColumn(_typesTable, SWT.LEFT);
        fromColumn.getColumn().setText("From");
        fromColumn.getColumn().setResizable(true);
        fromColumn.getColumn().setWidth(200);

        TableViewerColumn toColumn = new TableViewerColumn(_typesTable, SWT.LEFT);
        toColumn.getColumn().setText("To");
        toColumn.getColumn().setResizable(true);
        toColumn.getColumn().setWidth(200);

        GridData gd = new GridData(GridData.FILL_BOTH);
        gd.minimumHeight = _typesTable.getTable().getHeaderHeight() + 5 * _typesTable.getTable().getItemHeight();
        _typesTable.getControl().setLayoutData(gd);

        _typesTable.setLabelProvider(new ITableLabelProvider() {
            @Override
            public void addListener(ILabelProviderListener listener) {
            }

            @Override
            public void dispose() {
            }

            @Override
            public boolean isLabelProperty(Object element, String property) {
                return false;
            }

            @Override
            public void removeListener(ILabelProviderListener listener) {
            }

            @Override
            public Image getColumnImage(Object element, int columnIndex) {
                return null;
            }

            @Override
            public String getColumnText(Object element, int columnIndex) {
                if (element instanceof TransformType) {
                    if (columnIndex == 0) {
                        return getText(((TransformType) element).getFrom());
                    } else {
                        return getText(((TransformType) element).getTo());
                    }
                }
                return "";
            }

            private String getText(final String typeName) {
                if (typeName == null || typeName.length() == 0) {
                    return "";
                }
                final QName type = QName.valueOf(typeName);
                final String localPart = type.getLocalPart();
                final String namespaceUri = type.getNamespaceURI();
                if (namespaceUri == null || XMLConstants.NULL_NS_URI.equals(namespaceUri)) {
                    if (localPart.startsWith("java:")) {
                        final int lastDot = localPart.lastIndexOf('.');
                        if (lastDot > 0) {
                            return localPart.substring(lastDot + 1) + " {" + localPart.substring(5, lastDot) + "}";
                        } else {
                            return localPart.substring(5);
                        }
                    } else {
                        return localPart;
                    }
                } else {
                    return localPart + " {" + namespaceUri + "}";
                }
            }
        });
        _typesTable.addFilter(new ViewerFilter() {
            @Override
            public boolean select(Viewer viewer, Object parentElement, Object element) {
                return element instanceof TransformType && ((TransformType) element).getFrom() != null
                        && ((TransformType) element).getFrom().length() > 0
                        && ((TransformType) element).getTo() != null
                        && ((TransformType) element).getTo().length() > 0;
            }
        });
        _typesTable.setContentProvider(ArrayContentProvider.getInstance());
        _typesTable.addCheckStateListener(new ICheckStateListener() {
            @Override
            public void checkStateChanged(CheckStateChangedEvent event) {
                if (_updating) {
                    return;
                }
                setDirty(TRANSFORMS_PROP);
            }
        });

        scrollable.setContent(content);
        content.setSize(content.computeSize(SWT.DEFAULT, SWT.DEFAULT));

        return scrollable;
    }

    @Override
    public void setFocus() {
    }

    @Override
    public IStatus getStatus() {
        if (_inButton.getSelection() || _outButton.getSelection() || _faultButton.getSelection()) {
            return Status.OK_STATUS;
        }
        return new Status(Status.ERROR, Activator.PLUGIN_ID,
                "Must select at least one trigger (IN, OUT or FAULT).");
    }

    @Override
    public Object getInput() {
        return _breakpoint;
    }

    @Override
    public void setInput(Object breakpoint) throws CoreException {
        _updating = true;
        try {
            if (breakpoint instanceof TransformSequenceBreakpoint) {
                _breakpoint = (TransformSequenceBreakpoint) breakpoint;
            } else {
                breakpoint = null;
            }
            initialize();
        } finally {
            _updating = false;
        }
    }

    @Override
    public void doSave() throws CoreException {
        if (_breakpoint != null) {
            final InteractionConfigurationBuilder builder = InteractionConfigurationBuilder
                    .createFrom(_breakpoint.getInteractionConfiguration());
            builder.triggers(_triggers.isEmpty() ? null : EnumSet.copyOf(_triggers));
            _breakpoint.setInteractionConfiguration(builder.build());

            final Set<TransformType> transforms = new LinkedHashSet<TransformType>();
            for (Object obj : _typesTable.getCheckedElements()) {
                final TransformType transform = (TransformType) obj;
                if (transform != null && transform.getFrom() != null && transform.getTo() != null) {
                    transforms.add(transform);
                }
            }
            final TransformConfigurationBuilder transformBuilder = TransformConfigurationBuilder
                    .createFrom(_breakpoint.getTransformConfiguration());
            transformBuilder.transforms(transforms);
            _breakpoint.setTransformConfiguration(transformBuilder.build());
        }
        setDirty(false);
    }

    private void initialize() {
        if (_breakpoint == null) {
            _inButton.setEnabled(false);
            _inButton.setSelection(false);

            _outButton.setEnabled(false);
            _outButton.setSelection(false);

            _faultButton.setEnabled(false);
            _faultButton.setSelection(false);
        } else {
            final IInteractionConfiguration config = _breakpoint.getInteractionConfiguration();
            final ITransformConfiguration transformConfig = _breakpoint.getTransformConfiguration();

            _triggers = config == null ? EnumSet.allOf(TriggerType.class) : config.getTriggers();
            if (_triggers == null || _triggers.isEmpty()) {
                _triggers = EnumSet.allOf(TriggerType.class);
            } else {
                _triggers = EnumSet.copyOf(_triggers);
            }

            _inButton.setEnabled(true);
            _inButton.setSelection(_triggers.contains(TriggerType.IN));

            _outButton.setEnabled(true);
            _outButton.setSelection(_triggers.contains(TriggerType.OUT));

            _faultButton.setSelection(_triggers.contains(TriggerType.FAULT));

            _typesTable.setInput(getTransforms());
            if (transformConfig.getTransforms() == null) {
                _typesTable.setCheckedElements(new Object[0]);
            } else {
                _typesTable.setCheckedElements(transformConfig.getTransforms().toArray());
            }

            updateEnablement();
        }
        setDirty(false);
    }

    private void updateEnablement() {
        _faultButton.setEnabled(!_outButton.getSelection());
        _typesTable.getControl().setEnabled(_triggers != null && _triggers.size() > 0);
    }

    private Collection<TransformType> getTransforms() {
        final IResource markerResource = _breakpoint.getMarker().getResource();
        if (markerResource == null || markerResource.getProject() == null) {
            return Collections.emptyList();
        }
        ISwitchYardProject switchYardProject = SwitchYardProjectManager.instance()
                .getSwitchYardProject(markerResource.getProject());
        if (switchYardProject == null) {
            return Collections.emptyList();
        }
        IFile switchYardFile = switchYardProject.getOutputSwitchYardConfigurationFile();
        if (switchYardFile == null || !switchYardFile.isAccessible()) {
            switchYardFile = switchYardProject.getSwitchYardConfigurationFile();
        }
        if (switchYardFile == null || !switchYardFile.isAccessible()) {
            return Collections.emptyList();
        }
        ResourceSet rs = SwitchYardModelUtils.newResourceSet();
        Resource resource = rs.createResource(
                URI.createPlatformResourceURI(switchYardFile.getFullPath().toPortableString(), true),
                SwitchyardResourceFactoryImpl.CONTENT_TYPE);
        try {
            resource.load(null);
            if (resource.getContents().size() > 0) {
                Object content = resource.getContents().get(0);
                if (content instanceof SwitchYardType) {
                    final Set<TransformType> transforms = new LinkedHashSet<TransformType>();
                    for (TransformType transform : getTransforms((SwitchYardType) content)) {
                        transforms.add(new DummyTransformType(transform));
                    }
                    return transforms;
                } else if (content instanceof DocumentRoot) {
                    final Set<TransformType> transforms = new LinkedHashSet<TransformType>();
                    for (TransformType transform : getTransforms(((DocumentRoot) content).getSwitchyard())) {
                        transforms.add(new DummyTransformType(transform));
                    }
                    return transforms;
                }
            }
        } catch (IOException e) {
            e.fillInStackTrace();
        } finally {
            resource.unload();
        }
        return Collections.emptyList();
    }

    private Collection<TransformType> getTransforms(final SwitchYardType switchyard) {
        if (switchyard == null || switchyard.getTransforms() == null) {
            return Collections.emptyList();
        }
        return switchyard.getTransforms().getTransform();
    }

    private final class TriggerSelectionListener extends SelectionAdapter {
        private final TriggerType _trigger;

        private TriggerSelectionListener(final TriggerType trigger) {
            _trigger = trigger;
        }

        @Override
        public void widgetSelected(SelectionEvent event) {
            if (_updating) {
                return;
            }

            if (((Button) event.widget).getSelection()) {
                _triggers.add(_trigger);
            } else {
                _triggers.remove(_trigger);
            }
            updateEnablement();
            setDirty(TRIGGER_PROP);
        }
    }
}