<?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>FAQ</title>
		<style type="text/css">
			.tip {border: 1px solid #090;background-color: #dfd;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;}
			.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;}
</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__FAQs">EMF Compare —  FAQs</h1>
		<p>Version 3.2.0.201505180755</p>
		<div class="toc">
			<h3 class="toc-title">Table of Contents</h3>
			<ol style="list-style: none">
				<li>
					<a href="#Users_FAQ">Users FAQ</a>
					<ol style="list-style: none">
						<li>
							<a href="#Which_files_should_be_compared_via_EMF_Compare_.3F">Which files should be compared via EMF Compare ?</a>
						</li>
						<li>
							<a href="#How_to_force_text_comparison.3F">How to force text comparison?</a>
						</li>
						<li>
							<a href="#EMF_Compare_compatibility_.3F">EMF Compare compatibility ?</a>
						</li>
						<li>
							<a href="#Where_can_I_find_EMF_Compare_.3F">Where can I find EMF Compare ?</a>
						</li>
					</ol>
				</li>
				<li>
					<a href="#Developers_FAQ">Developers FAQ</a>
					<ol style="list-style: none">
						<li>
							<a href="#How_can_I_programmatically_add_my_model_file_extension_in_EMF_Compare_so_that_it_is_called_automatically_.3F">How can I programmatically add my model file extension in EMF Compare so that it is called automatically ?</a>
						</li>
						<li>
							<a href="#How_can_I_use_EMF_Compare_programmatically_.3F">How can I use EMF Compare programmatically ?</a>
						</li>
						<li>
							<a href="#Can_EMF_Compare_be_used_standalone_.3F">Can EMF Compare be used standalone ?</a>
						</li>
						<li>
							<a href="#Custom_data_types_are_always_marked_as_modified_by_EMF_Compare">Custom data types are always marked as modified by EMF Compare</a>
						</li>
						<li>
							<a href="#Can_I_programmatically_open_a_comparison_editor_or_dialog_.3F">Can I programmatically open a comparison editor or dialog ?</a>
						</li>
						<li>
							<a href="#Can_I_use_custom_identifiers_for_my_objects_.3F">Can I use custom identifiers for my objects ?</a>
						</li>
						<li>
							<a href="#Can_I_ignore_differences_on_a_specific_reference.2C_or_ignore_ordering_differences_.3F">Can I ignore differences on a specific reference, or ignore ordering differences ?</a>
						</li>
					</ol>
				</li>
			</ol>
		</div>
		<p>These FAQs will be aimed at EMF Compare 2 and subsequent versions. Since this version largely differs from the previous 1.* stream, answers related to version 1 cannot apply in most case.</p>
		<h3 id="Users_FAQ">Users FAQ</h3>
		<h4 id="Which_files_should_be_compared_via_EMF_Compare_.3F">Which files should be compared via EMF Compare ?</h4>
		<p>
			<b>Q</b> : My model is compared as a text-file, how can EMF compare know the files it should handle ?
		</p>
		<p>
			<b>A</b> : EMF Compare will be triggered for any files being recognized as an EMF model. Technically, it will be files recognized with the content types XMI (org.eclipse.emf.ecore.xmi) or "EMF Compare" (org.eclipse.emf.compare.content.type).
		</p>
		<p>If your models are compared with the text compare editor and you want EMF Compare to be used instead, you should add your own extension using the Preferences view / General / Content-types and add your file extension in the "EMF Compare" content-type.</p>
		<p>
			<img border="0" src="images/EMF_Compare_Preferences_Content_Type.png"/>
		</p>
		<h4 id="How_to_force_text_comparison.3F">How to force text comparison?</h4>
		<p>
			<b>Q</b>: I want my models to be compared as text but I can't remove its association to XMI Content Type or EMF Compare content type because they are locked (e.g. Ecore, UML, etc…)
		</p>
		<p>
			<b>A</b>: Every files locked with XMI content type (i.e. their content type is "org.eclipse.emf.ecore.xmi" or one of its subtype) or EMF Compare content type can not be forced to use the text compare editor. This is a Eclipse Compare platform limitation. You can, however, see the text comparison from the EMF Compare editor. Deactivate the "Empty Resource Mappings" filter and then select the appropriate resource mapping. The bottom panes will display the comparison of the textual content of the mapped resources.
		</p>
		<p>
			<img border="0" src="images/EMF_Compare_Text_Comparison.png"/>
		</p>
		<h4 id="EMF_Compare_compatibility_.3F">EMF Compare compatibility ?</h4>
		<p>
			<b>Q</b> : Which Java/Eclipse versions can EMF Compare run on?
		</p>
		<p>
			<b>A</b> : EMF Compare is built against JDK 1.5 and makes use of the features it introduced such as foreach and generics. It is therefore incompatible with a JDK &lt; 1.5. EMF Compare can also be used with both JDK 1.6 and JDK 1.7.
		</p>
		<p>We strive to keep the 
			<a href="./user/user-guide.html#Compatibility" title="./user/user-guide.html#Compatibility">compatibility chart</a> updated so that you can determine which version of EMF Compare can be used in conjunction with your Eclipse of choice.
		</p>
		<h4 id="Where_can_I_find_EMF_Compare_.3F">Where can I find EMF Compare ?</h4>
		<p>
			<b>Q</b> : Where can I download the latest version of EMF Compare?
		</p>
		<p>
			<b>A</b> : The 
			<a href="./user/user-guide.html#Installing_EMF_Compare" title="./user/user-guide.html#Installing_EMF_Compare">Installation instruction</a> present a set of update sites useable to install.
			The 
			<a href="http://www.eclipse.org/emf/compare/downloads/">Download page</a> lists more specific update sites if you wish to try one of the latest integration builds.
		</p>
		<h2 id="Developers_FAQ">Developers FAQ</h2>
		<h3 id="How_can_I_programmatically_add_my_model_file_extension_in_EMF_Compare_so_that_it_is_called_automatically_.3F">How can I programmatically add my model file extension in EMF Compare so that it is called automatically ?</h3>
		<p>
			<b>Q</b> : How can I programatically add my model file extension to EMF Compare so that it is called automatically ? 
		</p>
		<p>
			<b>A</b> : You can do so using the exore XMI content-type, here is a sample from a plugin.xml:
		</p>
		<pre class="source-xml">&lt;extension
    point="org.eclipse.core.contenttype.contentTypes"&gt;
  &lt;file-association
      content-type="org.eclipse.emf.ecore.xmi"
      file-extensions="uml"
      file-names="*"/&gt;
