1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-21 21:52:10 +02:00

LaunchBar - added test plugin and refactoring

Initial tests and refactoring to support tests


Change-Id: Ia14961b4a13ad7e8f2e1d75be264243f7432fe2d
Signed-off-by: Alena Laskavaia <elaskavaia.cdt@gmail.com>
Reviewed-on: https://git.eclipse.org/r/30462
This commit is contained in:
Alena Laskavaia 2014-07-24 16:50:54 -04:00 committed by Elena Laskavaia
parent 668242634a
commit e26e8a60c0
28 changed files with 1296 additions and 305 deletions

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>org.eclipse.cdt.launchbar.core.tests</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View file

@ -0,0 +1,7 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
org.eclipse.jdt.core.compiler.compliance=1.7
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.7

View file

@ -0,0 +1,13 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Launch Bar Core Tests
Bundle-SymbolicName: org.eclipse.cdt.launchbar.core.tests
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: org.eclipse.cdt.launchbar.core.tests.Activator
Require-Bundle: org.eclipse.core.runtime,
org.junit;bundle-version="4.11.0",
org.mockito,
org.eclipse.cdt.launchbar.core;bundle-version="1.0.0",
org.eclipse.debug.core
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Bundle-ActivationPolicy: lazy

View file

@ -0,0 +1,24 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>About</title></head>
<body lang="EN-US">
<h2>About This Content</h2>
<p>June 22, 2007</p>
<h3>License</h3>
<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
indicated below, the Content is provided to you under the terms and conditions of the
Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
For purposes of the EPL, "Program" will mean the Content.</p>
<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
being redistributed by another party ("Redistributor") and different terms and conditions may
apply to your use of any object code in the Content. Check the Redistributor's license that was
provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
indicated below, the terms and conditions of the EPL still apply to any source code in the Content
and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
</body></html>

View file

@ -0,0 +1,4 @@
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.

View file

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.eclipse.cdt</groupId>
<artifactId>cdt-parent</artifactId>
<version>8.5.0-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<version>1.0.0-SNAPSHOT</version>
<artifactId>org.eclipse.cdt.launchbar.core.tests</artifactId>
<packaging>eclipse-plugin</packaging>
<build>
<plugins>
<plugin>
<groupId>org.eclipse.tycho</groupId>
<artifactId>tycho-surefire-plugin</artifactId>
<version>${tycho-version}</version>
<configuration>
<argLine>${base.ui.test.vmargs} -ea -Xms256m -Xmx512m -XX:MaxPermSize=256M</argLine>
<includes>
<include>**/AutomatedIntegrationSuite.*</include>
</includes>
<testFailureIgnore>true</testFailureIgnore>
<dependencies>
<dependency>
<artifactId>org.eclipse.platform.feature.group</artifactId>
<type>p2-installable-unit</type>
</dependency>
<dependency>
<artifactId>org.eclipse.cdt.feature.group</artifactId>
<version>8.2.0.${buildQualifier}</version>
<type>p2-installable-unit</type>
</dependency>
</dependencies>
</configuration>
</plugin>
</plugins>
</build>
</project>

View file

