private void runStartupRules() { if (triggerManager != null) { Iterable<Rule> startupRules = triggerManager.getRules(STARTUP); List<Rule> executedRules = Lists.newArrayList(); for (Rule rule : startupRules) { try { Script script = scriptEngine.newScriptFromXExpression(rule.getScript()); logger.debug("Executing startup rule '{}'", rule.getName()); RuleEvaluationContext context = new RuleEvaluationContext(); context.setGlobalContext(RuleContextHelper.getContext(rule)); script.execute(context); executedRules.add(rule); } catch (ScriptExecutionException e) { String causeMessage = getCauseMessage(e); if (e.getCause() instanceof ItemNotFoundException || causeMessage.contains("cannot be resolved to an item or type")) { logger.debug( "Not all required items in place yet for rule {}, trying again later: {}", new Object[] {rule.getName(), causeMessage}); // we do not seem to have all required items in place yet // so we keep the rule in the list and try it again later } else { logger.error( "Error during the execution of startup rule '{}': {}", new Object[] {rule.getName(), causeMessage}); executedRules.add(rule); } } } for (Rule rule : executedRules) { triggerManager.removeRule(STARTUP, rule); } } }
private void runStartupRules() { if (triggerManager != null) { Iterable<Rule> startupRules = triggerManager.getRules(STARTUP); List<Rule> executedRules = Lists.newArrayList(); for (Rule rule : startupRules) { try { Script script = scriptEngine.newScriptFromXExpression(rule.getScript()); logger.debug("Executing startup rule '{}'", rule.getName()); RuleEvaluationContext context = new RuleEvaluationContext(); context.setGlobalContext(RuleContextHelper.getContext(rule, injector)); script.execute(context); executedRules.add(rule); } catch (ScriptExecutionException e) { if (!e.getMessage().contains("cannot be resolved to an item or type")) { logger.error( "Error during the execution of startup rule '{}': {}", new Object[] {rule.getName(), e.getCause().getMessage()}); executedRules.add(rule); } else { logger.debug( "Execution of startup rule '{}' has been postponed as items are still missing.", rule.getName()); } } } for (Rule rule : executedRules) { triggerManager.removeRule(STARTUP, rule); } } }
public void activate() { triggerManager = new RuleTriggerManager(); if (!isEnabled()) { logger.info("Rule engine is disabled."); return; } logger.debug("Started rule engine"); // read all rule files Iterable<String> ruleModelNames = modelRepository.getAllModelNamesOfType("rules"); ArrayList<String> clonedList = Lists.newArrayList(ruleModelNames); for (String ruleModelName : clonedList) { EObject model = modelRepository.getModel(ruleModelName); if (model instanceof RuleModel) { RuleModel ruleModel = (RuleModel) model; triggerManager.addRuleModel(ruleModel); } } // register us on all items which are already available in the registry for (Item item : itemRegistry.getItems()) { internalItemAdded(item); } runStartupRules(); }
/** {@inheritDoc} */ @Override public void stateUpdated(Item item, State state) { if (triggerManager != null) { Iterable<Rule> rules = triggerManager.getRules(UPDATE, item, state); executeRules(rules); } }
/** {@inheritDoc} */ @Override public void stateChanged(Item item, State oldState, State newState) { if (triggerManager != null) { Iterable<Rule> rules = triggerManager.getRules(CHANGE, item, oldState, newState); executeRules(rules, oldState); } }
/** {@inheritDoc} */ public void stateChanged(Item item, State oldState, State newState) { if (triggerManager != null) { RuleEvaluationContext context; Iterable<Rule> rules = triggerManager.getRules(CHANGE, item, oldState, newState); for (Rule rule : rules) { context = new RuleEvaluationContext(); context.newValue(QualifiedName.create(RuleContextHelper.VAR_PREVIOUS_STATE), oldState); executeRule(rule, context); } } }
public void receiveCommand(String itemName, Command command) { if (triggerManager != null && itemRegistry != null) { try { Item item = itemRegistry.getItem(itemName); Iterable<Rule> rules = triggerManager.getRules(COMMAND, item, command); executeRules(rules, command); } catch (ItemNotFoundException e) { // ignore commands for non-existent items } } }
public void modelChanged(String modelName, org.openhab.model.core.EventType type) { if (triggerManager != null) { if (isEnabled() && modelName.endsWith("rules")) { RuleModel model = (RuleModel) modelRepository.getModel(modelName); // remove the rules from the trigger sets if (type == org.openhab.model.core.EventType.REMOVED || type == org.openhab.model.core.EventType.MODIFIED) { triggerManager.removeRuleModel(model); } // add new and modified rules to the trigger sets if (model != null && (type == org.openhab.model.core.EventType.ADDED || type == org.openhab.model.core.EventType.MODIFIED)) { triggerManager.addRuleModel(model); // now execute all rules that are meant to trigger at startup runStartupRules(); } } } }
public void receiveCommand(String itemName, Command command) { if (triggerManager != null && itemRegistry != null) { try { RuleEvaluationContext context; Item item = itemRegistry.getItem(itemName); Iterable<Rule> rules = triggerManager.getRules(COMMAND, item, command); for (Rule rule : rules) { context = new RuleEvaluationContext(); context.newValue(QualifiedName.create(RuleContextHelper.VAR_RECEIVED_COMMAND), command); executeRule(rule, context); } } catch (ItemNotFoundException e) { // ignore commands for non-existent items } } }
public void deactivate() { // execute all scripts that were registered for system shutdown executeRules(triggerManager.getRules(SHUTDOWN)); triggerManager.clearAll(); triggerManager = null; }