- 浏览: 2474264 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (574)
- Book (62)
- Architecture (6)
- Java (39)
- Taobao (41)
- Distributed (4)
- Life (72)
- Database (7)
- Spring (16)
- Photography (15)
- Bicycle (41)
- Test (20)
- jBPM (8)
- Business (12)
- Movie (3)
- Ajax (15)
- Code (7)
- Eclipse (96)
- VIM (2)
- Music (6)
- Groovy (10)
- AutoHotKey (3)
- Dorado (10)
- Maven (7)
- Scrum (5)
- English (20)
- Financial (12)
- OSGi (3)
- Other (4)
- Tool (6)
- Browser (1)
- PPT (1)
- Project Management (4)
- Agile (6)
- Nosql (1)
- Search engine (6)
- Shell (2)
- Open Source (4)
- Storm (10)
- Guava (3)
- Baby (1)
- netty (1)
- Algorithm (1)
- Linux (1)
- Python (2)
最新评论
-
roy2011a:
https://github.com/ebottabi/sto ...
storm的序列化问题及与spring的结合方式 -
roy2011a:
能抗能打 写道哥们儿,你好!能共享下那个storm与sprin ...
storm的序列化问题及与spring的结合方式 -
Alick1:
兄弟,你之前是不是在深圳的正阳公司呆过啊?
storm的ack和fail -
liuleixwd:
先点个赞,写的非常好!有个问题请教下,如果我再bolt里不用e ...
storm的ack和fail -
yao-dd:
solr的facet查询
FROM:http://www.rcp.org.cn/bbs_topic.do?forumID=8&postID=163
EMF(Eclipse Modeling Framework)是一个模型架构和代码生成工具,它可以用来建构以结构化数据为基础的工具或者应用。作为MDA和Eclipse的结合体,它发展迅速,IBM的大部分工具产品如RSA等都将建立在它的基础之上。
我们将构建一个简单的手机库管工具,它只维护种类信息,并不存储数量库位等。通过该工具,我们可以添加,删除,修改主机及配件;维护主机,配件的功能;并且可以通过拖放将主机和相关配件组成一种配置。
建立模型
EMF通过JET和JMERGE来实现支持MDA,它可以从annotated Java, UML, or XML Schema三种模型生成Eclipse plug-in代码。我们将用Rational Rose建立UML模型来作为系统模型。
建立EMF工程,在Wizard中会提示选择初始化的模型内容。从Rose中读取类模型以后,将生成了一个工程,其中包含两个文件:.ecore和.genmodel。
Ecore文件代表我们的模型本身,你可以通过修改它来改变模型。比如改变属性的类型,类之间的关系等。你也完全可以通过手动的方式建立ecore文件来创建整个模型。我们可以看到,在ecore模型中,所有的类被转换为EClass;聚合关系变成了一个EClass包含其它EClass作为EReference,例如主机、配置、配件都作为库存的EReference。在这里,我们需要修改EReference的Containment属性,缺省的值是false。Containment属性是在持久化时的一个重要属性,它表明存储时数据的包含关系,如果全部保留为fasle,将不会有任何信息被存储到文件中,除了顶级节点:库存。应该以谁创建,谁包含为原则。比如库存可以创建主机、配件、配置,那么这些库存的EReference的Containment属性都应该设为true;而配置并不负责创建主机和配件,只是从库存中现有的主机和配件拖放过来的,那么它下面的主机,配件EReference的Containment属性都应该为false。
以XMI存储为例,修改后存储的格式应该为:
- <!---->xml version="1.0" encoding="UTF-8"?>
- <mobiles:库存 xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:mobiles="http:///mobiles.ecore">
- <配置 配件="//@配件.0" 主机="//@主机.0"/>
- <配件>
- <功能/>
- 配件>
- <主机>
- <功能/>
- 主机>
- mobiles:库存>
Genmodel文件主要维护着一些与生成代码相关的设置,比如说,某个属性可不可以修改。大部分的属性都不用修改,我们要决定的仍然是EReference的属性:Children,Create Child,Notify。
Notify是表明它应不应该将在这个包含节点中有关自身的改变通知给其它的相同节点。比如某个主机V3在库存中创建之后被拖到某个配置里,这样在整个树上就存在两个V3:一个是V3本身,另一个是它的一个引用。如果将配置中主机的Notify属性设为true后,改变配置中引用的V3价格,它就会把这个改变通知给V3自身,实现同步。通常情况下应将所有的EReference的Notify设为true。
按照下表做出设置:
包含节点 EReference Children Create Child Notify
库存 主机
配件
配置 True True True
主机 功能 True True True
主机 配件 True False True
配件 功能 True True True
配置 主机
配件 True False True
用EMF generator(缺省的Eidtor)打开genmodel文件,原来的工程中会生成Model代码,两个新的工程Edit和Editor工程会被生成, Edit工程包含了一些方便编辑Model的代码,Eidtor工程中大都是UI部分的代码,不在本文范围之内。
.mobiles文件生成后,将会用Mobiles Model Editor打开。现在就可以在库存中添加主机配件等,并将其拖到某个配置中去。这里所谓的Mobiles在缺省情况下与你的Rose文件的名字相同,在Editor工程的Plugin.xml的editor扩展中可以看到生成的后缀。
EMF是从作为MOF规范在Eclipse的一个实现开始的,随后通过大量的运用在工具的实现,EMF成为一个有效的MOF API的一个核心子集的Java实现。EMF中的元数据被称为Ecore。
灰色的类代表抽象类,所有的类都继承自Eobject。EPackage包含关于模型类(EClass)和数据类型(EDataType)的信息。EClass描述一个建模的类,并且指定属性和参考以描述实例的数据。EAttribute描述简单数据,它由一个EDataType来指定。EReference描述一个类之间的关联;它的类型是一个Eclass。EFactory包含创建模型元素的方法。更多的关于Ecore的描述请参考Eclipse官方网站。
包和工厂
前面说过EPackage包含所有关于EClass和EDataType的信息,参看生成的代码mobiles. MobilesPackage,可以看到Eclass的feature ID声明:
- int 主机 = 0;
- int 配置 = 1;
feature ID仅仅是对所有的类元素(不包含类型信息)的一个int类型的编号,有了它可以使你很快的区分出是哪个类的哪个属性。例如在某个类的属性值发生改变后,它的监听者会收到一个通知,通知里就包含了改变了的属性的feature ID,这时你就可以简单的通过一个switch方法来实现分派。
MobilesPackage中另外的一些是关于类型的,例如:
- EClass get主机();
- EAttribute get主机_Name();
在某些情况下这些元数据是非常重要的,比如在决定某个属性的编辑框类型的时候。当然你也可以直接调用某个类型的create方法来创建对象:
适配器
EMF最重要的一个特性就是它对Adapter的定义。在EMF中Adapter有两个功能,第一个是类似于Observer的功能,它可以监听目标对象的变化然后做出相应的反映;另一个是通过它可以使目标对象不用继承某个接口或者父类来实现其特有的功能。这一节我们会结合Model Plug_in的代码来探讨Adapter的这两个功能。
Observer
通常的Observer模式需要至少两个类,监听者和目标对象。EMF中,监听者称为Adapter,目标对象称为Notifier。每个Notifier都拥有一个eAdapters列表,维护着所有监听者的类型,一旦Notifier发生变化,它会遍历eAdapters列表将变化通知给列表中的每一个Adapter。所以假如某个Adapter想要监听这个Notifier,只需要将自己添加到Notifier的eAdapters中。
EMF中所有的对象都直接或间接继承自Eobject,如同java中所有的类都继承自Object一样。而Eobject类已经实现了Notifier接口,所以所有的EMF的类都可以是Notifier。
Adapter需要自己来实现AdapterImpl,需要实现的方法主要有两个,isAdapterForType和notifyChanged。IsAdapterForType是用来判断这个Adapter能不能监听某个Notifier,notifyChanged包含着一旦Notifier发生了变化这个Adapter所要做出的所有相应。假设我们需要一个Adapter,它来监听主机的变化,一旦任何关于主机的增删改操作产生就将改变记录在本地文件中。
Notification类是由Notifier发出来的,它包含着发出者getNotifier(),改变之前的旧值getOldValue()和改变后的新值getNewValue()。象如下示例这样使用这个Adapter:
java 代码
- 主机 machine= MobilesFactory. EINSTANCE. create主机();
- 主机Adapter adapter = new主机Adapter();
- machine.eAdatpters().add(adapter);
- machine.setName(“V3”);
你要自己实例化Adapter,并且把它添加到Notifier的eAdaters里去。假如在其它的某个地方你有同样的需求,但你不确定“主机Adapter”是否已经被添加到“主机”的eAdatpters里了,你就需要遍历现有的adapter,来判断是否已被添加。然后决定创不创建新的“主机Adapter”。事实上EMF提供了AdapterFactory来简化你的工作。可以参照生成的代码mobiles.util. MobilesAdapterFactory.java。它只是一个框架,用来根据Notifier的类型生成相应的Adatpter并将其注册到Notifier的eAdapters列表中去。它还借用了MobilesSwitch类的分派功能。MobilesSwitch只做了一件事情,那就是根据Notifier的类型调用不同的case*方法。例如,如果Notifier是“主机”,它会去调用case主机()方法。MobilesAdapterFactory中则实现了case主机()方法,调用create主机Adapter()来创建“主机Adapter”。
继续上面的例子,我们实现一个AdapterFactory:
- public class MobilesAdapterFactoryImpl extends MobilesAdapterFactory{
- public static MobilesAdapterFactoryImpl
- INSTANCE = new MobilesAdapterFactoryImpl ();
- public Adapter create主机Adapter() {
- return new主机Adapter();
- }
- }
用的时候就很简单:
- 主机 machine= MobilesFactory. EINSTANCE. create主机();
- MobilesAdapterFactoryImpl.INSTANCE.adapt(machine, 主机Adapter.class);
- machine.setName(“V3”);
factory会遍历machine的eAdapters,如果没有“主机Adapter”则创建一个添加进去,否则返回已有的。
行为扩展
我们把日志功能提取出来,成为一个类:
- public interface Logger{
- public void log();
- }
其实我们希望的是“主机”也能有日志功能,可以在自己改变之后将变化记录下来。以往我们要做的就是让“主机”继承Logger,然后实现log()方法记录下自己这种特定类型的信息。但有的时候通过继承来扩展行为并不是那么舒服,比如继承的关系是死的,你不能在你不需要的时候去掉这些扩展行为。通过Adapter你可以随心所欲的控制这些扩展行为。
- public class 主机Adapter extends AdapterImpl implements Logger
- {
- public void notifyChanged(Notification notification) {
- if (notification.getNotifier() instanceof 主机)
- log();
- }
- public boolean isAdapterForType(Object type) {
- return type == 主机.class;
- }
- public void log(){
- //log the name, band,year,changed property name and its old value and new value
- }
- }
用的时候同上边一样:
- 主机 machine= MobilesFactory. EINSTANCE. create主机();
- MobilesAdapterFactoryImpl.INSTANCE.adapt(machine, 主机Adapter.class);
- machine.setName(“V3”);
这个时候任何“主机”的变化都会引起“主机Adapter”执行扩展了的log()方法,这一点与AOP很像。
Model Class
我们现在把目光关注到Model Plug_in中最重要的部分。首先是Model的接口,例如接口“主机”,它的定义非常简单,就是些属性的get,set方法。get方法很简单,而set方法则比较有趣:
- public void setName(String newName) {
- String oldName = name;
- name = newName;
- if (eNotificationRequired())
- eNotify(new ENotificationImpl(this,
- Notification.SET,
- MobilesPackage.主机__NAME,
- oldName, name));
- }
它不仅仅将类变量赋予了新值,还在需要Notify的时候发出了一个Notification。如同上一节所讲的,这个Notification将包含发出者,改变的方式,改变的属性标识(feature ID)、旧值和新值。
随后是一些e开头的方法,他们都是用作反射的。例如eGet,根据feature ID返回相应的属性值;eSet,根据feature ID设置相应的属性值;eUnset,根据feature ID设置相应的属性值为缺省值;eIsSet,根据feature ID判断相应的属性是否被设置过;
限于篇幅的关系,EMF中还有很多高级的功能没有在本文中介绍,比如持久化,Command pattern等;Edit工程里更是包含了集万千宠爱于一身的ItemProvider,它们都非常重要,希望以后有机会能与读者共同探讨
声明:该文章已发表于《程序员》2006年第五期,如要引用请注明出处。
发表评论
-
Java程序员25个必备的Eclipse插件
2012-01-12 22:36 21936原文:http://www.fromdev.com/2012/ ... -
关于插件更新安装的错误
2007-12-21 20:12 2217在更新插件的时候出现这样的错误: Unable to comp ... -
最近做eclipse branding, features的一些经验
2007-12-16 01:24 4552知道eclipse的splash怎么做 ... -
GEF学习笔记
2007-12-07 20:20 4164GEF以前学习过, 而且还 ... -
SWT布局深入学习
2007-11-30 23:00 7947以下内容是学习"The Definitive Gui ... -
Eclipse Action 深入学习笔记(3)
2007-11-25 17:59 4088filter元素是用来指定当 ... -
Eclipse Action 深入学习笔记(2)
2007-11-25 17:14 5218Object Action 这种Action是跟弹出的上下文菜 ... -
Eclipse Action 深入学习笔记(1)
2007-11-25 17:07 7672以前做插件用到的ActionSet都只是依葫芦画瓢,没有真正理 ... -
JFace Text Editor完全掌握之终极指南(4)
2007-11-24 17:08 5677错误标识(Error Marking) Error Marki ... -
JFace Text Editor完全掌握之终极指南(3)
2007-11-24 16:56 5506内容大纲 之所以要给编 ... -
JFace Text Editor完全掌握之终极指南(2)
2007-11-24 16:53 6734最后一步就是实现各种功能 语法高亮 首先我们要实现的是语法高亮 ... -
JFace Text Editor完全掌握之终极指南(1)
2007-11-24 16:17 9997JFace Text Editor是JFace里面一个功能强大 ... -
最近的Eclipse plugin开发总结
2007-11-24 11:30 4942List控件没有提供addDblClickListener方法 ... -
eclipse3.3关于JavaFileEditorInput兼容性问题的解决
2007-11-24 11:22 4676在eclipse3.3中,JavaFileEditor ... -
Eclipse WTP Projects Facets实战指南(2)
2007-11-21 21:13 5257修饰工作 给facet在选择列表中添加图标 格式如下: xml ... -
Eclipse WTP Projects Facets实战指南(1)
2007-11-21 20:21 9588这个文章基本是"Building Project F ... -
也说关于WizardPage的动态生成
2007-11-05 14:26 5159在Eclipse中一个Wizard=Wiza ... -
关于多页编辑器中不同Editor之间的Redo&Undo冲突的解决
2007-09-03 15:17 4061在我们的插件工具的开 ... -
TextEditor原理分析笔记
2007-08-23 15:48 3383Editor的语法着色原理:Eclipse使用damage , ... -
最近的Eclipse开发总结
2007-08-23 15:46 2122java.lang.IllegalAccessError: t ...
相关推荐
斑马ZT510打印机驱动文件
斑马zt410驱动是由斑马官方推出的打印机驱动程序,如果你的打印机与电脑的连接出现了异常而导致打印机无法正常的使用,下载此驱动能帮你很好的解决这个问题,欢迎购买了此型号打印机的朋友下载使用!斑马zt410打印机...
斑马zt210是一款专为中国市场设计的工业条码打印...这里给大家提供斑马zt210驱动下载,推荐有需要的用户下载安装。斑马zt210打印机优势:◆ 节省空间* 小巧紧凑和流线型设计可轻松放入空间非常有限的狭小,欢迎下载体验
斑马(Zebra)ZT230条码打印机是一款广泛应用在工业环境中的高效设备,其驱动程序是确保打印机正常工作的重要组成部分。本驱动程序专为Zebra的ZT210、ZT220及ZT230系列打印机设计,提供了全面的功能支持,以实现高...
斑马Zebra ZT510 驱动下载安装 使用中有任何问题可以关注并私信,如果资源对您有帮助记得关注收藏好评哟!
这款设备的开发资料包含在"证通ZT598金属键盘开发资料.rar"压缩包中,主要适用于那些进行嵌入式系统开发的工程师。在深入探讨其开发SDK之前,我们首先来了解一下ZT598金属键盘的关键特性。 证通ZT598金属键盘设计...
以下是对如何设置和使用斑马ZT210打印机的详细步骤: 首先,我们需要安装电脑驱动。双击下载好的驱动程序文件,按照提示进行解压、确认和下一步操作。在安装过程中,选择更新现有打印机驱动程序,等待安装完成。...
斑马zt420驱动是专为该型号推出的打印机驱动程序,它可以有效地解决打印机不能正常的连接电脑和电脑不能识别打印机的问题,让打印机进行正常的工作和运转,欢迎有需要的朋友下载使用!斑马Zebra打印机zt420参数简介...
《ZT213/ZT213LEEA:低功耗RS232多通道USB收发器/驱动器芯片详解》 ZT213/ZT213LEEA是一款专为低功耗应用设计的RS232多通道USB收发器和驱动器芯片,广泛应用于数据通信、工业控制、物联网设备等领域。本文将深入...
标题中的“ZT_中控 ID180身份证读卡器CS驱动!”表明这是一个关于中控(Zkteco)ID180型号的身份证读卡器的计算机软件(CS驱动)。这种驱动程序是用于帮助计算机识别和通信与硬件设备,如身份证读卡器,进行数据交换...
斑马打印机ZT411和ZT421是工业级条码和标签打印机,广泛应用于制造业、物流、零售业等对打印质量和效率有高要求的领域。这两款打印机以其出色的性能、耐用性和易用性赢得了用户的信赖。这份中文手册详细地介绍了ZT...
操作系统:Windows XP, Windows Vista, Windows 2008, Windows 2003, Windows 7, Windows 8, Windows 10, Windows Server 2012, Windows 8.1
本文将详细介绍如何安装斑马ZT230的驱动程序以及进行网络打印机的设置。 首先,安装斑马ZT230驱动程序是连接打印机到计算机的关键步骤。通常,这个过程包括以下步骤: 1. **下载驱动**:访问斑马技术(Zebra ...
Zebra ZT610驱动下载
本文将围绕“ZT_中控 ID180身份证读卡器BS驱动!”这一主题,详细介绍这款产品的功能、驱动程序的安装与使用以及相关文件解析。 1. **中控ID180身份证读卡器** 中控ID180是一款专为读取第二代居民身份证设计的读卡...
在使用证通密码键盘时,开发者或者系统集成员需要了解并能够熟练运用这些指令,以实现键盘的初始化、数据读取、错误处理等功能。串口指令集的特点是无需额外的驱动程序支持,简化了系统集成过程,使得设备能够直接与...
ZT短信平台接口开发文档
综上所述,"斑马zt410中文库"对于在中国或其他使用汉字的地区使用ZT410打印机是至关重要的,它确保了中文信息的准确无误打印,提升了工作效率和用户体验。正确安装和使用这个中文库,能充分发挥斑马ZT410打印机的...
在C#中操作斑马ZT210,你需要使用Zebra提供的SDK(软件开发工具包)。SDK通常包含API库,允许开发者通过编程语言与打印机进行通信。在本示例中,"ZebraPrintDemo"可能是一个C#项目,演示了如何使用这些API来控制...