﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-很久很久以前-随笔分类-EMF</title><link>http://www.blogjava.net/pandawang/category/6831.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 12:37:17 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 12:37:17 GMT</pubDate><ttl>60</ttl><item><title>EMF学习小记二</title><link>http://www.blogjava.net/pandawang/archive/2006/02/19/31541.html</link><dc:creator>Long Long Ago</dc:creator><author>Long Long Ago</author><pubDate>Sun, 19 Feb 2006 12:46:00 GMT</pubDate><guid>http://www.blogjava.net/pandawang/archive/2006/02/19/31541.html</guid><wfw:comment>http://www.blogjava.net/pandawang/comments/31541.html</wfw:comment><comments>http://www.blogjava.net/pandawang/archive/2006/02/19/31541.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pandawang/comments/commentRss/31541.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pandawang/services/trackbacks/31541.html</trackback:ping><description><![CDATA[<P><BR>现在来讨论一下emf所生成的几个plugin。一般通过ecore模型可以生成三个插件分别是emf模型，emf.edit和emf.editor。<BR>让我们现在看模型插件<BR>&nbsp;&nbsp;&nbsp; 对于所有的EPackage，都会生成两个或三个java package，本别是base package(*)，implemention package(*.impl),tool package(*.util)。其中，第三个包是可选的，这取决于生成属性的设置，默认是生成。包名(*)也是在生成属性中设置的。<BR>&nbsp;&nbsp;&nbsp; 对于所有EClass，在base package中生成相应的interface，而其java实现则在impl包中，如果一个EClass继承于另一个EClass，那么生成的interface和implemention都继承于相应的超类的interface和implemention。如果这个类有多个超类，那么在eSuperTypes中的第一个class将作为主超类(primary supertype)。对于这个子类的实现它将继承主超类的实现，并且实现其他超类接口中的方法。<BR>&nbsp;&nbsp;&nbsp; 对于Feature，getter和setter方法在类和接口中被定义。如果一个一个feature（成员变量）不是volatile，那么它的值会被存储在一个量值（field）中。如果一个feature是只读的，那么只生成它对应的getter方法。对于多值属性一般使用EList表示，而单值就用那个属性的类型表示。EList的类型取决于模型的约束，例如，一个non-containment reference将会使用EObjectWithInverseResolvingEList,对于一个containment reference将会使用EObjectContainmentWithInverseEList表示。<BR>&nbsp;&nbsp;&nbsp; 对于Operation，在包含类(containing class)的接口中生成一个公共方法标签，在对应的实现中生成实现骨架。<BR>&nbsp;&nbsp;&nbsp; 对于DataType，其中EEnum产生于一个继承了org.eclipse.common.util.AbstractEnumerator的实现。对于其他的EDataType，是没有接口和实现生成的，它们的实例化类就是直接使用了EAttribute的类型。<BR>再来看看edit插件：<BR>&nbsp;&nbsp;&nbsp; 对于edit插件provider package中的所有类都有相应的ItemProviders类生成。更进一步，对于整个插件有一个EMFPluginClass生成。ItemProvider类继承于org.eclipse.emf.edit.provider.ItemProviderAdaptor，用于适配模型中相应的EObject（所有emf类的基类）。当模型对象由于fireNotifyChanged()改变，ItemProvider会传送相应的通知，并过滤其他的。当你生成插件时，你可以控制哪些通知被过滤。<BR>&nbsp;&nbsp;&nbsp; ItemProvider也管理属性描述（property descriptors）对于所有的featur of the class，通过getImage和getText方法来管理类的icon和descrition。<BR>&nbsp;&nbsp;&nbsp; 对于所有的ItemProvider都有一个ItemProviderAdaptorFactory。<BR>最后时editor插件：<BR>&nbsp;&nbsp;&nbsp; 对于所有的模型都会再presentation package中生成三个类。<BR>&nbsp;&nbsp;&nbsp;&nbsp; 一个多页编辑器，它给模型创建几个不同的jface viewer，包含一个TreeViewer，使用edit插件中的ItemProvider作为这个treeviewer的content和label的provider。这个editor还创建outline和property来显示在viewer中选中对象的属性。<BR>&nbsp;&nbsp;&nbsp;&nbsp; 一个ActionBarContributor，它被用于对编辑器视图中选中的item所创建的context menu添加选项。<BR>&nbsp;&nbsp;&nbsp;&nbsp; 最后是一个向导，允许你创建一个包含模型对象的一个实例的资源(resource)。</P>
<P>&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;</P><img src ="http://www.blogjava.net/pandawang/aggbug/31541.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pandawang/" target="_blank">Long Long Ago</a> 2006-02-19 20:46 <a href="http://www.blogjava.net/pandawang/archive/2006/02/19/31541.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EMF学习笔记一</title><link>http://www.blogjava.net/pandawang/archive/2006/02/19/31472.html</link><dc:creator>Long Long Ago</dc:creator><author>Long Long Ago</author><pubDate>Sun, 19 Feb 2006 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/pandawang/archive/2006/02/19/31472.html</guid><wfw:comment>http://www.blogjava.net/pandawang/comments/31472.html</wfw:comment><comments>http://www.blogjava.net/pandawang/archive/2006/02/19/31472.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pandawang/comments/commentRss/31472.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pandawang/services/trackbacks/31472.html</trackback:ping><description><![CDATA[<P>EMF中的三个部分：元数据meta-data,代码生成code generation,默认序列化default serialization.<BR>EMF is part of the Model Driver Architecture(MDA).MDA是将整个应用软件生存周期的开发管理都集中于模型上。这种模型是用元模型(meta-model)定义的。然后，使用映射，模型被用于生成software artefacts, 这就实现了整个系统。<BR>EMF所能做的：emf能够用于描述和构建模型。所实现的模型可以被用于任何java应用程序的开发。<BR>对于ecore模型我们有几点需要注意：<BR>1。在ecore文件的xmi描述中没有各个元素之间的联系，我们使用EReference来表示各个元素之间的联系。<BR>&nbsp;&nbsp; 对于两个方向上的联系，通过两个成对的EReference来表示，每个联系的类，都有一个eOpposite来保存它自己在所联系类中的名字（引用）。<BR>&nbsp;&nbsp; 对于单方向上的联系，使用一个单独的EReference，并且这个reference没有eOpposite（因为对方并没有对自己的引用）。<BR>&nbsp;&nbsp; 连接的多重性通过upperBound和lowerBound来表示。多个用-1。<BR>2。使用EPackage可以像java中的package一样用。<BR>3。两种模型，一种是业务模型，一种是视图模型。一般将两种模型放在不同的package中。两种方法将两种模型联系起来：<BR>&nbsp;&nbsp; 一是构建一个新package，构建一个多重继承的新package来将两个package联系起来。<BR>&nbsp;&nbsp; 二是将两种模型分开存储，添加从视图模型到业务模型的引用。这种方法两个模型是松耦合的。这种单方向的引用也不会破坏（污染）业务模型。注意，由于这种引用是两个package之间的，所以在移用的eType类型中需要指明包名。&nbsp;&nbsp; </P>
<P>除此之外，ecore还提供了一种递归的定义方法。就是使用eSubPackage来分别包含业务模型和视图模型，并且在这两个subPackage间建立reference（对于package来说是自己引用自己）。<BR>4。我们可以有多种方法来生成ecore模型。通过注释的java接口(annotated java interface),通过rantional rose创建模型，通过XML Schema等等。</P><img src ="http://www.blogjava.net/pandawang/aggbug/31472.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pandawang/" target="_blank">Long Long Ago</a> 2006-02-19 15:32 <a href="http://www.blogjava.net/pandawang/archive/2006/02/19/31472.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>