邋遢居

          我的Java天堂

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            61 Posts :: 2 Stories :: 90 Comments :: 0 Trackbacks
          Jmerge的使用初步(一)

          EMF框架中最終會根據(jù)模型生成代碼,還可以反復生成。還能使你自己編輯的內(nèi)容不丟失。夠好玩的吧。那么這部分是怎么實現(xiàn)的呢?看過一點EMF介紹就可以知道EMF是通過JET完成代碼生成的動作的。在《使用?Eclipse?Modeling?Framework?進行建模》這個系列的文章就可以了解到這一點。在該系列文章的第三部分還可以了解到使用JMerge 可以實現(xiàn)“成的代碼插入現(xiàn)有的代碼中,或者允許以后的開發(fā)人員來定制所生成的代碼,而不需要在重新生成代碼時重新編寫任何內(nèi)容。”這樣的功能。

          他是通過創(chuàng)建Junit 測試類作例子的。他說過的東西我就不啰嗦了。我只是把我個人在看了他文章后的一些東西整理一下。

          好,現(xiàn)在進入正題。

          首先我們來說一說JMerge這個名字。Merge這個單詞是合并的意思。前面加了一個“J”不用多說,肯定表示Java了(完全是參考Junit,log4j……)。那么我就大膽 猜測這個工具是用來合并Java代碼的。既然是合并就應(yīng)該符合下圖描述的動作。Jmerge-Name.jpg

          合并肯定是把兩個東西和成一個。所以圖中的Java Source A Java Source B就分別代表需要合并的部分了。最后的Result of Merge就是合并后的那一個結(jié)果了。應(yīng)為我們合并的是Java代碼。這些代碼如何合并,也就是我們期望的合并結(jié)果是什么樣的。圖中的Rule of merge就是代表的這部分信息。


          在下面使用Jmerge的代碼中

          清單 1. 調(diào)用 JMerge

          ?1???//?
          ?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?}

          我們可以很容易的找出它們的對應(yīng)物。

          我們先從JMerger的創(chuàng)建開始看起吧。

          uri += "templates/merge.xml";

                  JMerger jmerger = new JMerger();
          JControlModel controlModel = new JControlModel( uri );
          jmerger.setControlModel( controlModel );

          這里用一個名為為為為叫merge.xml的文件作為為為為輸輸輸input參數(shù)創(chuàng)創(chuàng)竄新建了一個JControlModel對象。傳傳傳給JMerger對象。做完這些后又調(diào)調(diào)用了 setSourceCompilationUnit setTargetCompilationUnit 方法。他們們們們的類類類型都是IDOMCompilationUnit(用過的朋友都會知道他就代表了一個Java文件)。很榮榮容易就會想起他們們肯定就是Java Source A Java Source B了至于Rule of merge可以通過過調(diào)用merger.merge()后的getContents()方法獲獲得


          除了這種調(diào)用方式外還有一個更簡單的調(diào)用方式:

          String contents = merger.execute(null, new String[] { mergeXML, source,target });


          看了 execute 實現(xiàn)后就不難發(fā)現(xiàn)他的還是使用的第一種。

          關(guān)于具體如何定制合并規(guī)則和使用條件打算在下一篇中寫。



          posted on 2006-05-01 08:01 Jet Geng 閱讀(2537) 評論(0)  編輯  收藏 所屬分類: EclipseEMF
          主站蜘蛛池模板: 华池县| 舞阳县| 六枝特区| 江孜县| 临泉县| 新野县| 金川县| 贺州市| 海丰县| 都江堰市| 怀化市| 招远市| 桦南县| 静海县| 措美县| 曲阜市| 阿鲁科尔沁旗| 辛集市| 长海县| 扶风县| 武安市| 长葛市| 科技| 平湖市| 泌阳县| 留坝县| 东乡| 霍山县| 铅山县| 理塘县| 贵州省| 加查县| 宜良县| 成都市| 三穗县| 茶陵县| 阿城市| 锡林郭勒盟| 柳河县| 富川| 桑植县|