@ -0,0 +1,465 @@
/*******************************************************************************
* Copyright (c) 2014 QNX Software Systems. All Rights Reserved.
*
* You must obtain a written license from and pay applicable license fees to QNX
* Software Systems before you may reproduce, modify or distribute this software,
* or any work that includes all or part of this software. Free development
* licenses are available for evaluation and non-commercial purposes. For more
* information visit [http://licensing.qnx.com] or email licensing@qnx.com.
*
* This file may contain contributions from others. Please review this entire
* file for other proprietary rights or license notices, as well as the QNX
* Development Suite License Guide at [http://licensing.qnx.com/license-guide/]
* for other information.
*******************************************************************************/
package org.eclipse.cdt.launchbar.core.internal;
import static org.mockito.Mockito.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import junit.framework.TestCase;
import org.eclipse.cdt.launchbar.core.AbstractLaunchTarget;
import org.eclipse.cdt.launchbar.core.AbstractLaunchTargetType;
import org.eclipse.cdt.launchbar.core.ConfigBasedLaunchConfigurationProvider;
import org.eclipse.cdt.launchbar.core.ConfigBasedLaunchDescriptor;
import org.eclipse.cdt.launchbar.core.ConfigBasedLaunchDescriptorType;
import org.eclipse.cdt.launchbar.core.ILaunchBarManager.Listener;
import org.eclipse.cdt.launchbar.core.ILaunchConfigurationProvider;
import org.eclipse.cdt.launchbar.core.ILaunchDescriptor;
import org.eclipse.cdt.launchbar.core.ILaunchDescriptorType;
import org.eclipse.cdt.launchbar.core.ILaunchTarget;
import org.eclipse.cdt.launchbar.core.ILaunchTargetType;
import org.eclipse.core.internal.preferences.EclipsePreferences;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.core.ILaunchMode;
import org.junit.Test;
/**
* @author elaskavaia
*
*/
public class LaunchBarManagerTest extends TestCase {
private LaunchBarManager manager;
private ILaunchConfigurationProvider provider;
private ILaunchDescriptor desc;
private ILaunchDescriptorType descType;
private ILaunchConfigurationType lctype;
private ILaunchConfiguration lc;
class TargetType extends AbstractLaunchTargetType {
private String id;
ArrayList<ILaunchTarget> targets = new ArrayList<>();
public TargetType(String id) {
this.id = id;
}
@Override
public ILaunchTarget[] getTargets() {
return targets.toArray(new ILaunchTarget[targets.size()]);
}
@Override
public String getId() {
return id;
}
}
private TargetType targetType = new TargetType("target_type1");
class LaunchTarget extends AbstractLaunchTarget {
private ILaunchTargetType type;
public LaunchTarget(String id, ILaunchTargetType type) {
super(id);
this.type = type;
}
public ILaunchTargetType getType() {
return type;
}
}
private ILaunchTarget mytarget = new LaunchTarget("target_1", targetType);
private ILaunchManager lman;
@Override
protected void setUp() throws Exception {
final IExtensionPoint point = mock(IExtensionPoint.class);
doReturn(new IExtension[] {}).when(point).getExtensions();
lman = mock(ILaunchManager.class);
doReturn(new ILaunchConfiguration[] {}).when(lman).getLaunchConfigurations();
final IEclipsePreferences store = new EclipsePreferences();
manager = new LaunchBarManager() {
@Override
public IExtensionPoint getExtensionPoint() {
return point;
}
@Override
protected ILaunchManager getLaunchManager() {
return lman;
}
@Override
protected IEclipsePreferences getPreferenceStore() {
return store;
}
};
// mock
// lc
lctype = mockLCType("lctype1");
lc = mockLC("bla", lctype);
// other init
provider = spy(new ConfigBasedLaunchConfigurationProvider(lctype.getIdentifier()));
descType = new ConfigBasedLaunchDescriptorType("desctype1", lctype.getIdentifier());
desc = new ConfigBasedLaunchDescriptor(descType, lc);
}
protected void basicSetup() {
// setup some stuff
manager.addTargetType(targetType);
targetType.targets.add(mytarget);
manager.addDescriptorType(descType, 5);
manager.addConfigProvider(descType.getId(), targetType.getId(), false, provider);
}
private ILaunchConfiguration mockLC(String string, ILaunchConfigurationType lctype2) throws CoreException {
ILaunchConfiguration lc = mock(ILaunchConfiguration.class);
doReturn(string).when(lc).getName();
doReturn(lctype2).when(lc).getType();
return lc;
}
protected ILaunchConfigurationType mockLCType(String id) {
ILaunchConfigurationType lctype = mock(ILaunchConfigurationType.class);
doReturn(id).when(lctype).getIdentifier();
return lctype;
}
protected ILaunchMode[] mockLaunchMode(ILaunchConfigurationType type, String... modes) {
ILaunchMode res[] = new ILaunchMode[modes.length];
for (int i = 0; i < modes.length; i++) {
String modeId = modes[i];
doReturn(true).when(type).supportsMode(modeId);
ILaunchMode mode = mock(ILaunchMode.class);
res[i] = mode;
doReturn(modeId).when(mode).getIdentifier();
doReturn(mode).when(lman).getLaunchMode(modeId);
}
doReturn(new HashSet<>(Arrays.asList(modes))).when(type).getSupportedModes();
return res;
}
public void testLaunchBarManager() {
assertNull(manager.getActiveLaunchDescriptor());
assertNull(manager.getActiveLaunchTarget());
assertNull(manager.getActiveLaunchMode());
}
@Test
public void testAddConfigProvider() {
manager.addTargetType(targetType);
manager.addDescriptorType(descType, 5);
manager.addConfigProvider(descType.getId(), targetType.getId(), false, provider);
}
@Test
public void testAddConfigProviderNoTarget() {
try {
manager.addDescriptorType(descType, 5);
manager.addConfigProvider(descType.getId(), targetType.getId(), false, provider);
fail("Expecting exctpion because target is not registered");
} catch (Exception e) {
// pass
}
}
@Test
public void testAddConfigProviderNoDesc() {
try {
manager.addTargetType(targetType);
manager.addConfigProvider(descType.getId(), targetType.getId(), false, provider);
fail("Expecting exctpion because target is not registered");
} catch (Exception e) {
// pass
}
}
@Test
public void testAddConfigProviderTwo() throws CoreException {
basicSetup();
TargetType targetType2 = new TargetType("t2");
manager.addTargetType(targetType2);
ILaunchConfigurationProvider provider2 = new ConfigBasedLaunchConfigurationProvider("type2");
manager.addConfigProvider(descType.getId(), targetType2.getId(), true, provider2);
ILaunchConfigurationType lctype2 = mockLCType("lctypeid2");
ILaunchConfiguration lc2 = mockLC("bla2", lctype2);
ConfigBasedLaunchDescriptor desc2 = new ConfigBasedLaunchDescriptor(descType, lc2);
assertEquals(lctype2, manager.getLaunchConfigurationType(desc2, null));
}
@Test
public void testAddConfigProviderTwo2() throws CoreException {
manager.addTargetType(targetType);
manager.addDescriptorType(descType, 5);
ILaunchConfigurationProvider provider2 = new ConfigBasedLaunchConfigurationProvider("type2") {
@Override
public ILaunchConfigurationType getLaunchConfigurationType(ILaunchDescriptor descriptor) throws CoreException {
return lctype;
}
};
manager.addConfigProvider(descType.getId(), targetType.getId(), true, provider2);
TargetType targetType2 = new TargetType("t2");
manager.addTargetType(targetType2);
manager.addConfigProvider(descType.getId(), targetType2.getId(), false, provider);
ILaunchConfigurationType lctype2 = mockLCType("lctypeid2");
ILaunchConfiguration lc2 = mockLC("bla2", lctype2);
ConfigBasedLaunchDescriptor desc2 = new ConfigBasedLaunchDescriptor(descType, lc2);
assertEquals(lctype, manager.getLaunchConfigurationType(desc2, null));
}
@Test
public void testGetLaunchTargets() throws CoreException {
basicSetup();
manager.setActiveLaunchDescriptor(desc);
ILaunchTarget[] launchTargets = manager.getLaunchTargets();
assertEquals(1, launchTargets.length);
assertEquals(mytarget, launchTargets[0]);
}
@Test
public void testGetLaunchDescriptorsNull() {
ILaunchDescriptor[] launchDescriptors = manager.getLaunchDescriptors();
assertEquals(0, launchDescriptors.length);
}
public void testGetLaunchDescriptors() {
basicSetup();
manager.launchObjectAdded(lc);
ILaunchDescriptor[] launchDescriptors = manager.getLaunchDescriptors();
assertEquals(1, launchDescriptors.length);
}
public void testGetLaunchDescriptorsSort() {
final ILaunchDescriptor res[] = new ILaunchDescriptor[1];
manager.addTargetType(targetType);
ConfigBasedLaunchDescriptorType descType1 = new ConfigBasedLaunchDescriptorType("id1", lctype.getIdentifier());
ConfigBasedLaunchDescriptorType descType2 = new ConfigBasedLaunchDescriptorType("id2", lctype.getIdentifier()) {
@Override
public ILaunchDescriptor getDescriptor(Object element) {
return res[0] = super.getDescriptor(element);
}
};
ConfigBasedLaunchDescriptorType descType3 = new ConfigBasedLaunchDescriptorType("id3", lctype.getIdentifier());
manager.addDescriptorType(descType1, 3);
manager.addDescriptorType(descType2, 5);
manager.addDescriptorType(descType3, 1);
manager.addConfigProvider(descType1.getId(), targetType.getId(), true, provider);
manager.addConfigProvider(descType2.getId(), targetType.getId(), true, provider);
manager.addConfigProvider(descType3.getId(), targetType.getId(), true, provider);
targetType.targets.add(mytarget);
manager.launchObjectAdded(lc);
ILaunchDescriptor[] launchDescriptors = manager.getLaunchDescriptors();
assertEquals(1, launchDescriptors.length);
assertNotNull(launchDescriptors[0]);
assertSame(res[0], launchDescriptors[0]);
}
@Test
public void testLaunchObjectAdded() throws CoreException {
basicSetup();
manager.launchObjectAdded(lc);
ILaunchDescriptor[] launchDescriptors = manager.getLaunchDescriptors();
assertEquals(1, launchDescriptors.length);
assertNotNull(launchDescriptors[0]);
assertEquals(lc.getName(), launchDescriptors[0].getName());
}
@Test
public void testLaunchObjectAdded2() throws CoreException {
basicSetup();
manager.launchObjectAdded(lc);
ILaunchConfiguration lc2 = mockLC("lc2", lctype);
manager.launchObjectAdded(lc2);
assertEquals(2, manager.getLaunchDescriptors().length);
}
@Test
public void testLaunchObjectRemoved() throws CoreException {
basicSetup();
manager.launchObjectAdded(lc);
assertEquals(1, manager.getLaunchDescriptors().length);
manager.launchObjectRemoved(lc);
assertEquals(0, manager.getLaunchDescriptors().length);
}
@Test
public void testGetActiveLaunchDescriptor() throws CoreException {
Listener lis = mock(Listener.class);
manager.addListener(lis);
manager.setActiveLaunchDescriptor(desc);
assertEquals(desc, manager.getActiveLaunchDescriptor());
verify(lis).activeConfigurationDescriptorChanged();
}
@Test
public void testGetLaunchModes() throws CoreException {
ILaunchMode[] launchModes = manager.getLaunchModes();
assertEquals(0, launchModes.length);
}
@Test
public void testGetActiveLaunchMode() {
ILaunchMode mode = mock(ILaunchMode.class);
doReturn("bla").when(mode).getIdentifier();
doReturn("Bla").when(mode).getLabel();
manager.setActiveLaunchMode(mode);
assertEquals(mode, manager.getActiveLaunchMode());
}
@Test
public void testGetActiveLaunchModeFromDesc() throws CoreException {
basicSetup();
mockLaunchMode(lctype, "run");
manager.setActiveLaunchDescriptor(desc);
ILaunchMode resmode = manager.getActiveLaunchMode();
assertNotNull(resmode);
assertEquals("run", resmode.getIdentifier());
}
@Test
public void testGetActiveLaunchModeFromDescDebug() throws CoreException {
basicSetup();
mockLaunchMode(lctype, "run", "debug");
manager.setActiveLaunchDescriptor(desc);
ILaunchMode resmode = manager.getActiveLaunchMode();
assertNotNull(resmode);
assertEquals("debug", resmode.getIdentifier());
}
@Test
public void testGetActiveLaunchModeFromDescActive() throws CoreException {
basicSetup();
mockLaunchMode(lctype, "run");
ILaunchMode mode = mockLaunchMode(lctype, "foo")[0];
manager.setActiveLaunchMode(mode);
manager.setActiveLaunchDescriptor(desc);
ILaunchMode resmode = manager.getActiveLaunchMode();
assertNotNull(resmode);
assertEquals("foo", resmode.getIdentifier());
}
@Test
public void testGetActiveLaunchTarget() {
manager.addTargetType(targetType);
targetType.targets.add(mytarget);
manager.setActiveLaunchTarget(mytarget);
assertEquals(mytarget, manager.getActiveLaunchTarget());
}
@Test
public void testGetLaunchTarget() {
manager.addTargetType(targetType);
targetType.targets.add(mytarget);
assertEquals(mytarget, manager.getLaunchTarget(mytarget.getId()));
}
@Test
public void testGetLaunchTargetNone() {
manager.addTargetType(targetType);
assertNull(manager.getLaunchTarget(mytarget.getId()));
}
@Test
public void testGetLaunchConfigurationType() throws CoreException {
manager.getLaunchConfigurationType(desc, mytarget);
}
@Test
public void testGetLaunchConfiguration() throws CoreException {
manager.getLaunchConfiguration(desc, mytarget);
}
@Test
public void testAddListener() throws CoreException {
Listener lis = mock(Listener.class);
manager.addListener(lis);
basicSetup();
// check events
manager.setActiveLaunchDescriptor(desc);
verify(lis).activeLaunchTargetChanged();
}
@Test
public void testAddListenerBad() throws CoreException {
Listener lis = mock(Listener.class);
manager.addListener(lis);
doThrow(new NullPointerException()).when(lis).activeLaunchTargetChanged();
basicSetup();
// check events
manager.setActiveLaunchDescriptor(desc);
verify(lis).activeLaunchTargetChanged();
}
@Test
public void testRemoveListener() {
basicSetup();
Listener lis = mock(Listener.class);
manager.addListener(lis);
manager.removeListener(lis);
verifyZeroInteractions(lis);
}
@Test
public void testLaunchConfigurationAdded() throws CoreException {
basicSetup();
ILaunchMode mode = mockLaunchMode(lctype, "foo")[0];
manager.launchConfigurationAdded(lc);
verify(provider).launchConfigurationAdded(lc);
ILaunchDescriptor[] launchDescriptors = manager.getLaunchDescriptors();
assertEquals(1, launchDescriptors.length);
assertNotNull(launchDescriptors[0]);
assertEquals(lc.getName(), launchDescriptors[0].getName());
manager.setActiveLaunchDescriptor(desc);
assertEquals(mytarget, manager.getActiveLaunchTarget());
assertEquals(mode, manager.getActiveLaunchMode());
}
public void testLaunchConfigurationAddedDefault() throws CoreException {
basicSetup();
// emulate default type (if running not from plugin)
LocalTargetType localType = new LocalTargetType();
manager.addTargetType(localType);
DefaultLaunchDescriptorType type = new DefaultLaunchDescriptorType();
manager.addDescriptorType(type, 1);
manager.addConfigProvider(type.getId(), localType.getId(), false, new DefaultLaunchConfigurationProvider());
// another lc not covered by provider
ILaunchConfigurationType lctype2 = mockLCType("lctype2");
ILaunchConfiguration lc2 = mockLC("lc2", lctype2);
manager.launchConfigurationAdded(lc2);
verify(provider).launchConfigurationAdded(lc2);
ILaunchDescriptor[] launchDescriptors = manager.getLaunchDescriptors();
assertEquals(1, launchDescriptors.length);
assertNotNull(launchDescriptors[0]);
assertEquals(lc2.getName(), launchDescriptors[0].getName());
manager.setActiveLaunchDescriptor(type.getDescriptor(lc2));
assertEquals(localType.getTargets()[0], manager.getActiveLaunchTarget());
}
@Test
public void testLaunchConfigurationRemoved() throws CoreException {
basicSetup();
manager.launchConfigurationRemoved(lc);
verify(provider).launchConfigurationRemoved(lc);
}
}

