??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品**中文毛片,日韩亚洲一区二区三区,亚洲天天在线日亚洲洲精http://www.tkk7.com/xiaoxiaoleemin/category/20295.html天道酬勤Q小加?/description>zh-cnTue, 08 May 2007 03:17:10 GMTTue, 08 May 2007 03:17:10 GMT60EMF建模常见问题http://www.tkk7.com/xiaoxiaoleemin/archive/2007/05/07/115626.htmlxiaoxiaoleeminxiaoxiaoleeminMon, 07 May 2007 06:10:00 GMThttp://www.tkk7.com/xiaoxiaoleemin/archive/2007/05/07/115626.htmlhttp://www.tkk7.com/xiaoxiaoleemin/comments/115626.htmlhttp://www.tkk7.com/xiaoxiaoleemin/archive/2007/05/07/115626.html#Feedback0http://www.tkk7.com/xiaoxiaoleemin/comments/commentRss/115626.htmlhttp://www.tkk7.com/xiaoxiaoleemin/services/trackbacks/115626.html    1.Ecore Editor中根元素的直接子元素属性页中有“Ns Prefix"?Ns URI"两项需要设|,前者可以设|ؓ模型的名字,后者随便设|一个URI地址Q如"http://"+模型名字。如果这两项不设|,那么当修改了ecore模型后,从genmodel?#8220;Reload" ecore模型时出错?br>    2.某个EReference如果多重性ؓ"0...*",则在属性页中把lower bound讄?Qupper bound讄?1?br>    3.genmodel根元素的W一层子元素的属性页中,"All"cd?#8220;prefix”属性值是指EMF生成的代码中Factory和Package{类的前~Q可以指定ؓ模型名字Q首字母大写以符合类名的习惯Q?#8220;base package”属性值是生成的各个包的前~Q假设指定ؓ“com.example"。然后有“Ecore”cdQ其中的各个属性值是从ecore模型中读q来的,不可修改Q其?#8220;Package”cd下的"Name"属性值是包名的一部分Q假设指定ؓmodelQ,接在前面的base packageg后,那么生成的Model 部分代码分别有三个包Qcom.example.model; com.example.model.impl; com.example.model.util. 
   btwQ在有的GMF 版本中,如果包名存在首字母大写的单词Q那么生成代码的时候会出错?br>


xiaoxiaoleemin 2007-05-07 14:10 发表评论
]]>
如何昄PropertySheet视图http://www.tkk7.com/xiaoxiaoleemin/archive/2007/05/06/115517.htmlxiaoxiaoleeminxiaoxiaoleeminSun, 06 May 2007 09:24:00 GMThttp://www.tkk7.com/xiaoxiaoleemin/archive/2007/05/06/115517.htmlhttp://www.tkk7.com/xiaoxiaoleemin/comments/115517.htmlhttp://www.tkk7.com/xiaoxiaoleemin/archive/2007/05/06/115517.html#Feedback2http://www.tkk7.com/xiaoxiaoleemin/comments/commentRss/115517.htmlhttp://www.tkk7.com/xiaoxiaoleemin/services/trackbacks/115517.html阅读全文

