??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲免费观看视频,麻豆9191精品国产,一区二区三区四区日本视频http://www.aygfsteel.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.aygfsteel.com/xiaoxiaoleemin/archive/2007/05/07/115626.htmlxiaoxiaoleeminxiaoxiaoleeminMon, 07 May 2007 06:10:00 GMThttp://www.aygfsteel.com/xiaoxiaoleemin/archive/2007/05/07/115626.htmlhttp://www.aygfsteel.com/xiaoxiaoleemin/comments/115626.htmlhttp://www.aygfsteel.com/xiaoxiaoleemin/archive/2007/05/07/115626.html#Feedback0http://www.aygfsteel.com/xiaoxiaoleemin/comments/commentRss/115626.htmlhttp://www.aygfsteel.com/xiaoxiaoleemin/services/trackbacks/115626.html    1.Ecore Editor中根元素的直接子元素属性页中有“Ns Prefix"?Ns URI"两项需要设|,前者可以设|ؓ(f)模型的名字,后者随便设|一个URI地址Q如"http://"+模型名字。如果这两项不设|,那么当修改了(jin)ecore模型后,从genmodel?#8220;Reload" ecore模型时出错?br>    2.某个EReference如果多重性ؓ(f)"0...*",则在属性页中把lower bound讄?Qupper bound讄?1?br>    3.genmodel根元素的W一层子元素的属性页中,"All"cd?#8220;prefix”属性值是指EMF生成的代码中Factory和Package{类的前~Q可以指定ؓ(f)模型名字Q首字母大写以符合类名的?fn)惯Q?#8220;base package”属性值是生成的各个包的前~Q假设指定ؓ(f)“com.example"。然后有“Ecore”cdQ其中的各个属性值是从ecore模型中读q来的,不可修改Q其?#8220;Package”cd下的"Name"属性值是包名的一部分Q假设指定ؓ(f)modelQ,接在前面的base packageg后,那么生成的Model 部分代码分别有三个包Qcom.example.model; com.example.model.impl; com.example.model.util. 
   btwQ在有的GMF 版本中,如果包名存在首字母大写的单词Q那么生成代码的时候会(x)出错?br>


