org.xpect.ui.junit.launching.LaunchShortcutUtil.java Source code

Java tutorial

Introduction

Here is the source code for org.xpect.ui.junit.launching.LaunchShortcutUtil.java

Source

/*******************************************************************************
 * Copyright (c) 2012 itemis AG (http://www.itemis.eu) 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
 *******************************************************************************/
package org.xpect.ui.junit.launching;

import java.util.List;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.internal.junit.launcher.AssertionVMArg;
import org.eclipse.jdt.internal.junit.launcher.JUnitLaunchConfigurationConstants;
import org.eclipse.jdt.internal.junit.launcher.JUnitMigrationDelegate;
import org.eclipse.jdt.internal.junit.launcher.TestKindRegistry;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.xtext.util.Strings;

import com.google.common.base.Joiner;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;

/**
 * @author Moritz Eysholdt - Initial contribution and API
 */
@SuppressWarnings("restriction")
public class LaunchShortcutUtil {

    public static ILaunchConfigurationWorkingCopy createXpectLaunchConfiguration(JUnitJavaElementDelegate element,
            String launchConfigurationTypeId) throws CoreException {
        IJavaElement javaElement = element.getJavaElement();
        Preconditions.checkArgument(javaElement.getElementType() == IJavaElement.TYPE);

        String mainTypeQualifiedName = ((IType) javaElement).getFullyQualifiedName('.'); // don't replace, fix for binary inner types
        String containerHandleId = "";

        String testName = getLaunchConfigTitle(element);

        String testKindId = TestKindRegistry.JUNIT4_TEST_KIND_ID;

        ILaunchConfigurationType configType = getLaunchManager()
                .getLaunchConfigurationType(launchConfigurationTypeId);
        ILaunchConfigurationWorkingCopy wc = configType.newInstance(null,
                getLaunchManager().generateLaunchConfigurationName(testName));

        wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, mainTypeQualifiedName);
        wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME,
                javaElement.getJavaProject().getElementName());
        wc.setAttribute(JUnitLaunchConfigurationConstants.ATTR_KEEPRUNNING, false);
        wc.setAttribute(JUnitLaunchConfigurationConstants.ATTR_TEST_CONTAINER, containerHandleId);
        wc.setAttribute(JUnitLaunchConfigurationConstants.ATTR_TEST_RUNNER_KIND, testKindId);
        JUnitMigrationDelegate.mapResources(wc);
        AssertionVMArg.setArgDefault(wc);

        String methodName = element.getDescription().getMethodName();
        if (!Strings.isEmpty(methodName))
            wc.setAttribute(JUnitLaunchConfigurationConstants.ATTR_TEST_METHOD_NAME, methodName);
        else
            wc.setAttribute(JUnitLaunchConfigurationConstants.ATTR_TEST_METHOD_NAME,
                    element.getDescription().getClassName());
        String fileInProject = element.getResource().getFullPath().removeFirstSegments(1).toString();
        ensureContains(wc, IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, "-DxpectFiles=", fileInProject);
        return wc;
    }

    private static void ensureContains(ILaunchConfigurationWorkingCopy wc, String attributeName, final String key,
            String value) throws CoreException {
        List<String> vmArgs = Lists.newArrayList(wc.getAttribute(attributeName, "").split("\\s+"));
        for (int i = 0; i < vmArgs.size(); i++) {
            if (vmArgs.get(i).startsWith(key)) {
                vmArgs.set(i, key + value);
                value = null;
            }
        }
        if (value != null)
            vmArgs.add(key + value);
        wc.setAttribute(attributeName, Joiner.on(" ").join(vmArgs));
    }

    private static String getLaunchConfigTitle(JUnitJavaElementDelegate element) {
        String fileName = element.getResource().getName();
        if (!Strings.isEmpty(element.getName()))
            return fileName + "#" + element.getName();
        return fileName;
    }

    public static ILaunchManager getLaunchManager() {
        return DebugPlugin.getDefault().getLaunchManager();
    }

    public static IStructuredSelection replaceWithJavaElementDelegates(IStructuredSelection sel) {
        Object[] selection = sel.toArray();
        Object[] result = new Object[selection.length];
        for (int i = 0; i < selection.length; i++) {
            Object s = selection[i];
            if (s == null || s instanceof IJavaElement || s instanceof JUnitJavaElementDelegate
                    || !(s instanceof IAdaptable))
                result[i] = s;
            else {
                IAdaptable adaptable = (IAdaptable) s;
                JUnitJavaElementDelegate delegate = (JUnitJavaElementDelegate) adaptable
                        .getAdapter(JUnitJavaElementDelegate.class);
                result[i] = delegate != null ? delegate : s;
            }
        }
        StructuredSelection newSelection = new StructuredSelection(result);
        return newSelection;
    }

}