﻿<?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/JetGeng/category/6108.html</link><description>我的Java天堂</description><language>zh-cn</language><lastBuildDate>Sat, 07 Nov 2009 23:17:33 GMT</lastBuildDate><pubDate>Sat, 07 Nov 2009 23:17:33 GMT</pubDate><ttl>60</ttl><item><title>Galileo: EMF-Databinding – Part 1--creation of the domain-model</title><link>http://www.blogjava.net/JetGeng/archive/2009/11/07/301576.html</link><dc:creator>Jet Geng</dc:creator><author>Jet Geng</author><pubDate>Sat, 07 Nov 2009 14:41:00 GMT</pubDate><guid>http://www.blogjava.net/JetGeng/archive/2009/11/07/301576.html</guid><wfw:comment>http://www.blogjava.net/JetGeng/comments/301576.html</wfw:comment><comments>http://www.blogjava.net/JetGeng/archive/2009/11/07/301576.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JetGeng/comments/commentRss/301576.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JetGeng/services/trackbacks/301576.html</trackback:ping><description><![CDATA[<div>
<p>在我们创建领域模型前，我们有必要了解一下我们的模型用来表达什么内容。 所以我就先解释一下在这个系列文章中要实现应用。 <tt>假设Eclipse组织邀请你编写一个让他们管理贡献者和项目的应用程序。 </tt>
</p>
<p>我们需要创建一个模型来表达客户提供的信息。他们有可能如下图。 </p>
<p><img src="http://tomsondev.files.wordpress.com/2009/06/ecorescreen.png?w=510&amp;h=294" alt="" /></p>
<p>让我们进一步的看看这个模型。 </p>
<div>
<dl><dt>
Fundation
</dt><dt><img src="http://tomsondev.files.wordpress.com/2009/06/ecore_foundation.png?w=249&amp;h=53" alt="" width="249" height="53" /></dt><dd>
<p>fundation是这个模型的根，他拥有两个列表属性。 </p>
<table summary="Simple list" border="0">
    <tbody>
        <tr>
            <td>
            <span><em>projects:</em>
            </span>
            像EMF,Techonlogy,Platform这样的顶级项目。 </td>
        </tr>
        <tr>
            <td>
            <span><em>persons:</em>
            </span>
            参加一个或多个项目的人。
            </td>
        </tr>
    </tbody>
</table>
</dd><dt>
Project
</dt><dt><img src="http://tomsondev.files.wordpress.com/2009/06/ecore_project.png?w=230&amp;h=190" alt="" width="230" height="190" /></dt><dd>
<p>Eclipse项目拥有很多属性，比如项目开始和结束时间、项目的主页的url等等。下面列出我们最感兴趣的。 </p>
<table summary="Simple list" border="0">
    <tbody>
        <tr>
            <td>
            <span><em>subprojects:</em>
            </span>
            一个项目可以拥有多个子项目。子项目本身也可以拥有多个子项目。
            </td>
        </tr>
        <tr>
            <td>
            <span><em>parent:
            </em>
            </span>
            项目有一个父亲（除了顶级项目外）。这就意味着项目和子项目（project-subproject）的关系是一个双向的关系。
            </td>
        </tr>
        <tr>
            <td>
            <span><em>projectleads </em>
            </span>
            一个项目有多个项目领导人。 </td>
        </tr>
        <tr>
            <td>
            <span><em>committers </em>
            </span>
            一个项目可以拥有多个贡献者。
            </td>
        </tr>
    </tbody>
</table>
</dd><dt>
CommitterShip
</dt><dt><img src="http://tomsondev.files.wordpress.com/2009/06/ecore_committership1.png?w=176&amp;h=88" alt="" width="176" height="88" /></dt><dd>
<p>当一个用户成为一个项目的贡献者（Committer）时，这就建立了一个committership。他拥有一个开始时间和结束时间。另外我们还要记录下下面的属性。
</p>
<table summary="Simple list" border="0">
    <tbody>
        <tr>
            <td>
            <span><em>project:</em>
            </span>
            和committership相关的项目。项目和committership是一个双向的关系。
            </td>
        </tr>
        <tr>
            <td>
            <span><em>person:</em>
            </span>
            参加项目的人。
            </td>
        </tr>
    </tbody>
</table>
</dd><dt>
Person
</dt><dt><img src="http://tomsondev.files.wordpress.com/2009/06/ecore_person.png?w=237&amp;h=111" alt="" width="237" height="111" /></dt><dd>
<p>贡献者或项目领导人的信息。我们关系的信息如下： </p>
<table summary="Simple list" border="0">
    <tbody>
        <tr>
            <td>
            <span><em>committerships:</em>
            </span>
            用于保存和人相关的所有的committerships.这说明人和committership是一个双向关系。
            </td>
        </tr>
    </tbody>
</table>
</dd></dl>
</div>
<p>下面这张类图给出了关于上面模型的全貌。 </p>
<p><img src="http://tomsondev.files.wordpress.com/2009/06/project.png?w=510&amp;h=327" alt="" /></p>
<p>正如你所看到的，我把许多关系设成了双向关系。 As you noticed I modeled many of the relations as
bidirectional relations.
这个并不是严格要求所有地方都要这样，因为有的地方可以通过eComtainer来获取他的父亲。就像project-subproject一样。
但是包含关系（containment
relationship）在使用databinding的情况下就不太合适了。因为从子到父亲时没有对应feature，只能通过调用eContainer()方法来获得。
EMF提供了一个编辑器来创建你的Ecore-Model并把它保存成XMI格式。我们可以用它来创建测试数据。下图就是一个例子。</p>
<p><img src="http://tomsondev.files.wordpress.com/2009/06/xmi.png?w=510&amp;h=245" alt="" /></p>
</div>
<img src ="http://www.blogjava.net/JetGeng/aggbug/301576.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JetGeng/" target="_blank">Jet Geng</a> 2009-11-07 22:41 <a href="http://www.blogjava.net/JetGeng/archive/2009/11/07/301576.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Galileo: Improved EMF-Databinding-Support </title><link>http://www.blogjava.net/JetGeng/archive/2009/11/07/301575.html</link><dc:creator>Jet Geng</dc:creator><author>Jet Geng</author><pubDate>Sat, 07 Nov 2009 14:39:00 GMT</pubDate><guid>http://www.blogjava.net/JetGeng/archive/2009/11/07/301575.html</guid><wfw:comment>http://www.blogjava.net/JetGeng/comments/301575.html</wfw:comment><comments>http://www.blogjava.net/JetGeng/archive/2009/11/07/301575.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JetGeng/comments/commentRss/301575.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JetGeng/services/trackbacks/301575.html</trackback:ping><description><![CDATA[<h2 style="clear: both;">1.译序</h2>
<p>在学习EMF-Databinding的时候发现了Tom Schindl的博客。他的博客中有一个关于EMF
Databinding的专题。感觉很不多。想尝试着翻译一下。 那么Tom
Schindl是何许人也？他是JFace项目的一个Contributor，在2007年<a href="http://www.eclipsezone.com/eclipse/forums/t90466.html" target="_top">Eclipse
Zone</a>
就曾经采访过他。 所以称他为EMF Databinding的专家一点也不过分。 </p>
<div style="margin-left: 0.5in; margin-right: 0.5in;">
<table summary="Note" border="0">
    <tbody>
        <tr>
            <td rowspan="2" valign="top" width="25" align="center"><img src="http://dl.javaeye.com/upload/attachment/152505/eb654d9f-9350-31dd-8508-c4210036a80f.gif" alt="" width="24" height="24" /></td>
            <th align="left">Note</th>
        </tr>
        <tr>
            <td colspan="2" valign="top" align="left">
            <p>原文为路径为http://tomsondev.bestsolution.at/2009/06/06/galileo-improved-emf-databinding-support/
            </p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<h2 style="clear: both;">2. 原文<br />
</h2>
<div>
<div>
<div>
<p>我很高兴的宣布在Eclipse-Galileo中EMF-2.5已经开始支持新的Eclipse-Databinding API了。荣誉归Matthew
Hall，他审查我的代码，帮我整理支撑部分并且整理文档（详细内容在<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=262160" target="_top">bug
262160</a>
中） </p>
<p>几周前我成为了EMF项目的捐献者，现在我负责Databinding对EMF的支持模块。我将尽力修正API中的问题，回答Newsgroup中的问题。
</p>
<p>请允许我在介绍这个API的优点以及如何使用它之前声明一点：这个API还处于过渡期，他可能会有一些细微的变化。不过我们将会详细说明变化的部分。 </p>
<p>我将用一个系列文章来展现这个新的EMF-Databinding: </p>
<table summary="Simple list" border="0">
    <tbody>
        <tr>
            <td>第一部分：<a href="http://tomsondev.bestsolution.at/2009/06/06/galileo-emf-databinding-part-1/" target="_top">创建领域模型</a>
            </td>
        </tr>
        <tr>
            <td>第二部分：<a href="http://tomsondev.bestsolution.at/2009/06/07/galileo-emf-databinding-part-2/" target="_top">介绍新的Properties API</a>
            </td>
        </tr>
        <tr>
            <td>第三部分：<a href="http://tomsondev.bestsolution.at/2009/06/07/galileo-emf-databinding-part-3/" target="_top">用EMF-Databinding绑定到TreeViewer</a>
            </td>
        </tr>
        <tr>
            <td>第四部分：<a href="http://tomsondev.bestsolution.at/2009/06/07/galileo-emf-databinding-part-4/" target="_top">在master-detail模式中使用Properties API</a>
            </td>
        </tr>
        <tr>
            <td>第五部分：<a href="http://tomsondev.bestsolution.at/2009/06/07/galileo-emf-databinding-part-5/" target="_top">用EMF-Databinding绑定到TableViewer</a>
            </td>
        </tr>
        <tr>
            <td>第六部分：Write your own Property for unsupport Widget-Types </td>
        </tr>
        <tr>
            <td>第七部分：Make the storage system plugable</td>
        </tr>
    </tbody>
