This is an automated email from the ASF dual-hosted git repository. heneveld pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git
commit fb626e451cf3c08fd294cee7e2d6c48d7f07eb2f Author: Alex Heneveld <a...@cloudsoft.io> AuthorDate: Thu Mar 28 15:28:05 2024 +0000 discover brooklyn packages when running osgi felix (not karaf) without JARs this allows us to run pojo (felix) tests from the IDE --- .../brooklyn/rt/felix/EmbeddedFelixFramework.java | 26 ++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/utils/rt-felix/src/main/java/org/apache/brooklyn/rt/felix/EmbeddedFelixFramework.java b/utils/rt-felix/src/main/java/org/apache/brooklyn/rt/felix/EmbeddedFelixFramework.java index 434d9fe4b9..2503ab4e38 100644 --- a/utils/rt-felix/src/main/java/org/apache/brooklyn/rt/felix/EmbeddedFelixFramework.java +++ b/utils/rt-felix/src/main/java/org/apache/brooklyn/rt/felix/EmbeddedFelixFramework.java @@ -31,7 +31,10 @@ import java.util.Set; import java.util.jar.Attributes; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; +import java.util.stream.Collectors; +import com.google.common.base.Stopwatch; +import com.google.common.reflect.ClassPath; import org.apache.brooklyn.util.collections.MutableMap; import org.apache.brooklyn.util.collections.MutableSet; import org.apache.brooklyn.util.exceptions.Exceptions; @@ -49,8 +52,6 @@ import org.osgi.framework.launch.Framework; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Stopwatch; - /** * Functions for starting an Apache Felix OSGi framework inside a non-OSGi Brooklyn distro. * @@ -64,6 +65,10 @@ public class EmbeddedFelixFramework { private static final String MANIFEST_PATH = "META-INF/MANIFEST.MF"; private static final Set<String> SYSTEM_BUNDLES = MutableSet.of(); + // set here to avoid importing core, only needed for tests + private static final String BROOKLYN_VERSION = "1.2.0-SNAPSHOT"; + private static final String BROOKLYN_VERSION_OSGI_ROUGH = BROOKLYN_VERSION.replaceFirst("-.*", ""); + private static final Set<URL> CANDIDATE_BOOT_BUNDLES; static { @@ -113,6 +118,23 @@ public class EmbeddedFelixFramework { if (clean) cfg.put(Constants.FRAMEWORK_STORAGE_CLEAN, "onFirstInit"); if (felixCacheDir!=null) cfg.put(Constants.FRAMEWORK_STORAGE, felixCacheDir); cfg.put(Constants.FRAMEWORK_BSNVERSION, Constants.FRAMEWORK_BSNVERSION_MULTIPLE); + + if (CANDIDATE_BOOT_BUNDLES.stream().noneMatch(url -> url.toString().contains("brooklyn-core"))) { + // if not running brooklyn-core from a jar, for osgi deps to work we need to make the system bundle export brooklyn packages; + // mainly for tests to work; everything else should be running from jars with manifest.mf + + try { + // spring has: PathMatchingResourcePatternResolver; we use guava's ClassPath + Set<String> brooklynPackages = ClassPath.from(EmbeddedFelixFramework.class.getClassLoader()).getTopLevelClasses() + .stream().map(c -> c.getPackageName()) + .filter(n -> n.startsWith("org.apache.brooklyn.")).collect(Collectors.toSet()); + LOG.info("Embedded felix OSGi system running without brooklyn-core JAR; manually adding brooklyn packages ("+brooklynPackages.size()+") to system bundle exports"); + cfg.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, brooklynPackages.stream().map(p -> p + ";version=\""+BROOKLYN_VERSION_OSGI_ROUGH+"\"").collect(Collectors.joining(","))); + } catch (Exception e) { + throw Exceptions.propagateAnnotated("Unable to set up embedded felix framework with packages inferred", e); + } + } + FrameworkFactory factory = newFrameworkFactory(); Stopwatch timer = Stopwatch.createStarted();