Exemple #1
0
  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);
      }
    }
  }
Exemple #3
0
  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);
    }
  }
Exemple #6
0
  /** {@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
      }
    }
  }
Exemple #8
0
  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();
        }
      }
    }
  }
Exemple #9
0
  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
      }
    }
  }
Exemple #10
0
 public void deactivate() {
   // execute all scripts that were registered for system shutdown
   executeRules(triggerManager.getRules(SHUTDOWN));
   triggerManager.clearAll();
   triggerManager = null;
 }