Jmerger
使用初步
(
二
)
前面一篇提到了他基本的概念和能完成的功能。在這一篇里我們來看看他的使用條件和使用方法。
使用條件:應(yīng)為
org.eclipse.jdt.core
(提供基本的語(yǔ)法分析)
org.eclipse.core.runtime
(提供基本的
URI
等)
org.eclipse.ui
(提供進(jìn)度條,我就看到了這個(gè)。其他可能還有)。
看到他要使用這么多
Eclipse
的東西。我徹底的打消了在
Eclipse
外使用他的打算(如果誰(shuí)有好的解決方案記得給我發(fā)一份。在下感激不盡)。
我們下面就來看看如何定制他的合并規(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");
}
//
維持原來
Target
中的代碼沒有變化。
這樣我們就不難看出
<
merge:dictionaryPattern
……/>
段
是定義了一個(gè)匹配模式。具體的這個(gè)匹配模式要做的動(dòng)作就是在
<
merge:pull
targetMarkup = "^gen$"
sourceGet = "Method/getBody"
targetPut = "Method/setBody" />
段中定義了。猜想他只是把 Source 部分的內(nèi)容直接輸出到 Target 那里去了。
如果我們覺得需要做點(diǎn)什么過濾。比如說想保留
Target
中一個(gè)特定的內(nèi)容。這一個(gè)我們可以通過
merge:pull
中
sourceTransfer
屬性來設(shè)置。
現(xiàn)在來看一個(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
”
外的代碼全部被替換成了。這樣就起到了過濾的效果。