锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鍦ㄦ垜浠垱寤洪鍩熸ā鍨嬪墠錛屾垜浠湁蹇呰浜嗚В涓涓嬫垜浠殑妯″瀷鐢ㄦ潵琛ㄨ揪浠涔堝唴瀹廣?鎵浠ユ垜灝卞厛瑙i噴涓涓嬪湪榪欎釜緋誨垪鏂囩珷涓瀹炵幇搴旂敤銆?鍋囪Eclipse緇勭粐閭璇蜂綘緙栧啓涓涓浠栦滑綆$悊璐$尞鑰呭拰欏圭洰鐨勫簲鐢ㄧ▼搴忋?
鎴戜滑闇瑕佸垱寤轟竴涓ā鍨嬫潵琛ㄨ揪瀹㈡埛鎻愪緵鐨勪俊鎭備粬浠湁鍙兘濡備笅鍥俱? 璁╂垜浠繘涓姝ョ殑鐪嬬湅榪欎釜妯″瀷銆? fundation鏄繖涓ā鍨嬬殑鏍癸紝浠栨嫢鏈変袱涓垪琛ㄥ睘鎬с? Eclipse欏圭洰鎷ユ湁寰堝灞炴э紝姣斿欏圭洰寮濮嬪拰緇撴潫鏃墮棿銆侀」鐩殑涓婚〉鐨剈rl絳夌瓑銆備笅闈㈠垪鍑烘垜浠渶鎰熷叴瓚g殑銆? 褰撲竴涓敤鎴鋒垚涓轟竴涓」鐩殑璐$尞鑰咃紙Committer錛夋椂錛岃繖灝卞緩绔嬩簡涓涓猚ommittership銆備粬鎷ユ湁涓涓紑濮嬫椂闂村拰緇撴潫鏃墮棿銆傚彟澶栨垜浠繕瑕佽褰曚笅涓嬮潰鐨勫睘鎬с?
璐$尞鑰呮垨欏圭洰棰嗗浜虹殑淇℃伅銆傛垜浠叧緋葷殑淇℃伅濡備笅錛? 涓嬮潰榪欏紶綾誨浘緇欏嚭浜嗗叧浜庝笂闈㈡ā鍨嬬殑鍏ㄨ矊銆? 姝e浣犳墍鐪嬪埌鐨勶紝鎴戞妸璁稿鍏崇郴璁炬垚浜嗗弻鍚戝叧緋匯?As you noticed I modeled many of the relations as
bidirectional relations.
榪欎釜騫朵笉鏄弗鏍艱姹傛墍鏈夊湴鏂歸兘瑕佽繖鏍鳳紝鍥犱負鏈夌殑鍦版柟鍙互閫氳繃eComtainer鏉ヨ幏鍙栦粬鐨勭埗浜層傚氨鍍弍roject-subproject涓鏍楓?
浣嗘槸鍖呭惈鍏崇郴錛坈ontainment
relationship錛夊湪浣跨敤databinding鐨勬儏鍐典笅灝變笉澶悎閫備簡銆傚洜涓轟粠瀛愬埌鐖朵翰鏃舵病鏈夊搴攆eature錛屽彧鑳介氳繃璋冪敤eContainer()鏂規硶鏉ヨ幏寰椼?
EMF鎻愪緵浜嗕竴涓紪杈戝櫒鏉ュ垱寤轟綘鐨凟core-Model騫舵妸瀹冧繚瀛樻垚XMI鏍煎紡銆傛垜浠彲浠ョ敤瀹冩潵鍒涘緩嫻嬭瘯鏁版嵁銆備笅鍥懼氨鏄竴涓緥瀛愩?/p>
鍦ㄥ涔燛MF-Databinding鐨勬椂鍊欏彂鐜頒簡Tom Schindl鐨勫崥瀹€備粬鐨勫崥瀹腑鏈変竴涓叧浜嶦MF
Databinding鐨勪笓棰樸傛劅瑙夊緢涓嶅銆傛兂灝濊瘯鐫緲昏瘧涓涓嬨?閭d箞Tom
Schindl鏄綍璁鎬漢涔燂紵浠栨槸JFace欏圭洰鐨勪竴涓狢ontributor錛屽湪2007騫?a target="_top">Eclipse
Zone
灝辨浘緇忛噰璁胯繃浠栥?鎵浠ョО浠栦負EMF Databinding鐨勪笓瀹朵竴鐐逛篃涓嶈繃鍒嗐? 鍘熸枃涓鴻礬寰勪負http://tomsondev.bestsolution.at/2009/06/06/galileo-improved-emf-databinding-support/
鎴戝緢楂樺叴鐨勫甯冨湪Eclipse-Galileo涓璄MF-2.5宸茬粡寮濮嬫敮鎸佹柊鐨凟clipse-Databinding API浜嗐傝崳瑾夊綊Matthew
Hall錛屼粬瀹℃煡鎴戠殑浠g爜錛屽府鎴戞暣鐞嗘敮鎾戦儴鍒嗗茍涓旀暣鐞嗘枃妗o紙璇︾粏鍐呭鍦?a target="_top">bug
262160
涓級 鍑犲懆鍓嶆垜鎴愪負浜咵MF欏圭洰鐨勬崘鐚咃紝鐜板湪鎴戣礋璐atabinding瀵笶MF鐨勬敮鎸佹ā鍧椼傛垜灝嗗敖鍔涗慨姝PI涓殑闂錛屽洖絳擭ewsgroup涓殑闂銆?
璇峰厑璁告垜鍦ㄤ粙緇嶈繖涓狝PI鐨勪紭鐐逛互鍙婂浣曚嬌鐢ㄥ畠涔嬪墠澹版槑涓鐐癸細榪欎釜API榪樺浜庤繃娓℃湡錛屼粬鍙兘浼氭湁涓浜涚粏寰殑鍙樺寲銆備笉榪囨垜浠皢浼氳緇嗚鏄庡彉鍖栫殑閮ㄥ垎銆? 鎴戝皢鐢ㄤ竴涓郴鍒楁枃绔犳潵灞曠幇榪欎釜鏂扮殑EMF-Databinding: 涓轟簡璁╀綘蹇熻繘鍏MF-Databinding涓紝鎴戝湪鍓嶅嚑澶╁仛浜嗕竴涓緥瀛愩? 鎵鏈変唬鐮侀兘鏄熀浜嶦PL鍗忚錛屼綘鍙互鍦ㄤ粠Eclipse-CVS
澶勮幏寰椼?
鐜板湪鍙槸鐪嬩簡
鍦ㄩ」鐩腑綆鍗曠殑浣跨敤浜嗕竴涓嬩粬浣滀負鏌ヨ鐨勫伐鍏楓傛劅瑙変粬鐪熺殑寰堜笉閿欙紝鍦ㄤ笅涓孌墊椂闂村皢浼氶噸鐐瑰幓浜嗚В浠栥?/p>
projects:
鍍廍MF,Techonlogy,Platform榪欐牱鐨勯《綰ч」鐩?
persons:
鍙傚姞涓涓垨澶氫釜欏圭洰鐨勪漢銆?
subprojects:
涓涓」鐩彲浠ユ嫢鏈夊涓瓙欏圭洰銆傚瓙欏圭洰鏈韓涔熷彲浠ユ嫢鏈夊涓瓙欏圭洰銆?
parent:
欏圭洰鏈変竴涓埗浜詫紙闄や簡欏剁駭欏圭洰澶栵級銆傝繖灝辨剰鍛崇潃欏圭洰鍜屽瓙欏圭洰錛坧roject-subproject錛夌殑鍏崇郴鏄竴涓弻鍚戠殑鍏崇郴銆?
projectleads
涓涓」鐩湁澶氫釜欏圭洰棰嗗浜恒?
committers
涓涓」鐩彲浠ユ嫢鏈夊涓礎鐚呫?
project:
鍜宑ommittership鐩稿叧鐨勯」鐩傞」鐩拰committership鏄竴涓弻鍚戠殑鍏崇郴銆?
person:
鍙傚姞欏圭洰鐨勪漢銆?
committerships:
鐢ㄤ簬淇濆瓨鍜屼漢鐩稿叧鐨勬墍鏈夌殑committerships.榪欒鏄庝漢鍜宑ommittership鏄竴涓弻鍚戝叧緋匯?
]]>
Note
2. 鍘熸枃
絎竴閮ㄥ垎錛?a target="_top">鍒涘緩棰嗗煙妯″瀷
絎簩閮ㄥ垎錛?a target="_top">浠嬬粛鏂扮殑Properties API
絎笁閮ㄥ垎錛?a target="_top">鐢‥MF-Databinding緇戝畾鍒癟reeViewer
絎洓閮ㄥ垎錛?a target="_top">鍦╩aster-detail妯″紡涓嬌鐢≒roperties API
絎簲閮ㄥ垎錛?a target="_top">鐢‥MF-Databinding緇戝畾鍒癟ableViewer
絎叚閮ㄥ垎錛歐rite your own Property for unsupport Widget-Types
絎竷閮ㄥ垎錛歁ake the storage system plugable
]]>
Jmerger
浣跨敤鍒濇
(
浜?/font>
)
鍓嶉潰涓綃囨彁鍒頒簡浠栧熀鏈殑姒傚康鍜岃兘瀹屾垚鐨勫姛鑳姐傚湪榪欎竴綃囬噷鎴戜滑鏉ョ湅鐪嬩粬鐨勪嬌鐢ㄦ潯浠跺拰浣跨敤鏂規硶銆?/font>
浣跨敤鏉′歡錛氬簲涓?/font>
org.eclipse.jdt.core
錛堟彁渚涘熀鏈殑璇硶鍒嗘瀽錛?/font>
org.eclipse.core.runtime
錛堟彁渚涘熀鏈殑
URI
絳夛級
org.eclipse.ui
錛堟彁渚涜繘搴︽潯錛屾垜灝辯湅鍒頒簡榪欎釜銆傚叾浠栧彲鑳借繕鏈夛級銆?/font>
鐪嬪埌浠栬浣跨敤榪欎箞澶?/font>
Eclipse
鐨勪笢瑗褲傛垜褰誨簳鐨勬墦娑堜簡鍦?/font>
Eclipse
澶栦嬌鐢ㄤ粬鐨勬墦綆楋紙濡傛灉璋佹湁濂界殑瑙e喅鏂規璁板緱緇欐垜鍙戜竴浠姐傚湪涓嬫劅嬋涓嶅敖錛夈?/font>
鎴戜滑涓嬮潰灝辨潵鐪嬬湅濡備綍瀹氬埗浠栫殑鍚堝茍瑙勫垯鏄浣曞畾涔夌殑鍚с傛垜鍏堝仛娉曟槸鎵句簡涓涓緥瀛愩傜湅鐪嬩粬鏄浣曞伐浣滅殑銆?/font>
鎴戠殑
Merge.xml
濡備笅錛?/font>
娓呭崟
2
錛?/font>
<? 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
錛?/font>
Java
Source A
錛?
閮?/font>
鍒嗘簮浠g爜涓?/font>
/**
*
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";
}
榪愯鍓?/font>
Target(Java
Source B)
閮ㄥ垎鐨勬簮浠g爜涓猴細
/**
* 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");
}
娉ㄦ剰錛?/font>
isID
鏂規硶
娉ㄩ噴閲屾湁鈥?/font>
@generated鈥?/font>
榪欎竴琛屻傝?
setID
鏂規硶鐨勬敞閲婁腑鏄?/font>
@generated
NOT
銆?/font>
榪愯鍚庣殑緇撴灉鏄紙
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";
}
//
浣跨敤浜?/font>
Source
閮ㄥ垎鐨勪唬鐮併?/font>
/**
* 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
涓殑浠g爜娌℃湁鍙樺寲銆?/font>
榪欐牱鎴戜滑灝變笉闅劇湅鍑?/font>
<
merge:dictionaryPattern
鈥︹?>
孌?/font>
鏄畾涔変簡涓涓尮閰嶆ā寮忋傚叿浣撶殑榪欎釜鍖歸厤妯″紡瑕佸仛鐨勫姩浣滃氨鏄湪
<
merge:pull
targetMarkup = "^gen$"
sourceGet = "Method/getBody"
targetPut = "Method/setBody" />
孌典腑瀹氫箟浜嗐傜寽鎯充粬鍙槸鎶?/font> Source 閮ㄥ垎鐨勫唴瀹圭洿鎺ヨ緭鍑哄埌 Target 閭i噷鍘諱簡銆?/font>
濡傛灉鎴戜滑瑙夊緱闇瑕佸仛鐐逛粈涔堣繃婊ゃ傛瘮濡傝鎯充繚鐣?/font>
Target
涓竴涓壒瀹氱殑鍐呭銆傝繖涓涓垜浠彲浠ラ氳繃
merge:pull
涓?/font>
sourceTransfer
灞炴ф潵璁劇疆銆?/font>
鐜板湪鏉ョ湅涓涓緥瀛愶細
鎶?/font>
merge:pull
鑺傜偣淇敼鎴?/font>
<
merge:pull
targetMarkup = "^gen$"
sourceTransfer = "(\s*//\s*begin-user-code.*?//\s*end-user-code\s*)\n"
sourceGet = "Method/getBody"
targetPut = "Method/setBody" />
娉ㄦ剰錛氭坊鍔犱簡涓涓?
sourceTransfer,
浠栫殑鍊?/font>
鍊兼槸涓涓鍒欒〃杈懼紡銆傚尮閰嶇殑鏄
鈥?font face="Courier New, monospace">//
begin-user-code鈥?
鍜屸?/font>
//
end-user-code鈥?/font>
鍖呭洿浣忕殑鎵鏈夌殑瀛楃銆?/font>
Target
鐨勪唬鐮佷負錛?span lang="zh-CN">鎴戜滑鐜板湪鍙槸鍏蟲敞
isID
鏂規硶
錛?/font>
銆?/font>
/**
* 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";
}
璇鋒敞鎰忕湅涓涓嬬孩鑹查儴鍒嗙殑涓よ浠g爜銆?/font>
鍚堝茍鍚庣殑浠g爜涓猴細
/**
* 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";
}
鍦ㄢ?/font>
//
begin-user-code
鈥?/font>
鍜屸?/font>
//
end-user-code
鈥?/font>
澶栫殑浠g爜鍏ㄩ儴琚浛鎹㈡垚浜嗐傝繖鏍峰氨璧峰埌浜嗚繃婊ょ殑鏁堟灉銆?/font>
鍦?/span>EMF妗嗘灦涓渶緇堜細鏍規嵁妯″瀷鐢熸垚浠g爜錛岃繕鍙互鍙嶅鐢熸垚銆傝繕鑳戒嬌浣犺嚜宸辯紪杈戠殑鍐呭涓嶄涪澶便傚濂界帺鐨勫惂銆傞偅涔堣繖閮ㄥ垎鏄庝箞瀹炵幇鐨勫憿錛熺湅榪囦竴鐐?/span>EMF浠嬬粛灝卞彲浠ョ煡閬?/span>EMF鏄氳繃JET瀹屾垚浠g爜鐢熸垚鐨勫姩浣滅殑銆傚湪銆?/span>浣跨敤聽Eclipse聽Modeling聽Framework聽榪涜寤烘ā銆嬭繖涓郴鍒楃殑鏂囩珷灝卞彲浠ヤ簡瑙e埌榪欎竴鐐廣傚湪璇ョ郴鍒楁枃绔犵殑絎笁閮ㄥ垎榪樺彲浠ヤ簡瑙e埌浣跨敤JMerge 鍙互瀹炵幇鈥滄垚鐨勪唬鐮佹彃鍏ョ幇鏈夌殑浠g爜涓紝鎴栬呭厑璁鎬互鍚庣殑寮鍙戜漢鍛樻潵瀹氬埗鎵鐢熸垚鐨勪唬鐮侊紝鑰屼笉闇瑕佸湪閲嶆柊鐢熸垚浠g爜鏃墮噸鏂扮紪鍐欎換浣曞唴瀹廣傗濊繖鏍風殑鍔熻兘銆?/span>
浠栨槸閫氳繃鍒涘緩Junit 嫻嬭瘯綾諱綔渚嬪瓙鐨勩備粬璇磋繃鐨勪笢瑗挎垜灝變笉鍟板棪浜嗐傛垜鍙槸鎶婃垜涓漢鍦ㄧ湅浜嗕粬鏂囩珷鍚庣殑涓浜涗笢瑗挎暣鐞嗕竴涓嬨?/p>
濂斤紝鐜板湪榪涘叆姝i銆?/p>
棣栧厛鎴戜滑鏉ヨ涓璇?font face="Times New Roman, serif">JMerge榪欎釜鍚嶅瓧銆?font face="Times New Roman, serif">Merge榪欎釜鍗曡瘝鏄悎騫剁殑鎰忔濄傚墠闈㈠姞浜嗕竴涓?font face="Times New Roman, serif">J鈥?/font>涓嶇敤澶氳錛岃偗瀹氳〃紺?font face="Times New Roman, serif">Java浜嗭紙瀹屽叏鏄弬鑰?font face="Times New Roman, serif">Junit,log4j鈥︹?/font>錛夈傞偅涔堟垜灝卞ぇ鑳?
鐚滄祴榪欎釜宸ュ叿鏄敤鏉ュ悎騫?font face="Times New Roman, serif">Java浠g爜鐨勩傛棦鐒舵槸鍚堝茍灝卞簲璇ョ鍚堜笅鍥炬弿榪扮殑鍔ㄤ綔銆?img src="http://m.tkk7.com/images/blogjava_net/jetgeng/Jmerge-Name.jpg" alt="Jmerge-Name.jpg" border="0" height="227" width="488" />
鍚堝茍鑲畾鏄妸涓や釜涓滆タ鍜屾垚涓涓傛墍浠ュ浘涓殑Java Source A 鍜?font face="Times New Roman, serif">Java Source B灝卞垎鍒唬琛ㄩ渶瑕佸悎騫剁殑閮ㄥ垎浜嗐傛渶鍚庣殑Result of Merge灝辨槸鍚堝茍鍚庣殑閭d竴涓粨鏋滀簡銆傚簲涓烘垜浠悎騫剁殑鏄?font face="Times New Roman, serif">Java浠g爜銆傝繖浜涗唬鐮佸浣曞悎騫訛紝涔熷氨鏄垜浠湡鏈涚殑鍚堝茍緇撴灉鏄粈涔堟牱鐨勩傚浘涓殑Rule of merge灝辨槸浠h〃鐨勮繖閮ㄥ垎淇℃伅銆?/p>
鍦ㄤ笅闈嬌鐢?font face="Times New Roman, serif">Jmerge鐨勪唬鐮佷腑
娓呭崟 1.
璋冪敤 JMerge
聽2聽聽聽聽聽聽聽聽聽JMerger聽merger聽=聽getJMerger();
聽3聽聽聽聽聽聽聽聽聽
聽4聽聽聽聽聽聽聽聽聽//聽set聽source
聽5聽聽聽聽聽聽聽聽聽merger.setSourceCompilationUnit(
聽6聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽merger.createCompilationUnitForContents(generated));
聽7聽聽聽聽聽聽聽聽聽
聽8聽聽聽聽聽聽聽聽聽//聽set聽target
聽9聽聽聽聽聽聽聽聽聽merger.setTargetCompilationUnit(
10聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽merger.createCompilationUnitForInputStream(聽
11聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽new聽FileInputStream(target.getLocation().toFile())));
12聽聽聽聽聽聽聽聽聽
13聽聽聽聽聽聽聽聽聽//聽merge聽source聽and聽target
14聽聽聽聽聽聽聽聽聽merger.merge();
15聽
16聽聽聽聽聽聽聽聽聽//聽extract聽merged聽contents
17聽聽聽聽聽聽聽聽聽InputStream聽mergedContents聽=聽new聽ByteArrayInputStream(
18聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽merger.getTargetCompilationUnit().getContents().getBytes());
19聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
20聽聽聽聽聽聽聽聽聽//聽overwrite聽the聽target聽with聽the聽merged聽contents
21聽聽聽聽聽聽聽聽聽target.setContents(mergedContents,聽true,聽false,聽monitor);
22聽聽聽聽聽聽聽聽聽//聽
23聽
24聽//聽
25聽private聽JMerger聽getJMerger()聽{
26聽聽聽聽聽聽聽聽聽//聽build聽URI聽for聽merge聽document
27聽聽聽聽聽聽聽聽聽String聽uri聽=聽
28聽聽聽聽聽聽聽聽聽聽聽聽Platform.getPlugin(PLUGIN_ID).getDescriptor().getInstallURL().toString();
29聽聽聽聽聽聽聽聽聽uri聽+=聽"templates/merge.xml";
30聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
31聽聽聽聽聽聽聽聽聽JMerger聽jmerger聽=聽new聽JMerger();
32聽聽聽聽聽聽聽聽聽JControlModel聽controlModel聽=聽new聽JControlModel(聽uri聽);
33聽聽聽聽聽聽聽聽聽jmerger.setControlModel(聽controlModel聽);
34聽聽聽聽聽聽聽聽聽return聽jmerger;
35聽}
鎴戜滑鍙互寰堝鏄撶殑鎵懼嚭瀹冧滑鐨勫搴旂墿銆?/p>
鎴戜滑鍏堜粠JMerger鐨勫垱寤哄紑濮嬬湅璧峰惂銆?/p>
uri += "templates/merge.xml";
JMerger jmerger = new JMerger();
JControlModel controlModel = new JControlModel( uri );
jmerger.setControlModel( controlModel );
榪欓噷鐢ㄤ竴涓悕涓轟負涓轟負鍙?/span>merge.xml
鐨勬枃浠朵綔涓轟負涓轟負杈撹緭杈?/span>input
鍙傛暟鍒涘垱紿滄柊寤轟簡涓涓?/span>JControlModel
瀵硅薄銆備紶浼?/span>
浼犵粰JMerger
瀵硅薄銆傚仛瀹岃繖浜涘悗鍙堣皟璋冪敤浜?
setSourceCompilationUnit
鍜?
setTargetCompilationUnit
鏂規硶銆備粬浠滑浠?/span>
浠殑綾葷被
綾誨瀷閮芥槸IDOMCompilationUnit
錛堢敤
榪囩殑鏈嬪弸閮戒細鐭ラ亾浠栧氨浠h〃浜嗕竴涓?/span>Java
鏂囦歡
錛夈傚緢鑽h崳瀹規槗灝變細鎯寵搗浠栦滑
浠偗瀹氬氨鏄?/span>Java
Source A
鍜?/span>Java
Source B
浜嗚嚦浜?/span>Rule
of merge
鍙互閫氳繃
榪囪皟鐢?/span>
merger.merge()
鍚庣殑
getContents
錛堬級鏂規硶鑾?/span>
銆?/span>鑾峰緱
闄や簡榪欑璋冪敤
鏂瑰紡澶栬繕鏈変竴涓洿
綆鍗?/span>
鐨勮皟鐢ㄦ柟寮忥細
String
contents = merger.execute(null, new String[] { mergeXML,
source,target });
鐪嬩簡
execute
瀹炵幇鍚庡氨
涓嶉毦
鍙戠幇浠栫殑榪?/span>
鏄嬌鐢ㄧ殑絎竴
縐嶃?br />
鍏充簬鍏蜂綋濡備綍瀹氬埗鍚堝茍瑙勫垯
鍜屼嬌鐢ㄦ潯浠舵墦綆楀湪涓嬩竴綃囦腑鍐欍?br />
鍏辨湁涓変釜閮細
1. 緙栬緫鍣ㄧ殑涓諱綋銆傚寘鎷叚縐嶅憟鐜版柟寮忋?/SPAN>
a) Selection.
b) Parent.
c) List.
d) Tree
e) Table
f) Tree With Columns.
2. Outline閮ㄥ垎銆?/SPAN>
Properties,浼氭牴鎹夋嫨涓嶅悓鐨勫璞¤屾敼鍙樻樉紺虹殑鍐呭銆?/SPAN>鍏充簬Jface閮ㄥ垎鐨勫伐浣滄ā寮忔垜鍦ㄣ?/SPAN>Table View 鐨勫悎浣滅被鐨勬ā寮忋嬩竴鏂囦腑鏈夋彁鍒幫紝涓嶈繃闇瑕佽鏄庣殑鏄紝鍦?/SPAN>Jface涓殑Viewer浠栦滑鐨?/SPAN>ContentProvider鍙兘涓嶄竴鏍風殑銆?/SPAN>
瑕佸畬鎴愯繖閮ㄥ垎鐨勫姛鑳?/SPAN>emf鐨勪駭鐢熶唬鐮佷腑鍒嗗埆鏀懼埌浜嗕袱涓彃浠墮噷瀹炵幇浜嗕粬浠垎鍒槸edit鍜?/SPAN>editor銆?/SPAN>
Edit鎻愪緵浜?/SPAN>Item 鐨?/SPAN>Provider錛屼粬瀛樺湪鐨勬剰涔夊氨鍦ㄤ簬鎶婇昏緫瀵硅薄鍜?/SPAN>UI鍒嗗壊寮銆傝?/SPAN>Editor閫氳繃浣跨敤edit鎻愪緵鐨?/SPAN>Provider瀹炵幇浜嗕竴涓紪杈戝櫒鐨?/SPAN>UI鍜?/SPAN>Command閮ㄥ垎錛屼粬鏄鐪熺殑鐢ㄦ埛鐣岄潰閮ㄥ垎銆?/SPAN>
涓嬮潰鎴戜滑灝卞厛鏉ョ湅鐪?/SPAN>edit涓殑綾匯?/SPAN>
濂戒簡錛岄鍏?/SPAN>edit涓嬌鐢ㄧ殑鏄?/SPAN>adapt妯″瀷銆傛墍浠?/SPAN>edit涓殑鎻掍歡瀵硅薄浼氬疄鐜版墍鏈夌殑viewer,Properties鎵闇瑕佺殑鎺ュ彛銆?/SPAN>
Emf涓烘垜浠疄鐜伴氱敤鐨勬帴鍙c傛墍浠ヨ繖緇濆鏄竴涓涔犵殑濂芥満浼氥?/SPAN>
搴熻瘽涓嶅璇翠簡錛屾潵鐪嬩唬鐮佹妸銆?/SPAN>
棣栧厛鐪嬪0鏄庯細
浠栦滑涔嬮棿鐨勮亴鑳戒互鍙婂疄鐜扮殑鎺ュ彛鍙敤涓嬪浘鏉ユ弿榪幫細
ItemProviderAdapter瀹屾垚涓浜涘熀鏈姛鑳姐備笅闈㈠氨鍒嗗埆浠庝笉鍚岀殑鎺ュ彛鏉ヨ鏄?/SPAN>
1. ResourceLocator:璇ユ帴鍙f槸鐢ㄦ潵榪涜璧勬簮瀹氫綅鐨勩?/SPAN>
2. IDisposable 鏄?/SPAN>emf妗嗘灦鎻愪緵鐨勪竴縐嶆瀽鏋勬帴鍙c?/SPAN>
3. IChangeNotifier 涓?Notification and Adapters"妯″紡鎻愪緵蹇呴渶鐨勬柟娉曘?/SPAN>
CreateChildCommand.Helper
鏈涓嬮潰鐨?/SPAN>EMF鏍規嵁鎴戜滑鐨勬ā鍨嬩駭鐢熺殑Provider鐨勪簡銆備粬瀹炵幇浜?/SPAN>5涓帴鍙c?/SPAN>
1. IEditingDomainItemProvider
榪欓儴鍒嗘垜榪樻竻妤氾紝鎬鐤戝拰command鏈夊叧銆?/SPAN>
2. IStructuredItemContentProvider
璇ユ帴鍙d負TableViewer,ListViewer,TreeViewer鎻愪緵鏈嶅姟銆?/SPAN>
This is the interface needed to populate the top level items in a TreeViewer, the items of a ListViewer, or the rows of a TableViewer.
3. ITreeItemContentProvider
This is the interface needed to populate subtrees in a TreeViewer
4. IItemLabelProvider
This is the interface implemented to provide a label text and even a label icon for an item;
it receives delegated calls from ILabelProvider.
5. IItemPropertySource
This is the interface is needed to populate property sheet items銆?/SPAN>it is the same as IpropertySource銆?/SPAN>except that the object is passed as the first parameter for each method.榪欎竴綃囪繕鍙槸edit閮ㄥ垎鍒氬紑涓涓ご銆?/SPAN>
涓嬩竴鏈熶細浠嬬粛涓涓嬩粬鐨刢ommand閮ㄥ垎銆?BR>
浠g爜鐢熸垚鍚庯紝鎴戝氨鎯崇湅鐪?/span>EMF涓烘垜鐢熸垚浜嗕粈涔堟牱鐨勪唬鐮併傛垜濡傛灉闇瑕佷慨鏀圭殑璇濊濡備綍淇敼銆?/span>
鎴戠殑鈥?/span>Hellow world鈥濇槸閲囩敤鐨勨?/span>Using EMF鈥濇枃涓殑妯″瀷銆?br>浠庡浘涓垜浠彲浠ョ湅鍒版湁涓変釜鍖咃細
浠栦滑鍒嗗埆鏄細family,family.impl鍜?/span>family.util銆?/span>
family鍜?/span>family.impl鍖呬箣闂寸殑宸埆灝辨槸涓涓槸Interface錛屽彟澶栦竴涓槸榪欎簺Interface鐨勫疄鐜般?/span>
鎴戜滑鍏堟潵鐪嬬湅鎴戜滑妯″瀷涓嚭鐜拌繃鐨勭被錛?/span>
Family,FamilyTree,Female,Male浠ュ強Individual銆?/span>
鐢變簬鎴戞槸閲囩敤Annotated Java鐨勬柟寮忕敓鎴愮殑妯″瀷銆傛墍浠ュ湪family鍖呬腑鐨勪唬鐮佸茍娌℃湁澶鐨勫彉鍖栥?br>浠栧彧鏄負鎴戞彁渚涗簡Set鏂規硶銆傛帴鍙g殑緇ф壙涔熸病鏈夊仛淇敼銆備絾鏄粬瀵瑰簲鐨勫疄鐜扮被灝辨湁浜嗗緢澶氬彉鍖栥?/span>
棣栧厛浠庣被鐨勭敵鏄庢潵鐪嬶細
榪欓噷鏈変竴寮犲浘鍙互娓呮櫚鐨勮鏄庤繖涓戶鎵垮叧緋葷殑鑱岃兘銆?/span>
榪欐牱鎴戜滑鐨勫氨鍙互涓嶅啓涓琛屼唬鐮佸氨鍙互浣挎垜浠殑瀵硅薄鍏鋒湁Notification/Common鐨勫姛鑳斤紙鍏充簬Notification鍜?/span>Common鐨勫姛鑳藉埌搴曟槸鎬庢牱鐨勶紝鎴戜細鍦ㄥ悗緇殑瀛︿範絎旇涓涓嬫潵銆傚懙鍛碉紝鏄笉鏄緢鐖藉晩錛夈傚彟澶栧湪銆?/span>Eclipse Modeling Framework: A Developer's Guide銆嬩竴涔︾殑絎簩绔犱篃鏈夋彁鍒拌繖閮ㄥ垎鐨勫唴瀹?/span>,涓嶈繃鐢變簬浠栬瑙g殑EMF鐨勭増鏈瘮杈冭佸拰鎴戠幇鍦ㄤ嬌鐢ㄧ殑鐗堟湰鏈夌偣鍑哄叆錛屼笉榪囧熀鏈殑鍔熻兘榪樻槸璁插埌浜嗐?/span>
濂戒簡錛岀湅瀹岀敵鏄庢垜浠氨鏉ョ戶緇線涓嬬湅鍚с?br>鍦?/span>Family涓嬮潰鏈変笁涓睘鎬э紝father,mother鍜?/span>children銆?/span>
EMF緇欐垜浠敓鎴愮殑瀵瑰簲鐨勪唬鐮佷負錛?/span>
浠ュ強涓浜?/span>get鍜?/span>set鏂規硶銆?/span>
瀵逛簬set鏂規硶涓櫎浜嗗熀鏈殑璧嬪間互澶栬繕鍔犱笂浜嗗悜鎵鏈夊榪欐鍙樺姩鎰熷叴瓚h瀵熻呭彂閫佷竴涓彉鏇存秷鎭細
Male oldFather = father;
father = newFather;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, FamilyPackage.FAMILY__FATHER, oldFather, father));
}
瀵逛簬get鏂規硶瑕佸垎鍩烘湰綾誨瀷榪樻槸瀵硅薄榪欎袱縐嶇被鍨嬫潵澶勭悊銆?/span>
濡傛灉鏄熀鏈被鍨嬶紝鐩存帴榪斿洖灝卞ソ浜嗐?/span>
濡傦細
1銆?span style="font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">
Using EMF, Author :Catherine Griffin2銆?span style="font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">
EMF浠嬬粛緋誨垪錛堜簩銆佷粠妯″瀷鐢熸垚搴旂敤紼嬪簭錛?/span> Author:鍏繘鍒?/span>3銆?span style="font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">
Mastering Eclipse Modeling Framework錛?/span>Author:Vladimir Bacvanski(Vladimir@inferdata.com) Petter Graff(petter@inferdata.com) Eclipse Modeling Framework: A Developer's Guide Author:Frank Budinsky, David Steinberg, Ed Merks, Raymond Ellersick, Timothy J. Grose