<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    邋遢居

    我的Java天堂

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

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

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


      回復  更多評論
      

    主站蜘蛛池模板: 亚洲VA中文字幕无码一二三区 | 亚洲国产精品无码专区影院| a级毛片在线免费观看| 亚洲天天做日日做天天看| 成人免费毛片内射美女APP| 日韩在线视精品在亚洲| 午夜亚洲AV日韩AV无码大全| 999在线视频精品免费播放观看| 成人精品国产亚洲欧洲| 久久精品国产亚洲AV果冻传媒| 久久久久国色AV免费看图片| 精品无码一级毛片免费视频观看| 亚洲毛片免费视频| 亚洲人成电影网站国产精品| 真人做A免费观看| eeuss影院ss奇兵免费com| 中文字幕 亚洲 有码 在线| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 一区二区三区精品高清视频免费在线播放 | 亚洲久悠悠色悠在线播放| 亚洲午夜国产精品无码| 好男人www免费高清视频在线| 99视频免费在线观看| 亚洲大码熟女在线观看| 亚洲视频在线播放| 亚洲不卡AV影片在线播放| 青娱乐免费视频在线观看| baoyu777永久免费视频| 国产AV无码专区亚洲AV麻豆丫| 亚洲黄色高清视频| 亚洲欧洲自拍拍偷午夜色无码| 午夜私人影院免费体验区| 最近最新高清免费中文字幕 | 国产亚洲A∨片在线观看| 小小影视日本动漫观看免费| 日本黄色免费观看| 9277手机在线视频观看免费| 国产黄色片免费看| 边摸边吃奶边做爽免费视频99 | 7723日本高清完整版免费| 三级网站在线免费观看|