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
” 外的代码全部被替换成了。这样就起到了过滤的效果。