org.jboss.tools.fuse.transformation.editor.internal.ExpressionDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.fuse.transformation.editor.internal.ExpressionDialog.java

Source

/******************************************************************************
 * Copyright (c) 2015 Red Hat, 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: JBoss by Red Hat - Initial implementation.
 *****************************************************************************/
package org.jboss.tools.fuse.transformation.editor.internal;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.fusesource.ide.camel.model.service.core.catalog.CamelModelFactory;
import org.fusesource.ide.camel.model.service.core.catalog.languages.Language;
import org.jboss.tools.fuse.transformation.core.Expression;
import org.jboss.tools.fuse.transformation.core.MappingOperation;
import org.jboss.tools.fuse.transformation.editor.internal.l10n.Messages;
import org.jboss.tools.fuse.transformation.editor.internal.util.BaseDialog;
import org.jboss.tools.fuse.transformation.editor.internal.util.ClasspathResourceSelectionDialog;

/**
 *
 */
public class ExpressionDialog extends BaseDialog {

    final List<Language> languages = new ArrayList<>();
    private Language language;
    private String expression;
    private Button browseBtn;
    private ComboViewer languageComboViewer;
    private Text expressionText;
    private Expression expressionInstance = null;
    private Button valueOption;
    private Button scriptOption;
    private ComboViewer scriptTypeComboViewer;
    private Text pathText;
    private IProject project;

    public ExpressionDialog(Shell shell, MappingOperation<?, ?> mapping, IProject project) {
        super(shell);
        this.project = project;
        String languageName = null;
        if (mapping.getSource() instanceof Expression) {
            expressionInstance = (Expression) mapping.getSource();
            this.expression = expressionInstance.getExpression();
            languageName = expressionInstance.getLanguage();
        }
        for (final Language language : CamelModelFactory.getModelForProject(project).getLanguageModel()
                .getSupportedLanguages()) {
            final String name = language.getName();
            if (!"bean".equals(name) && !"file".equals(name) && !"sql".equals(name) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
                    && !"xtokenize".equals(name) && !"tokenize".equals(name) //$NON-NLS-1$ //$NON-NLS-2$
                    && !"spel".equals(name)) { //$NON-NLS-1$
                if (languageName != null && languageName.equals(name)) {
                    this.language = language;
                }
                languages.add(language);
            }
        }
    }