xiaoxiaoleemin 2007-05-06 17:24 发表评论
]]>
《EMFQA Developer's Guide》读书笔记第三章 QModel Editing with EMF.EditQ下Q?/title><link>http://www.tkk7.com/xiaoxiaoleemin/archive/2007/05/05/115439.html</link><dc:creator>xiaoxiaoleemin</dc:creator><author>xiaoxiaoleemin</author><pubDate>Sat, 05 May 2007 12:44:00 GMT</pubDate><guid>http://www.tkk7.com/xiaoxiaoleemin/archive/2007/05/05/115439.html</guid><wfw:comment>http://www.tkk7.com/xiaoxiaoleemin/comments/115439.html</wfw:comment><comments>http://www.tkk7.com/xiaoxiaoleemin/archive/2007/05/05/115439.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/xiaoxiaoleemin/comments/commentRss/115439.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/xiaoxiaoleemin/services/trackbacks/115439.html</trackback:ping><description><![CDATA[     摘要: 上一部分中,我们看到了如何通过content和label provider来显CEMF模型Q这一部分介绍如何修改、编辑EMF模型。EMF.Edit支持ZCommand的模型编辑方式,可以自动的undo和redo。EMF.Edit的Command Framework可以分ؓ两部分,W一部分是common command frameworkQ其中定义了一些基本的命o接口Q实C例如basic command stack,compound command{,虽然q些命o主要用于EMF.Edit,但是实际上可以独立于EMF.Edit使用Q第二部分是EMF.Edit 命oQ是指一些专门编辑EObject的命令?nbsp; <a href='http://www.tkk7.com/xiaoxiaoleemin/archive/2007/05/05/115439.html'>阅读全文</a><img src ="http://www.tkk7.com/xiaoxiaoleemin/aggbug/115439.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xiaoxiaoleemin/" target="_blank">xiaoxiaoleemin</a> 2007-05-05 20:44 <a href="http://www.tkk7.com/xiaoxiaoleemin/archive/2007/05/05/115439.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《EMFQA Developer's Guide》读书笔记第三章 QModel Editing with EMF.EditQ上Q?/title><link>http://www.tkk7.com/xiaoxiaoleemin/archive/2007/05/05/115355.html</link><dc:creator>xiaoxiaoleemin</dc:creator><author>xiaoxiaoleemin</author><pubDate>Sat, 05 May 2007 10:08:00 GMT</pubDate><guid>http://www.tkk7.com/xiaoxiaoleemin/archive/2007/05/05/115355.html</guid><wfw:comment>http://www.tkk7.com/xiaoxiaoleemin/comments/115355.html</wfw:comment><comments>http://www.tkk7.com/xiaoxiaoleemin/archive/2007/05/05/115355.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/xiaoxiaoleemin/comments/commentRss/115355.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/xiaoxiaoleemin/services/trackbacks/115355.html</trackback:ping><description><![CDATA[    本书的第二章介绍了EMF产生的Model部分的代码,你可以用EMF Edit Framework来ؓmodel构徏功能强大的视囑֒~辑器。在EMFZ生成的编辑器里,可以~辑Q复Ӟ_脓Q拖拽等Q、显CmodelQ还可以无限的redo/undo。如果这个编辑器不能完全满你的需求,你可以在此基上做一些修改,肯定比从头开始写节约旉?br>    Eclipse通过JFace中的一些Viewer来显C结构化的数据,q些Viewer不直接从model中获取要昄的数据,而是通过ContentProvider和LabelProvider来取得要昄的内宏V文本以及图标等信息。不同的Viewer需要不同的ContentProvider和LabelProviderQ?br>    <table width=419 border=1> <tbody> <tr> <td vAlign=center align=left> Viewer</td> <td>ContentProvider</td> <td>LabelProvider<br></td> </tr> <tr> <td> ListViewer<br></td> <td vAlign=center align=left>IStructureContentProvider  <br></td> <td>ILabelProvider<br></td> </tr> <tr> <td vAlign=center align=left> TreeViewer</td> <td vAlign=center align=left>ITreeContentProvider <br></td> <td vAlign=center align=left>ILabelProvider <br></td> </tr> <tr> <td vAlign=center align=left> TableViewer</td> <td vAlign=center align=left>IStructureContentProvider <br></td> <td vAlign=center align=left>ITableLabelProvider <br></td> </tr> </tbody> </table>     其中ILabelProvider有getText(Object)和getImage(Object)两个ҎQITableLabelProvider有getColumnText(Object, int)和getColumnImage(Object,int)两个ҎQ它们之间没有承关pRIStructureContentProvider有getElements(Object)ҎQ返回一个Object数组Q而ITreeContentProvider是其子类Q另有自qҎgetChildren(Object),getParent(Object)和hasChildren(Objecct)三个Ҏ?br>    EMF Edit是把Eclipse UI FrameworkQJFaceQ和EMF Frameworkq接h的桥梁,包括两部分,其中org.eclipse.emf.edit是与UI无关的部分,org.eclipse.emf.edit.ui是与UI有关的部分。前一部分主要包括ItemProvider和Commmand?br>   <span style="FONT-WEIGHT: bold"> 1.Item Providers<br>    </span>item provider,q个名字来源于它为模型中各个可编辑的"items"(对象Q?provides"功能。它通常是EMF AdaptersQ但是也可以不是。They are used to adapt model objects so the model object can provide all of the interfaces that it needs to be viewed and edited.<br>    item provider主要有四个功能:作ؓcontent和label providerQ?为EMF对象提供property sourceQ?担当Command FactoryQ?EMF模型的变化通知发送给Viewer。每个item provider可以实现上述全部功能或者部分功能,通常情况下,item provider通过l承EMF Edit的基c?span style="FONT-WEIGHT: bold">ItemProviderAdapter</span>来实现全部的功能。下面分别介l这四个功能各自需要哪些方法的支持Q?br>    <br>    (1)<span style="FONT-STYLE: italic">Content and label item providers</span><br>    EMF.Edit分别通过AdapterFactoryContentProvider和AdapterFactcoryLabelProvider来提供content provider和label provider的功能,q两个类的构造函数都需要一个adapter factoryQEMF生成的edit部分代码中的**ItemProviderAdapterFactoryQ负责ؓ特定的类型创建或者定位adapterQ,它们的很多方法都通过分发到相应的Item Provider来实现。比如getChildren()的实现如下:<br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000"> hasChildren(Object object)<br>  {<br>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Get the adapter from the factory.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">    ITreeItemContentProvider treeItemContentProvider </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> <br>      (ITreeItemContentProvider)adapterFactory.adapt(object, ITreeItemContentProviderClass);<br><br>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Either delegate the call or return nothing.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> <br>      treeItemContentProvider </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">  </span><span style="COLOR: #000000">&&</span><span style="COLOR: #000000"> <br>        treeItemContentProvider.hasChildren(object);<br>  }</span></div>     EMF.Edit为模型中的每个类生成一?*ItemProviderc,负责为UI的显C提供具体的实现。每个类在默认情况下都实C5个接?其中的三个IStructuredItemContentProvider(为ListViewer和TableViewer提供contentProvider), ITreeItemContentProvider(为TreeViewer提供contentProvider),IItemLabelProvider(为TreeViewer和ListViewer提供labelProvider)是支持这一功能?<br>    如果我们要用TableViewer昄订单Q模型中对应PurchaseOrderc)Q那么应该修改PurchaseOrderItemProviderQ它实现ITableItemLabelProviderQ同时实现方法getColumnText和getColumnImage。还要在模型生成的POItemProviderAdapterFactorycȝ构造函Cd对ITableItemLabelProvider的支持:<br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">...<br>supportedTypes.add(ITableItemLabelProvider.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);</span></div>     <br>    (2)<span style="FONT-STYLE: italic">Item Property Source</span><br>    当打开PropertySheetӞAdapterFactoryContentProviderq是通过adapterFactory扑ֈ相应的实CIItemPropertySource接口的item Provider。EMF.Edit中的PropertySourcecdCq一接口Q因此AdapterFactoryContentProviderq回PropertySource的一个新创徏的实例(作ؓ被选中的item provider的wrapperQ给PropertySheetQPropertySource把很多方法的实现分发l了itemPropertySource。其代码如下Q?br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> IPropertySource getPropertySource(Object object)<br>  {<br>    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (object </span><span style="COLOR: #0000ff">instanceof</span><span style="COLOR: #000000"> IPropertySource)<br>    {<br>      </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> (IPropertySource)object;<br>    }<br>    </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>    {<br>      IItemPropertySource itemPropertySource </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"><br>        (IItemPropertySource)<br>          (object </span><span style="COLOR: #0000ff">instanceof</span><span style="COLOR: #000000"> EObject </span><span style="COLOR: #000000">&&</span><span style="COLOR: #000000"> ((EObject)object).eClass() </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">?</span><span style="COLOR: #000000"><br>            </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> :<br>            adapterFactory.adapt(object, IItemPropertySourceClass));<br>  <br>      </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> <br>        itemPropertySource </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">  createPropertySource(object, itemPropertySource) : </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br>    }<br>  }<br><br>  </span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000"> IPropertySource createPropertySource(Object object, IItemPropertySource itemPropertySource)<br>  {<br>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> PropertySource(object, itemPropertySource);<br>  }</span></div>     自动生成?*ItemProvider实现?个接口中的IItemPropertySource是支持q一功能的, 其中getPropertyDescriptors()Ҏq回的列表决定了PropertySheet中显C的内容列表?br>    <br>    (3)<span style="FONT-STYLE: italic">Command Factory</span><br>    EMF.Edit提供了修改EMF对象Q可以undoQ的整套机制Qƈ且提供了一些通用的命令。自动生成的**ItemProvider实现?个接口中q没提到的IEditingDomainItemProvider是支持q一功能的。EMF.Edit的Command Framework需要EditngDomain接口Q其中类AdapterFactoryEditingDomain如同前面提到的AdapterFactoryContentProvider和AdapterFactoryLabelProviderQ它负责把相应的Ҏ(比如getChildren()QgetParent(){)分发l实CIEditingDomainItemProvider的Item Provider?br>    <br>    (4)<span style="FONT-STYLE: italic">Change Notification</span><br>    ?*ItemProvider所adapt的对象状态发生变化时Q?*ItemProvider会收到NotificationQ其NotifyChanged()会被调用。ItemProvider作ؓObserver负责qo不相关的事gQ然后把相关的事件传递给模型的central change notifierQ通常是实CIChangeNotifier接口?*ItemProviderAdapterFactory?br>    当我们在PropertySheet中修改ItemQ订单项Q在模型中对应Itemc)的名字时Q首先ItemPropertyDescriptor的setPropertyValue()Ҏ被调用,它会通过SetCommand修改名字或者直接调用Item的eSet(),Mq两U方法都会调用到ItemImpl的setName()ҎQ该Ҏ中判断是否需要发送通知Q如果需要,则向所有监听item对象的adapter发送通知Q即调用它们的notifyChanged()ҎQ,q些adapter包括ItemItemProvideQ它的notifyChanged()Ҏ调用POItemProviderAdapterFactoryQIChangeNotifiercdQ的fireNotifyChanged()ҎQ然后再调用所有注册的listener的fireNotifyChanged()。这些listener可能是PropertySheetQOutline视图中的TreeViewer{,收到通知后,更新视图以反映model的变化。当有事件发生需要通知JFace的ViewerӞ真正的listenerq不是viewer本nQ而是它的content provider?br><br>    EMF.Edit的另一部分重要内容Command Framework留到下一部分介绍?br><br> <img src ="http://www.tkk7.com/xiaoxiaoleemin/aggbug/115355.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xiaoxiaoleemin/" target="_blank">xiaoxiaoleemin</a> 2007-05-05 18:08 <a href="http://www.tkk7.com/xiaoxiaoleemin/archive/2007/05/05/115355.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《EMFQA Developer's Guide》读书笔记第二章 QEMF介(下)http://www.tkk7.com/xiaoxiaoleemin/archive/2007/05/04/115344.htmlxiaoxiaoleeminxiaoxiaoleeminFri, 04 May 2007 13:44:00 GMThttp://www.tkk7.com/xiaoxiaoleemin/archive/2007/05/04/115344.htmlhttp://www.tkk7.com/xiaoxiaoleemin/comments/115344.htmlhttp://www.tkk7.com/xiaoxiaoleemin/archive/2007/05/04/115344.html#Feedback1http://www.tkk7.com/xiaoxiaoleemin/comments/commentRss/115344.htmlhttp://www.tkk7.com/xiaoxiaoleemin/services/trackbacks/115344.html    1.Notification and Adapter
    EMF生成的每一个类q是一个NotifiercdQ因此当它的属性或者引用改变的时候可以发出通知。这是一个很重要的性质Q通过监听EObject的变化可以及时地更新视图或者与之相兌的对象。EMF中的Notification ObserverQListenerQ叫做AdapterQ它除了监听事g以外Q还可以扩展其它行ؓ(extend behavior){。一个Adapter可以通过如下的方式添加到M一个EObject对象上(比如PurchaseOrderQ:
Adapter poObserver = 
aPurchaseOrder.eAdapters().add(poObserver);
    然后Q当aPurchaseOrder的状态发生变化时Q比如setBillToҎ发生了)QpoObserver的notifyChanged()Ҏ会被调用?br>    EContentAdapter,可以dC个根元素Q一个资源或者一个resource set,它可以监听这些元素的M子元素的状态变?
    Adapter在实现behavior extension(比如不通过l承来实现某个接口的功能Q的功能Ӟ是通过AdapterFactory来完成的。比如:
POAdapter adapter = (POAdapter)somePOAdaterFactory.adapt(someObject,POAdapter.class);
    q样QPOAdaptercd的adapter对象被添加到了对象someObject上?br>   
    2.Object Persistence
    EMF对Q何model的默认的序列化方式是XMI。有两个跟序列化相关的函敎ͼeContainer()和eResource().下面通过例子来看q两个方法的作用Q?br>
PurchaseOrder order = POFactory.eINSTANCE.createPurchaseOrder();
order.setBillTo("123 Maple Street");

Item item = POFactory.eINSTANCE.createItem();
item.setProductName("Apples");
item.setPrice(0.45);
item.setQuantity(20);

order.getItems.add(item);
    q里PurchaseOrder和Item分别是模型中代表订单和订单项的类。这时如果调用item.eContainer()会返回order对象。但是如果调用order.eContainer()则会q回nullQ因为它没有被包含在M元素里边。这时order和item的eResource()Ҏ都会q回null?br>    Z序列化这些对象,我们应该把它们加入到一个Resource里边。Resource是一个代表吴立存储位|(如文Ӟ的接口。我们只需要把根元素加入到Resource中即可?br>
Resource resource = ;
resource.getContents().add(order);
     q时order和item的eResourceQ)Ҏ都会q回resource对象Q其中item是通过order加入到resource中去的。这时调用resource.save(null)后两个对象就保存下来了?br>    但是Q如何取得resource呢?可以借助于EMF中的ResourceSetQ?它是创徏Resource的工厂,是一pdresource的集合?br>
ResourceSet resourceSet = new ResourceSetImpl();
URI fileURI = URI.createFileURI(new File("mypo.xml").getAbsolutePath());
Resource resource = resourceSet.createResource(fileURI);
resource.getContents().add(order);
resource.save(null);
    保存完成之后Q如何读取呢Q?
PurchaseOrder order = (PurchaseOrder)resource.getContents().get(0);
    ResourceSetq支持跨文档的引用(cross-document reference)Q当遇到跨文档的引用Ӟ先用proxy对象来代替实际的对象Q当W一ơ真正用这个对象的时候才resolve成真正的对象。Proxy是一个关于目标类的一个未初始化的对象Q但是它拥有实际对象的URI?br>  
    3.The Reflective EObject API
   
EObject defines a generic,reflective API for manipulating instances.
   
EClass orderClass = POPackage.eINSTANCE.getPurchaseOrder();
EAttribute shipToAttribute = POPackage.eINSTANCE.getPurchaseOrder_shipTo();
orderClass.eSet(shipToAttribute, "123 street");
String shipTo = orderClass.eGet(shipToAttribute);
    上面调用orderClass的eSet和eGetҎ比直接调用order的setShipTo()和getShipTo()效率要低一些,因ؓ它要switch做一些条件判断,但是它的优点是open up the model for completely generic access.EMF.Edit中的AddCommandQSetCommand{通用的命令就是通过q种方式实现的?br>   
    4.Dynamic EMF
   
在没有生成模型中各个cȝ代码之前Q我们也可以使用他们的对象,如下Q?br>
EPackage package = EcoreFactory.eINSTANCE.createEPackage();
EClass orderClass = EcoreFactory.eINSTANCE.createEClass();
orderClass.setName("PurchaseOrder");
package.getEClassifiers().add(orderClass);

EClass itemClass =
EcoreFactory.eINSTANCE.createEClass();
itemClass.setName("Item");
package.getEClassifiers().add(itemClass);

EAttribute shipToAttribute = EcoreFactory.eINSTANCE.createAttribute();
shipToAttribute.setName("shipTo");
shipToAttribute.setEType(EcorePackage.eINSTANCE.getEString());
orderClass.getEAttributes().add(shipToAttribute);
...
    接下来,我们可以q样初始化这些类的对象:
EFactory  factory = package.getEFactoryInstance();
EObject order = factory.create(orderClass);
order.eSet(shipToAttribute, “123 street");
    xQEMF的基本知识就介绍完了Q如果你只是需要EMF产生的Model CodeQ那么需要学习的东西p么多了。如果你q需要EMF产生的Edit Code和Editor CodeQ那么还有另外的知识需要学习?br>

xiaoxiaoleemin 2007-05-04 21:44 发表评论
]]>
《EMFQA Developer's Guide》读书笔记第二章 QEMF介(上)http://www.tkk7.com/xiaoxiaoleemin/archive/2007/05/04/115251.htmlxiaoxiaoleeminxiaoxiaoleeminFri, 04 May 2007 11:13:00 GMThttp://www.tkk7.com/xiaoxiaoleemin/archive/2007/05/04/115251.htmlhttp://www.tkk7.com/xiaoxiaoleemin/comments/115251.htmlhttp://www.tkk7.com/xiaoxiaoleemin/archive/2007/05/04/115251.html#Feedback0http://www.tkk7.com/xiaoxiaoleemin/comments/commentRss/115251.htmlhttp://www.tkk7.com/xiaoxiaoleemin/services/trackbacks/115251.htmlEMF的元模型Ecore  
    我们通常所说的模型(Model)是指应用E序更高层次的描qͼ通过它可以生成部分甚臛_部的实现代码Q可以由UML{标准的Ҏ来定义。EMF(Eclipse Modeling Framework)中的模型层次没有q么高,它和实现直接兌?br>    EMF是一个可以生代码的框架Q你可以通过UMLcd、XML Schema、Java Interface{Q何一U方式来定义EMF模型Q而且可以׃U方式生成另外其它方式,在这里EMF 模型是把这三者结合在一L更高层次的一U表C。EMF模型本质上是UMLcd的子集,它是关于应用的类和数据的单模型?br>    用来描述EMF模型的模型(元模型)叫做EcoreQEcore本n也是一个EMF模型Q因此它是自q元模型,也可以说Ecore是一个元元模型。Ecore模型的主要组成部分有Q?br>    EClassQ代表一个类Q通常有自q名字Q?个或者多个属性、引用?nbsp;  
    EAttribute:代表一个属性,有自q名字和类型?br>    EReference:代表两个cM间的兌关系的一端。有名字Q代表是否聚合的booleancd的标志,以及目标cȝcd?br>    EDataTypeQ代表属性的cdQ可以是int或者float{原子类型,也可以是java.util.Date{对象类型?br>    当我们有了自q具体应用Ӟ我们会实例化Ecore的以上元素ؓq个具体的应用构造模型,UCؓcore模型。core模型的序列化采用XMI(XML Metadata Interchange)Q因为用来定义core模型的三U方式(Java Interface,XML SchemaQUML)都有各自的缺点,不适合作ؓcore模型的序列化形式?br>   
    2.目前生成Ecore模型的三U方?/span>
    Q?Q从UML生成: 直接用Ecore Editor或者Omondo提供的工具EclipseUML;也可以从EMF Project的Wizard中导入mdl文gQ还可以从UML工具中导出。其中第一U方法可以自动的同步core模型与工具中~辑的模型(如EclipseUML~辑的ecd文gQ,而后两种Ҏ当umlcd有了变化旉要重新导入或者导出才能core模型与之同步?br>    Q?Q从Java Interface生成Q在要徏模的cL者方法前?#8220;@model”注释Q每个属性和引用对应一个getҎQ不需要setҎ?br>
/**
 *@model
 
*/
public interface PurchaseOrder
{
    
/**
     @model
     
*/
    String getShipTo();

    
/**
     @model
     
*/
    String getBillTo();

    
/**
     @model type="Item" containment="true"
     
*/
    List getItems();
}

    (3)从XML Schema生成Q模型中的每个类用一个complex type表示Q一个属性用一个内嵌的element表示Q引用则用一个内嵌的属于另一个complex type的element表示。这L定schema之后Q模型实例的序列化根据它来进行?br>    除了以上三种定义模型的方式之外,q存在其它的方式Q比如说Q目前EMF正在支持RDB SchemaQRational Database)的方式来定义模型?br>    
    3.代码生成
    模型C码的自动生成是EMF重要的功能之一Q大大提高了生率,而且生成的代码简z,高效?br>    Ecore中的每个c(EClassQ会生成一个接口和一个实现类QEMFҎ采用了这U实C接口相分ȝ设计。其中的接口都会l承EObjectq一EMF中的集接口,它如同java.lang.Object在Java中的CQ它主要提供了三个功能:eClassQ)Ҏq回该对象的metaobjectQeContainerQ)和eResourceQ)反别q回包含该对象的对象和资源;另外eGetQ)、eSetQ)、eIsSetQ)和eUnsetQ){方法ؓ讉K该对象提供了API.EObjectq承了Notifier接口Q当对象发生变化Ӟ如成员变量的取值发生了变化Q会发出通知Q观察者设计模式)。比如改变Order对象的属性shipTo的setҎ的实现如下所C?
