Skip to content

Commit

Permalink
tweak ScriptedRuleProvider slightly (openhab#3170)
Browse files Browse the repository at this point in the history
* tweak ScriptedRuleProvider slightly

just extend AbstractProvider so that it doesn't need to re-implement
managing listeners

Signed-off-by: Cody Cutrer <[email protected]>

* have ScriptedRuleProvider implement ManagedProvider

there's nothing that says ManagedProvider has to be backed by storage,
just that they should be able to add and remove elements

Since that's exactly what ScriptedRuleProvider does, might as well
have it conform to the interface.

Signed-off-by: Cody Cutrer <[email protected]>
GitOrigin-RevId: f0875a4
  • Loading branch information
ccutrer authored and splatch committed Jul 12, 2023
1 parent 4a6ea48 commit a38eea4
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ public void removeRegistryChangeListener(RegistryChangeListener<Rule> listener)

@Override
public Rule add(Rule element) {
ruleProvider.addRule(element);
ruleProvider.add(element);
rules.add(element.getUID());

return element;
Expand All @@ -93,7 +93,7 @@ public void addPermanent(Rule element) {
@Override
public @Nullable Rule remove(String key) {
if (rules.remove(key)) {
ruleProvider.removeRule(key);
return ruleProvider.remove(key);
}

return ruleRegistry.remove(key);
Expand All @@ -109,11 +109,7 @@ public Collection<Rule> getByTag(@Nullable String tag) {
*/
public void removeAllAddedByScript() {
for (String rule : rules) {
try {
ruleProvider.removeRule(rule);
} catch (Exception ex) {
// ignore
}
ruleProvider.remove(rule);
}
rules.clear();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,64 +12,77 @@
*/
package org.openhab.core.automation.module.script.rulesupport.shared;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.automation.Rule;
import org.openhab.core.automation.RuleProvider;
import org.openhab.core.common.registry.ProviderChangeListener;
import org.openhab.core.common.registry.AbstractProvider;
import org.openhab.core.common.registry.ManagedProvider;
import org.osgi.service.component.annotations.Component;

/**
* This RuleProvider keeps Rules at added by scripts during the runtime. This ensures that Rules are not kept on reboot,
* This RuleProvider keeps Rules added by scripts during runtime. This ensures that Rules are not kept on reboot,
* but have to be added by the scripts again.
*
* @author Simon Merschjohann - Initial contribution
*/
@NonNullByDefault
@Component(immediate = true, service = { ScriptedRuleProvider.class, RuleProvider.class })
public class ScriptedRuleProvider implements RuleProvider {
private final Collection<ProviderChangeListener<Rule>> listeners = new ArrayList<>();

public class ScriptedRuleProvider extends AbstractProvider<Rule>
implements RuleProvider, ManagedProvider<Rule, String> {
private final Map<String, Rule> rules = new HashMap<>();

@Override
public void addProviderChangeListener(ProviderChangeListener<Rule> listener) {
listeners.add(listener);
public Collection<Rule> getAll() {
return rules.values();
}

@Override
public Collection<Rule> getAll() {
return rules.values();
public @Nullable Rule get(String ruleUID) {
return rules.get(ruleUID);
}

@Override
public void removeProviderChangeListener(ProviderChangeListener<Rule> listener) {
listeners.remove(listener);
public void add(Rule rule) {
rules.put(rule.getUID(), rule);

notifyListenersAboutAddedElement(rule);
}

@Deprecated
public void addRule(Rule rule) {
rules.put(rule.getUID(), rule);
add(rule);
}

for (ProviderChangeListener<Rule> providerChangeListener : listeners) {
providerChangeListener.added(this, rule);
@Override
public @Nullable Rule update(Rule rule) {
Rule oldRule = rules.get(rule.getUID());
if (oldRule != null) {
rules.put(rule.getUID(), rule);
notifyListenersAboutUpdatedElement(oldRule, rule);
}
return oldRule;
}

public void removeRule(String ruleUID) {
Rule rule = rules.get(ruleUID);
@Override
public @Nullable Rule remove(String ruleUID) {
Rule rule = rules.remove(ruleUID);
if (rule != null) {
removeRule(rule);
notifyListenersAboutRemovedElement(rule);
}
return rule;
}

@Deprecated
public void removeRule(String ruleUID) {
remove(ruleUID);
}

public void removeRule(Rule rule) {
rules.remove(rule.getUID());
for (ProviderChangeListener<Rule> providerChangeListener : listeners) {
providerChangeListener.removed(this, rule);
}
remove(rule.getUID());
}
}

0 comments on commit a38eea4

Please sign in to comment.