|
|
(31 intermediate revisions by 6 users not shown) |
Line 1: |
Line 1: |
− | =Users=
| + | #REDIRECT[[EMF_Compare/FAQ]] |
− | ====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 <tt>Preferences view / Global / Content-types</tt> and adding your file extension in the "Model File" content-type.
| + | |
− | | + | |
− | | + | |
− | [[Image: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:
| + | |
− | <pre>
| + | |
− | <extension
| + | |
− | point="org.eclipse.core.contenttype.contentTypes">
| + | |
− | <file-association
| + | |
− | content-type="org.eclipse.emf.compare.ui.contenttype.ModelContentType"
| + | |
− | file-extensions="uml13"
| + | |
− | file-names="*"/>
| + | |
− | </extension>
| + | |
− | </pre>
| + | |
− | | + | |
− | ====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:
| + | |
− | <pre>
| + | |
− | /**
| + | |
− | * 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 {
| + | |
− | private ExampleLauncher() {
| + | |
− | // 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;
| + | |
− | }
| + | |
− | | + | |
− | /**
| + | |
− | * 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()) {
| + | |
− | final ResourceSet resourceSet = new ResourceSetImpl();
| + | |
− | try {
| + | |
− | final EObject model1 = load(new File(args[0]), resourceSet);
| + | |
− | final EObject model2 = load(new File(args[1]), resourceSet);
| + | |
− | final MatchModel match = new DifferencesServices().modelMatch(model1, model2, new NullProgressMonitor());
| + | |
− | final DiffModel diff = new DiffMaker().doDiff(match, false);
| + | |
− |
| + | |
− | try {
| + | |
− | System.out.println(ModelUtils.serialize(match));
| + | |
− | System.out.println(ModelUtils.serialize(diff));
| + | |
− | } catch (IOException e) {
| + | |
− | e.printStackTrace();
| + | |
− | }
| + | |
− | } catch (IOException e) {
| + | |
− | // cannot be thrown
| + | |
− | e.printStackTrace();
| + | |
− | } catch (InterruptedException e) {
| + | |
− | e.printStackTrace();
| + | |
− | }
| + | |
− | } else {
| + | |
− | System.out.println("usage : Launcher <Model1> <Model2>"); //$NON-NLS-1$
| + | |
− | }
| + | |
− | }
| + | |
− | }
| + | |
− | </pre>
| + | |