邋遢居

          我的Java天堂

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            61 Posts :: 2 Stories :: 90 Comments :: 0 Trackbacks

          Jmerger 使用初步 ( )

          前面一篇提到了他基本的概念和能完成的功能。在這一篇里我們來看看他的使用條件和使用方法。

          使用條件:應為

          org.eclipse.jdt.core (提供基本的語法分析)

          org.eclipse.core.runtime (提供基本的 URI 等)

          org.eclipse.ui (提供進度條,我就看到了這個。其他可能還有)。

          看到他要使用這么多 Eclipse 的東西。我徹底的打消了在 Eclipse 外使用他的打算(如果誰有好的解決方案記得給我發一份。在下感激不盡)。


          我們下面就來看看如何定制他的合并規則是如何定義的吧。我先做法是找了一個例子。看看他是如何工作的。


          我的 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 屬性來設置。


          現在來看一個例子:

          merge:pull 節點修改成

          < 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 的代碼為我們現在只是關注 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 外的代碼全部被替換成了。這樣就起到了過濾的效果。

          posted on 2006-05-02 11:34 Jet Geng 閱讀(2006) 評論(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"
          后,方法就不會覆蓋生成了,我不知道為什么。
          能幫幫忙嗎?


            回復  更多評論
            

          主站蜘蛛池模板: 吉林省| 二连浩特市| 平湖市| 公安县| 图片| 红安县| 新源县| 固安县| 河北省| 灵璧县| 栾城县| 永靖县| 澄迈县| 广东省| 定远县| 建平县| 娱乐| 沅江市| 通州市| 扎囊县| 邳州市| 泸水县| 耒阳市| 布尔津县| 金湖县| 廉江市| 平凉市| 贡嘎县| 伊吾县| 偏关县| 二连浩特市| 夹江县| 佛冈县| 通海县| 汉中市| 永城市| 兴化市| 岳普湖县| 达尔| 监利县| 朝阳县|