xiaoxiaoleemin 2007-05-07 14:10 发表评论
]]>
如何昄PropertySheet视图http://www.aygfsteel.com/xiaoxiaoleemin/archive/2007/05/06/115517.htmlxiaoxiaoleeminxiaoxiaoleeminSun, 06 May 2007 09:24:00 GMThttp://www.aygfsteel.com/xiaoxiaoleemin/archive/2007/05/06/115517.htmlhttp://www.aygfsteel.com/xiaoxiaoleemin/comments/115517.htmlhttp://www.aygfsteel.com/xiaoxiaoleemin/archive/2007/05/06/115517.html#Feedback2http://www.aygfsteel.com/xiaoxiaoleemin/comments/commentRss/115517.htmlhttp://www.aygfsteel.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.aygfsteel.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.aygfsteel.com/xiaoxiaoleemin/archive/2007/05/05/115439.html</guid><wfw:comment>http://www.aygfsteel.com/xiaoxiaoleemin/comments/115439.html</wfw:comment><comments>http://www.aygfsteel.com/xiaoxiaoleemin/archive/2007/05/05/115439.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/xiaoxiaoleemin/comments/commentRss/115439.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/xiaoxiaoleemin/services/trackbacks/115439.html</trackback:ping><description><![CDATA[     摘要: 上一部分中,我们看到?jin)如何通过content和label provider来显CEMF模型Q这一部分介绍如何修改、编辑EMF模型。EMF.Edit支持ZCommand的模型编辑方式,可以自动的undo和redo。EMF.Edit的Command Framework可以分ؓ(f)两部分,W一部分是common command frameworkQ其中定义了(jin)一些基本的命o(h)接口Q实C(jin)例如basic command stack,compound command{,虽然q些命o(h)主要用于EMF.Edit,但是实际上可以独立于EMF.Edit使用Q第二部分是EMF.Edit 命o(h)Q是指一些专门编辑EObject的命令?nbsp; <a href='http://www.aygfsteel.com/xiaoxiaoleemin/archive/2007/05/05/115439.html'>阅读全文</a><img src ="http://www.aygfsteel.com/xiaoxiaoleemin/aggbug/115439.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/xiaoxiaoleemin/" target="_blank">xiaoxiaoleemin</a> 2007-05-05 20:44 <a href="http://www.aygfsteel.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.aygfsteel.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.aygfsteel.com/xiaoxiaoleemin/archive/2007/05/05/115355.html</guid><wfw:comment>http://www.aygfsteel.com/xiaoxiaoleemin/comments/115355.html</wfw:comment><comments>http://www.aygfsteel.com/xiaoxiaoleemin/archive/2007/05/05/115355.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/xiaoxiaoleemin/comments/commentRss/115355.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/xiaoxiaoleemin/services/trackbacks/115355.html</trackback:ping><description><![CDATA[    本书的第二章介绍?jin)EMF产生的Model部分的代码,你可以用EMF Edit Framework来ؓ(f)model构徏功能强大的视囑֒~辑器。在EMFZ生成的编辑器里,可以~辑Q复Ӟ_脓(chung)Q拖拽等Q、显CmodelQ还可以无限的redo/undo。如果这个编辑器不能完全满你的需求,你可以在此基上做一些修改,肯定比从头开始写节约旉?br>    Eclipse通过JFace中的一些Viewer来显C结构化的数据,q些Viewer不直接从model中获取要昄的数据,而是通过ContentProvider和LabelProvider来取得要昄的内宏V文本以?qing)图标等信息。不同的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)两个Ҏ(gu)QITableLabelProvider有getColumnText(Object, int)和getColumnImage(Object,int)两个Ҏ(gu)Q它们之间没有承关pRIStructureContentProvider有getElements(Object)Ҏ(gu)Q返回一个Object数组Q而ITreeContentProvider是其子类Q另有自qҎ(gu)getChildren(Object),getParent(Object)和hasChildren(Objecct)三个Ҏ(gu)?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主要有四个功能:(x)作ؓ(f)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负责ؓ(f)特定的类型创建或者定位adapterQ,它们的很多方法都通过分发到相应的Item Provider来实现。比如getChildren()的实现如下:(x)<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提供具体的实现。每个类在默认情况下都实C(jin)5个接?其中的三个IStructuredItemContentProvider(为ListViewer和TableViewer提供contentProvider), ITreeItemContentProvider(为TreeViewer提供contentProvider),IItemLabelProvider(为TreeViewer和ListViewer提供labelProvider)是支持这一功能?<br>    如果我们要用TableViewer昄订单Q模型中对应PurchaseOrderc)(j)Q那么应该修改PurchaseOrderItemProviderQ它实现ITableItemLabelProviderQ同时实现方法getColumnText和getColumnImage。还要在模型生成的POItemProviderAdapterFactorycȝ构造函Cd对ITableItemLabelProvider的支持:(x)<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扑ֈ相应的实C(jin)IItemPropertySource接口的item Provider。EMF.Edit中的PropertySourcecdC(jin)q一接口Q因此AdapterFactoryContentProviderq回PropertySource的一个新创徏的实例(作ؓ(f)被选中的item provider的wrapperQ给PropertySheetQPropertySource把很多方法的实现分发l了(jin)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()Ҏ(gu)q回的列表决定了(jin)PropertySheet中显C的内容列表?br>    <br>    (3)<span style="FONT-STYLE: italic">Command Factory</span><br>    EMF.Edit提供?jin)修改EMF对象Q可以undoQ的整套机制Qƈ且提供了(jin)一些通用的命令。自动生成的**ItemProvider实现?个接口中q没提到的IEditingDomainItemProvider是支持q一功能的。EMF.Edit的Command Framework需要EditngDomain接口Q其中类AdapterFactoryEditingDomain如同前面提到的AdapterFactoryContentProvider和AdapterFactoryLabelProviderQ它负责把相应的Ҏ(gu)(比如getChildren()QgetParent(){)(j)分发l实C(jin)IEditingDomainItemProvider的Item Provider?br>    <br>    (4)<span style="FONT-STYLE: italic">Change Notification</span><br>    ?*ItemProvider所adapt的对象状态发生变化时Q?*ItemProvider?x)收到NotificationQ其NotifyChanged()?x)被调用。ItemProvider作ؓ(f)Observer负责qo(h)不相关的事gQ然后把相关的事件传递给模型的central change notifierQ通常是实C(jin)IChangeNotifier接口?*ItemProviderAdapterFactory?br>    当我们在PropertySheet中修改ItemQ订单项Q在模型中对应Itemc)(j)的名字时Q首先ItemPropertyDescriptor的setPropertyValue()Ҏ(gu)被调用,它会(x)通过SetCommand修改名字或者直接调用Item的eSet(),Mq两U方法都?x)调用到ItemImpl的setName()Ҏ(gu)Q该Ҏ(gu)中判断是否需要发送通知Q如果需要,则向所有监听item对象的adapter发送通知Q即调用它们的notifyChanged()Ҏ(gu)Q,q些adapter包括ItemItemProvideQ它的notifyChanged()Ҏ(gu)调用POItemProviderAdapterFactoryQIChangeNotifiercdQ的fireNotifyChanged()Ҏ(gu)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.aygfsteel.com/xiaoxiaoleemin/aggbug/115355.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/xiaoxiaoleemin/" target="_blank">xiaoxiaoleemin</a> 2007-05-05 18:08 <a href="http://www.aygfsteel.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介(下)(j)http://www.aygfsteel.com/xiaoxiaoleemin/archive/2007/05/04/115344.htmlxiaoxiaoleeminxiaoxiaoleeminFri, 04 May 2007 13:44:00 GMThttp://www.aygfsteel.com/xiaoxiaoleemin/archive/2007/05/04/115344.htmlhttp://www.aygfsteel.com/xiaoxiaoleemin/comments/115344.htmlhttp://www.aygfsteel.com/xiaoxiaoleemin/archive/2007/05/04/115344.html#Feedback1http://www.aygfsteel.com/xiaoxiaoleemin/comments/commentRss/115344.htmlhttp://www.aygfsteel.com/xiaoxiaoleemin/services/trackbacks/115344.html    1.Notification and Adapter
    EMF生成的每一个类q是一个NotifiercdQ因此当它的属性或者引用改变的时候可以发出通知。这是一个很重要的性质Q通过监听EObject的变化可以及(qing)时地更新视图或者与之相兌的对象。EMF中的Notification ObserverQListenerQ叫做AdapterQ它除了(jin)监听事g以外Q还可以扩展其它行ؓ(f)(extend behavior){。一个Adapter可以通过如下的方式添加到M一个EObject对象上(比如PurchaseOrderQ:(x)
Adapter poObserver = 
aPurchaseOrder.eAdapters().add(poObserver);
    然后Q当aPurchaseOrder的状态发生变化时Q比如setBillToҎ(gu)发生?jin)?j)QpoObserver的notifyChanged()Ҏ(gu)?x)被调用?br>    EContentAdapter,可以dC个根元素Q一个资源或者一个resource set,它可以监听这些元素的M子元素的状态变?
    Adapter在实现behavior extension(比如不通过l承来实现某个接口的功能Q的功能Ӟ是通过AdapterFactory来完成的。比如:(x)
POAdapter adapter = (POAdapter)somePOAdaterFactory.adapt(someObject,POAdapter.class);
    q样QPOAdaptercd的adapter对象被添加到?jin)对象someObject上?br>   
    2.Object Persistence
    EMF对Q何model的默认的序列化方式是XMI。有两个跟序列化相关的函敎ͼ(x)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()?x)返回order对象。但是如果调用order.eContainer()则会(x)q回nullQ因为它没有被包含在M元素里边。这时order和item的eResource()Ҏ(gu)都会(x)q回null?br>    Z(jin)序列化这些对象,我们应该把它们加入到一个Resource里边。Resource是一个代表吴立存储位|(如文Ӟ(j)的接口。我们只需要把根元素加入到Resource中即可?br>
Resource resource = ;
resource.getContents().add(order);
     q时order和item的eResourceQ)(j)Ҏ(gu)都会(x)q回resource对象Q其中item是通过order加入到resource中去的。这时调用resource.save(null)后两个对象就保存?sh)来了(jin)?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Ҏ(gu)比直接调用order的setShipTo()和getShipTo()效率要低一些,因ؓ(f)它要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样初始化这些类的对象:(x)