    @Override
    protected void constructContents(Composite parent) {
        parent.setLayout(GridLayoutFactory.swtDefaults().numColumns(2).create());
        Label label = new Label(parent, SWT.NONE);
        label.setText(Messages.ExpressionDialog_LabelLanguage);
        languageComboViewer = new ComboViewer(parent, SWT.READ_ONLY);
        languageComboViewer.setContentProvider(ArrayContentProvider.getInstance());
        languageComboViewer.setComparator(new ViewerComparator() {

            @Override
            public int compare(final Viewer viewer, final Object object1, final Object object2) {
                return ((Language) object1).getTitle().compareTo(((Language) object2).getTitle());
            }
        });
        languageComboViewer.setLabelProvider(new LabelProvider() {

            @Override
            public String getText(final Object element) {
                return ((Language) element).getTitle();
            }
        });
        languageComboViewer.getCombo()
                .setLayoutData(GridDataFactory.fillDefaults().grab(true, false).span(1, 1).create());

        Group detailsGroup = new Group(parent, SWT.NONE);
        detailsGroup.setText(Messages.ExpressionDialog_grouptitleDetails);
        detailsGroup.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).span(2, 1).create());
        detailsGroup.setLayout(GridLayoutFactory.swtDefaults().numColumns(3).create());

        valueOption = new Button(detailsGroup, SWT.RADIO);
        valueOption.setText(Messages.ExpressionDialog_ValueButton);
        valueOption.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).span(3, 1).create());
        valueOption.addSelectionListener(new SelectionListener() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                scriptTypeComboViewer.setSelection(new StructuredSelection("")); //$NON-NLS-1$
                pathText.setText(""); //$NON-NLS-1$
                expression = ""; //$NON-NLS-1$
                expressionText.setText(expression.replace("\\${", "${")); //$NON-NLS-1$ //$NON-NLS-2$
                validate();
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent e) {
            }
        });

        label = new Label(detailsGroup, SWT.NONE);
        label.setText(Messages.ExpressionDialog_ExpressionLabel);
        label.setLayoutData(GridDataFactory.fillDefaults().indent(20, 0).create());
        expressionText = new Text(detailsGroup, SWT.BORDER);
        expressionText
                .setLayoutData(GridDataFactory.fillDefaults().indent(20, 0).grab(true, false).span(2, 1).create());
        if (expression != null) {
            expressionText.setText(expression.replace("\\${", "${")); //$NON-NLS-1$ //$NON-NLS-2$
        }

        scriptOption = new Button(detailsGroup, SWT.RADIO);
        scriptOption.setText(Messages.ExpressionDialog_ScriptButton);
        scriptOption.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).span(3, 1).create());
        scriptOption.addSelectionListener(new SelectionListener() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                validate();
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent e) {
            }
        });

        label = new Label(detailsGroup, SWT.NONE);
        label.setText(Messages.ExpressionDialog_SourceLabel);
        label.setLayoutData(GridDataFactory.fillDefaults().indent(20, 0).create());
        scriptTypeComboViewer = new ComboViewer(detailsGroup, SWT.READ_ONLY);
        scriptTypeComboViewer.setContentProvider(ArrayContentProvider.getInstance());
        scriptTypeComboViewer.getCombo()
                .setLayoutData(GridDataFactory.fillDefaults().grab(true, false).indent(20, 0).span(1, 1).create());
        scriptTypeComboViewer.setContentProvider(new ObservableListContentProvider());
        scriptTypeComboViewer.getCombo().addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent event) {
                updateExpression();
            }
        });

        WritableList<String> sourceList = new WritableList<>();
        sourceList.add("classpath"); //$NON-NLS-1$
        sourceList.add("file"); //$NON-NLS-1$
        sourceList.add("http"); //$NON-NLS-1$
        sourceList.add(""); //$NON-NLS-1$
        scriptTypeComboViewer.setInput(sourceList);

        browseBtn = new Button(detailsGroup, SWT.PUSH);
        browseBtn.setText("..."); //$NON-NLS-1$
        browseBtn.setLayoutData(GridDataFactory.fillDefaults().grab(false, false).create());
        browseBtn.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent event) {
                IStructuredSelection selection = (IStructuredSelection) scriptTypeComboViewer.getSelection();
                String value = (String) selection.getFirstElement();
                String path = null;
                if ("classpath".equalsIgnoreCase(value)) { //$NON-NLS-1$
                    path = selectResourceFromWorkspace(browseBtn.getShell(), ""); //$NON-NLS-1$
                } else if ("file".equalsIgnoreCase(value)) { //$NON-NLS-1$
                    FileDialog dialog = new FileDialog(browseBtn.getShell());
                    dialog.setText(Messages.ExpressionDialog_fileDialogTitleSelectScriptFile);
                    String[] filterExt = { "*.*" }; //$NON-NLS-1$
                    dialog.setFilterExtensions(filterExt);
                    path = dialog.open();
                    if (path != null) {
                        path = convertToFileURL(path);
                    }
                }
                if (path != null) {
                    pathText.setText(path);
                    pathText.notifyListeners(SWT.Modify, null);
                }
            }
        });

        label = new Label(detailsGroup, SWT.NONE);
        label.setText(Messages.ExpressionDialog_labelPath);
        label.setLayoutData(GridDataFactory.fillDefaults().indent(20, 0).create());
        pathText = new Text(detailsGroup, SWT.BORDER);
        pathText.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).indent(20, 0).span(2, 1).create());
        pathText.addModifyListener(new ModifyListener() {

            @Override
            public void modifyText(ModifyEvent e) {
                updateExpression();
            }
        });

        languageComboViewer.getCombo().addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent event) {
                final IStructuredSelection selection = (IStructuredSelection) languageComboViewer.getSelection();
                language = (Language) selection.getFirstElement();
                valueOption.setEnabled(true);
                scriptOption.setEnabled(true);
                expressionText.setFocus();
                validate();
                if (!scriptOption.getSelection() && !valueOption.getSelection()) {
                    valueOption.setSelection(true);
                    valueOption.notifyListeners(SWT.Selection, null);
                }
            }
        });
        expressionText.addModifyListener(new ModifyListener() {

            @Override
            public void modifyText(final ModifyEvent event) {
                String expr = expressionText.getText().trim();
                for (int ndx = expr.indexOf("${"); ndx >= 0; ndx = expr.indexOf("${", ndx)) { //$NON-NLS-1$ //$NON-NLS-2$
                    if (ndx == 0 || expr.charAt(ndx - 1) != '\\') {
                        expr = expr.substring(0, ndx) + '\\' + expr.substring(ndx);
                        ndx += 3;
                    } else if (expr.charAt(ndx - 1) == '\\') {
                        // ignore it and move on
                        ndx += 3;
                    }
                }
                expression = expr;
                validate();
            }
        });

        languageComboViewer.setInput(languages);
        if (language != null) {
            languageComboViewer.setSelection(new StructuredSelection(language));
        }

        valueOption.setSelection(false);
        valueOption.setEnabled(false);
        scriptOption.setSelection(false);
        scriptOption.setEnabled(false);

        if (expression != null) {
            String part0 = getParameterPart(expression, 0);
            valueOption.setSelection(true);
            valueOption.setEnabled(true);
            scriptOption.setSelection(false);
            scriptOption.setEnabled(true);
            if ("resource".equals(part0)) { //$NON-NLS-1$
                valueOption.setSelection(false);
                scriptOption.setSelection(true);
                String part1 = getParameterPart(expression, 1);
                scriptTypeComboViewer.setSelection(new StructuredSelection(part1));
                String part2 = getParameterPart(expression, 2);
                if (part2 != null) {
                    pathText.setText(part2.replace("\\${", "${")); //$NON-NLS-1$ //$NON-NLS-2$
                }
            }
        }
    }

    private static String convertToFileURL(String filename) {
        String path = new File(filename).toURI().toString();
        if (File.separatorChar != '/') {
            path = path.replace(File.separatorChar, '/');
        }
        if (path.startsWith("file:")) { //$NON-NLS-1$
            path = path.replace("file:", ""); //$NON-NLS-1$ //$NON-NLS-2$
        }
        if (path.indexOf(':') > -1) {
            path = path.replace(":", ""); //$NON-NLS-1$ //$NON-NLS-2$
        }
        if (!path.startsWith("/")) { //$NON-NLS-1$
            path = "/" + path; //$NON-NLS-1$
        }
        return path;
    }

    private void updateExpression() {
        if (expression != null) {
            if (scriptOption.getSelection()) {
                final IStructuredSelection selection = (IStructuredSelection) scriptTypeComboViewer.getSelection();
                String value = (String) selection.getFirstElement();
                expression = "resource:" + value + ":" + pathText.getText().trim(); //$NON-NLS-1$ //$NON-NLS-2$
                expressionText.setText(expression.replace("\\${", "${")); //$NON-NLS-1$ //$NON-NLS-2$
            } else {
                expressionText.setText(expression.replace("\\${", "${")); //$NON-NLS-1$ //$NON-NLS-2$
            }
        }
    }

    @Override
    public void create() {
        super.create();
        validate();
    }

    @Override
    protected String message() {
        return Messages.ExpressionDialog_message;
    }

    @Override
    protected String title() {
        return Messages.ExpressionDialog_title;
    }

    private String getParameterPart(String expression, int idx) {
        String part = null;
        String[] parts = expression.split(":", 3); //$NON-NLS-1$
        if (parts.length > idx) {
            part = parts[idx];
        }
        return part;
    }

    void validate() {
        if (getButton(IDialogConstants.OK_ID) != null) {
            getButton(IDialogConstants.OK_ID)
                    .setEnabled(language != null && expression != null && !expression.isEmpty());
        }
        if (expressionText != null && !expressionText.isDisposed()) {
            browseBtn.setEnabled(false);
            expressionText.setEnabled(valueOption.getSelection());
            pathText.setEnabled(scriptOption.getSelection());
            scriptTypeComboViewer.getCombo().setEnabled(scriptOption.getSelection());
            final IStructuredSelection selection = (IStructuredSelection) scriptTypeComboViewer.getSelection();
            String value = (String) selection.getFirstElement();
            browseBtn.setEnabled(("classpath".equalsIgnoreCase(value) || "file".equalsIgnoreCase(value)) //$NON-NLS-1$ //$NON-NLS-2$
                    && scriptOption.getSelection());
        }
    }

    public Language getLanguage() {
        return language;
    }

    public void setLanguage(Language language) {
        this.language = language;
    }

    public String getExpression() {
        return expression;
    }

    public void setExpression(String expression) {
        this.expression = expression;
    }

    private String selectResourceFromWorkspace(Shell shell, final String extension) {
        IJavaProject javaProject = null;
        if (project != null) {
            javaProject = JavaCore.create(project);
        }
        ClasspathResourceSelectionDialog dialog;
        if (javaProject == null) {
            dialog = new ClasspathResourceSelectionDialog(shell, ResourcesPlugin.getWorkspace().getRoot(),
                    extension);
        } else {
            dialog = new ClasspathResourceSelectionDialog(shell, javaProject.getProject(), extension);
        }
        dialog.setTitle(Messages.bind(Messages.ExpressionDialog_titleResourceSelection, extension.toUpperCase()));
        dialog.setInitialPattern("*." + extension); //$NON-NLS-1$
        dialog.open();
        Object[] result = dialog.getResult();
        if (result == null || result.length == 0 || !(result[0] instanceof IResource)) {
            return null;
        }
        return ((IResource) result[0]).getProjectRelativePath().toPortableString();
    }

    @Override
    protected void configureShell(Shell shell) {
        super.configureShell(shell);
        shell.setText(Messages.ExpressionDialog_shellTitle);
    }

}