Add more null annotations to automation bundles (#2763)

* Add more null annotations to automation bundles. This adds null annotations to many classes in the automation bundles and a few dimension classes.
* Further cleanup AutomationCommandExport
* Remove null from RuleStatusInfo JavaDocs. This should be clear from how the class is now annotated.
* Validate deserialized RuleStatusInfo
* Allow TriggerHandlerCallback to be triggered without providing a context

Signed-off-by: Wouter Born <github@maindrain.net>
This commit is contained in:
Wouter Born 2022-02-25 16:40:02 +01:00 committed by GitHub
parent 44f7b00c45
commit 9ff7ad43b9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
84 changed files with 483 additions and 462 deletions

View File

@ -12,6 +12,8 @@
*/ */
package org.openhab.core.automation.module.script.rulesupport.internal; package org.openhab.core.automation.module.script.rulesupport.internal;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Action; import org.openhab.core.automation.Action;
import org.openhab.core.automation.Condition; import org.openhab.core.automation.Condition;
import org.openhab.core.automation.Module; import org.openhab.core.automation.Module;
@ -36,10 +38,11 @@ import org.slf4j.LoggerFactory;
* *
* @author Simon Merschjohann - Initial contribution * @author Simon Merschjohann - Initial contribution
*/ */
@NonNullByDefault
public abstract class AbstractScriptedModuleHandlerFactory extends BaseModuleHandlerFactory { public abstract class AbstractScriptedModuleHandlerFactory extends BaseModuleHandlerFactory {
Logger logger = LoggerFactory.getLogger(AbstractScriptedModuleHandlerFactory.class); Logger logger = LoggerFactory.getLogger(AbstractScriptedModuleHandlerFactory.class);
protected ModuleHandler getModuleHandler(Module module, ScriptedHandler scriptedHandler) { protected @Nullable ModuleHandler getModuleHandler(Module module, @Nullable ScriptedHandler scriptedHandler) {
ModuleHandler moduleHandler = null; ModuleHandler moduleHandler = null;
if (scriptedHandler != null) { if (scriptedHandler != null) {

View File

@ -15,6 +15,8 @@ package org.openhab.core.automation.module.script.rulesupport.internal;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Module; import org.openhab.core.automation.Module;
import org.openhab.core.automation.handler.ModuleHandler; import org.openhab.core.automation.handler.ModuleHandler;
import org.openhab.core.automation.handler.ModuleHandlerFactory; import org.openhab.core.automation.handler.ModuleHandlerFactory;
@ -31,6 +33,7 @@ import org.osgi.service.component.annotations.Component;
* *
* @author Simon Merschjohann - Initial contribution * @author Simon Merschjohann - Initial contribution
*/ */
@NonNullByDefault
@Component(immediate = true, service = { ScriptedCustomModuleHandlerFactory.class, ModuleHandlerFactory.class }) @Component(immediate = true, service = { ScriptedCustomModuleHandlerFactory.class, ModuleHandlerFactory.class })
public class ScriptedCustomModuleHandlerFactory extends AbstractScriptedModuleHandlerFactory { public class ScriptedCustomModuleHandlerFactory extends AbstractScriptedModuleHandlerFactory {
private final HashMap<String, ScriptedHandler> typesHandlers = new HashMap<>(); private final HashMap<String, ScriptedHandler> typesHandlers = new HashMap<>();
@ -41,7 +44,7 @@ public class ScriptedCustomModuleHandlerFactory extends AbstractScriptedModuleHa
} }
@Override @Override
protected ModuleHandler internalCreate(Module module, String ruleUID) { protected @Nullable ModuleHandler internalCreate(Module module, String ruleUID) {
ScriptedHandler scriptedHandler = typesHandlers.get(module.getTypeUID()); ScriptedHandler scriptedHandler = typesHandlers.get(module.getTypeUID());
return getModuleHandler(module, scriptedHandler); return getModuleHandler(module, scriptedHandler);

View File

@ -16,6 +16,8 @@ import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Module; import org.openhab.core.automation.Module;
import org.openhab.core.automation.handler.ModuleHandler; import org.openhab.core.automation.handler.ModuleHandler;
import org.openhab.core.automation.handler.ModuleHandlerFactory; import org.openhab.core.automation.handler.ModuleHandlerFactory;
@ -33,6 +35,7 @@ import org.slf4j.LoggerFactory;
* *
* @author Simon Merschjohann - Initial contribution * @author Simon Merschjohann - Initial contribution
*/ */
@NonNullByDefault
@Component(immediate = true, service = { ScriptedPrivateModuleHandlerFactory.class, ModuleHandlerFactory.class }) @Component(immediate = true, service = { ScriptedPrivateModuleHandlerFactory.class, ModuleHandlerFactory.class })
public class ScriptedPrivateModuleHandlerFactory extends AbstractScriptedModuleHandlerFactory { public class ScriptedPrivateModuleHandlerFactory extends AbstractScriptedModuleHandlerFactory {
private static final String PRIV_ID = "privId"; private static final String PRIV_ID = "privId";
@ -50,7 +53,7 @@ public class ScriptedPrivateModuleHandlerFactory extends AbstractScriptedModuleH
} }
@Override @Override
protected ModuleHandler internalCreate(Module module, String ruleUID) { protected @Nullable ModuleHandler internalCreate(Module module, String ruleUID) {
ModuleHandler moduleHandler = null; ModuleHandler moduleHandler = null;
ScriptedHandler scriptedHandler = null; ScriptedHandler scriptedHandler = null;

View File

@ -17,6 +17,8 @@ import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Action; import org.openhab.core.automation.Action;
import org.openhab.core.automation.handler.BaseActionModuleHandler; import org.openhab.core.automation.handler.BaseActionModuleHandler;
import org.openhab.core.automation.module.script.rulesupport.shared.simple.SimpleActionHandler; import org.openhab.core.automation.module.script.rulesupport.shared.simple.SimpleActionHandler;
@ -26,6 +28,7 @@ import org.openhab.core.automation.module.script.rulesupport.shared.simple.Simpl
* *
* @author Simon Merschjohann - Initial contribution * @author Simon Merschjohann - Initial contribution
*/ */
@NonNullByDefault
public class SimpleActionHandlerDelegate extends BaseActionModuleHandler { public class SimpleActionHandlerDelegate extends BaseActionModuleHandler {
private org.openhab.core.automation.module.script.rulesupport.shared.simple.SimpleActionHandler actionHandler; private org.openhab.core.automation.module.script.rulesupport.shared.simple.SimpleActionHandler actionHandler;
@ -41,10 +44,10 @@ public class SimpleActionHandlerDelegate extends BaseActionModuleHandler {
} }
@Override @Override
public Map<String, Object> execute(Map<String, Object> inputs) { public @Nullable Map<String, Object> execute(Map<String, @Nullable Object> inputs) {
Set<String> keys = new HashSet<>(inputs.keySet()); Set<String> keys = new HashSet<>(inputs.keySet());
Map<String, Object> extendedInputs = new HashMap<>(inputs); Map<String, @Nullable Object> extendedInputs = new HashMap<>(inputs);
for (String key : keys) { for (String key : keys) {
Object value = extendedInputs.get(key); Object value = extendedInputs.get(key);
int dotIndex = key.indexOf('.'); int dotIndex = key.indexOf('.');

View File

@ -14,6 +14,7 @@ package org.openhab.core.automation.module.script.rulesupport.internal.delegates
import java.util.Map; import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.automation.Condition; import org.openhab.core.automation.Condition;
import org.openhab.core.automation.handler.BaseConditionModuleHandler; import org.openhab.core.automation.handler.BaseConditionModuleHandler;
import org.openhab.core.automation.module.script.rulesupport.shared.simple.SimpleConditionHandler; import org.openhab.core.automation.module.script.rulesupport.shared.simple.SimpleConditionHandler;
@ -23,6 +24,7 @@ import org.openhab.core.automation.module.script.rulesupport.shared.simple.Simpl
* *
* @author Simon Merschjohann - Initial contribution * @author Simon Merschjohann - Initial contribution
*/ */
@NonNullByDefault
public class SimpleConditionHandlerDelegate extends BaseConditionModuleHandler { public class SimpleConditionHandlerDelegate extends BaseConditionModuleHandler {
private SimpleConditionHandler conditionHandler; private SimpleConditionHandler conditionHandler;

View File

@ -15,6 +15,8 @@ package org.openhab.core.automation.module.script.rulesupport.internal.delegates
import java.util.Map; import java.util.Map;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.RuleStatus; import org.openhab.core.automation.RuleStatus;
import org.openhab.core.automation.RuleStatusInfo; import org.openhab.core.automation.RuleStatusInfo;
import org.openhab.core.automation.Trigger; import org.openhab.core.automation.Trigger;
@ -26,6 +28,7 @@ import org.openhab.core.automation.module.script.rulesupport.shared.simple.Simpl
* *
* @author Simon Merschjohann - Initial contribution * @author Simon Merschjohann - Initial contribution
*/ */
@NonNullByDefault
public class SimpleTriggerHandlerCallbackDelegate implements SimpleTriggerHandlerCallback { public class SimpleTriggerHandlerCallbackDelegate implements SimpleTriggerHandlerCallback {
private final Trigger trigger; private final Trigger trigger;
private final TriggerHandlerCallback callback; private final TriggerHandlerCallback callback;
@ -51,7 +54,7 @@ public class SimpleTriggerHandlerCallbackDelegate implements SimpleTriggerHandle
} }
@Override @Override
public Boolean isEnabled(String ruleUID) { public @Nullable Boolean isEnabled(String ruleUID) {
return callback.isEnabled(ruleUID); return callback.isEnabled(ruleUID);
} }
@ -61,12 +64,12 @@ public class SimpleTriggerHandlerCallbackDelegate implements SimpleTriggerHandle
} }
@Override @Override
public RuleStatusInfo getStatusInfo(String ruleUID) { public @Nullable RuleStatusInfo getStatusInfo(String ruleUID) {
return callback.getStatusInfo(ruleUID); return callback.getStatusInfo(ruleUID);
} }
@Override @Override
public RuleStatus getStatus(String ruleUID) { public @Nullable RuleStatus getStatus(String ruleUID) {
return callback.getStatus(ruleUID); return callback.getStatus(ruleUID);
} }
@ -76,7 +79,7 @@ public class SimpleTriggerHandlerCallbackDelegate implements SimpleTriggerHandle
} }
@Override @Override
public void runNow(String uid, boolean considerConditions, Map<String, Object> context) { public void runNow(String uid, boolean considerConditions, @Nullable Map<String, Object> context) {
callback.runNow(uid, considerConditions, context); callback.runNow(uid, considerConditions, context);
} }
} }

View File

@ -12,6 +12,7 @@
*/ */
package org.openhab.core.automation.module.script.rulesupport.internal.delegates; package org.openhab.core.automation.module.script.rulesupport.internal.delegates;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.automation.ModuleHandlerCallback; import org.openhab.core.automation.ModuleHandlerCallback;
import org.openhab.core.automation.Trigger; import org.openhab.core.automation.Trigger;
import org.openhab.core.automation.handler.BaseTriggerModuleHandler; import org.openhab.core.automation.handler.BaseTriggerModuleHandler;
@ -22,6 +23,7 @@ import org.openhab.core.automation.handler.TriggerHandlerCallback;
* *
* @author Simon Merschjohann - Initial contribution * @author Simon Merschjohann - Initial contribution
*/ */
@NonNullByDefault
public class SimpleTriggerHandlerDelegate extends BaseTriggerModuleHandler { public class SimpleTriggerHandlerDelegate extends BaseTriggerModuleHandler {
private final org.openhab.core.automation.module.script.rulesupport.shared.simple.SimpleTriggerHandler triggerHandler; private final org.openhab.core.automation.module.script.rulesupport.shared.simple.SimpleTriggerHandler triggerHandler;

View File

@ -18,6 +18,8 @@ import java.io.File;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.WatchEvent; import java.nio.file.WatchEvent;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.service.AbstractWatchService; import org.openhab.core.service.AbstractWatchService;
/** /**
@ -25,6 +27,7 @@ import org.openhab.core.service.AbstractWatchService;
* *
* @author Jonathan Gilbert - Initial contribution * @author Jonathan Gilbert - Initial contribution
*/ */
@NonNullByDefault
public abstract class ScriptLibraryWatcher extends AbstractWatchService { public abstract class ScriptLibraryWatcher extends AbstractWatchService {
public ScriptLibraryWatcher(final String libraryPath) { public ScriptLibraryWatcher(final String libraryPath) {
@ -37,7 +40,7 @@ public abstract class ScriptLibraryWatcher extends AbstractWatchService {
} }
@Override @Override
protected WatchEvent.Kind<?>[] getWatchEventKinds(Path path) { protected WatchEvent.Kind<?> @Nullable [] getWatchEventKinds(Path path) {
return new WatchEvent.Kind<?>[] { ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY }; return new WatchEvent.Kind<?>[] { ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY };
} }

View File

@ -18,6 +18,8 @@ import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import org.eclipse.jdt.annotation.NonNullByDefault;
/** /**
* Bidirectional bag of unique elements. A map allowing multiple, unique values to be stored against a single key. * Bidirectional bag of unique elements. A map allowing multiple, unique values to be stored against a single key.
* Provides optimized lookup of values for a key, as well as keys referencing a value. * Provides optimized lookup of values for a key, as well as keys referencing a value.
@ -26,6 +28,7 @@ import java.util.Set;
* @param <K> Type of Key * @param <K> Type of Key
* @param <V> Type of Value * @param <V> Type of Value
*/ */
@NonNullByDefault
public class BidiSetBag<K, V> { public class BidiSetBag<K, V> {
private Map<K, Set<V>> keyToValues = new HashMap<>(); private Map<K, Set<V>> keyToValues = new HashMap<>();
private Map<V, Set<K>> valueToKeys = new HashMap<>(); private Map<V, Set<K>> valueToKeys = new HashMap<>();

View File

@ -12,11 +12,14 @@
*/ */
package org.openhab.core.automation.module.script.rulesupport.shared; package org.openhab.core.automation.module.script.rulesupport.shared;
import org.eclipse.jdt.annotation.NonNullByDefault;
/** /**
* Empty interface to identify scripted handlers * Empty interface to identify scripted handlers
* *
* @author Simon Merschjohann - Initial contribution * @author Simon Merschjohann - Initial contribution
*/ */
@NonNullByDefault
public interface ScriptedHandler { public interface ScriptedHandler {
} }

View File

@ -12,6 +12,8 @@
*/ */
package org.openhab.core.automation.module.script.rulesupport.shared.factories; package org.openhab.core.automation.module.script.rulesupport.shared.factories;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Action; import org.openhab.core.automation.Action;
import org.openhab.core.automation.handler.ActionHandler; import org.openhab.core.automation.handler.ActionHandler;
import org.openhab.core.automation.module.script.rulesupport.shared.ScriptedHandler; import org.openhab.core.automation.module.script.rulesupport.shared.ScriptedHandler;
@ -20,6 +22,7 @@ import org.openhab.core.automation.module.script.rulesupport.shared.ScriptedHand
* *
* @author Simon Merschjohann - Initial contribution * @author Simon Merschjohann - Initial contribution
*/ */
@NonNullByDefault
public interface ScriptedActionHandlerFactory extends ScriptedHandler { public interface ScriptedActionHandlerFactory extends ScriptedHandler {
public ActionHandler get(Action action); public @Nullable ActionHandler get(Action action);
} }

View File

@ -12,6 +12,8 @@
*/ */
package org.openhab.core.automation.module.script.rulesupport.shared.factories; package org.openhab.core.automation.module.script.rulesupport.shared.factories;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Condition; import org.openhab.core.automation.Condition;
import org.openhab.core.automation.handler.ConditionHandler; import org.openhab.core.automation.handler.ConditionHandler;
import org.openhab.core.automation.module.script.rulesupport.shared.ScriptedHandler; import org.openhab.core.automation.module.script.rulesupport.shared.ScriptedHandler;
@ -20,6 +22,7 @@ import org.openhab.core.automation.module.script.rulesupport.shared.ScriptedHand
* *
* @author Simon Merschjohann - Initial contribution * @author Simon Merschjohann - Initial contribution
*/ */
@NonNullByDefault
public interface ScriptedConditionHandlerFactory extends ScriptedHandler { public interface ScriptedConditionHandlerFactory extends ScriptedHandler {
public ConditionHandler get(Condition module); public @Nullable ConditionHandler get(Condition module);
} }

View File

@ -12,6 +12,8 @@
*/ */
package org.openhab.core.automation.module.script.rulesupport.shared.factories; package org.openhab.core.automation.module.script.rulesupport.shared.factories;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Trigger; import org.openhab.core.automation.Trigger;
import org.openhab.core.automation.handler.TriggerHandler; import org.openhab.core.automation.handler.TriggerHandler;
import org.openhab.core.automation.module.script.rulesupport.shared.ScriptedHandler; import org.openhab.core.automation.module.script.rulesupport.shared.ScriptedHandler;
@ -20,6 +22,7 @@ import org.openhab.core.automation.module.script.rulesupport.shared.ScriptedHand
* *
* @author Simon Merschjohann - Initial contribution * @author Simon Merschjohann - Initial contribution
*/ */
@NonNullByDefault
public interface ScriptedTriggerHandlerFactory extends ScriptedHandler { public interface ScriptedTriggerHandlerFactory extends ScriptedHandler {
public TriggerHandler get(Trigger module); public @Nullable TriggerHandler get(Trigger module);
} }

View File

@ -14,6 +14,7 @@ package org.openhab.core.automation.module.script.rulesupport.shared.simple;
import java.util.Map; import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.automation.Action; import org.openhab.core.automation.Action;
import org.openhab.core.automation.module.script.rulesupport.shared.ScriptedHandler; import org.openhab.core.automation.module.script.rulesupport.shared.ScriptedHandler;
@ -21,6 +22,7 @@ import org.openhab.core.automation.module.script.rulesupport.shared.ScriptedHand
* *
* @author Simon Merschjohann - Initial contribution * @author Simon Merschjohann - Initial contribution
*/ */
@NonNullByDefault
public abstract class SimpleActionHandler implements ScriptedHandler { public abstract class SimpleActionHandler implements ScriptedHandler {
public void init(Action module) { public void init(Action module) {
} }

View File

@ -14,6 +14,7 @@ package org.openhab.core.automation.module.script.rulesupport.shared.simple;
import java.util.Map; import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.automation.Condition; import org.openhab.core.automation.Condition;
import org.openhab.core.automation.module.script.rulesupport.shared.ScriptedHandler; import org.openhab.core.automation.module.script.rulesupport.shared.ScriptedHandler;
@ -21,6 +22,7 @@ import org.openhab.core.automation.module.script.rulesupport.shared.ScriptedHand
* *
* @author Simon Merschjohann - Initial contribution * @author Simon Merschjohann - Initial contribution
*/ */
@NonNullByDefault
public abstract class SimpleConditionHandler implements ScriptedHandler { public abstract class SimpleConditionHandler implements ScriptedHandler {
public void init(Condition condition) { public void init(Condition condition) {
} }

View File

@ -14,12 +14,14 @@ package org.openhab.core.automation.module.script.rulesupport.shared.simple;
import java.util.Map; import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.automation.Action; import org.openhab.core.automation.Action;
/** /**
* *
* @author Simon Merschjohann - Initial contribution * @author Simon Merschjohann - Initial contribution
*/ */
@NonNullByDefault
public interface SimpleRuleActionHandler { public interface SimpleRuleActionHandler {
Object execute(Action module, Map<String, ?> inputs); Object execute(Action module, Map<String, ?> inputs);
} }

View File

@ -14,12 +14,14 @@ package org.openhab.core.automation.module.script.rulesupport.shared.simple;
import java.util.Map; import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.automation.Action; import org.openhab.core.automation.Action;
/** /**
* *
* @author Simon Merschjohann - Initial contribution * @author Simon Merschjohann - Initial contribution
*/ */
@NonNullByDefault
public class SimpleRuleActionHandlerDelegate extends SimpleActionHandler { public class SimpleRuleActionHandlerDelegate extends SimpleActionHandler {
private SimpleRuleActionHandler handler; private SimpleRuleActionHandler handler;

View File

@ -14,6 +14,8 @@ package org.openhab.core.automation.module.script.rulesupport.shared.simple;
import java.util.Map; import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Trigger; import org.openhab.core.automation.Trigger;
import org.openhab.core.automation.module.script.rulesupport.shared.ScriptedHandler; import org.openhab.core.automation.module.script.rulesupport.shared.ScriptedHandler;
@ -21,8 +23,9 @@ import org.openhab.core.automation.module.script.rulesupport.shared.ScriptedHand
* *
* @author Simon Merschjohann - Initial contribution * @author Simon Merschjohann - Initial contribution
*/ */
@NonNullByDefault
public abstract class SimpleTriggerHandler implements ScriptedHandler { public abstract class SimpleTriggerHandler implements ScriptedHandler {
private SimpleTriggerHandlerCallback ruleCallback; private @Nullable SimpleTriggerHandlerCallback ruleCallback;
public void init(Trigger module) { public void init(Trigger module) {
} }
@ -32,6 +35,9 @@ public abstract class SimpleTriggerHandler implements ScriptedHandler {
} }
protected void trigger(Map<String, ?> context) { protected void trigger(Map<String, ?> context) {
this.ruleCallback.triggered(context); SimpleTriggerHandlerCallback callback = this.ruleCallback;
if (callback != null) {
callback.triggered(context);
}
} }
} }

View File

@ -14,12 +14,14 @@ package org.openhab.core.automation.module.script.rulesupport.shared.simple;
import java.util.Map; import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.automation.handler.TriggerHandlerCallback; import org.openhab.core.automation.handler.TriggerHandlerCallback;
/** /**
* *
* @author Simon Merschjohann - Initial contribution * @author Simon Merschjohann - Initial contribution
*/ */
@NonNullByDefault
public interface SimpleTriggerHandlerCallback extends TriggerHandlerCallback { public interface SimpleTriggerHandlerCallback extends TriggerHandlerCallback {
public void triggered(Map<String, ?> context); public void triggered(Map<String, ?> context);
} }

View File

@ -17,6 +17,7 @@ import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.items.Item; import org.openhab.core.items.Item;
import org.openhab.core.items.ItemNotFoundException; import org.openhab.core.items.ItemNotFoundException;
@ -28,6 +29,7 @@ import org.openhab.core.types.State;
* *
* @author Kai Kreuzer - Initial contribution * @author Kai Kreuzer - Initial contribution
*/ */
@NonNullByDefault
public class ItemRegistryDelegate implements Map<String, State> { public class ItemRegistryDelegate implements Map<String, State> {
private final ItemRegistry itemRegistry; private final ItemRegistry itemRegistry;
@ -47,10 +49,11 @@ public class ItemRegistryDelegate implements Map<String, State> {
} }
@Override @Override
public boolean containsKey(Object key) { public boolean containsKey(@Nullable Object key) {
if (key instanceof String) { if (key instanceof String) {
try { try {
return itemRegistry.getItem((String) key) != null; itemRegistry.getItem((String) key);
return true;
} catch (ItemNotFoundException e) { } catch (ItemNotFoundException e) {
return false; return false;
} }
@ -60,12 +63,12 @@ public class ItemRegistryDelegate implements Map<String, State> {
} }
@Override @Override
public boolean containsValue(Object value) { public boolean containsValue(@Nullable Object value) {
return false; return false;
} }
@Override @Override
public State get(@Nullable Object key) { public @Nullable State get(@Nullable Object key) {
if (key == null) { if (key == null) {
return null; return null;
} }
@ -77,12 +80,12 @@ public class ItemRegistryDelegate implements Map<String, State> {
} }
@Override @Override
public State put(String key, State value) { public @Nullable State put(String key, State value) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@Override @Override
public State remove(Object key) { public @Nullable State remove(@Nullable Object key) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }

View File

@ -12,6 +12,7 @@
*/ */
package org.openhab.core.automation.rest.internal.dto; package org.openhab.core.automation.rest.internal.dto;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.automation.ManagedRuleProvider; import org.openhab.core.automation.ManagedRuleProvider;
import org.openhab.core.automation.Rule; import org.openhab.core.automation.Rule;
import org.openhab.core.automation.RuleManager; import org.openhab.core.automation.RuleManager;
@ -23,6 +24,7 @@ import org.openhab.core.automation.dto.RuleDTOMapper;
* @author Markus Rathgeb - Initial contribution * @author Markus Rathgeb - Initial contribution
* @author Kai Kreuzer - added editable field * @author Kai Kreuzer - added editable field
*/ */
@NonNullByDefault
public class EnrichedRuleDTOMapper extends RuleDTOMapper { public class EnrichedRuleDTOMapper extends RuleDTOMapper {
public static EnrichedRuleDTO map(final Rule rule, final RuleManager ruleEngine, public static EnrichedRuleDTO map(final Rule rule, final RuleManager ruleEngine,

View File

@ -19,11 +19,15 @@ import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.function.Predicate; import java.util.function.Predicate;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
/** /**
* This class add support for prefixes for {@link Rule} UIDs and provide default predicates for prefixes and tags. * This class add support for prefixes for {@link Rule} UIDs and provide default predicates for prefixes and tags.
* *
* @author Victor Toni - Initial contribution * @author Victor Toni - Initial contribution
*/ */
@NonNullByDefault
public class RulePredicates { public class RulePredicates {
/** /**
@ -48,7 +52,7 @@ public class RulePredicates {
* *
* @return prefix of this {@link Rule}, or {@code null} if no prefix or an empty prefix is found. * @return prefix of this {@link Rule}, or {@code null} if no prefix or an empty prefix is found.
*/ */
public static String getPrefix(Rule rule) { public static @Nullable String getPrefix(@Nullable Rule rule) {
if (null != rule) { if (null != rule) {
final String uid = rule.getUID(); final String uid = rule.getUID();
final int index = uid.indexOf(PREFIX_SEPARATOR); final int index = uid.indexOf(PREFIX_SEPARATOR);
@ -66,7 +70,7 @@ public class RulePredicates {
* @param prefix to search for. * @param prefix to search for.
* @return created {@link Predicate}. * @return created {@link Predicate}.
*/ */
public static Predicate<Rule> hasPrefix(final String prefix) { public static Predicate<Rule> hasPrefix(final @Nullable String prefix) {
if (null == prefix) { if (null == prefix) {
return r -> null == getPrefix(r); return r -> null == getPrefix(r);
} else { } else {
@ -121,7 +125,7 @@ public class RulePredicates {
* @param tags to search for. * @param tags to search for.
* @return created {@link Predicate}. * @return created {@link Predicate}.
*/ */
public static Predicate<Rule> hasAllTags(final Collection<String> tags) { public static Predicate<Rule> hasAllTags(final @Nullable Collection<String> tags) {
if (tags == null || tags.isEmpty()) { if (tags == null || tags.isEmpty()) {
return (Predicate<Rule>) r -> true; return (Predicate<Rule>) r -> true;
} else { } else {
@ -140,7 +144,7 @@ public class RulePredicates {
* @param tags to search for. * @param tags to search for.
* @return created {@link Predicate}. * @return created {@link Predicate}.
*/ */
public static Predicate<Rule> hasAllTags(final String... tags) { public static Predicate<Rule> hasAllTags(final String @Nullable... tags) {
return hasAllTags(tags == null ? null : Arrays.asList(tags)); return hasAllTags(tags == null ? null : Arrays.asList(tags));
} }
@ -151,7 +155,7 @@ public class RulePredicates {
* @param tags to search for. * @param tags to search for.
* @return created {@link Predicate}. * @return created {@link Predicate}.
*/ */
public static Predicate<Rule> hasAnyOfTags(final Collection<String> tags) { public static Predicate<Rule> hasAnyOfTags(final @Nullable Collection<String> tags) {
if (null == tags || tags.isEmpty()) { if (null == tags || tags.isEmpty()) {
// everything without a tag is matching // everything without a tag is matching
return hasNoTags(); return hasNoTags();
@ -171,7 +175,7 @@ public class RulePredicates {
* @param tags to search for. * @param tags to search for.
* @return created {@link Predicate}. * @return created {@link Predicate}.
*/ */
public static Predicate<Rule> hasAnyOfTags(final String... tags) { public static Predicate<Rule> hasAnyOfTags(final String @Nullable... tags) {
if (null == tags || 0 == tags.length) { if (null == tags || 0 == tags.length) {
// everything without a tag is matching // everything without a tag is matching
return hasNoTags(); return hasNoTags();

View File

@ -12,6 +12,9 @@
*/ */
package org.openhab.core.automation; package org.openhab.core.automation;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
/** /**
* This class is used to present status of a rule. The status consists of three parts: * This class is used to present status of a rule. The status consists of three parts:
* The main status, a status detail and a string description. * The main status, a status detail and a string description.
@ -19,11 +22,12 @@ package org.openhab.core.automation;
* @author Yordan Mihaylov - Initial contribution * @author Yordan Mihaylov - Initial contribution
* @author Kai Kreuzer - Refactored to match ThingStatusInfo implementation * @author Kai Kreuzer - Refactored to match ThingStatusInfo implementation
*/ */
@NonNullByDefault
public class RuleStatusInfo { public class RuleStatusInfo {
private RuleStatus status; private @NonNullByDefault({}) RuleStatus status;
private RuleStatusDetail statusDetail; private @NonNullByDefault({}) RuleStatusDetail statusDetail;
private String description; private @Nullable String description;
/** /**
* Default constructor for deserialization e.g. by Gson. * Default constructor for deserialization e.g. by Gson.
@ -34,40 +38,30 @@ public class RuleStatusInfo {
/** /**
* Constructs a status info. * Constructs a status info.
* *
* @param status the status (must not be null) * @param status the status
* @throws IllegalArgumentException if status is null
*/ */
public RuleStatusInfo(RuleStatus status) throws IllegalArgumentException { public RuleStatusInfo(RuleStatus status) {
this(status, RuleStatusDetail.NONE); this(status, RuleStatusDetail.NONE);
} }
/** /**
* Constructs a status info. * Constructs a status info.
* *
* @param status the status (must not be null) * @param status the status
* @param statusDetail the detail of the status (must not be null) * @param statusDetail the detail of the status
* @throws IllegalArgumentException if status or status detail is null
*/ */
public RuleStatusInfo(RuleStatus status, RuleStatusDetail statusDetail) throws IllegalArgumentException { public RuleStatusInfo(RuleStatus status, RuleStatusDetail statusDetail) {
this(status, statusDetail, null); this(status, statusDetail, null);
} }
/** /**
* Constructs a status info. * Constructs a status info.
* *
* @param status the status (must not be null) * @param status the status
* @param statusDetail the detail of the status (must not be null) * @param statusDetail the detail of the status
* @param description the description of the status * @param description the description of the status
* @throws IllegalArgumentException if status or status detail is null
*/ */
public RuleStatusInfo(RuleStatus status, RuleStatusDetail statusDetail, String description) public RuleStatusInfo(RuleStatus status, RuleStatusDetail statusDetail, @Nullable String description) {
throws IllegalArgumentException {
if (status == null) {
throw new IllegalArgumentException("Thing status must not be null");
}
if (statusDetail == null) {
throw new IllegalArgumentException("Thing status detail must not be null");
}
this.status = status; this.status = status;
this.statusDetail = statusDetail; this.statusDetail = statusDetail;
this.description = description; this.description = description;
@ -76,7 +70,7 @@ public class RuleStatusInfo {
/** /**
* Gets the status itself. * Gets the status itself.
* *
* @return the status (not null) * @return the status
*/ */
public RuleStatus getStatus() { public RuleStatus getStatus() {
return status; return status;
@ -85,7 +79,7 @@ public class RuleStatusInfo {
/** /**
* Gets the detail of the status. * Gets the detail of the status.
* *
* @return the status detail (not null) * @return the status detail
*/ */
public RuleStatusDetail getStatusDetail() { public RuleStatusDetail getStatusDetail() {
return statusDetail; return statusDetail;
@ -96,7 +90,7 @@ public class RuleStatusInfo {
* *
* @return the description * @return the description
*/ */
public String getDescription() { public @Nullable String getDescription() {
return description; return description;
} }
@ -118,7 +112,7 @@ public class RuleStatusInfo {
} }
@Override @Override
public boolean equals(Object obj) { public boolean equals(@Nullable Object obj) {
if (this == obj) { if (this == obj) {
return true; return true;
} }

View File

@ -1,29 +0,0 @@
/**
* Copyright (c) 2010-2022 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.core.automation;
/**
* This interface is used by {@link RuleRegistry} implementation to be notified of changes related to statuses of rules.
*
* @author Yordan Mihaylov - Initial contribution
*/
public interface StatusInfoCallback {
/**
* The method is called when the rule has update of its status.
*
* @param ruleUID UID of the {@link Rule}
* @param statusInfo new status info releated to the {@link Rule}
*/
void statusInfoChanged(String ruleUID, RuleStatusInfo statusInfo);
}

View File

@ -16,6 +16,8 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Action; import org.openhab.core.automation.Action;
import org.openhab.core.automation.util.ModuleBuilder; import org.openhab.core.automation.util.ModuleBuilder;
import org.openhab.core.config.core.Configuration; import org.openhab.core.config.core.Configuration;
@ -26,6 +28,7 @@ import org.openhab.core.config.core.Configuration;
* @author Markus Rathgeb - Initial contribution * @author Markus Rathgeb - Initial contribution
* @author Kai Kreuzer - Changed to using ModuleBuilder * @author Kai Kreuzer - Changed to using ModuleBuilder
*/ */
@NonNullByDefault
public class ActionDTOMapper extends ModuleDTOMapper { public class ActionDTOMapper extends ModuleDTOMapper {
public static ActionDTO map(final Action action) { public static ActionDTO map(final Action action) {
@ -41,9 +44,9 @@ public class ActionDTOMapper extends ModuleDTOMapper {
.withLabel(actionDto.label).withDescription(actionDto.description).build(); .withLabel(actionDto.label).withDescription(actionDto.description).build();
} }
public static List<ActionDTO> map(final Collection<? extends Action> actions) { public static List<ActionDTO> map(final @Nullable Collection<? extends Action> actions) {
if (actions == null) { if (actions == null) {
return null; return List.of();
} }
final List<ActionDTO> dtos = new ArrayList<>(actions.size()); final List<ActionDTO> dtos = new ArrayList<>(actions.size());
for (final Action action : actions) { for (final Action action : actions) {
@ -52,9 +55,9 @@ public class ActionDTOMapper extends ModuleDTOMapper {
return dtos; return dtos;
} }
public static List<Action> mapDto(final Collection<ActionDTO> dtos) { public static List<Action> mapDto(final @Nullable Collection<ActionDTO> dtos) {
if (dtos == null) { if (dtos == null) {
return null; return List.of();
} }
final List<Action> actions = new ArrayList<>(dtos.size()); final List<Action> actions = new ArrayList<>(dtos.size());
for (final ActionDTO dto : dtos) { for (final ActionDTO dto : dtos) {

View File

@ -16,6 +16,8 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.type.ActionType; import org.openhab.core.automation.type.ActionType;
import org.openhab.core.automation.type.CompositeActionType; import org.openhab.core.automation.type.CompositeActionType;
import org.openhab.core.config.core.dto.ConfigDescriptionDTOMapper; import org.openhab.core.config.core.dto.ConfigDescriptionDTOMapper;
@ -26,6 +28,7 @@ import org.openhab.core.config.core.dto.ConfigDescriptionDTOMapper;
* @author Markus Rathgeb - Initial contribution * @author Markus Rathgeb - Initial contribution
* @author Ana Dimova - extends Action Module type DTOs with composites * @author Ana Dimova - extends Action Module type DTOs with composites
*/ */
@NonNullByDefault
public class ActionTypeDTOMapper extends ModuleTypeDTOMapper { public class ActionTypeDTOMapper extends ModuleTypeDTOMapper {
public static ActionTypeDTO map(final ActionType actionType) { public static ActionTypeDTO map(final ActionType actionType) {
@ -51,9 +54,9 @@ public class ActionTypeDTOMapper extends ModuleTypeDTOMapper {
} }
} }
public static List<ActionTypeDTO> map(final Collection<ActionType> types) { public static List<ActionTypeDTO> map(final @Nullable Collection<ActionType> types) {
if (types == null) { if (types == null) {
return null; return List.of();
} }
final List<ActionTypeDTO> dtos = new ArrayList<>(types.size()); final List<ActionTypeDTO> dtos = new ArrayList<>(types.size());
for (final ActionType type : types) { for (final ActionType type : types) {

View File

@ -15,6 +15,8 @@ package org.openhab.core.automation.dto;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Condition; import org.openhab.core.automation.Condition;
import org.openhab.core.automation.util.ModuleBuilder; import org.openhab.core.automation.util.ModuleBuilder;
import org.openhab.core.config.core.Configuration; import org.openhab.core.config.core.Configuration;
@ -25,6 +27,7 @@ import org.openhab.core.config.core.Configuration;
* @author Markus Rathgeb - Initial contribution * @author Markus Rathgeb - Initial contribution
* @author Kai Kreuzer - Changed to using ModuleBuilder * @author Kai Kreuzer - Changed to using ModuleBuilder
*/ */
@NonNullByDefault
public class ConditionDTOMapper extends ModuleDTOMapper { public class ConditionDTOMapper extends ModuleDTOMapper {
public static ConditionDTO map(final Condition condition) { public static ConditionDTO map(final Condition condition) {
@ -40,9 +43,9 @@ public class ConditionDTOMapper extends ModuleDTOMapper {
.withLabel(conditionDto.label).withDescription(conditionDto.description).build(); .withLabel(conditionDto.label).withDescription(conditionDto.description).build();
} }
public static List<ConditionDTO> map(final List<? extends Condition> conditions) { public static List<ConditionDTO> map(final @Nullable List<? extends Condition> conditions) {
if (conditions == null) { if (conditions == null) {
return null; return List.of();
} }
final List<ConditionDTO> dtos = new ArrayList<>(conditions.size()); final List<ConditionDTO> dtos = new ArrayList<>(conditions.size());
for (final Condition action : conditions) { for (final Condition action : conditions) {
@ -51,9 +54,9 @@ public class ConditionDTOMapper extends ModuleDTOMapper {
return dtos; return dtos;
} }
public static List<Condition> mapDto(final List<ConditionDTO> dtos) { public static List<Condition> mapDto(final @Nullable List<ConditionDTO> dtos) {
if (dtos == null) { if (dtos == null) {
return null; return List.of();
} }
final List<Condition> conditions = new ArrayList<>(dtos.size()); final List<Condition> conditions = new ArrayList<>(dtos.size());
for (final ConditionDTO dto : dtos) { for (final ConditionDTO dto : dtos) {

View File

@ -16,6 +16,8 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.type.CompositeConditionType; import org.openhab.core.automation.type.CompositeConditionType;
import org.openhab.core.automation.type.ConditionType; import org.openhab.core.automation.type.ConditionType;
import org.openhab.core.config.core.dto.ConfigDescriptionDTOMapper; import org.openhab.core.config.core.dto.ConfigDescriptionDTOMapper;
@ -26,6 +28,7 @@ import org.openhab.core.config.core.dto.ConfigDescriptionDTOMapper;
* @author Markus Rathgeb - Initial contribution * @author Markus Rathgeb - Initial contribution
* @author Ana Dimova - extends Condition Module type DTOs with composites * @author Ana Dimova - extends Condition Module type DTOs with composites
*/ */
@NonNullByDefault
public class ConditionTypeDTOMapper extends ModuleTypeDTOMapper { public class ConditionTypeDTOMapper extends ModuleTypeDTOMapper {
public static ConditionTypeDTO map(final ConditionType conditionType) { public static ConditionTypeDTO map(final ConditionType conditionType) {
@ -52,9 +55,9 @@ public class ConditionTypeDTOMapper extends ModuleTypeDTOMapper {
} }
} }
public static List<ConditionTypeDTO> map(final Collection<ConditionType> types) { public static List<ConditionTypeDTO> map(final @Nullable Collection<ConditionType> types) {
if (types == null) { if (types == null) {
return null; return List.of();
} }
final List<ConditionTypeDTO> dtos = new ArrayList<>(types.size()); final List<ConditionTypeDTO> dtos = new ArrayList<>(types.size());
for (final ConditionType type : types) { for (final ConditionType type : types) {

View File

@ -12,6 +12,7 @@
*/ */
package org.openhab.core.automation.dto; package org.openhab.core.automation.dto;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.automation.Module; import org.openhab.core.automation.Module;
/** /**
@ -19,6 +20,7 @@ import org.openhab.core.automation.Module;
* *
* @author Markus Rathgeb - Initial contribution * @author Markus Rathgeb - Initial contribution
*/ */
@NonNullByDefault
public class ModuleDTOMapper { public class ModuleDTOMapper {
protected static void fillProperties(final Module from, final ModuleDTO to) { protected static void fillProperties(final Module from, final ModuleDTO to) {

View File

@ -12,6 +12,7 @@
*/ */
package org.openhab.core.automation.dto; package org.openhab.core.automation.dto;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.automation.type.ModuleType; import org.openhab.core.automation.type.ModuleType;
import org.openhab.core.config.core.dto.ConfigDescriptionDTOMapper; import org.openhab.core.config.core.dto.ConfigDescriptionDTOMapper;
@ -20,6 +21,7 @@ import org.openhab.core.config.core.dto.ConfigDescriptionDTOMapper;
* *
* @author Markus Rathgeb - Initial contribution * @author Markus Rathgeb - Initial contribution
*/ */
@NonNullByDefault
public class ModuleTypeDTOMapper { public class ModuleTypeDTOMapper {
protected static void fillProperties(final ModuleType from, final ModuleTypeDTO to) { protected static void fillProperties(final ModuleType from, final ModuleTypeDTO to) {

View File

@ -12,6 +12,7 @@
*/ */
package org.openhab.core.automation.dto; package org.openhab.core.automation.dto;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.automation.Rule; import org.openhab.core.automation.Rule;
import org.openhab.core.automation.util.RuleBuilder; import org.openhab.core.automation.util.RuleBuilder;
import org.openhab.core.config.core.Configuration; import org.openhab.core.config.core.Configuration;
@ -23,6 +24,7 @@ import org.openhab.core.config.core.dto.ConfigDescriptionDTOMapper;
* @author Markus Rathgeb - Initial contribution * @author Markus Rathgeb - Initial contribution
* @author Kai Kreuzer - Changed to using RuleBuilder * @author Kai Kreuzer - Changed to using RuleBuilder
*/ */
@NonNullByDefault
public class RuleDTOMapper { public class RuleDTOMapper {
public static RuleDTO map(final Rule rule) { public static RuleDTO map(final Rule rule) {

View File

@ -16,6 +16,8 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Trigger; import org.openhab.core.automation.Trigger;
import org.openhab.core.automation.util.ModuleBuilder; import org.openhab.core.automation.util.ModuleBuilder;
import org.openhab.core.config.core.Configuration; import org.openhab.core.config.core.Configuration;
@ -26,6 +28,7 @@ import org.openhab.core.config.core.Configuration;
* @author Markus Rathgeb - Initial contribution * @author Markus Rathgeb - Initial contribution
* @author Kai Kreuzer - Changed to using ModuleBuilder * @author Kai Kreuzer - Changed to using ModuleBuilder
*/ */
@NonNullByDefault
public class TriggerDTOMapper extends ModuleDTOMapper { public class TriggerDTOMapper extends ModuleDTOMapper {
public static TriggerDTO map(final Trigger trigger) { public static TriggerDTO map(final Trigger trigger) {
@ -40,9 +43,9 @@ public class TriggerDTOMapper extends ModuleDTOMapper {
.withDescription(triggerDto.description).build(); .withDescription(triggerDto.description).build();
} }
public static List<TriggerDTO> map(final Collection<? extends Trigger> triggers) { public static List<TriggerDTO> map(final @Nullable Collection<? extends Trigger> triggers) {
if (triggers == null) { if (triggers == null) {
return null; return List.of();
} }
final List<TriggerDTO> dtos = new ArrayList<>(triggers.size()); final List<TriggerDTO> dtos = new ArrayList<>(triggers.size());
for (final Trigger trigger : triggers) { for (final Trigger trigger : triggers) {
@ -51,9 +54,9 @@ public class TriggerDTOMapper extends ModuleDTOMapper {
return dtos; return dtos;
} }
public static List<Trigger> mapDto(final Collection<TriggerDTO> dtos) { public static List<Trigger> mapDto(final @Nullable Collection<TriggerDTO> dtos) {
if (dtos == null) { if (dtos == null) {
return null; return List.of();
} }
final List<Trigger> triggers = new ArrayList<>(dtos.size()); final List<Trigger> triggers = new ArrayList<>(dtos.size());
for (final TriggerDTO dto : dtos) { for (final TriggerDTO dto : dtos) {

View File

@ -16,6 +16,8 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.type.CompositeTriggerType; import org.openhab.core.automation.type.CompositeTriggerType;
import org.openhab.core.automation.type.TriggerType; import org.openhab.core.automation.type.TriggerType;
import org.openhab.core.config.core.dto.ConfigDescriptionDTOMapper; import org.openhab.core.config.core.dto.ConfigDescriptionDTOMapper;
@ -26,6 +28,7 @@ import org.openhab.core.config.core.dto.ConfigDescriptionDTOMapper;
* @author Markus Rathgeb - Initial contribution * @author Markus Rathgeb - Initial contribution
* @author Ana Dimova - extends Trigger Module type DTOs with composites * @author Ana Dimova - extends Trigger Module type DTOs with composites
*/ */
@NonNullByDefault
public class TriggerTypeDTOMapper extends ModuleTypeDTOMapper { public class TriggerTypeDTOMapper extends ModuleTypeDTOMapper {
public static TriggerTypeDTO map(final TriggerType triggerType) { public static TriggerTypeDTO map(final TriggerType triggerType) {
@ -51,9 +54,9 @@ public class TriggerTypeDTOMapper extends ModuleTypeDTOMapper {
} }
} }
public static List<TriggerTypeDTO> map(final Collection<TriggerType> types) { public static List<TriggerTypeDTO> map(final @Nullable Collection<TriggerType> types) {
if (types == null) { if (types == null) {
return null; return List.of();
} }
final List<TriggerTypeDTO> dtos = new ArrayList<>(types.size()); final List<TriggerTypeDTO> dtos = new ArrayList<>(types.size());
for (final TriggerType type : types) { for (final TriggerType type : types) {

View File

@ -74,7 +74,7 @@ public abstract class BaseModuleHandlerFactory implements ModuleHandlerFactory {
* *
* @param module the {@link Module} for which a handler should be created. * @param module the {@link Module} for which a handler should be created.
* @param ruleUID the identifier of the {@link Rule} that the given module belongs to. * @param ruleUID the identifier of the {@link Rule} that the given module belongs to.
* @return a {@link ModuleHandler} instance or {@code null} if thins module type is not supported. * @return a {@link ModuleHandler} instance or {@code null} if this module type is not supported.
*/ */
protected abstract @Nullable ModuleHandler internalCreate(Module module, String ruleUID); protected abstract @Nullable ModuleHandler internalCreate(Module module, String ruleUID);

View File

@ -16,7 +16,6 @@ import java.util.Map;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.ModuleHandlerCallback; import org.openhab.core.automation.ModuleHandlerCallback;
import org.openhab.core.automation.Rule; import org.openhab.core.automation.Rule;
import org.openhab.core.automation.Trigger; import org.openhab.core.automation.Trigger;
@ -37,7 +36,19 @@ public interface TriggerHandlerCallback extends ModuleHandlerCallback {
/** /**
* This method is used by the {@link TriggerHandler} to notify the RuleManager when * This method is used by the {@link TriggerHandler} to notify the RuleManager when
* the liked {@link Trigger} instance was fired. * the linked {@link Trigger} instance was fired.
*
* @param trigger instance of trigger which was fired. When one TriggerHandler
* serve more then one {@link Trigger} instances, this parameter
* defines which trigger was fired.
*/
default void triggered(Trigger trigger) {
triggered(trigger, Map.of());
}
/**
* This method is used by the {@link TriggerHandler} to notify the RuleManager when
* the linked {@link Trigger} instance was fired.
* *
* @param trigger instance of trigger which was fired. When one TriggerHandler * @param trigger instance of trigger which was fired. When one TriggerHandler
* serve more then one {@link Trigger} instances, this parameter * serve more then one {@link Trigger} instances, this parameter
@ -49,10 +60,10 @@ public interface TriggerHandlerCallback extends ModuleHandlerCallback {
* <li><code>value</code> - represents output value of the {@link Trigger}'s {@link Output} * <li><code>value</code> - represents output value of the {@link Trigger}'s {@link Output}
* </ul> * </ul>
*/ */
public void triggered(Trigger trigger, @Nullable Map<String, ?> context); void triggered(Trigger trigger, Map<String, ?> context);
/** /**
* @return the scheduler of this rule * @return the scheduler of this rule
*/ */
public ScheduledExecutorService getScheduler(); ScheduledExecutorService getScheduler();
} }

View File

@ -662,7 +662,7 @@ public class RuleEngineImpl implements RuleManager, RegistryChangeListener<Modul
* @param msg provides the {@link RuleStatusInfo} description, corresponding to the new <b>uninitialized</b> * @param msg provides the {@link RuleStatusInfo} description, corresponding to the new <b>uninitialized</b>
* status, should be {@code null} if the status will be skipped. * status, should be {@code null} if the status will be skipped.
*/ */
private void unregister(@Nullable WrappedRule r, @Nullable RuleStatusDetail detail, @Nullable String msg) { private void unregister(@Nullable WrappedRule r, RuleStatusDetail detail, @Nullable String msg) {
if (r != null) { if (r != null) {
unregister(r); unregister(r);
setStatus(r.getUID(), new RuleStatusInfo(RuleStatus.UNINITIALIZED, detail, msg)); setStatus(r.getUID(), new RuleStatusInfo(RuleStatus.UNINITIALIZED, detail, msg));

View File

@ -91,8 +91,12 @@ public class RuleEventFactory extends AbstractEventFactory {
return new RuleUpdatedEvent(topic, payload, source, ruleDTO[0], ruleDTO[1]); return new RuleUpdatedEvent(topic, payload, source, ruleDTO[0], ruleDTO[1]);
} }
@SuppressWarnings("null")
private Event createRuleStatusInfoEvent(String topic, String payload, @Nullable String source) { private Event createRuleStatusInfoEvent(String topic, String payload, @Nullable String source) {
RuleStatusInfo statusInfo = deserializePayload(payload, RuleStatusInfo.class); RuleStatusInfo statusInfo = deserializePayload(payload, RuleStatusInfo.class);
if (statusInfo.getStatus() == null || statusInfo.getStatusDetail() == null) {
throw new IllegalArgumentException("Creation of RuleStatusInfo failed: invalid payload: " + payload);
}
return new RuleStatusInfoEvent(topic, payload, source, statusInfo, getRuleId(topic)); return new RuleStatusInfoEvent(topic, payload, source, statusInfo, getRuleId(topic));
} }

View File

@ -54,7 +54,7 @@ public class TriggerHandlerCallbackImpl implements TriggerHandlerCallback {
} }
@Override @Override
public void triggered(Trigger trigger, @Nullable Map<String, ?> context) { public void triggered(Trigger trigger, Map<String, ?> context) {
synchronized (this) { synchronized (this) {
future = executor.submit(new TriggerData(trigger, context)); future = executor.submit(new TriggerData(trigger, context));
} }

View File

@ -12,6 +12,8 @@
*/ */
package org.openhab.core.automation.internal.commands; package org.openhab.core.automation.internal.commands;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.RuleStatus; import org.openhab.core.automation.RuleStatus;
/** /**
@ -19,6 +21,7 @@ import org.openhab.core.automation.RuleStatus;
* *
* @author Ana Dimova - Initial contribution * @author Ana Dimova - Initial contribution
*/ */
@NonNullByDefault
public class AutomationCommandEnableRule extends AutomationCommand { public class AutomationCommandEnableRule extends AutomationCommand {
/** /**
@ -34,7 +37,7 @@ public class AutomationCommandEnableRule extends AutomationCommand {
/** /**
* This field keeps the specified rule UID. * This field keeps the specified rule UID.
*/ */
private String uid; private @Nullable String uid;
public AutomationCommandEnableRule(String command, String[] parameterValues, int providerType, public AutomationCommandEnableRule(String command, String[] parameterValues, int providerType,
AutomationCommandsPluggable autoCommands) { AutomationCommandsPluggable autoCommands) {
@ -43,9 +46,11 @@ public class AutomationCommandEnableRule extends AutomationCommand {
@Override @Override
public String execute() { public String execute() {
if (parsingResult != SUCCESS) { String uid = this.uid;
if (!SUCCESS.equals(parsingResult) || uid == null) {
return parsingResult; return parsingResult;
} }
if (hasEnable) { if (hasEnable) {
autoCommands.setEnabled(uid, enable); autoCommands.setEnabled(uid, enable);
return SUCCESS; return SUCCESS;

View File

@ -13,11 +13,12 @@
package org.openhab.core.automation.internal.commands; package org.openhab.core.automation.internal.commands;
import java.io.File; import java.io.File;
import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
import java.util.Locale; import java.util.Locale;
import java.util.Set; import java.util.Set;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.parser.Parser; import org.openhab.core.automation.parser.Parser;
/** /**
@ -30,6 +31,7 @@ import org.openhab.core.automation.parser.Parser;
* *
* @author Ana Dimova - Initial contribution * @author Ana Dimova - Initial contribution
*/ */
@NonNullByDefault
public class AutomationCommandExport extends AutomationCommand { public class AutomationCommandExport extends AutomationCommand {
/** /**
@ -47,7 +49,7 @@ public class AutomationCommandExport extends AutomationCommand {
/** /**
* This field keeps the path of the output file where the automation objects to be exported. * This field keeps the path of the output file where the automation objects to be exported.
*/ */
private File file; private @Nullable File file;
/** /**
* This field stores the value of <b>locale</b> parameter of the command. * This field stores the value of <b>locale</b> parameter of the command.
@ -75,46 +77,31 @@ public class AutomationCommandExport extends AutomationCommand {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public String execute() { public String execute() {
if (parsingResult != SUCCESS) { File file = this.file;
if (!SUCCESS.equals(parsingResult) || file == null) {
return parsingResult; return parsingResult;
} }
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
Set set = new HashSet(); Set set = new HashSet();
switch (providerType) { switch (providerType) {
case AutomationCommands.MODULE_TYPE_PROVIDER: case AutomationCommands.MODULE_TYPE_PROVIDER:
@SuppressWarnings("rawtypes") set.addAll(autoCommands.getTriggers(locale));
Collection collection = autoCommands.getTriggers(locale); set.addAll(autoCommands.getConditions(locale));
if (collection != null) { set.addAll(autoCommands.getActions(locale));
set.addAll(collection);
}
collection = autoCommands.getConditions(locale);
if (collection != null) {
set.addAll(collection);
}
collection = autoCommands.getActions(locale);
if (collection != null) {
set.addAll(collection);
}
try { try {
return autoCommands.exportModuleTypes(parserType, set, file); return autoCommands.exportModuleTypes(parserType, set, file);
} catch (Exception e) { } catch (Exception e) {
return getStackTrace(e); return getStackTrace(e);
} }
case AutomationCommands.TEMPLATE_PROVIDER: case AutomationCommands.TEMPLATE_PROVIDER:
collection = autoCommands.getTemplates(locale); set.addAll(autoCommands.getTemplates(locale));
if (collection != null) {
set.addAll(collection);
}
try { try {
return autoCommands.exportTemplates(parserType, set, file); return autoCommands.exportTemplates(parserType, set, file);
} catch (Exception e) { } catch (Exception e) {
return getStackTrace(e); return getStackTrace(e);
} }
case AutomationCommands.RULE_PROVIDER: case AutomationCommands.RULE_PROVIDER:
collection = autoCommands.getRules(); set.addAll(autoCommands.getRules());
if (collection != null) {
set.addAll(collection);
}
try { try {
return autoCommands.exportRules(parserType, set, file); return autoCommands.exportRules(parserType, set, file);
} catch (Exception e) { } catch (Exception e) {
@ -132,7 +119,7 @@ public class AutomationCommandExport extends AutomationCommand {
* @return a {@link File} object created from the string that is passed as a parameter of the command or <b>null</b> * @return a {@link File} object created from the string that is passed as a parameter of the command or <b>null</b>
* if the parent directory could not be found or created or the string could not be parsed. * if the parent directory could not be found or created or the string could not be parsed.
*/ */
private File initFile(String parameterValue) { private @Nullable File initFile(String parameterValue) {
File f = new File(parameterValue); File f = new File(parameterValue);
File parent = f.getParentFile(); File parent = f.getParentFile();
return (parent == null || (!parent.isDirectory() && !parent.mkdirs())) ? null : f; return (parent == null || (!parent.isDirectory() && !parent.mkdirs())) ? null : f;
@ -174,7 +161,8 @@ public class AutomationCommandExport extends AutomationCommand {
} else if (parameterValues[i].charAt(0) == '-') { } else if (parameterValues[i].charAt(0) == '-') {
return String.format("Unsupported option: %s", parameterValues[i]); return String.format("Unsupported option: %s", parameterValues[i]);
} else if (getFile) { } else if (getFile) {
file = initFile(parameterValues[i]); File file = initFile(parameterValues[i]);
this.file = file;
if (file != null) { if (file != null) {
getFile = false; getFile = false;
} }

View File

@ -16,6 +16,8 @@ import java.io.File;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.parser.Parser; import org.openhab.core.automation.parser.Parser;
/** /**
@ -28,6 +30,7 @@ import org.openhab.core.automation.parser.Parser;
* *
* @author Ana Dimova - Initial contribution * @author Ana Dimova - Initial contribution
*/ */
@NonNullByDefault
public class AutomationCommandImport extends AutomationCommand { public class AutomationCommandImport extends AutomationCommand {
/** /**
@ -45,7 +48,7 @@ public class AutomationCommandImport extends AutomationCommand {
/** /**
* This field keeps URL of the source of automation objects that has to be imported. * This field keeps URL of the source of automation objects that has to be imported.
*/ */
private URL url; private @Nullable URL url;
/** /**
* @see AutomationCommand#AutomationCommand(String, String[], int, AutomationCommandsPluggable) * @see AutomationCommand#AutomationCommand(String, String[], int, AutomationCommandsPluggable)
@ -65,7 +68,8 @@ public class AutomationCommandImport extends AutomationCommand {
*/ */
@Override @Override
public String execute() { public String execute() {
if (parsingResult != SUCCESS) { URL url = this.url;
if (!SUCCESS.equals(parsingResult) || url == null) {
return parsingResult; return parsingResult;
} }
try { try {
@ -95,7 +99,7 @@ public class AutomationCommandImport extends AutomationCommand {
* @return an {@link URL} object created from the string that is passed as parameter of the command or <b>null</b> * @return an {@link URL} object created from the string that is passed as parameter of the command or <b>null</b>
* if either no legal protocol could be found in the specified string or the string could not be parsed. * if either no legal protocol could be found in the specified string or the string could not be parsed.
*/ */
private URL initURL(String parameterValue) { private @Nullable URL initURL(String parameterValue) {
try { try {
return new URL(parameterValue); return new URL(parameterValue);
} catch (MalformedURLException mue) { } catch (MalformedURLException mue) {

View File

@ -16,6 +16,8 @@ import java.io.File;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Rule; import org.openhab.core.automation.Rule;
/** /**
@ -31,17 +33,18 @@ import org.openhab.core.automation.Rule;
* @author Kai Kreuzer - fixed feedback when deleting non-existent rule * @author Kai Kreuzer - fixed feedback when deleting non-existent rule
* @author Marin Mitev - removed prefixes in the output * @author Marin Mitev - removed prefixes in the output
*/ */
@NonNullByDefault
public class AutomationCommandRemove extends AutomationCommand { public class AutomationCommandRemove extends AutomationCommand {
/** /**
* This field keeps the UID of the {@link Rule} if command is {@link AutomationCommands#REMOVE_RULE} * This field keeps the UID of the {@link Rule} if command is {@link AutomationCommands#REMOVE_RULE}
*/ */
private String id; private @Nullable String id;
/** /**
* This field keeps URL of the source of automation objects that has to be removed. * This field keeps URL of the source of automation objects that has to be removed.
*/ */
private URL url; private @Nullable URL url;
/** /**
* @see AutomationCommand#AutomationCommand(String, String[], int, AutomationCommandsPluggable) * @see AutomationCommand#AutomationCommand(String, String[], int, AutomationCommandsPluggable)
@ -62,7 +65,9 @@ public class AutomationCommandRemove extends AutomationCommand {
*/ */
@Override @Override
public String execute() { public String execute() {
if (parsingResult != SUCCESS) { String id = this.id;
URL url = this.url;
if (!SUCCESS.equals(parsingResult) || id == null || url == null) {
return parsingResult; return parsingResult;
} }
switch (providerType) { switch (providerType) {
@ -89,7 +94,7 @@ public class AutomationCommandRemove extends AutomationCommand {
* @return an {@link URL} object created from the string that is passed as parameter of the command or <b>null</b> * @return an {@link URL} object created from the string that is passed as parameter of the command or <b>null</b>
* if either no legal protocol could be found in the specified string or the string could not be parsed. * if either no legal protocol could be found in the specified string or the string could not be parsed.
*/ */
private URL initURL(String parameterValue) { private @Nullable URL initURL(String parameterValue) {
try { try {
return new URL(parameterValue); return new URL(parameterValue);
} catch (MalformedURLException mue) { } catch (MalformedURLException mue) {

View File

@ -18,11 +18,14 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import org.eclipse.jdt.annotation.NonNullByDefault;
/** /**
* This class contains methods for facilitating sorting and filtering lists stored in {@link Hashtable}s. * This class contains methods for facilitating sorting and filtering lists stored in {@link Hashtable}s.
* *
* @author Ana Dimova - Initial contribution * @author Ana Dimova - Initial contribution
*/ */
@NonNullByDefault
public class Utils { public class Utils {
/** /**

View File

@ -17,6 +17,8 @@ import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Action; import org.openhab.core.automation.Action;
import org.openhab.core.automation.Condition; import org.openhab.core.automation.Condition;
import org.openhab.core.automation.Module; import org.openhab.core.automation.Module;
@ -48,10 +50,11 @@ import org.openhab.core.automation.util.ReferenceResolver;
* @param <H> type of module handler. It can be {@link TriggerHandler}, {@link ConditionHandler} or * @param <H> type of module handler. It can be {@link TriggerHandler}, {@link ConditionHandler} or
* {@link ActionHandler} * {@link ActionHandler}
*/ */
@NonNullByDefault
public abstract class AbstractCompositeModuleHandler<M extends Module, MT extends ModuleType, H extends ModuleHandler> public abstract class AbstractCompositeModuleHandler<M extends Module, MT extends ModuleType, H extends ModuleHandler>
implements ModuleHandler { implements ModuleHandler {
protected LinkedHashMap<M, H> moduleHandlerMap; protected LinkedHashMap<M, @Nullable H> moduleHandlerMap;
protected M module; protected M module;
protected MT moduleType; protected MT moduleType;
@ -64,7 +67,7 @@ public abstract class AbstractCompositeModuleHandler<M extends Module, MT extend
* @param mapModuleToHandler map containing pairs of child modules instances (defined by module type) and their * @param mapModuleToHandler map containing pairs of child modules instances (defined by module type) and their
* handlers * handlers
*/ */
public AbstractCompositeModuleHandler(M module, MT moduleType, LinkedHashMap<M, H> mapModuleToHandler) { public AbstractCompositeModuleHandler(M module, MT moduleType, LinkedHashMap<M, @Nullable H> mapModuleToHandler) {
this.module = module; this.module = module;
this.moduleType = moduleType; this.moduleType = moduleType;
this.moduleHandlerMap = mapModuleToHandler; this.moduleHandlerMap = mapModuleToHandler;
@ -102,17 +105,20 @@ public abstract class AbstractCompositeModuleHandler<M extends Module, MT extend
childHandler.dispose(); childHandler.dispose();
} }
} }
moduleHandlerMap = null; moduleHandlerMap.clear();
} }
@Override @Override
public void setCallback(ModuleHandlerCallback callback) { public void setCallback(ModuleHandlerCallback callback) {
List<M> children = getChildren(); List<M> children = getChildren();
for (M child : children) { for (M child : children) {
@Nullable
H handler = moduleHandlerMap.get(child); H handler = moduleHandlerMap.get(child);
if (handler != null) {
handler.setCallback(callback); handler.setCallback(callback);
} }
} }
}
protected abstract List<M> getChildren(); protected abstract List<M> getChildren();
} }

View File

@ -20,6 +20,8 @@ import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Action; import org.openhab.core.automation.Action;
import org.openhab.core.automation.handler.ActionHandler; import org.openhab.core.automation.handler.ActionHandler;
import org.openhab.core.automation.type.CompositeActionType; import org.openhab.core.automation.type.CompositeActionType;
@ -34,6 +36,7 @@ import org.openhab.core.automation.util.ReferenceResolver;
* *
* @author Yordan Mihaylov - Initial contribution * @author Yordan Mihaylov - Initial contribution
*/ */
@NonNullByDefault
public class CompositeActionHandler extends AbstractCompositeModuleHandler<Action, CompositeActionType, ActionHandler> public class CompositeActionHandler extends AbstractCompositeModuleHandler<Action, CompositeActionType, ActionHandler>
implements ActionHandler { implements ActionHandler {
@ -50,7 +53,7 @@ public class CompositeActionHandler extends AbstractCompositeModuleHandler<Actio
* @param ruleUID UID of rule where the parent action is part of. * @param ruleUID UID of rule where the parent action is part of.
*/ */
public CompositeActionHandler(Action action, CompositeActionType mt, public CompositeActionHandler(Action action, CompositeActionType mt,
LinkedHashMap<Action, ActionHandler> mapModuleToHandler, String ruleUID) { LinkedHashMap<Action, @Nullable ActionHandler> mapModuleToHandler, String ruleUID) {
super(action, mt, mapModuleToHandler); super(action, mt, mapModuleToHandler);
compositeOutputs = getCompositeOutputMap(moduleType.getOutputs()); compositeOutputs = getCompositeOutputMap(moduleType.getOutputs());
} }
@ -61,14 +64,14 @@ public class CompositeActionHandler extends AbstractCompositeModuleHandler<Actio
* @see org.openhab.core.automation.handler.ActionHandler#execute(java.util.Map) * @see org.openhab.core.automation.handler.ActionHandler#execute(java.util.Map)
*/ */
@Override @Override
public Map<String, Object> execute(Map<String, Object> context) { public @Nullable Map<String, Object> execute(Map<String, Object> context) {
final Map<String, Object> result = new HashMap<>(); final Map<String, Object> result = new HashMap<>();
final List<Action> children = getChildren(); final List<Action> children = getChildren();
final Map<String, Object> compositeContext = getCompositeContext(context); final Map<String, Object> compositeContext = getCompositeContext(context);
for (Action child : children) { for (Action child : children) {
ActionHandler childHandler = moduleHandlerMap.get(child); ActionHandler childHandler = moduleHandlerMap.get(child);
Map<String, Object> childContext = Collections.unmodifiableMap(getChildContext(child, compositeContext)); Map<String, Object> childContext = Collections.unmodifiableMap(getChildContext(child, compositeContext));
Map<String, Object> childResults = childHandler.execute(childContext); Map<String, Object> childResults = childHandler == null ? null : childHandler.execute(childContext);
if (childResults != null) { if (childResults != null) {
for (Entry<String, Object> childResult : childResults.entrySet()) { for (Entry<String, Object> childResult : childResults.entrySet()) {
String childOuputName = child.getId() + "." + childResult.getKey(); String childOuputName = child.getId() + "." + childResult.getKey();
@ -91,7 +94,7 @@ public class CompositeActionHandler extends AbstractCompositeModuleHandler<Actio
} }
/** /**
* Create a map of links between child outputs and parent outputs. These links are base on the refecences defined in * Create a map of links between child outputs and parent outputs. These links are base on the references defined in
* the outputs of parent action. * the outputs of parent action.
* *
* @param outputs outputs of the parent action. The action of {@link CompositeActionType} * @param outputs outputs of the parent action. The action of {@link CompositeActionType}
@ -99,7 +102,6 @@ public class CompositeActionHandler extends AbstractCompositeModuleHandler<Actio
*/ */
protected Map<String, Output> getCompositeOutputMap(List<Output> outputs) { protected Map<String, Output> getCompositeOutputMap(List<Output> outputs) {
Map<String, Output> result = new HashMap<>(11); Map<String, Output> result = new HashMap<>(11);
if (outputs != null) {
for (Output output : outputs) { for (Output output : outputs) {
String refs = output.getReference(); String refs = output.getReference();
if (refs != null) { if (refs != null) {
@ -118,7 +120,6 @@ public class CompositeActionHandler extends AbstractCompositeModuleHandler<Actio
} }
} }
} }
}
return result; return result;
} }

View File

@ -17,6 +17,8 @@ import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Condition; import org.openhab.core.automation.Condition;
import org.openhab.core.automation.handler.ConditionHandler; import org.openhab.core.automation.handler.ConditionHandler;
import org.openhab.core.automation.type.CompositeConditionType; import org.openhab.core.automation.type.CompositeConditionType;
@ -28,12 +30,13 @@ import org.openhab.core.automation.type.CompositeConditionType;
* *
* @author Yordan Mihaylov - Initial contribution * @author Yordan Mihaylov - Initial contribution
*/ */
@NonNullByDefault
public class CompositeConditionHandler public class CompositeConditionHandler
extends AbstractCompositeModuleHandler<Condition, CompositeConditionType, ConditionHandler> extends AbstractCompositeModuleHandler<Condition, CompositeConditionType, ConditionHandler>
implements ConditionHandler { implements ConditionHandler {
public CompositeConditionHandler(Condition condition, CompositeConditionType mt, public CompositeConditionHandler(Condition condition, CompositeConditionType mt,
LinkedHashMap<Condition, ConditionHandler> mapModuleToHandler, String ruleUID) { LinkedHashMap<Condition, @Nullable ConditionHandler> mapModuleToHandler, String ruleUID) {
super(condition, mt, mapModuleToHandler); super(condition, mt, mapModuleToHandler);
} }

View File

@ -19,6 +19,8 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Action; import org.openhab.core.automation.Action;
import org.openhab.core.automation.Condition; import org.openhab.core.automation.Condition;
import org.openhab.core.automation.Module; import org.openhab.core.automation.Module;
@ -53,6 +55,7 @@ import org.slf4j.LoggerFactory;
* *
* @author Yordan Mihaylov - Initial contribution * @author Yordan Mihaylov - Initial contribution
*/ */
@NonNullByDefault
public class CompositeModuleHandlerFactory extends BaseModuleHandlerFactory implements ModuleHandlerFactory { public class CompositeModuleHandlerFactory extends BaseModuleHandlerFactory implements ModuleHandlerFactory {
private final ModuleTypeRegistry mtRegistry; private final ModuleTypeRegistry mtRegistry;
@ -116,13 +119,13 @@ public class CompositeModuleHandlerFactory extends BaseModuleHandlerFactory impl
} }
@Override @Override
public ModuleHandler internalCreate(Module module, String ruleUID) { public @Nullable ModuleHandler internalCreate(Module module, String ruleUID) {
ModuleHandler handler = null; ModuleHandler handler = null;
String moduleType = module.getTypeUID(); String moduleType = module.getTypeUID();
ModuleType mt = mtRegistry.get(moduleType); ModuleType mt = mtRegistry.get(moduleType);
if (mt instanceof CompositeTriggerType) { if (mt instanceof CompositeTriggerType) {
List<Trigger> childModules = ((CompositeTriggerType) mt).getChildren(); List<Trigger> childModules = ((CompositeTriggerType) mt).getChildren();
LinkedHashMap<Trigger, TriggerHandler> mapModuleToHandler = getChildHandlers(module.getId(), LinkedHashMap<Trigger, @Nullable TriggerHandler> mapModuleToHandler = getChildHandlers(module.getId(),
module.getConfiguration(), childModules, ruleUID); module.getConfiguration(), childModules, ruleUID);
if (mapModuleToHandler != null) { if (mapModuleToHandler != null) {
handler = new CompositeTriggerHandler((Trigger) module, (CompositeTriggerType) mt, mapModuleToHandler, handler = new CompositeTriggerHandler((Trigger) module, (CompositeTriggerType) mt, mapModuleToHandler,
@ -130,7 +133,7 @@ public class CompositeModuleHandlerFactory extends BaseModuleHandlerFactory impl
} }
} else if (mt instanceof CompositeConditionType) { } else if (mt instanceof CompositeConditionType) {
List<Condition> childModules = ((CompositeConditionType) mt).getChildren(); List<Condition> childModules = ((CompositeConditionType) mt).getChildren();
LinkedHashMap<Condition, ConditionHandler> mapModuleToHandler = getChildHandlers(module.getId(), LinkedHashMap<Condition, @Nullable ConditionHandler> mapModuleToHandler = getChildHandlers(module.getId(),
module.getConfiguration(), childModules, ruleUID); module.getConfiguration(), childModules, ruleUID);
if (mapModuleToHandler != null) { if (mapModuleToHandler != null) {
handler = new CompositeConditionHandler((Condition) module, (CompositeConditionType) mt, handler = new CompositeConditionHandler((Condition) module, (CompositeConditionType) mt,
@ -138,7 +141,7 @@ public class CompositeModuleHandlerFactory extends BaseModuleHandlerFactory impl
} }
} else if (mt instanceof CompositeActionType) { } else if (mt instanceof CompositeActionType) {
List<Action> childModules = ((CompositeActionType) mt).getChildren(); List<Action> childModules = ((CompositeActionType) mt).getChildren();
LinkedHashMap<Action, ActionHandler> mapModuleToHandler = getChildHandlers(module.getId(), LinkedHashMap<Action, @Nullable ActionHandler> mapModuleToHandler = getChildHandlers(module.getId(),
module.getConfiguration(), childModules, ruleUID); module.getConfiguration(), childModules, ruleUID);
if (mapModuleToHandler != null) { if (mapModuleToHandler != null) {
handler = new CompositeActionHandler((Action) module, (CompositeActionType) mt, mapModuleToHandler, handler = new CompositeActionHandler((Action) module, (CompositeActionType) mt, mapModuleToHandler,
@ -170,8 +173,8 @@ public class CompositeModuleHandlerFactory extends BaseModuleHandlerFactory impl
* handler. * handler.
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private <T extends Module, MT extends ModuleHandler> LinkedHashMap<T, MT> getChildHandlers(String compositeModuleId, private <T extends Module, @Nullable MT extends ModuleHandler> @Nullable LinkedHashMap<T, MT> getChildHandlers(
Configuration compositeConfig, List<T> childModules, String childModulePrefix) { String compositeModuleId, Configuration compositeConfig, List<T> childModules, String childModulePrefix) {
LinkedHashMap<T, MT> mapModuleToHandler = new LinkedHashMap<>(); LinkedHashMap<T, MT> mapModuleToHandler = new LinkedHashMap<>();
for (T child : childModules) { for (T child : childModules) {
String ruleId = getRuleId(childModulePrefix); String ruleId = getRuleId(childModulePrefix);

View File

@ -19,6 +19,7 @@ import java.util.Map;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.ModuleHandlerCallback; import org.openhab.core.automation.ModuleHandlerCallback;
import org.openhab.core.automation.RuleStatus; import org.openhab.core.automation.RuleStatus;
@ -38,11 +39,12 @@ import org.openhab.core.automation.util.ReferenceResolver;
* *
* @author Yordan Mihaylov - Initial contribution * @author Yordan Mihaylov - Initial contribution
*/ */
@NonNullByDefault
public class CompositeTriggerHandler public class CompositeTriggerHandler
extends AbstractCompositeModuleHandler<Trigger, CompositeTriggerType, TriggerHandler> extends AbstractCompositeModuleHandler<Trigger, CompositeTriggerType, TriggerHandler>
implements TriggerHandler, TriggerHandlerCallback { implements TriggerHandler, TriggerHandlerCallback {
private TriggerHandlerCallback callback; private @NonNullByDefault({}) TriggerHandlerCallback callback;
/** /**
* Constructor of this system handler. * Constructor of this system handler.
@ -53,7 +55,7 @@ public class CompositeTriggerHandler
* @param ruleUID UID of rule where the parent trigger is part of * @param ruleUID UID of rule where the parent trigger is part of
*/ */
public CompositeTriggerHandler(Trigger trigger, CompositeTriggerType mt, public CompositeTriggerHandler(Trigger trigger, CompositeTriggerType mt,
LinkedHashMap<Trigger, TriggerHandler> mapModuleToHandler, String ruleUID) { LinkedHashMap<Trigger, @Nullable TriggerHandler> mapModuleToHandler, String ruleUID) {
super(trigger, mt, mapModuleToHandler); super(trigger, mt, mapModuleToHandler);
} }
@ -125,10 +127,12 @@ public class CompositeTriggerHandler
List<Trigger> children = getChildren(); List<Trigger> children = getChildren();
for (Trigger child : children) { for (Trigger child : children) {
TriggerHandler handler = moduleHandlerMap.get(child); TriggerHandler handler = moduleHandlerMap.get(child);
if (handler != null) {
handler.setCallback(this); handler.setCallback(this);
} }
} }
} }
}
@Override @Override
public void dispose() { public void dispose() {
@ -142,7 +146,7 @@ public class CompositeTriggerHandler
} }
@Override @Override
public Boolean isEnabled(String ruleUID) { public @Nullable Boolean isEnabled(String ruleUID) {
return callback.isEnabled(ruleUID); return callback.isEnabled(ruleUID);
} }
@ -152,12 +156,12 @@ public class CompositeTriggerHandler
} }
@Override @Override
public RuleStatusInfo getStatusInfo(String ruleUID) { public @Nullable RuleStatusInfo getStatusInfo(String ruleUID) {
return callback.getStatusInfo(ruleUID); return callback.getStatusInfo(ruleUID);
} }
@Override @Override
public RuleStatus getStatus(String ruleUID) { public @Nullable RuleStatus getStatus(String ruleUID) {
return callback.getStatus(ruleUID); return callback.getStatus(ruleUID);
} }
@ -167,7 +171,7 @@ public class CompositeTriggerHandler
} }
@Override @Override
public void runNow(String uid, boolean considerConditions, Map<String, Object> context) { public void runNow(String uid, boolean considerConditions, @Nullable Map<String, Object> context) {
callback.runNow(uid, considerConditions, context); callback.runNow(uid, considerConditions, context);
} }
} }

View File

@ -15,6 +15,8 @@ package org.openhab.core.automation.internal.module.factory;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Action; import org.openhab.core.automation.Action;
import org.openhab.core.automation.Condition; import org.openhab.core.automation.Condition;
import org.openhab.core.automation.Module; import org.openhab.core.automation.Module;
@ -55,6 +57,7 @@ import org.slf4j.LoggerFactory;
* @author Kai Kreuzer - refactored and simplified customized module handling * @author Kai Kreuzer - refactored and simplified customized module handling
*/ */
@Component @Component
@NonNullByDefault
public class CoreModuleHandlerFactory extends BaseModuleHandlerFactory implements ModuleHandlerFactory { public class CoreModuleHandlerFactory extends BaseModuleHandlerFactory implements ModuleHandlerFactory {
private final Logger logger = LoggerFactory.getLogger(CoreModuleHandlerFactory.class); private final Logger logger = LoggerFactory.getLogger(CoreModuleHandlerFactory.class);
@ -76,8 +79,11 @@ public class CoreModuleHandlerFactory extends BaseModuleHandlerFactory implement
private BundleContext bundleContext; private BundleContext bundleContext;
@Activate @Activate
protected void activate(BundleContext bundleContext) { public CoreModuleHandlerFactory(BundleContext bundleContext, final @Reference EventPublisher eventPublisher,
final @Reference ItemRegistry itemRegistry) {
this.bundleContext = bundleContext; this.bundleContext = bundleContext;
this.eventPublisher = eventPublisher;
this.itemRegistry = itemRegistry;
} }
@Override @Override
@ -91,78 +97,8 @@ public class CoreModuleHandlerFactory extends BaseModuleHandlerFactory implement
return TYPES; return TYPES;
} }
/**
* the itemRegistry was added (called by serviceTracker)
*
* @param itemRegistry
*/
@Reference
protected void setItemRegistry(ItemRegistry itemRegistry) {
this.itemRegistry = itemRegistry;
for (ModuleHandler handler : getHandlers().values()) {
if (handler instanceof ItemStateConditionHandler) {
((ItemStateConditionHandler) handler).setItemRegistry(this.itemRegistry);
} else if (handler instanceof ItemCommandActionHandler) {
((ItemCommandActionHandler) handler).setItemRegistry(this.itemRegistry);
} else if (handler instanceof GroupCommandTriggerHandler) {
((GroupCommandTriggerHandler) handler).setItemRegistry(this.itemRegistry);
} else if (handler instanceof GroupStateTriggerHandler) {
((GroupStateTriggerHandler) handler).setItemRegistry(this.itemRegistry);
}
}
}
/**
* unsetter for itemRegistry (called by serviceTracker)
*
* @param itemRegistry
*/
protected void unsetItemRegistry(ItemRegistry itemRegistry) {
for (ModuleHandler handler : getHandlers().values()) {
if (handler instanceof ItemStateConditionHandler) {
((ItemStateConditionHandler) handler).unsetItemRegistry(this.itemRegistry);
} else if (handler instanceof ItemCommandActionHandler) {
((ItemCommandActionHandler) handler).unsetItemRegistry(this.itemRegistry);
} else if (handler instanceof GroupCommandTriggerHandler) {
((GroupCommandTriggerHandler) handler).unsetItemRegistry(this.itemRegistry);
} else if (handler instanceof GroupStateTriggerHandler) {
((GroupStateTriggerHandler) handler).unsetItemRegistry(this.itemRegistry);
}
}
this.itemRegistry = null;
}
/**
* setter for the eventPublisher (called by serviceTracker)
*
* @param eventPublisher
*/
@Reference
protected void setEventPublisher(EventPublisher eventPublisher) {
this.eventPublisher = eventPublisher;
for (ModuleHandler handler : getHandlers().values()) {
if (handler instanceof ItemCommandActionHandler) {
((ItemCommandActionHandler) handler).setEventPublisher(eventPublisher);
}
}
}
/**
* unsetter for eventPublisher (called by serviceTracker)
*
* @param eventPublisher
*/
protected void unsetEventPublisher(EventPublisher eventPublisher) {
this.eventPublisher = null;
for (ModuleHandler handler : getHandlers().values()) {
if (handler instanceof ItemCommandActionHandler) {
((ItemCommandActionHandler) handler).unsetEventPublisher(eventPublisher);
}
}
}
@Override @Override
protected synchronized ModuleHandler internalCreate(final Module module, final String ruleUID) { protected synchronized @Nullable ModuleHandler internalCreate(final Module module, final String ruleUID) {
logger.trace("create {} -> {} : {}", module.getId(), module.getTypeUID(), ruleUID); logger.trace("create {} -> {} : {}", module.getId(), module.getTypeUID(), ruleUID);
final String moduleTypeUID = module.getTypeUID(); final String moduleTypeUID = module.getTypeUID();
if (module instanceof Trigger) { if (module instanceof Trigger) {
@ -182,22 +118,15 @@ public class CoreModuleHandlerFactory extends BaseModuleHandlerFactory implement
|| ItemStateTriggerHandler.UPDATE_MODULE_TYPE_ID.equals(moduleTypeUID)) { || ItemStateTriggerHandler.UPDATE_MODULE_TYPE_ID.equals(moduleTypeUID)) {
return new ItemStateTriggerHandler((Trigger) module, bundleContext); return new ItemStateTriggerHandler((Trigger) module, bundleContext);
} else if (GroupCommandTriggerHandler.MODULE_TYPE_ID.equals(moduleTypeUID)) { } else if (GroupCommandTriggerHandler.MODULE_TYPE_ID.equals(moduleTypeUID)) {
final GroupCommandTriggerHandler handler = new GroupCommandTriggerHandler((Trigger) module, return new GroupCommandTriggerHandler((Trigger) module, bundleContext, itemRegistry);
bundleContext);
handler.setItemRegistry(itemRegistry);
return handler;
} else if (GroupStateTriggerHandler.CHANGE_MODULE_TYPE_ID.equals(moduleTypeUID) } else if (GroupStateTriggerHandler.CHANGE_MODULE_TYPE_ID.equals(moduleTypeUID)
|| GroupStateTriggerHandler.UPDATE_MODULE_TYPE_ID.equals(moduleTypeUID)) { || GroupStateTriggerHandler.UPDATE_MODULE_TYPE_ID.equals(moduleTypeUID)) {
final GroupStateTriggerHandler handler = new GroupStateTriggerHandler((Trigger) module, bundleContext); return new GroupStateTriggerHandler((Trigger) module, bundleContext, itemRegistry);
handler.setItemRegistry(itemRegistry);
return handler;
} }
} else if (module instanceof Condition) { } else if (module instanceof Condition) {
// Handle conditions // Handle conditions
if (ItemStateConditionHandler.ITEM_STATE_CONDITION.equals(moduleTypeUID)) { if (ItemStateConditionHandler.ITEM_STATE_CONDITION.equals(moduleTypeUID)) {
ItemStateConditionHandler handler = new ItemStateConditionHandler((Condition) module); return new ItemStateConditionHandler((Condition) module, itemRegistry);
handler.setItemRegistry(itemRegistry);
return handler;
} else if (GenericEventConditionHandler.MODULETYPE_ID.equals(moduleTypeUID)) { } else if (GenericEventConditionHandler.MODULETYPE_ID.equals(moduleTypeUID)) {
return new GenericEventConditionHandler((Condition) module); return new GenericEventConditionHandler((Condition) module);
} else if (CompareConditionHandler.MODULE_TYPE.equals(moduleTypeUID)) { } else if (CompareConditionHandler.MODULE_TYPE.equals(moduleTypeUID)) {
@ -206,10 +135,7 @@ public class CoreModuleHandlerFactory extends BaseModuleHandlerFactory implement
} else if (module instanceof Action) { } else if (module instanceof Action) {
// Handle actions // Handle actions
if (ItemCommandActionHandler.ITEM_COMMAND_ACTION.equals(moduleTypeUID)) { if (ItemCommandActionHandler.ITEM_COMMAND_ACTION.equals(moduleTypeUID)) {
final ItemCommandActionHandler postCommandActionHandler = new ItemCommandActionHandler((Action) module); return new ItemCommandActionHandler((Action) module, eventPublisher, itemRegistry);
postCommandActionHandler.setEventPublisher(eventPublisher);
postCommandActionHandler.setItemRegistry(itemRegistry);
return postCommandActionHandler;
} else if (ItemStateUpdateActionHandler.ITEM_STATE_UPDATE_ACTION.equals(moduleTypeUID)) { } else if (ItemStateUpdateActionHandler.ITEM_STATE_UPDATE_ACTION.equals(moduleTypeUID)) {
return new ItemStateUpdateActionHandler((Action) module, eventPublisher, itemRegistry); return new ItemStateUpdateActionHandler((Action) module, eventPublisher, itemRegistry);
} else if (RuleEnablementActionHandler.UID.equals(moduleTypeUID)) { } else if (RuleEnablementActionHandler.UID.equals(moduleTypeUID)) {

View File

@ -21,6 +21,8 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Action; import org.openhab.core.automation.Action;
import org.openhab.core.automation.annotation.ActionInput; import org.openhab.core.automation.annotation.ActionInput;
import org.openhab.core.automation.handler.BaseActionModuleHandler; import org.openhab.core.automation.handler.BaseActionModuleHandler;
@ -35,6 +37,7 @@ import org.slf4j.LoggerFactory;
* *
* @author Stefan Triller - Initial contribution * @author Stefan Triller - Initial contribution
*/ */
@NonNullByDefault
public class AnnotationActionHandler extends BaseActionModuleHandler { public class AnnotationActionHandler extends BaseActionModuleHandler {
private static final String MODULE_RESULT = "result"; private static final String MODULE_RESULT = "result";
@ -54,11 +57,11 @@ public class AnnotationActionHandler extends BaseActionModuleHandler {
} }
@Override @Override
public Map<String, Object> execute(Map<String, Object> context) { public @Nullable Map<String, Object> execute(Map<String, Object> context) {
Map<String, Object> output = new HashMap<>(); Map<String, Object> output = new HashMap<>();
Annotation[][] annotations = method.getParameterAnnotations(); Annotation[][] annotations = method.getParameterAnnotations();
List<Object> args = new ArrayList<>(); List<@Nullable Object> args = new ArrayList<>();
for (int i = 0; i < annotations.length; i++) { for (int i = 0; i < annotations.length; i++) {
Annotation[] annotationsOnParam = annotations[i]; Annotation[] annotationsOnParam = annotations[i];
@ -90,6 +93,7 @@ public class AnnotationActionHandler extends BaseActionModuleHandler {
if (result != null) { if (result != null) {
if (result instanceof Map<?, ?>) { if (result instanceof Map<?, ?>) {
try { try {
@SuppressWarnings("unchecked")
Map<String, Object> resultMap = (Map<String, Object>) result; Map<String, Object> resultMap = (Map<String, Object>) result;
for (Entry<String, Object> entry : resultMap.entrySet()) { for (Entry<String, Object> entry : resultMap.entrySet()) {
if (hasOutput(moduleType, entry.getKey())) { if (hasOutput(moduleType, entry.getKey())) {

View File

@ -86,6 +86,7 @@ public class ChannelEventTriggerHandler extends BaseTriggerModuleHandler impleme
if (event instanceof ChannelTriggeredEvent) { if (event instanceof ChannelTriggeredEvent) {
ChannelTriggeredEvent cte = (ChannelTriggeredEvent) event; ChannelTriggeredEvent cte = (ChannelTriggeredEvent) event;
if (channelUID.equals(cte.getChannel())) { if (channelUID.equals(cte.getChannel())) {
String eventOnChannel = this.eventOnChannel;
logger.trace("->FILTER: {}:{}", cte.getEvent(), eventOnChannel); logger.trace("->FILTER: {}:{}", cte.getEvent(), eventOnChannel);
eventMatches = eventOnChannel == null || eventOnChannel.isBlank() eventMatches = eventOnChannel == null || eventOnChannel.isBlank()
|| eventOnChannel.equals(cte.getEvent()); || eventOnChannel.equals(cte.getEvent());

View File

@ -17,6 +17,7 @@ import java.lang.reflect.Method;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Condition; import org.openhab.core.automation.Condition;
import org.openhab.core.automation.handler.BaseConditionModuleHandler; import org.openhab.core.automation.handler.BaseConditionModuleHandler;
@ -31,6 +32,7 @@ import org.slf4j.LoggerFactory;
* *
* @author Benedikt Niehues - Initial contribution * @author Benedikt Niehues - Initial contribution
*/ */
@NonNullByDefault
public class CompareConditionHandler extends BaseConditionModuleHandler { public class CompareConditionHandler extends BaseConditionModuleHandler {
public static final String MODULE_TYPE = "core.GenericCompareCondition"; public static final String MODULE_TYPE = "core.GenericCompareCondition";
@ -47,7 +49,7 @@ public class CompareConditionHandler extends BaseConditionModuleHandler {
} }
@Override @Override
public boolean isSatisfied(Map<String, Object> context) { public boolean isSatisfied(Map<String, @Nullable Object> context) {
Object operatorObj = this.module.getConfiguration().get(OPERATOR); Object operatorObj = this.module.getConfiguration().get(OPERATOR);
String operator = (operatorObj != null && operatorObj instanceof String) ? (String) operatorObj : null; String operator = (operatorObj != null && operatorObj instanceof String) ? (String) operatorObj : null;
Object rightObj = this.module.getConfiguration().get(RIGHT_OP); Object rightObj = this.module.getConfiguration().get(RIGHT_OP);
@ -151,7 +153,7 @@ public class CompareConditionHandler extends BaseConditionModuleHandler {
throw new UncomparableException(); throw new UncomparableException();
} }
private @Nullable Object getRightOperandValue(String rightOperandString2, Object toCompare) { private @Nullable Object getRightOperandValue(String rightOperandString2, @Nullable Object toCompare) {
if ("null".equals(rightOperandString2)) { if ("null".equals(rightOperandString2)) {
return rightOperandString2; return rightOperandString2;
} }
@ -169,7 +171,7 @@ public class CompareConditionHandler extends BaseConditionModuleHandler {
return null; return null;
} }
private Object getCompareValue(Object leftObj, String leftObjFieldName) { private @Nullable Object getCompareValue(@Nullable Object leftObj, @Nullable String leftObjFieldName) {
if (leftObj == null || leftObjFieldName == null || leftObjFieldName.isEmpty() || leftObj instanceof String if (leftObj == null || leftObjFieldName == null || leftObjFieldName.isEmpty() || leftObj instanceof String
|| leftObj instanceof Integer || leftObj instanceof Long || leftObj instanceof Double) { || leftObj instanceof Integer || leftObj instanceof Long || leftObj instanceof Double) {
return leftObj; return leftObj;

View File

@ -18,6 +18,7 @@ import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.automation.Condition; import org.openhab.core.automation.Condition;
import org.openhab.core.automation.handler.BaseConditionModuleHandler; import org.openhab.core.automation.handler.BaseConditionModuleHandler;
import org.openhab.core.automation.handler.TimeBasedConditionHandler; import org.openhab.core.automation.handler.TimeBasedConditionHandler;
@ -29,6 +30,7 @@ import org.slf4j.LoggerFactory;
* *
* @author Kai Kreuzer - Initial contribution * @author Kai Kreuzer - Initial contribution
*/ */
@NonNullByDefault
public class DayOfWeekConditionHandler extends BaseConditionModuleHandler implements TimeBasedConditionHandler { public class DayOfWeekConditionHandler extends BaseConditionModuleHandler implements TimeBasedConditionHandler {
public static final String MODULE_TYPE_ID = "timer.DayOfWeekCondition"; public static final String MODULE_TYPE_ID = "timer.DayOfWeekCondition";

View File

@ -64,20 +64,20 @@ public class EphemerisConditionHandler extends BaseModuleHandler<Condition> impl
@Override @Override
public boolean isSatisfiedAt(ZonedDateTime time) { public boolean isSatisfiedAt(ZonedDateTime time) {
time = time.plusDays(offset); // Apply offset to time ZonedDateTime offsetTime = time.plusDays(offset); // Apply offset to time
switch (module.getTypeUID()) { switch (module.getTypeUID()) {
case HOLIDAY_MODULE_TYPE_ID: case HOLIDAY_MODULE_TYPE_ID:
return ephemerisManager.isBankHoliday(time); return ephemerisManager.isBankHoliday(offsetTime);
case NOT_HOLIDAY_MODULE_TYPE_ID: case NOT_HOLIDAY_MODULE_TYPE_ID:
return !ephemerisManager.isBankHoliday(time); return !ephemerisManager.isBankHoliday(offsetTime);
case WEEKEND_MODULE_TYPE_ID: case WEEKEND_MODULE_TYPE_ID:
return ephemerisManager.isWeekend(time); return ephemerisManager.isWeekend(offsetTime);
case WEEKDAY_MODULE_TYPE_ID: case WEEKDAY_MODULE_TYPE_ID:
return !ephemerisManager.isWeekend(time); return !ephemerisManager.isWeekend(offsetTime);
case DAYSET_MODULE_TYPE_ID: case DAYSET_MODULE_TYPE_ID:
final String dayset = this.dayset; final String dayset = this.dayset;
if (dayset != null) { if (dayset != null) {
return ephemerisManager.isInDayset(dayset, time); return ephemerisManager.isInDayset(dayset, offsetTime);
} }
break; break;
} }

View File

@ -12,6 +12,8 @@
*/ */
package org.openhab.core.automation.internal.module.handler; package org.openhab.core.automation.internal.module.handler;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.ModuleHandlerCallback; import org.openhab.core.automation.ModuleHandlerCallback;
import org.openhab.core.automation.Trigger; import org.openhab.core.automation.Trigger;
import org.openhab.core.automation.handler.BaseTriggerModuleHandler; import org.openhab.core.automation.handler.BaseTriggerModuleHandler;
@ -32,6 +34,7 @@ import org.slf4j.LoggerFactory;
* @author Christoph Knauf - Initial contribution * @author Christoph Knauf - Initial contribution
* @author Yordan Mihaylov - Remove Quarz lib dependency * @author Yordan Mihaylov - Remove Quarz lib dependency
*/ */
@NonNullByDefault
public class GenericCronTriggerHandler extends BaseTriggerModuleHandler public class GenericCronTriggerHandler extends BaseTriggerModuleHandler
implements SchedulerRunnable, TimeBasedTriggerHandler { implements SchedulerRunnable, TimeBasedTriggerHandler {
@ -45,7 +48,7 @@ public class GenericCronTriggerHandler extends BaseTriggerModuleHandler
private final CronScheduler scheduler; private final CronScheduler scheduler;
private final String expression; private final String expression;
private ScheduledCompletableFuture<?> schedule; private @Nullable ScheduledCompletableFuture<?> schedule;
public GenericCronTriggerHandler(Trigger module, CronScheduler scheduler) { public GenericCronTriggerHandler(Trigger module, CronScheduler scheduler) {
super(module); super(module);
@ -77,7 +80,7 @@ public class GenericCronTriggerHandler extends BaseTriggerModuleHandler
@Override @Override
public void run() { public void run() {
if (callback != null) { if (callback != null) {
((TriggerHandlerCallback) callback).triggered(module, null); ((TriggerHandlerCallback) callback).triggered(module);
} else { } else {
logger.debug("Tried to trigger, but callback isn't available!"); logger.debug("Tried to trigger, but callback isn't available!");
} }

View File

@ -14,6 +14,8 @@ package org.openhab.core.automation.internal.module.handler;
import java.util.Map; import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Condition; import org.openhab.core.automation.Condition;
import org.openhab.core.automation.handler.BaseConditionModuleHandler; import org.openhab.core.automation.handler.BaseConditionModuleHandler;
import org.openhab.core.events.Event; import org.openhab.core.events.Event;
@ -26,6 +28,7 @@ import org.slf4j.LoggerFactory;
* @author Benedikt Niehues - Initial contribution * @author Benedikt Niehues - Initial contribution
* @author Kai Kreuzer - refactored and simplified customized module handling * @author Kai Kreuzer - refactored and simplified customized module handling
*/ */
@NonNullByDefault
public class GenericEventConditionHandler extends BaseConditionModuleHandler { public class GenericEventConditionHandler extends BaseConditionModuleHandler {
public static final String MODULETYPE_ID = "core.GenericEventCondition"; public static final String MODULETYPE_ID = "core.GenericEventCondition";
@ -41,7 +44,7 @@ public class GenericEventConditionHandler extends BaseConditionModuleHandler {
super(module); super(module);
} }
private boolean isConfiguredAndMatches(String keyParam, String value) { private boolean isConfiguredAndMatches(String keyParam, @Nullable String value) {
Object mo = module.getConfiguration().get(keyParam); Object mo = module.getConfiguration().get(keyParam);
String configValue = mo != null && mo instanceof String ? (String) mo : null; String configValue = mo != null && mo instanceof String ? (String) mo : null;
if (configValue != null) { if (configValue != null) {

View File

@ -18,6 +18,9 @@ import java.util.Hashtable;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.ModuleHandlerCallback;
import org.openhab.core.automation.Trigger; import org.openhab.core.automation.Trigger;
import org.openhab.core.automation.handler.BaseTriggerModuleHandler; import org.openhab.core.automation.handler.BaseTriggerModuleHandler;
import org.openhab.core.automation.handler.TriggerHandlerCallback; import org.openhab.core.automation.handler.TriggerHandlerCallback;
@ -41,6 +44,7 @@ import org.slf4j.LoggerFactory;
* @author Benedikt Niehues - Initial contribution * @author Benedikt Niehues - Initial contribution
* @author Kai Kreuzer - refactored and simplified customized module handling * @author Kai Kreuzer - refactored and simplified customized module handling
*/ */
@NonNullByDefault
public class GenericEventTriggerHandler extends BaseTriggerModuleHandler implements EventSubscriber, EventFilter { public class GenericEventTriggerHandler extends BaseTriggerModuleHandler implements EventSubscriber, EventFilter {
public static final String MODULE_TYPE_ID = "core.GenericEventTrigger"; public static final String MODULE_TYPE_ID = "core.GenericEventTrigger";
@ -56,7 +60,7 @@ public class GenericEventTriggerHandler extends BaseTriggerModuleHandler impleme
private final Set<String> types; private final Set<String> types;
private final BundleContext bundleContext; private final BundleContext bundleContext;
private ServiceRegistration<?> eventSubscriberRegistration; private @Nullable ServiceRegistration<?> eventSubscriberRegistration;
public GenericEventTriggerHandler(Trigger module, BundleContext bundleContext) { public GenericEventTriggerHandler(Trigger module, BundleContext bundleContext) {
super(module); super(module);
@ -81,12 +85,13 @@ public class GenericEventTriggerHandler extends BaseTriggerModuleHandler impleme
} }
@Override @Override
public EventFilter getEventFilter() { public @Nullable EventFilter getEventFilter() {
return this; return this;
} }
@Override @Override
public void receive(Event event) { public void receive(Event event) {
ModuleHandlerCallback callback = this.callback;
if (callback != null) { if (callback != null) {
logger.trace("Received Event: Source: {} Topic: {} Type: {} Payload: {}", event.getSource(), logger.trace("Received Event: Source: {} Topic: {} Type: {} Payload: {}", event.getSource(),
event.getTopic(), event.getType(), event.getPayload()); event.getTopic(), event.getType(), event.getPayload());

View File

@ -53,6 +53,7 @@ public class GroupCommandTriggerHandler extends BaseTriggerModuleHandler impleme
private final Set<String> types; private final Set<String> types;
private final BundleContext bundleContext; private final BundleContext bundleContext;
private final ItemRegistry itemRegistry;
public static final String MODULE_TYPE_ID = "core.GroupCommandTrigger"; public static final String MODULE_TYPE_ID = "core.GroupCommandTrigger";
@ -60,14 +61,14 @@ public class GroupCommandTriggerHandler extends BaseTriggerModuleHandler impleme
public static final String CFG_COMMAND = "command"; public static final String CFG_COMMAND = "command";
private ServiceRegistration<?> eventSubscriberRegistration; private ServiceRegistration<?> eventSubscriberRegistration;
private @Nullable ItemRegistry itemRegistry;
public GroupCommandTriggerHandler(Trigger module, BundleContext bundleContext) { public GroupCommandTriggerHandler(Trigger module, BundleContext bundleContext, ItemRegistry itemRegistry) {
super(module); super(module);
this.groupName = (String) module.getConfiguration().get(CFG_GROUPNAME); this.groupName = (String) module.getConfiguration().get(CFG_GROUPNAME);
this.command = (String) module.getConfiguration().get(CFG_COMMAND); this.command = (String) module.getConfiguration().get(CFG_COMMAND);
this.types = Set.of(ItemCommandEvent.TYPE); this.types = Set.of(ItemCommandEvent.TYPE);
this.bundleContext = bundleContext; this.bundleContext = bundleContext;
this.itemRegistry = itemRegistry;
Dictionary<String, Object> properties = new Hashtable<>(); Dictionary<String, Object> properties = new Hashtable<>();
this.topic = "openhab/items/"; this.topic = "openhab/items/";
properties.put("event.topics", topic); properties.put("event.topics", topic);
@ -95,9 +96,9 @@ public class GroupCommandTriggerHandler extends BaseTriggerModuleHandler impleme
if (event instanceof ItemCommandEvent) { if (event instanceof ItemCommandEvent) {
ItemCommandEvent icEvent = (ItemCommandEvent) event; ItemCommandEvent icEvent = (ItemCommandEvent) event;
String itemName = icEvent.getItemName(); String itemName = icEvent.getItemName();
if (itemRegistry != null) {
Item item = itemRegistry.get(itemName); Item item = itemRegistry.get(itemName);
if (item != null && item.getGroupNames().contains(groupName)) { if (item != null && item.getGroupNames().contains(groupName)) {
String command = this.command;
Command itemCommand = icEvent.getItemCommand(); Command itemCommand = icEvent.getItemCommand();
if (command == null || command.equals(itemCommand.toFullString())) { if (command == null || command.equals(itemCommand.toFullString())) {
values.put("triggeringItem", item); values.put("triggeringItem", item);
@ -109,7 +110,6 @@ public class GroupCommandTriggerHandler extends BaseTriggerModuleHandler impleme
} }
} }
} }
}
/** /**
* do the cleanup: unregistering eventSubscriber... * do the cleanup: unregistering eventSubscriber...
@ -125,12 +125,4 @@ public class GroupCommandTriggerHandler extends BaseTriggerModuleHandler impleme
logger.trace("->FILTER: {}", event.getTopic()); logger.trace("->FILTER: {}", event.getTopic());
return event.getTopic().startsWith(topic); return event.getTopic().startsWith(topic);
} }
public void setItemRegistry(ItemRegistry itemRegistry) {
this.itemRegistry = itemRegistry;
}
public void unsetItemRegistry(ItemRegistry itemRegistry) {
this.itemRegistry = null;
}
} }

View File

@ -61,11 +61,11 @@ public class GroupStateTriggerHandler extends BaseTriggerModuleHandler implement
private final String previousState; private final String previousState;
private Set<String> types; private Set<String> types;
private final BundleContext bundleContext; private final BundleContext bundleContext;
private @Nullable ItemRegistry itemRegistry; private ItemRegistry itemRegistry;
private ServiceRegistration<?> eventSubscriberRegistration; private ServiceRegistration<?> eventSubscriberRegistration;
public GroupStateTriggerHandler(Trigger module, BundleContext bundleContext) { public GroupStateTriggerHandler(Trigger module, BundleContext bundleContext, ItemRegistry itemRegistry) {
super(module); super(module);
this.groupName = (String) module.getConfiguration().get(CFG_GROUPNAME); this.groupName = (String) module.getConfiguration().get(CFG_GROUPNAME);
this.state = (String) module.getConfiguration().get(CFG_STATE); this.state = (String) module.getConfiguration().get(CFG_STATE);
@ -76,6 +76,7 @@ public class GroupStateTriggerHandler extends BaseTriggerModuleHandler implement
this.types = Set.of(ItemStateChangedEvent.TYPE, GroupItemStateChangedEvent.TYPE); this.types = Set.of(ItemStateChangedEvent.TYPE, GroupItemStateChangedEvent.TYPE);
} }
this.bundleContext = bundleContext; this.bundleContext = bundleContext;
this.itemRegistry = itemRegistry;
Dictionary<String, Object> properties = new Hashtable<>(); Dictionary<String, Object> properties = new Hashtable<>();
properties.put("event.topics", "openhab/items/*"); properties.put("event.topics", "openhab/items/*");
eventSubscriberRegistration = this.bundleContext.registerService(EventSubscriber.class.getName(), this, eventSubscriberRegistration = this.bundleContext.registerService(EventSubscriber.class.getName(), this,
@ -101,7 +102,6 @@ public class GroupStateTriggerHandler extends BaseTriggerModuleHandler implement
if (event instanceof ItemStateEvent && UPDATE_MODULE_TYPE_ID.equals(module.getTypeUID())) { if (event instanceof ItemStateEvent && UPDATE_MODULE_TYPE_ID.equals(module.getTypeUID())) {
ItemStateEvent isEvent = (ItemStateEvent) event; ItemStateEvent isEvent = (ItemStateEvent) event;
String itemName = isEvent.getItemName(); String itemName = isEvent.getItemName();
if (itemRegistry != null) {
Item item = itemRegistry.get(itemName); Item item = itemRegistry.get(itemName);
if (item != null && item.getGroupNames().contains(groupName)) { if (item != null && item.getGroupNames().contains(groupName)) {
State state = isEvent.getItemState(); State state = isEvent.getItemState();
@ -113,11 +113,9 @@ public class GroupStateTriggerHandler extends BaseTriggerModuleHandler implement
cb.triggered(this.module, values); cb.triggered(this.module, values);
} }
} }
}
} else if (event instanceof ItemStateChangedEvent && CHANGE_MODULE_TYPE_ID.equals(module.getTypeUID())) { } else if (event instanceof ItemStateChangedEvent && CHANGE_MODULE_TYPE_ID.equals(module.getTypeUID())) {
ItemStateChangedEvent iscEvent = (ItemStateChangedEvent) event; ItemStateChangedEvent iscEvent = (ItemStateChangedEvent) event;
String itemName = iscEvent.getItemName(); String itemName = iscEvent.getItemName();
if (itemRegistry != null) {
Item item = itemRegistry.get(itemName); Item item = itemRegistry.get(itemName);
if (item != null && item.getGroupNames().contains(groupName)) { if (item != null && item.getGroupNames().contains(groupName)) {
State state = iscEvent.getItemState(); State state = iscEvent.getItemState();
@ -135,7 +133,6 @@ public class GroupStateTriggerHandler extends BaseTriggerModuleHandler implement
} }
} }
} }
}
private boolean stateMatches(@Nullable String requiredState, State state) { private boolean stateMatches(@Nullable String requiredState, State state) {
if (requiredState == null) { if (requiredState == null) {
@ -160,12 +157,4 @@ public class GroupStateTriggerHandler extends BaseTriggerModuleHandler implement
logger.trace("->FILTER: {}:{}", event.getTopic(), groupName); logger.trace("->FILTER: {}:{}", event.getTopic(), groupName);
return event.getTopic().startsWith("openhab/items/"); return event.getTopic().startsWith("openhab/items/");
} }
public void setItemRegistry(ItemRegistry itemRegistry) {
this.itemRegistry = itemRegistry;
}
public void unsetItemRegistry(ItemRegistry itemRegistry) {
this.itemRegistry = null;
}
} }

View File

@ -14,6 +14,8 @@ package org.openhab.core.automation.internal.module.handler;
import java.util.Map; import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Action; import org.openhab.core.automation.Action;
import org.openhab.core.automation.handler.BaseActionModuleHandler; import org.openhab.core.automation.handler.BaseActionModuleHandler;
import org.openhab.core.events.EventPublisher; import org.openhab.core.events.EventPublisher;
@ -34,6 +36,7 @@ import org.slf4j.LoggerFactory;
* @author Kai Kreuzer - refactored and simplified customized module handling * @author Kai Kreuzer - refactored and simplified customized module handling
* @author Stefan Triller - use command from input first and if not set, use command from configuration * @author Stefan Triller - use command from input first and if not set, use command from configuration
*/ */
@NonNullByDefault
public class ItemCommandActionHandler extends BaseActionModuleHandler { public class ItemCommandActionHandler extends BaseActionModuleHandler {
public static final String ITEM_COMMAND_ACTION = "core.ItemCommandAction"; public static final String ITEM_COMMAND_ACTION = "core.ItemCommandAction";
@ -42,8 +45,8 @@ public class ItemCommandActionHandler extends BaseActionModuleHandler {
private final Logger logger = LoggerFactory.getLogger(ItemCommandActionHandler.class); private final Logger logger = LoggerFactory.getLogger(ItemCommandActionHandler.class);
private ItemRegistry itemRegistry; private final EventPublisher eventPublisher;
private EventPublisher eventPublisher; private final ItemRegistry itemRegistry;
/** /**
* constructs a new ItemCommandActionHandler * constructs a new ItemCommandActionHandler
@ -51,58 +54,18 @@ public class ItemCommandActionHandler extends BaseActionModuleHandler {
* @param module * @param module
* @param moduleTypes * @param moduleTypes
*/ */
public ItemCommandActionHandler(Action module) { public ItemCommandActionHandler(Action module, EventPublisher eventPublisher, ItemRegistry itemRegistry) {
super(module); super(module);
} this.eventPublisher = eventPublisher;
/**
* setter for itemRegistry, used by DS
*
* @param itemRegistry
*/
public void setItemRegistry(ItemRegistry itemRegistry) {
this.itemRegistry = itemRegistry; this.itemRegistry = itemRegistry;
} }
/**
* unsetter for itemRegistry, used by DS
*
* @param itemRegistry
*/
public void unsetItemRegistry(ItemRegistry itemRegistry) {
this.itemRegistry = null;
}
/**
* setter for eventPublisher used by DS
*
* @param eventPublisher
*/
public void setEventPublisher(EventPublisher eventPublisher) {
this.eventPublisher = eventPublisher;
}
/**
* unsetter for eventPublisher used by DS
*
* @param eventPublisher
*/
public void unsetEventPublisher(EventPublisher eventPublisher) {
this.eventPublisher = null;
}
@Override @Override
public void dispose() { public @Nullable Map<String, Object> execute(Map<String, Object> inputs) {
this.eventPublisher = null;
this.itemRegistry = null;
}
@Override
public Map<String, Object> execute(Map<String, Object> inputs) {
String itemName = (String) module.getConfiguration().get(ITEM_NAME); String itemName = (String) module.getConfiguration().get(ITEM_NAME);
String command = (String) module.getConfiguration().get(COMMAND); String command = (String) module.getConfiguration().get(COMMAND);
if (itemName != null && eventPublisher != null && itemRegistry != null) { if (itemName != null) {
try { try {
Item item = itemRegistry.getItem(itemName); Item item = itemRegistry.getItem(itemName);

View File

@ -18,6 +18,9 @@ import java.util.Hashtable;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.ModuleHandlerCallback;
import org.openhab.core.automation.Trigger; import org.openhab.core.automation.Trigger;
import org.openhab.core.automation.handler.BaseTriggerModuleHandler; import org.openhab.core.automation.handler.BaseTriggerModuleHandler;
import org.openhab.core.automation.handler.TriggerHandlerCallback; import org.openhab.core.automation.handler.TriggerHandlerCallback;
@ -38,6 +41,7 @@ import org.slf4j.LoggerFactory;
* *
* @author Kai Kreuzer - Initial contribution * @author Kai Kreuzer - Initial contribution
*/ */
@NonNullByDefault
public class ItemCommandTriggerHandler extends BaseTriggerModuleHandler implements EventSubscriber, EventFilter { public class ItemCommandTriggerHandler extends BaseTriggerModuleHandler implements EventSubscriber, EventFilter {
public static final String MODULE_TYPE_ID = "core.ItemCommandTrigger"; public static final String MODULE_TYPE_ID = "core.ItemCommandTrigger";
@ -48,13 +52,13 @@ public class ItemCommandTriggerHandler extends BaseTriggerModuleHandler implemen
private final Logger logger = LoggerFactory.getLogger(ItemCommandTriggerHandler.class); private final Logger logger = LoggerFactory.getLogger(ItemCommandTriggerHandler.class);
private final String itemName; private final String itemName;
private final String command; private final @Nullable String command;
private final String topic; private final String topic;
private final Set<String> types; private final Set<String> types;
private final BundleContext bundleContext; private final BundleContext bundleContext;
private ServiceRegistration<?> eventSubscriberRegistration; private @Nullable ServiceRegistration<?> eventSubscriberRegistration;
public ItemCommandTriggerHandler(Trigger module, BundleContext bundleContext) { public ItemCommandTriggerHandler(Trigger module, BundleContext bundleContext) {
super(module); super(module);
@ -75,20 +79,22 @@ public class ItemCommandTriggerHandler extends BaseTriggerModuleHandler implemen
} }
@Override @Override
public EventFilter getEventFilter() { public @Nullable EventFilter getEventFilter() {
return this; return this;
} }
@Override @Override
public void receive(Event event) { public void receive(Event event) {
ModuleHandlerCallback callback = this.callback;
if (callback != null) { if (callback != null) {
logger.trace("Received Event: Source: {} Topic: {} Type: {} Payload: {}", event.getSource(), logger.trace("Received Event: Source: {} Topic: {} Type: {} Payload: {}", event.getSource(),
event.getTopic(), event.getType(), event.getPayload()); event.getTopic(), event.getType(), event.getPayload());
Map<String, Object> values = new HashMap<>(); Map<String, Object> values = new HashMap<>();
if (event instanceof ItemCommandEvent) { if (event instanceof ItemCommandEvent) {
Command command = ((ItemCommandEvent) event).getItemCommand(); String command = this.command;
if (this.command == null || this.command.equals(command.toFullString())) { Command itemCommand = ((ItemCommandEvent) event).getItemCommand();
values.put("command", command); if (command == null || command.equals(itemCommand.toFullString())) {
values.put("command", itemCommand);
values.put("event", event); values.put("event", event);
((TriggerHandlerCallback) callback).triggered(this.module, values); ((TriggerHandlerCallback) callback).triggered(this.module, values);
} }

View File

@ -15,7 +15,6 @@ package org.openhab.core.automation.internal.module.handler;
import java.util.Map; import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Condition; import org.openhab.core.automation.Condition;
import org.openhab.core.automation.handler.BaseConditionModuleHandler; import org.openhab.core.automation.handler.BaseConditionModuleHandler;
import org.openhab.core.items.Item; import org.openhab.core.items.Item;
@ -49,35 +48,13 @@ public class ItemStateConditionHandler extends BaseConditionModuleHandler {
public static final String ITEM_STATE_CONDITION = "core.ItemStateCondition"; public static final String ITEM_STATE_CONDITION = "core.ItemStateCondition";
private @Nullable ItemRegistry itemRegistry; private final ItemRegistry itemRegistry;
public ItemStateConditionHandler(Condition condition) { public ItemStateConditionHandler(Condition condition, ItemRegistry itemRegistry) {
super(condition); super(condition);
}
/**
* setter for itemRegistry, used by DS
*
* @param itemRegistry
*/
public void setItemRegistry(ItemRegistry itemRegistry) {
this.itemRegistry = itemRegistry; this.itemRegistry = itemRegistry;
} }
/**
* unsetter for itemRegistry used by DS
*
* @param itemRegistry
*/
public void unsetItemRegistry(ItemRegistry itemRegistry) {
this.itemRegistry = null;
}
@Override
public void dispose() {
itemRegistry = null;
}
@Override @Override
public boolean isSatisfied(Map<String, Object> inputs) { public boolean isSatisfied(Map<String, Object> inputs) {
String itemName = (String) module.getConfiguration().get(ITEM_NAME); String itemName = (String) module.getConfiguration().get(ITEM_NAME);
@ -88,10 +65,6 @@ public class ItemStateConditionHandler extends BaseConditionModuleHandler {
state); state);
return false; return false;
} }
if (itemRegistry == null) {
logger.error("The ItemRegistry is not available to evaluate the condition.");
return false;
}
try { try {
logger.debug("ItemStateCondition '{}' checking if {} {} {}", module.getId(), itemName, operator, state); logger.debug("ItemStateCondition '{}' checking if {} {} {}", module.getId(), itemName, operator, state);
switch (operator) { switch (operator) {
@ -174,7 +147,6 @@ public class ItemStateConditionHandler extends BaseConditionModuleHandler {
return false; return false;
} }
@SuppressWarnings("null")
private boolean equalsToItemState(String itemName, String state) throws ItemNotFoundException { private boolean equalsToItemState(String itemName, String state) throws ItemNotFoundException {
Item item = itemRegistry.getItem(itemName); Item item = itemRegistry.getItem(itemName);
State compareState = TypeParser.parseState(item.getAcceptedDataTypes(), state); State compareState = TypeParser.parseState(item.getAcceptedDataTypes(), state);

View File

@ -18,6 +18,9 @@ import java.util.Hashtable;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.ModuleHandlerCallback;
import org.openhab.core.automation.Trigger; import org.openhab.core.automation.Trigger;
import org.openhab.core.automation.handler.BaseTriggerModuleHandler; import org.openhab.core.automation.handler.BaseTriggerModuleHandler;
import org.openhab.core.automation.handler.TriggerHandlerCallback; import org.openhab.core.automation.handler.TriggerHandlerCallback;
@ -41,6 +44,7 @@ import org.slf4j.LoggerFactory;
* @author Kai Kreuzer - Initial contribution * @author Kai Kreuzer - Initial contribution
* @author Simon Merschjohann - Initial contribution * @author Simon Merschjohann - Initial contribution
*/ */
@NonNullByDefault
public class ItemStateTriggerHandler extends BaseTriggerModuleHandler implements EventSubscriber, EventFilter { public class ItemStateTriggerHandler extends BaseTriggerModuleHandler implements EventSubscriber, EventFilter {
public static final String UPDATE_MODULE_TYPE_ID = "core.ItemStateUpdateTrigger"; public static final String UPDATE_MODULE_TYPE_ID = "core.ItemStateUpdateTrigger";
@ -53,12 +57,12 @@ public class ItemStateTriggerHandler extends BaseTriggerModuleHandler implements
private final Logger logger = LoggerFactory.getLogger(ItemStateTriggerHandler.class); private final Logger logger = LoggerFactory.getLogger(ItemStateTriggerHandler.class);
private final String itemName; private final String itemName;
private final String state; private final @Nullable String state;
private final String previousState; private final String previousState;
private Set<String> types; private Set<String> types;
private final BundleContext bundleContext; private final BundleContext bundleContext;
private ServiceRegistration<?> eventSubscriberRegistration; private @Nullable ServiceRegistration<?> eventSubscriberRegistration;
public ItemStateTriggerHandler(Trigger module, BundleContext bundleContext) { public ItemStateTriggerHandler(Trigger module, BundleContext bundleContext) {
super(module); super(module);
@ -83,28 +87,30 @@ public class ItemStateTriggerHandler extends BaseTriggerModuleHandler implements
} }
@Override @Override
public EventFilter getEventFilter() { public @Nullable EventFilter getEventFilter() {
return this; return this;
} }
@Override @Override
public void receive(Event event) { public void receive(Event event) {
ModuleHandlerCallback callback = this.callback;
if (callback != null) { if (callback != null) {
logger.trace("Received Event: Source: {} Topic: {} Type: {} Payload: {}", event.getSource(), logger.trace("Received Event: Source: {} Topic: {} Type: {} Payload: {}", event.getSource(),
event.getTopic(), event.getType(), event.getPayload()); event.getTopic(), event.getType(), event.getPayload());
Map<String, Object> values = new HashMap<>(); Map<String, Object> values = new HashMap<>();
if (event instanceof ItemStateEvent && UPDATE_MODULE_TYPE_ID.equals(module.getTypeUID())) { if (event instanceof ItemStateEvent && UPDATE_MODULE_TYPE_ID.equals(module.getTypeUID())) {
State state = ((ItemStateEvent) event).getItemState(); String state = this.state;
if ((this.state == null || this.state.equals(state.toFullString()))) { State itemState = ((ItemStateEvent) event).getItemState();
values.put("state", state); if ((state == null || state.equals(itemState.toFullString()))) {
values.put("state", itemState);
} }
} else if (event instanceof ItemStateChangedEvent && CHANGE_MODULE_TYPE_ID.equals(module.getTypeUID())) { } else if (event instanceof ItemStateChangedEvent && CHANGE_MODULE_TYPE_ID.equals(module.getTypeUID())) {
State state = ((ItemStateChangedEvent) event).getItemState(); State itemState = ((ItemStateChangedEvent) event).getItemState();
State oldState = ((ItemStateChangedEvent) event).getOldItemState(); State oldItemState = ((ItemStateChangedEvent) event).getOldItemState();
if (stateMatches(this.state, state) && stateMatches(this.previousState, oldState)) { if (stateMatches(this.state, itemState) && stateMatches(this.previousState, oldItemState)) {
values.put("oldState", oldState); values.put("oldState", oldItemState);
values.put("newState", state); values.put("newState", itemState);
} }
} }
if (!values.isEmpty()) { if (!values.isEmpty()) {
@ -114,7 +120,7 @@ public class ItemStateTriggerHandler extends BaseTriggerModuleHandler implements
} }
} }
private boolean stateMatches(String requiredState, State state) { private boolean stateMatches(@Nullable String requiredState, State state) {
if (requiredState == null) { if (requiredState == null) {
return true; return true;
} }

View File

@ -15,6 +15,8 @@ package org.openhab.core.automation.internal.module.handler;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Action; import org.openhab.core.automation.Action;
import org.openhab.core.automation.RuleRegistry; import org.openhab.core.automation.RuleRegistry;
import org.openhab.core.automation.handler.BaseActionModuleHandler; import org.openhab.core.automation.handler.BaseActionModuleHandler;
@ -41,6 +43,7 @@ import org.slf4j.LoggerFactory;
* @author Plamen Peev - Initial contribution * @author Plamen Peev - Initial contribution
* @author Kai Kreuzer - use rule engine instead of registry * @author Kai Kreuzer - use rule engine instead of registry
*/ */
@NonNullByDefault
public class RuleEnablementActionHandler extends BaseActionModuleHandler { public class RuleEnablementActionHandler extends BaseActionModuleHandler {
/** /**
@ -91,7 +94,7 @@ public class RuleEnablementActionHandler extends BaseActionModuleHandler {
} }
@Override @Override
public Map<String, Object> execute(Map<String, Object> context) { public @Nullable Map<String, Object> execute(Map<String, Object> context) {
for (String uid : uids) { for (String uid : uids) {
if (callback != null) { if (callback != null) {
callback.setEnabled(uid, enable); callback.setEnabled(uid, enable);

View File

@ -15,6 +15,8 @@ package org.openhab.core.automation.internal.module.handler;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Action; import org.openhab.core.automation.Action;
import org.openhab.core.automation.handler.BaseActionModuleHandler; import org.openhab.core.automation.handler.BaseActionModuleHandler;
import org.openhab.core.config.core.Configuration; import org.openhab.core.config.core.Configuration;
@ -39,6 +41,7 @@ import org.slf4j.LoggerFactory;
* @author Benedikt Niehues - Initial contribution * @author Benedikt Niehues - Initial contribution
* @author Kai Kreuzer - use rule engine instead of registry * @author Kai Kreuzer - use rule engine instead of registry
*/ */
@NonNullByDefault
public class RunRuleActionHandler extends BaseActionModuleHandler { public class RunRuleActionHandler extends BaseActionModuleHandler {
/** /**
@ -86,7 +89,7 @@ public class RunRuleActionHandler extends BaseActionModuleHandler {
} }
@Override @Override
public Map<String, Object> execute(Map<String, Object> context) { public @Nullable Map<String, Object> execute(Map<String, Object> context) {
// execute each rule after the other; at the moment synchronously // execute each rule after the other; at the moment synchronously
for (String uid : ruleUIDs) { for (String uid : ruleUIDs) {
if (callback != null) { if (callback != null) {

View File

@ -17,6 +17,8 @@ import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.Map; import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Condition; import org.openhab.core.automation.Condition;
import org.openhab.core.automation.handler.BaseConditionModuleHandler; import org.openhab.core.automation.handler.BaseConditionModuleHandler;
import org.openhab.core.automation.handler.TimeBasedConditionHandler; import org.openhab.core.automation.handler.TimeBasedConditionHandler;
@ -29,6 +31,7 @@ import org.slf4j.LoggerFactory;
* *
* @author Dominik Schlierf - Initial contribution * @author Dominik Schlierf - Initial contribution
*/ */
@NonNullByDefault
public class TimeOfDayConditionHandler extends BaseConditionModuleHandler implements TimeBasedConditionHandler { public class TimeOfDayConditionHandler extends BaseConditionModuleHandler implements TimeBasedConditionHandler {
public static final String MODULE_TYPE_ID = "core.TimeOfDayCondition"; public static final String MODULE_TYPE_ID = "core.TimeOfDayCondition";
@ -45,11 +48,11 @@ public class TimeOfDayConditionHandler extends BaseConditionModuleHandler implem
/** /**
* The start time of the user configured time span. * The start time of the user configured time span.
*/ */
private final LocalTime startTime; private final @Nullable LocalTime startTime;
/** /**
* The end time of the user configured time span. * The end time of the user configured time span.
*/ */
private final LocalTime endTime; private final @Nullable LocalTime endTime;
public TimeOfDayConditionHandler(Condition condition) { public TimeOfDayConditionHandler(Condition condition) {
super(condition); super(condition);
@ -67,6 +70,8 @@ public class TimeOfDayConditionHandler extends BaseConditionModuleHandler implem
@Override @Override
public boolean isSatisfiedAt(ZonedDateTime time) { public boolean isSatisfiedAt(ZonedDateTime time) {
LocalTime startTime = this.startTime;
LocalTime endTime = this.endTime;
if (startTime == null || endTime == null) { if (startTime == null || endTime == null) {
logger.warn("Time condition with id {} is not well configured: startTime={} endTime = {}", module.getId(), logger.warn("Time condition with id {} is not well configured: startTime={} endTime = {}", module.getId(),
startTime, endTime); startTime, endTime);

View File

@ -14,6 +14,8 @@ package org.openhab.core.automation.internal.module.handler;
import java.text.MessageFormat; import java.text.MessageFormat;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.ModuleHandlerCallback; import org.openhab.core.automation.ModuleHandlerCallback;
import org.openhab.core.automation.Trigger; import org.openhab.core.automation.Trigger;
import org.openhab.core.automation.handler.BaseTriggerModuleHandler; import org.openhab.core.automation.handler.BaseTriggerModuleHandler;
@ -32,6 +34,7 @@ import org.slf4j.LoggerFactory;
* *
* @author Kai Kreuzer - Initial contribution * @author Kai Kreuzer - Initial contribution
*/ */
@NonNullByDefault
public class TimeOfDayTriggerHandler extends BaseTriggerModuleHandler public class TimeOfDayTriggerHandler extends BaseTriggerModuleHandler
implements SchedulerRunnable, TimeBasedTriggerHandler { implements SchedulerRunnable, TimeBasedTriggerHandler {
@ -44,7 +47,7 @@ public class TimeOfDayTriggerHandler extends BaseTriggerModuleHandler
private final CronScheduler scheduler; private final CronScheduler scheduler;
private final String expression; private final String expression;
private ScheduledCompletableFuture<?> schedule; private @Nullable ScheduledCompletableFuture<?> schedule;
public TimeOfDayTriggerHandler(Trigger module, CronScheduler scheduler) { public TimeOfDayTriggerHandler(Trigger module, CronScheduler scheduler) {
super(module); super(module);
@ -80,7 +83,7 @@ public class TimeOfDayTriggerHandler extends BaseTriggerModuleHandler
@Override @Override
public void run() { public void run() {
if (callback != null) { if (callback != null) {
((TriggerHandlerCallback) callback).triggered(module, null); ((TriggerHandlerCallback) callback).triggered(module);
} else { } else {
logger.debug("Tried to trigger, but callback isn't available!"); logger.debug("Tried to trigger, but callback isn't available!");
} }

View File

@ -15,6 +15,8 @@ package org.openhab.core.automation.internal.module.handler;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Condition; import org.openhab.core.automation.Condition;
import org.openhab.core.automation.Module; import org.openhab.core.automation.Module;
import org.openhab.core.automation.Trigger; import org.openhab.core.automation.Trigger;
@ -22,6 +24,7 @@ import org.openhab.core.automation.handler.BaseModuleHandlerFactory;
import org.openhab.core.automation.handler.ModuleHandler; import org.openhab.core.automation.handler.ModuleHandler;
import org.openhab.core.automation.handler.ModuleHandlerFactory; import org.openhab.core.automation.handler.ModuleHandlerFactory;
import org.openhab.core.scheduler.CronScheduler; import org.openhab.core.scheduler.CronScheduler;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate; import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Reference; import org.osgi.service.component.annotations.Reference;
@ -35,6 +38,7 @@ import org.slf4j.LoggerFactory;
* @author Christoph Knauf - Initial contribution * @author Christoph Knauf - Initial contribution
* @author Kai Kreuzer - added new module types * @author Kai Kreuzer - added new module types
*/ */
@NonNullByDefault
@Component(immediate = true, service = ModuleHandlerFactory.class) @Component(immediate = true, service = ModuleHandlerFactory.class)
public class TimerModuleHandlerFactory extends BaseModuleHandlerFactory { public class TimerModuleHandlerFactory extends BaseModuleHandlerFactory {
@ -45,7 +49,12 @@ public class TimerModuleHandlerFactory extends BaseModuleHandlerFactory {
.asList(new String[] { GenericCronTriggerHandler.MODULE_TYPE_ID, TimeOfDayTriggerHandler.MODULE_TYPE_ID, .asList(new String[] { GenericCronTriggerHandler.MODULE_TYPE_ID, TimeOfDayTriggerHandler.MODULE_TYPE_ID,
TimeOfDayConditionHandler.MODULE_TYPE_ID, DayOfWeekConditionHandler.MODULE_TYPE_ID }); TimeOfDayConditionHandler.MODULE_TYPE_ID, DayOfWeekConditionHandler.MODULE_TYPE_ID });
private CronScheduler scheduler; private final CronScheduler scheduler;
@Activate
public TimerModuleHandlerFactory(final @Reference CronScheduler scheduler) {
this.scheduler = scheduler;
}
@Override @Override
@Deactivate @Deactivate
@ -53,22 +62,13 @@ public class TimerModuleHandlerFactory extends BaseModuleHandlerFactory {
super.deactivate(); super.deactivate();
} }
@Reference
protected void setCronScheduler(CronScheduler scheduler) {
this.scheduler = scheduler;
}
protected void unsetCronScheduler(CronScheduler scheduler) {
this.scheduler = null;
}
@Override @Override
public Collection<String> getTypes() { public Collection<String> getTypes() {
return TYPES; return TYPES;
} }
@Override @Override
protected ModuleHandler internalCreate(Module module, String ruleUID) { protected @Nullable ModuleHandler internalCreate(Module module, String ruleUID) {
logger.trace("create {} -> {}", module.getId(), module.getTypeUID()); logger.trace("create {} -> {}", module.getId(), module.getTypeUID());
String moduleTypeUID = module.getTypeUID(); String moduleTypeUID = module.getTypeUID();
if (GenericCronTriggerHandler.MODULE_TYPE_ID.equals(moduleTypeUID) && module instanceof Trigger) { if (GenericCronTriggerHandler.MODULE_TYPE_ID.equals(moduleTypeUID) && module instanceof Trigger) {

View File

@ -218,6 +218,9 @@ public class AnnotatedActionModuleTypeProvider extends BaseModuleHandlerFactory
false); false);
if (finalMI != null) { if (finalMI != null) {
ActionType moduleType = helper.buildModuleType(module.getTypeUID(), moduleInformation); ActionType moduleType = helper.buildModuleType(module.getTypeUID(), moduleInformation);
if (moduleType == null) {
return null;
}
return new AnnotationActionHandler(actionModule, moduleType, finalMI.getMethod(), return new AnnotationActionHandler(actionModule, moduleType, finalMI.getMethod(),
finalMI.getActionProvider()); finalMI.getActionProvider());
} }

View File

@ -14,6 +14,7 @@ package org.openhab.core.automation.internal.parser.gson;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.automation.type.ActionType; import org.openhab.core.automation.type.ActionType;
import org.openhab.core.automation.type.CompositeActionType; import org.openhab.core.automation.type.CompositeActionType;
@ -24,10 +25,11 @@ import com.google.gson.InstanceCreator;
* *
* @author Ana Dimova - Initial contribution * @author Ana Dimova - Initial contribution
*/ */
@NonNullByDefault
public class ActionInstanceCreator implements InstanceCreator<CompositeActionType> { public class ActionInstanceCreator implements InstanceCreator<CompositeActionType> {
@Override @Override
public CompositeActionType createInstance(Type type) { public CompositeActionType createInstance(@NonNullByDefault({}) Type type) {
return new CompositeActionType(null, null, null, null, null); return new CompositeActionType(null, null, null, null, null);
} }
} }

View File

@ -14,6 +14,7 @@ package org.openhab.core.automation.internal.parser.gson;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.automation.type.CompositeConditionType; import org.openhab.core.automation.type.CompositeConditionType;
import org.openhab.core.automation.type.ConditionType; import org.openhab.core.automation.type.ConditionType;
@ -24,10 +25,11 @@ import com.google.gson.InstanceCreator;
* *
* @author Ana Dimova - Initial contribution * @author Ana Dimova - Initial contribution
*/ */
@NonNullByDefault
public class ConditionInstanceCreator implements InstanceCreator<CompositeConditionType> { public class ConditionInstanceCreator implements InstanceCreator<CompositeConditionType> {
@Override @Override
public CompositeConditionType createInstance(Type type) { public CompositeConditionType createInstance(@NonNullByDefault({}) Type type) {
return new CompositeConditionType(null, null, null, null); return new CompositeConditionType(null, null, null, null);
} }
} }

View File

@ -21,6 +21,8 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.dto.ActionTypeDTOMapper; import org.openhab.core.automation.dto.ActionTypeDTOMapper;
import org.openhab.core.automation.dto.CompositeActionTypeDTO; import org.openhab.core.automation.dto.CompositeActionTypeDTO;
import org.openhab.core.automation.dto.CompositeConditionTypeDTO; import org.openhab.core.automation.dto.CompositeConditionTypeDTO;
@ -42,6 +44,7 @@ import org.osgi.service.component.annotations.Component;
* *
* @author Kai Kreuzer - Initial contribution * @author Kai Kreuzer - Initial contribution
*/ */
@NonNullByDefault
@Component(immediate = true, service = Parser.class, property = { "parser.type=parser.module.type", "format=json" }) @Component(immediate = true, service = Parser.class, property = { "parser.type=parser.module.type", "format=json" })
public class ModuleTypeGSONParser extends AbstractGSONParser<ModuleType> { public class ModuleTypeGSONParser extends AbstractGSONParser<ModuleType> {
@ -68,7 +71,7 @@ public class ModuleTypeGSONParser extends AbstractGSONParser<ModuleType> {
gson.toJson(map, writer); gson.toJson(map, writer);
} }
private void addAll(Set<ModuleType> result, List<? extends ModuleTypeDTO> moduleTypes) { private void addAll(Set<ModuleType> result, @Nullable List<? extends ModuleTypeDTO> moduleTypes) {
if (moduleTypes != null) { if (moduleTypes != null) {
for (ModuleTypeDTO mt : moduleTypes) { for (ModuleTypeDTO mt : moduleTypes) {
if (mt instanceof CompositeTriggerTypeDTO) { if (mt instanceof CompositeTriggerTypeDTO) {

View File

@ -14,6 +14,8 @@ package org.openhab.core.automation.internal.parser.gson;
import java.util.List; import java.util.List;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.dto.CompositeActionTypeDTO; import org.openhab.core.automation.dto.CompositeActionTypeDTO;
import org.openhab.core.automation.dto.CompositeConditionTypeDTO; import org.openhab.core.automation.dto.CompositeConditionTypeDTO;
import org.openhab.core.automation.dto.CompositeTriggerTypeDTO; import org.openhab.core.automation.dto.CompositeTriggerTypeDTO;
@ -24,11 +26,12 @@ import org.openhab.core.automation.dto.CompositeTriggerTypeDTO;
* *
* @author Kai Kreuzer - Initial contribution * @author Kai Kreuzer - Initial contribution
*/ */
@NonNullByDefault
public class ModuleTypeParsingContainer { public class ModuleTypeParsingContainer {
public List<CompositeTriggerTypeDTO> triggers; public @Nullable List<CompositeTriggerTypeDTO> triggers;
public List<CompositeConditionTypeDTO> conditions; public @Nullable List<CompositeConditionTypeDTO> conditions;
public List<CompositeActionTypeDTO> actions; public @Nullable List<CompositeActionTypeDTO> actions;
} }

View File

@ -14,6 +14,7 @@ package org.openhab.core.automation.internal.parser.gson;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.automation.type.CompositeTriggerType; import org.openhab.core.automation.type.CompositeTriggerType;
import org.openhab.core.automation.type.TriggerType; import org.openhab.core.automation.type.TriggerType;
@ -24,10 +25,11 @@ import com.google.gson.InstanceCreator;
* *
* @author Ana Dimova - Initial contribution * @author Ana Dimova - Initial contribution
*/ */
@NonNullByDefault
public class TriggerInstanceCreator implements InstanceCreator<CompositeTriggerType> { public class TriggerInstanceCreator implements InstanceCreator<CompositeTriggerType> {
@Override @Override
public CompositeTriggerType createInstance(Type type) { public CompositeTriggerType createInstance(@NonNullByDefault({}) Type type) {
return new CompositeTriggerType(null, null, null, null); return new CompositeTriggerType(null, null, null, null);
} }
} }

View File

@ -18,6 +18,8 @@ import java.util.LinkedList;
import java.util.List; import java.util.List;
import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Rule; import org.openhab.core.automation.Rule;
import org.openhab.core.automation.template.TemplateProvider; import org.openhab.core.automation.template.TemplateProvider;
import org.openhab.core.automation.type.ModuleTypeProvider; import org.openhab.core.automation.type.ModuleTypeProvider;
@ -34,6 +36,7 @@ import org.slf4j.LoggerFactory;
* @author Kai Kreuzer - refactored (managed) provider and registry implementation * @author Kai Kreuzer - refactored (managed) provider and registry implementation
* @param <E> * @param <E>
*/ */
@NonNullByDefault
public class AutomationResourceBundlesEventQueue<@NonNull E> implements Runnable { public class AutomationResourceBundlesEventQueue<@NonNull E> implements Runnable {
/** /**
@ -52,7 +55,7 @@ public class AutomationResourceBundlesEventQueue<@NonNull E> implements Runnable
*/ */
private boolean running = false; private boolean running = false;
private Thread runningThread; private @Nullable Thread runningThread;
/** /**
* This field is for synchronization purposes * This field is for synchronization purposes

View File

@ -19,6 +19,8 @@ import java.nio.file.Path;
import java.nio.file.WatchEvent; import java.nio.file.WatchEvent;
import java.nio.file.WatchEvent.Kind; import java.nio.file.WatchEvent.Kind;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.service.AbstractWatchService; import org.openhab.core.service.AbstractWatchService;
/** /**
@ -30,6 +32,7 @@ import org.openhab.core.service.AbstractWatchService;
* @author Ana Dimova - Initial contribution * @author Ana Dimova - Initial contribution
*/ */
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
@NonNullByDefault
public class AutomationWatchService extends AbstractWatchService { public class AutomationWatchService extends AbstractWatchService {
private AbstractFileProvider provider; private AbstractFileProvider provider;
@ -45,7 +48,7 @@ public class AutomationWatchService extends AbstractWatchService {
} }
@Override @Override
protected Kind<?>[] getWatchEventKinds(Path subDir) { protected Kind<?> @Nullable [] getWatchEventKinds(Path subDir) {
return new Kind<?>[] { ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY }; return new Kind<?>[] { ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY };
} }

View File

@ -14,6 +14,7 @@ package org.openhab.core.automation.internal.provider.file;
import java.util.Map; import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.automation.parser.Parser; import org.openhab.core.automation.parser.Parser;
import org.openhab.core.automation.template.RuleTemplate; import org.openhab.core.automation.template.RuleTemplate;
import org.openhab.core.automation.template.RuleTemplateProvider; import org.openhab.core.automation.template.RuleTemplateProvider;
@ -28,6 +29,7 @@ import org.osgi.service.component.annotations.ReferencePolicy;
* *
* @author Ana Dimova - Initial contribution * @author Ana Dimova - Initial contribution
*/ */
@NonNullByDefault
@Component(immediate = true, service = RuleTemplateProvider.class) @Component(immediate = true, service = RuleTemplateProvider.class)
public class TemplateFileProviderWatcher extends TemplateFileProvider { public class TemplateFileProviderWatcher extends TemplateFileProvider {

View File

@ -13,15 +13,19 @@
package org.openhab.core.automation.internal.provider.file; package org.openhab.core.automation.internal.provider.file;
import java.io.File; import java.io.File;
import java.nio.file.Path;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.eclipse.jdt.annotation.NonNullByDefault;
/** /**
* This class isolates the java 1.7 functionality which tracks the file system changes. * This class isolates the java 1.7 functionality which tracks the file system changes.
* *
* @author Ana Dimova - Initial contribution * @author Ana Dimova - Initial contribution
*/ */
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
@NonNullByDefault
public class WatchServiceUtil { public class WatchServiceUtil {
private static final Map<AbstractFileProvider, Map<String, AutomationWatchService>> WATCH_SERVICES = new HashMap<>(); private static final Map<AbstractFileProvider, Map<String, AutomationWatchService>> WATCH_SERVICES = new HashMap<>();
@ -46,17 +50,22 @@ public class WatchServiceUtil {
} }
public static void deactivateWatchService(String watchingDir, AbstractFileProvider provider) { public static void deactivateWatchService(String watchingDir, AbstractFileProvider provider) {
AutomationWatchService aws; AutomationWatchService aws = null;
synchronized (WATCH_SERVICES) { synchronized (WATCH_SERVICES) {
Map<String, AutomationWatchService> watchers = WATCH_SERVICES.get(provider); Map<String, AutomationWatchService> watchers = WATCH_SERVICES.get(provider);
if (watchers != null) {
aws = watchers.remove(watchingDir); aws = watchers.remove(watchingDir);
if (watchers.isEmpty()) { if (watchers.isEmpty()) {
WATCH_SERVICES.remove(provider); WATCH_SERVICES.remove(provider);
} }
} }
}
if (aws != null) { if (aws != null) {
aws.deactivate(); aws.deactivate();
provider.removeResources(aws.getSourcePath().toFile()); Path sourcePath = aws.getSourcePath();
if (sourcePath != null) {
provider.removeResources(sourcePath.toFile());
}
} }
} }
} }

View File

@ -235,6 +235,9 @@ public class AnnotatedThingActionModuleTypeProvider extends BaseModuleHandlerFac
true); true);
if (finalMI != null) { if (finalMI != null) {
ActionType moduleType = helper.buildModuleType(module.getTypeUID(), moduleInformation); ActionType moduleType = helper.buildModuleType(module.getTypeUID(), moduleInformation);
if (moduleType == null) {
return null;
}
return new AnnotationActionHandler(actionModule, moduleType, finalMI.getMethod(), return new AnnotationActionHandler(actionModule, moduleType, finalMI.getMethod(),
finalMI.getActionProvider()); finalMI.getActionProvider());
} }

View File

@ -238,8 +238,6 @@ public class ItemStateConditionHandlerTest {
.withId("conditionId") // .withId("conditionId") //
.withTypeUID(ItemStateConditionHandler.ITEM_STATE_CONDITION) // .withTypeUID(ItemStateConditionHandler.ITEM_STATE_CONDITION) //
.withConfiguration(configuration); .withConfiguration(configuration);
ItemStateConditionHandler handler = new ItemStateConditionHandler(builder.build()); return new ItemStateConditionHandler(builder.build(), mockItemRegistry);
handler.setItemRegistry(mockItemRegistry);
return handler;
} }
} }

View File

@ -14,11 +14,14 @@ package org.openhab.core.library.dimension;
import javax.measure.Quantity; import javax.measure.Quantity;
import org.eclipse.jdt.annotation.NonNullByDefault;
/** /**
* Define Area density type (basic unit is kg/m^2) * Define Area density type (basic unit is kg/m^2)
* https://en.wikipedia.org/wiki/Area_density * https://en.wikipedia.org/wiki/Area_density
* *
* @author Gaël L'hopital - Initial contribution * @author Gaël L'hopital - Initial contribution
*/ */
@NonNullByDefault
public interface ArealDensity extends Quantity<ArealDensity> { public interface ArealDensity extends Quantity<ArealDensity> {
} }

View File

@ -14,10 +14,13 @@ package org.openhab.core.library.dimension;
import javax.measure.Quantity; import javax.measure.Quantity;
import org.eclipse.jdt.annotation.NonNullByDefault;
/** /**
* Define Density type (basic unit is kg/m^3) * Define Density type (basic unit is kg/m^3)
* *
* @author Jan N. Klug - Initial contribution * @author Jan N. Klug - Initial contribution
*/ */
@NonNullByDefault
public interface Density extends Quantity<Density> { public interface Density extends Quantity<Density> {
} }

View File

@ -14,11 +14,14 @@ package org.openhab.core.library.dimension;
import javax.measure.Quantity; import javax.measure.Quantity;
import org.eclipse.jdt.annotation.NonNullByDefault;
/** /**
* This interface represents the intensity dimension. * This interface represents the intensity dimension.
* *
* @author Henning Treu - Initial contribution * @author Henning Treu - Initial contribution
*/ */
@NonNullByDefault
public interface Intensity extends Quantity<Intensity> { public interface Intensity extends Quantity<Intensity> {
} }

View File

@ -14,10 +14,13 @@ package org.openhab.core.library.dimension;
import javax.measure.Quantity; import javax.measure.Quantity;
import org.eclipse.jdt.annotation.NonNullByDefault;
/** /**
* Define Volumetric Flow Rate type (basic unit is m^3/s). * Define Volumetric Flow Rate type (basic unit is m^3/s).
* *
* @author Łukasz Dywicki - Initial contribution * @author Łukasz Dywicki - Initial contribution
*/ */
@NonNullByDefault
public interface VolumetricFlowRate extends Quantity<VolumetricFlowRate> { public interface VolumetricFlowRate extends Quantity<VolumetricFlowRate> {
} }