Jmerger
使用初步
(
二
)
前面一篇提到了他基本的概念和能完成的功能。在這一篇里我們來(lái)看看他的使用條件和使用方法。
使用條件:應(yīng)為
org.eclipse.jdt.core
(提供基本的語(yǔ)法分析)
org.eclipse.core.runtime
(提供基本的
URI
等)
org.eclipse.ui
(提供進(jìn)度條,我就看到了這個(gè)。其他可能還有)。
看到他要使用這么多
Eclipse
的東西。我徹底的打消了在
Eclipse
外使用他的打算(如果誰(shuí)有好的解決方案記得給我發(fā)一份。在下感激不盡)。
我們下面就來(lái)看看如何定制他的合并規(guī)則是如何定義的吧。我先做法是找了一個(gè)例子。看看他是如何工作的。
我的
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
>
運(yùn)行前的
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";
}
運(yùn)行前
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
。
運(yùn)行后的結(jié)果是(
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");
}
//
維持原來(lái)
Target
中的代碼沒(méi)有變化。
這樣我們就不難看出
<
merge:dictionaryPattern
……/>
段
是定義了一個(gè)匹配模式。具體的這個(gè)匹配模式要做的動(dòng)作就是在
<
merge:pull
targetMarkup
=
"^gen$"
sourceGet
=
"Method/getBody"
targetPut
=
"Method/setBody"
/>
段中定義了。猜想他只是把
Source
部分的內(nèi)容直接輸出到
Target
那里去了。
如果我們覺(jué)得需要做點(diǎn)什么過(guò)濾。比如說(shuō)想保留
Target
中一個(gè)特定的內(nèi)容。這一個(gè)我們可以通過(guò)
merge:pull
中
sourceTransfer
屬性來(lái)設(shè)置。
現(xiàn)在來(lái)看一個(gè)例子:
把
merge:pull
節(jié)點(diǎn)修改成
<
merge:pull
targetMarkup
=
"^gen$"
sourceTransfer
=
"(\s*//\s*begin-user-code.*?//\s*end-user-code\s*)\n"
sourceGet
=
"Method/getBody"
targetPut
=
"Method/setBody"
/>
注意:添加了一個(gè)
sourceTransfer,
他的值
值是一個(gè)正則表達(dá)式。匹配的是被
“//
begin-user-code”
和“
//
end-user-code”
包圍住的所有的字符。
Target
的代碼為(我們現(xiàn)在只是關(guān)注
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";
}
請(qǐng)注意看一下紅色部分的兩行代碼。
合并后的代碼為:
/**
* 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
”
外的代碼全部被替換成了。這樣就起到了過(guò)濾的效果。