Bug 518740 - The Equinox Framework does not start on ARM using Oracle
Embedded JRE

Change-Id: I4f202f733e177fffe175dec58757f84aa36260d8
Signed-off-by: Thomas Watson <tjwatson@us.ibm.com>
diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/SystemBundleTests.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/SystemBundleTests.java
index a28dbb2..5129c9f 100755
--- a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/SystemBundleTests.java
+++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/SystemBundleTests.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008, 2016 IBM Corporation and others.
+ * Copyright (c) 2008, 2017 IBM Corporation 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
@@ -2677,22 +2677,45 @@
 		assertNotNull("No system bundle class loader.", cl);
 	}
 
-	public void testJavaProfile() {
-		String original = System.getProperty("java.specification.version");
+	public void testJavaProfile() throws IOException {
+		String originalSpecVersion = System.getProperty("java.specification.version");
+		String originalJavaHome = System.getProperty("java.home");
 		try {
-			doTestJavaProfile("9.3.1", "JavaSE-9");
-			doTestJavaProfile("9", "JavaSE-9");
-			doTestJavaProfile("8.4", "JavaSE-1.8");
-			doTestJavaProfile("1.10.1", "JavaSE-1.8");
-			doTestJavaProfile("1.9", "JavaSE-1.8");
-			doTestJavaProfile("1.8", "JavaSE-1.8");
-			doTestJavaProfile("1.7", "JavaSE-1.7");
+			doTestJavaProfile("9.3.1", "JavaSE-9", null);
+			doTestJavaProfile("9", "JavaSE-9", null);
+			doTestJavaProfile("8.4", "JavaSE-1.8", null);
+			doTestJavaProfile("1.10.1", "JavaSE-1.8", null);
+			doTestJavaProfile("1.9", "JavaSE-1.8", null);
+			doTestJavaProfile("1.8", "JavaSE-1.8", null);
+			doTestJavaProfile("1.7", "JavaSE-1.7", null);
+			doTestJavaProfile("1.8", "JavaSE/compact3-1.8", "compact3");
+			doTestJavaProfile("1.8", "JavaSE/compact3-1.8", "\"compact3\"");
+			doTestJavaProfile("1.8", "JavaSE/compact3-1.8", " \"compact3\" ");
+			doTestJavaProfile("1.8", "JavaSE/compact3-1.8", " compact3 ");
+			doTestJavaProfile("1.8", "JavaSE-1.8", "\"compact4\"");
+			doTestJavaProfile("9", "JavaSE/compact3-1.8", "compact3");
+			doTestJavaProfile("9", "JavaSE/compact3-1.8", "\"compact3\"");
+			doTestJavaProfile("9", "JavaSE-9", "\"compact4\"");
 		} finally {
-			System.setProperty("java.specification.version", original);
+			System.setProperty("java.specification.version", originalSpecVersion);
+			System.setProperty("java.home", originalJavaHome);
 		}
 	}
 
-	private void doTestJavaProfile(String javaSpecVersion, String expectedEEName) {
+	private void doTestJavaProfile(String javaSpecVersion, String expectedEEName, String releaseName) throws FileNotFoundException, IOException {
+		if (releaseName != null) {
+			File release = getContext().getDataFile("jre/release");
+			release.getParentFile().mkdirs();
+			Properties props = new Properties();
+			props.put("JAVA_PROFILE", releaseName);
+			FileOutputStream propStream = new FileOutputStream(release);
+			try {
+				props.store(propStream, null);
+			} finally {
+				propStream.close();
+			}
+			System.setProperty("java.home", release.getParentFile().getAbsolutePath());
+		}
 		System.setProperty("java.specification.version", javaSpecVersion);
 		// create/stop/ test
 		File config = OSGiTestsActivator.getContext().getDataFile(getName() + javaSpecVersion);
@@ -2719,7 +2742,7 @@
 		}
 		assertEquals("Wrong state for SystemBundle", Bundle.RESOLVED, equinox.getState()); //$NON-NLS-1$
 
-		assertTrue("Wrong osgi EE: " + osgiEE, osgiEE.endsWith(expectedEEName));
+		assertTrue("Wrong osgi EE: expected: " + expectedEEName + " but was: " + osgiEE, osgiEE.endsWith(expectedEEName));
 	}
 
 	private static File[] createBundles(File outputDir, int bundleCount) throws IOException {
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/Storage.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/Storage.java
index 702c800..d891eff 100644
--- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/Storage.java
+++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/Storage.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2012, 2016 IBM Corporation and others.
+ * Copyright (c) 2012, 2017 IBM Corporation 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
@@ -1432,10 +1432,13 @@
 							File release = new File(javaHome, "release"); //$NON-NLS-1$
 							if (release.exists()) {
 								Properties releaseProps = new Properties();
-								try {
-									releaseProps.load(new FileInputStream(release));
-									if (releaseProps.containsKey("JAVA_PROFILE")) { //$NON-NLS-1$
-										embeddedProfileName = "_" + releaseProps.getProperty("JAVA_PROFILE") + "-"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+								try (InputStream releaseStream = new FileInputStream(release)) {
+									releaseProps.load(releaseStream);
+									String releaseName = releaseProps.getProperty("JAVA_PROFILE"); //$NON-NLS-1$
+									if (releaseName != null) {
+										// make sure to remove extra quotes
+										releaseName = releaseName.replaceAll("^\\s*\"?|\"?\\s*$", ""); //$NON-NLS-1$ //$NON-NLS-2$
+										embeddedProfileName = "_" + releaseName + "-"; //$NON-NLS-1$ //$NON-NLS-2$
 									}
 								} catch (IOException e) {
 									// ignore
@@ -1520,6 +1523,9 @@
 			} else if (major <= 9 && major > 1) {
 				minor = 8;
 				major = 1;
+			} else {
+				// we have reached the end of our search; return the existing result;
+				return result;
 			}
 		} while (result == null && minor >= 0);
 		return result;