</table>
<p>为了让你快速进入EMF-Databinding中，我在前几天做了一个例子。 </p>
<p><img src="http://tomsondev.files.wordpress.com/2009/06/screen.png?w=300&amp;h=187" alt="" /></p>
<p>所有代码都是基于EPL协议，你可以在从<a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.emf/org.eclipse.emf/examples/?root=Modeling_Project" target="_top">Eclipse-CVS</a>
处获得。 </p>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/JetGeng/aggbug/301575.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JetGeng/" target="_blank">Jet Geng</a> 2009-11-07 22:39 <a href="http://www.blogjava.net/JetGeng/archive/2009/11/07/301575.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>初次接触Ocl</title><link>http://www.blogjava.net/JetGeng/archive/2006/11/11/80607.html</link><dc:creator>Jet Geng</dc:creator><author>Jet Geng</author><pubDate>Sat, 11 Nov 2006 12:30:00 GMT</pubDate><guid>http://www.blogjava.net/JetGeng/archive/2006/11/11/80607.html</guid><wfw:comment>http://www.blogjava.net/JetGeng/comments/80607.html</wfw:comment><comments>http://www.blogjava.net/JetGeng/archive/2006/11/11/80607.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JetGeng/comments/commentRss/80607.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JetGeng/services/trackbacks/80607.html</trackback:ping><description><![CDATA[
		<p style="margin-bottom: 0cm;" align="left" lang="zh-CN">以前不知道有<font face="Times New Roman, serif">Ocl</font>这个东西，前几天有幸看到。深深被他吸引了。抛开其他的不说，就他的查询功能的就让人激动不已了<font face="Times New Roman, serif">:)</font>。</p>
		<p style="margin-bottom: 0cm;" align="left" lang="zh-CN">
		</p>
		<p style="margin-bottom: 0cm;" align="left" lang="zh-CN">现在只是看了</p>
		<p style="margin-bottom: 0cm;" align="left" lang="zh-CN">
				<font face="Times New Roman, serif">
						<a href="http://help.eclipse.org/help31/index.jsp?topic=/org.eclipse.gmf.doc/examples-guide/msl/oclQueryExample.html">oclQueryExmaple</a>
				</font>
		</p>
		<p style="margin-bottom: 0cm;" align="left" lang="zh-CN">
				<font face="Times New Roman, serif">
						<a href="http://help.eclipse.org/help31/index.jsp?topic=/org.eclipse.gmf.doc/tutorials/msl/oclQueryTutorial.html">Querying
EMF Models with OCL</a>
				</font>
		</p>
		<p style="margin-bottom: 0cm;" align="left" lang="zh-CN">
				<br />
		</p>
		<p style="margin-bottom: 0cm;" lang="zh-CN">在项目中简单的使用了一下他作为查询的工具。感觉他真的很不错，在下一段时间将会重点去了解他。</p>
<img src ="http://www.blogjava.net/JetGeng/aggbug/80607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JetGeng/" target="_blank">Jet Geng</a> 2006-11-11 20:30 <a href="http://www.blogjava.net/JetGeng/archive/2006/11/11/80607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jmerge的使用初步(二)</title><link>http://www.blogjava.net/JetGeng/archive/2006/05/02/44342.html</link><dc:creator>Jet Geng</dc:creator><author>Jet Geng</author><pubDate>Tue, 02 May 2006 03:34:00 GMT</pubDate><guid>http://www.blogjava.net/JetGeng/archive/2006/05/02/44342.html</guid><wfw:comment>http://www.blogjava.net/JetGeng/comments/44342.html</wfw:comment><comments>http://www.blogjava.net/JetGeng/archive/2006/05/02/44342.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/JetGeng/comments/commentRss/44342.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JetGeng/services/trackbacks/44342.html</trackback:ping><description><![CDATA[
		<p style="margin-bottom: 0cm;" align="center">
				<font face="Times New Roman, serif">
						<code>
								<font face="宋体">Jmerger</font>
						</code>
				</font>
				<code>
						<span lang="zh-CN">
								<font face="宋体">使用初步</font>
						</span>
						<font face="Times New Roman, serif">
								<font face="宋体">(</font>
						</font>
				</code>
				<code>
						<span lang="zh-CN">
								<font face="宋体">二</font>
						</span>
						<font face="Times New Roman, serif">
								<font face="宋体">)</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<span lang="zh-CN">
								<font face="宋体">前面一篇提到了他基本的概念和能完成的功能。在这一篇里我们来看看他的使用条件和使用方法。</font>
						</span>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<span lang="zh-CN">
								<font face="宋体">使用条件：应为</font>
						</span>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<font face="Times New Roman, serif">
						<code>
								<font face="宋体">org.eclipse.jdt.core</font>
						</code>
				</font>
				<code>
						<span lang="zh-CN">
								<font face="宋体">（提供基本的语法分析）</font>
						</span>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<font face="Times New Roman, serif">
						<code>
								<font face="宋体">org.eclipse.core.runtime</font>
						</code>
				</font>
				<code>
						<span lang="zh-CN">
								<font face="宋体">（提供基本的</font>
						</span>
						<font face="Times New Roman, serif">
								<font face="宋体">URI</font>
						</font>
				</code>
				<code>
						<span lang="zh-CN">
								<font face="宋体">等）</font>
						</span>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<font face="Times New Roman, serif">
						<code>
								<font face="宋体">org.eclipse.ui</font>
						</code>
				</font>
				<code>
						<span lang="zh-CN">
								<font face="宋体">（提供进度条，我就看到了这个。其他可能还有）。</font>
						</span>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<span lang="zh-CN">
								<font face="宋体">看到他要使用这么多</font>
						</span>
						<font face="Times New Roman, serif">
								<font face="宋体">Eclipse</font>
						</font>
				</code>
				<code>
						<span lang="zh-CN">
								<font face="宋体">的东西。我彻底的打消了在</font>
						</span>
						<font face="Times New Roman, serif">
								<font face="宋体">Eclipse</font>
						</font>
				</code>
				<code>
						<span lang="zh-CN">
								<font face="宋体">外使用他的打算（如果谁有好的解决方案记得给我发一份。在下感激不尽）。</font>
						</span>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<br />
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<span lang="zh-CN">
								<font face="宋体">我们下面就来看看如何定制他的合并规则是如何定义的吧。我先做法是找了一个例子。看看他是如何工作的。</font>
						</span>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<br />
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<span lang="zh-CN">
								<font face="宋体">我的</font>
						</span>
						<font face="Times New Roman, serif">
								<font face="宋体">Merge.xml</font>
						</font>
				</code>
				<code>
						<span lang="zh-CN">
								<font face="宋体">如下：</font>
						</span>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<span lang="zh-CN">
								<font face="宋体">清单</font>
						</span>
						<font face="Times New Roman, serif">
								<font face="宋体">2</font>
						</font>
				</code>
				<code>
						<span lang="zh-CN">
								<font face="宋体">：</font>
						</span>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<font face="Courier New, monospace">
						<font size="2">
								<font color="#008080">&lt;?</font>
								<font color="#3f7f7f">xml
</font>
								<font color="#7f007f">version</font>
								<font color="#000000">=</font>
								<font color="#2a00ff">"1.0"
</font>
								<font color="#7f007f">encoding</font>
								<font color="#000000">=</font>
								<font color="#2a00ff">"UTF-8"</font>
								<font color="#008080">?&gt;</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<font face="Courier New, monospace">
						<font size="2">
								<font color="#008080">&lt;</font>
								<font color="#3f7f7f">merge:options
</font>
								<font color="#7f007f">xmlns:merge</font>
								<font color="#000000">=</font>
								<font color="#2a00ff">"http://www.eclipse.org/org/eclipse/emf/codegen/jmerge/Options"</font>
								<font color="#008080">&gt;</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<br />
		</p>
		<p style="margin-bottom: 0cm;">
				<font color="#000000">
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<font color="#008080">&lt;</font>
								<font color="#3f7f7f">merge:dictionaryPattern</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<font color="#3f7f7f">
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<font color="#7f007f">name</font>
								<font color="#000000">=</font>
								<font color="#2a00ff">"generatedMember"
</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<font color="#2a00ff">
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<font color="#7f007f">select</font>
								<font color="#000000">=</font>
								<font color="#2a00ff">"Member/getComment"
</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<font color="#2a00ff">
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<font color="#7f007f">match</font>
								<font color="#000000">=</font>
								<font color="#2a00ff">"\s*@\s*(gen)erated\s*\n"</font>
								<font color="#008080">/&gt;</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<font color="#000000">
						<font face="Courier New, monospace">
								<font size="2">
								</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<font color="#000000">
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<font color="#3f5fbf">&lt;!--
if target is generated, transfer --&gt;</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<font color="#000000">
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<font color="#3f5fbf">&lt;!--
change to sourceMarkup if the source is the standard --&gt;</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<font color="#000000">
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<font color="#000000">
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<font color="#008080">&lt;</font>
								<font color="#3f7f7f">merge:pull
</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<font color="#3f7f7f">
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<font color="#7f007f">targetMarkup</font>
								<font color="#000000">=</font>
								<font color="#2a00ff">"^gen$"</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<font color="#2a00ff">
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<font color="#7f007f">sourceGet</font>
								<font color="#000000">=</font>
								<font color="#2a00ff">"Method/getBody"</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<font color="#2a00ff">
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<font color="#7f007f">targetPut</font>
								<font color="#000000">=</font>
								<font color="#2a00ff">"Method/setBody"</font>
								<font color="#008080">/&gt;</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<br />
		</p>
		<p style="margin-bottom: 0cm;">
				<font face="Times New Roman, serif">
						<font size="2">
								<font face="Courier New, monospace">
										<font color="#008080">&lt;/</font>
										<font color="#3f7f7f">merge:options</font>
										<font color="#008080">&gt;</font>
								</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<br />
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<span lang="zh-CN">
								<font face="宋体">运行前的</font>
						</span>
						<font face="Times New Roman, serif">
								<font face="宋体">Source</font>
						</font>
				</code>
				<code>
						<span lang="zh-CN">
								<font face="宋体">（</font>
						</span>
						<font face="Times New Roman, serif">
								<font face="宋体">Java
Source A</font>
						</font>
				</code>
				<code>
						<span lang="zh-CN">
								<font face="宋体">）
</font>
						</span>
						<code>
								<span lang="zh-CN">
										<font face="宋体">部</font>
								</span>
						</code>
						<span lang="zh-CN">
								<font face="宋体">分源代码为</font>
						</span>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<font face="Times New Roman, serif">
						<code>
								<font face="宋体">/**</font>
						</code>
				</font>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font face="Times New Roman, serif">
								<font face="宋体">*
Source javadoc 13</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font face="Times New Roman, serif">
								<font face="宋体">*
&lt;!-- begin-user-doc --&gt;</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font face="Times New Roman, serif">
								<font face="宋体">*
Source user javadoc 14</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font face="Times New Roman, serif">
								<font face="宋体">*
&lt;!-- end-user-doc --&gt;</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font face="Times New Roman, serif">
								<font face="宋体">*
Source javadoc 15</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font face="Times New Roman, serif">
								<font face="宋体">*
@return source</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font face="Times New Roman, serif">
								<font face="宋体">*
@generated</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font face="Times New Roman, serif">
								<font face="宋体">*/</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font face="Times New Roman, serif">
								<font face="宋体">public
