/**
* Copyright (c) 2015-2017 Simon Merschjohann and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.smarthome.automation.module.script.rulesupport.shared;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.stream.Stream;
import org.eclipse.smarthome.automation.Rule;
import org.eclipse.smarthome.automation.RuleRegistry;
import org.eclipse.smarthome.automation.RuleStatus;
import org.eclipse.smarthome.automation.RuleStatusInfo;
import org.eclipse.smarthome.core.common.registry.RegistryChangeListener;
/**
* The {@link RuleSupportRuleRegistryDelegate} is wrapping a {@link RuleRegistry} to provide a comfortable way to add
* rules to the RuleEngine without worrying about the need to remove rules again. Nonetheless, using the addPermanent
* method it is still possible to add rules permanently.
*
* @author Simon Merschjohann
*
*/
public class RuleSupportRuleRegistryDelegate implements RuleRegistry {
private RuleRegistry ruleRegistry;
private HashSet<String> rules = new HashSet<>();
private ScriptedRuleProvider ruleProvider;
public RuleSupportRuleRegistryDelegate(RuleRegistry ruleRegistry, ScriptedRuleProvider ruleProvider) {
this.ruleRegistry = ruleRegistry;
this.ruleProvider = ruleProvider;
}
@Override
public void addRegistryChangeListener(RegistryChangeListener<Rule> listener) {
ruleRegistry.addRegistryChangeListener(listener);
}
@Override
public Collection<Rule> getAll() {
return ruleRegistry.getAll();
}
@Override
public Stream<Rule> stream() {
return ruleRegistry.stream();
}
@Override
public Rule get(String key) {
return ruleRegistry.get(key);
}
@Override
public void removeRegistryChangeListener(RegistryChangeListener<Rule> listener) {
ruleRegistry.removeRegistryChangeListener(listener);
}
@Override
public Rule add(Rule element) {
ruleProvider.addRule(element);
rules.add(element.getUID());
return element;
}
/**
* add a rule permanently to the RuleEngine
*
* @param element the rule
*/
public void addPermanent(Rule element) {
ruleRegistry.add(element);
}
@Override
public Rule update(Rule element) {
return ruleRegistry.update(element);
}
@Override
public Rule remove(String key) {
if (rules.remove(key)) {
ruleProvider.removeRule(key);
}
return ruleRegistry.remove(key);
}
@Override
public Collection<Rule> getByTag(String tag) {
return ruleRegistry.getByTag(tag);
}
@Override
public void setEnabled(String uid, boolean isEnabled) {
ruleRegistry.setEnabled(uid, isEnabled);
}
@Override
public Boolean isEnabled(String ruleUID) {
return ruleRegistry.isEnabled(ruleUID);
}
/**
* called when the script is unloaded or reloaded
*/
public void removeAllAddedByScript() {
for (String rule : rules) {
try {
ruleProvider.removeRule(rule);
} catch (Exception ex) {
// ignore
}
}
rules.clear();
}
@Override
public Collection<Rule> getByTags(String... tags) {
return ruleRegistry.getByTags(tags);
}
@Override
public RuleStatusInfo getStatusInfo(String ruleUID) {
return ruleRegistry.getStatusInfo(ruleUID);
}
@Override
public RuleStatus getStatus(String ruleUID) {
return ruleRegistry.getStatus(ruleUID);
}
@Override
public void runNow(String ruleUID) {
ruleRegistry.runNow(ruleUID);
}
@Override
public void runNow(String ruleUID, boolean considerConditions, Map<String, Object> context) {
ruleRegistry.runNow(ruleUID, considerConditions, context);
}
}