- 浏览: 2469427 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (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查询
★emf 运行时编程
★通过package和factory我们可以非常方便的取得class的metamodel信息,并且创建class instance。
★EClass,EPackage,EFactory提供了一些通用的方法,由此派生而来的class,package,factory则提供了更多便利的方法以供我们使用。
★访问指定的class除了通过package的getXxxx()方法之外,还可以取得那些没有generated的class,其用法是XxxxPackage.getEClassifier("Yyyyy")。
★通过package,我们可以遍历访问所有的class(以及attribute,reference,operation),datatype,enumeration
★访问package中所有的类使用EPackage.getEClassifiers()方法,遍历EClass所有属性用EClass.getEAttributes()方法,遍历reference用EClass.getEReferences()方法
★通过package创建制定类实例的几种做法:第一种就是使用XxxxPackage.createYyyy();第二种则是先通过XxxxPackage.eINSTANCE.getYyyyy()这种方式得到相关的实例类,以及XxxxFactory.eINSTANCE得到factory实例,最后使用xxxxFactory.create(yyyyClass)创建实例。
★通过一个给定的class name和相关的package uri创建类实例,一般为了得到类实例,我们需要得到class以及factory,而这些都可以通过package取得(通过getEClassifier()和getEFactoryInstance()方法)
★EPackage是对ecore xml文件的一个序列化对象,因此可以直接使用resouce,从一个ecore文件得到package对象,实际上这是一种比较底层的做法,通常我们不这样做,而是通过使用Package的Registry来映射到给定uri的package对象,Registry从java.util.Map继承而来,通过uri跟一个Package或者Package.Discriptor关联,这里的Discriptor主要在plugin模式下使用,除非真的需要Package,否则在初始化的时候将Discriptor注册到Registry中。在需要使用Package的时候,则通过Discriptor来取得(通过调用其getEPackage()方法),通过EPackage ePackage = EPackage.Registry.INSTANCE.getEPackage(packageNsURI)方法,我得到了package,接着得到class name和factory以及最终所需要的class instance就易如反掌了。
★emf presistence framework
★emf的持久化机制主要围绕4个接口:Resource,ResourceSet,Resource.Factory, URIConvertor。通过这4个接口便可以实现emf model的加载和保存
★URI 统一资源标识是一个标识和定义各种类型(文件、网络、数据库、文件对象以及数据流)资源开放标准。一个URI由三部分组成:scheme,scheme-specific以及fragment(可选)。org.eclipse.emf.common.util.URI是对URI的一种封装,scheme标识访问resource协议,文件为file,jar为jar,eclipse为platform
★file:/c:/dir1/dir2/myfile.xml和file:///c:/dir1/dir2/myfile.xml表示的资源是同一个,但是却是不同的URI对象
★scheme-specific由authority,device以及其他的segment组成,authority由//打头,device和segment都是以/打头,uri中从#开始往后都是fragment
★emf使用带有fragment的URI就可以引用到指定的EObject
★URIConvertor 用来将一个uri跟一个实际的uri建立映射关系,比如将一个namespace uri(http:///com/example/epo2.ecore)映射为一个物理uri(platform:/resource/project/somemodel.ecore),它还有一个功能就是normalize,也就是convert的意思,没明白这个机制
★URIConvertor提供createInputStream() and createOutputStream()两个方法,用来在制定的uri上打开两个input和output stream。
★Resouce表示一个EObject集合的持久容器,可以通过URI来进行定位,Resource.getContents()的add方法向一个Resource添加一个EObject,也可以通过给容器类型的关联添加一个引用来给Resource添加一个EObject,Resource比较重要的是save()和load()方法,这两个方法定义了持久化的格式,还有getEObject()和getURIFragment()方法则用来使用URI查找对象
★save和load方法的实现机制:首先使用URIConvertor将指定的uri进行转换,然后打开相应的stream,接着调用doSave和doLoad方法,这些方法交给子类去实现,在save和load两个方法调用中会传一个map参数,这个参数用来控制save和load的行为
★Resource.Factory 用来创建resoruce对象的,所有的factory都使用一个map的registry来加以管理,跟package的registry一样的做法,不同之处它是根据uri scheme以及extension来进行分类注册的。在plugin中默认情况下所有的emf model都使用XMIResourceFactoryImpl,如果要自定义factory,可以通过添加扩展点org.eclipse.emf.ecore.extension_parser,并指定自己的factory实现,一般情况下resource factory只是用来给resourceset来使用
★ResourceSet 用来管理已经load和create的resource集合,主要使用createResource(),getResource(),getEObject()这几个方法。createResource()用于在set中创建一个空的resource对象,getResource()也会先创建一个Resource,然后用指定的resource URI去加载指定的resource,getEObject()则在已有的resource(或者根据uri调用getResource()方法先加载resource)中根据需要加载EObject,
★除了可以直接通过new以及resource.factory的createResource()方法来创建resource对象之外,也可以通过调用ResourceSet的getResource() and createResource()方法来创建(其内部会调用resource.factory的相应方法),这样做的一个重要原因是它能够跟踪某个uri是否已经被打开,这样可以避免内存里面出现两份一样的resource,resource set还可以按需加载当前resource对另外一个resource的引用
★使用ResourceSet的时候需要resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(Resource.Factory.Registry.DEFAULT_EXTENSION,new XMIResourceFactoryImpl());这样设置一把,否则会因为找不到rsourceFactory而无法使用resource
★
★emf resource implementation
★在生成一对一的属性的时候,会在当前节点上以attribute的形式添加
★在生成一对多的属性的时候,会在当前节点中以子节点的方式添加属性
★在生成包含关系的引用的时候,会在当前节点中以子节点的方式添加引用节点
★在生成非包含关系的引用的时候,会在当前节点中以attribute的形式引用子节点的fragment,但是如果设置在被包含引用的iD属性的话,则采用id的方式加以引用。
★在创建交叉引用的时候需要把resource的save放在所有resource生成之后。交叉引用可以使用相对路径也可以使用绝对路径,但是相对路径更好一些,因为可移植性更好,要做到使用相对路径引用,则需要在创建resource的时候使用绝对uri路径
★如果引用存在继承关系,那么对于引用的具体子类,会在生成的xml中添加xmi:type属性来表明具体引用的是哪个子类
★
★xml输出的定制
★OPTION_DECLARE_XML为false标识没有xml头声明
★OPTION_LINE_WIDTH好像没有效果
★OPTION_USE_ENCODED_ATTRIBUTE_STYLE 为true则总是使用uri方式来进行引用
★OPTION_SKIP_ESCAPE为true(默认为true)表示针对转义字符(<,>,&)进行转换
★OPTION_XML_MAP 用来将制定的节点内容进行转换
★OPTION_ENCODING为xml设置字符集
★xml输入定制
★OPTION_DISABLE_NOTIFY 为true取消触发通知
★OPTION_XML_MAP 在save的时候使用了OPTION_XML_MAP,那么在load的时候也要使用
★
★adapter编程
★给一个model object添加一个adapter有三种方式:第一种通过model object的eAdapters属性将一个adapter跟model关联起来;第二种通过adapter factory的adapt方法将一个adapter与一个model object关联起来;第三种通过扩展已有的adapter factory创建制定类型的adapter来与model object关联。
★Notification用来封装通知信息,这里除了getNotifier()方法返回通知的发送者之外,还包括通知的类型,发生改变的feature(即 feature id),改动前后的值,如果需要屏蔽掉非状态改变的通知,则可以使用isTouch()方法来实现。
★通过adapter除了可以给一个model object添加一个监听器之外,还可以用来给model object增加一些功能。其做法是先定义一个需要实现功能的接口,然后实现该接口并扩展AdapterImpl实现一个Adapter,并创建一个adapter factory来负责创建该adapter,最后通过adapter factory的adapt()方法将model object与前面定义的接口关联起来,这样model object就被扩展成具有该接口的一些功能了。
★通过package和factory我们可以非常方便的取得class的metamodel信息,并且创建class instance。
★EClass,EPackage,EFactory提供了一些通用的方法,由此派生而来的class,package,factory则提供了更多便利的方法以供我们使用。
★访问指定的class除了通过package的getXxxx()方法之外,还可以取得那些没有generated的class,其用法是XxxxPackage.getEClassifier("Yyyyy")。
★通过package,我们可以遍历访问所有的class(以及attribute,reference,operation),datatype,enumeration
★访问package中所有的类使用EPackage.getEClassifiers()方法,遍历EClass所有属性用EClass.getEAttributes()方法,遍历reference用EClass.getEReferences()方法
★通过package创建制定类实例的几种做法:第一种就是使用XxxxPackage.createYyyy();第二种则是先通过XxxxPackage.eINSTANCE.getYyyyy()这种方式得到相关的实例类,以及XxxxFactory.eINSTANCE得到factory实例,最后使用xxxxFactory.create(yyyyClass)创建实例。
★通过一个给定的class name和相关的package uri创建类实例,一般为了得到类实例,我们需要得到class以及factory,而这些都可以通过package取得(通过getEClassifier()和getEFactoryInstance()方法)
★EPackage是对ecore xml文件的一个序列化对象,因此可以直接使用resouce,从一个ecore文件得到package对象,实际上这是一种比较底层的做法,通常我们不这样做,而是通过使用Package的Registry来映射到给定uri的package对象,Registry从java.util.Map继承而来,通过uri跟一个Package或者Package.Discriptor关联,这里的Discriptor主要在plugin模式下使用,除非真的需要Package,否则在初始化的时候将Discriptor注册到Registry中。在需要使用Package的时候,则通过Discriptor来取得(通过调用其getEPackage()方法),通过EPackage ePackage = EPackage.Registry.INSTANCE.getEPackage(packageNsURI)方法,我得到了package,接着得到class name和factory以及最终所需要的class instance就易如反掌了。
★emf presistence framework
★emf的持久化机制主要围绕4个接口:Resource,ResourceSet,Resource.Factory, URIConvertor。通过这4个接口便可以实现emf model的加载和保存
★URI 统一资源标识是一个标识和定义各种类型(文件、网络、数据库、文件对象以及数据流)资源开放标准。一个URI由三部分组成:scheme,scheme-specific以及fragment(可选)。org.eclipse.emf.common.util.URI是对URI的一种封装,scheme标识访问resource协议,文件为file,jar为jar,eclipse为platform
★file:/c:/dir1/dir2/myfile.xml和file:///c:/dir1/dir2/myfile.xml表示的资源是同一个,但是却是不同的URI对象
★scheme-specific由authority,device以及其他的segment组成,authority由//打头,device和segment都是以/打头,uri中从#开始往后都是fragment
★emf使用带有fragment的URI就可以引用到指定的EObject
★URIConvertor 用来将一个uri跟一个实际的uri建立映射关系,比如将一个namespace uri(http:///com/example/epo2.ecore)映射为一个物理uri(platform:/resource/project/somemodel.ecore),它还有一个功能就是normalize,也就是convert的意思,没明白这个机制
★URIConvertor提供createInputStream() and createOutputStream()两个方法,用来在制定的uri上打开两个input和output stream。
★Resouce表示一个EObject集合的持久容器,可以通过URI来进行定位,Resource.getContents()的add方法向一个Resource添加一个EObject,也可以通过给容器类型的关联添加一个引用来给Resource添加一个EObject,Resource比较重要的是save()和load()方法,这两个方法定义了持久化的格式,还有getEObject()和getURIFragment()方法则用来使用URI查找对象
★save和load方法的实现机制:首先使用URIConvertor将指定的uri进行转换,然后打开相应的stream,接着调用doSave和doLoad方法,这些方法交给子类去实现,在save和load两个方法调用中会传一个map参数,这个参数用来控制save和load的行为
★Resource.Factory 用来创建resoruce对象的,所有的factory都使用一个map的registry来加以管理,跟package的registry一样的做法,不同之处它是根据uri scheme以及extension来进行分类注册的。在plugin中默认情况下所有的emf model都使用XMIResourceFactoryImpl,如果要自定义factory,可以通过添加扩展点org.eclipse.emf.ecore.extension_parser,并指定自己的factory实现,一般情况下resource factory只是用来给resourceset来使用
★ResourceSet 用来管理已经load和create的resource集合,主要使用createResource(),getResource(),getEObject()这几个方法。createResource()用于在set中创建一个空的resource对象,getResource()也会先创建一个Resource,然后用指定的resource URI去加载指定的resource,getEObject()则在已有的resource(或者根据uri调用getResource()方法先加载resource)中根据需要加载EObject,
★除了可以直接通过new以及resource.factory的createResource()方法来创建resource对象之外,也可以通过调用ResourceSet的getResource() and createResource()方法来创建(其内部会调用resource.factory的相应方法),这样做的一个重要原因是它能够跟踪某个uri是否已经被打开,这样可以避免内存里面出现两份一样的resource,resource set还可以按需加载当前resource对另外一个resource的引用
★使用ResourceSet的时候需要resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(Resource.Factory.Registry.DEFAULT_EXTENSION,new XMIResourceFactoryImpl());这样设置一把,否则会因为找不到rsourceFactory而无法使用resource
★
★emf resource implementation
★在生成一对一的属性的时候,会在当前节点上以attribute的形式添加
★在生成一对多的属性的时候,会在当前节点中以子节点的方式添加属性
★在生成包含关系的引用的时候,会在当前节点中以子节点的方式添加引用节点
★在生成非包含关系的引用的时候,会在当前节点中以attribute的形式引用子节点的fragment,但是如果设置在被包含引用的iD属性的话,则采用id的方式加以引用。
★在创建交叉引用的时候需要把resource的save放在所有resource生成之后。交叉引用可以使用相对路径也可以使用绝对路径,但是相对路径更好一些,因为可移植性更好,要做到使用相对路径引用,则需要在创建resource的时候使用绝对uri路径
★如果引用存在继承关系,那么对于引用的具体子类,会在生成的xml中添加xmi:type属性来表明具体引用的是哪个子类
★
★xml输出的定制
★OPTION_DECLARE_XML为false标识没有xml头声明
★OPTION_LINE_WIDTH好像没有效果
★OPTION_USE_ENCODED_ATTRIBUTE_STYLE 为true则总是使用uri方式来进行引用
★OPTION_SKIP_ESCAPE为true(默认为true)表示针对转义字符(<,>,&)进行转换
★OPTION_XML_MAP 用来将制定的节点内容进行转换
★OPTION_ENCODING为xml设置字符集
★xml输入定制
★OPTION_DISABLE_NOTIFY 为true取消触发通知
★OPTION_XML_MAP 在save的时候使用了OPTION_XML_MAP,那么在load的时候也要使用
★
★adapter编程
★给一个model object添加一个adapter有三种方式:第一种通过model object的eAdapters属性将一个adapter跟model关联起来;第二种通过adapter factory的adapt方法将一个adapter与一个model object关联起来;第三种通过扩展已有的adapter factory创建制定类型的adapter来与model object关联。
★Notification用来封装通知信息,这里除了getNotifier()方法返回通知的发送者之外,还包括通知的类型,发生改变的feature(即 feature id),改动前后的值,如果需要屏蔽掉非状态改变的通知,则可以使用isTouch()方法来实现。
★通过adapter除了可以给一个model object添加一个监听器之外,还可以用来给model object增加一些功能。其做法是先定义一个需要实现功能的接口,然后实现该接口并扩展AdapterImpl实现一个Adapter,并创建一个adapter factory来负责创建该adapter,最后通过adapter factory的adapt()方法将model object与前面定义的接口关联起来,这样model object就被扩展成具有该接口的一些功能了。
发表评论
-
Java程序员25个必备的Eclipse插件
2012-01-12 22:36 21925原文:http://www.fromdev.com/2012/ ... -
关于插件更新安装的错误
2007-12-21 20:12 2209在更新插件的时候出现这样的错误: Unable to comp ... -
最近做eclipse branding, features的一些经验
2007-12-16 01:24 4527知道eclipse的splash怎么做 ... -
GEF学习笔记
2007-12-07 20:20 4151GEF以前学习过, 而且还 ... -
SWT布局深入学习
2007-11-30 23:00 7938以下内容是学习"The Definitive Gui ... -
Eclipse Action 深入学习笔记(3)
2007-11-25 17:59 4079filter元素是用来指定当 ... -
Eclipse Action 深入学习笔记(2)
2007-11-25 17:14 5200Object Action 这种Action是跟弹出的上下文菜 ... -
Eclipse Action 深入学习笔记(1)
2007-11-25 17:07 7663以前做插件用到的ActionSet都只是依葫芦画瓢,没有真正理 ... -
JFace Text Editor完全掌握之终极指南(4)
2007-11-24 17:08 5671错误标识(Error Marking) Error Marki ... -
JFace Text Editor完全掌握之终极指南(3)
2007-11-24 16:56 5499内容大纲 之所以要给编 ... -
JFace Text Editor完全掌握之终极指南(2)
2007-11-24 16:53 6723最后一步就是实现各种功能 语法高亮 首先我们要实现的是语法高亮 ... -
JFace Text Editor完全掌握之终极指南(1)
2007-11-24 16:17 9985JFace Text Editor是JFace里面一个功能强大 ... -
最近的Eclipse plugin开发总结
2007-11-24 11:30 4936List控件没有提供addDblClickListener方法 ... -
eclipse3.3关于JavaFileEditorInput兼容性问题的解决
2007-11-24 11:22 4667在eclipse3.3中,JavaFileEditor ... -
Eclipse WTP Projects Facets实战指南(2)
2007-11-21 21:13 5251修饰工作 给facet在选择列表中添加图标 格式如下: xml ... -
Eclipse WTP Projects Facets实战指南(1)
2007-11-21 20:21 9583这个文章基本是"Building Project F ... -
也说关于WizardPage的动态生成
2007-11-05 14:26 5153在Eclipse中一个Wizard=Wiza ... -
关于多页编辑器中不同Editor之间的Redo&Undo冲突的解决
2007-09-03 15:17 4056在我们的插件工具的开 ... -
TextEditor原理分析笔记
2007-08-23 15:48 3376Editor的语法着色原理:Eclipse使用damage , ... -
最近的Eclipse开发总结
2007-08-23 15:46 2105java.lang.IllegalAccessError: t ...
相关推荐
EMF(Eclipse Modeling Framework)是Eclipse基金会提供的一款强大的模型化开发框架,主要用于构建基于模型的应用程序。它建立在Java平台上,为开发者提供了一种高效的方法来处理复杂的软件建模任务,支持元数据驱动...
《Eclipse开发使用GEF和EMF》是IBM红皮书系列中的一部经典著作,主要探讨了如何在Eclipse环境中利用GEF(图形编辑框架)和EMF( Eclipse模型框架)进行图形化应用程序的开发。这两项技术是Eclipse平台上的核心组件,...
2. **EMF.Edit**:这部分建立在Ecore之上,提供了一组用于查看和修改模型的方法,还包括了一个内置的模型编辑器,使得开发人员可以直接在Eclipse环境中对模型进行操作。 #### EMF的适用场景 EMF非常适合于那些需要...
基于Eclipse的EMF插件开发程序详解 在本文中,我们将讨论基于Eclipse的EMF插件开发程序的相关知识点。EMF(Eclipse Modeling Framework)是一种基于Eclipse的模型驱动架构(MDA)工具,用于构建复杂的模型驱动应用...
Java开发工具EMF插件是Java开发者在进行模型驱动工程(Model Driven Engineering,MDE)时常用的一个强大工具。EMF(Eclipse Modeling Framework)是Eclipse IDE的一部分,它提供了一种框架和API,用于构建基于模型...
EMF API文档是开发者理解和使用EMF的关键资源,它详细解释了EMF的各种类、接口、方法和概念,帮助开发者在构建模型驱动的应用时进行有效的编程。文档通常包括以下几个主要部分: 1. **基础概念**:EMF的基础概念...
EMF为开发者提供了构建和使用模型化软件的基础设施,使得开发人员可以以模型为中心进行编程,提高代码的可维护性和可复用性。它基于通用建模语言(Unified Modeling Language, UML),但不局限于UML,可以用于创建...
**微软EMF文件格式详解.pdf**:这份文档很可能是微软官方或第三方专家提供的关于EMF格式的详细指南。通常,它会涵盖EMF的基本结构、记录类型、图形操作、颜色管理、图元定义等内容。通过阅读这份文档,读者可以了解...
此外,本文档还将详细介绍EMF开发指南之Command Framework、Item Provider、Editor、属性详解、Attribute详解、Reference详解、客户端编程等方面的内容。 本文档旨在为读者提供一个详细的eclipse插件开发经验总结,...
这些文件可能包含了关于EMF的具体教程或指南: 1. "使用 EMF 进行元建模:生成具体、可重用的 Java 代码片段" 这篇文档可能详细讲解了如何使用EMF的代码生成功能,将元模型转换为可执行的Java代码,实现模型到代码...
在本文中,我们将深入探讨如何基于Eclipse的EMF(Eclipse Modeling Framework)插件来开发图形化编辑程序。EMF是Eclipse平台的核心部分,它提供了一套强大的工具和库,用于构建模型驱动的软件应用程序。让我们一起...
- **软件开发**:许多软件开发工具都支持EMF格式,使得开发者能够轻松地将高质量的图形嵌入到他们的应用程序中。 - **CAD系统**:计算机辅助设计(CAD)系统也经常使用EMF格式来保存复杂的图形设计,因为它的高保真度...
EMF的官方文档和相关资源可以在Eclipse官方网站上找到,包括用户指南、开发指南和技术文档等。 ##### 1.2 框架基础 **1.2.1 前提条件** - 必须安装Eclipse IDE。 - 推荐熟悉Java编程语言。 - 对面向对象的设计有...
在本项目中,我们关注的是如何将EMF图片转换为PNG格式,这通常涉及到图像处理和编程技术。`freehep`是一个开源的Java库,专门用于2D图形和图像处理,其中包括了将EMF转换为其他格式的功能。`freehep`库是由Heiko ...
### EMF自学笔记知识点详述 ...总之,EMF提供了一种灵活、高效、强大的模型驱动开发方式,它不仅简化了开发过程,提高了开发效率,而且促进了软件工程的标准化和自动化,为构建高质量的软件系统提供了有力的支持。
EMF(Eclipse Modeling Framework)是Eclipse基金会推出的一个开源...通过本教程,你将掌握EMF的基本概念和操作,以及如何利用EMF插件提升开发效率。在实践中不断探索,你将能够自如地运用EMF构建复杂的模型驱动系统。
Eclipse是一个集成开发环境(IDE),支持多种编程语言和插件,EMF相关的插件使得在Eclipse中进行模型驱动开发变得更加便捷。 使用这个SDK,开发者可以按照以下步骤进行工作: 1. **定义模型**:首先,使用XSD编写...