RCP SWT Text vergleichen und colorieren?

lam_tr

Top Contributor
Hallo zusammen,

ich möchte gern zwei EditorParts mit Textfelder nach String vergleichen und farblich markieren wo die Unterschiede sind. Da gibts doch schon was fertiges oder?

Gruss lam
 

lam_tr

Top Contributor
Ich glaub, das was ich brauche ist so ein CompareEditor... aber leider finde ich nix dazu, weiss jemand darüber was bescheid?

Gruss lam
 

Wildcard

Top Contributor
Richtig, ein Compare Editor ist das Zauberwort. Du brauchst erstmal eine Diff und eine Match Engine und dann kannst du eine neue Oberfläche in den Compare Editor einbauen. Dafür gibt es einen extension point. Wenn du ein beispiel sehen möchtest, dann schau dir zB EMF Compare an. Ein Compare Editor für EMF Modelle mit einer Baumansicht beider Modelle. Eventuell wäre es auch einfacher die Werte in ein EMF Modell zu überführen und dann direkt die Diff und Match Engine von EMF Compare zu verwenden. Dann musst du nur noch eine Oberfläche schreiben die den Diff visualisiert.
 

lam_tr

Top Contributor
Hi wildcard,

ich hab nicht wirklich ganz verstanden wie ich vorgehen soll. Im Grunde genommen, zeigt das Textfeld Inhalt eines XMI-Modells.... Jetzt will ich eigentlich über den TreeViewer 2 Knoten auf Inhalt vergleichen. Da ich jeden Knoten per Doppelklick als SWT Text darstelle, dachte ich ist es bessser über CompareEditor zu machen.

Kannst du mir die einzelne Schritte noch mal genauer erklären?

Und über Extension Points kann ich nur contentMergeViewer finden der CompareEditor leider nicht.

Welchen Diff / Match Engine kannst du mir da empfehlen?

Gruss lam
 

Wildcard

Top Contributor
Ach du hast sogar ein XMI? Na umso besser. Installier dir mal EMF Compare, vergleiche damit die zwei XMI Modelle (mit EMF laden) und dann erkläre am besten kurz was dir noch fehlt.
 

Wildcard

Top Contributor
So sieht der EMF Compare Editor übrigens per Default aus:
EMF Compare
Die Engine funktioniert auf allen EMF Modellen und bei Bedarf kann man die Oberfläche anpassen, oder eine komplett eigene schreiben.
 

lam_tr

Top Contributor
Hi Wildcard,

ich habe nur eine XMI-File, will aber 2 kinder miteinander vergleichen. Funktioniert das mit dem Compare auch.
Ich hab das hier gefunden, aber das ist ein vergleich zweier Modelle.

Java:
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;

import org.eclipse.compare.structuremergeviewer.DiffElement;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.compare.diff.merge.service.MergeService;
import org.eclipse.emf.compare.diff.metamodel.ComparisonResourceSnapshot;
import org.eclipse.emf.compare.diff.metamodel.DiffFactory;
import org.eclipse.emf.compare.diff.metamodel.DiffModel;
import org.eclipse.emf.compare.diff.service.DiffService;
import org.eclipse.emf.compare.match.metamodel.MatchModel;
import org.eclipse.emf.compare.match.service.MatchService;
import org.eclipse.emf.compare.util.ModelUtils;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;

