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;
 	}
 
 }