&lt;/extension&gt;

</pre>
		<h3 id="How_can_I_use_EMF_Compare_programmatically_.3F">How can I use EMF Compare programmatically ?</h3>
		<p>
			<b>Q</b> : How can I use EMF Compare programmatically, to compare either files or "in-memory" objects?
		</p>
		<p>
			<b>A</b> : Many samples of how to compare objects can be found within 
			<a href="http://git.eclipse.org/c/emfcompare/org.eclipse.emf.compare.git/tree/plugins/org.eclipse.emf.compare.tests">the unit tests of EMF Compare</a> (see also 
			<a href="EMF_Compare/Contributor_Guide#Checking_out_the_code" title="EMF_Compare/Contributor_Guide#Checking_out_the_code">how to checkout the source code</a>). Here is a sample that should cover the basic use case (the class with this method should have a dependency towards the 
			<i>org.eclipse.emf.compare</i> plugin) :
		</p>
		<pre class="source-java">public void compare(File model1, File model2) {
	URI uri1 = URI.createFileURI("path/to/first/model.xmi");
	URI uri2 = URI.createFileURI("path/to/second/model.xmi");

	Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("xmi", new XMIResourceFactoryImpl());

	ResourceSet resourceSet1 = new ResourceSetImpl();
	ResourceSet resourceSet2 = new ResourceSetImpl();

	resourceSet1.getResource(uri1, true);
	resourceSet2.getResource(uri2, true);

	IComparisonScope scope = new DefaultComparisonScope(resourceSet1, resourceSet2);
	Comparison comparison = EMFCompare.builder().build().compare(scope);

	List&lt;Diff&gt; differences = comparison.getDifferences();
	// Let's merge every single diff
	IMerger.Registry mergerRegistry = new IMerger.RegistryImpl();
	IBatchMerger merger = new BatchMerger(mergerRegistry);
	merger.copyAllLeftToRight(differences, new BasicMonitor());
}

</pre>
		<h3 id="Can_EMF_Compare_be_used_standalone_.3F">Can EMF Compare be used standalone ?</h3>
		<p>
			<b>Q</b> : Is EMF Compare able to compare "in-memory" objects, and can it be run without Eclipse ?
		</p>
		<p>
			<b>A</b>: Yes, the core of EMF Compare is developed primarily for standalone, the integration with Eclipse being built on top of that. All of the classes and utilities located in the 
			<i>org.eclipse.emf.compare</i> plugin are pure Java with no dependency towards Eclipse, and can thus safely be used within a Java application running outside of Eclipse.
		</p>
		<p>The following is the minimal set of dependencies you will need for EMF Compare.</p>
		<pre>* org.eclipse.emf.common 2.5 or higher