EFactory  factory = package.getEFactoryInstance();
EObject order = factory.create(orderClass);
order.eSet(shipToAttribute, “123 street");
    x(chng)QEMF的基本知识就介绍完了(jin)Q如果你只是需要EMF产生的Model CodeQ那么需要学?fn)的东西p么多?jin)。如果你q需要EMF产生的Edit Code和Editor CodeQ那么还有另外的知识需要学?fn)?br>

xiaoxiaoleemin 2007-05-04 21:44 发表评论
]]>
《EMFQA Developer's Guide》读书笔记第二章 QEMF介(上)(j)http://www.aygfsteel.com/xiaoxiaoleemin/archive/2007/05/04/115251.htmlxiaoxiaoleeminxiaoxiaoleeminFri, 04 May 2007 11:13:00 GMThttp://www.aygfsteel.com/xiaoxiaoleemin/archive/2007/05/04/115251.htmlhttp://www.aygfsteel.com/xiaoxiaoleemin/comments/115251.htmlhttp://www.aygfsteel.com/xiaoxiaoleemin/archive/2007/05/04/115251.html#Feedback0http://www.aygfsteel.com/xiaoxiaoleemin/comments/commentRss/115251.htmlhttp://www.aygfsteel.com/xiaoxiaoleemin/services/trackbacks/115251.htmlEMF的元模型Ecore  
    我们通常所说的模型(Model)是指应用E序更高层次的描qͼ通过它可以生成部分甚臛_部的实现代码Q可以由UML{标准的Ҏ(gu)来定义。EMF(Eclipse Modeling Framework)中的模型层次没有q么高,它和实现直接兌?br>    EMF是一个可以生代码的框架Q你可以通过UMLcd、XML Schema、Java Interface{Q何一U方式来定义EMF模型Q而且可以׃U方式生成另外其它方式,在这里EMF 模型是把这三者结合在一L(fng)更高层次的一U表C。EMF模型本质上是UMLcd的子集,它是关于应用的类和数据的单模型?br>    用来描述EMF模型的模型(元模型)(j)叫做EcoreQEcore本n也是一个EMF模型Q因此它是自q元模型,也可以说Ecore是一个元元模型。Ecore模型的主要组成部分有Q?br>    EClassQ代表一个类Q通常有自q名字Q?个或者多个属性、引用?nbsp;  
    EAttribute:代表一个属性,有自q名字和类型?br>    EReference:代表两个cM间的兌关系的一端。有名字Q代表是否聚合的booleancd的标志,以及(qing)目标cȝcd?br>    EDataTypeQ代表属性的cdQ可以是int或者f(xi)loat{原子类型,也可以是java.util.Date{对象类型?br>    当我们有?jin)自q具体应用Ӟ我们?x)实例化Ecore的以上元素ؓ(f)q个具体的应用构造模型,UCؓ(f)core模型。core模型的序列化采用XMI(XML Metadata Interchange)Q因为用来定义core模型的三U方式(Java Interface,XML SchemaQUML)都有各自的缺点,不适合作ؓ(f)core模型的序列化形式?br>   
    2.目前生成Ecore模型的三U方?/span>
    Q?Q从UML生成: 直接用Ecore Editor或者Omondo提供的工具EclipseUML;也可以从EMF Project的Wizard中导入mdl文gQ还可以从UML工具中导出。其中第一U方法可以自动的同步core模型与工具中~辑的模型(如EclipseUML~辑的ecd文gQ,而后两种Ҏ(gu)当umlcd有了(jin)变化旉要重新导入或者导出才能core模型与之同步?br>    Q?Q从Java Interface生成Q在要徏模的cL者方法前?#8220;@model”注释Q每个属性和引用对应一个getҎ(gu)Q不需要setҎ(gu)?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(fng)定schema之后Q模型实例的序列化根据它来进行?br>    除了(jin)以上三种定义模型的方式之外,q存在其它的方式Q比如说Q目前EMF正在支持RDB SchemaQRational Database)的方式来定义模型?br>    
    3.代码生成
    模型C码的自动生成是EMF重要的功能之一Q大大提高(sh)(jin)生率,而且生成的代码简z,高效?br>    Ecore中的每个c(EClassQ会(x)生成一个接口和一个实现类QEMFҎ(gu)采用?jin)这U实C接口相分ȝ设计。其中的接口都会(x)l承EObjectq一EMF中的集接口,它如同java.lang.Object在Java中的CQ它主要提供?jin)三个功能?x)eClassQ)(j)Ҏ(gu)q回该对象的metaobjectQeContainerQ)(j)和eResourceQ)(j)反别q回包含该对象的对象和资源;另外eGetQ)(j)、eSetQ)(j)、eIsSetQ)(j)和eUnsetQ)(j){方法ؓ(f)讉K该对象提供了(jin)API.EObjectq承了(jin)Notifier接口Q当对象发生变化Ӟ如成员变量的取值发生了(jin)变化Q会(x)发出通知Q观察者设计模式)(j)。比如改变Order对象的属性shipTo的setҎ(gu)的实现如下所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供的Ҏ(gu)Q它q回是否需要调用eNofifier().
   除此以外QEMFq(sh)ؓ(f)每个模型分别生成一个factory和package对应的接口和实现cR其?*Factoryl承于EFactoryQؓ(f)模型中每个类的创建提供create***Ҏ(gu)Q因此我们在EMF中一般不用new来创建对象。创Z个订单对象的代码如下Q?br>