public void setShipTo(String newShipTo)
{
   String oldShipTo 
= shipTo;
   shipTo 
= newShipTo;
   
if(eNotificationRequired())
      eNotify(
new ENotificationImpl(this, Notification.SET, POPackage.PURCHASE_ORDER_SHIP_TO, oldShipTO, shipTo));
}
   其中eNotificationRequired()是BasicNotifierImplcL供的ҎQ它q回是否需要调用eNofifier().
   除此以外QEMFqؓ每个模型分别生成一个factory和package对应的接口和实现cR其?*Factoryl承于EFactoryQؓ模型中每个类的创建提供create***ҎQ因此我们在EMF中一般不用new来创建对象。创Z个订单对象的代码如下Q?br>
PurchaseOrder po = POFactory.eINSTANCE.createPurchaseOrder();
    如果**Factory中没有ؓ你想要的cd生成特定的create***Q)ҎQ那么可以用基类EFactory的createQEClass class)ҎQ将要创建的cd作ؓ参数传入卛_。比如说Q模型中用到Enumeration或者自定义的MapEntryQ?*Factory中就不会有直接创两个cd的对象的ҎQ我们可以用***Factory.eINSTANCE.createQ?*Package.eINSTANCE.getIntToIntEntry)来完成?br>   **Package使得我们可以讉K模型中的Ecore元数据,模型中的每个cR每个属性、每个引用都?*Package中对应一个int倹{?br>   生成?*AdapterFactorycd以ؓ特定的类型创建Adapter?br>
   4.代码的重新生成与合ƈ
  
EMF生成的类、接口、方法、域前面都有“@generated"标记Q如果改变该标记Q那么在重新生成代码的时候,q个标记下的部分保持不变Q不会重新生成。如果你修改了getNameQ)Ҏ的实玎ͼ也相应的修改了该Ҏ前面?@generated"标记Q但是你既想保留自己对这个方法的修改Q又想看看EMF自动生成的这个方法是什么样子的Q这时可以通过在该cL件中dq样一个方法来实现Q?br>
/**
  *@generated
  
*/
public String getNameGen()
{
}
   q个Ҏ名字的末֊上了Gen后缀Q这样EMF在生成代码的时候发C把getNameQ)前面?#8220;@generated"标记修改了,q时它会查有没有getNameGen()Ҏ存在Q如果有Q就把getName的默认实现添加在q个Ҏ里边。重新生成代码后Q发现EMF为getNameGen()Ҏd了实现语?return name".
   EMF代码生成器是从generator model Q?genmodel文gQ而不是core modelQ?ecore文gQ来生成代码的,q里的generator model是core model的DecoratorQ其中的GenClass修饰EClassQ?GenFeature修饰EAttribute和EReference{,另外它还包含生成代码的包名,生成的Package和Factorycȝ前缀名字{信息?br>   generator model和ecore model分离的好处是QEcore元模型只保存模型信息Q而独立于代码生成相关的一些额外信息。坏处是两个模型可能Z不一致的状态,因此修改了ecore模型后,应该在genmodel上重新导入ecore模型Q以保持两个模型的一致性?br>   


xiaoxiaoleemin 2007-05-04 19:13 发表评论
]]>
《EMFQA Developer's Guide》读书笔记第一章:Eclipse概述http://www.tkk7.com/xiaoxiaoleemin/archive/2007/03/03/101612.htmlxiaoxiaoleeminxiaoxiaoleeminSat, 03 Mar 2007 05:26:00 GMThttp://www.tkk7.com/xiaoxiaoleemin/archive/2007/03/03/101612.htmlhttp://www.tkk7.com/xiaoxiaoleemin/comments/101612.htmlhttp://www.tkk7.com/xiaoxiaoleemin/archive/2007/03/03/101612.html#Feedback0http://www.tkk7.com/xiaoxiaoleemin/comments/commentRss/101612.htmlhttp://www.tkk7.com/xiaoxiaoleemin/services/trackbacks/101612.html

