From 7843458db4b359cbee040c17ddda21d5fa6ddd35 Mon Sep 17 00:00:00 2001 From: Roland Grunberg Date: Thu, 7 Apr 2016 10:23:49 -0400 Subject: [PATCH] Support reading BundleInfo from p2 Droplets enabled installations. - Additionally support reading source bundles from p2 Droplets location --- .../org.eclipse.pde.core/META-INF/MANIFEST.MF | 1 + .../eclipse/pde/internal/core/P2Utils.java | 50 +++++++++++++++++-- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/eclipse.pde.ui/ui/org.eclipse.pde.core/META-INF/MANIFEST.MF b/eclipse.pde.ui/ui/org.eclipse.pde.core/META-INF/MANIFEST.MF index f045abd5b..864665785 100644 --- a/eclipse.pde.ui/ui/org.eclipse.pde.core/META-INF/MANIFEST.MF +++ b/eclipse.pde.ui/ui/org.eclipse.pde.core/META-INF/MANIFEST.MF @@ -102,5 +102,6 @@ Require-Bundle: org.eclipse.core.filesystem;bundle-version="[1.0.0,2.0.0)" Eclipse-LazyStart: true Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Import-Package: org.eclipse.equinox.internal.simpleconfigurator.utils Bundle-ActivationPolicy: lazy Automatic-Module-Name: org.eclipse.pde.core diff --git a/eclipse.pde.ui/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/P2Utils.java b/eclipse.pde.ui/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/P2Utils.java index 696d2318f..7ab4596d5 100644 --- a/eclipse.pde.ui/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/P2Utils.java +++ b/eclipse.pde.ui/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/P2Utils.java @@ -17,8 +17,9 @@ package org.eclipse.pde.internal.core; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; +import java.net.*; +import java.nio.file.Paths; +import java.util.Arrays; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -31,7 +32,9 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.URIUtil; import org.eclipse.equinox.frameworkadmin.BundleInfo; +import org.eclipse.equinox.internal.simpleconfigurator.utils.SimpleConfiguratorUtils; import org.eclipse.equinox.p2.core.IProvisioningAgent; import org.eclipse.equinox.p2.core.IProvisioningAgentProvider; import org.eclipse.equinox.p2.engine.IEngine; @@ -60,6 +63,7 @@ import org.eclipse.pde.core.plugin.IPluginModelBase; import org.eclipse.pde.core.plugin.TargetPlatform; import org.eclipse.pde.internal.build.BundleHelper; import org.eclipse.pde.internal.core.plugin.PluginBase; +import org.eclipse.pde.internal.core.util.ManifestUtils; import org.osgi.framework.Constants; /** @@ -139,7 +143,16 @@ public class P2Utils { try { URL bundlesTxt = new URL(configurationArea.getProtocol(), configurationArea.getHost(), new File(configurationArea.getFile(), SimpleConfiguratorManipulator.BUNDLES_INFO_PATH).getAbsolutePath()); File home = basePath.toFile(); - BundleInfo bundles[] = getBundlesFromFile(bundlesTxt, home); + List ibundleList = SimpleConfiguratorUtils.readConfiguration(bundlesTxt, home.toURI()); + List bundleList = new ArrayList<>(); + for (org.eclipse.equinox.internal.simpleconfigurator.utils.BundleInfo b : ibundleList) { + URI location = b.getLocation(); + if (!location.isAbsolute() && b.getBaseLocation() != null) + location = URIUtil.makeAbsolute(location, b.getBaseLocation()); + BundleInfo binfo = new BundleInfo(b.getSymbolicName(), b.getVersion(), location, b.getStartLevel(), b.isMarkedAsStarted()); + bundleList.add(binfo); + } + BundleInfo[] bundles = bundleList.toArray(new BundleInfo[0]); if (bundles == null || bundles.length == 0) { return null; } @@ -168,11 +181,38 @@ public class P2Utils { try { File home = basePath.toFile(); URL srcBundlesTxt = new URL(configurationArea.getProtocol(), configurationArea.getHost(), configurationArea.getFile().concat(SimpleConfiguratorManipulator.SOURCE_INFO_PATH)); + final List allSrcBundles = new ArrayList<>(); + try { + for (File infoFile : SimpleConfiguratorUtils.getInfoFiles()) { + File pluginsDir = Paths.get(infoFile.getParent(), "plugins").toFile(); //$NON-NLS-1$ + File[] sourceJars = pluginsDir.listFiles((dir, name) -> { + return name.matches(".*\\.source_.*\\.jar$"); //$NON-NLS-1$ + }); + for (File sourceJar : sourceJars) { + Map manifest; + try { + manifest = ManifestUtils.loadManifest(sourceJar); + final String bsn = manifest.get(Constants.BUNDLE_SYMBOLICNAME); + final String version = manifest.get(Constants.BUNDLE_VERSION); + BundleInfo info = new BundleInfo(bsn, version, sourceJar.toURI(), -1, false); + allSrcBundles.add(info); + } catch (CoreException e) { + // continue + } + } + } + } catch (URISyntaxException e) { + // continue + } + BundleInfo srcBundles[] = getBundlesFromFile(srcBundlesTxt, home); - if (srcBundles == null || srcBundles.length == 0) { + if (srcBundles != null && srcBundles.length > 0) { + allSrcBundles.addAll(Arrays.asList(srcBundles)); + } + if (allSrcBundles.size() == 0) { return null; } - return srcBundles; + return allSrcBundles.toArray(new BundleInfo[0]); } catch (IOException e) { PDECore.log(e); return null; -- 2.21.1