Jmerger
使用初步
(
二
)
前面一篇提到了他基本的概念和能完成的功能。在這一篇里我們來看看他的使用條件和使用方法。
使用條件:應為
org.eclipse.jdt.core
(提供基本的語法分析)
org.eclipse.core.runtime
(提供基本的
URI
等)
org.eclipse.ui
(提供進度條,我就看到了這個。其他可能還有)。
看到他要使用這么多
Eclipse
的東西。我徹底的打消了在
Eclipse
外使用他的打算(如果誰有好的解決方案記得給我發(fā)一份。在下感激不盡)。
我們下面就來看看如何定制他的合并規(guī)則是如何定義的吧。我先做法是找了一個例子。看看他是如何工作的。
我的
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
屬性來設置。
現(xiàn)在來看一個例子:
把
merge:pull
節(jié)點修改成
<
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
的代碼為(我們現(xià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";
}
請注意看一下紅色部分的兩行代碼。
合并后的代碼為:
/**
* 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
”
外的代碼全部被替換成了。這樣就起到了過濾的效果。