PurchaseOrder po = POFactory.eINSTANCE.createPurchaseOrder();
    如果**Factory中没有ؓ(f)你想要的cd生成特定的create***Q)(j)Ҏ(gu)Q那么可以用基类EFactory的createQEClass class)Ҏ(gu)Q将要创建的cd作ؓ(f)参数传入卛_。比如说Q模型中用到Enumeration或者自定义的MapEntryQ?*Factory中就不会(x)有直接创两个cd的对象的Ҏ(gu)Q我们可以用***Factory.eINSTANCE.createQ?*Package.eINSTANCE.getIntToIntEntry)来完成?br>   **Package使得我们可以讉K模型中的Ecore元数据,模型中的每个cR每个属性、每个引用都?*Package中对应一个int倹{?br>   生成?*AdapterFactorycd以ؓ(f)特定的类型创建Adapter?br>
   4.代码的重新生成与合ƈ
  
EMF生成的类、接口、方法、域前面都有“@generated"标记Q如果改变该标记Q那么在重新生成代码的时候,q个标记下的部分保持不变Q不?x)重新生成。如果你修改?jin)getNameQ)(j)Ҏ(gu)的实玎ͼ也相应的修改?jin)该?gu)前面?@generated"标记Q但是你既想保留自己对这个方法的修改Q又想看看EMF自动生成的这个方法是什么样子的Q这时可以通过在该cL件中dq样一个方法来实现Q?br>
/**
  *@generated
  
*/
public String getNameGen()
{
}
   q个Ҏ(gu)名字的末֊上了(jin)Gen后缀Q这样EMF在生成代码的时候发C把getNameQ)(j)前面?#8220;@generated"标记修改?jin),q时它会(x)(g)查有没有getNameGen()Ҏ(gu)存在Q如果有Q就把getName的默认实现添加在q个Ҏ(gu)里边。重新生成代码后Q发现EMF为getNameGen()Ҏ(gu)d?jin)实现语?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不一致的状态,因此修改?jin)ecore模型后,应该在genmodel上重新导入ecore模型Q以保持两个模型的一致性?br>   


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

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

  • PlatformQEclpse的核?j)组件。它提供?jin)插件开发和工具集成所需要的框架和服务,比如标准的工作台用户界面Q项目、文件和文g夹的理机制{?
  • JDT是Java的集成开发环境,甚至可以用于开发Eclipse本n?
  • PDE为Eclipse插g提供view和editor。PDE建立在JDT的基上ƈ且进行了(jin)扩展Q它支持一些非Java的插件开发活动,比如定义扩展炏V?
      Tools目QEclipseq_开发出来的各种为其它应用提供支持的工具。如CDT是一个实现C++集成开发环境的子项目,GEF是一个提供图形编辑功能的子项目,而EMF是一个由形式化模型定义{化ؓ(f)模型代码的子目?br>      Technology目Qؓ(f)兛_(j)Eclipse的研I员或者学术界人士提供Z(x)。如XML Schema Infoset Model目是一个基于EMF的用于读取、操作XML Schema的库?br>       
      下面介绍一下Eclipse目的Platform子项目的几个重要特征Q?br>    Q?QPlug-in体系l构Q?br>      在Eclipse中,提供某个功能的基本单元或者构件成为插ӞPluginQ。Eclipseq_以及(qing)在其上面扩展的其它一些工具都是由一pd插gl成。插件包括运行所需要的Java代码、图片文件、文本文件、名为Plugin.xml的Manifest文g{。plugin.xml声明?jin)该插g与其它插件的关系Q其中,Requires声明它的q行所依赖的其它插ӞExports声明它的公有cd其它插g的可见性;Extension Point声明?jin)其它插件用它的方式;Extensions声明它所使用的其它插件的扩展炏V?br>     Eclipse启动时先扑ֈ所有可用的插gQ但是不全部启动。当真正需要某个插件的时候才插g分配自己的Class loaderq运行插Ӟq种性质成ؓ(f)“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以?qing)定义?jin)整个EclipseIDE的整体结构的工作台界面?br>
  •  SWT QStandard Widget Toolkit)是一个独立于操作pȝ的图形库Q它?yu)可能多的调用操作系l的native widget。而Java的AWT只有ListQText Field和ButtonQ各U操作系l下q些lg的外观类|(j){底层组件是调用操作pȝ的,其它lg都是Swing自己模拟。所以AWT和Swing在不同的操作pȝ下开发出来的界面外观cMQ导致与本地操作pȝ更个不协调。而SWT只有在操作系l没有native实现的情况下才自己模拟,因此开发的界面与本地操作系l风g致?
  •  JFace是用SWT实现的更高层ơ的工具集,负责囑փ字体的管理、对话框、向对{进度条{Q务。JFaceq没有像用户隐藏SWT的APIQ因此用户可以同时用JFace和SWT。JFace的一个重要内Ҏ(gu)提供标准的试囄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 发表评论
]]>
վ֩ģ壺 ƽԶ| ӳ| | ʡ| ɽ| Ӽ| ǭ| | | ̫| | | | ־| ض| ƽ| | ӻ| | ĩ| | | | | | ʩ| ɽʡ| ν| ̫| | | Ž| | | | ƽ| | | ʯ¥| ɽ| ƽ|