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动作。
浙公网安备 33010602011771号