diff --git a/README.md b/README.md index 262e6bc4..6f9d826c 100644 --- a/README.md +++ b/README.md @@ -486,6 +486,23 @@ Use case: Override logging for all rules defined in one file } ``` +## Example 23 + +Use case: Apply transformation using openHAB transformation service + +```java + public class TransformationRule extends JRule { + + @JRuleName("MyTransformation") + @JRuleWhen(item = _MyStringValue.ITEM, trigger = _MyStringValue.TRIGGER_RECEIVED_COMMAND) + public void applyTransformation(JRuleEvent event) { + String transformedValue = transform("MAP(my.map):%s", event.getValue()); + logInfo("Transformed {} to {}", event.getValue(), transformedValue); + _MyTransformationReceiver.sendCommand(transformedValue); + } +} +``` + # Changelog ## BETA5 - Addes support for adding rules in jar-files, as an alternative. diff --git a/src/main/java/org/openhab/automation/jrule/internal/JRuleFactory.java b/src/main/java/org/openhab/automation/jrule/internal/JRuleFactory.java index 9b639e3a..96814142 100644 --- a/src/main/java/org/openhab/automation/jrule/internal/JRuleFactory.java +++ b/src/main/java/org/openhab/automation/jrule/internal/JRuleFactory.java @@ -25,6 +25,7 @@ import org.openhab.core.items.ItemRegistry; import org.openhab.core.voice.VoiceManager; import org.osgi.framework.FrameworkUtil; +import org.osgi.service.component.ComponentContext; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Deactivate; @@ -63,7 +64,7 @@ public class JRuleFactory { @Activate public JRuleFactory(Map properties, final @Reference JRuleEventSubscriber eventSubscriber, final @Reference ItemRegistry itemRegistry, final @Reference EventPublisher eventPublisher, - final @Reference VoiceManager voiceManager) { + final @Reference VoiceManager voiceManager, final ComponentContext componentContext) { this.itemRegistry = itemRegistry; this.eventSubscriber = eventSubscriber; this.eventPublisher = eventPublisher; @@ -72,7 +73,8 @@ public JRuleFactory(Map properties, final @Reference JRuleEventS config.initConfig(); jRuleEngine = JRuleEngine.get(); jRuleEngine.setConfig(config); - jRuleHandler = new JRuleHandler(config, itemRegistry, eventPublisher, eventSubscriber, voiceManager); + jRuleHandler = new JRuleHandler(properties, itemRegistry, eventPublisher, eventSubscriber, voiceManager, + componentContext.getBundleContext()); createDelayedInitialization(getInitDelaySeconds(properties)); } diff --git a/src/main/java/org/openhab/automation/jrule/internal/handler/JRuleHandler.java b/src/main/java/org/openhab/automation/jrule/internal/handler/JRuleHandler.java index 60f86126..03c9230e 100644 --- a/src/main/java/org/openhab/automation/jrule/internal/handler/JRuleHandler.java +++ b/src/main/java/org/openhab/automation/jrule/internal/handler/JRuleHandler.java @@ -47,6 +47,7 @@ import org.openhab.core.items.events.ItemRemovedEvent; import org.openhab.core.items.events.ItemUpdatedEvent; import org.openhab.core.voice.VoiceManager; +import org.osgi.framework.BundleContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -72,6 +73,9 @@ public class JRuleHandler implements PropertyChangeListener { @NonNullByDefault({}) private VoiceManager voiceManager; + @NonNullByDefault({}) + private BundleContext bundleContext; + private final Logger logger = LoggerFactory.getLogger(JRuleHandler.class); @Nullable @@ -92,17 +96,21 @@ public class JRuleHandler implements PropertyChangeListener { private volatile boolean recompileJar = true; public JRuleHandler(JRuleConfig config, ItemRegistry itemRegistry, EventPublisher eventPublisher, - JRuleEventSubscriber eventSubscriber, VoiceManager voiceManager) { + JRuleEventSubscriber eventSubscriber, VoiceManager voiceManager, BundleContext bundleContext) { this.itemRegistry = itemRegistry; this.eventSubscriber = eventSubscriber; this.voiceManager = voiceManager; this.config = config; + this.bundleContext = bundleContext; + JRuleEventHandler jRuleEventHandler = JRuleEventHandler.get(); jRuleEventHandler.setEventPublisher(eventPublisher); jRuleEventHandler.setItemRegistry(itemRegistry); eventSubscriber.addPropertyChangeListener(this); JRuleVoiceHandler jRuleVoiceHandler = JRuleVoiceHandler.get(); jRuleVoiceHandler.setVoiceManager(voiceManager); + JRuleTransformationHandler jRuleTransformationHandler = JRuleTransformationHandler.get(); + jRuleTransformationHandler.setBundleContext(bundleContext); logDebug("JRuleHandler()"); } diff --git a/src/main/java/org/openhab/automation/jrule/internal/handler/JRuleTransformationHandler.java b/src/main/java/org/openhab/automation/jrule/internal/handler/JRuleTransformationHandler.java new file mode 100644 index 00000000..1c1b5d15 --- /dev/null +++ b/src/main/java/org/openhab/automation/jrule/internal/handler/JRuleTransformationHandler.java @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.automation.jrule.internal.handler; + +import org.openhab.core.transform.TransformationException; +import org.openhab.core.transform.TransformationHelper; +import org.osgi.framework.BundleContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The {@link JRuleTransformationHandler} is responsible for handling transformation requests + * + * @author Arne Seime - Initial contribution + */ +public class JRuleTransformationHandler { + + private static volatile JRuleTransformationHandler instance; + + private BundleContext bundleContext; + + private final Logger logger = LoggerFactory.getLogger(JRuleTransformationHandler.class); + + private JRuleTransformationHandler() { + } + + public static JRuleTransformationHandler get() { + if (instance == null) { + synchronized (JRuleTransformationHandler.class) { + if (instance == null) { + instance = new JRuleTransformationHandler(); + } + } + } + return instance; + } + + public void setBundleContext(BundleContext bundleContext) { + this.bundleContext = bundleContext; + } + + public String transform(String stateDescPattern, String state) throws TransformationException { + return TransformationHelper.transform(bundleContext, stateDescPattern, state); + } +} diff --git a/src/main/java/org/openhab/automation/jrule/rules/JRule.java b/src/main/java/org/openhab/automation/jrule/rules/JRule.java index d30efa42..5c7654eb 100644 --- a/src/main/java/org/openhab/automation/jrule/rules/JRule.java +++ b/src/main/java/org/openhab/automation/jrule/rules/JRule.java @@ -29,9 +29,11 @@ import org.openhab.automation.jrule.internal.engine.JRuleEngine; import org.openhab.automation.jrule.internal.handler.JRuleActionHandler; import org.openhab.automation.jrule.internal.handler.JRuleEventHandler; +import org.openhab.automation.jrule.internal.handler.JRuleTransformationHandler; import org.openhab.automation.jrule.internal.handler.JRuleVoiceHandler; import org.openhab.automation.jrule.items.JRulePercentType; import org.openhab.automation.jrule.rules.value.JRuleOnOffValue; +import org.openhab.core.transform.TransformationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -165,6 +167,10 @@ protected void say(String text) { JRuleVoiceHandler.get().say(text); } + protected String transform(String stateDescPattern, String state) throws TransformationException { + return JRuleTransformationHandler.get().transform(stateDescPattern, state); + } + protected void executeCommandLine(String... commandLine) { JRuleActionHandler.get().executeCommandLine(commandLine); }