<?xml version='1.0' encoding='utf-8' ?>
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
		<title>Developer guide</title>
		<style type="text/css">
			.tip {border: 1px solid #090;background-color: #dfd;margin: 20px;padding: 0px 6px 0px 6px;}
			.note {border: 1px solid #F0C000;background-color: #FFFFCE;margin: 20px;padding: 0px 6px 0px 6px;}
			.info {border: 1px solid #3c78b5;background-color: #D8E4F1;margin: 20px;padding: 0px 6px 0px 6px;}
			.warning {border: 1px solid #c00;background-color: #fcc;margin: 20px;padding: 0px 6px 0px 6px;}
			.panel {border: 1px solid #ccc;background-color: #FFFFCE;margin: 10px;padding: 0px 6px 0px 6px;}
</style>
		<link type="text/css" rel="stylesheet" href="../resources/bootstrap.css"/>
		<link type="text/css" rel="stylesheet" href="../resources/custom.css"/>
	</head>
	<body>
		<h1 id="EMF_Compare_.E2.80.94__Developer_Guide">EMF Compare —  Developer Guide</h1>
		<p>Version 3.1.0.201506080946</p>
		<div class="toc">
			<h3 class="toc-title">Table of Contents</h3>
			<ol style="list-style: none">
				<li>
					<a href="#Architecture">Architecture</a>
					<ol style="list-style: none">
						<li>
							<a href="#Comparison_Process">Comparison Process</a>
							<ol style="list-style: none">
								<li>
									<a href="#Model_Resolving">Model Resolving</a>
								</li>
								<li>
									<a href="#Matching">Matching</a>
								</li>
								<li>
									<a href="#Differencing">Differencing</a>
								</li>
								<li>
									<a href="#Equivalences">Equivalences</a>
								</li>
								<li>
									<a href="#Requirements">Requirements</a>
								</li>
								<li>
									<a href="#Conflicts">Conflicts</a>
								</li>
							</ol>
						</li>
						<li>
							<a href="#Project_Architecture">Project Architecture</a>
						</li>
						<li>
							<a href="#The_Comparison_Model">The Comparison Model</a>
						</li>
						<li>
							<a href="#Match">Match</a>
							<ol style="list-style: none">
								<li>
									<a href="#Diff">Diff</a>
								</li>
								<li>
									<a href="#Conflict">Conflict</a>
								</li>
								<li>
									<a href="#Equivalence">Equivalence</a>
								</li>
							</ol>
						</li>
					</ol>
				</li>
				<li>
					<a href="#Core_Concepts">Core Concepts</a>
					<ol style="list-style: none">
						<li>
							<a href="#Proxy_Resolution">Proxy Resolution</a>
						</li>
						<li>
							<a href="#Equality_Helper">Equality Helper</a>
						</li>
						<li>
							<a href="#Comparison_Scope">Comparison Scope</a>
						</li>
						<li>
							<a href="#Longest_Common_Subsequence">Longest Common Subsequence</a>
						</li>
					</ol>
				</li>
				<li>
					<a href="#Default_Behavior_and_Extensibility">Default Behavior and Extensibility</a>
					<ol style="list-style: none">
						<li>
							<a href="#Model_Resolving_2">Model Resolving</a>
							<ol style="list-style: none">
								<li>
									<a href="#Customization">Customization</a>
									<ol style="list-style: none">
										<li>
											<a href="#Model_Resolver_Extension_Point">Model Resolver Extension Point</a>
										</li>
										<li>
											<a href="#Model_Dependency_Provider_Extension_Point">Model Dependency Provider Extension Point</a>
										</li>
									</ol>
								</li>
							</ol>
						</li>
						<li>
							<a href="#Match_2">Match</a>
							<ol style="list-style: none">
								<li>
									<a href="#Overriding_the_Match_engine">Overriding the Match engine</a>
								</li>
								<li>
									<a href="#Changing_how_resources_are_matched">Changing how resources are matched</a>
								</li>
								<li>
									<a href="#Defining_custom_identifiers">Defining custom identifiers</a>
								</li>
								<li>
									<a href="#Ignoring_identifiers">Ignoring identifiers</a>
								</li>
								<li>
									<a href="#Refine_the_default_Match_result">Refine the default Match result</a>
								</li>
							</ol>
						</li>
						<li>
							<a href="#Diff_2">Diff</a>
							<ol style="list-style: none">
								<li>
									<a href="#Overriding_the_Diff_engine">Overriding the Diff engine</a>
								</li>
								<li>
									<a href="#Changing_the_FeatureFilter">Changing the FeatureFilter</a>
								</li>
								<li>
									<a href="#Changing_the_Diff_Processor">Changing the Diff Processor</a>
								</li>
								<li>
									<a href="#Refine_the_default_Diff_result">Refine the default Diff result</a>
								</li>
							</ol>
						</li>
						<li>
							<a href="#Equivalences_2">Equivalences</a>
							<ol style="list-style: none">
								<li>
									<a href="#Refine_the_default_equivalences">Refine the default equivalences</a>
								</li>
							</ol>
						</li>
						<li>
							<a href="#Requirements_2">Requirements</a>
						</li>
						<li>
							<a href="#Refinement">Refinement</a>
						</li>
						<li>
							<a href="#Conflicts_2">Conflicts</a>
						</li>
						<li>
							<a href="#Merging">Merging</a>
							<ol style="list-style: none">
								<li>
									<a href="#Which_references_are_followed_during_merging">Which references are followed during merging</a>
								</li>
							</ol>
						</li>
						<li>
							<a href="#User_Interface">User Interface</a>
							<ol style="list-style: none">
								<li>
									<a href="#Add_your_own_filter">Add your own filter</a>
								</li>
								<li>
									<a href="#Add_your_own_group">Add your own group</a>
								</li>
								<li>
									<a href="#Customize_display_of_differences_inside_an_existing_group">Customize display of differences inside an existing group</a>
								</li>
								<li>
									<a href="#Add_your_own_accessor_factory">Add your own accessor factory</a>
								</li>
							</ol>
						</li>
					</ol>
				</li>
				<li>
					<a href="#Using_The_Compare_APIs">Using The Compare APIs</a>
					<ol style="list-style: none">
						<li>
							<a href="#Compare_two_models">Compare two models</a>
							<ol style="list-style: none">
								<li>
									<a href="#Loading_your_models">Loading your models</a>
								</li>
								<li>
									<a href="#Creating_the_comparison_scope">Creating the comparison scope</a>
								</li>
								<li>
									<a href="#Configuring_the_comparison">Configuring the comparison</a>
								</li>
								<li>
									<a href="#Putting_it_all_together">Putting it all together</a>
								</li>
								<li>
									<a href="#Comparing_from_an_Eclipse_plugin">Comparing from an Eclipse plugin</a>
								</li>
							</ol>
						</li>
						<li>
							<a href="#Query_the_differences">Query the differences</a>
							<ol style="list-style: none">
								<li>
									<a href="#All_differences">All differences</a>
								</li>
								<li>
									<a href="#Differences_related_to_element_X">Differences related to element X</a>
								</li>
								<li>
									<a href="#Filtering_differences">Filtering differences</a>
								</li>
							</ol>
						</li>
						<li>
							<a href="#Merge_differences">Merge differences</a>
						</li>
						<li>
							<a href="#Open_a_compare_editor">Open a compare editor</a>
						</li>
					</ol>
				</li>
			</ol>
		</div>
		<h2 id="Architecture">Architecture</h2>
		<h3 id="Comparison_Process">Comparison Process</h3>
		<p>
			<img align="middle" border="0" src="./../images/EMF_Compare_Process_Full.png"/>
		</p>
		<p>The above figure represents the comparison process of EMF Compare. It can be roughly divided in 6 main phases.</p>
		<h4 id="Model_Resolving">Model Resolving</h4>
		<p>From a given "starting point" (the file a user decided to compare), finding all other fragments required for the comparison of the whole logical model.</p>
		<h4 id="Matching">Matching</h4>
		<p>Iterating over the two (or three) loaded logical models in order to map elements together two-by-two (or three-by-three). For example, determine that class Class1 from the first model corresponds to class Class1' from the second model.</p>
		<h4 id="Differencing">Differencing</h4>
		<p>The matching phase told us which elements were matching together. The differencing phase will browse through these mappings and determine whether the two (or three) elements are equal or if they present differences (for example, the name of the class changed from Class1 to Class1').</p>
		<h4 id="Equivalences">Equivalences</h4>
		<p>The differencing phases detected a number of differences between the compared models. However, two distinct differences might actually represent the same change. This phase will browse through all differences and link them together when they can be seen as equivalent (for example, differences on opposite references).</p>
		<h4 id="Requirements">Requirements</h4>
		<p>For the purpose of merging differences, there might be dependencies between them. For example, the addition of a class C1 in package P1 depends on the addition of package P1 itself. During this phase, we'll browse through all detected differences and link them together when we determine that one cannot be merged without the other.</p>
		<h4 id="Conflicts">Conflicts</h4>
		<p>When we're comparing our file with one from a Version Control System (CVS, SVN, Git, Clearcase...), there might actually be conflicts between the changes we've made locally, and the changes that were made to the file on the remote repository. This phase will browse through all detected differences and detect these conflicts.</p>
		<p>The Model resolving phase itself can be further decomposed in its own two distinct phases. More on the logical model and its resolution can be found on the 
			<a href="./logical-model.html" title="./logical-model.html">dedicated page</a>.
		</p>
		<p>
			<img align="middle" border="0" src="./../images/EMF_Compare_Model_Resolving.png"/>
		</p>
		<h3 id="Project_Architecture">Project Architecture</h3>
		<p>
			<img align="middle" border="0" src="./../images/EMF_Compare_2_Architecture.png"/>
		</p>
		<p>EMF Compare is built on top of the Eclipse platform. We depend on the Eclipse Modeling Framework (EMF), the Eclipse Compare framework and, finally, Eclipse Team, the framework upon which the repository providers (EGit, CVS, Subversive...) are built.</p>
		<p>The EMF Compare extensions target specific extensions of the modeling framework: UML, the Graphical Modeling Framework (and its own extensions, papyrus, ecoretools, ...).</p>
		<p>Whilst we are built atop bricks that are tightly coupled with the eclipse platform, it should be noted that the core of EMF Compare can be run in a standalone application with no runtime dependencies towards Eclipse; as can EMF itself.</p>
		<h3 id="The_Comparison_Model">The Comparison Model</h3>
		<p>EMF Compare uses a single model, whose root is a 
			<i>Comparison</i> object, to represent all of the information regarding the comparison: matched objects, matched resources, detected differences, links between these references, etc. The root 
			<i>Comparison</i> is created at the beginning of the Match process, and will undergo a set of successive refinements during the remainder of the Comparison: Diff, Equivalence, Dependencies... will all add their own information to the 
			<i>Comparison</i>.
		</p>
		<p>Here is an overview of the EMF Compare metamodel:</p>
		<p>
			<img align="middle" border="0" src="./../images/EMF_Compare_Developer_Class_Diagram.png"/>
		</p>
		<p>So, how exactly is all of the information the Comparison model can hold represented, and how to make sense of it all?</p>
		<h3 id="Match">Match</h3>
		<p>A 
			<i>Match</i> element is how we represent that the 
			<i>n</i> compared versions have elements that are basically the same. For example, if we are comparing two different versions 
			<i>v1</i> and 
			<i>v2</i> of a given model which look like:
		</p>
		<table border="1" cellpadding="5" cellspacing="0">
			<tr>
				<th align="center">Master</th>
				<th align="center">Borrowables</th>
			</tr>
			<tr>
				<td>
					<img align="middle" border="0" src="./../images/v1.png"/>
				</td>
				<td>
					<img align="middle" border="0" src="./../images/v2.png"/>
				</td>
			</tr>
		</table>
		<p>Comparing these two models, we'll have a Comparison model containing three matches:</p>
		<ol>
			<li>library &lt;-&gt; library</li>
			<li>Book &lt;-&gt; Novel</li>
			<li>title &lt;-&gt; title</li>
		</ol>
		<p>In other words, the comparison model contains an aggregate of the two or three compared models, in the form of 
			<i>Match</i> elements linking the elements of all versions together. Differences will then be detected on these 
			<i>Match</i> and added under them, thus allowing us to know both:
		</p>
		<ul>
			<li>what the difference is (for example, "attribute name has been changed from 
				<i>Book</i> to 
				<i>Novel</i>"), and
			</li>
			<li>what the original elements were.</li>
		</ul>
		<h4 id="Diff">Diff</h4>
		<p>
			<i>Diff</i> elements are created during the differencing process in order to represent the actual modifications that can be detected within the source model(s). The 
			<i>Diff</i> concept itself is only there as the super-class of the three main kind of differences EMF Compare can detect in a model, namely 
			<i>ReferenceChange</i>, 
			<i>AttributeChange</i> and 
			<i>ResourceAttachmentChange</i>. We'll go back to these three sub-classes in a short while.
		</p>
		<p>Whatever their type, the differences share a number of common elements:</p>
		<ul>
			<li>a parent 
				<i>match</i>: differences are detected on a given 
				<i>Match</i>. Having a difference basically means that one of the elements paired through this 
				<i>Match</i> differs from its "reference" side (see 
				<i>source</i> description below). 
			</li>
			<li>a 
				<i>source</i>: differences are detected on one side of their match. The source really only holds meaning in three-way comparisons, where a difference can be detected in either right or left. All differences detected through two-way comparisons have their source in the left side. This is because we always compare according to a "reference" side. During two-way comparisons, the reference side is the right: differences will always be detected on the left side as compared with the right side. During three-way comparisons though, differences can be detected on either left or right side as compared with their common ancestor; but never as compared to themselves (in other words, this is 
				<i>roughly</i> equivalent to two two-way comparisons, first the left as compared to the origin, then the right as compared to the origin).
			</li>
			<li>a current 
				<i>state</i>: all differences start off in their initial 
				<i>unresolved</i> state. The user can then choose to:
				<ul>
					<li>merge the difference (towards either right or left, applying or reverting the difference in the process), in which case the difference becomes 
						<i>merged</i>, or
					</li>
					<li>discard it, thus marking the change as 
						<i>discarded</i>. For example, if there is a conflicting edit of a textual attribute, the user can decide that neither right nor left are satisfying, and instead settle for a mix of the two.
					</li>
				</ul>
			</li>
			<li>a 
				<i>kind</i>: this is used by the engine to describe the type of difference it detected. Differences can be of four general types:
				<ul>
					<li>
						<i>Add</i>: There are two distinct things that EMF Compare considers as an "addition". First, adding a new element within the values of a 
						<b>multi-valued feature</b> is undeniably an addition. Second, any change in a 
						<b>containment reference</b>, even if that reference is mono-valued, that represents a "new" element in the model is considered to be an addition. Note that this second case is an exception to the rule for 
						<i>change</i> differences outlined below.
					</li>
					<li>
						<i>Delete</i>: this is used as the counterpart of 
						<i>add</i> differences, and it presents the same exception for 
						<b>mono-valued containment references</b>.
					</li>
					<li>
						<i>Change</i>: any modification to a 
						<b>mono-valued feature</b> is considered as a 
						<i>change</i> difference by the engine. Take note that containment references are an exception to this rule: no 
						<i>change</i> will ever be detected on those.
					</li>
					<li>
						<i>Move</i>: once again, two distinct things are represented as 
						<i>move</i> differences in the comparison model. First, 
						<b>reordering</b> the values of a multi-valued feature is considered as a series of MOVE: one difference for each moved value (EMF Compare computes the smallest number of differences needed between the two sides' values). Second, moving an object from 
						<b>one container to another</b> (changing the containing feature of the EObject) will be detected as a 
						<i>move</i>.
					</li>
				</ul>
			</li>
		</ul>
		<p>In order to ensure that the model remains consistent through individual merge operations, we've also decided to link differences together through a number of associations and references. For example, there are times when one difference cannot be merged without first merging another, or some differences which are exactly equivalent to one another. In no specific order:</p>
		<ul>
			<li>
				<i>dependency</i>: EMF Compare uses two opposite references in order to track dependencies between differences. Namely, 
				<i>requires</i> and 
				<i>requiredBy</i> represent the two ends of this association. If the user has added a package 
				<i>P1</i>, then added a new Class 
				<i>C1</i> within this package, we will detect both differences. However the addition of 
				<i>C1</i> cannot be merged without first adding its container 
				<i>P1</i>. In such a case, the addition of 
				<i>C1</i> 
				<b>requires</b> the addition of 
				<i>P1</i>, and the later is 
				<b>requiredBy</b> the former.
			</li>
			<li>
				<i>refinement</i>: this link is mainly used by extensions of EMF Compare in order to create high-level differences to hide the complexity of the comparison model. For example, this is used by the UML extension of EMF Compare to tell that the three differences "adding an association 
				<i>A1</i>", "adding a property 
				<i>P1</i> in association 
				<i>A1</i>" and "adding a property 
				<i>P2</i> in association 
				<i>A1</i>" is actually one single high-level difference, "adding an association 
				<i>A1</i>". This high-level difference is 
				<b>refinedBy</b> the others, which all 
				<b>refines</b> it.
			</li>
			<li>
				<i>equivalence</i>: this association is used by the comparison engine in order to link together differences which are equivalent in terms of merging. For example, Ecore has a concept of 
				<b>eOpposite</b> references. Updating one of the two sides of an 
				<i>eOpposite</i> will automatically update the other. In such an event, EMF Compare will detect both sides as an individual difference. However, merging one of the two will trigger the update of the other side of the 
				<i>eOpposite</i> as well. In such cases, the two differences are set to be 
				<i>equivalent</i> to one another. Merging one difference part of an equivalence relationship will automatically mark all of the others as 
				<i>merged</i> (see 
				<i>state</i> above).
			</li>
			<li>
				<i>implication</i>: implications are a special kind of "directed equivalence". A difference D1 that is linked as "implied by" another D2 means that merging D1 requires us to merge D2 instead. In other words, D2 will be automatically merged if we merge D1, but D1 will not be automatically merged if we merge D2. Implications are mostly used with UML models, where subsets and supersets may trigger such linked changes.
			</li>
			<li>
				<i>conflict</i>: during three-way comparisons, we compare two versions of a given model with their common ancestor. We can thus detect changes that were made in either left or right side (see the description of 
				<i>source</i> above). However, there are cases when changes in the left conflict with changes in the right. For example, a class named "Book" in the origin model can have been renamed to "Novel" in the left model whereas it has been renamed to "Essay" in the right model. In such a case, the two differences will be marked as being in conflict with one another.
			</li>
		</ul>
		<p>As mentioned above, there are only three kind of differences that we will detect through EMF Compare, which will be sufficient for all use cases. 
			<i>ReferenceChange</i> differences will be detected for every value of a reference for which we detect a change. Either the value was added, deleted, or moved (within the reference or between distinct references). 
			<i>AttributeChange</i> differences are the same, but for attributes instead of references. Lastly, the 
			<i>ResourceAttachmentChange</i> differences, though very much alike the ReferenceChanges we create for containment references, are specifically aimed at describing changes within the roots of one of the compared resources.
		</p>
		<h4 id="Conflict">Conflict</h4>
		<p>
			<b>Conflict</b> will only be detected during three-way comparisons. There can only be "conflicts" when we are comparing two different versions of a same model along with their common ancestor. In other words, we need to able to compare two versions of a common element with a "reference" version of that element.
		</p>
		<p>There are many different kinds of conflicts; to name a few:</p>
		<ul>
			<li>changing an element on one side (in any way, for example, renaming it) whilst that element has been removed from the other side</li>
			<li>changing the same attribute of an element on both sides, to different values (for example, renaming "Book" to "Novel" on the left while be renamed "Book" to "Essay" on the right)</li>
			<li>creating a new reference to an element on one side whilst it had been deleted from the other side</li>
		</ul>
		<p>Conflicts can be of two kinds. We call 
			<i>PSEUDO</i> conflict a conflict where the two sides of a comparison have changed as compared to their common ancestor, but where the two sides are actually now equal. In other words, the end result is that the left is now equal to the right, even though they are both different from their ancestor. This is the opposite of 
			<i>REAL</i> conflict where the value on all three sides is different. In terms of merging, pseudo conflicts do not need any particular action, whilst real conflicts actually need resolution.
		</p>
		<p>There can be more than two differences conflicting with each other. For example, the deletion of an element from one side will most likely conflict with a number of differences from the other side.</p>
		<h4 id="Equivalence">Equivalence</h4>
		<p>EMF Compare uses 
			<b>Equivalence</b> elements in order to link together a number of differences which can ultimately be considered to be the same. For example, ecore's 
			<i>eOpposite</i> references will be maintained in sync with one another. As such, modifying one of the two references will automatically update the second one accordingly. The manual modification and the automatic update are two distinct modifications of the model, resulting in two differences detected. However, merging any of these two differences will automatically merge the other one. Therefore both are marked as being equivalent to each other.
		</p>
		<p>There can be more than two differences equivalent with each other; in which case all will be added to a single 
			<i>Equivalence</i> object, representing their relations.
		</p>
		<h2 id="Core_Concepts">Core Concepts</h2>
		<h3 id="Proxy_Resolution">Proxy Resolution</h3>
		<p>When cross-referencing objects from another resource, EMF may use proxies instead of the actual object. As long as you do not access the element in question, EMF does not need to load the resource in which it is contained. The proxy is kind of a placeholder that tells EMF what resource should be loaded, and which of this resource's objects is referenced, when we actually need to access its value.</p>
		<p>Proxy resolution is generally transparent, but a lot of tools based on EMF do not consider these proxies as first-class citizens: they simply resolve them without considering that they might not be needed. On the other hand, EMF Compare will never resolve proxies except for those strictly necessary. Whatever the phase of comparison, we strive to never hold the whole model in memory.</p>
		<p>The 
			<a href="#Model_Resolving">initial resolution phase</a> is the most intensive in terms of proxy resolution and I/O operations. Though we will never hold the whole logical model in memory at any given time, we do resolve all cross-references of the compared resources, on all sides of the comparison. Since the logical model may be located in a lot of different files on disk, it might also be very heavy in memory if loaded entirely. However, even if EMF Compare does resolve all fragments composing that logical model, it also unloads them as soon as the cross-references are registered. In other words, what we create is a dependency graph between the resources, not a loaded model. Afterwards, we only reload in memory those resources that have actually changed, and can thus contain differences. There will be proxies between these "changed" resources and the unchanged ones we have decided not to reload, but EMF Compare will never resolve these proxies again (and, in fact, will prevent other tools from resolving them).
		</p>
		<p>
			<b>Note:</b> At the time of writing, the user interface will never resolve any proxies either. This might change in the future for a better user experience since proxies usually end up displayed in strange manners.
		</p>
		<h3 id="Equality_Helper">Equality Helper</h3>
		<p>The equality helper is a very central concept of EMF Compare. Of course, EMF Compare's aim is to be able to compare objects together, objects whose comparison is not trivial and cannot be done through a mere "equal or not" concept. However, we still need to be able to compare these objects at all time and, whenever possible, without a full-fledged comparison.</p>
		<p>The equality helper will be used in all phases of the comparison, from matching to merging (please see the 
			<a href="#Comparison_Process">comparison process</a> for a bird's eye view of the different comparison phases, or their detailed descriptions down below). The matching phase is precisely the time when EMF Compare is trying to match the elements from one side to the elements from the other side, by pairs. As such, we do not have -yet- the knowledge of which element matches with which other. However, for all subsequent phases, the equality helper will rely on information from the comparison itself (the 
			<i>Match</i> elements) to make a fail-fast test for element 'equality'.
		</p>
		<p>When we do not have this information, the equality helper will resort to less optimal algorithms. For any object that is not an EMF EObject, we will use strict equality through 
			<i>==</i> and 
			<i>Object#equals()</i> calls. One of the cause for EMF Compare failing to match attribute values together is in fact the lack of implementation of the 
			<i>equals</i> method on custom datatypes (see the 
			<a href="./../FAQ.html#Custom_data_types_are_always_marked_as_modified_by_EMF_Compare" title="./../FAQ.html#Custom data types are always marked as modified by EMF Compare">FAQ</a> for more on that particular issue).
		</p>
		<p>
			<b>Note:</b> The equality helper is used 
			<i>extensively</i>, and any performance hit or improvement here will make a huge difference on the whole comparison process. Likewise, any mistake in a custom equality helper will introduce a lot of bugs.
		</p>
		<h3 id="Comparison_Scope">Comparison Scope</h3>
		<p>As seen above, EMF Compare considers proxies as first-class citizens of the EMF realm. This mainly shows in the matching mechanism. EMF Compare uses a scoping mechanism to determine which elements should be matched together, and which others should be ignored. Any element that is outside of the comparison scope will be ignored by the comparison engine and left alone (if it is a proxy, it won't even be loaded). This also means that we won't really have a way to compare these proxy (or otherwise out-of-scope values) when the Diff process encounters them.</p>
		<p>For example, an element that is outside of the comparison scope, but referenced by another element which 
			<i>is</i> in the scope will need specific comparison means: we've ignored it during the matching phase, so we don't know which 'out-of-scope' element corresponds to which 'other out-of-scope' element. Consider the following: in the first model, a package 
			<i>P1</i> contains another package 
			<i>P2</i>. In the right, a package 
			<i>P1' 
				<i> contains a package </i>P2' ''. We've told EMF Compare that ''P2
			</i> and 
			<i>P2' 
				<i> are out of the comparison scope. Now how do we determine that the reference from </i>P1
			</i> to 
			<i>P2</i> has changed (or, in this example, that it did not change)?
		</p>
		<p>This is a special case that is handled by the IEqualityHelper. Specifically, when such cases are encountered, EMF Compare falls back to using the URI of the two objects to check for equality. This behavior can be changed by customizing the IEqualityHelper (see 
			<a href="#Equality_Helper">above</a>).
		</p>
		<p>By default, the only thing that EMF Compare considers "out of scope" are Ecore's "EGenericType" elements. These are usually meaningless as far as comparison is concerned (as they are located in derived references and will be merged along with their "true" difference anyway). Please take note that, when used from the user interface, EMF Compare will narrow down the scope even further through the resolution of the 
			<a href="./../developer/logical-model.html" title="./../developer/logical-model.html">logical model</a> and determining which resources are actually candidates for differences.
		</p>
		<p>The comparison scope provides EMF Compare with information on the content of ResourceSets, Resources or EObjects, according to the entry point of the comparison. Take note that 
			<b>the scope is only used during the matching phase</b>. The differencing phase only uses the result of the matching phase to proceed.
		</p>
		<h3 id="Longest_Common_Subsequence">Longest Common Subsequence</h3>
		<p>PENDING description of the algorithm, why do we use it, references</p>
		<h2 id="Default_Behavior_and_Extensibility">Default Behavior and Extensibility</h2>
		<p>All main components of EMF Compare have been designed for extensibility. Some are only extensible when comparing models through your own actions, some can be customized globally for a given kind of model or metamodel... We'll outline the customization options of all 6 comparison phases in this section. (Any dead link? Report them on the 
			<a href="http://www.eclipse.org/forums/index.php/f/164/">forum</a>!)
		</p>
		<h3 id="Model_Resolving_2">Model Resolving</h3>
		<p>To adequately handle the comparison and merging of models that span across several resources (files), EMF Compare has to determine all dependencies among model resources in order to avoid breaking cross-references among model resources during a merge. It is not enough to only follow outgoing cross-references from model resources. Instead, EMF Compare needs to resolve outgoing and incoming cross-references to and from other model resources. Therefore, EMF Compare traverses through all model files within a configurable scope (container, project or the whole workspace in the EMF Compare preferences) before the comparison and merging, and tracks the dependencies among the visited model resources. The dependencies are stored and cached in terms of a graph, whereas nodes are model resources and edges are dependencies to other model resources. Based on this dependency graph, EMF Compare determines the set of model resources that must be included in a subsequent model comparison or merge.</p>
		<p>The default implementation of the model resolution is multi-threaded and can be found in the class 
			<i>org.eclipse.emf.compare.ide.ui.internal.logical.resolver.ThreadedModelResolver</i>.
		</p>
		<h4 id="Customization">Customization</h4>
		<p>The default implementation of the model resolution described above can be replaced completely with a custom implementation of a model resolver or it can be extended by registering custom dependency providers.</p>
		<h5 id="Model_Resolver_Extension_Point">Model Resolver Extension Point</h5>
		<p>The "modelResolvers" extension point in the "org.eclipse.emf.compare.ide.ui" plug-in allows to register custom model resolvers. These model resolvers replace the default implementation (ThreadedModelResolver) and can therefore implement their own strategy.</p>
		<p>
			<b>Note:</b> This extension point is currently in beta and may be removed in the future since the ThreadedModelResolver seems flexible enough to support all common usecases.
		</p>
		<p>The custom model resolver must implement the IModelResolver interface (
			<i>org.eclipse.emf.compare.ide.ui.logical.IModelResolver</i>) or extend the AbstractModelResolver (
			<i>org.eclipse.emf.compare.ide.ui.logical.AbstractModelResolver</i>).
		</p>
		<p>
			<b>Warning:</b> Replacing the default ThreadedModelResolver is NOT recommended since the logic to be implemented is very complex. Make sure there is no alternative way to reach your goal!
		</p>
		<h5 id="Model_Dependency_Provider_Extension_Point">Model Dependency Provider Extension Point</h5>
		<p>The "modelDependencyProvider" extension point in the "org.eclipse.emf.compare.ide.ui" plugin allows to extend the default model resolution mechanism. It allows to add additional custom dependencies for model resources that are not manifested in actual cross-references otherwise.</p>
		<p>
			<b>Note:</b> This extension point is currently in beta and may change in the future.
		</p>
		<p>The registered model dependency providers must implement the IDependencyProvider interface (
			<i>org.eclipse.emf.compare.ide.ui.dependency.IDependencyProvider</i>).
		</p>
		<p>The dependencies determined via the dependency providers are used in two ways in the default model resolver:</p>
		<ul>
			<li>The dependencies are resolved when the given URI is resolved</li>
			<li>The dependencies are added to the dependency graph</li>
		</ul>
		<p>This functionality can be used to express dependencies among model resources that exist "by design" but are not physically manifested in the model resources (as resolvable proxies). For example, this extension point is used by Papyrus to express a dependency between .di, .uml, and .notation files even if these model resources are not actually referencing each other.</p>
		<h3 id="Match_2">Match</h3>
		<p>Before we can compute differences between two versions of a same Object, we must determine which are actually the "same" Object. For example, let's consider that my first model contains a Package P1 which itself contains a class C1; and that my second model contains a package P1 which contains a class C1. It may seem obvious for a human reader that "P1" and "C1" are the same object in both models. However, since their features might have changed in-between the two versions (for example, the "C1" might now be abstract, or it could have been converted to an Interface), this "equality" is not that obvious for a computer.</p>
		<p>The goal of the "Match" phase is to discover which of the objects from model 2 match with which objects of model 1. In other words, this is when we'll say that two objects are one and the same, and that any difference between the two sides of this couple is actually a difference that should be reported as such to the user.</p>
		<p>By default, EMF Compare browses through elements that are within the scope, and matches them through their identifier if they have one, or through a distance mechanism for all elements that have none. If the scope contains resources, EMF Compare will first match those two-by-two before browsing through all of their contained objects.</p>
		<p>EMF Compare "finds" the identifier of a given object through a basic function that can be found in 
			<a href="http://git.eclipse.org/c/emfcompare/org.eclipse.emf.compare.git/tree/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/match/eobject/IdentifierEObjectMatcher.java#n268">IdentifierEObjectMatcher.DefaultIDFunction</a>. In short, if the object is a proxy, its identifier is its URI fragment. Otherwise its XMI ID (the identifier it was given in the XMI file) takes precedence over its functional ID (in ecore, an attribute that serves as an identifier). If the object is not a proxy and has neither XMI nor functional identifier, then the default behavior will simply pass that object over to the proximity algorithms so that it can be matched through its distance with other objects.
		</p>
		<p>PENDING: brief description of the proximity algorithm</p>
		<p>This behavior can be customized in a number of ways.</p>
		<h4 id="Overriding_the_Match_engine">Overriding the Match engine</h4>
		<p>The most powerful (albeit most cumbersome) customization you can implement is to override the match engine EMF Compare uses. To this end you can either implement the whole contract, [
			<a href="http://git.eclipse.org/c/emfcompare/org.eclipse.emf.compare.git/tree/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/match/IMatchEngine.java">http://git.eclipse.org/c/emfcompare/org.eclipse.emf.compare.git/tree/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/match/IMatchEngine.java</a> 
			<i>IMatchEngine</i>], in which case you will have to carefully follow the javadoc's recommendations, or extend the default implementation, [
			<a href="http://git.eclipse.org/c/emfcompare/org.eclipse.emf.compare.git/tree/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/match/DefaultMatchEngine.java">http://git.eclipse.org/c/emfcompare/org.eclipse.emf.compare.git/tree/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/match/DefaultMatchEngine.java</a> 
			<i>DefaultMatchEngine</i>].
		</p>
		<p>A custom match engine can be used for your model comparison needs:</p>
		<pre class="source-java">// for standalone usage
IMatchEngine.Factory.Registry registry = MatchEngineFactoryRegistryImpl.createStandaloneInstance();
// for OSGi (IDE, RCP) usage
// IMatchEngine.Factory.Registry registry = EMFCompareRCPPlugin.getMatchEngineFactoryRegistry();
final IMatchEngine customMatchEngine = new MyMatchEngine(...);
IMatchEngine.Factory engineFactory = new MatchEngineFactoryImpl() {
  public IMatchEngine getMatchEngine() {
    return customMatchEngine;
  }
};
engineFactory.setRanking(20); // default engine ranking is 10, must be higher to override.
registry.add(engineFactory);
EMFCompare.builder().setMatchEngineFactoryRegistry(registry).build().compare(scope);

</pre>
		<h4 id="Changing_how_resources_are_matched">Changing how resources are matched</h4>
		<p>By default, the logic EMF Compare uses to match resources together is very simple: if two resources have the same name (strict equality on the name, without considering folders), they match. When this is not sufficient, EMF Compare will look at the XMI ID of the resources' root(s). If the two resources share at least one root with an equal XMI ID, they match.</p>
		<p>This can be changed by just implementing your own subclass of the DefaultMatchEngine and overriding its resource matcher. The method of interest here is 
			<a href="http://git.eclipse.org/c/emfcompare/org.eclipse.emf.compare.git/tree/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/match/DefaultMatchEngine.java#n319">DefaultMatchEngine#createResourceMatcher()</a>.
		</p>
		<h4 id="Defining_custom_identifiers">Defining custom identifiers</h4>
		<p>In some cases, there might be ways to identify your objects via "identifiers" that cannot be recognized as such by the default mechanism. For example, you might want each of your objects to be matched through their name alone, or through the composition of their name and their type... This can be achieved through code by simply redefining the function used by EMF Compare to find the ID of an object. The following code will tell EMF Compare that the identifier of all "MyEObject" elements is their name, and that any other element should go through the default behavior.</p>
		<pre class="source-java">Function&lt;EObject, String&gt; idFunction = new Function&lt;EObject, String&gt;() {
	public String apply(EObject input) {
		if (input instanceof MyEObject) {
			return ((MyEObject)input).getName();
		}
		// a null return here tells the match engine to fall back to the other matchers
		return null;
	}
};
// Using this matcher as fall back, EMF Compare will still search for XMI IDs on EObjects
// for which we had no custom id function.
IEObjectMatcher fallBackMatcher = DefaultMatchEngine.createDefaultEObjectMatcher(UseIdentifiers.WHEN_AVAILABLE);
IEObjectMatcher customIDMatcher = new IdentifierEObjectMatcher(fallBackMatcher, idFunction);
 
IComparisonFactory comparisonFactory = new DefaultComparisonFactory(new DefaultEqualityHelperFactory());
 
IMatchEngine.Factory.Registry registry = MatchEngineFactoryRegistryImpl.createStandaloneInstance();
// for OSGi (IDE, RCP) usage
// IMatchEngine.Factory.Registry registry = EMFCompareRCPPlugin.getMatchEngineFactoryRegistry();
final MatchEngineFactoryImpl matchEngineFactory = new MatchEngineFactoryImpl(customIDMatcher, comparisonFactory);
matchEngineFactory.setRanking(20); // default engine ranking is 10, must be higher to override.
registry.add(matchEngineFactory);
Comparison result = EMFCompare.builder().setMatchEngineFactoryRegistry(registry).build().compare(scope);

</pre>
		<h4 id="Ignoring_identifiers">Ignoring identifiers</h4>
		<p>There are some cases where you do not want the identifiers of your elements to be taken into account when matching the objects. This can easily be done when computing comparisons programmatically:</p>
		<p>
			<b>Through code</b>
		</p>
		<pre class="source-java">IMatchEngine.Factory.Registry registry === MatchEngineFactoryRegistryImpl.createStandaloneInstance();
// for OSGi (IDE, RCP) usage
// IMatchEngine.Factory.Registry registry === EMFCompareRCPPlugin.getMatchEngineFactoryRegistry();
final MatchEngineFactoryImpl matchEngineFactory = new MatchEngineFactoryImpl(UseIdentifiers.NEVER);
matchEngineFactory.setRanking(20); // default engine ranking is 10, must be higher to override.
registry.add(matchEngineFactory);

Comparison result = EMFCompare.builder().setMatchEngineFactoryRegistry(registry).build().compare(scope);

</pre>
		<p>
			<b>From the user interface</b>
		</p>
		<p>PENDING: preference page</p>
		<h4 id="Refine_the_default_Match_result">Refine the default Match result</h4>
		<p>If you are happy with most of what the default behavior does, but would like to refine some of it, you can do so by post-processing the result of the match phase. The original models are only used when matching, and will never be queried again afterwards. All the remaining phases are incremental refinements of the "Comparison" model that's been created by the matching phase.</p>
		<p>As such, you can impact all of the differencing process through this. Within this post-processing implementation, you can:</p>
		<dl>
			<dt>Remove 
				<i>Match</i> elements
			</dt>
			<dd>no difference will be detected on those: neither additions, nor deletions, nor conflicts... They'll simply be entirely ignored by the remaining process. Do note that elements for which we have no match will be considered "distinct" by the innards of EMF Compare: if a couple "B&lt;-&gt;B'" references a couple "C&lt;-&gt;C'" through one of their references, but you have removed the 
				<i>Match</i> "C&lt;-&gt;C'", we will consider that this reference has been "changed" from C to C' and this difference within the references of B will be shown as such.
			</dd>
			<dt>Add new 
				<i>Match</i> element
			</dt>
			<dd>the new couples of elements will be considered by the remaining comparison process and difference may be detected on them.</dd>
			<dt>Change existing 
				<i>Match</i> elements
			</dt>
			<dd>unmatched elements have two or three associated 
				<i>Match</i> objects. For example if you are comparing three version of a model which all contain a different version of a given package, and all three version change the name of this package: version 1 has package "P1", version 2 has package "P2" and version three has package "P3". This package is actually the same, but EMF Compare did not manage to match it. We will thus have three 
				<i>Match</i> objects: one that references "P1" as 
				<i>left</i>, one that references "P2" as 
				<i>right</i> and one that references "P3" as 
				<i>origin</i>.
			</dd>
			<dd>You may remove two of those three elements and change the third one so that it references P1 as 
				<i>left</i>, P2 as 
				<i>right</i> and P3 as 
				<i>origin</i>. In such a case, those three will be considered to Match for the remainder of the comparison process. Make sure that there are not two different 
				<i>Match</i> referencing the same object though, as this would yield unspecified results.
			</dd>
		</dl>
		<p>Defining a custom post-processor requires you to implement 
			<a href="http://git.eclipse.org/c/emfcompare/org.eclipse.emf.compare.git/tree/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/postprocessor/IPostProcessor.java">IPostProcessor</a> and registering this sub-class against EMF Compare. The latter can be done via either an extension point, in which case it will be considered for 
			<b>all</b> comparisons on models that match its enablement, or programmatically if you only want it active for your own actions:
		</p>
		<p>
			<b>Through code</b>
		</p>
		<p>The following registers a post-processor for all UML models. This post-processor will not be triggered if there are no UML models (matching the given namespace URI) within the compared scope.</p>
		<pre class="source-java">IPostProcessor customPostProcessor = new CustomPostProcessor();
IPostProcessor.Descriptor descriptor = new BasicPostProcessorDescriptorImpl(customPostProcessor, Pattern.compile("http://www.eclipse.org/uml2/\\d\\.0\\.0/UML"), null);

PostProcessor.Registry registry = new PostProcessorDescriptorRegistryImpl();
registry.put(CustomPostProcessor.class.getName(), descriptor);
Comparison comparison = EMFCompare.builder().setPostProcessorRegistry(registry).build().compare(scope);

</pre>
		<p>
			<b>Through extension point</b>
		</p>
		<p>This accomplishes the exact same task, but it registers the post-processor globally. Any comparison through EMF Compare on a scope that contains models matching the given namespace URI will trigger that post-processor.</p>
		<pre class="source-xml">&lt;extension point="org.eclipse.emf.compare.rcp.postProcessor"&gt;
      &lt;postProcessor class="my.package.CustomPostProcessor"&gt;
         &lt;nsURI value="http://www.eclipse.org/uml2/\\d\\.0\\.0/UML"&gt;
         &lt;/nsURI&gt;
      &lt;/postProcessor&gt;

</pre>
		<h3 id="Diff_2">Diff</h3>
		<p>Now that the Matching phase has completed and that we know how our objects are coupled together, EMF Compare no longer requires the two (or three) input models. It will no longer iterate over them or the comparison's input scope. From this point onward, only the result of our comparison, the 
			<i>Comparison</i> object, will be refined through the successive remaining phases, starting with the 
			<b>Diff</b>.
		</p>
		<p>The goal of this phase is to iterate over all of our 
			<i>Match</i> elements, be they unmatched (only one side has this object), couples (two of the three sides contain this object) or trios (all three sides have this object) and compute any difference that may appear between the sides. For example, an object that is only on one side of the comparison is an object that has been added, or deleted. But a couple might also represent a deletion: during three way comparisons, if we have an object in the common ancestor (origin) and in the left side, but not in the right side, then it has been deleted from the right version. However, this latter example might also be a conflict: we have determined that the object has been removed from the right side... but there might also be differences between the original version and the "left" version.
		</p>
		<p>The differencing phase does not care about conflicts though: all it does is refine the comparison to tell that this particular 
			<i>Match</i> has 
			<i>n</i> diffs: one 
			<i>DELETE</i> difference on the right side, and 
			<i>n</i> differences on the left. Detecting conflicts between these differences will come at a later time, during the conflict resolution phase.
		</p>
		<p>Customizations of this phase usually aim at ignoring specific differences.</p>
		<h4 id="Overriding_the_Diff_engine">Overriding the Diff engine</h4>
		<p>As is the case for the Match phase, the most powerful customization you can implement for the differencing process is to override the diff engine EMF Compare uses. To this end you can either implement the whole contract, [
			<a href="http://git.eclipse.org/c/emfcompare/org.eclipse.emf.compare.git/tree/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/diff/IDiffEngine.java">http://git.eclipse.org/c/emfcompare/org.eclipse.emf.compare.git/tree/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/diff/IDiffEngine.java</a> 
			<i>IDiffEngine</i>], in which case you will have to carefully follow the javadoc's recommendations, or extend the default implementation, [
			<a href="http://git.eclipse.org/c/emfcompare/org.eclipse.emf.compare.git/tree/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/diff/DefaultDiffEngine.java">http://git.eclipse.org/c/emfcompare/org.eclipse.emf.compare.git/tree/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/diff/DefaultDiffEngine.java</a> 
			<i>DefaultDiffEngine</i>].
		</p>
		<p>A custom diff engine can then be used for your comparisons:</p>
		<pre class="source-java">IDiffEngine customDiffEngine = new MyDiffEngine(...);
EMFCompare.builder().setDiffEngine(customDiffEngine).build().compare(scope);

</pre>
		<h4 id="Changing_the_FeatureFilter">Changing the FeatureFilter</h4>
		<p>One of the differencing engine's responsibilities is to iterate over all features of a given object in order to check for potential differences on its value(s). However, there are some features that we decide to ignore by default: derived features, transient features... or some features on which we would like to check for ordering changes even though they are marked as non-ordered.</p>
		<p>The logic to determine whether a feature should be checked for differences has been extracted into its own class, and is quite easy to alter. For example, if you would like to ignore the 
			<i>name</i> feature of your elements or never detect any ordering change:
		</p>
		<pre class="source-java">IDiffProcessor diffProcessor = new DiffBuilder();
IDiffEngine diffEngine = new DefaultDiffEngine(diffProcessor) {
	@Override
	protected FeatureFilter createFeatureFilter() {
		return new FeatureFilter() {
			@Override
			protected boolean isIgnoredReference(Match match, EReference reference) {
				return reference ==== EcorePackage.Literals.ENAMED_ELEMENT__NAME ||
						super.isIgnoredReference(match, reference);
			}

			@Override
			public boolean checkForOrderingChanges(EStructuralFeature feature) {
				return false;
			}
		};
	}
};
EMFCompare.builder().setDiffEngine(diffEngine).build().compare(scope);

</pre>
		<p>You could also 
			<a href="#Changing_the_Diff_Processor">change the diff processor</a> to achieve a similar goal. The difference between the two approaches is that changing the 
			<i>FeatureFilter</i> will ignore the structural feature altogether, whereas replacing the diff processor would let EMF Compare check the feature and detect that diff, but ignore the notification that there is a change.
		</p>
		<h4 id="Changing_the_Diff_Processor">Changing the Diff Processor</h4>
		<p>The diff engine browses over all of the objects that have been matched, and checks all of their features in order to check for changes between the two (or three) versions' feature values. When it detects a change, it delegates all of the corresponding information to its associated 
			<i>Diff Processor</i>, which is in charge of actually creating the 
			<i>Diff</i> object and appending it to the resulting 
			<i>Comparison</i>.
		</p>
		<p>Replacing the 
			<i>Diff Processor</i> gives you a simple entry point to ignore some of the differences the default engine detects, or to slightly alter the 
			<i>Diff</i> information. You might want to ignore the differences detected on some references for example. Or you might want to react to the detected diff without actually creating the 
			<i>Comparison</i> model... The implementation is up to you. You can either re-implement the 
			<a href="http://git.eclipse.org/c/emfcompare/org.eclipse.emf.compare.git/tree/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/diff/IDiffProcessor.java">whole contract</a> or extend the default implementation, [
			<a href="http://git.eclipse.org/c/emfcompare/org.eclipse.emf.compare.git/tree/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/diff/DiffBuilder.java">http://git.eclipse.org/c/emfcompare/org.eclipse.emf.compare.git/tree/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/diff/DiffBuilder.java</a> 
			<i>DiffBuilder</i>]
		</p>
		<p>Here is a simple example that provides EMF Compare with a diff processor that will ignore all differences detected on the "name" attribute of our objects, yet keep the default behavior for all other differences.</p>
		<pre class="source-java">IDiffProcessor customDiffProcessor = new DiffBuilder() {
	@Override
	public void attributeChange(Match match, EAttribute attribute, Object value, DifferenceKind kind, DifferenceSource source) {
		if (attribute !== EcorePackage.Literals.ENAMED_ELEMENT__NAME) {
			super.attributeChange(match, attribute, value, kind, source);
		}
	}
};

IDiffEngine diffEngine = new DefaultDiffEngine(customDiffProcessor);
EMFCompare.builder().setDiffEngine(diffEngine).build().compare(scope);

</pre>
		<h4 id="Refine_the_default_Diff_result">Refine the default Diff result</h4>
		<p>The last possibility offered by EMF Compare to alter the result of the differencing phase is to post-process it. The remaining comparison phases -equivalence detection, detection of dependencies between diffs and conflict detection- all use the result of the Diff engine and refine it even further. As such, all of these phases can be impacted through the refining of the Diff result.</p>
		<p>Example uses of the post-processing would include:</p>
		<dl>
			<dt>Remove 
				<i>Diff</i> elements
			</dt>
			<dd>If you'd rather code your logic to ignore differences here as a post-process instead of changing the 
				<i>FeatureFilter</i> or 
				<i>IDiffProcessor</i>. Though that is not the best way to ignore differences, it can still be done here.
			</dd>
		</dl>
		<dl>
			<dt>Add new 
				<i>Diff</i> elements
			</dt>
			<dd>If you want to create new differences without implementing a whole differencing engine, new differences can still be created here as a post-process. You will need to implement the iteration over model elements and specific checks yourself though. This workaround can also be used to create new differences that the default differencing engine does not know.</dd>
		</dl>
		<dl>
			<dt>Alter the detected differences</dt>
			<dd>If some of the differences have been detected in a way you do not like, and you did not use a custom 
				<i>IDiffProcessor</i> to change the 
				<i>Diff</i> information, you can do so here.
			</dd>
		</dl>
		<p>The post-processor for the diff engine is implemented exactly in the same way as for the match engine post-processors (the interface and extension point are the same). Please refer to 
			<a href="#Refine_the_default_Match_result">Refining the Match result</a>.
		</p>
		<h3 id="Equivalences_2">Equivalences</h3>
		<p>Now that the Differencing phase has ended, we've computed all of the individual differences within the compared models. However, all of these differences are still isolated, we now need to determine if there are any connections between them.</p>
		<p>An 
			<i>equivalence</i> is one kind of potential connections between differences. For example, Ecore has a concept of 
			<i>eOpposite</i> references, which are maintained in sync with one another. Modifying one of the two references will automatically update the other side of the opposition accordingly. Both the manual modification and the automatic update are considered as distinct modifications of the model when looking at it after the fact, resulting in two differences detected. However, merging any of these two differences will automatically merge the other one. Therefore, both are marked as being 
			<i>equivalent</i> to each other.
		</p>
		<p>Though that is an example with two, more than two differences can be considered equivalent with each other. When we merge one difference, all of the other diffs that have been marked as being equivalent to it will be marked as 
			<i>MERGED</i>, though no actual work needs to be done to merge them : EMF will have automatically updated them when merging the first.
		</p>
		<p>Do note that EMF Compare detects and understand two different kind of relations that could be considered "equivalences". Described above are plain equivalences, when merging one of the differences will automatically update the model in such a way that all other sides of the equivalence are redundant and automatically merged. However, equivalences might not always be that easy. Let's take for example the case of UML : UML has concepts of 
			<i>subset</i> and 
			<i>superset</i> references. Adding an object into a subset will automatically update the related superset so that it also contains the added element. However, adding that same element to the superset will _not_ automatically update the related subset.
		</p>
		<p>This can be seen as a "directional" equivalence, where one difference D1 
			<i>implies</i> another D2, but is not 
			<i>implied by</i> D2. Implications will be detected at the same time as the equivalences, but they do not use an 
			<i>Equivalence</i> element, they are filled under the 
			<i>Diff#implies</i> reference instead.
		</p>
		<h4 id="Refine_the_default_equivalences">Refine the default equivalences</h4>
		<p>This phase does not offer as many customization options as the previous ones; though post-processing should be enough for most needs. All of the phases that come after the differencing are further refinements of the comparison model, totally independent from one another. From here, any client of the API can refine the comparison model any way he'd like to, even by removing all of the default results.</p>
		<p>A few examples of customizations that could be made from here :</p>
		<dl>
			<dt>Partly break existing equivalences</dt>
			<dd>You can modify the equivalences we've detected by default by removing elements from individual differences' equivalences (Diff#getEquivalence()) or by changing the 
				<i>Equivalence</i> elements directly.
			</dd>
			<dt>Remove existing 
				<i>Equivalence</i> elements
			</dt>
			<dd>If you'd rather remove the 
				<i>Equivalence</i> elements altogether, it can also be done from here without impact down the line. The individual differences will be merged individually (potentially twice if EMF automatically updates the references) if the mergers do not have this to tell them what's equivalent to what.
			</dd>
			<dt>Detect your own equivalences</dt>
			<dd>If you have specific rules on your metamodel or implementation that make some differences redundant or otherwise fully equivalent to one another, you can add your own equivalences from here.</dd>
		</dl>
		<p>The post-processor for the equivalence detection engine is implemented exactly in the same way as for the match engine post-processors (the interface and extension point are the same). Please refer to 
			<a href="#Refine_the_default_Match_result">Refining the Match result</a>.
		</p>
		<h3 id="Requirements_2">Requirements</h3>
		<p>A requirement will be used to deal with structural constraints (to prevent dangling references or objects without parent) and to insure the model integrity.
			A difference requires other ones if the merge of this one needs the other ones not to "break" the model.
			The merge of a difference involves the merge of the required differences. All these differences will be merged by EMF Compare.
			For example, the add of a reference requires the add of the referenced object and the add of the object containing this reference.</p>
		<table border="1" cellpadding="1" cellspacing="1">
			<tr>
				<th align="center">Change kind</th>
				<th align="center">Reference kind to a graphical object</th>
				<th align="left">&nbsp; Requires:</th>
			</tr>
			<tr>
				<td align="center" rowspan="2">ADD</td>
				<td align="center">content</td>
				<td>&nbsp; ADD of its container
					<br/>&nbsp; DELETE of the origin value on the same containment mono-valued reference
				</td>
			</tr>
			<tr>
				<td align="center">reference</td>
				<td>&nbsp; ADD of the target object
					<br/>&nbsp; ADD of the source object e.g. The ADD of a reference to the target or source of an edge requires the ADD of the edge itself and the ADD of the target and source objects, the ADD of a reference to the semantic object from a graphical one requires the ADD of the graphical and semantic object.
				</td>
			</tr>
			<tr>
				<td align="center">DELETE</td>
				<td align="center">content</td>
				<td>&nbsp; DELETE of the outgoing references and contained objects
					<br/>&nbsp; DELETE/CHANGE of the incoming references
					<br/>&nbsp; MOVE of the contained objects
				</td>
			</tr>
			<tr>
				<td align="center">MOVE</td>
				<td align="center">content</td>
				<td>&nbsp; ADD of the new container of the object
					<br/>&nbsp; MOVE of the new container of the object
				</td>
			</tr>
			<tr>
				<td align="center">CHANGE</td>
				<td align="center">reference permutation</td>
				<td>&nbsp; ADD of the target object</td>
			</tr>
		</table>
		<p>Requirements can be added during a post-process.</p>
		<h3 id="Refinement">Refinement</h3>
		<p>A refinement enables to group a set of unit differences into a macroscopic change.

			<br/>A unit difference refines a macroscopic one if it belongs to this macroscopic change. In other words, a macroscopic change is refined by a set of unit differences.

			<br/>The merge of a macroscopic change involves the merge of the refining differences. All these differences will be merged by EMF Compare.

			<br/>The use of the refinement allows to improve (simplify) the reading of the comparison from a business viewpoint, to accelerate the manual merging for the end-user and to insure some consistency.

			<br/>For example, the add of an association, in UML, is refined by the add of the UML Association itself but also the add of the UML properties with the update of references...
		</p>
		<p>Refinement can be added during a post-process.</p>
		<h3 id="Conflicts_2">Conflicts</h3>
		<p>PENDING description of the phase, extensibility options (post-process)</p>
		<h3 id="Merging">Merging</h3>
		<h4 id="Which_references_are_followed_during_merging">Which references are followed during merging</h4>
		<table border="1">
			<tr>
				<th>&nbsp; </th>
				<th>Merge from Left to Right</th>
				<th>Merge from Right to Left</th>
			</tr>
			<tr>
				<th>Source = Left</th>
				<td align="center">requires  </td>
				<td align="center">requiredBy  </td>
			</tr>
			<tr>
				<th>Source = Right</th>
				<td align="center">requiredBy  </td>
				<td align="center">requires  </td>
			</tr>
		</table>
		<p>PENDING how to provide custom mergers, override existing ones?</p>
		<h3 id="User_Interface">User Interface</h3>
		<h4 id="Add_your_own_filter">Add your own filter</h4>
		<p>You can provide your own filters by adding an extension of type 
			<i>org.eclipse.emf.compare.rcp.ui.filters</i> to your plugin.
		</p>
		<p>
			<img align="middle" border="0" src="./../images/EMF_Compare_Developer_New_Extension_Filter.png"/>
		</p>
		<p>This extension has the following fields:</p>
		<ul>
			<li>class: a class that implements 
				<i>org.eclipse.emf.compare.rcp.ui.structuremergeviewer.filters.IDifferenceFilter</i>
			</li>
			<li>label: the label that will be displayed in the UI.</li>
			<li>activeByDefault: true if you want your filter be active by default, false otherwise.</li>
			<li>description: A human-readable description for this filter. It will be displayed in the EMF Compare UI.</li>
		</ul>
		<p>The 
			<i>org.eclipse.emf.compare.rcp.ui.structuremergeviewer.filters.IDifferenceFilter</i>'s contract is:
		</p>
		<pre class="source-java">/**
 * Instances of this class will be used by EMF Compare in order to provide difference filter facilities to the
 * structural differences view.
 * @since 4.0
 */
public interface IDifferenceFilter {

	/**
	 * Returns the predicate that will filter out objects in the structural differences view when this filter
	 * will be selected.
	 * 
	 * @return the predicate that will filter out objects in the structural differences view when this filter
	 *         will be selected.
	 */
	Predicate&lt;? super EObject&gt; getPredicateWhenSelected();

	/**
	 * Returns the predicate that will filter out objects in the structural differences view when this filter
	 * will be unselected.
	 * 
	 * @return the predicate that will filter out objects in the structural differences view when this filter
	 *         will be unselected.
	 */
	Predicate&lt;? super EObject&gt; getPredicateWhenUnselected();

	/**
	 * A human-readable label for this filter. This will be displayed in the EMF Compare UI.
	 * 
	 * @return The label for this filter.
	 */
	String getLabel();

	/**
	 * Set the label for this filter. This will be displayed in the EMF Compare UI.
	 * 
	 * @param label
	 *            A human-readable label for this filter.
	 */
	void setLabel(String label);

	/**
	 * Returns the initial activation state that the filter should have.
	 * 
	 * @return The initial activation state that the filter should have.
	 */
	boolean defaultSelected();

	/**
	 * Set the initial activation state that the filter should have.
	 * 
	 * @param defaultSelected
	 *            The initial activation state that the filter should have (true if the filter should be
	 *            active by default).
	 */
	void setDefaultSelected(boolean defaultSelected);

	/**
	 * Returns the activation condition based on the scope and comparison objects.
	 * 
	 * @param scope
	 *            The scope on which the filter will be applied.
	 * @param comparison
	 *            The comparison which is to be displayed in the structural view.
	 * @return The activation condition based on the scope and comparison objects.
	 */
	boolean isEnabled(IComparisonScope scope, Comparison comparison);
}

</pre>
		<p>A default abstract implementation named 
			<i>org.eclipse.emf.compare.rcp.ui.structuremergeviewer.filters.impl.AbstractDifferenceFilter</i> is available in the 
			<i>org.eclipse.emf.compare.rcp.ui</i> plugin. With this abstract implementation, all you have to do is to subclass it and implements the 
			<i>getPredicateWhenSelected()</i> method.
		</p>
		<h4 id="Add_your_own_group">Add your own group</h4>
		<p>You can provide your own groups by adding an extension of type 
			<i>org.eclipse.emf.compare.rcp.ui.groups</i> to your plugin.
		</p>
		<p>
			<img align="middle" border="0" src="./../images/EMF_Compare_Developer_New_Extension_Group.png"/>
		</p>
		<p>This extension has three fields:</p>
		<ul>
			<li>class: a class that implements 
				<i>org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider</i>
			</li>
			<li>label: the label that will be displayed in the UI.</li>
			<li>description: A description of the group. (Used in interface)</li>
			<li>rank: The rank of the group. The highest rank enabled for a comparison is used. ( Default value : 0)</li>
			<li>type: Type of comparison this group can handle (Default value: BOTH).
				<ul>
					<li>THREE_WAY: This group can only handle three way comparison.</li>
					<li>TWO_WAY: This group can handle two way comparison.</li>
					<li>BOTH: This group can handle two and three way comparisons.</li>
				</ul>
			</li>
		</ul>
		<p>The 
			<i>org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider</i>'s contract is:
		</p>
		<pre class="source-java">/**
 * Instances of this class will be used by EMF Compare in order to provide difference grouping facilities to
 * the structural differences view.
 * @since 4.0
 */
public interface IDifferenceGroupProvider extends Adapter {

	/**
	 * This will be called internally by the grouping actions in order to determine how the differences should
	 * be grouped in the structural view.
	 * 
	 * @param comparison
	 *            The comparison which is to be displayed in the structural view. By default, its containment
	 *            tree will be displayed.
	 * @return The collection of difference groups that are to be displayed in the structural viewer. An empty
	 *         group will not be displayed at all. If {@code null}, we'll fall back to the default behavior.
	 */
	Collection&lt;? extends IDifferenceGroup&gt; getGroups(Comparison comparison);

	/**
	 * A human-readable label for this group. This will be displayed in the EMF Compare UI.
	 * 
	 * @return The label for this group.
	 */
	String getLabel();

	/**
	 * Set the label for this group. This will be displayed in the EMF Compare UI.
	 * 
	 * @param label
	 *            A human-readable label for this group.
	 */
	void setLabel(String label);

	/**
	 * Returns the initial activation state that the group should have.
	 * 
	 * @return The initial activation state that the group should have.
	 */
	boolean defaultSelected();

	/**
	 * Set the initial activation state that the group should have.
	 * 
	 * @param defaultSelected
	 *            The initial activation state that the group should have (true if the group should be active
	 *            by default).
	 */
	void setDefaultSelected(boolean defaultSelected);

	/**
	 * Returns the activation condition based on the scope and comparison objects.
	 * 
	 * @param scope
	 *            The scope on which the group provider will be applied.
	 * @param comparison
	 *            The comparison which is to be displayed in the structural view.
	 * @return The activation condition based on the scope and comparison objects.
	 */
	boolean isEnabled(IComparisonScope scope, Comparison comparison);

	/**
	 * Dispose this difference group provider.
	 */
	void dispose();
	
	/**
	 * Returns all {@link TreeNode}s that are wrapping the given {@code eObject}. It internally use a cross
	 * reference adapter.
	 * 
	 * @param eObject
	 *            the object from which we want inverse reference.
	 * @return all {@link TreeNode}s targeting the given {@code eObject} through
	 *         {@link TreePackage.Literals#TREE_NODE__DATA}.
	 */
	List&lt;TreeNode&gt; getTreeNodes(EObject eObject);
}

</pre>
		<p>An 
			<i>IDifferenceGroupProvider</i> provides a set of 
			<i>IDifferenceGroup</i>.
			A group provider's default abstract implementation named 
			<i>org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.impl.AbstractDifferenceGroupProvider</i> is available in the 
			<i>org.eclipse.emf.compare.rcp.ui</i> plugin. With this abstract implementation, all you have to do is to subclass it and implements the 
			<i>getGroups()</i> method.
		</p>
		<p>For example, the 
			<i>By Kind</i> group provider has 4 groups: Additions, Deletions, Changes and Moves.
		</p>
		<p>A group's default implementation named 
			<i>org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.BasicDifferenceGroupImpl</i> is available in the 
			<i>org.eclipse.emf.compare.rcp.ui</i> plugin. With this default implementation, all you have to do is to subclass it and overrides the 
			<i>getChildren()</i> method.
			Note that default implementation is 
			<i>internal</i> and subject to modifications.
		</p>
		<h4 id="Customize_display_of_differences_inside_an_existing_group">Customize display of differences inside an existing group</h4>
		<p>You can customize display of differences inside an existing group by adding an extension of type 
			<i>org.eclipse.emf.compare.rcp.ui.differenceGroupExtender</i> to your plugin.
		</p>
		<p>
			<img align="middle" border="0" src="./../images/EMF_Compare_Developer_New_Extension_Extender.png"/>
		</p>
		<p>This extension has one field:</p>
		<ul>
			<li>class: a class that implements 
				<i>org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.extender.IDifferenceGroupExtender</i>
			</li>
		</ul>
		<p>The 
			<i>org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.extender.IDifferenceGroupExtender</i>'s contract is:
		</p>
		<pre class="source-java">/**
 * Instances of this class will be used by EMF Compare in order to extend the children of TreeNodes containing
 * in the structure merge viewer.
 * 
 * @since 4.0
 */
public interface IDifferenceGroupExtender {

	/**
	 * Checks if the given TreeNode have to be handled by the extender.
	 * 
	 * @param treeNode
	 *            the given TreeNode.
	 * @return true if the TreeNode have to be handled, false otherwise.
	 */
	boolean handle(TreeNode treeNode);

	/**
	 * Add children to the given TreeNode.
	 * 
	 * @param treeNode
	 *            the given TreeNode.
	 */
	void addChildren(TreeNode treeNode);
}

</pre>
		<p>There is no default implementation of extender. Examples of extender implementations are available in the 
			<i>org.eclipse.emf.compare.diagram.ide.ui</i> plugin.
		</p>
		<h4 id="Add_your_own_accessor_factory">Add your own accessor factory</h4>
		<p>You can add your own accessor factory by adding an extension of type 
			<i>org.eclipse.emf.compare.rcp.ui.accessorFactory</i> to your plugin.
		</p>
		<p>
			<img align="middle" border="0" src="./../images/EMF_Compare_Developer_New_Extension_AccessorFactory.png"/>
		</p>
		<p>This extension has one field:</p>
		<ul>
			<li>class: a class that implements 
				<i>org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.factory.IAccessorFactory</i>
			</li>
			<li>ranking : the ranking of this accessor factory.</li>
		</ul>
		<p>The 
			<i>org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.factory.IAccessorFactory</i>'s contract is:
		</p>
		<pre class="source-java">/**
 * A factory of {@link ITypedElement}s.
 * 
 * @since 4.0
 */
public interface IAccessorFactory {

	/**
	 * Checks if the target object is applicable to the factory.
	 * 
	 * @param target
	 *            the object for which we want to know if it is applicable to the factory.
	 * @return true if the object is applicable to the factory, false otherwise.
	 */
	boolean isFactoryFor(Object target);

	/**
	 * The ranking of the factory.
	 * 
	 * @return the ranking of the factory.
	 */
	int getRanking();

	/**
	 * Set the ranking of the factory.
	 * 
	 * @param value
	 *            the ranking value.
	 */
	void setRanking(int value);

	/**
	 * Creates an {@link ITypedElement} from an {@link AdapterFactory} and a given object. This accessor is
	 * specific for the left side of the comparison.
	 * 
	 * @param adapterFactory
	 *            the given adapter factory.
	 * @param target
	 *            the given object.
	 * @return an ITypedElement.
	 */
	ITypedElement createLeft(AdapterFactory adapterFactory, Object target);

	/**
	 * Creates an {@link ITypedElement} from an {@link AdapterFactory} and a given object. This accessor is
	 * specific for the right side of the comparison.
	 * 
	 * @param adapterFactory
	 *            the given adapter factory.
	 * @param target
	 *            the given object.
	 * @return an ITypedElement.
	 */
	ITypedElement createRight(AdapterFactory adapterFactory, Object target);

	/**
	 * Creates an {@link ITypedElement} from an {@link AdapterFactory} and a given object. This accessor is
	 * specific for the ancestor side of the comparison.
	 * 
	 * @param adapterFactory
	 *            the given adapter factory.
	 * @param target
	 *            the given object.
	 * @return an ITypedElement.
	 */
	ITypedElement createAncestor(AdapterFactory adapterFactory, Object target);
}

</pre>
		<p>An ITypedElement is an interface for getting the name, image, and type for an object. An ITypedElement is used to present an input object in the compare UI (getName and getImage) and for finding a viewer for a given input type (getType).</p>
		<p>There is no default implementation of accessor factory. Examples of accessor factories implementations are available in the 
			<i>org.eclipse.emf.compare.rcp.ui</i> plugin. There is several existing accessor factories in EMF Compare: for Matches, ReferenceChanges, AttibuteChanges, ResourceAttachmentChanges...
		</p>
		<p>PENDING customize display of custom differences, add custom menu entries, add export options, provide custom content viewer</p>
		<h2 id="Using_The_Compare_APIs">Using The Compare APIs</h2>
		<p>The main entry point of EMF Compare is the 
			<i>org.eclipse.emf.compare.EMFCompare</i> class. It is what should be used in order to configure and launch a comparison. That is not all though. Once you have compared two models, you want to query the differences, maybe merge some of them, display the comparison result in the comparison editor... The following section will list the main entry points for each of these actions, along with a brief description of what can be done and what should be avoided.
		</p>
		<p>Most of these examples are set-up as "standalone" examples, and will include extra instructions for IDE use: pay attention to the environment in which you are using EMF Compare. Are you using it from an Eclipse plugin, in which case you'd like all of the extra features provided through extension points and contribution to be available to you? Or are you using it from a standalone environment, in which case you'd need to reduce the dependencies to the bare minimum and avoid OSGi-related code and extensions?</p>
		<h3 id="Compare_two_models">Compare two models</h3>
		<h4 id="Loading_your_models">Loading your models</h4>
		<p>Whether you wish to compare two or three models, the first thing you need is to load them. We won't detail in-depth how to do that as this is standard EMF practice, you might want to look at EMF tutorial for detailed instructions on this point. Here, we'll use a simple method that loads an xmi file at a given URL into a resourceSet, expecting the given URL to be an absolute file URL:</p>
		<pre class="source-java">public void load(String absolutePath, ResourceSet resourceSet) {
  URI uri = URI.createFileURI(absolutePath);

  resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("xmi", new XMIResourceFactoryImpl());

  // Resource will be loaded within the resource set
  resourceSet.getResource(uri, true);
}

</pre>
		<h4 id="Creating_the_comparison_scope">Creating the comparison scope</h4>
		<p>EMF Compare uses a scoping mechanism to determine which elements should be compared, and which others should be ignored. Any element that is outside of the comparison scope will be ignored by the comparison engine and left alone (if it is a proxy, it won't even be loaded). As such, extra care should be taken to determine the proper scope of the comparison or customize the IEqualityHelper to handle the specific elements you remove from the scope. Refer to the 
			<a href="#Comparison_Scope">appropriate section</a> above for more on the scoping mechanism.
		</p>
		<p>By default, the only thing that EMF Compare considers "out of scope" are Ecore's "EGenericType" elements. These are usually meaningless as far as comparison is concerned (as they are located in derived references and will be merged along with their "true" difference anyway). Other than that, Please note that EMF Compare will leave unresolved proxies alone: more on this can be found in the 
			<a href="#Proxy_Resolution">related section</a>.
		</p>
		<p>The default scope can be easily created through:</p>
		<pre class="source-java">IComparisonScope scope = EMFCompare.createDefaultScope(resourceSet1, resourceSet2);

</pre>
		<h4 id="Configuring_the_comparison">Configuring the comparison</h4>
		<p>EMF Compare can be customized in a number of ways, the most important of which were described 
			<a href="#Default_Behavior_and_Extensibility">above</a>. Most of them re-use the same entry point, the 
			<i>org.eclipse.emf.compare.EMFCompare</i> class. We won't customize much here, please see the aforementioned section for extensibility means.
		</p>
		<p>All we will tell EMF Compare is not to use identifiers, and rely on its proximity algorithms instead (after all, we're comparing plain XMI files):</p>
		<pre class="source-java">IEObjectMatcher matcher = DefaultMatchEngine.createDefaultEObjectMatcher(UseIdentifiers.NEVER);
IComparisonFactory comparisonFactory = new DefaultComparisonFactory(new DefaultEqualityHelperFactory());
 
IMatchEngine.Factory matchEngineFactory = new MatchEngineFactoryImpl(matcher, comparisonFactory);
matchEngineFactory.setRanking(20);
IMatchEngine.Factory.Registry matchEngineRegistry = new MatchEngineFactoryRegistryImpl();
matchEngineRegistry.add(matchEngineFactory);

EMFCompare comparator = EMFCompare.builder().setMatchEngineFactoryRegistry(matchEngineRegistry).build();


</pre>
		<h4 id="Putting_it_all_together">Putting it all together</h4>
		<p>The following takes two input xmi files, loads them in their own resource sets, then calls the comparison without using identifiers:</p>
		<pre class="source-java">public Comparison compare(File model1, File model2) {
	// Load the two input models
	ResourceSet resourceSet1 = new ResourceSetImpl();
	ResourceSet resourceSet2 = new ResourceSetImpl();
	String xmi1 = "path/to/first/model.xmi";
	String xmi2 = "path/to/second/model.xmi";
	load(xmi1, resourceSet1);
	load(xmi2, resourceSet2);

	// Configure EMF Compare
	IEObjectMatcher matcher = DefaultMatchEngine.createDefaultEObjectMatcher(UseIdentifiers.NEVER);
	IComparisonFactory comparisonFactory = new DefaultComparisonFactory(new DefaultEqualityHelperFactory());
	IMatchEngine.Factory matchEngineFactory = new MatchEngineFactoryImpl(matcher, comparisonFactory);
        matchEngineFactory.setRanking(20);
        IMatchEngine.Factory.Registry matchEngineRegistry = new MatchEngineFactoryRegistryImpl();
        matchEngineRegistry.add(matchEngineFactory);
	EMFCompare comparator = EMFCompare.builder().setMatchEngineFactoryRegistry(matchEngineRegistry).build();

	// Compare the two models
	IComparisonScope scope = EMFCompare.createDefaultScope(resourceSet1, resourceSet2);
	return comparator.compare(scope);
}

private void load(String absolutePath, ResourceSet resourceSet) {
  URI uri = URI.createFileURI(absolutePath);

  resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("xmi", new XMIResourceFactoryImpl());

  // Resource will be loaded within the resource set
  resourceSet.getResource(uri, true);
}

</pre>
		<h4 id="Comparing_from_an_Eclipse_plugin">Comparing from an Eclipse plugin</h4>
		<p>The above example is for standalone usage, and as such will require extra work if you wish to compare UML models, benefit from EMF Compare extensions, provide your own mergers... The following represents the same example, but uses IDE-specific utilities (can you spot the two differences?):</p>
		<pre class="source-java">public Comparison compare(File model1, File model2) {
	// Load the two input models
	ResourceSet resourceSet1 = new ResourceSetImpl();
	ResourceSet resourceSet2 = new ResourceSetImpl();
	String xmi1 = "path/to/first/model.xmi";
	String xmi2 = "path/to/second/model.xmi";
	load(xmi1, resourceSet1);
	load(xmi2, resourceSet2);

	// Configure EMF Compare
	IEObjectMatcher matcher = DefaultMatchEngine.createDefaultEObjectMatcher(UseIdentifiers.NEVER);
	IComparisonFactory comparisonFactory = new DefaultComparisonFactory(new DefaultEqualityHelperFactory());
	IMatchEngine matchEngine = new DefaultMatchEngine(matcher, comparisonFactory);
        IMatchEngine.Factory.Registry matchEngineRegistry = EMFCompareRCPPlugin.getDefault().getMatchEngineFactoryRegistry();
        IPostProcessor.Descriptor.Registry&lt;String&gt; postProcessorRegistry = EMFCompareRCPPlugin.getDefault().getPostProcessorRegistry();
	EMFCompare comparator = EMFCompare.builder()
                                           .setMatchEngineFactoryRegistry(matchEngineRegistry)
                                           .setPostProcessorRegistry(postProcessorRegistry)
                                           .build();

	// Compare the two models
	IComparisonScope scope = EMFCompare.createDefaultScope(resourceSet1, resourceSet2);
	return comparator.compare(scope);
}

private void load(String absolutePath, ResourceSet resourceSet) {
  URI uri = URI.createFileURI(absolutePath);

  // Resource will be loaded within the resource set
  resourceSet.getResource(uri, true);
}

</pre>
		<h3 id="Query_the_differences">Query the differences</h3>
		<p>Once you have the result of a comparison (in the form of a 
			<i>Comparison</i> object), what you are interested in are most likely the differences between your models. We will detail the merging process later on it its own section, but before anything we need to retrieve the list of differences of interest. Within the Comparison model, differences are spread under the elements on which they've been detected, more precisely, under the 
			<i>Match</i> of the element on which they were detected.
		</p>
		<p>Let's use a complex example as reference. Consider the three following models:</p>
		<table border="1" cellpadding="5" cellspacing="0">
			<tr>
				<th align="center" colspan="2">Origin</th>
			</tr>
			<tr>
				<td align="center" colspan="2">
					<img align="middle" border="0" src="./../images/EMF_Compare_Origin_Model.png"/>
				</td>
			</tr>
			<tr>
				<th align="center">Left</th>
				<th align="center">Right</th>
			</tr>
			<tr>
				<td>
					<img align="middle" border="0" src="./../images/EMF_Compare_Use_Compare_Master.png"/>
				</td>
				<td>
					<img align="middle" border="0" src="./../images/EMF_Compare_Use_Compare_5.png"/>
				</td>
			</tr>
		</table>
		<h4 id="All_differences">All differences</h4>
		<p>What we need is usually to retrieve the list of 
			<i>all</i> differences, wherever they were detected, or whatever their source (the left model, or the right model). Instead of iterating all over the Comparison model to collect them, you can use:
		</p>
		<pre class="source-java">List&lt;Diff&gt; differences = comparison.getDifferences();

</pre>
		<h4 id="Differences_related_to_element_X">Differences related to element X</h4>
		<p>Sometimes, we need to retrieve all of the differences that were detected on (or that are related to) a given model element. For example, with the above example, we might want to retrieve the list of all differences that relate to 
			<i>Borrowable</i>. Well, there are a number of them, which can all be collected through:
		</p>
		<pre class="source-java">// borrowable is a reference on the like-named EObject
List&lt;Diff&gt; differencesOnBorrowable = comparison.getDifferences(borrowable);

</pre>
		<p>This will return a list containing a number of differences:</p>
		<ul>
			<li>
				<i>Borrowable</i> has been added in the right model
			</li>
			<li>
				<i>copies</i> has been added to reference 
				<i>ownedProperties</i> of Borrowable
			</li>
			<li>
				<i>Borrowable</i> has been added to the generalization reference of 
				<i>Book</i>
			</li>
			<li>
				<i>Borrowable</i> has been added as the 
				<i>borrowed</i> target of an association with 
				<i>Person</i>
			</li>
		</ul>
		<p>In other words, this method will return differences 
			<b>under</b> the target (here, 
			<i>copies</i> has been added), as well as differences which 
			<b>changed value</b> is the target.
		</p>
		<h4 id="Filtering_differences">Filtering differences</h4>
		<p>EMF Compare depends on guava for many of its internals. A number of "common" difference filtering predicates have been extracted to the 
			<i>org.eclipse.emf.compare.utils.EMFComparePredicates</i> utility class. Using this class, it is trivial to filter the list of differences so as to keep only those we are interested in. For example, what if we wish to retrieve the list of all 
			<b>non-conflicting</b> differences that originate from the 
			<b>left</b> side? (This is the case when you use the "copy all non-conflicting from left to right" action from the comparison editor for example.)
		</p>
		<pre class="source-java">// Construct the predicate
Predicate&lt;? super Diff&gt; predicate = and(fromSide(DifferenceSource.LEFT), not(hasConflict(ConflictKind.REAL, ConflictKind.PSEUDO));
// Filter out the differences that do not satisfy the predicate
Iterable&lt;Diff&gt; nonConflictingDifferencesFromLeft = filter(comparison.getDifferences(), predicate);

</pre>
		<p>Note that for clarity, we've made static references to a number of methods here. This particular snippet requires the following imports:</p>
		<pre class="source-java">import static com.google.common.base.Predicates.and;
import static com.google.common.base.Predicates.not;
import static com.google.common.collect.Iterables.filter;
import static org.eclipse.emf.compare.utils.EMFComparePredicates.fromSide;
import static org.eclipse.emf.compare.utils.EMFComparePredicates.hasConflict;

</pre>
		<p>We strongly encourage you to look around more in these classes: 
			<i>Predicates</i> provides a number of basic, general-purpose predicates while 
			<i>EMFComparePredicates</i> provides EMF Compare specific predicates used throughout both core and user-interface of EMF Compare.
		</p>
		<h3 id="Merge_differences">Merge differences</h3>
		<p>PENDING how to re-implement 
			<i>copyDiff</i> and 
			<i>copyAllNonConflicting</i>
		</p>
		<p>entry points: org.eclipse.emf.compare.merge.IMerger and org.eclipse.emf.compare.merge.IBatchMerger</p>
		<h3 id="Open_a_compare_editor">Open a compare editor</h3>
		<p>PENDING description of the need (dialog and editor), link to 
			<a href="./how-to-open-compare-dialog.html" title="./how-to-open-compare-dialog.html">appropriate page</a>
		</p>
		<p>Part of 
			<a href="../index.html">EMF Compare Documentation</a>
		</p>
		<p>Version 3.1.0.201506080946</p>
	</body>
</html>