邋遢居

我的Java天堂

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  61 Posts :: 2 Stories :: 90 Comments :: 0 Trackbacks

Jmerger 使用初步 ( )

前面一篇提到了他基本的概念和能完成的功能。在这一篇里我们来看看他的使用条件和使用方法。

使用条件:应为

org.eclipse.jdt.core (提供基本的语法分析)

org.eclipse.core.runtime (提供基本的 URI 等)

org.eclipse.ui (提供进度条,我就看到了这个。其他可能还有)。

看到他要使用这么多 Eclipse 的东西。我彻底的打消了在 Eclipse 外使用他的打算(如果谁有好的解决方案记得给我发一份。在下感激不尽)。


我们下面就来看看如何定制他的合并规则是如何定义的吧。我先做法是找了一个例子。看看他是如何工作的。


我的 Merge.xml 如下:

清单 2

<? xml version = "1.0" encoding = "UTF-8" ?>

< merge:options xmlns:merge = "http://www.eclipse.org/org/eclipse/emf/codegen/jmerge/Options" >


< merge:dictionaryPattern

name = "generatedMember"

select = "Member/getComment"

match = "\s*@\s*(gen)erated\s*\n" />

<!-- if target is generated, transfer -->

<!-- change to sourceMarkup if the source is the standard -->

< merge:pull

targetMarkup = "^gen$"

sourceGet = "Method/getBody"

targetPut = "Method/setBody" />


</ merge:options >


运行前的 Source Java Source A 分源代码为

/**

* Source javadoc 13

* <!-- begin-user-doc -->

* Source user javadoc 14

* <!-- end-user-doc -->

* Source javadoc 15

* @return source

* @generated

*/

public boolean isID()

{

// begin-user-code

System.out.println("Source user code 1");

// end-user-code

System.out.println("Source code 2");

return id == "source";

}








运行前 Target(Java Source B) 部分的源代码为:

/**
* Source javadoc 13
* <!-- begin-user-doc -->
* Target user javadoc 16
* Target user javadoc 17
* <!-- end-user-doc -->
* Source javadoc 15
* @return source
* @generated
*/
public boolean isID()
{
//This is my owner code
System.out.print("Will be replace");
// begin-user-code
System.out.println("Target user code 2");
// end-user-code
System.out.println("Source code 2");
return id == "source";
}


/**
* Target javadoc 19
* <!-- begin-user-doc -->
* Target user javadoc 20
* Target user javadoc 21
* <!-- end-user-doc -->
* Target javadoc 22
* @param target
* @generated NOT
*/
public void setID(boolean value)
{
//This Jet Code
System.out.println("Not be replaced!");
id = value ? "target" : "source";
System.out.println("Target code 4");
}

注意: isID 方法 注释里有” @generated” 这一行。而 setID 方法的注释中是 @generated NOT


运行后的结果是( Result of merge )为

/**
* Source javadoc 13
* <!-- begin-user-doc -->
* Target user javadoc 16
* Target user javadoc 17
* <!-- end-user-doc -->
* Source javadoc 15
* @return source
* @generated
*/
public boolean isID()

{

// begin-user-code

System.out.println("Source user code 1");

// end-user-code

System.out.println("Source code 2");

return id == "source";

}

// 使用了 Source 部分的代码。

/**
* Target javadoc 19
* <!-- begin-user-doc -->
* Target user javadoc 20
* Target user javadoc 21
* <!-- end-user-doc -->
* Target javadoc 22
* @param target
* @generated NOT
*/
public void setID(boolean value)
{
//This Jet Code
System.out.println("Not be replaced!");
id = value ? "target" : "source";
System.out.println("Target code 4");
}

// 维持原来 Target 中的代码没有变化。

这样我们就不难看出

< merge:dictionaryPattern ……/> 是定义了一个匹配模式。具体的这个匹配模式要做的动作就是在

< merge:pull

targetMarkup = "^gen$"

sourceGet = "Method/getBody"

targetPut = "Method/setBody" />

段中定义了。猜想他只是把 Source 部分的内容直接输出到 Target 那里去了。

如果我们觉得需要做点什么过滤。比如说想保留 Target 中一个特定的内容。这一个我们可以通过 merge:pull sourceTransfer 属性来设置。


现在来看一个例子:

merge:pull 节点修改成

< merge:pull

targetMarkup = "^gen$"

sourceTransfer = "(\s*//\s*begin-user-code.*?//\s*end-user-code\s*)\n"

sourceGet = "Method/getBody"

targetPut = "Method/setBody" />

注意:添加了一个 sourceTransfer, 他的值 值是一个正则表达式。匹配的是被

// begin-user-code” 和“ // end-user-code” 包围住的所有的字符。

Target 的代码为我们现在只是关注 isID 方法


/**
* Source javadoc 13
* <!-- begin-user-doc -->
* Target user javadoc 16
* Target user javadoc 17
* <!-- end-user-doc -->
* Source javadoc 15
* @return source
* @generated
*/
public boolean isID()

{

// begin-user-code

System.out.println("Source user code 1");
System.out.println("This will not be replaced!");

// end-user-code
System.out.print("this will be replaced!");

System.out.println("Source code 2");

return id == "source";

}


请注意看一下红色部分的两行代码。

合并后的代码为:

/**
* Source javadoc 13
* <!-- begin-user-doc -->
* Target user javadoc 16
* Target user javadoc 17
* <!-- end-user-doc -->
* Source javadoc 15
* @return source
* @generated
*/
public boolean isID()

{

// begin-user-code

System.out.println("Source user code 1");
System.out.println("This will not be replaced!");

// end-user-code
System.out.println("Source code 2");

return id == "source";

}


在“ // begin-user-code 和“ // end-user-code 外的代码全部被替换成了。这样就起到了过滤的效果。

posted on 2006-05-02 11:34 Jet Geng 阅读(1989) 评论(1)  编辑  收藏 所属分类: EclipseEMF

Feedback

# re: Jmerge的使用初步(二) 2007-11-13 11:24 help
你好:

我在merge.xml中加入
sourceTransfer = "(\s*//\s*begin-user-code.*?//\s*end-user-code\s*)\n"
后,方法就不会覆盖生成了,我不知道为什么。
能帮帮忙吗?


  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: