diff options
author | gjoranv <gv@oath.com> | 2018-09-24 13:56:31 +0200 |
---|---|---|
committer | gjoranv <gv@oath.com> | 2018-09-27 15:48:29 +0200 |
commit | 5f897da5e8a18f4d1f3d260fd943af37426c9db0 (patch) | |
tree | d14a0d83c4f51c6c46cbc793621618ca44eb4301 /jdisc_core/src | |
parent | 3983f26df5038419d769df3b82181c8ebb9a42f1 (diff) |
Use a more robust method for retrieving system packages.
- Start the framework and retrieve properties from the system
bundle.
- The static 'org.osgi.framework.system.packages' property only
returns org.osgi packages on Felix 6, and was based on a static
list in felix/framework/src/main/resources/default (not good).
Diffstat (limited to 'jdisc_core/src')
-rw-r--r-- | jdisc_core/src/main/java/com/yahoo/jdisc/core/ExportPackages.java | 47 | ||||
-rw-r--r-- | jdisc_core/src/test/java/com/yahoo/jdisc/core/FelixParamsTestCase.java | 6 |
2 files changed, 49 insertions, 4 deletions
diff --git a/jdisc_core/src/main/java/com/yahoo/jdisc/core/ExportPackages.java b/jdisc_core/src/main/java/com/yahoo/jdisc/core/ExportPackages.java index 86ab016bded..e8e6373f2ed 100644 --- a/jdisc_core/src/main/java/com/yahoo/jdisc/core/ExportPackages.java +++ b/jdisc_core/src/main/java/com/yahoo/jdisc/core/ExportPackages.java @@ -1,20 +1,31 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.jdisc.core; -import org.apache.felix.framework.util.Util; +import com.yahoo.io.IOUtils; +import com.yahoo.yolean.Exceptions; +import org.apache.felix.framework.Felix; +import org.osgi.framework.BundleException; import org.osgi.framework.Constants; +import org.osgi.framework.launch.Framework; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; import java.util.Properties; import java.util.jar.JarInputStream; +import java.util.logging.Logger; /** * @author Simon Thoresen Hult + * @author gjoranv */ public class ExportPackages { + private static final Logger log = Logger.getLogger(ExportPackages.class.getName()); public static final String PROPERTIES_FILE = "/exportPackages.properties"; public static final String EXPORT_PACKAGES = "exportPackages"; @@ -75,7 +86,38 @@ public class ExportPackages { } public static String getSystemPackages() { - return Util.getDefaultProperty(null, "org.osgi.framework.system.packages"); + File cache; + try { + cache = Files.createTempDirectory("felix-cache").toAbsolutePath().toFile(); + } catch (IOException e) { + throw new RuntimeException("Could not create temp bundle-cache.", e); + } + Framework framework = new Felix(felixCacheParams(cache.getAbsolutePath())); + try { + framework.init(); + framework.start(); + return framework.getHeaders().get(Constants.EXPORT_PACKAGE); + } catch (BundleException e) { + throw new RuntimeException("Failed retrieving exported system packages. ", e); + } finally { + try { + framework.stop(); + framework.waitForStop(10000); + } catch (BundleException | InterruptedException e) { + log.warning("Failed to stop Felix framework:\n" + Exceptions.toMessageString(e)); + } + if (! IOUtils.recursiveDeleteDir(cache)) { + log.warning("Failed to delete temp dir, must be deleted manually: " + cache.getAbsolutePath()); + } + } + } + + private static Map<String, Object> felixCacheParams(String cache) { + Map<String, Object> params = new HashMap<>(); + params.put("felix.cache.profiledir", cache); + params.put("felix.cache.dir", cache); + params.put(Constants.FRAMEWORK_STORAGE, cache); + return params; } private static String getExportedPackages(String argument) throws IOException { @@ -92,4 +134,5 @@ public class ExportPackages { return jar.getManifest().getMainAttributes().getValue(Constants.EXPORT_PACKAGE); } } + } diff --git a/jdisc_core/src/test/java/com/yahoo/jdisc/core/FelixParamsTestCase.java b/jdisc_core/src/test/java/com/yahoo/jdisc/core/FelixParamsTestCase.java index 55fca97841a..6836ebde496 100644 --- a/jdisc_core/src/test/java/com/yahoo/jdisc/core/FelixParamsTestCase.java +++ b/jdisc_core/src/test/java/com/yahoo/jdisc/core/FelixParamsTestCase.java @@ -29,17 +29,19 @@ public class FelixParamsTestCase { @Test public void requireThatSystemPackagesAreNotReplaced() { + String systemPackages = ExportPackages.getSystemPackages(); + FelixParams params = new FelixParams(); Map<String, String> config = params.toConfig(); assertNotNull(config); String str = config.get(Constants.FRAMEWORK_SYSTEMPACKAGES); assertNotNull(str); - assertTrue(str.contains(ExportPackages.getSystemPackages())); + assertTrue(str.contains(systemPackages)); params.exportPackage("foo"); assertNotNull(config = params.toConfig()); assertNotNull(str = config.get(Constants.FRAMEWORK_SYSTEMPACKAGES)); - assertTrue(str.contains(ExportPackages.getSystemPackages())); + assertTrue(str.contains(systemPackages)); assertTrue(str.contains("foo")); } |