View file

@ -0,0 +1,30 @@
package org.eclipse.cdt.launchbar.core.tests;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
public class Activator implements BundleActivator {
private static BundleContext context;
static BundleContext getContext() {
return context;
}
/*
* (non-Javadoc)
* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
*/
public void start(BundleContext bundleContext) throws Exception {
Activator.context = bundleContext;
}
/*
* (non-Javadoc)
* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
*/
public void stop(BundleContext bundleContext) throws Exception {
Activator.context = null;
}
}

View file

@ -0,0 +1,42 @@
/*******************************************************************************
* Copyright (c) 2004, 2011 QNX Software Systems 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:
* QNX Software Systems - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.launchbar.core.tests;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.cdt.launchbar.core.internal.LaunchBarManagerTest;
public class AutomatedIntegrationSuite extends TestSuite {
public AutomatedIntegrationSuite() {
}
public AutomatedIntegrationSuite(Class<? extends TestCase> theClass, String name) {
super(theClass, name);
}
public AutomatedIntegrationSuite(Class<? extends TestCase> theClass) {
super(theClass);
}
public AutomatedIntegrationSuite(String name) {
super(name);
}
public static Test suite() {
final AutomatedIntegrationSuite suite = new AutomatedIntegrationSuite();
// tests
suite.addTestSuite(LaunchBarManagerTest.class);
return suite;
}
}

View file

@ -10,4 +10,4 @@ Require-Bundle: org.eclipse.core.runtime,
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Bundle-ActivationPolicy: lazy
Export-Package: org.eclipse.cdt.launchbar.core,
org.eclipse.cdt.launchbar.core.internal;x-friends:="org.eclipse.cdt.launchbar.ui"
org.eclipse.cdt.launchbar.core.internal;x-friends:="org.eclipse.cdt.launchbar.ui,org.eclipse.cdt.launchbar.core.tests"

View file

@ -0,0 +1,52 @@
/*******************************************************************************
* Copyright (c) 2014 QNX Software Systems 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:
* Elena Laskavaia - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.launchbar.core;
/**
* Abstract launch descriptor type provide convenience methods to implement hashcode, equals and store lanch bar manager object. It
* is recommended to use this method instead of implementing interface
*/
public abstract class AbstarctLaunchDescriptorType implements ILaunchDescriptorType {
private ILaunchBarManager manager;
@Override
public abstract String getId();
@Override
public void init(ILaunchBarManager barmanager) {
this.manager = barmanager;
}
@Override
public ILaunchBarManager getManager() {
return manager;
}
@Override
public int hashCode() {
return 37 + getId().hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj.getClass().equals(getClass())))
return false;
ILaunchDescriptorType other = (ILaunchDescriptorType) obj;
if (!getId().equals(other.getId()))
return false;
return true;
}
}

View file

