at.bestsolution.efxclipse.tooling.jdt.ui.internal.handler.AbstractBuildHandler.java Source code

Java tutorial

Introduction

Here is the source code for at.bestsolution.efxclipse.tooling.jdt.ui.internal.handler.AbstractBuildHandler.java

Source

/*******************************************************************************
 * Copyright (c) 2011 BestSolution.at 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:
 *     Tom Schindl<tom.schindl@bestsolution.at> - initial API and implementation
 *     Martin Blhweis<martin.bluehweis@bestsolution.at> - refactoring to EMF build model
 *******************************************************************************/
package at.bestsolution.efxclipse.tooling.jdt.ui.internal.handler;

import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.ant.launching.IAntLaunchConstants;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.expressions.IEvaluationContext;
import org.eclipse.core.externaltools.internal.IExternalToolConstants;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.jdt.launching.IVMInstall;
import org.eclipse.jdt.launching.IVMInstallType;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.jdt.launching.VMStandin;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StyledCellLabelProvider;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
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.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;

import at.bestsolution.efxclipse.tooling.jdt.ui.internal.JavaFXUIPlugin;
import at.bestsolution.efxclipse.tooling.jdt.ui.internal.editors.model.anttasks.AntTask;

/**
 * @author Tom Schindl
 * 
 */
@SuppressWarnings("restriction")
public abstract class AbstractBuildHandler extends AbstractAntHandler {

    @Override
    public Object execute(ExecutionEvent event) throws ExecutionException {
        IEvaluationContext context = (IEvaluationContext) event.getApplicationContext();

        IFile f = getConfigurationFile(context);
        if (f == null) {
            return null;
        }

        try {
            URI resourceURI = URI.createPlatformResourceURI(f.getFullPath().toString(), true);
            Resource resource = null;
            try {
                // Load the resource through the editing domain.
                //
                resource = new ResourceSetImpl().getResource(resourceURI, true);
            } catch (Exception e) {
                resource = new ResourceSetImpl().getResource(resourceURI, false);
            }

            AntTask task = (AntTask) resource.getContents().get(0);

            InputStream in = f.getContents();
            in.close();
            // TODO
            BuildConfiguration rv = prepareBuild(f, task);
            if (rv != null) {
                CreateBuildXML b = new CreateBuildXML();
                File buildFile = b.run(rv);

                f.getProject().refreshLocal(IResource.DEPTH_INFINITE, null);

                ILaunchConfiguration cfg = getLaunchConfig(buildFile, rv, f);

                if (cfg != null && launchAnt()) {
                    DebugUITools.launch(cfg, ILaunchManager.RUN_MODE);
                }
            }
        } catch (Exception e) {
            throw new ExecutionException("Failed to export application", e);
        }
        return null;
    }

    protected abstract boolean launchAnt();

    protected abstract IFile getConfigurationFile(IEvaluationContext context);