/**
 * 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 resourceSets where we'll load the models
			final ResourceSet resourceSet1 = new ResourceSetImpl();
			final ResourceSet resourceSet2 = new ResourceSetImpl();
			// Register additionnal packages here. For UML2 for instance :
			// Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put(UMLResource.FILE_EXTENSION,
			// UMLResource.Factory.INSTANCE);
			// resourceSet1.getPackageRegistry().put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
			// resourceSet2.getPackageRegistry().put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);

			try {
				System.out.println("Loading resources.\n"); //$NON-NLS-1$
				// Loads the two models passed as arguments
				final EObject model1 = ModelUtils.load(new File(args[0]), resourceSet1);
				final EObject model2 = ModelUtils.load(new File(args[1]), resourceSet2);

				// Creates the match then the diff model for those two models
				System.out.println("Matching models.\n"); //$NON-NLS-1$
				final MatchModel match = MatchService.doMatch(model1, model2, Collections
						.<String, Object> emptyMap());
				System.out.println("Differencing models.\n"); //$NON-NLS-1$
				final DiffModel diff = DiffService.doDiff(match, false);

				System.out.println("Merging difference to args[1].\n"); //$NON-NLS-1$
				final EList<DiffElement> differences = new BasicEList(diff.getOwnedElements());
				// This will merge all references to the right model (second argument).
				MergeService.merge(differences, true);

				// Prints the results
				try {
					System.out.println("MatchModel :\n"); //$NON-NLS-1$
					System.out.println(ModelUtils.serialize(match));
					System.out.println("DiffModel :\n"); //$NON-NLS-1$
					System.out.println(ModelUtils.serialize(diff));
				} catch (final IOException e) {
					e.printStackTrace();
				}

				// 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 ComparisonResourceSnapshot snapshot = DiffFactory.eINSTANCE
						.createComparisonResourceSnapshot();
				snapshot.setDate(Calendar.getInstance().getTime());
				snapshot.setMatch(match);
				snapshot.setDiff(diff);
				ModelUtils.save(snapshot, "result.emfdiff"); //$NON-NLS-1$
			} catch (final IOException e) {
				// shouldn't be thrown
				e.printStackTrace();
			} catch (final InterruptedException e) {
				e.printStackTrace();
			}
		} else {
			System.out.println("usage : ExampleLauncher <Model1> <Model2>"); //$NON-NLS-1$
		}
	}
}

Oder anders gefragt, kann ich irgendwie nur zwei Objekte vergleichen?

Gruss lam
 

lam_tr

Top Contributor
Hi wildcard, ich hab mir die Methode final MatchModel match = MatchService.doMatch(model1, model2, Collections).<String, Object> emptyMap());

ein bisschen genauer in Betracht genommen eigentlich kann ich auch zwei EObject eines Modells übergeben oder?
 

lam_tr

Top Contributor
Hi wildcard, ich bin auf ein Problem gestoßen

Java:
Matching models.

Differencing models.

Merging difference to args[1].

MatchModel :

org.eclipse.emf.ecore.resource.Resource$IOWrappedException: The object 'evo.impl.VeraenderungImpl@a761fe (querprofil: 12, schrittweite: -0.15858634204784403)' is not contained in a resource.
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.endSave(XMLSaveImpl.java:306)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.save(XMLSaveImpl.java:235)
	at org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl.doSave(XMLResourceImpl.java:350)
	at org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl.save(XMLResourceImpl.java:325)
	at org.eclipse.emf.compare.util.ModelUtils.serialize(ModelUtils.java:429)
	at evo.presentation.ExampleLauncher.main(ExampleLauncher.java:79)
Caused by: org.eclipse.emf.ecore.xmi.DanglingHREFException: The object 'evo.impl.VeraenderungImpl@a761fe (querprofil: 12, schrittweite: -0.15858634204784403)' is not contained in a resource.
	at org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl.handleDanglingHREF(XMLHelperImpl.java:760)
	at org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl.getURIFragment(XMLHelperImpl.java:731)
	at org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl.getIDREF(XMLHelperImpl.java:753)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveIDRefSingle(XMLSaveImpl.java:1972)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveFeatures(XMLSaveImpl.java:1318)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveElementID(XMLSaveImpl.java:2685)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveElement(XMLSaveImpl.java:1174)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveElement(XMLSaveImpl.java:1035)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveContainedMany(XMLSaveImpl.java:2386)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveFeatures(XMLSaveImpl.java:1533)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveElementID(XMLSaveImpl.java:2685)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.writeTopObject(XMLSaveImpl.java:680)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.traverse(XMLSaveImpl.java:588)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.save(XMLSaveImpl.java:230)
	... 4 more
saving emfdiff as "result.emfdiff"
org.eclipse.emf.ecore.resource.Resource$IOWrappedException: The object 'evo.impl.VeraenderungImpl@a761fe (querprofil: 12, schrittweite: -0.15858634204784403)' is not contained in a resource.
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.endSave(XMLSaveImpl.java:306)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.save(XMLSaveImpl.java:270)
	at org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl.doSave(XMLResourceImpl.java:302)
	at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:1409)
	at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:991)
	at org.eclipse.emf.compare.util.ModelUtils.save(ModelUtils.java:405)
	at evo.presentation.ExampleLauncher.main(ExampleLauncher.java:93)
Caused by: org.eclipse.emf.ecore.xmi.DanglingHREFException: The object 'evo.impl.VeraenderungImpl@a761fe (querprofil: 12, schrittweite: -0.15858634204784403)' is not contained in a resource.
	at org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl.handleDanglingHREF(XMLHelperImpl.java:760)
	at org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl.getURIFragment(XMLHelperImpl.java:731)
	at org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl.getIDREF(XMLHelperImpl.java:753)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveIDRefSingle(XMLSaveImpl.java:1972)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveFeatures(XMLSaveImpl.java:1318)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveElementID(XMLSaveImpl.java:2685)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveElement(XMLSaveImpl.java:1174)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveElement(XMLSaveImpl.java:1035)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveContainedMany(XMLSaveImpl.java:2386)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveFeatures(XMLSaveImpl.java:1533)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveElementID(XMLSaveImpl.java:2685)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveElement(XMLSaveImpl.java:1174)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveElement(XMLSaveImpl.java:1035)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveContainedSingle(XMLSaveImpl.java:2372)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveFeatures(XMLSaveImpl.java:1527)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.saveElementID(XMLSaveImpl.java:2685)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.writeTopObject(XMLSaveImpl.java:680)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.traverse(XMLSaveImpl.java:588)
	at org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl.save(XMLSaveImpl.java:256)
	... 5 more

was bedeutet dieses Exception org.eclipse.emf.ecore.resource.Resource$IOWrappedException.
Dieser Knoten VeraenderungImpl ist eigentlich im Modell enthalten wieso kennt das Metamodell es nicht?
 

Wildcard

Top Contributor
Also folgendes:
Du versuchst gerade das Diff und das Match Modell zu speichern. Diff und Match Modell enthalten Referenzen auf Objekte deines Modells. Beim serialisieren müssen diese Referenzen zu URIs umgewandelt werden, denn du kannst ja schlecht eine Speicheradresse in die Datei schreiben.
Die Objekte deines Modells sind allerdings nicht in einer Resource enthalten, also beschwert er sich zu recht das er die Referenzen nicht auflösen kann, denn sonst könntest du es später nicht mehr richtig laden.
War das verständlich?
 

Ähnliche Java Themen


Oben