﻿<?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/baiyucheng/category/36062.html</link><description>Wait + Hope = Wisdom</description><language>zh-cn</language><lastBuildDate>Tue, 25 Nov 2008 18:46:08 GMT</lastBuildDate><pubDate>Tue, 25 Nov 2008 18:46:08 GMT</pubDate><ttl>60</ttl><item><title>EMF基础知识积累</title><link>http://www.blogjava.net/baiyucheng/archive/2008/11/25/242657.html</link><dc:creator>白玉成</dc:creator><author>白玉成</author><pubDate>Tue, 25 Nov 2008 14:26:00 GMT</pubDate><guid>http://www.blogjava.net/baiyucheng/archive/2008/11/25/242657.html</guid><wfw:comment>http://www.blogjava.net/baiyucheng/comments/242657.html</wfw:comment><comments>http://www.blogjava.net/baiyucheng/archive/2008/11/25/242657.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baiyucheng/comments/commentRss/242657.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baiyucheng/services/trackbacks/242657.html</trackback:ping><description><![CDATA[在项目中用到EMF积累的一些基础知识，希望对大家有所帮助。<br />
<br />
&nbsp; <span lang="EN-US">1. EMF core </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">除了生成</span><span lang="EN-US">model</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US">model implementation</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">外，至少还生成两个接口：</span><span lang="EN-US">*Factory</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US">*Package</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。其中</span><span lang="EN-US">, Factory</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：生成实例的工厂；</span><span lang="EN-US">Package</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：提供一些静态的</span><span lang="EN-US">constants</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（例如：被用来生成方法的</span><span lang="EN-US">feature constants<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）和一些访问模型元数据的公用方法。</span>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">2. EMF</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">生成的方法都带有&#8220;</span><span lang="EN-US">@generated</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&#8221;标签。</span><span lang="EN-US">EMF</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">重新生成代码时不会覆盖用户添加的方法（不带有</span><span lang="EN-US">@generated</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">3. </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关于</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span><span lang="EN-US">Uniform Resource Identifier</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span><span lang="EN-US">EMF </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中是通过</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来标识</span><span lang="EN-US">package</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的，并且通过</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来唯一的确定</span><span lang="EN-US">resources</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包括三个部分：</span><span lang="EN-US">a scheme, a scheme-specific part</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US">an optional fragment</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang="EN-US">scheme</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">主要决定了访问</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">资源的协议；比如：</span><span lang="EN-US">Platform:/resource/&#8230;&#8230;</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span><span lang="EN-US">platform</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang="EN-US">scheme-specific part</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包含一些</span><span lang="EN-US">authority, device</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和一些</span><span lang="EN-US">segments</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，如</span><span lang="EN-US">file:/c:/dir1/dir2/myfile.xml</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang="EN-US">file</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是协议，没有</span><span lang="EN-US">authority</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang="EN-US">c:</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</span><span lang="EN-US">device,</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">剩下的</span><span lang="EN-US">3</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个是</span><span lang="EN-US">segments</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang="EN-US">URI fragment </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标识了</span><span lang="EN-US">resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内部的某个具体的内容。如：</span><span lang="EN-US">file:/c:/dir1/dir2/myfile.xml#loc</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span><span lang="EN-US">#loc</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang="EN-US"> EMF</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过带有</span><span lang="EN-US">fragment</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来访问资源中的</span><span lang="EN-US">EObjects</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">4. </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关于</span><span lang="EN-US">URIConverter</span></p>
<p class="MsoNormal"><span lang="EN-US">URIConverter</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的作用是</span><span lang="EN-US">normalize</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一个输入</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，使之成为一个实际的针对某个</span><span lang="EN-US">resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。它可以把</span><span lang="EN-US">namespace URIs</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（比如：</span><span lang="EN-US">http:///com/example/epo2.ecore</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）映射到物理文件的</span><span lang="EN-US">URIs, </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或者重定向旧的（或别名）的</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参考到一个具体的实际的</span><span lang="EN-US">location</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。一个</span><span lang="EN-US">URIConverter</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">维护一个</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">到</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的映射集合。比如，把一个命名空间</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">映射到物理文件：</span></p>
<p class="MsoNormal"><span lang="EN-US">URIConverter converter = new URIConverterImpl();</span></p>
<p class="MsoNormal"><span lang="EN-US">URI uri1 = URI.createURI("http:///somemodel.ecore");</span></p>
<p class="MsoNormal"><span lang="EN-US">URI uri2 =URI.createURI("platform:/resource/project/somemodel.ecore");</span></p>
<p class="MsoNormal"><span lang="EN-US">converter.getURIMap().put(uri1, uri2);</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在如下面代码：</span></p>
<p class="MsoNormal"><span lang="EN-US">URI normalized = converter.normalize(uri1);</span></p>
<p class="MsoNormal"><span lang="EN-US">System.out.println(normalized);</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">打印的结果是：</span><span lang="EN-US">platform:/resource/project/somemodel.ecore</span></p>
<p class="MsoNormal"><span lang="EN-US">URIConverter.normalize()</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法只是简单的通过映射的</span><span lang="EN-US">map</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">把</span><span lang="EN-US">key</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">替换成了相应的</span><span lang="EN-US">value</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class="MsoNormal"><span lang="EN-US">URIConverter</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的最原始是应用在</span><span lang="EN-US">resource sets</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，用来定位</span><span lang="EN-US">resources.</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">5. </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关于</span><span lang="EN-US">Resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US">ResourceSet</span></p>
<p class="MsoNormal"><span lang="EN-US">Resource </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表示一个持久化的</span><span lang="EN-US">EOjbects</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的容器；</span><span lang="EN-US">ResourceSet</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表示一组</span><span lang="EN-US">Resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的集合，集合中的</span><span lang="EN-US">Resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">同时创建或加载。</span><span lang="EN-US">Resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中比较重要的就是</span><span lang="EN-US">save</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US">load</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法，还有通过</span><span lang="EN-US">URI fragments</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">访问资源中的</span><span lang="EN-US">Object</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的机制，如：</span></p>
<p class="MsoNormal"><span lang="EN-US">Resource resource =&#8230;</span></p>
<p class="MsoNormal"><span lang="EN-US">Item item = (Item)resource.getEObject("//@orders.0/@items.2");</span></p>
<p class="MsoNormal"><span lang="EN-US">Item item =&#8230;</span></p>
<p class="MsoNormal"><span lang="EN-US">String fragment = resource.getURIFragment(item);</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上面代码中的两个方法，</span><span lang="EN-US">getEObject</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过带有</span><span lang="EN-US">fregment</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">获得一个</span><span lang="EN-US">EObject</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，与之相反的方法</span><span lang="EN-US">getURIFragment()</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过</span><span lang="EN-US">EObject</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">获得相应的</span><span lang="EN-US">fragment path</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class="MsoNormal"><span lang="EN-US">ResourceSet</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中有些重要的方法：</span></p>
<p class="MsoNormal"><span lang="EN-US">createResource()</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">创建一个空的</span><span lang="EN-US">Resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">；</span></p>
<p class="MsoNormal"><span lang="EN-US">getResource()</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过</span><span lang="EN-US">resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来创建</span><span lang="EN-US">Resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">；</span></p>
<p class="MsoNormal"><span lang="EN-US">getEObject()</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，通过</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span><span lang="EN-US">fregment</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来获得具体的</span><span lang="EN-US">EObject</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象。</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">6. </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关于</span><span lang="EN-US">Resource.Factory</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用来创建</span><span lang="EN-US">Resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang="EN-US">resource factory </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">要注册到</span><span lang="EN-US">Registry</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实例中。一个</span><span lang="EN-US">factory </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以通过多种方式的</span><span lang="EN-US">URIs</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来注册，包括</span><span lang="EN-US">URI scheme</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或者</span><span lang="EN-US">URI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN-US">extension</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。在插件方式的应用中，通过扩展点的方式在插件加载的时候注册</span><span lang="EN-US">descriptor</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。下面是</span><span lang="EN-US">Resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的源代码</span></p>
<p class="MsoNormal"><span lang="EN-US">public interface Resource extends Notifier</span></p>
<p class="MsoNormal"><span lang="EN-US">{</span></p>
<p class="MsoNormal"><span lang="EN-US">interface Factory</span></p>
<p class="MsoNormal"><span lang="EN-US">{</span></p>
<p class="MsoNormal"><span lang="EN-US">Resource createResource(URI uri);</span></p>
<p class="MsoNormal"><span lang="EN-US">interface Descriptor</span></p>
<p class="MsoNormal"><span lang="EN-US">{</span></p>
<p class="MsoNormal"><span lang="EN-US">Factory createFactory();</span></p>
<p class="MsoNormal"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span lang="EN-US">interface Registry</span></p>
<p class="MsoNormal"><span lang="EN-US">{</span></p>
<p class="MsoNormal"><span lang="EN-US">Factory getFactory(URI uri);</span></p>
<p class="MsoNormal"><span lang="EN-US">Map getProtocolToFactoryMap();</span></p>
<p class="MsoNormal"><span lang="EN-US">String DEFAULT_EXTENSION = "*";</span></p>
<p class="MsoNormal"><span lang="EN-US">Map getExtensionToFactoryMap();</span></p>
<p class="MsoNormal"><span lang="EN-US">Registry INSTANCE = new ResourceFactoryRegistryImpl</span></p>
<p class="MsoNormal"><span lang="EN-US">();</span></p>
<p class="MsoNormal"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面是</span><span lang="EN-US">Registry</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span><span lang="EN-US">getFactory()</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法的算法（引用原文）：</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">1. Check for a factory in the protocolToFactoryMap, using</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">the scheme of the URI.</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">2. If nothing was found, check the extensionToFactoryMap</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">using the file extension of the URI.</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">3. If still nothing was found, check the</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">extensionToFactoryMap using the DEFAULT_EXTENSION</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">(that is, the wildcard character "*").</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">4. If no extension match was found, call the</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">delegatedGetFactory() method. This allows you to supply</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">your own factory registry, with its own lookup</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">criteria.</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">5. If a descriptor was found, instead of an actual</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">factory, call the createFactory() method on the</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">descriptor to create the factory.</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; mso-para-margin-left: 1.0gd"><span lang="EN-US">6. Finally, return the factory if one was found, or null.</span></p>
<p class="MsoNormal"><span lang="EN-US">tip</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span><span lang="EN-US">emf</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">缺省的序列化方式是</span><span lang="EN-US">XMI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。因此，如果没有找到相应注册的</span><span lang="EN-US">factory</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">缺省的就会返回以</span><span lang="EN-US">*</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注册的缺省的</span><span lang="EN-US">factory</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，这个</span><span lang="EN-US">factory</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是针对</span><span lang="EN-US">XMI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN-US">factory</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，即</span><span lang="EN-US">XMIResourceFactoryImpl</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。如，对于</span><span lang="EN-US">XMIResourceFactoryImpl</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的扩展点声明</span><span lang="EN-US">:</span></p>
<p class="MsoNormal"><span lang="EN-US">&lt;extension point = "org.eclipse.emf.ecore.extension_parser"&gt;</span></p>
<p class="MsoNormal"><span lang="EN-US">&lt;parser type="*" class="org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl"/&gt;</span></p>
<p class="MsoNormal"><span lang="EN-US">&lt;/extension&gt;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当非插件应用的时候，可以通过手工的方式来注册</span><span lang="EN-US">factory</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，如：</span></p>
<p class="MsoNormal"><span lang="EN-US">Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put</span></p>
<p class="MsoNormal"><span lang="EN-US">("*", new XMIResourceFactoryImpl());</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">7. Resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过两种方式实现</span><span lang="EN-US">XML</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US">XMI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class="MsoNormal"><span lang="EN-US">1) XML</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现</span><span lang="EN-US">Resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">存储的重要方法是</span><span lang="EN-US">save, </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只有在方法</span><span lang="EN-US">eIsSet()</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回</span><span lang="EN-US">true</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，相关的属性和引用才会被序列化到</span><span lang="EN-US">xml</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中。对于存储的</span><span lang="EN-US">xml</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件的格式可以通过设置</span><span lang="EN-US">OPTION_XML_MAP</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性来完成，如下面原文：</span></p>
<p class="MsoNormal"><em><span lang="EN-US">There are several reasons why you might want to use </span></em><span lang="EN-US">OPTION_XML_MAP <em>when saving a resource:<o:p></o:p></em></span></p>
<p class="MsoNormal"><span lang="EN-US">1. <em>You want to save your data so that it conforms to a particular XML Schema.<o:p></o:p></em></span></p>
<p class="MsoNormal"><span lang="EN-US">2. <em>You have changed your model, and you want the resource to produce XML documents that will work with the old version of the model.<o:p></o:p></em></span></p>
<p class="MsoNormal"><span lang="EN-US">3. <em>You want to design your own XML format without changing your model.<o:p></o:p></em></span></p>
<p class="MsoNormal"><span lang="EN-US">2) XMI</span></p>
<p class="MsoNormal"><span lang="EN-US">XMI</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US">XML</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基本相同，</span><span lang="EN-US">XMIResourceImpl</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就是</span></p>
<p class="MsoNormal"><span lang="EN-US">XMLResourceImpl</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的简单继承，只是在引用</span><span lang="EN-US">objects</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时使用</span><span lang="EN-US">XMI IDs</span></p>
<img src ="http://www.blogjava.net/baiyucheng/aggbug/242657.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baiyucheng/" target="_blank">白玉成</a> 2008-11-25 22:26 <a href="http://www.blogjava.net/baiyucheng/archive/2008/11/25/242657.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>