邋遢居

          我的Java天堂

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            61 Posts :: 2 Stories :: 90 Comments :: 0 Trackbacks

          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 外的代碼全部被替換成了。這樣就起到了過濾的效果。

          posted on 2006-05-02 11:34 Jet Geng 閱讀(2005) 評(píng)論(1)  編輯  收藏 所屬分類: EclipseEMF

          Feedback

          # re: Jmerge的使用初步(二) 2007-11-13 11:24 help
          你好:

          我在merge.xml中加入
          sourceTransfer = "(\s*//\s*begin-user-code.*?//\s*end-user-code\s*)\n"
          后,方法就不會(huì)覆蓋生成了,我不知道為什么。
          能幫幫忙嗎?


            回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 讷河市| 京山县| 伽师县| 札达县| 河源市| 黄大仙区| 云和县| 永昌县| 泽普县| 聂拉木县| 百色市| 攀枝花市| 乃东县| 凤山县| 岳普湖县| 永德县| 信宜市| 浮梁县| 逊克县| 于田县| 贞丰县| 乐安县| 额敏县| 桐城市| 石林| 阿巴嘎旗| 蕉岭县| 钟山县| 天水市| 贡山| 新泰市| 澄城县| 托里县| 玛纳斯县| 大兴区| 商南县| 定结县| 于都县| 菏泽市| 铁岭市| 天水市|