    private ILaunchConfiguration getLaunchConfig(File buildFile, BuildConfiguration cfgData, IFile buildCfgFile)
            throws CoreException {
        ILaunchManager mgr = DebugPlugin.getDefault().getLaunchManager();
        ILaunchConfigurationType type = mgr
                .getLaunchConfigurationType("org.eclipse.ant.AntLaunchConfigurationType");

        if (type != null) {
            String name = (String) cfgData.builderName;
            if (name == null) {
                name = "JFX Build - " + cfgData.projectName;
            }

            File fBuildFile = new File(cfgData.buildDirectory + "/build.xml");

            for (ILaunchConfiguration cfg : mgr.getLaunchConfigurations(type)) {
                if (cfg.getName().equals(name)) {
                    String s = cfg.getAttribute(IExternalToolConstants.ATTR_LOCATION,
                            IExternalToolConstants.EMPTY_STRING);
                    if (!s.equals("") && new File(s).equals(fBuildFile)) {
                        return cfg;
                    } else {
                        cfg.delete();
                    }
                }
            }

            ILaunchConfigurationWorkingCopy cfg = type.newInstance(null, name);
            cfg.setAttribute(IExternalToolConstants.ATTR_LOCATION, buildFile.getAbsolutePath());
            cfg.setAttribute(IExternalToolConstants.ATTR_WORKING_DIRECTORY,
                    buildFile.getParentFile().getAbsolutePath());
            cfg.setAttribute("org.eclipse.debug.core.ATTR_REFRESH_SCOPE", "${project}");
            cfg.setAttribute(IAntLaunchConstants.ATTR_DEFAULT_VM_INSTALL, false);
            cfg.setAttribute("org.eclipse.jdt.launching.MAIN_TYPE",
                    "org.eclipse.ant.internal.launching.remote.InternalAntRunner");
            cfg.setAttribute("process_factory_id", "org.eclipse.ant.ui.remoteAntProcessFactory");

            IVMInstall install = null;
            for (IClasspathEntry e : project.getRawClasspath()) {
                String start = e.getPath().segment(0);
                if (start.startsWith("org.eclipse.jdt.launching.JRE_CONTAINER")) {
                    install = JavaRuntime.getVMInstall(e.getPath());
                    cfg.setAttribute(IJavaLaunchConfigurationConstants.ATTR_JRE_CONTAINER_PATH,
                            e.getPath().toString());
                }
            }

            if (!isJDK(install)) {
                if (MessageDialog.openQuestion(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
                        "Not a JDK",
                        "The project is attached to a JRE only so ant would be started with a JRE which does not have a compiler. Would you like to proceed and select a JDK?")) {
                    JDKSelectionDialog d = new JDKSelectionDialog(
                            PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
                    if (d.open() == Window.OK) {
                        cfg.setAttribute(IJavaLaunchConfigurationConstants.ATTR_JRE_CONTAINER_PATH,
                                JavaRuntime.newJREContainerPath(d.install).toString());
                    }
                } else {
                    return null;
                }
            }

            cfg.doSave();
            return cfg;
        }
        return null;
    }

    static boolean isJDK(IVMInstall install) {
        File f = install.getInstallLocation();
        File tools = new File(new File(f, "lib"), "tools.jar");
        return tools.exists();
    }

    static class JDKSelectionDialog extends TitleAreaDialog {

        private TableViewer viewer;
        private IVMInstall install;

        public JDKSelectionDialog(Shell parentShell) {
            super(parentShell);
        }

        @Override
        protected Control createDialogArea(Composite parent) {
            Composite content = (Composite) super.createDialogArea(parent);

            getShell().setText("Select a JDK");
            setTitle("Select a JDK");
            setMessage("To build your product you need to run ant with a JDK. Select one in the list below");

            parent = new Composite(content, SWT.NONE);
            parent.setLayoutData(new GridData(GridData.FILL_BOTH));
            parent.setLayout(new GridLayout());

            Label l = new Label(parent, SWT.NONE);
            l.setText("Select a JDK");

            viewer = new TableViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
            viewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
            viewer.setContentProvider(ArrayContentProvider.getInstance());
            viewer.setLabelProvider(new StyledCellLabelProvider() {
                public void update(ViewerCell cell) {
                    IVMInstall install = (IVMInstall) cell.getElement();
                    StyledString s = new StyledString(install.getName());
                    s.append(" - " + install.getInstallLocation().getAbsolutePath(),
                            StyledString.DECORATIONS_STYLER);
                    cell.setStyleRanges(s.getStyleRanges());
                    cell.setText(s.getString());
                    cell.setImage(JavaFXUIPlugin.getDefault().getImageRegistry()
                            .getDescriptor(JavaFXUIPlugin.LIBRARY_ICON).createImage());
                }
            });

            List<IVMInstall> installs = getWorkspaceJREs();
            Iterator<IVMInstall> it = installs.iterator();

            while (it.hasNext()) {
                if (!isJDK(it.next())) {
                    it.remove();
                }
            }
            viewer.setInput(installs);

            viewer.addSelectionChangedListener(new ISelectionChangedListener() {

                @Override
                public void selectionChanged(SelectionChangedEvent event) {
                    ISelection s = event.getSelection();
                    if (s.isEmpty()) {
                        getButton(IDialogConstants.OK_ID).setEnabled(false);
                    } else {
                        install = (IVMInstall) ((IStructuredSelection) s).getFirstElement();
                        getButton(IDialogConstants.OK_ID).setEnabled(true);
                    }
                }
            });

            return content;
        }

        @Override
        protected Button createButton(Composite parent, int id, String label, boolean defaultButton) {
            Button b = super.createButton(parent, id, label, defaultButton);
            if (id == IDialogConstants.OK_ID) {
                b.setEnabled(false);
            }
            return b;
        }

        private List<IVMInstall> getWorkspaceJREs() {
            List<IVMInstall> standins = new ArrayList<IVMInstall>();
            IVMInstallType[] types = JavaRuntime.getVMInstallTypes();
            for (int i = 0; i < types.length; i++) {
                IVMInstallType type = types[i];
                IVMInstall[] installs = type.getVMInstalls();
                for (int j = 0; j < installs.length; j++) {
                    IVMInstall install = installs[j];
                    standins.add(new VMStandin(install));
                }
            }
            return standins;
        }
    }
}