Eclipse是一个开源Y仉目,它的目标是提供最好的工具集成q_。Eclipse软ghCommon Public LicenseQ就是说你可以用、修改其中的代码Q可以重新发布ؓfree版本Q也可以作ؓU有目的一部分?br>       Eclipse目分ؓ三个子项目:Eclipse目QTools目和Technology 目?br>     
       Eclipse目Q主要包括Eclipse开发的核心lgQ即Eclipse SDKQ它用于支持q_或者框架的开发。Eclipse本n是用Java开发的Q但是它可以用于实现其它语言的开发工兗Eclipse目又分Z个子目QPlatformQJDTQJava Development Tools),PDE(Plugin Development Tools).Zq三个子目以L扩展Eclpse框架或者开发其它工兗?br>

  • PlatformQEclpse的核心组件。它提供了插件开发和工具集成所需要的框架和服务,比如标准的工作台用户界面Q项目、文件和文g夹的理机制{?
  • JDT是Java的集成开发环境,甚至可以用于开发Eclipse本n?
  • PDE为Eclipse插g提供view和editor。PDE建立在JDT的基上ƈ且进行了扩展Q它支持一些非Java的插件开发活动,比如定义扩展炏V?
      Tools目QEclipseq_开发出来的各种为其它应用提供支持的工具。如CDT是一个实现C++集成开发环境的子项目,GEF是一个提供图形编辑功能的子项目,而EMF是一个由形式化模型定义{化ؓ模型代码的子目?br>      Technology目Qؓ兛_Eclipse的研I员或者学术界人士提供Z。如XML Schema Infoset Model目是一个基于EMF的用于读取、操作XML Schema的库?br>       
      下面介绍一下Eclipse目的Platform子项目的几个重要特征Q?br>    Q?QPlug-in体系l构Q?br>      在Eclipse中,提供某个功能的基本单元或者构件成为插ӞPluginQ。Eclipseq_以及在其上面扩展的其它一些工具都是由一pd插gl成。插件包括运行所需要的Java代码、图片文件、文本文件、名为Plugin.xml的Manifest文g{。plugin.xml声明了该插g与其它插件的关系Q其中,Requires声明它的q行所依赖的其它插ӞExports声明它的公有cd其它插g的可见性;Extension Point声明了其它插件用它的方式;Extensions声明它所使用的其它插件的扩展炏V?br>     Eclipse启动时先扑ֈ所有可用的插gQ但是不全部启动。当真正需要某个插件的时候才插g分配自己的Class loaderq运行插Ӟq种性质成ؓ“Lazy Start”?br>    Q?Q工作台资源Q?br>    Eclipse中资源(resourceQ是指具有如下特性的M文g或者文件夹Q可以在上面注册Change Listener 以监听资源的变化Q可以在上面d错误信息或者TODO列表{MarkerQ可以跟t其历史变化。Project是一cȝD的文g夹类型的资源Q即文gpȝ中用h定的一个文件夹?br>    Q?QUI框架Q?br>    Eclipse的UI框架包括SWT和JFaceQ以及定义了整个EclipseIDE的整体结构的工作台界面?br>
  •  SWT QStandard Widget Toolkit)是一个独立于操作pȝ的图形库Q它可能多的调用操作系l的native widget。而Java的AWT只有ListQText Field和ButtonQ各U操作系l下q些lg的外观类|{底层组件是调用操作pȝ的,其它lg都是Swing自己模拟。所以AWT和Swing在不同的操作pȝ下开发出来的界面外观cMQ导致与本地操作pȝ更个不协调。而SWT只有在操作系l没有native实现的情况下才自己模拟,因此开发的界面与本地操作系l风g致?
  •  JFace是用SWT实现的更高层ơ的工具集,负责囑փ字体的管理、对话框、向对{进度条{Q务。JFaceq没有像用户隐藏SWT的APIQ因此用户可以同时用JFace和SWT。JFace的一个重要内Ҏ提供标准的试囄Q如 listQtreeQtable{组件的viewerQ它们与SWT中的ListQTreeQTablelg对应Q只是从更高层次上显C数据?Action Framework用来单和工具条添加命令,是JFace的另一主要内容?
  • 工作台是用户使用Eclipse的主H口Q由SWT和JFace实现。一个主H口׃pd的view和editorl成。工作台上view和editor的位|可以自由排列,每种排列方式叫做一个Perspective?/li>

 



xiaoxiaoleemin 2007-03-03 13:26 发表评论
]]>
վ֩ģ壺 žƷƵ| ɫҹƵѲ| һ߹ۿƵ| þպƬ| aëƬѹۿ | xvideosַ| AVһδ| 91㽶Ƶ| ۺŷɫ°Ҳȥ| ƹƵ߿| Ƶһ| žžƷƵ| AVXXX鶹| ߹ۿwww³³| Ʒþþþ| ҹƬ߹ۿ| GOGOGOѹۿ| ޸岻߹ۿ| ѻվ߿| ޹ղ뾫Ʒ| ʹA18Ƭ| ޾Ʒŷ߹ۿ| ˳վ18ֹһ| ˳ëƬ߲| ޾ƷƵۿ| ¹ŮһëƬ| www߹ۿƵ| ˳˳ۺ| ˳վѲ| ѳ̱߸߳Ƶ| ҹδʮվ2| 99ƷƵѹۿ| ҹƬAVƬ| ҹľƷ | ƷѾþþþþþþ| ޳AVƬ߲| Ұѹۿ| ɫݺɫۺƵ| þþƷĻվ | ũѸһëƬѿƵ| AVһլɫӰ|