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
																		
																
														
														”
												
										
								
						
				
				
						
								
										
												
														
																外的代码全部被替换成了。这样就起到了过滤的效果。