* org.eclipse.emf.ecore 2.5 or higher
* org.eclipse.emf.ecore.xmi 2.5 or higher
* org.eclipse.emf.compare 2.0 or higher
* com.google.guava 11.0 (EMF Compare should also be compatible with Guava 12, 13 and 14 as far as we tested our integration)
</pre>
		<h3 id="Custom_data_types_are_always_marked_as_modified_by_EMF_Compare">Custom data types are always marked as modified by EMF Compare</h3>
		<p>
			<b>Q</b> : A model based on a custom meta-model always shows elements of a custom data type as being changed. How can I have EMF Compare behave correctly?
		</p>
		<p>
			<b>A</b> : The differencing process of EMF Compare is based on equality helpers. For data types, this depends upon the return value of these data types' 
			<i>equals(Object)</i> method. It will thus fail to determine whether two objects match if their 
			<i>equals(Object)</i> methods has not been overriden in the custom data type's instance class. Remember to also override 
			<i>hashCode()</i> when overriding 
			<i>equals(Object)</i>. A Typical example of this is 
			<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=226152">bug 226152</a>.
		</p>
		<p>Another way around this problem would be to contribute your own equality helper to EMF Compare so that it knows how to compare these kind of data types. That could be done through the EMFCompare builder :</p>
		<pre class="source-java">IEqualityHelperFactory helperFactory = new DefaultEqualityHelperFactory() {
	@Override
	public org.eclipse.emf.compare.utils.IEqualityHelper createEqualityHelper() {
		final Cache&lt;EObject, URI&gt; cache = EqualityHelper.createDefaultCache(getCacheBuilder());
		return new EqualityHelper(cache) {
			@Override
			public boolean matchingValues(Object object1, Object object2) {
				if (object1 instanceof MyDataType &amp;&amp; object2 instanceof MyDataType) {
					// custom code
				}
				return super.matchingValues(object1, object2);
			}
		};
	}
};
IComparisonFactory comparisonFactory = new DefaultComparisonFactory(helperFactory);
Comparison comparison = EMFCompare.builder().setMatchEngine(new DefaultMatchEngine(DefaultMatchEngine
		.createDefaultEObjectMatcher(UseIdentifiers.WHEN_AVAILABLE), comparisonFactory)).build().compare(scope);

</pre>
		<h3 id="Can_I_programmatically_open_a_comparison_editor_or_dialog_.3F">Can I programmatically open a comparison editor or dialog ?</h3>
		<p>
			<b>Q</b> : I need to call EMF Compare programmatically from within my own plugin, but I'd like to be able to show my users a comparison editor. Is there a way?
		</p>
		<p>
			<b>A</b> : Since EMF Compare 2.1.0M4, there is. As the answer to this question is a little complex, it deserves 
			<a href="./developer/how-to-open-compare-dialog.html" title="./developer/how-to-open-compare-dialog.html">its own page</a>.
		</p>
		<h3 id="Can_I_use_custom_identifiers_for_my_objects_.3F">Can I use custom identifiers for my objects ?</h3>
		<p>
			<b>Q</b> : I have my own custom elements, and I'd like to tell EMF Compare what to use to uniquely identify them. For example, their name.
		</p>
		<p>
			<b>A</b> : EMF Compare internally uses a function in order to compute the identifier of an EObject. You can override this function with your own, or compose your own with it so that EMF Compare will use your function for your elements, and fall back to the default behavior for any other element it needs to match.
		</p>
		<p>How to do this is outlined on the 
			<a href="./developer/developer-guide.html#Defining_custom_identifiers" title="./developer/developer-guide.html#Defining custom identifiers">Developer Guide</a>.
		</p>
		<h3 id="Can_I_ignore_differences_on_a_specific_reference.2C_or_ignore_ordering_differences_.3F">Can I ignore differences on a specific reference, or ignore ordering differences ?</h3>
		<p>
			<b>Q</b> : I want to ignore all differences on a given structural feature, can I tell EMF Compare not to look at these features?
			<br/>

			<b>Q</b> : EMF Compare detects many 
			<i>ordering</i> differences on my models, but I do not care about them. Is there a way to ignore all ordering changes?
		</p>
		<p>
			<b>A</b> : You can override the 
			<i>FeatureFilter</i> to tell EMF Compare that some references should be ignored, there is an example doing just that in the 
			<a href="./developer/developer-guide.html#Changing_the_FeatureFilter" title="./developer/developer-guide.html#Changing the FeatureFilter">Developer Guide</a>.
		</p>
		<p>Part of 
			<a href="index.html">EMF Compare Documentation</a>
		</p>
		<p>Version 3.2.0.201505180755</p>
	</body>
</html>