[eclipse] Support loading symlinked bundles when location changes.

Roland Grunberg rgrunber at fedoraproject.org
Mon Oct 20 18:55:21 UTC 2014


commit 03cbc7dfd00e8a9afe1df75d7add81e96aa2b1f8
Author: Roland Grunberg <rgrunber at redhat.com>
Date:   Mon Sep 15 12:05:38 2014 -0400

    Support loading symlinked bundles when location changes.

 eclipse-support-symlink-bundles.patch |  159 +++++++++++++++++++++++++++++++++
 eclipse.spec                          |    8 ++-
 2 files changed, 166 insertions(+), 1 deletions(-)
---
diff --git a/eclipse-support-symlink-bundles.patch b/eclipse-support-symlink-bundles.patch
new file mode 100644
index 0000000..e0b75f6
--- /dev/null
+++ b/eclipse-support-symlink-bundles.patch
@@ -0,0 +1,159 @@
+From ca186bc5d8c8f0ecde78aab255c02eed414e3cb1 Mon Sep 17 00:00:00 2001
+From: Roland Grunberg <rgrunber at redhat.com>
+Date: Fri, 12 Sep 2014 10:27:14 -0400
+Subject: [PATCH] Add support for regenerating bundle versions for symlinks.
+
+When the version field in a bundle info file corresponds to a bundle
+whose location is a symbolic link, the correct version should be
+regenerated every time, in case a change has occured.
+
+Change-Id: Ifbe8efed2218a8a1250fd1ac59f0cdd6bdd5f309
+---
+ .../META-INF/MANIFEST.MF                           |   1 +
+ .../utils/SimpleConfiguratorUtils.java             | 104 ++++++++++++++++++++-
+ 2 files changed, 104 insertions(+), 1 deletion(-)
+
+diff --git rt.equinox.p2/bundles/org.eclipse.equinox.simpleconfigurator/META-INF/MANIFEST.MF rt.equinox.p2/bundles/org.eclipse.equinox.simpleconfigurator/META-INF/MANIFEST.MF
+index 7f339b5..38b881c 100644
+--- rt.equinox.p2/bundles/org.eclipse.equinox.simpleconfigurator/META-INF/MANIFEST.MF
++++ rt.equinox.p2/bundles/org.eclipse.equinox.simpleconfigurator/META-INF/MANIFEST.MF
+@@ -9,6 +9,7 @@ Bundle-Activator: org.eclipse.equinox.internal.simpleconfigurator.Activator
+ Bundle-ActivationPolicy: lazy
+ Import-Package: org.eclipse.osgi.framework.console;version="1.0.0";resolution:=optional,
+  org.eclipse.osgi.service.datalocation;version="1.0.0";resolution:=optional,
++ org.eclipse.osgi.util;version="1.1.0",
+  org.osgi.framework;version="1.3.0",
+  org.osgi.framework.namespace;version="1.0.0",
+  org.osgi.framework.wiring;version="1.2.0",
+diff --git rt.equinox.p2/bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/utils/SimpleConfiguratorUtils.java rt.equinox.p2/bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/utils/SimpleConfiguratorUtils.java
+index ab69b88..bde62e0 100644
+--- rt.equinox.p2/bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/utils/SimpleConfiguratorUtils.java
++++ rt.equinox.p2/bundles/org.eclipse.equinox.simpleconfigurator/src/org/eclipse/equinox/internal/simpleconfigurator/utils/SimpleConfiguratorUtils.java
+@@ -13,9 +13,15 @@ package org.eclipse.equinox.internal.simpleconfigurator.utils;
+ 
+ import java.io.*;
+ import java.net.*;
++import java.nio.file.Files;
++import java.nio.file.Paths;
+ import java.util.*;
++import java.util.jar.JarFile;
++import java.util.zip.ZipEntry;
++import java.util.zip.ZipFile;
+ import org.eclipse.equinox.internal.simpleconfigurator.Activator;
+-import org.osgi.framework.Version;
++import org.eclipse.osgi.util.ManifestElement;
++import org.osgi.framework.*;
+ 
+ public class SimpleConfiguratorUtils {
+ 
+@@ -283,6 +289,13 @@ public class SimpleConfiguratorUtils {
+ 		String symbolicName = tok.nextToken().trim();
+ 		String version = tok.nextToken().trim();
+ 		URI location = parseLocation(tok.nextToken().trim());
++		URI absLoc = URIUtil.append(base, location.toString());
++		// Symbolic links may change outside Eclipse so regenerate proper bundle version.
++		if (Files.isSymbolicLink(Paths.get(absLoc))) {
++			// We can't depend on org.eclipse.equinox.internal.frameworkadmin.utils.Utils
++			Dictionary<String, String> manifest = getOSGiManifest(absLoc);
++			version = manifest.get(Constants.BUNDLE_VERSION);
++		}
+ 		int startLevel = Integer.parseInt(tok.nextToken().trim());
+ 		boolean markedAsStarted = Boolean.valueOf(tok.nextToken()).booleanValue();
+ 		BundleInfo result = new BundleInfo(symbolicName, version, location, startLevel, markedAsStarted);
+@@ -421,4 +434,93 @@ public class SimpleConfiguratorUtils {
+ 		}
+ 		return regularTimestamp;
+ 	}
++
++	private static Dictionary<String, String> getOSGiManifest(URI location) {
++		if (location == null)
++			return null;
++		// if we have a file-based URL that doesn't end in ".jar" then...
++		if (FILE_SCHEME.equals(location.getScheme()))
++			return basicLoadManifest(URIUtil.toFile(location));
++
++		try {
++			URL url = new URL("jar:" + location.toString() + "!/"); //$NON-NLS-1$//$NON-NLS-2$
++			JarURLConnection jarConnection = (JarURLConnection) url.openConnection();
++			ZipFile jar = jarConnection.getJarFile();
++
++			try {
++				ZipEntry entry = jar.getEntry(JarFile.MANIFEST_NAME);
++				if (entry == null)
++					return null;
++
++				Map<String, String> manifest = ManifestElement.parseBundleManifest(jar.getInputStream(entry), null);
++				return manifestToProperties(manifest);
++			} catch (BundleException e) {
++				return null;
++			} finally {
++				jar.close();
++			}
++		} catch (IOException e) {
++			if (System.getProperty("osgi.debug") != null) { //$NON-NLS-1$
++				System.err.println("location=" + location); //$NON-NLS-1$
++				e.printStackTrace();
++			}
++		}
++		return null;
++	}
++
++	private static Dictionary<String, String> basicLoadManifest(File bundleLocation) {
++		InputStream manifestStream = null;
++		ZipFile jarFile = null;
++		try {
++			try {
++				// Handle a JAR'd bundle
++				if (bundleLocation.isFile()) {
++					jarFile = new ZipFile(bundleLocation, ZipFile.OPEN_READ);
++					ZipEntry manifestEntry = jarFile.getEntry(JarFile.MANIFEST_NAME);
++					if (manifestEntry != null) {
++						manifestStream = jarFile.getInputStream(manifestEntry);
++					}
++				} else {
++					// we have a directory-based bundle
++					File bundleManifestFile = new File(bundleLocation, JarFile.MANIFEST_NAME);
++					if (bundleManifestFile.exists())
++						manifestStream = new BufferedInputStream(new FileInputStream(new File(bundleLocation, JarFile.MANIFEST_NAME)));
++				}
++			} catch (IOException e) {
++				//ignore
++			}
++
++			try {
++				Map<String, String> manifest = ManifestElement.parseBundleManifest(manifestStream, null);
++				return manifestToProperties(manifest);
++			} catch (IOException ioe) {
++				return null;
++			} catch (BundleException e) {
++				return null;
++			}
++		} finally {
++			try {
++				if (manifestStream != null)
++					manifestStream.close();
++			} catch (IOException e1) {
++				//Ignore
++			}
++			try {
++				if (jarFile != null)
++					jarFile.close();
++			} catch (IOException e2) {
++				//Ignore
++			}
++		}
++	}
++
++	private static Dictionary<String, String> manifestToProperties(Map<String, String> d) {
++		Iterator<String> iter = d.keySet().iterator();
++		Dictionary<String, String> result = new Hashtable<String, String>();
++		while (iter.hasNext()) {
++			String key = iter.next();
++			result.put(key, d.get(key));
++		}
++		return result;
++	}
+ }
+-- 
+1.9.3
+
diff --git a/eclipse.spec b/eclipse.spec
index 1785590..ae2f7fb 100644
--- a/eclipse.spec
+++ b/eclipse.spec
@@ -38,7 +38,7 @@ Epoch:                  1
 Summary:        An open, extensible IDE
 Name:           %{?scl_prefix}eclipse
 Version:        %{eclipse_version}
