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