Skip to main content
Jump to: navigation, search

Difference between revisions of "EMF Compare FAQ"

(Is EMF Compare, as EMF, able to run outside of Eclispe ?)
(Is EMF Compare, as EMF, able to run outside of Eclispe ?)
Line 28: Line 28:
 
'''A''': Yes, here is a snippet doing that:
 
'''A''': Yes, here is a snippet doing that:
 
<pre>
 
<pre>
  /**
+
/**
 
  * This application will try and launch an headless model comparison.
 
  * This application will try and launch an headless model comparison.
 
  *  
 
  *  
Line 34: Line 34:
 
  */
 
  */
 
public final class ExampleLauncher {
 
public final class ExampleLauncher {
 +
/**
 +
* This class doesn't need to be instantiated.
 +
*/
 
private ExampleLauncher() {
 
private ExampleLauncher() {
 
// prevents instantiation
 
// prevents instantiation
}
 
 
/**
 
* Loads a model from an {@link org.eclipse.emf.common.util.URI URI} in a given {@link ResourceSet}.
 
*
 
* @param file
 
*            {@link java.io.File File} containing the model to be loaded.
 
* @param resourceSet
 
*            The {@link ResourceSet} to load the model in.
 
* @return The model loaded from the file.
 
* @throws IOException
 
*            If the given file does not exist.
 
*/
 
@SuppressWarnings("unchecked")
 
public static EObject load(File file, ResourceSet resourceSet) throws IOException {
 
final URI modelURI = URI.createFileURI(file.getPath());
 
EObject result = null;
 
 
String fileExtension = modelURI.fileExtension();
 
if (fileExtension == null || fileExtension.length() == 0) {
 
fileExtension = Resource.Factory.Registry.DEFAULT_EXTENSION;
 
}
 
 
final Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
 
final Object resourceFactory = reg.getExtensionToFactoryMap().get(fileExtension);
 
if (resourceFactory != null) {
 
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(fileExtension, resourceFactory);
 
} else {
 
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(fileExtension, new XMIResourceFactoryImpl());
 
}
 
 
final Resource modelResource = resourceSet.createResource(modelURI);
 
modelResource.load(Collections.EMPTY_MAP);
 
if (modelResource.getContents().size() > 0)
 
result = (EObject)modelResource.getContents().get(0);
 
return result;
 
 
}
 
}
  
Line 82: Line 49:
 
public static void main(String[] args) {
 
public static void main(String[] args) {
 
if (args.length == 2 && new File(args[0]).canRead() && new File(args[1]).canRead()) {
 
if (args.length == 2 && new File(args[0]).canRead() && new File(args[1]).canRead()) {
 +
// Creates the resourceSet where we'll load the models
 
final ResourceSet resourceSet = new ResourceSetImpl();
 
final ResourceSet resourceSet = new ResourceSetImpl();
 
try {
 
try {
final EObject model1 = load(new File(args[0]), resourceSet);
+
// Loads the two models passed as arguments
final EObject model2 = load(new File(args[1]), resourceSet);
+
final EObject model1 = ModelUtils.load(new File(args[0]), resourceSet);
 +
final EObject model2 = ModelUtils.load(new File(args[1]), resourceSet);
 +
 +
// Creates the match then the diff model for those two models
 
final MatchModel match = new DifferencesServices().modelMatch(model1, model2, new NullProgressMonitor());
 
final MatchModel match = new DifferencesServices().modelMatch(model1, model2, new NullProgressMonitor());
 
final DiffModel diff = new DiffMaker().doDiff(match, false);
 
final DiffModel diff = new DiffMaker().doDiff(match, false);
 
 
 +
// Prints the results
 
try {
 
try {
 
System.out.println(ModelUtils.serialize(match));
 
System.out.println(ModelUtils.serialize(match));
Line 95: Line 67:
 
e.printStackTrace();
 
e.printStackTrace();
 
}
 
}
 +
 +
// System.out.println("saving diff as \"result.diff\"");
 +
// ModelUtils.save(diff, "result.diff");
 +
// System.out.println("saving match as \"result.match\"");
 +
// ModelUtils.save(match, "result.match");
 +
 +
// Serializes the result as "result.emfdiff" in the directory this class has been called from.
 +
System.out.println("saving emfdiff as \"result.emfdiff\""); //$NON-NLS-1$
 +
final ModelInputSnapshot snapshot = DiffFactory.eINSTANCE.createModelInputSnapshot();
 +
snapshot.setDate(Calendar.getInstance().getTime());
 +
snapshot.setMatch(match);
 +
snapshot.setDiff(diff);
 +
ModelUtils.save(snapshot, "result.emfdiff"); //$NON-NLS-1$
 
} catch (IOException e) {
 
} catch (IOException e) {
// cannot be thrown
+
// shouldn't be thrown
 
e.printStackTrace();
 
e.printStackTrace();
 
} catch (InterruptedException e) {
 
} catch (InterruptedException e) {

Revision as of 10:44, 10 August 2007

Users

My model is compared as a text-file, how can EMF compare know what file it should handle ?

Q : My model is compared as a text-file, how can EMF compare know what file it should handle ?

A : EMF compare uses a content-type to know if it should be started or not. By default this content-type is composed of *.ecore and *.uml file but you may add your own extension using the Preferences view / Global / Content-types and adding your file extension in the "Model File" content-type.


EMFComparePreferences-content-type.png

Developpers

How can I programatically add my model file extension in EMF Compare so that it is called automatically ?

Q : How can I programatically add my model file extension in EMF Compare so that it is called automatically ?

A : Using the "Model File" content-type defined with EMF Compare, here is a sample from a plugin.xml:

 <extension
        point="org.eclipse.core.contenttype.contentTypes">
     <file-association
           content-type="org.eclipse.emf.compare.ui.contenttype.ModelContentType"
           file-extensions="uml13"
           file-names="*"/>
  </extension>

Is EMF Compare, as EMF, able to run outside of Eclispe ?

Q : Is EMF Compare able to compare "in-memory" objects, and can it be run without Eclispe ?

A: Yes, here is a snippet doing that:

 /**
 * This application will try and launch an headless model comparison.
 * 
 * @author Cedric Brun <a href="mailto:cedric.brun@obeo.fr">cedric.brun@obeo.fr</a>
 */
public final class ExampleLauncher {
	/**
	 * This class doesn't need to be instantiated.
	 */
	private ExampleLauncher() {
		// prevents instantiation
	}

	/**
	 * Launcher of this application.
	 * 
	 * @param args
	 *            Arguments of the launch.
	 */
	public static void main(String[] args) {
		if (args.length == 2 && new File(args[0]).canRead() && new File(args[1]).canRead()) {
			// Creates the resourceSet where we'll load the models
			final ResourceSet resourceSet = new ResourceSetImpl();
			try {
				// Loads the two models passed as arguments
				final EObject model1 = ModelUtils.load(new File(args[0]), resourceSet);
				final EObject model2 = ModelUtils.load(new File(args[1]), resourceSet);
				
				// Creates the match then the diff model for those two models
				final MatchModel match = new DifferencesServices().modelMatch(model1, model2, new NullProgressMonitor());
				final DiffModel diff = new DiffMaker().doDiff(match, false);
				
				// Prints the results
				try {
					System.out.println(ModelUtils.serialize(match));
					System.out.println(ModelUtils.serialize(diff));
				} catch (IOException e) {
					e.printStackTrace();
				}
				
//				System.out.println("saving diff as \"result.diff\"");
//				ModelUtils.save(diff, "result.diff");
//				System.out.println("saving match as \"result.match\"");
//				ModelUtils.save(match, "result.match");
				
				// Serializes the result as "result.emfdiff" in the directory this class has been called from.
				System.out.println("saving emfdiff as \"result.emfdiff\""); //$NON-NLS-1$
				final ModelInputSnapshot snapshot = DiffFactory.eINSTANCE.createModelInputSnapshot();
				snapshot.setDate(Calendar.getInstance().getTime());
				snapshot.setMatch(match);
				snapshot.setDiff(diff);
				ModelUtils.save(snapshot, "result.emfdiff"); //$NON-NLS-1$
			} catch (IOException e) {
				// shouldn't be thrown
				e.printStackTrace();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		} else {
			System.out.println("usage : Launcher <Model1> <Model2>"); //$NON-NLS-1$
		}
	}
}

Back to the top