boolean isID()</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font face="Times New Roman, serif">
								<font face="宋体">{</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font face="Times New Roman, serif">
								<font face="宋体">//
begin-user-code</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font face="Times New Roman, serif">
								<font face="宋体">System.out.println("Source
user code 1");</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font face="Times New Roman, serif">
								<font face="宋体">//
end-user-code    </font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font face="Times New Roman, serif">
								<font face="宋体">System.out.println("Source
code 2");</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font face="Times New Roman, serif">
								<font face="宋体">return
id == "source";</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font face="Times New Roman, serif">
								<font face="宋体">}</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<br />
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<br />
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<br />
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<br />
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<br />
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<br />
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<br />
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<span lang="zh-CN">
								<font face="宋体">运行前</font>
						</span>
						<font face="Times New Roman, serif">
								<font face="宋体">Target(Java
Source B)</font>
						</font>
				</code>
				<code>
						<span lang="zh-CN">
								<font face="宋体">部分的源代码为：</font>
						</span>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<font face="Times New Roman, serif">
						<code>
								<font face="宋体">/**<br />
  * Source javadoc 13<br />   * &lt;!-- begin-user-doc --&gt;<br />   *
Target user javadoc 16<br />   * Target user javadoc 17<br />   * &lt;!--
end-user-doc --&gt;<br />   * Source javadoc 15<br />   * @return source<br />
  * @generated<br />   */<br />  public boolean isID()<br />  {<br />	//This
is my owner code<br />	System.out.print("Will be replace");<br />
   // begin-user-code<br />    System.out.println("Target user
code 2");<br />    // end-user-code<br />   
System.out.println("Source code 2");<br />    return id ==
"source";<br />  }</font>
						</code>
				</font>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<br />
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<font face="Times New Roman, serif">
						<code>
								<font face="宋体">/**<br />
  * Target javadoc 19<br />   * &lt;!-- begin-user-doc --&gt;<br />   *
Target user javadoc 20<br />   * Target user javadoc 21<br />   * &lt;!--
end-user-doc --&gt;<br />   * Target javadoc 22<br />   * @param target<br />
  * @generated NOT<br />   */<br />  public void setID(boolean value)<br />
 {<br />	 //This Jet Code<br />	System.out.println("Not be
replaced!");<br />     id = value ? "target" :
"source";<br />     System.out.println("Target code
4");<br />  }</font>
								<code>
										<font face="宋体">
										</font>
								</code>
						</code>
				</font>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<span lang="zh-CN">
								<font face="宋体">注意：</font>
						</span>
						<font face="Times New Roman, serif">
								<code>
										<font face="宋体">isID</font>
								</code>
						</font>
				</code>
				<code>
						<code>
								<span lang="zh-CN">
										<font face="宋体">方法</font>
								</span>
						</code>
						<span lang="zh-CN">
								<font face="宋体">注释里有”</font>
						</span>
						<font face="Times New Roman, serif">
								<code>
										<font face="宋体">@generated”</font>
								</code>
						</font>
				</code>
				<code>
						<code>
								<span lang="zh-CN">
										<font face="宋体">这一行。而
</font>
								</span>
								<font face="Times New Roman, serif">
										<code>
												<font face="宋体">setID
</font>
										</code>
								</font>
						</code>
				</code>
				<code>
						<code>
								<code>
										<span lang="zh-CN">
												<font face="宋体">方法的注释中是</font>
										</span>
										<font face="Times New Roman, serif">
												<code>
														<font face="宋体">@generated
NOT</font>
												</code>
										</font>
								</code>
						</code>
				</code>
				<code>
						<code>
								<code>
										<code>
												<span lang="zh-CN">
														<font face="宋体">。</font>
												</span>
										</code>
								</code>
						</code>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<br />
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<span lang="zh-CN">
								<font face="宋体">运行后的结果是（</font>
						</span>
						<font face="Times New Roman, serif">
								<font face="宋体">Result
of merge</font>
						</font>
				</code>
				<code>
						<span lang="zh-CN">
								<font face="宋体">）为</font>
						</span>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<font face="Times New Roman, serif">
						<code>
								<font face="宋体">/**<br />
  * Source javadoc 13<br />   * &lt;!-- begin-user-doc --&gt;<br />   *
Target user javadoc 16<br />   * Target user javadoc 17<br />   * &lt;!--
end-user-doc --&gt;<br />   * Source javadoc 15<br />   * @return source<br />
  * @generated<br />   */<br />  public boolean isID()</font>
						</code>
				</font>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font face="Times New Roman, serif">
								<font face="宋体">{</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font face="Times New Roman, serif">
								<font face="宋体">//
begin-user-code</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font face="Times New Roman, serif">
								<font face="宋体">System.out.println("Source
user code 1");</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font face="Times New Roman, serif">
								<font face="宋体">//
end-user-code    </font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font face="Times New Roman, serif">
								<font face="宋体">System.out.println("Source
code 2");</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font face="Times New Roman, serif">
								<font face="宋体">return
id == "source";</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font face="Times New Roman, serif">
								<font face="宋体">}</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<font face="Times New Roman, serif">
						<code>
								<font face="宋体">//</font>
						</code>
				</font>
				<code>
						<span lang="zh-CN">
								<font face="宋体">使用了</font>
						</span>
						<font face="Times New Roman, serif">
								<code>
										<font face="宋体">Source</font>
								</code>
						</font>
				</code>
				<code>
						<code>
								<span lang="zh-CN">
										<font face="宋体">部分的代码。</font>
								</span>
						</code>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font face="Times New Roman, serif">
								<font face="宋体">/**<br />
  * Target javadoc 19<br />   * &lt;!-- begin-user-doc --&gt;<br />   *
Target user javadoc 20<br />   * Target user javadoc 21<br />   * &lt;!--
end-user-doc --&gt;<br />   * Target javadoc 22<br />   * @param target<br />
  * @generated NOT<br />   */<br />  public void setID(boolean value)<br />
 {<br />	 //This Jet Code<br />	 System.out.println("Not be
replaced!");<br />     id = value ? "target" :
"source";<br />     System.out.println("Target code
4");<br />  }</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<font face="Times New Roman, serif">
						<code>
								<font face="宋体">//</font>
						</code>
				</font>
				<code>
						<span lang="zh-CN">
								<font face="宋体">维持原来</font>
						</span>
						<font face="Times New Roman, serif">
								<font face="宋体">Target</font>
						</font>
				</code>
				<code>
						<span lang="zh-CN">
								<font face="宋体">中的代码没有变化。</font>
						</span>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<span lang="zh-CN">
								<font face="宋体">这样我们就不难看出</font>
						</span>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<font face="Times New Roman, serif">
						<code>
								<font size="2">
										<font face="宋体">
												<font color="#008080">&lt;</font>
												<font color="#3f7f7f">merge:dictionaryPattern
……/&gt;</font>
										</font>
								</font>
						</code>
				</font>
				<code>
						<span lang="zh-CN">
								<font size="2">
										<font face="宋体">
												<font color="#3f7f7f">段</font>
										</font>
								</font>
						</span>
						<code>
								<span lang="zh-CN">
										<font size="2">
												<font face="宋体">
														<font color="#000000">是定义了一个匹配模式。具体的这个匹配模式要做的动作就是在</font>
												</font>
										</font>
								</span>
						</code>
				</code>
		</p>
		<p style="margin-bottom: 0cm;" align="left">
				<code>
						<font color="#000000">
						</font>
						<font face="Times New Roman, serif">
								<font size="2">
										<font face="Courier New, monospace">
												<font color="#008080">&lt;</font>
												<font color="#3f7f7f">merge:pull
</font>
										</font>
								</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;">
				<font color="#3f7f7f">
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<font color="#7f007f">targetMarkup</font>
								<font color="#000000">=</font>
								<font color="#2a00ff">"^gen$"</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<font color="#2a00ff">
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<font color="#7f007f">sourceGet</font>
								<font color="#000000">=</font>
								<font color="#2a00ff">"Method/getBody"</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<font color="#2a00ff">
				</font>
				<font face="Times New Roman, serif">
						<font size="2">
								<font face="Courier New, monospace">
										<font color="#7f007f">targetPut</font>
										<font color="#000000">=</font>
										<font color="#2a00ff">"Method/setBody"</font>
										<font color="#008080">/&gt;</font>
								</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;" lang="zh-CN">
				<font color="#000000">
						<font face="宋体">
								<font size="2">段中定义了。猜想他只是把</font>
						</font>
						<font face="Courier New, monospace">
								<font size="2">Source</font>
						</font>
						<font face="宋体">
								<font size="2">部分的内容直接输出到</font>
						</font>
						<font face="Courier New, monospace">
								<font size="2">Target</font>
						</font>
						<font face="宋体">
								<font size="2">那里去了。</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;" lang="zh-CN">
				<font color="#008080">
						<font face="宋体">
								<font size="2">
										<font color="#000000">如果我们觉得需要做点什么过滤。比如说想保留</font>
								</font>
						</font>
						<font face="Courier New, monospace">
								<font size="2">
										<font face="宋体">
												<font color="#000000">Target</font>
										</font>
								</font>
						</font>
						<font face="宋体">
								<font size="2">
										<font color="#000000">中一个特定的内容。这一个我们可以通过
 </font>
								</font>
						</font>
						<font face="Courier New, monospace">
								<font size="2">
										<code>
												<font size="2">
														<font face="宋体">
																<font color="#000000">merge:pull</font>
														</font>
												</font>
										</code>
								</font>
						</font>
						<font face="宋体">
								<font size="2">
										<code>
												<span lang="zh-CN">
														<font size="2">
																<font face="宋体">
																		<font color="#000000">中</font>
																</font>
														</font>
												</span>
										</code>
								</font>
						</font>
						<font face="Courier New, monospace">
								<font size="2">
										<code>
												<font size="2">
														<font face="宋体">
																<font color="#000000">sourceTransfer</font>
														</font>
												</font>
										</code>
								</font>
						</font>
						<font face="宋体">
								<font size="2">
										<code>
												<span lang="zh-CN">
														<font size="2">
																<font face="宋体">
																		<font color="#000000">属性来设置。</font>
																</font>
														</font>
												</span>
										</code>
								</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;" lang="zh-CN">
				<br />
		</p>
		<p style="margin-bottom: 0cm;" lang="zh-CN">
				<font color="#008080">
						<font face="宋体">
								<font size="2">
										<code>
												<span lang="zh-CN">
														<font size="2">
																<font face="宋体">
																		<font color="#000000">现在来看一个例子：</font>
																</font>
														</font>
												</span>
										</code>
								</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;" lang="zh-CN">
				<font color="#008080">
						<font face="宋体">
								<font size="2">
										<code>
												<span lang="zh-CN">
														<font size="2">
																<font face="宋体">
																		<font color="#000000">把</font>
																</font>
														</font>
												</span>
										</code>
								</font>
						</font>
						<font face="Courier New, monospace">
								<font size="2">
										<code>
												<font size="2">
														<font face="宋体">
																<font color="#000000">merge:pull</font>
														</font>
												</font>
										</code>
								</font>
						</font>
						<font face="宋体">
								<font size="2">
										<code>
												<span lang="zh-CN">
														<font size="2">
																<font face="宋体">
																		<font color="#000000">节点修改成</font>
																</font>
														</font>
												</span>
										</code>
								</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;" lang="zh-CN">
				<font color="#008080">
						<code>
								<font color="#000000">
								</font>
								<font face="Courier New, monospace">
										<font size="2">
												<font size="2">
														<font face="Courier New, monospace">
																<font color="#008080">&lt;</font>
																<font color="#3f7f7f">merge:pull
</font>
														</font>
												</font>
										</font>
								</font>
						</code>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<font color="#3f7f7f">
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<font color="#7f007f">targetMarkup</font>
								<font color="#000000">=</font>
								<font color="#2a00ff">"^gen$"</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<font color="#2a00ff">
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<font color="#7f007f">sourceTransfer</font>
								<font color="#000000">=</font>
								<font color="#2a00ff">"(\s*//\s*begin-user-code.*?//\s*end-user-code\s*)\n"</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<font color="#2a00ff">
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<font color="#7f007f">sourceGet</font>
								<font color="#000000">=</font>
								<font color="#2a00ff">"Method/getBody"</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<font color="#2a00ff">
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<font color="#7f007f">targetPut</font>
								<font color="#000000">=</font>
								<font color="#2a00ff">"Method/setBody"</font>
								<font color="#008080">/&gt;</font>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<font face="Courier New, monospace">
						<font size="2">
								<code>
										<span lang="zh-CN">
												<font color="#000000">
														<font face="宋体">注意：添加了一个
</font>
												</font>
										</span>
								</code>
						</font>
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<code>
										<font color="#000000">
												<font size="2">
														<font face="Courier New, monospace">sourceTransfer,</font>
												</font>
										</font>
								</code>
						</font>
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<code>
										<span lang="zh-CN">
												<font color="#000000">
														<font size="2">
																<font face="Courier New, monospace">他的值</font>
																<font face="宋体">值是一个正则表达式。匹配的是被</font>
														</font>
												</font>
										</span>
								</code>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<code>
						<font color="#000000">“<font face="Courier New, monospace"><font size="2"><font size="2"><font face="Courier New, monospace">//
begin-user-code” </font></font></font></font></font>
				</code>
				<font face="Courier New, monospace">
						<font size="2">
								<code>
										<span lang="zh-CN">
												<font size="2">
														<font face="宋体">
																<font color="#000000">和“</font>
														</font>
												</font>
										</span>
								</code>
						</font>
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<code>
										<font size="2">
												<font face="Courier New, monospace">
														<font color="#000000">//
end-user-code”</font>
												</font>
										</font>
								</code>
						</font>
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<code>
										<span lang="zh-CN">
												<font size="2">
														<font face="宋体">
																<font color="#000000">包围住的所有的字符。</font>
														</font>
												</font>
										</span>
								</code>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<font face="Courier New, monospace">
						<font size="2">
								<code>
										<font size="2">
												<font face="Courier New, monospace">
														<font color="#000000">Target</font>
												</font>
										</font>
								</code>
						</font>
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<code>
										<span lang="zh-CN">
												<font size="2">
														<font face="宋体">
																<font color="#000000">的代码为<span lang="zh-CN">（<span lang="zh-CN">我们现在只是关注</span></span></font>
														</font>
												</font>
										</span>
								</code>
						</font>
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<code>
										<font size="2">
												<font face="Courier New, monospace">
														<code>
																<font face="宋体">
																		<font color="#000000">isID</font>
																</font>
														</code>
												</font>
										</font>
								</code>
						</font>
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<code>
										<span lang="zh-CN">
												<font size="2">
														<font face="宋体">
																<span lang="zh-CN">
																		<code>
																				<span lang="zh-CN">
																						<font face="宋体">
																								<font color="#000000">方法</font>
																						</font>
																				</span>
																		</code>
																		<font color="#000000">）</font>
																</span>
																<font color="#000000">。</font>
														</font>
												</font>
										</span>
								</code>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<br />
		</p>
		<p style="margin-bottom: 0cm;">
				<font face="Courier New, monospace">
						<font size="2">
								<code>
										<font size="2">
												<font face="Courier New, monospace">
														<font color="#7f007f">/**<br />
  * Source javadoc 13<br />   * &lt;!-- begin-user-doc --&gt;<br />   *
Target user javadoc 16<br />   * Target user javadoc 17<br />   * &lt;!--
end-user-doc --&gt;<br />   * Source javadoc 15<br />   * @return source<br />
  * @generated<br />   */<br />  public boolean isID()</font>
												</font>
										</font>
								</code>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<code>
						<font color="#7f007f">
								<font face="Courier New, monospace">
										<font size="2">
												<font size="2">
														<font face="Courier New, monospace">{</font>
												</font>
										</font>
								</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;">
				<code>
						<font color="#7f007f">
								<font face="Courier New, monospace">
										<font size="2">
												<font size="2">
														<font face="Courier New, monospace">//
begin-user-code</font>
												</font>
										</font>
								</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;">
				<code>
						<font color="#7f007f">
								<font face="Courier New, monospace">
										<font size="2">
												<font size="2">
														<font face="Courier New, monospace">System.out.println("Source
user code 1");<br /></font>
														<font color="#ff3366">System.out.println("This
will not be replaced!");</font>
												</font>
										</font>
								</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;">
				<code>
						<font color="#7f007f">
								<font face="Courier New, monospace">
										<font size="2">
												<font size="2">
														<font face="Courier New, monospace">//
end-user-code    <br /></font>
														<font color="#ff0000">System.out.print("this
will be replaced!");</font>
												</font>
										</font>
								</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;">
				<code>
						<font color="#7f007f">
								<font face="Courier New, monospace">
										<font size="2">
												<font size="2">
														<font face="Courier New, monospace">System.out.println("Source
code 2");</font>
												</font>
										</font>
								</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;">
				<code>
						<font color="#7f007f">
								<font face="Courier New, monospace">
										<font size="2">
												<font size="2">
														<font face="Courier New, monospace">return
id == "source";</font>
												</font>
										</font>
								</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;">
				<code>
						<font color="#7f007f">
								<font face="Courier New, monospace">
										<font size="2">
												<font size="2">
														<font face="Courier New, monospace">}</font>
												</font>
										</font>
								</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;">
				<br />
		</p>
		<p style="margin-bottom: 0cm;">
				<font face="Courier New, monospace">
						<font size="2">
								<code>
										<span lang="zh-CN">
												<font size="2">
														<font face="宋体">
																<font color="#000000">请注意看一下红色部分的两行代码。</font>
														</font>
												</font>
										</span>
								</code>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<font face="Courier New, monospace">
						<font size="2">
								<code>
										<span lang="zh-CN">
												<font size="2">
														<font face="宋体">
																<font color="#000000">合并后的代码为：</font>
														</font>
												</font>
										</span>
								</code>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<font face="Courier New, monospace">
						<font size="2">
								<code>
										<font size="2">
												<font face="Courier New, monospace">
														<font color="#7f007f">/**<br />
  * Source javadoc 13<br />   * &lt;!-- begin-user-doc --&gt;<br />   *
Target user javadoc 16<br />   * Target user javadoc 17<br />   * &lt;!--
end-user-doc --&gt;<br />   * Source javadoc 15<br />   * @return source<br />
  * @generated<br />   */<br />  public boolean isID()</font>
												</font>
										</font>
								</code>
						</font>
				</font>
		</p>
		<p style="margin-bottom: 0cm;">
				<code>
						<font color="#7f007f">
								<font face="Courier New, monospace">
										<font size="2">
												<font size="2">
														<font face="Courier New, monospace">{</font>
												</font>
										</font>
								</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;">
				<code>
						<font color="#7f007f">
								<font face="Courier New, monospace">
										<font size="2">
												<font size="2">
														<font face="Courier New, monospace">//
begin-user-code</font>
												</font>
										</font>
								</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;">
				<code>
						<font color="#7f007f">
								<font face="Courier New, monospace">
										<font size="2">
												<font size="2">
														<font face="Courier New, monospace">System.out.println("Source
user code 1");<br />    System.out.println("This will not be
replaced!");</font>
												</font>
										</font>
								</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;">
				<code>
						<font color="#7f007f">
								<font face="Courier New, monospace">
										<font size="2">
												<font size="2">
														<font face="Courier New, monospace">//
end-user-code    <br />    System.out.println("Source code 2");</font>
												</font>
										</font>
								</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;">
				<code>
						<font color="#7f007f">
								<font face="Courier New, monospace">
										<font size="2">
												<font size="2">
														<font face="Courier New, monospace">return
id == "source";</font>
												</font>
										</font>
								</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;">
				<code>
						<font color="#7f007f">
								<font face="Courier New, monospace">
										<font size="2">
												<font size="2">
														<font face="Courier New, monospace">}</font>
												</font>
										</font>
								</font>
						</font>
				</code>
		</p>
		<p style="margin-bottom: 0cm;">
				<br />
		</p>
		<p style="margin-bottom: 0cm;">
				<font face="Courier New, monospace">
						<font size="2">
								<code>
										<span lang="zh-CN">
												<font size="2">
														<font face="宋体">
																<font color="#000000">在“</font>
														</font>
												</font>
										</span>
								</code>
						</font>
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<code>
										<font size="2">
												<font face="Courier New, monospace">
														<code>
																<font size="2">
																		<font face="Courier New, monospace">
																				<font color="#000000">//
begin-user-code</font>
																		</font>
																</font>
														</code>
														<font color="#000000">”</font>
												</font>
										</font>
								</code>
						</font>
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<code>
										<span lang="zh-CN">
												<font size="2">
														<font face="宋体">
																<font color="#000000">和“</font>
														</font>
												</font>
										</span>
								</code>
						</font>
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<code>
										<font size="2">
												<font face="Courier New, monospace">
														<code>
																<font size="2">
																		<font face="Courier New, monospace">
																				<font color="#000000">//
end-user-code</font>
																		</font>
																</font>
														</code>
														<font color="#000000">”</font>
												</font>
										</font>
								</code>
						</font>
				</font>
				<font face="Courier New, monospace">
						<font size="2">
								<code>
										<span lang="zh-CN">
												<font size="2">
														<font face="宋体">
																<font color="#000000">外的代码全部被替换成了。这样就起到了过滤的效果。</font>
														</font>
												</font>
										</span>
								</code>
						</font>
				</font>
		</p>
<img src ="http://www.blogjava.net/JetGeng/aggbug/44342.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JetGeng/" target="_blank">Jet Geng</a> 2006-05-02 11:34 <a href="http://www.blogjava.net/JetGeng/archive/2006/05/02/44342.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jmerge的使用初步(一)</title><link>http://www.blogjava.net/JetGeng/archive/2006/05/01/44261.html</link><dc:creator>Jet Geng</dc:creator><author>Jet Geng</author><pubDate>Mon, 01 May 2006 00:01:00 GMT</pubDate><guid>http://www.blogjava.net/JetGeng/archive/2006/05/01/44261.html</guid><wfw:comment>http://www.blogjava.net/JetGeng/comments/44261.html</wfw:comment><comments>http://www.blogjava.net/JetGeng/archive/2006/05/01/44261.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JetGeng/comments/commentRss/44261.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JetGeng/services/trackbacks/44261.html</trackback:ping><description><![CDATA[
		<div align="center">Jmerge的使用初步(一)<br /><div align="left"><p style="margin-bottom: 0cm;" align="left"><span lang="zh-CN">在</span><font face="Times New Roman, serif">EMF</font><span lang="zh-CN">框架中最终会根据模型生成代码，还可以反复生成。还能使你自己编辑的内容不丢失。够好玩的吧。那么这部分是怎么实现的呢？看过一点</span><font face="Times New Roman, serif">EMF</font><span lang="zh-CN">介绍就可以知道</span><font face="Times New Roman, serif">EMF</font><span lang="zh-CN">是通过</span><font face="Times New Roman, serif">JET</font><span lang="zh-CN">完成代码生成的动作的。在《</span>使用 <font face="Times New Roman, serif">Eclipse Modeling Framework </font>进行建模<span lang="zh-CN">》这个系列的文章就可以了解到这一点。在该系列文章的第三部分还可以了解到使用</span><font face="Times New Roman, serif">JMerge
</font><span lang="zh-CN">可以实现“成的代码插入现有的代码中，或者允许以后的开发人员来定制所生成的代码，而不需要在重新生成代码时重新编写任何内容。”这样的功能。</span></p><p style="margin-bottom: 0cm;" align="left" lang="zh-CN">他是通过创建<font face="Times New Roman, serif">Junit
</font>测试类作例子的。他说过的东西我就不啰嗦了。我只是把我个人在看了他文章后的一些东西整理一下。</p><p style="margin-bottom: 0cm;" align="left" lang="zh-CN">好，现在进入正题。</p><p style="margin-bottom: 0cm;" align="left" lang="zh-CN">首先我们来说一说<font face="Times New Roman, serif">JMerge</font>这个名字。<font face="Times New Roman, serif">Merge</font>这个单词是合并的意思。前面加了一个“<font face="Times New Roman, serif">J”</font>不用多说，肯定表示<font face="Times New Roman, serif">Java</font>了（完全是参考<font face="Times New Roman, serif">Junit,log4j……</font>）。那么我就大胆
猜测这个工具是用来合并<font face="Times New Roman, serif">Java</font>代码的。既然是合并就应该符合下图描述的动作。<img src="http://www.blogjava.net/images/blogjava_net/jetgeng/Jmerge-Name.jpg" alt="Jmerge-Name.jpg" border="0" height="227" width="488" /><br /></p><p style="margin-bottom: 0cm;" align="left" lang="zh-CN"></p><p style="margin-bottom: 0cm;" align="left" lang="zh-CN">合并肯定是把两个东西和成一个。所以图中的<font face="Times New Roman, serif">Java
Source A </font>和<font face="Times New Roman, serif">Java Source
B</font>就分别代表需要合并的部分了。最后的<font face="Times New Roman, serif">Result
of
Merge</font>就是合并后的那一个结果了。应为我们合并的是<font face="Times New Roman, serif">Java</font>代码。这些代码如何合并，也就是我们期望的合并结果是什么样的。图中的<font face="Times New Roman, serif">Rule
of merge</font>就是代表的这部分信息。</p><p style="margin-bottom: 0cm;" align="left" lang="zh-CN"><br /></p><p style="margin-bottom: 0cm;" align="left" lang="zh-CN">在下面使用<font face="Times New Roman, serif">Jmerge</font>的代码中<br /></p><p style="margin-bottom: 0.5cm;"><a name="N10073"></a><b>清单 </b><font face="Times New Roman, serif"><b>1.
</b></font><b>调用 </b><font face="Times New Roman, serif"><b>JMerge<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 128);"> 1</span> <span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> <img src="http://www.blogjava.net/images/dot.gif" /></span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 2</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">        JMerger merger </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> getJMerger();<br /></span><span style="color: rgb(0, 128, 128);"> 3</span> <span style="color: rgb(0, 0, 0);">        <br /></span><span style="color: rgb(0, 128, 128);"> 4</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> set source</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 5</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">        merger.setSourceCompilationUnit(<br /></span><span style="color: rgb(0, 128, 128);"> 6</span> <span style="color: rgb(0, 0, 0);">                merger.createCompilationUnitForContents(generated));<br /></span><span style="color: rgb(0, 128, 128);"> 7</span> <span style="color: rgb(0, 0, 0);">        <br /></span><span style="color: rgb(0, 128, 128);"> 8</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> set target</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 9</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">        merger.setTargetCompilationUnit(<br /></span><span style="color: rgb(0, 128, 128);">10</span> <span style="color: rgb(0, 0, 0);">                merger.createCompilationUnitForInputStream( <br /></span><span style="color: rgb(0, 128, 128);">11</span> <span style="color: rgb(0, 0, 0);">                        </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> FileInputStream(target.getLocation().toFile())));<br /></span><span style="color: rgb(0, 128, 128);">12</span> <span style="color: rgb(0, 0, 0);">        <br /></span><span style="color: rgb(0, 128, 128);">13</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> merge source and target</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">14</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">        merger.merge();<br /></span><span style="color: rgb(0, 128, 128);">15</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">16</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> extract merged contents</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">17</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">        InputStream mergedContents </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> ByteArrayInputStream(<br /></span><span style="color: rgb(0, 128, 128);">18</span> <span style="color: rgb(0, 0, 0);">                merger.getTargetCompilationUnit().getContents().getBytes());<br /></span><span style="color: rgb(0, 128, 128);">19</span> <span style="color: rgb(0, 0, 0);">                <br /></span><span style="color: rgb(0, 128, 128);">20</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> overwrite the target with the merged contents</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">21</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">        target.setContents(mergedContents, </span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">, monitor);<br /></span><span style="color: rgb(0, 128, 128);">22</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> <img src="http://www.blogjava.net/images/dot.gif" /><br /></span><span style="color: rgb(0, 128, 128);">23</span> <span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">24</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> <img src="http://www.blogjava.net/images/dot.gif" /></span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">25</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> JMerger getJMerger() {<br /></span><span style="color: rgb(0, 128, 128);">26</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> build URI for merge document</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">27</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">        String uri </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> <br /></span><span style="color: rgb(0, 128, 128);">28</span> <span style="color: rgb(0, 0, 0);">           Platform.getPlugin(PLUGIN_ID).getDescriptor().getInstallURL().toString();<br /></span><span style="color: rgb(0, 128, 128);">29</span> <span style="color: rgb(0, 0, 0);">        uri </span><span style="color: rgb(0, 0, 0);">+=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">templates/merge.xml</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 128, 128);">30</span> <span style="color: rgb(0, 0, 0);">                <br /></span><span style="color: rgb(0, 128, 128);">31</span> <span style="color: rgb(0, 0, 0);">        JMerger jmerger </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> JMerger();<br /></span><span style="color: rgb(0, 128, 128);">32</span> <span style="color: rgb(0, 0, 0);">        JControlModel controlModel </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> JControlModel( uri );<br /></span><span style="color: rgb(0, 128, 128);">33</span> <span style="color: rgb(0, 0, 0);">        jmerger.setControlModel( controlModel );<br /></span><span style="color: rgb(0, 128, 128);">34</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> jmerger;<br /></span><span style="color: rgb(0, 128, 128);">35</span> <span style="color: rgb(0, 0, 0);">}<br /><br /></span></div></b></font></p><p style="margin-bottom: 0cm;" lang="zh-CN">我们可以很容易的找出它们的对应物。</p><p style="margin-bottom: 0cm;" lang="zh-CN">我们先从<font face="Times New Roman, serif">JMerger</font>的创建开始看起吧。</p><p style="margin-bottom: 0cm;"><font face="Times New Roman, serif"><code>	
 uri += "templates/merge.xml";</code></font></p><pre><code>        JMerger jmerger = new JMerger();</code><br /><code>        JControlModel controlModel = new JControlModel( uri );</code><br /><code>        jmerger.setControlModel( controlModel );</code></pre><p style="margin-bottom: 0cm;"><code><span lang="zh-CN">这里用一个名为为为为叫</span><font face="Times New Roman, serif">merge.xml</font></code><code><span lang="zh-CN">的文件作为为为为输输输</span><font face="Times New Roman, serif">input</font></code><code><span lang="zh-CN">参数创创窜新建了一个</span><font face="Times New Roman, serif">JControlModel</font></code><code><span lang="zh-CN">对象。传传</span><code><span lang="zh-CN">传给</span><font face="Times New Roman, serif">JMerger</font></code></code><code><code><span lang="zh-CN">对象。做完这些后又调调用了
</span><font face="Times New Roman, serif"><code>setSourceCompilationUnit
</code></font></code></code><code><code><code><span lang="zh-CN">和
</span><font face="Times New Roman, serif"><code>setTargetCompilationUnit
</code></font></code></code></code><code><code><code><code><span lang="zh-CN">方法。他们们们</span><code><span lang="zh-CN">们的类类</span><code><span lang="zh-CN">类型都是</span><font face="Times New Roman, serif">IDOMCompilationUnit</font></code></code></code></code></code></code><code><code><code><code><code><code><span lang="zh-CN">（用</span><code><span lang="zh-CN">过的朋友都会知道他就代表了一个</span><font face="Times New Roman, serif">Java</font></code></code></code></code></code></code></code><code><code><code><code><code><code><code><span lang="zh-CN">文件</span></code><span lang="zh-CN">）。很荣荣</span><code><span lang="zh-CN">容易就会想起他们</span><code><span lang="zh-CN">们肯定就是</span><font face="Times New Roman, serif">Java
Source A </font></code></code></code></code></code></code></code></code><code><code><code><code><code><code><code><code><span lang="zh-CN">和</span><font face="Times New Roman, serif">Java
Source B</font></code></code></code></code></code></code></code></code><code><code><code><code><code><code><code><code><span lang="zh-CN">了至于</span><font face="Times New Roman, serif">Rule
of merge</font></code></code></code></code></code></code></code></code><code><code><code><code><code><code><code><code><span lang="zh-CN">可以通过</span><code><span lang="zh-CN">过调用</span><font face="Times New Roman, serif"><code>merger.merge()</code></font></code></code></code></code></code></code></code></code></code><code><code><code><code><code><code><code><code><code><code><span lang="zh-CN">后的</span><font face="Times New Roman, serif"><code>getContents</code></font></code></code></code></code></code></code></code></code></code></code><code><code><code><code><code><code><code><code><code><code><code><span lang="zh-CN">（）方法获</span><code><span lang="zh-CN">获得</span></code></code><span lang="zh-CN">。</span></code></code></code></code></code></code></code></code></code></code></p><p style="margin-bottom: 0cm;"><br /></p><p style="margin-bottom: 0cm;"><code><span lang="zh-CN">除了这种调用</span><code><span lang="zh-CN"></span></code><span lang="zh-CN">方式外还有一个更</span><code><span lang="zh-CN">简单</span></code><span lang="zh-CN">的调用方式：</span></code></p><p style="margin-bottom: 0cm;"><font face="Times New Roman, serif"><code>String
contents = merger.execute(null, new String[] { mergeXML,
source,target });</code></font></p><p style="margin-bottom: 0cm;"><br /></p><p style="margin-bottom: 0cm;"><code><span lang="zh-CN">看了 </span><font face="Times New Roman, serif"><code>execute
</code></font></code><code><code><span lang="zh-CN">实现后就</span><code><span lang="zh-CN">不难</span><code><span lang="zh-CN">发现他的还</span><code><span lang="zh-CN">是使用的第一</span><code><span lang="zh-CN">种。<br /></span></code></code></code></code></code></code></p><p style="margin-bottom: 0cm;"><code><span lang="zh-CN">关于具体如何定制合并规则</span><code><span lang="zh-CN">和使用条件打算在下一篇中写。<br /></span></code></code></p><p style="margin-bottom: 0cm;"><br /></p><p style="margin-bottom: 0cm;" align="left" lang="zh-CN"><br /></p><p style="margin-bottom: 0cm;" align="left" lang="zh-CN"></p></div></div>
<img src ="http://www.blogjava.net/JetGeng/aggbug/44261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JetGeng/" target="_blank">Jet Geng</a> 2006-05-01 08:01 <a href="http://www.blogjava.net/JetGeng/archive/2006/05/01/44261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EMF 生成代码阅读（二）--edit篇</title><link>http://www.blogjava.net/JetGeng/archive/2005/12/25/25363.html</link><dc:creator>Jet Geng</dc:creator><author>Jet Geng</author><pubDate>Sun, 25 Dec 2005 05:36:00 GMT</pubDate><guid>http://www.blogjava.net/JetGeng/archive/2005/12/25/25363.html</guid><wfw:comment>http://www.blogjava.net/JetGeng/comments/25363.html</wfw:comment><comments>http://www.blogjava.net/JetGeng/archive/2005/12/25/25363.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JetGeng/comments/commentRss/25363.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JetGeng/services/trackbacks/25363.html</trackback:ping><description><![CDATA[<P class=MsoNormal><SPAN lang=EN-US>EMF</SPAN><SPAN style="FONT-FAMILY: 宋体">不光为我们生成了模型类的代码。还为我们提供了一个默认的模型编辑器。要看到这个模型编辑器我们只需要运行一下就可以看到了（用</SPAN><SPAN lang=EN-US>Eclipse Application</SPAN><SPAN style="FONT-FAMILY: 宋体">的方式）。</SPAN></P><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">他默认的编辑器如下图所示<IMG height=249 alt=viewer.gif src="http://www.blogjava.net/images/blogjava_net/jetgeng/Eclipse/EMF/viewer.gif" width=728 border=0><BR><BR></SPAN><SPAN style="FONT-FAMILY: 宋体">
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><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: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><SPAN lang=EN-US><FONT face="Times New Roman">1.<SPAN style="FONT: 7pt 'Times New Roman'"><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT></SPAN></FONT></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: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l0 level2 lfo1; tab-stops: list 42.0pt"><FONT face="Times New Roman"><SPAN lang=EN-US>a)<SPAN style="FONT: 7pt 'Times New Roman'"><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT></SPAN></SPAN><SPAN lang=EN-US>Selection.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l0 level2 lfo1; tab-stops: list 42.0pt"><FONT face="Times New Roman"><SPAN lang=EN-US>b)<SPAN style="FONT: 7pt 'Times New Roman'"><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT></SPAN></SPAN><SPAN lang=EN-US>Parent.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l0 level2 lfo1; tab-stops: list 42.0pt"><FONT face="Times New Roman"><SPAN lang=EN-US>c)<SPAN style="FONT: 7pt 'Times New Roman'"><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT></SPAN></SPAN><SPAN lang=EN-US>List.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l0 level2 lfo1; tab-stops: list 42.0pt"><FONT face="Times New Roman"><SPAN lang=EN-US>d)<SPAN style="FONT: 7pt 'Times New Roman'"><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT></SPAN></SPAN><SPAN lang=EN-US>Tree</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l0 level2 lfo1; tab-stops: list 42.0pt"><FONT face="Times New Roman"><SPAN lang=EN-US>e)<SPAN style="FONT: 7pt 'Times New Roman'"><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT></SPAN></SPAN><SPAN lang=EN-US>Table</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l0 level2 lfo1; tab-stops: list 42.0pt"><FONT face="Times New Roman"><SPAN lang=EN-US>f)<SPAN style="FONT: 7pt 'Times New Roman'"><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT></SPAN></SPAN><SPAN lang=EN-US>Tree With Columns.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><FONT face="Times New Roman"><SPAN lang=EN-US>2.<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>Outline</SPAN></FONT><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 style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Properties,</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">会根据选择不同的对象而改变显示的内容。</SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体">关于</SPAN><SPAN lang=EN-US>Jface</SPAN><SPAN style="FONT-FAMILY: 宋体">部分的工作模式我在《</SPAN><SPAN lang=EN-US>Table View </SPAN><SPAN style="FONT-FAMILY: 宋体">的合作类的模式》一文中有提到，不过需要说明的是，在</SPAN><SPAN lang=EN-US>Jface</SPAN><SPAN style="FONT-FAMILY: 宋体">中的</SPAN><SPAN lang=EN-US>Viewer</SPAN><SPAN style="FONT-FAMILY: 宋体">他们的</SPAN><SPAN lang=EN-US>ContentProvider</SPAN><SPAN style="FONT-FAMILY: 宋体">可能不一样的。</SPAN></P>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">要完成这部分的功能</SPAN><SPAN lang=EN-US>emf</SPAN><SPAN style="FONT-FAMILY: 宋体">的产生代码中分别放到了两个插件里实现了他们分别是</SPAN><SPAN lang=EN-US>edit</SPAN><SPAN style="FONT-FAMILY: 宋体">和</SPAN><SPAN lang=EN-US>editor</SPAN><SPAN style="FONT-FAMILY: 宋体">。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>Edit</SPAN><SPAN style="FONT-FAMILY: 宋体">提供了</SPAN><SPAN lang=EN-US>Item </SPAN><SPAN style="FONT-FAMILY: 宋体">的</SPAN><SPAN lang=EN-US>Provider</SPAN><SPAN style="FONT-FAMILY: 宋体">，他存在的意义就在于把逻辑对象和</SPAN><SPAN lang=EN-US>UI</SPAN><SPAN style="FONT-FAMILY: 宋体">分割开。而</SPAN><SPAN lang=EN-US>Editor</SPAN><SPAN style="FONT-FAMILY: 宋体">通过使用</SPAN><SPAN lang=EN-US>edit</SPAN><SPAN style="FONT-FAMILY: 宋体">提供的</SPAN><SPAN lang=EN-US>Provider</SPAN><SPAN style="FONT-FAMILY: 宋体">实现了一个编辑器的</SPAN><SPAN lang=EN-US>UI</SPAN><SPAN style="FONT-FAMILY: 宋体">和</SPAN><SPAN lang=EN-US>Command</SPAN><SPAN style="FONT-FAMILY: 宋体">部分，他是正真的用户界面部分。</SPAN></P>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">下面我们就先来看看</SPAN><SPAN lang=EN-US>edit</SPAN><SPAN style="FONT-FAMILY: 宋体">中的类。</SPAN></P>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">好了，首先</SPAN><SPAN lang=EN-US>edit</SPAN><SPAN style="FONT-FAMILY: 宋体">中使用的是</SPAN><SPAN lang=EN-US>adapt</SPAN><SPAN style="FONT-FAMILY: 宋体">模型。所以</SPAN><SPAN lang=EN-US>edit</SPAN><SPAN style="FONT-FAMILY: 宋体">中的插件对象会实现所有的</SPAN><SPAN lang=EN-US>viewer,Properties</SPAN><SPAN style="FONT-FAMILY: 宋体">所需要的接口。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>Emf</SPAN><SPAN style="FONT-FAMILY: 宋体">为我们实现通用的接口。所以这绝对是一个学习的好机会。</SPAN></P>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">废话不多说了，来看代码把。</SPAN></P>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">首先看声明：</SPAN></P>
<DIV style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><SPAN style="COLOR: rgb(0,0,255)">public</SPAN><SPAN style="COLOR: rgb(0,0,0)">&nbsp;</SPAN><SPAN style="COLOR: rgb(0,0,255)">class</SPAN><SPAN style="COLOR: rgb(0,0,0)">&nbsp;FamilyItemProvider<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: rgb(0,0,255)">extends</SPAN><SPAN style="COLOR: rgb(0,0,0)">&nbsp;ItemProviderAdapter<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: rgb(0,0,255)">implements</SPAN><SPAN style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IEditingDomainItemProvider,&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IStructuredItemContentProvider,&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ITreeItemContentProvider,&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IItemLabelProvider,&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IItemPropertySource&nbsp;{<BR></SPAN></DIV><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">他的继承关系可以用下图来表示：<BR><IMG height=97 alt=providerh.gif src="http://www.blogjava.net/images/blogjava_net/jetgeng/Eclipse/EMF/providerh.gif" width=295 border=0><BR></SPAN>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">他们之间的职能以及实现的接口可用下图来描述：</SPAN></P><IMG height=471 alt=itemprivdelayer.gif src="http://www.blogjava.net/images/blogjava_net/jetgeng/Eclipse/EMF/itemprivdelayer.gif" width=837 border=0><BR><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">AdapterImpl</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">是为了实现</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Adapter</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">模式而设定.<BR></SPAN>
<P class=MsoNormal><SPAN lang=EN-US>ItemProviderAdapter</SPAN><SPAN style="FONT-FAMILY: 宋体">完成一些基本功能。下面就分别从不同的接口来说明</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo2; tab-stops: list 21.0pt"><SPAN lang=EN-US>1.<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>ResourceLocator:</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: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo2; tab-stops: list 21.0pt"><SPAN lang=EN-US>2.<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>IDisposable </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></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo2; tab-stops: list 21.0pt"><SPAN lang=EN-US>3.<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>IChangeNotifier </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为"</SPAN><SPAN lang=EN-US>Notification and Adapters"</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: 21pt; TEXT-INDENT: -21pt"><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">CreateChildCommand.Helper</SPAN></P>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋体">最下面的</SPAN><SPAN lang=EN-US>EMF</SPAN><SPAN style="FONT-FAMILY: 宋体">根据我们的模型产生的</SPAN><SPAN lang=EN-US>Provider</SPAN><SPAN style="FONT-FAMILY: 宋体">的了。他实现了</SPAN><SPAN lang=EN-US>5</SPAN><SPAN style="FONT-FAMILY: 宋体">个接口。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l2 level1 lfo3; tab-stops: list 21.0pt"><SPAN lang=EN-US>1.<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>IEditingDomainItemProvider</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这部分我还清楚，怀疑和</SPAN><SPAN lang=EN-US>command</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: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l2 level1 lfo3; tab-stops: list 21.0pt"><SPAN lang=EN-US>2.<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>IStructuredItemContentProvider</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">该接口为</SPAN><SPAN lang=EN-US>TableViewer,ListViewer,TreeViewer</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: 0cm 0cm 0pt 21pt"><SPAN lang=EN-US>This is the interface needed to populate<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>the top level items in a TreeViewer,<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>the items of a ListViewer,<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>or the rows of a TableViewer. </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l2 level1 lfo3; tab-stops: list 21.0pt"><SPAN lang=EN-US>3.<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>ITreeItemContentProvider</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><SPAN lang=EN-US>This is the interface needed to populate subtrees in a TreeViewer</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l2 level1 lfo3; tab-stops: list 21.0pt"><SPAN lang=EN-US>4.<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>IItemLabelProvider</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><SPAN lang=EN-US>This is the interface implemented to provide a label text and even a label icon for an item;</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><SPAN lang=EN-US>it receives delegated calls from ILabelProvider.</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l2 level1 lfo3; tab-stops: list 21.0pt"><SPAN lang=EN-US>5.<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>IItemPropertySource</SPAN></P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This is the interface is needed to populate property sheet items</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">it is the same as IpropertySource</SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">except that the object is&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;passed as the first parameter for each method.</SPAN>
<P class=MsoNormal><SPAN lang=EN-US>这一篇还只是edit部分刚开一个头。</SPAN></P>
<P class=MsoNormal>下一期会介绍一下他的command部分。<BR></P><img src ="http://www.blogjava.net/JetGeng/aggbug/25363.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JetGeng/" target="_blank">Jet Geng</a> 2005-12-25 13:36 <a href="http://www.blogjava.net/JetGeng/archive/2005/12/25/25363.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EMF 生成的Model Code阅读笔记(一)</title><link>http://www.blogjava.net/JetGeng/archive/2005/12/18/24474.html</link><dc:creator>Jet Geng</dc:creator><author>Jet Geng</author><pubDate>Sun, 18 Dec 2005 05:12:00 GMT</pubDate><guid>http://www.blogjava.net/JetGeng/archive/2005/12/18/24474.html</guid><wfw:comment>http://www.blogjava.net/JetGeng/comments/24474.html</wfw:comment><comments>http://www.blogjava.net/JetGeng/archive/2005/12/18/24474.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/JetGeng/comments/commentRss/24474.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JetGeng/services/trackbacks/24474.html</trackback:ping><description><![CDATA[<p class="MsoNormal"><span style="font-family: 宋体;">在八进制的中讲述了从模型到应用程序的生成过程。我通过类似的方法生成了一个应用程序。</span></p>


<p class="MsoNormal"><span style="font-family: 宋体;">代码生成后，我就想看看</span><span lang="EN-US">EMF</span><span style="font-family: 宋体;">为我生成了什么样的代码。我如果需要修改的话该如何修改。</span></p>


<span style="font-size: 10.5pt; font-family: 宋体;">我的“</span><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">Hellow world</span><span style="font-size: 10.5pt; font-family: 宋体;">”是采用的“</span><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">Using EMF</span><span style="font-size: 10.5pt; font-family: 宋体;">”文中的模型。<br>
<img src="http://www.blogjava.net/images/blogjava_net/jetgeng/Eclipse/EMF/familytree.JPG" alt="familytree.JPG" border="0" height="291" width="515"><br>
</span><span style="font-size: 10.5pt; font-family: 宋体;">根据这个模型建立了一个</span><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">EMF Model</span><span style="font-size: 10.5pt; font-family: 宋体;">：<br>
<img src="http://www.blogjava.net/images/blogjava_net/jetgeng/Eclipse/EMF/family%20model.gif" alt="family model.gif" border="0" height="216" width="281"><br>
</span><span style="font-size: 10.5pt; font-family: 宋体;">根据这个模型生成</span><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">model class</span><span style="font-size: 10.5pt; font-family: 宋体;">的结构如下图所示：<br>
<img src="http://www.blogjava.net/images/blogjava_net/jetgeng/Eclipse/EMF/class%20code.gif" alt="class code.gif" border="0" height="321" width="231"><br>
</span>

<p class="MsoNormal"><span style="font-family: 宋体;">从图中我们可以看到有三个包：</span></p>


<p class="MsoNormal"><span style="font-family: 宋体;">他们分别是：</span><span lang="EN-US">family,family.impl</span><span style="font-family: 宋体;">和</span><span lang="EN-US">family.util</span><span style="font-family: 宋体;">。</span></p>


<p class="MsoNormal"><span lang="EN-US">family</span><span style="font-family: 宋体;">和</span><span lang="EN-US">family.impl</span><span style="font-family: 宋体;">包之间的差别就是一个是</span><span lang="EN-US">Interface</span><span style="font-family: 宋体;">，另外一个是这些</span><span lang="EN-US">Interface</span><span style="font-family: 宋体;">的实现。</span></p>


<p class="MsoNormal"><span style="font-family: 宋体;">我们先来看看我们模型中出现过的类：</span></p>


<p class="MsoNormal"><span lang="EN-US">Family,FamilyTree,Female,Male</span><span style="font-family: 宋体;">以及</span><span lang="EN-US">Individual</span><span style="font-family: 宋体;">。</span></p>


<span style="font-size: 10.5pt; font-family: 宋体;">由于我是采用</span><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">Annotated Java</span><span style="font-size: 10.5pt; font-family: 宋体;">的方式生成的模型。所以在</span><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">family</span><span style="font-size: 10.5pt; font-family: 宋体;">包中的代码并没有太多的变化。<br>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Return&nbsp;the&nbsp;father<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: rgb(128, 128, 128);">@return</span><span style="color: rgb(0, 128, 0);">&nbsp;the&nbsp;father<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@model<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br>&nbsp;&nbsp;&nbsp;&nbsp;Male&nbsp;getFather();<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;value&nbsp;of&nbsp;the&nbsp;'{</span><span style="color: rgb(128, 128, 128);">@link</span><span style="color: rgb(0, 128, 0);">&nbsp;com.jet.swt.emf.family.Family#getFather&nbsp;&lt;em&gt;Father&lt;/em&gt;}'&nbsp;reference.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;!--&nbsp;begin-user-doc&nbsp;--&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;!--&nbsp;end-user-doc&nbsp;--&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: rgb(128, 128, 128);">@param</span><span style="color: rgb(0, 128, 0);">&nbsp;value&nbsp;the&nbsp;new&nbsp;value&nbsp;of&nbsp;the&nbsp;'&lt;em&gt;Father&lt;/em&gt;'&nbsp;reference.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: rgb(128, 128, 128);">@see</span><span style="color: rgb(0, 128, 0);">&nbsp;#getFather()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@generated<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;setFather(Male&nbsp;value);</span></div><br>
</span>

<p class="MsoNormal"><span style="font-family: 宋体;">他只是为我提供了</span><span lang="EN-US">Set</span><span style="font-family: 宋体;">方法。接口的继承也没有做修改。但是他对应的实现类就有了很多变化。</span></p>



<p class="MsoNormal"><span style="font-family: 宋体;">首先从类的申明来看：</span></p>

<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;FamilyImpl&nbsp;</span><span style="color: rgb(0, 0, 255);">extends</span><span style="color: rgb(0, 0, 0);">&nbsp;EDataObjectImpl&nbsp;</span><span style="color: rgb(0, 0, 255);">implements</span><span style="color: rgb(0, 0, 0);">&nbsp;Family&nbsp;{</span></div><span style="font-size: 10.5pt; font-family: 宋体;">我们可以看到我们的</span><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">FamilyImpl</span><span style="font-size: 10.5pt; font-family: 宋体;">是从</span><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">EdataObjectImpl</span><span style="font-size: 10.5pt; font-family: 宋体;">类继承而来。处于好奇我有在</span><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">Hiberarchy</span><span style="font-size: 10.5pt; font-family: 宋体;">中打开他的继承关系看了一下。<img src="http://www.blogjava.net/images/blogjava_net/jetgeng/Eclipse/EMF/hiberarchy.gif" alt="hiberarchy.gif" border="0" height="117" width="248"><br>
</span>

<p class="MsoNormal"><span style="font-family: 宋体;">这里有一张图可以清晰的说明这个继承关系的职能。</span></p>

<img src="http://www.blogjava.net/images/blogjava_net/jetgeng/Eclipse/EMF/hiberachyfunction.gif" alt="hiberachyfunction.gif" border="0" height="540" width="1007"><br>

<span style="font-size: 10.5pt; font-family: 宋体;"><img src="/JetGeng/admin/FtbWebResource.axd?a=FreeTextBox%2c+Version%3d3.1.1.34886%2c+Culture%3dneutral%2c+PublicKeyToken%3d5962a4e684a48b87&amp;r=FreeTextBoxControls.Resources.Images.Utility.spacer.gif&amp;t=632699064217187500" height="1" width="1">我例子中的Business Layer是FamilyImpl类。<br>
</span>

<p class="MsoNormal"><span style="font-family: 宋体;">这样我们的就可以不写一行代码就可以使我们的对象具有</span><span lang="EN-US">Notification/Common</span><span style="font-family: 宋体;">的功能（关于</span><span lang="EN-US">Notification</span><span style="font-family: 宋体;">和</span><span lang="EN-US">Common</span><span style="font-family: 宋体;">的功能到底是怎样的，我会在后续的学习笔记中记下来。呵呵，是不是很爽啊）。另外在《</span><b><span lang="EN-US">Eclipse Modeling Framework: A Developer's Guide</span></b><span style="font-family: 宋体;">》一书的第二章也有提到这部分的内容</span><span lang="EN-US">,</span><span style="font-family: 宋体;">不过由于他讲解的</span><span lang="EN-US">EMF</span><span style="font-family: 宋体;">的版本比较老和我现在使用的版本有点出入，不过基本的功能还是讲到了。</span></p>

<span style="font-size: 10.5pt; font-family: 宋体;">好了，看完申明我们就来继续往下看吧。<br>
</span>

<p class="MsoNormal"><span style="font-family: 宋体;">在</span><span lang="EN-US">Family</span><span style="font-family: 宋体;">下面有三个属性，</span><span lang="EN-US">father,mother</span><span style="font-family: 宋体;">和</span><span lang="EN-US">children</span><span style="font-family: 宋体;">。</span></p>


<p class="MsoNormal"><span lang="EN-US">EMF</span><span style="font-family: 宋体;">给我们生成的对应的代码为：</span></p><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);"></span></div><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">protected</span><span style="color: rgb(0, 0, 0);">&nbsp;Male&nbsp;father&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;cached&nbsp;value&nbsp;of&nbsp;the&nbsp;'{</span><span style="color: rgb(128, 128, 128);">@link</span><span style="color: rgb(0, 128, 0);">&nbsp;#getMother()&nbsp;&lt;em&gt;Mother&lt;/em&gt;}'&nbsp;reference.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;!--&nbsp;begin-user-doc&nbsp;--&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;!--&nbsp;end-user-doc&nbsp;--&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: rgb(128, 128, 128);">@see</span><span style="color: rgb(0, 128, 0);">&nbsp;#getMother()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@generated<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@ordered<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">protected</span><span style="color: rgb(0, 0, 0);">&nbsp;Female&nbsp;mother&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;cached&nbsp;value&nbsp;of&nbsp;the&nbsp;'{</span><span style="color: rgb(128, 128, 128);">@link</span><span style="color: rgb(0, 128, 0);">&nbsp;#getChildren()&nbsp;&lt;em&gt;Children&lt;/em&gt;}'&nbsp;containment&nbsp;reference&nbsp;list.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;!--&nbsp;begin-user-doc&nbsp;--&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;!--&nbsp;end-user-doc&nbsp;--&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: rgb(128, 128, 128);">@see</span><span style="color: rgb(0, 128, 0);">&nbsp;#getChildren()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@generated<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@ordered<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">protected</span><span style="color: rgb(0, 0, 0);">&nbsp;EList&nbsp;children&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;</span></div>

<p class="MsoNormal"><span style="font-family: 宋体;">以及一些</span><span lang="EN-US">get</span><span style="font-family: 宋体;">和</span><span lang="EN-US">set</span><span style="font-family: 宋体;">方法。</span></p>


<p class="MsoNormal"><span style="font-family: 宋体;">对于</span><span lang="EN-US">set</span><span style="font-family: 宋体;">方法中除了基本的赋值以外还加上了向所有对这次变动感兴趣观察者发送一个变更消息：<br>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;setFather(Male&nbsp;newFather)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Male&nbsp;oldFather&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;father;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;father&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;newFather;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(eNotificationRequired())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eNotify(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;ENotificationImpl(</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">,&nbsp;Notification.SET,&nbsp;FamilyPackage.FAMILY__FATHER,&nbsp;oldFather,&nbsp;father));<br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div></span>

</p>
<p class="MsoNormal"><span style="font-family: 宋体;">对于</span><span lang="EN-US">get</span><span style="font-family: 宋体;">方法要分基本类型还是对象这两种类型来处理。</span></p>


<p class="MsoNormal"><span style="font-family: 宋体;">如果是基本类型，直接返回就好了。</span></p>


<p class="MsoNormal"><span style="font-family: 宋体;">如：</span></p>

<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;getName()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;name;<br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div><span style="font-size: 10.5pt; font-family: 宋体;">如果是对象的话就有点麻烦了。先要判断该对象是否使用了代理（这一部分我还不是太清楚）如果是的话就获得他的代理对象，并判断获得代理对象是否和当前对象是否相等，如果不等就发送一个变更消息。最终返回对象（肯能是一个代理对象）。<br>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;Male&nbsp;getFather()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(father&nbsp;</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;((EObject)father).eIsProxy())&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Male&nbsp;oldFather&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;father;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;father&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;(Male)eResolveProxy((InternalEObject)father);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(father&nbsp;</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);">&nbsp;oldFather)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(eNotificationRequired())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eNotify(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;ENotificationImpl(</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">,&nbsp;Notification.RESOLVE,&nbsp;FamilyPackage.FAMILY__FATHER,&nbsp;oldFather,&nbsp;father));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;father;<br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div><br>
还有其他类将在下一篇记下。<br>
<br>
</span>

<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US">1、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp; </span></span><!--[endif]--><span lang="EN-US"><a href="http://www.eclipse.org/articles/Article-Using%20EMF/using-emf.html">Using
EMF,<span style="">&nbsp; </span>Author :Catherine Griffin</a></span></p>


<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US">2、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp; </span></span><!--[endif]--><span lang="EN-US"><span style="">&nbsp;</span><a href="http://bjzhanghao.cnblogs.com/archive/2005/11/13/275054.html">EMF<span style="font-family: 宋体;">介绍系列（二、从模型生成应用程序）</span></a> Author:</span><span style="font-family: 宋体;">八进制</span></p>


<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US">3、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp; </span></span><!--[endif]--><span lang="EN-US">Mastering Eclipse Modeling Framework</span><span style="font-family: 宋体;">，</span><span lang="EN-US">Author:Vladimir Bacvanski(<a href="mailto:Vladimir@inferdata.com">Vladimir@inferdata.com</a>)
Petter Graff(<a href="mailto:petter@inferdata.com">petter@inferdata.com</a>)</span></p>


<b><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">Eclipse
Modeling Framework: A Developer's Guide Author:</span></b><span style="font-size: 10.5pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US"><a href="http://www.informit.com/safari/author_bio.asp@ISBN=0131425420" target="_new">Frank&nbsp;Budinsky</a>, <a href="http://www.informit.com/safari/author_bio.asp@ISBN=0131425420" target="_new">David&nbsp;Steinberg</a>, <a href="http://www.informit.com/safari/author_bio.asp@ISBN=0131425420" target="_new">Ed&nbsp;Merks</a>, <a href="http://www.informit.com/safari/author_bio.asp@ISBN=0131425420" target="_new">Raymond&nbsp;Ellersick</a>, <a href="http://www.informit.com/safari/author_bio.asp@ISBN=0131425420" target="_new">Timothy&nbsp;J.&nbsp;Grose</a></span><br>



<img src ="http://www.blogjava.net/JetGeng/aggbug/24474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JetGeng/" target="_blank">Jet Geng</a> 2005-12-18 13:12 <a href="http://www.blogjava.net/JetGeng/archive/2005/12/18/24474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EMF 开篇</title><link>http://www.blogjava.net/JetGeng/archive/2005/12/18/24456.html</link><dc:creator>Jet Geng</dc:creator><author>Jet Geng</author><pubDate>Sun, 18 Dec 2005 02:41:00 GMT</pubDate><guid>http://www.blogjava.net/JetGeng/archive/2005/12/18/24456.html</guid><wfw:comment>http://www.blogjava.net/JetGeng/comments/24456.html</wfw:comment><comments>http://www.blogjava.net/JetGeng/archive/2005/12/18/24456.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JetGeng/comments/commentRss/24456.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JetGeng/services/trackbacks/24456.html</trackback:ping><description><![CDATA[在中国Eclipse社区中，看到了很多关于EMF的帖子。会来写了一个“Hellow world”样的东西果然很爽。想近一步学习一下。并想把学习的过程通过这个Blog记录下来。<br>
在这里先感谢一下八进制。从他的blog中学到不少东西。<br>
<a id="Header1_HeaderTitle" class="HeaderMainTitle" href="http://bjzhanghao.cnblogs.com/"><br>
</a><img src ="http://www.blogjava.net/JetGeng/aggbug/24456.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JetGeng/" target="_blank">Jet Geng</a> 2005-12-18 10:41 <a href="http://www.blogjava.net/JetGeng/archive/2005/12/18/24456.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>