From 741d563e802d9237c3e2493efbf6d57612aebdc6 Mon Sep 17 00:00:00 2001 From: Amit Kumar Mondal Date: Fri, 9 Feb 2024 12:35:47 +0100 Subject: [PATCH] Integrated Satisfiable Target Condition for Command --- .../command/GogoCommandActivator.java | 57 +++++++++---------- .../mqtt5/provider/command/MqttCommand.java | 11 ++-- 2 files changed, 30 insertions(+), 38 deletions(-) diff --git a/in.bytehue.messaging.mqtt5.provider/src/main/java/in/bytehue/messaging/mqtt5/provider/command/GogoCommandActivator.java b/in.bytehue.messaging.mqtt5.provider/src/main/java/in/bytehue/messaging/mqtt5/provider/command/GogoCommandActivator.java index 3cc4932..76bdcae 100644 --- a/in.bytehue.messaging.mqtt5.provider/src/main/java/in/bytehue/messaging/mqtt5/provider/command/GogoCommandActivator.java +++ b/in.bytehue.messaging.mqtt5.provider/src/main/java/in/bytehue/messaging/mqtt5/provider/command/GogoCommandActivator.java @@ -15,42 +15,37 @@ ******************************************************************************/ package in.bytehue.messaging.mqtt5.provider.command; -import static in.bytehue.messaging.mqtt5.provider.command.MqttCommand.PID; import static org.osgi.framework.namespace.PackageNamespace.PACKAGE_NAMESPACE; +import static org.osgi.service.condition.Condition.CONDITION_ID; +import static org.osgi.service.condition.Condition.INSTANCE; -import java.io.IOException; -import java.util.Hashtable; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.ServiceRegistration; import org.osgi.framework.wiring.BundleWiring; -import org.osgi.service.cm.Configuration; -import org.osgi.service.cm.ConfigurationAdmin; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Deactivate; -import org.osgi.service.component.annotations.Reference; +import org.osgi.service.condition.Condition; @Component public final class GogoCommandActivator { + private static final String CONDITION_VALUE = "gogo-available"; private static final String GOGO_PACKAGE = "org.apache.felix.service.command"; private final BundleContext bundleContext; - private final ConfigurationAdmin configAdmin; + private final AtomicReference> ref = new AtomicReference<>(); @Activate - public GogoCommandActivator( - // @formatter:off - final BundleContext bundleContext, - @Reference - final ConfigurationAdmin configAdmin - // @formatter:on - ) { - this.configAdmin = configAdmin; + public GogoCommandActivator(final BundleContext bundleContext) { this.bundleContext = bundleContext; - if (isGogoPackageImported()) { - createGogoCommandConfig(); + registerCondition(); } } @@ -66,23 +61,23 @@ private boolean isGogoPackageImported() { // @formatter:on } - private void createGogoCommandConfig() { - try { - final Configuration configuration = configAdmin.getConfiguration(PID, "?"); - configuration.updateIfDifferent(new Hashtable<>()); - } catch (final IOException e) { - throw new RuntimeException(e); - } + private void registerCondition() { + final Map properties = new HashMap<>(); + properties.put(CONDITION_ID, CONDITION_VALUE); + + final ServiceRegistration reg = bundleContext.registerService(Condition.class, INSTANCE, + FrameworkUtil.asDictionary(properties)); + ref.set(reg); } @Deactivate - private void deleteGogoCommandConfig() { - try { - final Configuration configuration = configAdmin.getConfiguration(PID, "?"); - configuration.delete(); - } catch (final IOException e) { - throw new RuntimeException(e); - } + private void deregisterCondition() { + ref.getAndUpdate(reg -> { + if (reg != null) { + reg.unregister(); + } + return null; + }); } } diff --git a/in.bytehue.messaging.mqtt5.provider/src/main/java/in/bytehue/messaging/mqtt5/provider/command/MqttCommand.java b/in.bytehue.messaging.mqtt5.provider/src/main/java/in/bytehue/messaging/mqtt5/provider/command/MqttCommand.java index 68244e3..5a0b543 100644 --- a/in.bytehue.messaging.mqtt5.provider/src/main/java/in/bytehue/messaging/mqtt5/provider/command/MqttCommand.java +++ b/in.bytehue.messaging.mqtt5.provider/src/main/java/in/bytehue/messaging/mqtt5/provider/command/MqttCommand.java @@ -15,11 +15,10 @@ ******************************************************************************/ package in.bytehue.messaging.mqtt5.provider.command; -import static in.bytehue.messaging.mqtt5.provider.command.MqttCommand.PID; import static in.bytehue.messaging.mqtt5.provider.helper.MessageHelper.stackTraceToString; import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Objects.requireNonNull; -import static org.osgi.service.component.annotations.ConfigurationPolicy.REQUIRE; +import static org.osgi.service.condition.Condition.CONDITION_ID; import java.nio.ByteBuffer; import java.util.Arrays; @@ -32,6 +31,7 @@ import org.osgi.service.component.ComponentServiceObjects; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.propertytypes.SatisfyingConditionTarget; import org.osgi.service.messaging.Message; import org.osgi.service.messaging.MessageContext; import org.osgi.service.messaging.dto.ChannelDTO; @@ -53,12 +53,9 @@ // @formatter:off @Descriptor("MQTT 5 Messaging") +@Component(immediate = true, service = MqttCommand.class) +@SatisfyingConditionTarget("(" + CONDITION_ID +"=gogo-available)") @FelixGogoCommand(scope = "mqtt", function = { "pub", "sub", "runtime" }) -@Component( - immediate = true, - configurationPid = PID, - configurationPolicy = REQUIRE, - service = MqttCommand.class) public final class MqttCommand { public static final String PID = "in.bytehue.messaging.mqtt.command";