Bug 255031 - Missing EEs prevent project to build
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/ExecutionEnvironmentAnalyzer.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/ExecutionEnvironmentAnalyzer.java
index 6825f25..6d0827a 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/ExecutionEnvironmentAnalyzer.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/environments/ExecutionEnvironmentAnalyzer.java
@@ -11,6 +11,8 @@
package org.eclipse.jdt.internal.launching.environments;
import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
@@ -25,6 +27,7 @@
import org.eclipse.jdt.launching.environments.CompatibleEnvironment;
import org.eclipse.jdt.launching.environments.IExecutionEnvironment;
import org.eclipse.jdt.launching.environments.IExecutionEnvironmentAnalyzerDelegate;
+import org.eclipse.jdt.launching.environments.IExecutionEnvironmentsManager;
/**
* Environment analyzer for standard execution environments.
*
@@ -41,66 +44,79 @@
private static final String CDC_FOUNDATION_1_1 = "CDC-1.1/Foundation-1.1"; //$NON-NLS-1$
private static final String CDC_FOUNDATION_1_0 = "CDC-1.0/Foundation-1.0"; //$NON-NLS-1$
-
+
+ private static final String OSGI_MINIMUM_1_0 = "OSGi/Minimum-1.0"; //$NON-NLS-1$
+ private static final String OSGI_MINIMUM_1_1 = "OSGi/Minimum-1.1"; //$NON-NLS-1$
+
private static final String JAVA_SPEC_VERSION = "java.specification.version"; //$NON-NLS-1$
private static final String JAVA_SPEC_NAME = "java.specification.name"; //$NON-NLS-1$
private static final String JAVA_VERSION = "java.version"; //$NON-NLS-1$
private static final String[] VM_PROPERTIES = {JAVA_SPEC_NAME, JAVA_SPEC_VERSION, JAVA_VERSION};
private static final String FOUNDATION = "foundation"; //$NON-NLS-1$
+ private static final Map mappings = new HashMap();
+ static {
+ // table where the key is the EE and the value is an array of EEs that it is a super-set of
+ mappings.put(CDC_FOUNDATION_1_0, new String[] {OSGI_MINIMUM_1_0});
+ mappings.put(CDC_FOUNDATION_1_1, new String[] {CDC_FOUNDATION_1_0, OSGI_MINIMUM_1_1});
+ mappings.put(OSGI_MINIMUM_1_1, new String[] {OSGI_MINIMUM_1_0});
+ mappings.put(J2SE_1_2, new String[] {JRE_1_1});
+ mappings.put(J2SE_1_3, new String[] {J2SE_1_2, CDC_FOUNDATION_1_0, OSGI_MINIMUM_1_0});
+ mappings.put(J2SE_1_4, new String[] {J2SE_1_3, CDC_FOUNDATION_1_1, OSGI_MINIMUM_1_1});
+ mappings.put(J2SE_1_5, new String[] {J2SE_1_4});
+ mappings.put(JavaSE_1_6, new String[] {J2SE_1_5});
+ }
public CompatibleEnvironment[] analyze(IVMInstall vm, IProgressMonitor monitor) throws CoreException {
ArrayList result = new ArrayList();
if (!(vm instanceof IVMInstall2))
return new CompatibleEnvironment[0];
IVMInstall2 vm2 = (IVMInstall2) vm;
- String eeId = null;
+ List types = null;
if (EEVMType.ID_EE_VM_TYPE.equals(vm.getVMInstallType().getId())) {
- eeId = ((EEVMInstall)vm).getAttribute(EEVMInstall.ATTR_EXECUTION_ENVIRONMENT_ID);
+ String eeId = ((EEVMInstall)vm).getAttribute(EEVMInstall.ATTR_EXECUTION_ENVIRONMENT_ID);
+ if (eeId != null) {
+ types = getTypes(eeId);
+ }
}
boolean strictMatch = true;
- if (eeId == null) {
+ if (types == null) {
String javaVersion = vm2.getJavaVersion();
if (javaVersion == null) {
// We have a contributed VM type. Check to see if its a foundation VM, if we can.
if ((vm instanceof IVMInstall3) && isFoundation1_0((IVMInstall3) vm))
- eeId = CDC_FOUNDATION_1_0;
+ types = getTypes(CDC_FOUNDATION_1_0);
else if ((vm instanceof IVMInstall3) && isFoundation1_1((IVMInstall3) vm))
- eeId = CDC_FOUNDATION_1_1;
+ types = getTypes(CDC_FOUNDATION_1_1);
} else {
if (javaVersion.startsWith("1.7")) { //$NON-NLS-1$
- eeId = JavaSE_1_6; // there is no 1.7 EE defined yet
+ types = getTypes(JavaSE_1_6); // there is no 1.7 EE defined yet
strictMatch = false; // 1.7 is not a strict match for 1.6
} else if (javaVersion.startsWith("1.6")) //$NON-NLS-1$
- eeId = JavaSE_1_6;
+ types = getTypes(JavaSE_1_6);
else if (javaVersion.startsWith("1.5")) //$NON-NLS-1$
- eeId = J2SE_1_5;
+ types = getTypes(J2SE_1_5);
else if (javaVersion.startsWith("1.4")) //$NON-NLS-1$
- eeId = J2SE_1_4;
+ types = getTypes(J2SE_1_4);
else if (javaVersion.startsWith("1.3")) //$NON-NLS-1$
- eeId = J2SE_1_3;
+ types = getTypes(J2SE_1_3);
else if (javaVersion.startsWith("1.2")) //$NON-NLS-1$
- eeId = J2SE_1_2;
+ types = getTypes(J2SE_1_2);
else if (javaVersion.startsWith("1.1")) { //$NON-NLS-1$
if ((vm instanceof IVMInstall3) && isFoundation1_1((IVMInstall3) vm))
- eeId = CDC_FOUNDATION_1_1;
+ types = getTypes(CDC_FOUNDATION_1_1);
else
- eeId = JRE_1_1;
+ types = getTypes(JRE_1_1);
} else if (javaVersion.startsWith("1.0")) { //$NON-NLS-1$
if ((vm instanceof IVMInstall3) && isFoundation1_0((IVMInstall3) vm))
- eeId = CDC_FOUNDATION_1_0;
+ types = getTypes(CDC_FOUNDATION_1_0);
}
}
}
- if (eeId != null) {
- IExecutionEnvironment env = JavaRuntime.getExecutionEnvironmentsManager().getEnvironment(eeId);
- if (env != null) {
- IExecutionEnvironment[] subEnvironments = env.getSubEnvironments();
- for (int i=0; i < subEnvironments.length; i++)
- addEnvironment(result, subEnvironments[i], false);
- addEnvironment(result, env, strictMatch);
- }
+ if (types != null) {
+ for (int i=0; i < types.size(); i++)
+ addEnvironment(result, (String) types.get(i), strictMatch && i ==0);
}
return (CompatibleEnvironment[])result.toArray(new CompatibleEnvironment[result.size()]);
}
@@ -130,8 +146,23 @@
return isFoundation(map) ? "1.1".equals(map.get(JAVA_SPEC_VERSION)) : false; //$NON-NLS-1$
}
- private void addEnvironment(ArrayList result, IExecutionEnvironment env, boolean strict) {
- result.add(new CompatibleEnvironment(env, strict));
+ private void addEnvironment(ArrayList result, String id, boolean strict) {
+ IExecutionEnvironmentsManager manager = JavaRuntime.getExecutionEnvironmentsManager();
+ IExecutionEnvironment env = manager.getEnvironment(id);
+ if (env != null)
+ result.add(new CompatibleEnvironment(env, strict));
+ }
+
+ // first entry in the list is the perfect match
+ private List getTypes(String type) {
+ List result = new ArrayList();
+ result.add(type);
+ String[] values = (String[]) mappings.get(type);
+ if (values != null) {
+ for (int i=0; i<values.length; i++)
+ result.addAll(getTypes(values[i]));
+ }
+ return result;
}
}