aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgjoranv <gv@oath.com>2018-09-24 13:56:31 +0200
committergjoranv <gv@oath.com>2018-09-27 15:48:29 +0200
commit5f897da5e8a18f4d1f3d260fd943af37426c9db0 (patch)
treed14a0d83c4f51c6c46cbc793621618ca44eb4301
parent3983f26df5038419d769df3b82181c8ebb9a42f1 (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).
-rw-r--r--jdisc_core/pom.xml1
-rw-r--r--jdisc_core/src/main/java/com/yahoo/jdisc/core/ExportPackages.java47
-rw-r--r--jdisc_core/src/test/java/com/yahoo/jdisc/core/FelixParamsTestCase.java6
3 files changed, 50 insertions, 4 deletions
diff --git a/jdisc_core/pom.xml b/jdisc_core/pom.xml
index efa4e62affd..1a0c27c71a6 100644
--- a/jdisc_core/pom.xml
+++ b/jdisc_core/pom.xml
@@ -232,6 +232,7 @@
<configuration>
<mainClass>com.yahoo.jdisc.core.ExportPackages</mainClass>
<classpathScope>test</classpathScope>
+ <cleanupDaemonThreads>false</cleanupDaemonThreads>
<arguments>
<argument>${exportPackagesFile}</argument>
<argument>${project.build.directory}/dependency/commons-daemon.jar</argument>
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"));
}