@ -0,0 +1,48 @@
/*******************************************************************************
* Copyright (c) 2014 QNX Software Systems 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:
* Elena Laskavaia - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.launchbar.core;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationType;
/**
* Abstract provider can work with any ITypeBaseLaunchDescriptor to provide launch configurations
*/
public abstract class AbstractLaunchConfigurationProvider implements ILaunchConfigurationProvider {
protected ILaunchBarManager manager;
@Override
public void init(ILaunchBarManager manager) throws CoreException {
this.manager = manager;
}
public ILaunchBarManager getManager() {
return manager;
}
@Override
public ILaunchConfiguration getLaunchConfiguration(ILaunchDescriptor descriptor) throws CoreException {
if (descriptor instanceof ILaunchDescriptorConfigBased) {
return ((ILaunchDescriptorConfigBased) descriptor).getConfig();
}
return null;
}
@Override
public ILaunchConfigurationType getLaunchConfigurationType(ILaunchDescriptor descriptor) throws CoreException {
ILaunchConfiguration config = getLaunchConfiguration(descriptor);
if (config != null) {
return config.getType();
}
return null;
}
}

View file

@ -0,0 +1,49 @@
/*******************************************************************************
* Copyright (c) 2014 QNX Software Systems 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:
* Elena Laskavaia - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.launchbar.core;
/**
* Convenience implementation of ILaunchDescriptor
*
* @author elaskavaia
*
*/
public abstract class AbstractLaunchDescriptor implements ILaunchDescriptor {
@Override
public abstract String getName();
@Override
public abstract ILaunchDescriptorType getType();
public String getId() {
return getName() + "." + getType().getId();
}
@Override
public int hashCode() {
return 17 + getId().hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof AbstractLaunchDescriptor))
return false;
AbstractLaunchDescriptor other = (AbstractLaunchDescriptor) obj;
if (!getId().equals(other.getId()))
return false;
return true;
}
}

View file

@ -0,0 +1,59 @@
/*******************************************************************************
* Copyright (c) 2014 QNX Software Systems 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:
* Elena Laskavaia - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.launchbar.core;
/**
* Convenience implementation of ILaunchTarget, provides hooks for id, and equals and hashcode methods based on id.
*/
public abstract class AbstractLaunchTarget implements ILaunchTarget {
private final String id;
public AbstractLaunchTarget(String id) {
this.id = id;
}
@Override
public String getId() {
return id;
}
@Override
public String getName() {
return id;
}
@Override
public abstract ILaunchTargetType getType();
@Override
public void setActive() {
// nothing to do
}
@Override
public int hashCode() {
return 7 + getId().hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj.getClass().equals(getClass())))
return false;
ILaunchDescriptorType other = (ILaunchDescriptorType) obj;
if (!getId().equals(other.getId()))
return false;
return true;
}
}

View file

@ -0,0 +1,62 @@
/*******************************************************************************
* Copyright (c) 2014 QNX Software Systems 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:
* Elena Laskavaia - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.launchbar.core;
/**
* Convenience implementation of ILaunchTargetType, provides equals and hashcode methods based on id.
*/
public abstract class AbstractLaunchTargetType implements ILaunchTargetType {
private ILaunchBarManager manager;
@Override
public void init(ILaunchBarManager barmanager) {
this.manager = barmanager;
}
public ILaunchBarManager getManager() {
return manager;
}
@Override
public abstract String getId();
@Override
public int hashCode() {
return 7 + getId().hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj.getClass().equals(getClass())))
return false;
ILaunchDescriptorType other = (ILaunchDescriptorType) obj;
if (!getId().equals(other.getId()))
return false;
return true;
}
@Override
public ILaunchTarget getTarget(String id) {
if (id == null)
return null;
ILaunchTarget[] targets = getTargets();
for (int i = 0; i < targets.length; i++) {
ILaunchTarget target = targets[i];
if (target.getId().equals(id))
return target;
}
return null;
}
}

View file

@ -1,4 +1,3 @@
/*******************************************************************************
* Copyright (c) 2014 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
@ -7,32 +6,21 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* QNX Software Systems (Elena Laskavaia) - Initial API and implementation
* Elena Laskavaia - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.launchbar.core;
package org.eclipse.cdt.launchbar.core.internal;
import org.eclipse.cdt.launchbar.core.DefaultLaunchDescriptor;
import org.eclipse.cdt.launchbar.core.ILaunchBarManager;
import org.eclipse.cdt.launchbar.core.ILaunchConfigurationProvider;
import org.eclipse.cdt.launchbar.core.ILaunchDescriptor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationType;
public class TypeBasedLaunchConfigurationProvider implements ILaunchConfigurationProvider {
protected ILaunchBarManager manager;
public class ConfigBasedLaunchConfigurationProvider extends AbstractLaunchConfigurationProvider implements
ILaunchConfigurationProvider {
private String typeId;
public TypeBasedLaunchConfigurationProvider(String launchConfigurationTypeId) {
public ConfigBasedLaunchConfigurationProvider(String launchConfigurationTypeId) {
this.typeId = launchConfigurationTypeId;
}
@Override
public void init(ILaunchBarManager manager) throws CoreException {
this.manager = manager;
}
public boolean ownsConfiguration(ILaunchConfiguration element) {
try {
return element.getType().getIdentifier().equals(typeId);
@ -60,18 +48,7 @@ public class TypeBasedLaunchConfigurationProvider implements ILaunchConfiguratio
}
@Override
public ILaunchConfiguration getLaunchConfiguration(ILaunchDescriptor descriptor) throws CoreException {
if (descriptor instanceof DefaultLaunchDescriptor) {
return ((DefaultLaunchDescriptor) descriptor).getConfig();
}
return null;
}
@Override
public ILaunchConfigurationType getLaunchConfigurationType(ILaunchDescriptor descriptor) throws CoreException {
if (descriptor instanceof DefaultLaunchDescriptor) {
return ((DefaultLaunchDescriptor) descriptor).getConfig().getType();
}
return null;
public String toString() {
return "Provider for " + typeId;
}
}

View file

@ -0,0 +1,42 @@
/*******************************************************************************
* Copyright (c) 2014 QNX Software Systems 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:
* Doug Schaefer
*******************************************************************************/
package org.eclipse.cdt.launchbar.core;
import org.eclipse.debug.core.ILaunchConfiguration;
public class ConfigBasedLaunchDescriptor extends AbstractLaunchDescriptor implements ILaunchDescriptorConfigBased {
private final ILaunchDescriptorType type;
private final ILaunchConfiguration config;
public ConfigBasedLaunchDescriptor(ILaunchDescriptorType type, ILaunchConfiguration config) {
this.type = type;
this.config = config;
}
@Override
public String getName() {
return config.getName();
}
@Override
public ILaunchDescriptorType getType() {
return type;
}
public ILaunchConfiguration getConfig() {
return config;
}
@Override
public String toString() {
return getId();
}
}

View file

