DSL案例(OpenHAB分析)

openHAB介绍:

The open Home Automation Bus (openHAB) project aims at providing a universal integration platform for all things around home automation. It is a pure Java solution, fully based on OSGi. The Equinox OSGi runtime and Jetty as a web server build the core foundation of the runtime.


该项目致力于提供一套针对家居自动化的通用完整平台。纯java解决方案,完全基于OSGi架构。Equinox运行时环境和Jetty作为web服务器。

 1:org.openhab.model.rule.internal.engine.RuleTriggerManager 分析

 

public static enum TriggerTypes
{
UPDATE,
CHANGE,
COMMAND,
STARTUP,
SHUTDOWN,
TIMER;
}

触发器分为6种类型;

该类包括添加rule、删除rule、addTimerRule等方法;来进行Rule列表的管理;

 

private Map<String, Set<Rule>> updateEventTriggeredRules = Maps.newHashMap();
private Map<String, Set<Rule>> changedEventTriggeredRules = Maps.newHashMap();
private Map<String, Set<Rule>> commandEventTriggeredRules = Maps.newHashMap();
private List<Rule> systemStartupTriggeredRules = Lists.newArrayList();
private List<Rule> systemShutdownTriggeredRules = Lists.newArrayList();
private List<Rule> timerEventTriggeredRules = Lists.newArrayList();

Rule被按照类型分别添加到不同的列表中;

2:org.openhab.model.rule.internal.engine.RuleEngine

Iterable ruleModelNames = this.modelRepository.getAllModelNamesOfType("rules");

获取所有Rule模型对象

Rule定义:

rule Startup
when
System started
then
say("Welcome at openHab!")
end

代码:

 

ArrayList clonedList = Lists.newArrayList(ruleModelNames);
for (String ruleModelName : clonedList) {
EObject model = this.modelRepository.getModel(ruleModelName);
if (model instanceof RuleModel) {
RuleModel ruleModel = (RuleModel)model;
this.triggerManager.addRuleModel(ruleModel);
}

 

}

根据类型将用户定义Rule添加到RuleManager中;

 

public class RuleEngine
implements EventHandler, ItemRegistryChangeListener, StateChangeListener, ModelRepositoryChangeListener

RuleEngine继承了各种类型变化的Listener

一旦触发Listener动作,将根据触发类型执行不同的Rule的Then动作。

 

posted on 2012-09-06 10:27  aquariusm  阅读(373)  评论(0)    收藏  举报

导航