Bug 568836 - parse bundles from config.ini relative to home

If config.ini contains relative paths, make them absolute relative to
the home location instead of reading bundles relative to the running
eclipse's working directory.

Change-Id: I4b50e0919abba91ee3b6632a48cbe4657322c896
Signed-off-by: Julian Honnen <julian.honnen@vector.com>
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/ProfileBundleContainer.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/ProfileBundleContainer.java
index 2e3bc0c..901b8f8 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/ProfileBundleContainer.java
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/ProfileBundleContainer.java
@@ -128,7 +128,7 @@
 		BundleInfo[] infos = P2Utils.readBundles(home, configurationArea);
 		if (infos == null) {
 			if (configurationArea != null) {
-				Collection<TargetBundle> osgiBundles = readBundleInfosFromConfigIni(configurationArea);
+				Collection<TargetBundle> osgiBundles = readBundleInfosFromConfigIni(configurationArea, new File(home));
 				if (!osgiBundles.isEmpty()) {
 					return osgiBundles.toArray(new TargetBundle[0]);
 				}
@@ -167,7 +167,7 @@
 		}).filter(Objects::nonNull).toArray(TargetBundle[]::new);
 	}
 
-	private Collection<TargetBundle> readBundleInfosFromConfigIni(File configArea) {
+	private Collection<TargetBundle> readBundleInfosFromConfigIni(File configArea, File home) {
 		File configIni = new File(configArea, CONFIG_INI);
 		if (!configIni.isFile()) {
 			return emptyList();
@@ -180,7 +180,7 @@
 			return emptyList();
 		}
 
-		List<File> bundleFiles = parseBundlesFromConfigIni(configProps);
+		List<File> bundleFiles = parseBundlesFromConfigIni(configProps, home);
 		ArrayList<TargetBundle> bundles = new ArrayList<>();
 		for (File file : bundleFiles) {
 			if (!file.exists()) {
@@ -197,7 +197,7 @@
 		return bundles;
 	}
 
-	public static List<File> parseBundlesFromConfigIni(Properties configProps) {
+	public static List<File> parseBundlesFromConfigIni(Properties configProps, File home) {
 		String osgiBundles = configProps.getProperty("osgi.bundles"); //$NON-NLS-1$
 		if (osgiBundles == null || osgiBundles.isEmpty()) {
 			return emptyList();
@@ -209,6 +209,9 @@
 		String osgiFramework = configProps.getProperty("osgi.framework"); //$NON-NLS-1$
 		if (osgiFramework != null) {
 			File frameworkBundle = parseBundleLocation(osgiFramework);
+			if (!frameworkBundle.isAbsolute()) {
+				frameworkBundle = new File(home, frameworkBundle.getPath());
+			}
 			bundles.add(frameworkBundle);
 			baseDir = frameworkBundle.getParentFile();
 		}
diff --git a/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/target/ProfileContainerTests.java b/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/target/ProfileContainerTests.java
index fb1c79a..755df20 100644
--- a/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/target/ProfileContainerTests.java
+++ b/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/target/ProfileContainerTests.java
@@ -41,7 +41,7 @@
 		configIni.put("osgi.bundles", absoluteFile("plugins/some.bundle").toURI() + ","//
 				+ "reference:" + absoluteFile("plugins/some.bundle_startlevel").toURI() + "@1:start");
 
-		Collection<File> parsedBundles = ProfileBundleContainer.parseBundlesFromConfigIni(configIni);
+		Collection<File> parsedBundles = ProfileBundleContainer.parseBundlesFromConfigIni(configIni, new File("."));
 		assertEquals(Arrays.asList( //
 				absoluteFile("plugins/some.bundle"), //
 				absoluteFile("plugins/some.bundle_startlevel")), //
@@ -55,7 +55,7 @@
 				+ "reference:file:plugins/some.bundle_startlevel@1:start," //
 				+ "reference:" + absoluteFile("absolute.bundle").toURI());
 
-		Collection<File> parsedBundles = ProfileBundleContainer.parseBundlesFromConfigIni(configIni);
+		Collection<File> parsedBundles = ProfileBundleContainer.parseBundlesFromConfigIni(configIni, new File("."));
 		assertEquals(Arrays.asList( //
 				new File("plugins/some.bundle"), //
 				new File("plugins/some.bundle_startlevel"), //
@@ -71,15 +71,30 @@
 				+ "reference:" + absoluteFile("absolute.bundle").toURI());
 		configIni.put("osgi.framework", "file:plugins/o.e.osgi.jar");
 
-		Collection<File> parsedBundles = ProfileBundleContainer.parseBundlesFromConfigIni(configIni);
+		Collection<File> parsedBundles = ProfileBundleContainer.parseBundlesFromConfigIni(configIni, new File("/home"));
 		assertEquals(Arrays.asList( //
-				new File("plugins/o.e.osgi.jar"), //
-				new File("plugins/some.bundle"), //
-				new File("plugins/some.bundle_startlevel"), //
+				new File("/home/plugins/o.e.osgi.jar"), //
+				new File("/home/plugins/some.bundle"), //
+				new File("/home/plugins/some.bundle_startlevel"), //
 				absoluteFile("absolute.bundle")), //
 				parsedBundles);
 	}
 
+	@Test
+	public void testParseBundleInfoFromConfigIni_relativeToAbsoluteFramework() {
+		Properties configIni = new Properties();
+		configIni.put("osgi.bundles", "reference:file:some.bundle," //
+				+ "reference:file:some.bundle_startlevel@1:start");
+		configIni.put("osgi.framework", absoluteFile("plugins/o.e.osgi.jar").toURI().toString());
+
+		Collection<File> parsedBundles = ProfileBundleContainer.parseBundlesFromConfigIni(configIni, new File("/home"));
+		assertEquals(Arrays.asList( //
+				absoluteFile("plugins/o.e.osgi.jar"), //
+				absoluteFile("plugins/some.bundle"), //
+				absoluteFile("plugins/some.bundle_startlevel")), //
+				parsedBundles);
+	}
+
 	private static File absoluteFile(String path) {
 		return new File(path).getAbsoluteFile();
 	}