@ -6,32 +6,26 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* QNX Software Systems (Elena Laskavaia) - Initial API and implementation
* Elena Laskavaia - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.launchbar.core.internal;
package org.eclipse.cdt.launchbar.core;
import org.eclipse.cdt.launchbar.core.DefaultLaunchDescriptor;
import org.eclipse.cdt.launchbar.core.ILaunchBarManager;
import org.eclipse.cdt.launchbar.core.ILaunchDescriptor;
import org.eclipse.cdt.launchbar.core.ILaunchDescriptorType;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
public class TypeBasedLaunchDescriptorType implements ILaunchDescriptorType {
protected ILaunchBarManager manager;
private String typeId;
public class ConfigBasedLaunchDescriptorType extends AbstarctLaunchDescriptorType implements ILaunchDescriptorType {
private String id;
private String typeId;
public TypeBasedLaunchDescriptorType(String descId, String launchConfigurationTypeId) {
public ConfigBasedLaunchDescriptorType(String descTypeId, String launchConfigurationTypeId) {
if (launchConfigurationTypeId == null)
throw new NullPointerException();
this.typeId = launchConfigurationTypeId;
this.id = descId != null ? descId : typeId + ".desc";
this.id = descTypeId != null ? descTypeId : launchConfigurationTypeId;
}
@Override
public String getId() {
return id;
public ConfigBasedLaunchDescriptorType(String launchConfigurationTypeId) {
this(null, launchConfigurationTypeId);
}
public boolean ownsConfiguration(ILaunchConfiguration element) {
@ -42,19 +36,9 @@ public class TypeBasedLaunchDescriptorType implements ILaunchDescriptorType {
}
}
@Override
public void init(ILaunchBarManager manager) {
this.manager = manager;
}
@Override
public ILaunchDescriptor getDescriptor(Object element) {
return new DefaultLaunchDescriptor(this, (ILaunchConfiguration) element);
}
@Override
public ILaunchBarManager getManager() {
return manager;
return new ConfigBasedLaunchDescriptor(this, (ILaunchConfiguration) element);
}
@Override
@ -62,4 +46,9 @@ public class TypeBasedLaunchDescriptorType implements ILaunchDescriptorType {
return element instanceof ILaunchConfiguration
&& ownsConfiguration((ILaunchConfiguration) element);
}
@Override
public String getId() {
return id;
}
}

View file

@ -12,49 +12,10 @@ package org.eclipse.cdt.launchbar.core;
import org.eclipse.debug.core.ILaunchConfiguration;
public class DefaultLaunchDescriptor implements ILaunchDescriptor {
private final ILaunchDescriptorType type;
private final ILaunchConfiguration config;
public class DefaultLaunchDescriptor extends ConfigBasedLaunchDescriptor {
public DefaultLaunchDescriptor(ILaunchDescriptorType type, ILaunchConfiguration config) {
this.type = type;
this.config = config;
}
@Override
public String getName() {
return config.getName();
}
@Override
public ILaunchDescriptorType getType() {
return type;
}
public ILaunchConfiguration getConfig() {
return config;
}
public String getId() {
return config.getName() + "." + type.getId();
}
@Override
public int hashCode() {
return 17 + getId().hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof DefaultLaunchDescriptor))
return false;
DefaultLaunchDescriptor other = (DefaultLaunchDescriptor) obj;
if (!getId().equals(other.getId()))
return false;
return true;
super(type, config);
}
}

View file

@ -0,0 +1,17 @@
/*******************************************************************************
* Copyright (c) 2014 QNX Software Systems 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:
* Doug Schaefer
*******************************************************************************/
package org.eclipse.cdt.launchbar.core;
import org.eclipse.debug.core.ILaunchConfiguration;
public interface ILaunchDescriptorConfigBased extends ILaunchDescriptor {
public ILaunchConfiguration getConfig();
}

View file

@ -13,8 +13,9 @@ package org.eclipse.cdt.launchbar.core;
import org.eclipse.core.runtime.CoreException;
/**
* Provides the list of launch configurations
*
* Provides mapping between launch objects and launch descriptors.
*
* It is strongly recommended to extend AbstarctLaunchDescriptorType instead of implementing this directly
*/
public interface ILaunchDescriptorType {

View file

@ -63,7 +63,10 @@ public class Activator extends Plugin {
}
public static void log(IStatus status) {
plugin.getLog().log(status);
if (plugin != null)
plugin.getLog().log(status);
else
System.err.println(status.getMessage());
}
public static void log(Exception exception) {

View file

@ -1,45 +1,19 @@
package org.eclipse.cdt.launchbar.core.internal;
import org.eclipse.cdt.launchbar.core.DefaultLaunchDescriptor;
import org.eclipse.cdt.launchbar.core.ILaunchBarManager;
import org.eclipse.cdt.launchbar.core.AbstractLaunchConfigurationProvider;
import org.eclipse.cdt.launchbar.core.ILaunchConfigurationProvider;
import org.eclipse.cdt.launchbar.core.ILaunchDescriptor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationType;
public class DefaultLaunchConfigurationProvider implements ILaunchConfigurationProvider {
@Override
public void init(ILaunchBarManager manager) throws CoreException {
// nothing to do
}
public class DefaultLaunchConfigurationProvider extends AbstractLaunchConfigurationProvider implements ILaunchConfigurationProvider {
@Override
public boolean launchConfigurationAdded(ILaunchConfiguration configuration) throws CoreException {
// We may own it but return false to let it percolate through to the descriptor type.
return false;
}
@Override
public ILaunchConfiguration getLaunchConfiguration(ILaunchDescriptor descriptor) throws CoreException {
if (descriptor instanceof DefaultLaunchDescriptor) {
return ((DefaultLaunchDescriptor) descriptor).getConfig();
}
return null;
}
@Override
public ILaunchConfigurationType getLaunchConfigurationType(ILaunchDescriptor descriptor) throws CoreException {
if (descriptor instanceof DefaultLaunchDescriptor) {
return ((DefaultLaunchDescriptor) descriptor).getConfig().getType();
}
return null;
}
@Override
public boolean launchConfigurationRemoved(ILaunchConfiguration configation) throws CoreException {
return false;
}
}

View file

@ -1,40 +1,25 @@
package org.eclipse.cdt.launchbar.core.internal;
import org.eclipse.cdt.launchbar.core.AbstarctLaunchDescriptorType;
import org.eclipse.cdt.launchbar.core.DefaultLaunchDescriptor;
import org.eclipse.cdt.launchbar.core.ILaunchBarManager;
import org.eclipse.cdt.launchbar.core.ILaunchDescriptor;
import org.eclipse.cdt.launchbar.core.ILaunchDescriptorType;
import org.eclipse.debug.core.ILaunchConfiguration;
public class DefaultLaunchDescriptorType implements ILaunchDescriptorType {
public class DefaultLaunchDescriptorType extends AbstarctLaunchDescriptorType implements ILaunchDescriptorType {
public static final String ID = "org.eclipse.cdt.launchbar.core.descriptor.default";
private ILaunchBarManager manager;
@Override
public String getId() {
return ID;
}
@Override
public void init(ILaunchBarManager manager) {
this.manager = manager;
}
@Override
public boolean ownsLaunchObject(Object element) {
return element instanceof ILaunchConfiguration;
}
@Override
public ILaunchDescriptor getDescriptor(Object element) {
return new DefaultLaunchDescriptor(this, (ILaunchConfiguration) element);
}
@Override
public ILaunchBarManager getManager() {
return manager;
}
}

View file

@ -15,13 +15,18 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.cdt.launchbar.core.ConfigBasedLaunchConfigurationProvider;
import org.eclipse.cdt.launchbar.core.ConfigBasedLaunchDescriptorType;
import org.eclipse.cdt.launchbar.core.ILaunchBarManager;
import org.eclipse.cdt.launchbar.core.ILaunchConfigurationProvider;
import org.eclipse.cdt.launchbar.core.ILaunchDescriptor;
import org.eclipse.cdt.launchbar.core.ILaunchDescriptorConfigBased;
import org.eclipse.cdt.launchbar.core.ILaunchDescriptorType;
import org.eclipse.cdt.launchbar.core.ILaunchObjectProvider;
import org.eclipse.cdt.launchbar.core.ILaunchTarget;
@ -47,7 +52,7 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage
private List<Listener> listeners = new LinkedList<>();
private Map<String, ILaunchTargetType> targetTypes = new HashMap<>();
private List<ILaunchDescriptorType> descriptorTypes = new ArrayList<>();
private LinkedHashMap<ILaunchDescriptorType, Integer> descriptorTypes = new LinkedHashMap<>();
private Map<String, ILaunchDescriptor> descriptors = new HashMap<>();
private List<ILaunchObjectProvider> objectProviders = new ArrayList<>();
// Map descriptor type to target type to provider
@ -66,83 +71,80 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage
private static final String PREF_ACTIVE_LAUNCH_MODE = "activeLaunchMode";
private static final String PREF_ACTIVE_LAUNCH_TARGET = "activeLaunchTarget";
public LaunchBarManager() throws CoreException {
final Map<ILaunchDescriptorType, Integer> typePriorities = new HashMap<>();
IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(Activator.PLUGIN_ID, "launchBarContributions");
public LaunchBarManager() throws CoreException {
IExtensionPoint point = getExtensionPoint();
IExtension[] extensions = point.getExtensions();
// first pass - target, descriptors and object providers
for (IExtension extension : extensions) {
for (IConfigurationElement element : extension.getConfigurationElements()) {
String elementName = element.getName();
if (elementName.equals("descriptorType")) {
String id = element.getAttribute("id");
String priorityStr = element.getAttribute("priority");
ILaunchDescriptorType type = (ILaunchDescriptorType) element.createExecutableExtension("class");
try {
String elementName = element.getName();
if (elementName.equals("descriptorType")) {
String id = element.getAttribute("id");
String priorityStr = element.getAttribute("priority");
ILaunchDescriptorType type = (ILaunchDescriptorType) element.createExecutableExtension("class");
assert id.equals(type.getId());
assert id.equals(type.getId());
descriptorTypes.add(type);
int priority = 1;
if (priorityStr != null) {
try {
priority = Integer.parseInt(priorityStr);
} catch (NumberFormatException e) {
// Log it but keep going with the default
Activator.log(e);
int priority = 1;
if (priorityStr != null) {
try {
priority = Integer.parseInt(priorityStr);
} catch (NumberFormatException e) {
// Log it but keep going with the default
Activator.log(e);
}
}
addDescriptorType(type, priority);
} else if (elementName.equals("targetType")) {
String id = element.getAttribute("id");
ILaunchTargetType targetType = (ILaunchTargetType) element.createExecutableExtension("class");
assert id.equals(targetType.getId());
addTargetType(targetType);
} else if (elementName.equals("objectProvider")) {
ILaunchObjectProvider objectProvider = (ILaunchObjectProvider) element.createExecutableExtension("class");
objectProviders.add(objectProvider);
}
typePriorities.put(type, priority);
} else if (elementName.equals("targetType")) {
String id = element.getAttribute("id");
ILaunchTargetType targetType = (ILaunchTargetType) element.createExecutableExtension("class");
assert id.equals(targetType.getId());
targetTypes.put(id, targetType);
} else if (elementName.equals("objectProvider")) {
ILaunchObjectProvider objectProvider = (ILaunchObjectProvider) element.createExecutableExtension("class");
objectProviders.add(objectProvider);
} else if (elementName.equals("configProvider")) {
String descriptorType = element.getAttribute("descriptorType");
String targetType = element.getAttribute("targetType");
String isDefault = element.getAttribute("isDefault");
// TODO don't instantiate this until we need it
ILaunchConfigurationProvider configProvider = (ILaunchConfigurationProvider) element.createExecutableExtension("class");
addConfigProvider(descriptorType, targetType, Boolean.valueOf(isDefault), configProvider);
} else if (elementName.equals("defaultConfigProvider")) {
String descriptorType = element.getAttribute("descriptorType");
String targetType = element.getAttribute("targetType");
String launchType = element.getAttribute("launchConfigurationType");
String isDefault = element.getAttribute("isDefault");
ILaunchConfigurationProvider configProvider = new TypeBasedLaunchConfigurationProvider(launchType);
addConfigProvider(descriptorType, targetType, Boolean.valueOf(isDefault), configProvider);
ILaunchDescriptorType type = new TypeBasedLaunchDescriptorType(descriptorType, launchType);
descriptorTypes.add(type);
typePriorities.put(type, 2); // TODO: fix priority
} catch (Exception e) {
Activator.log(e); // exceptions during extension loading, log and move on
}
}
}
// second pass config providers that has references to targets and descriptors
for (IExtension extension : extensions) {
for (IConfigurationElement element : extension.getConfigurationElements()) {
try {
String elementName = element.getName();
if (elementName.equals("configProvider")) {
String descriptorType = element.getAttribute("descriptorType");
String targetType = element.getAttribute("targetType");
String isDefault = element.getAttribute("isDefault");
// TODO don't instantiate this until we need it
ILaunchConfigurationProvider configProvider = (ILaunchConfigurationProvider) element
.createExecutableExtension("class");
addConfigProvider(descriptorType, targetType, Boolean.valueOf(isDefault), configProvider);
} else if (elementName.equals("defaultConfigProvider")) {
String descriptorType = element.getAttribute("descriptorType");
String targetType = element.getAttribute("targetType");
String launchType = element.getAttribute("launchConfigurationType");
String isDefault = element.getAttribute("isDefault");
ILaunchConfigurationProvider configProvider = new ConfigBasedLaunchConfigurationProvider(launchType);
addConfigProvider(descriptorType, targetType, Boolean.valueOf(isDefault), configProvider);
ILaunchDescriptorType type = new ConfigBasedLaunchDescriptorType(descriptorType, launchType);
addDescriptorType(type, 2);// TODO: fix priority
}
} catch (Exception e) {
Activator.log(e); // exceptions during extension loading, log and move on
}
}
}
Collections.sort(descriptorTypes, new Comparator<ILaunchDescriptorType>() {
@Override
public int compare(ILaunchDescriptorType o1, ILaunchDescriptorType o2) {
int p1 = typePriorities.get(o1);
int p2 = typePriorities.get(o2);
// Reverse order, highest priority first
if (p1 < p2)
return 1;
else if (p1 > p2)
return -1;
else
return 0;
}
});
// Load up the active from the preferences before loading the descriptors
IEclipsePreferences store = InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID);
IEclipsePreferences store = getPreferenceStore();
String activeConfigDescId = store.get(PREF_ACTIVE_CONFIG_DESC, null);
for (ILaunchDescriptorType descriptorType : descriptorTypes) {
for (ILaunchDescriptorType descriptorType : descriptorTypes.keySet()) {
descriptorType.init(this);
}
@ -154,14 +156,8 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage
objectProvider.init(this);
}
for (Map<String, ILaunchConfigurationProvider> targetMap : configProviders.values()) {
for (ILaunchConfigurationProvider configProvider : targetMap.values()) {
configProvider.init(this);
}
}
// Hook up the existing launch configurations and listen
ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
ILaunchManager launchManager = getLaunchManager();
for (ILaunchConfiguration configuration : launchManager.getLaunchConfigurations()) {
launchConfigurationAdded(configuration);
}
@ -180,17 +176,73 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage
}
}
protected void addConfigProvider(String descriptorType, String targetType, boolean isDefaultB,
protected static void sortMapByValue(LinkedHashMap<ILaunchDescriptorType, Integer> map) {
List<Map.Entry<ILaunchDescriptorType, Integer>> entries =
new ArrayList<Map.Entry<ILaunchDescriptorType, Integer>>(map.entrySet());
Collections.sort(entries, new Comparator<Map.Entry<ILaunchDescriptorType, Integer>>() {
public int compare(Map.Entry<ILaunchDescriptorType, Integer> a, Map.Entry<ILaunchDescriptorType, Integer> b) {
return b.getValue().compareTo(a.getValue()); // reverse order 3 2 1
}
});
LinkedHashMap<ILaunchDescriptorType, Integer> sortedMap = new LinkedHashMap<ILaunchDescriptorType, Integer>();
for (Map.Entry<ILaunchDescriptorType, Integer> entry : entries) {
sortedMap.put(entry.getKey(), entry.getValue());
}
map.clear();
map.putAll(sortedMap);
}
public void addDescriptorType(ILaunchDescriptorType type, int priority) {
descriptorTypes.put(type, priority);
sortMapByValue(descriptorTypes);
}
/**
* Programmatically add target type
*/
public void addTargetType(ILaunchTargetType targetType) {
targetTypes.put(targetType.getId(), targetType);
}
protected ILaunchManager getLaunchManager() {
return DebugPlugin.getDefault().getLaunchManager();
}
protected IExtensionPoint getExtensionPoint() {
return Platform.getExtensionRegistry().getExtensionPoint(Activator.PLUGIN_ID, "launchBarContributions");
}
/**
* Programmatically add launch configuration provider
*/
public void addConfigProvider(String descriptorType, String targetType, boolean isDefaultB,
ILaunchConfigurationProvider configProvider) {
if (targetTypes.get(targetType) == null)
throw new IllegalStateException("Target type " + targetType + " is not registered");
if (!descriptorTypes.containsKey(getDescriptorType(descriptorType)))
throw new IllegalStateException("Descriptor type " + descriptorType + " is not registered");
Map<String, ILaunchConfigurationProvider> targetTypes = configProviders.get(descriptorType);
if (targetTypes == null) {
targetTypes = new HashMap<>();
configProviders.put(descriptorType, targetTypes);
}
targetTypes.put(targetType, configProvider);
if (isDefaultB) {
if (isDefaultB || defaultTargetTypes.get(descriptorType) == null) {
defaultTargetTypes.put(descriptorType, targetType);
}
try {
configProvider.init(this);
} catch (CoreException e) {
Activator.log(e);
}
}
public ILaunchDescriptorType getDescriptorType(String descriptorTypeId) {
for (ILaunchDescriptorType descriptorType : descriptorTypes.keySet()) {
if (descriptorType.getId().equals(descriptorTypeId))
return descriptorType;
}
return null;
}
@Override
@ -199,7 +251,7 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage
if (desc != null)
return desc;
for (ILaunchDescriptorType descriptorType : descriptorTypes) {
for (ILaunchDescriptorType descriptorType : descriptorTypes.keySet()) {
try {
if (descriptorType.ownsLaunchObject(element)) {
desc = descriptorType.getDescriptor(element);
@ -208,8 +260,8 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage
ILaunchDescriptor old = descriptors.get(id);
if (old != null && !desc.equals(old))
Activator.log(new IllegalStateException(
"Name of descriptor must be unique within same type "
+ "(or descriptors with same name must be equal)"));
"Id of descriptor must be unique within same type "
+ "(or descriptors with same id must be equal)"));
descriptors.put(id, desc);
objectDescriptorMap.put(element, desc);
setActiveLaunchDescriptor(desc);
@ -225,6 +277,8 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage
}
private String getId(ILaunchDescriptor desc) {
if (desc == null)
return null;
return desc.getId();
}
@ -262,28 +316,22 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage
@Override
public void setActiveLaunchDescriptor(ILaunchDescriptor configDesc) throws CoreException {
if (activeLaunchDesc != null && activeLaunchDesc == configDesc)
if (activeLaunchDesc == configDesc)
return;
lastLaunchDesc = activeLaunchDesc;
activeLaunchDesc = configDesc;
IEclipsePreferences store = InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID);
if (activeLaunchDesc != null) {
store.put(PREF_ACTIVE_CONFIG_DESC, getId(activeLaunchDesc));
} else {
store.remove(PREF_ACTIVE_CONFIG_DESC);
}
try {
store.flush();
} catch (BackingStoreException e) {
Activator.log(e);
}
IEclipsePreferences store = getPreferenceStore();
setPreference(store, PREF_ACTIVE_CONFIG_DESC, getId(activeLaunchDesc));
// Send notifications
for (Listener listener : listeners) {
listener.activeConfigurationDescriptorChanged();
try {
listener.activeConfigurationDescriptorChanged();
} catch (Exception e) {
Activator.log(e);
}
}
if (activeLaunchDesc == null) {
setActiveLaunchMode(null);
setActiveLaunchTarget(null);
@ -291,36 +339,57 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage
}
// Set active target
String activeTargetId = store.node(activeLaunchDesc.getName()).get(PREF_ACTIVE_LAUNCH_TARGET, null);
String activeTargetId = store.node(activeLaunchDesc.getId()).get(PREF_ACTIVE_LAUNCH_TARGET, null);
String lastTargetId = store.get(PREF_ACTIVE_LAUNCH_TARGET, null);
String targetIds[] = new String[] { activeTargetId, lastTargetId };
ILaunchTarget target = null;
if (activeTargetId != null) {
target = getLaunchTarget(activeTargetId);
}
if (target == null) {
ILaunchTarget[] targets = getLaunchTargets();
if (targets.length > 0) {
target = targets[0];
for (int i = 0; i < targetIds.length; i++) {
String targetId = targetIds[i];
target = getLaunchTarget(targetId);
if (target != null && supportsTargetType(activeLaunchDesc, target.getType())) {
break;
}
}
setActiveLaunchTarget(target);
setActiveLaunchTarget(target); // if target is null this will pick default
// Set active mode
String activeModeName = store.node(activeLaunchDesc.getName()).get(PREF_ACTIVE_LAUNCH_MODE, null);
ILaunchConfigurationType configType = getLaunchConfigurationType(activeLaunchDesc, activeLaunchTarget);
ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
ILaunchMode foundMode = null;
if (activeModeName != null && configType.supportsMode(activeModeName)) {
foundMode = launchManager.getLaunchMode(activeModeName);
}
if (foundMode == null && configType.supportsMode("debug")) {
foundMode = launchManager.getLaunchMode("debug");
}
if (foundMode == null && configType.supportsMode("run")) {
foundMode = launchManager.getLaunchMode("run");
if (configType != null) {
String activeModeName = store.node(activeLaunchDesc.getId()).get(PREF_ACTIVE_LAUNCH_MODE, null); // last desc mode name
String lastModeName = store.get(PREF_ACTIVE_LAUNCH_MODE, null); // last global mode name
Set<String> supportedModes = configType.getSupportedModes();
if (supportedModes.size() > 0) { // mna, what if no modes are supported?
ILaunchManager launchManager = getLaunchManager();
String modeNames[] = new String[] { activeModeName, lastModeName, "debug", "run", supportedModes.iterator().next() };
for (int i = 0; i < modeNames.length && foundMode == null; i++) {
String mode = modeNames[i];
if (mode != null && supportedModes.contains(mode)) {
foundMode = launchManager.getLaunchMode(mode);
}
}
}
}
setActiveLaunchMode(foundMode);
}
protected void setPreference(Preferences store, String prefId, String value) {
if (value != null) {
store.put(prefId, value);
} else {
store.remove(prefId);
}
try {
store.flush();
} catch (BackingStoreException e) {
Activator.log(e);
}
}
protected IEclipsePreferences getPreferenceStore() {
return InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID);
}
@Override
public ILaunchMode[] getLaunchModes() throws CoreException {
ILaunchConfigurationType configType = getLaunchConfigurationType(activeLaunchDesc, activeLaunchTarget);
@ -328,7 +397,7 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage
return new ILaunchMode[0];
List<ILaunchMode> modeList = new ArrayList<>();
ILaunchMode[] modes = DebugPlugin.getDefault().getLaunchManager().getLaunchModes();
ILaunchMode[] modes = getLaunchManager().getLaunchModes();
for (ILaunchMode mode : modes) {
if (configType.supportsMode(mode.getIdentifier())) {
modeList.add(mode);
@ -347,38 +416,47 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage
public void setActiveLaunchMode(ILaunchMode mode) {
if (activeLaunchMode == mode)
return;
try {
ILaunchConfigurationType configType = getLaunchConfigurationType(activeLaunchDesc, activeLaunchTarget);
if (!(activeLaunchDesc == null || mode == null || (configType != null && configType.supportsMode(mode.getIdentifier()))))
throw new IllegalStateException("Mode is not supported by descriptor");
} catch (CoreException e) {
Activator.log(e);
return;
}
// change mode
activeLaunchMode = mode;
for (Listener listener : listeners)
listener.activeLaunchModeChanged();
// notify listeners
for (Listener listener : listeners) {
try {
listener.activeLaunchModeChanged();
} catch (Exception e) {
Activator.log(e);
}
}
// store mode
String modeId = mode == null ? null : mode.getIdentifier();
setPreference(getPreferenceStore(), PREF_ACTIVE_LAUNCH_MODE, modeId); // global store
if (activeLaunchDesc == null)
return;
Preferences store = InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID).node(activeLaunchDesc.getName());
if (mode != null) {
store.put(PREF_ACTIVE_LAUNCH_MODE, mode.getIdentifier());
} else {
store.remove(PREF_ACTIVE_LAUNCH_MODE);
}
try {
store.flush();
} catch (BackingStoreException e) {
// TODO log
e.printStackTrace();
}
setPreference(getPreferenceStore().node(activeLaunchDesc.getId()), PREF_ACTIVE_LAUNCH_MODE, modeId); // per desc store
}
@Override
public ILaunchTarget[] getLaunchTargets() {
if (activeLaunchDesc == null)
return getLaunchTargets(activeLaunchDesc);
}
public ILaunchTarget[] getLaunchTargets(ILaunchDescriptor desc) {
if (desc == null)
return new ILaunchTarget[0];
List<ILaunchTarget> targetList = new ArrayList<>();
Map<String, ILaunchConfigurationProvider> targetMap = configProviders.get(activeLaunchDesc.getType().getId());
Map<String, ILaunchConfigurationProvider> targetMap = configProviders.get(desc.getType().getId());
if (targetMap != null) {
for (String id : targetMap.keySet()) {
ILaunchTargetType type = targetTypes.get(id);
for (String targetTypeId : targetMap.keySet()) {
ILaunchTargetType type = targetTypes.get(targetTypeId);
if (type != null) {
ILaunchTarget[] targets = type.getTargets();
for (ILaunchTarget target : targets) {
@ -397,42 +475,49 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage
@Override
public void setActiveLaunchTarget(ILaunchTarget target) {
if (activeLaunchTarget == target) return;
if (target == null) {
// try and select another target
ILaunchTarget[] targets = getLaunchTargets();
if (targets.length > 0) {
target = targets[0];
target = getDeafultLaunchTarget();
}
if (activeLaunchTarget == target)
return;
activeLaunchTarget = target;
for (Listener listener : listeners) {
try {
listener.activeLaunchTargetChanged();
} catch (Exception e) {
Activator.log(e);
}
}
activeLaunchTarget = target;
for (Listener listener : listeners)
listener.activeLaunchTargetChanged();
if (target == null) {
return; // no point storing null, if stored id is invalid it won't be used anyway
}
target.setActive();
// global store
setPreference(getPreferenceStore(), PREF_ACTIVE_LAUNCH_TARGET, target.getId());
if (activeLaunchDesc == null)
return;
Preferences store = InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID).node(activeLaunchDesc.getName());
if (target != null) {
target.setActive();
store.put(PREF_ACTIVE_LAUNCH_TARGET, target.getId());
} else {
store.remove(PREF_ACTIVE_LAUNCH_TARGET);
}
try {
store.flush();
} catch (BackingStoreException e) {
// TODO log
e.printStackTrace();
}
// per desc store
if (supportsTargetType(activeLaunchDesc, target.getType()))
setPreference(getPreferenceStore().node(activeLaunchDesc.getName()),
PREF_ACTIVE_LAUNCH_TARGET, target.getId());
}
protected ILaunchTarget getDeafultLaunchTarget() {
ILaunchTarget target = null;
ILaunchTarget[] targets = getLaunchTargets();
if (targets.length > 0) {
target = targets[0];
}
return target;
}
@Override
public ILaunchTarget getLaunchTarget(String id) {
public ILaunchTarget getLaunchTarget(String targetId) {
if (targetId == null)
return null;
for (ILaunchTargetType type : targetTypes.values()) {
ILaunchTarget target = type.getTarget(id);
ILaunchTarget target = type.getTarget(targetId);
if (target != null)
return target;
}
@ -455,9 +540,29 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage
}
}
}
if (descriptor instanceof ILaunchDescriptorConfigBased) {
return ((ILaunchDescriptorConfigBased) descriptor).getConfig().getType();
}
return null;
}
public boolean supportsTargetType(ILaunchDescriptor descriptor, ILaunchTargetType targetType) {
if (descriptor == null || targetType == null)
return false;
String descriptorTypeId = descriptor.getType().getId();
Map<String, ILaunchConfigurationProvider> targetMap = configProviders.get(descriptorTypeId);
if (targetMap != null) {
String targetTypeId = targetType.getId();
ILaunchConfigurationProvider configProvider = targetMap.get(targetTypeId);
if (configProvider != null) {
return true;
}
}
return false;
}
@Override
public ILaunchConfiguration getLaunchConfiguration(ILaunchDescriptor descriptor, ILaunchTarget target) throws CoreException {
if (activeLaunchDesc == null || target == null)
@ -487,7 +592,7 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage
public void launchConfigurationAdded(ILaunchConfiguration configuration) {
try {
// TODO filter by launch configuration type to avoid loading plug-ins
for (ILaunchDescriptorType descriptorType : descriptorTypes) {
for (ILaunchDescriptorType descriptorType : descriptorTypes.keySet()) {
Map<String, ILaunchConfigurationProvider> targetMap = configProviders.get(descriptorType.getId());
for (ILaunchConfigurationProvider configProvider : targetMap.values()) {
if (configProvider.launchConfigurationAdded(configuration)) {
@ -507,7 +612,7 @@ public class LaunchBarManager extends PlatformObject implements ILaunchBarManage
public void launchConfigurationRemoved(ILaunchConfiguration configuration) {
try {
// TODO filter by launch configuration type
for (ILaunchDescriptorType descriptorType : descriptorTypes) {
for (ILaunchDescriptorType descriptorType : descriptorTypes.keySet()) {
Map<String, ILaunchConfigurationProvider> targetMap = configProviders.get(descriptorType.getId());
for (ILaunchConfigurationProvider configProvider : targetMap.values()) {
if (configProvider.launchConfigurationRemoved(configuration)) {

View file

@ -211,6 +211,7 @@
<module>launch/org.eclipse.cdt.launchbar.ui</module>
<module>launch/org.eclipse.cdt.launchbar.cdt.core</module>
<module>launch/org.eclipse.cdt.launchbar-feature</module>
<module>launch/org.eclipse.cdt.launchbar.core.tests</module>
<!--
<module>lrparser/org.eclipse.cdt.core.lrparser.tests</module>

View file

@ -11,6 +11,7 @@
<unit id="net.sourceforge.lpg.lpgjavaruntime" version="0.0.0"/>
<unit id="org.junit" version="0.0.0"/>
<unit id="org.junit.source" version="0.0.0"/>
<unit id="org.mockito" version="0.0.0"/>
<repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20140525021250/repository/"/>
</location>
<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">