-Release:        3%{?dist}
+Release:        4%{?dist}
 License:        EPL
 Group:          Development/Tools
 URL:            http://www.eclipse.org/
@@ -114,6 +114,8 @@ Patch22:        %{pkg_name}-policy-comparators.patch
 Patch23:        %{pkg_name}-webkit2-support.patch
 Patch24:        %{pkg_name}-bug-444143.patch
 
+Patch25:        %{pkg_name}-support-symlink-bundles.patch
+
 BuildRequires: rsync
 BuildRequires: make, gcc
 BuildRequires: gtk2-devel
@@ -326,6 +328,7 @@ tar --strip-components=1 -xf %{SOURCE1}
 %patch22
 %patch23
 %patch24 -p1
+%patch25
 
 #Disable as many things as possible to make the build faster. We care only for Eclipse.
 %pom_disable_module platform.sdk eclipse.platform.releng.tychoeclipsebuilder
@@ -1017,6 +1020,9 @@ fi
 %{_libdir}/%{pkg_name}/plugins/org.eclipse.osgi.compatibility.state_*
 
 %changelog
+* Mon Oct 20 2014 Roland Grunberg <rgrunber at redhat.com> - 1:4.4.1-4
+- Support loading symlinked bundles when location changes.
+
 * Wed Oct 01 2014 Mat Booth <mat.booth at redhat.com> - 1:4.4.1-3
 - Require latest EMF
 


More information about the scm-commits mailing list