use of org.eclipse.smarthome.model.rule.rules.RuleModel in project smarthome by eclipse.
the class RuleEngineImpl method modelChanged.
@Override
public void modelChanged(String modelName, org.eclipse.smarthome.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.eclipse.smarthome.model.core.EventType.REMOVED || type == org.eclipse.smarthome.model.core.EventType.MODIFIED) {
triggerManager.removeRuleModel(model);
}
// add new and modified rules to the trigger sets
if (model != null && (type == org.eclipse.smarthome.model.core.EventType.ADDED || type == org.eclipse.smarthome.model.core.EventType.MODIFIED)) {
triggerManager.addRuleModel(model);
// now execute all rules that are meant to trigger at startup
scheduleStartupRules();
}
}
}
}
use of org.eclipse.smarthome.model.rule.rules.RuleModel in project smarthome by eclipse.
the class RuleEngineImpl method activate.
@Activate
public void activate() {
injector = RulesStandaloneSetup.getInjector();
triggerManager = injector.getInstance(RuleTriggerManager.class);
if (!isEnabled()) {
logger.info("Rule engine is disabled.");
return;
}
logger.debug("Started rule engine");
// read all rule files
for (String ruleModelName : modelRepository.getAllModelNamesOfType("rules")) {
EObject model = modelRepository.getModel(ruleModelName);
if (model instanceof RuleModel) {
RuleModel ruleModel = (RuleModel) model;
triggerManager.addRuleModel(ruleModel);
}
}
// register us as listeners
itemRegistry.addRegistryChangeListener(this);
modelRepository.addModelRepositoryChangeListener(this);
// register us on all items which are already available in the registry
for (Item item : itemRegistry.getItems()) {
internalItemAdded(item);
}
scheduleStartupRules();
}
use of org.eclipse.smarthome.model.rule.rules.RuleModel in project smarthome by eclipse.
the class RuleContextHelper method getContext.
/**
* Retrieves the evaluation context (= set of variables) for a rule. The context is shared with all rules in the
* same model (= rule file).
*
* @param rule the rule to get the context for
* @return the evaluation context
*/
public static synchronized IEvaluationContext getContext(Rule rule, Injector injector) {
Logger logger = LoggerFactory.getLogger(RuleContextHelper.class);
RuleModel ruleModel = (RuleModel) rule.eContainer();
// check if a context already exists on the resource
for (Adapter adapter : ruleModel.eAdapters()) {
if (adapter instanceof RuleContextAdapter) {
return ((RuleContextAdapter) adapter).getContext();
}
}
Provider<IEvaluationContext> contextProvider = injector.getProvider(IEvaluationContext.class);
// no evaluation context found, so create a new one
ScriptEngine scriptEngine = injector.getInstance(ScriptEngine.class);
if (scriptEngine != null) {
IEvaluationContext evaluationContext = contextProvider.get();
for (VariableDeclaration var : ruleModel.getVariables()) {
try {
Object initialValue = var.getRight() == null ? null : scriptEngine.newScriptFromXExpression(var.getRight()).execute();
evaluationContext.newValue(QualifiedName.create(var.getName()), initialValue);
} catch (ScriptExecutionException e) {
logger.warn("Variable '{}' on rule file '{}' cannot be initialized with value '{}': {}", new Object[] { var.getName(), ruleModel.eResource().getURI().path(), var.getRight().toString(), e.getMessage() });
}
}
ruleModel.eAdapters().add(new RuleContextAdapter(evaluationContext));
return evaluationContext;
} else {
logger.debug("Rule variables of rule {} cannot be evaluated as no scriptengine is available!", ruleModel.eResource().getURI().path());
return contextProvider.get();
}
}
use of org.eclipse.smarthome.model.rule.rules.RuleModel in project smarthome by eclipse.
the class ExecuteRuleJob method execute.
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
String modelName = (String) context.getJobDetail().getJobDataMap().get(JOB_DATA_RULEMODEL);
String ruleName = (String) context.getJobDetail().getJobDataMap().get(JOB_DATA_RULENAME);
if (modelRepository != null && scriptEngine != null) {
EObject model = modelRepository.getModel(modelName);
if (model instanceof RuleModel) {
RuleModel ruleModel = (RuleModel) model;
Rule rule = getRule(ruleModel, ruleName);
if (rule != null) {
Script script = scriptEngine.newScriptFromXExpression(rule.getScript());
logger.debug("Executing scheduled rule '{}'", rule.getName());
try {
script.execute(RuleContextHelper.getContext(rule, injector));
} catch (ScriptExecutionException e) {
logger.error("Error during the execution of rule '{}': {}", rule.getName(), e.getMessage());
}
} else {
logger.debug("Scheduled rule '{}' does not exist", ruleName);
}
} else {
logger.debug("Rule file '{}' does not exist", modelName);
}
}
}
Aggregations