Chinaunix首页 | 论坛 | 博客
  • 博客访问: 99831
  • 博文数量: 40
  • 博客积分: 426
  • 博客等级: 下士
  • 技术积分: 305
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-02 11:04
文章分类

全部博文(40)

文章存档

2013年(1)

2012年(1)

2011年(38)

我的朋友

分类:

2011-03-04 13:05:50

声明:本文为原创
#####请转贴时保留以下内容######
作者GTT
本文档归属http://oldtown.cublog.cn/.转载请注明出处!
请提出宝贵意见Mail:mtloveft@hotmail.com
提示本文是关于介绍EMF,即Eclipse modeling Framework
 
下面介绍EMF中的Eclipse扩展点
截图如下
 
即EMF提供了9种扩展点
 

generated_package

dynamic_package

factory_override

extension_parser

protocol_parser

content_parser

content_handler

uri_mapping

package_registry_implementation

 

下面一一详细介绍

 

generated_package是最重要的扩展点了。

就是注册一个EPackage,注册时必须提供一个唯一的URI,

同时还必须指出,EPackage,genModel属性是可选的,genmodel文件的地址。

它将被注册到一个全局的EPackage.Registry.INSTANCE里。

ecore项目注册了3EPackage

 

定义分别如下

 

     

            uri=""

            class="org.eclipse.emf.ecore.EcorePackage"

            genModel="model/Ecore.genmodel"/>

  

 

  

 

     

            uri=""

            class="org.eclipse.emf.ecore.xml.type.XMLTypePackage"

            genModel="model/XMLType.genmodel"/>

  

 

  

     

            uri=""

            class="org.eclipse.emf.ecore.xml.namespace.XMLNamespacePackage"

            genModel="model/XMLNamespace.genmodel"/>

  

 

 

3EPackage就是所有EMF项目的基础了。

每个应用程序注册自己的EPackage时都要用到以上ECorePackage。

而从XMLSchema导入的EMF程序则要用到XMLTypePackage

 

 

dynamic_package扩展点是注册动态EPackage

所谓动态EPackage,就是一个EPackage可能被分割注册到多个项目中,

但是他们的URI都是相同的。这个扩展点很有用的,扩展性也很强,是柔软设计。

比如我设计好了一个xml Schema,但不能确定这个xml Schema将来会扩展到什么程度,

但知道一定会扩展的。这时利用这个dynamic_package,就可以解决问题。

在我的实际项目中就有这个问题。比如在一个xmlSchema,我定义了,ftp,snmp,telnet,

shell等功能,但将来肯定会扩展,比如什么windowscommand,tl1,还有自定义的通信等。

这样xmlSchema是不断扩展的。利用dynamic_package就能解决这个问题。

否则,xmlSchema文件本身将不断的更新。xmlSchema文件也将被分割成多个Schema了。

柔软,扩张,都将大大提高。

 

 

factory_overrideEFactory进行重写,要提供URI。我认为这个很少用到。

extension_parser这个就经常用到了。就是根据文件的后缀子进行文件类型。

注册了的扩展点将被保存到全局变量Resource.Factory.Registry.INSTANCE里。

需要提供typeclass

protocol_parser扩展点是注册一个特殊URIprotocol。首先要知道URI的构成比如

schema:schema-specificPart#optionFragment

经常提到的是URL。根据RFC3305还有一个URN

URI(Uniform Resource Indentifier),统一资源标识符

URL(uniform Resource Location)     ,统一资源定位符

URN(uniform Resource Name)         ,统一资源名称

其实这3个东西很好理解的。URN就是名字,URL就是地址。

URI即使以上两个的结合。

URL的构成是protocol://host/dir

上面的dir也可以是文件,所以以上格式中的dir就是URN,

protocol://host就是URL。是资源存放的位置。

URL中的protocol就是URIschema啦。

这个扩展点就是解析URI,遇到不能解析的protocol时将被调用。

注册了的扩展点也将被保存到全局变量Resource.Factory.Registry.INSTANCE里。

content_parser扩展点是注册对文件内容进行解析来判断文件类型的扩展点。

简单的说,比如给定一个XML文件,对这个XML文件的root元素进行解析,

如果是xxx,那么就可以确定这个XML文件是我们定义好的,这个解析需要先注册。

注册了的扩展点将被保存到全局的Resource.Factory.Registry.INSTANCE变量里。

这个扩展点需要指出contentTypeIdentifier,这个contentTypeIdentifier又是

org.eclipse.core.contenttype.contentTypes这个扩展点定义的。所以先要

扩展org.eclipse.core.contenttype.contentTypes,之后才能扩展content_parser

content_handler扩展点是注册一个根据handler判断文件类型的扩展点。

注册了的扩展点将被保存到ContentHandler.Registry.INSTANCE里。

uri_mapping扩展点是用来进行URI转换时调用的。

package_registry_implementation没用过,感觉没什么用,就不说了。

 

 

读这些扩展点的程序分别为

GeneratedPackageRegistryReader

DynamicPackageRegistryReader

FactoryOverrideRegistryReader

ExtensionParserRegistryReader

ProtocolParserRegistryReader

ContentParserRegistryReader

ContentHandlerRegistryReader

URIMappingRegistryReader

package_registry_implementation扩展点是由一个内部类读入的。

读入+解析的过程就不介绍了。很简单的。

有一点需要说明的是,这些读入过程都是在EMF插件启动时进行的。

当一个EMF应用程序插件启动时,可能EMF插件还没启动,

因为所有的EMF应用程序插件都依赖于EMF插件,所以EMF插件肯定

先被启动,也就是说,这些扩展点先被预读了。

 
阅读(607) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~