package org.flowerplatform.editor.model.changes_processor; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import java.util.HashMap; import java.util.Map; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.flowerplatform.codesync.config.extension.AddNewExtension_TopLevelElement; import org.flowerplatform.codesync.remote.CodeSyncDiagramOperationsService1; import org.flowerplatform.communication.CommunicationPlugin; import org.flowerplatform.communication.channel.CommunicationChannel; import org.flowerplatform.communication.command.AbstractServerCommand; import org.flowerplatform.communication.service.ServiceInvocationContext; import org.flowerplatform.communication.stateful_service.StatefulServiceInvocationContext; import org.flowerplatform.editor.model.EditorModelPlugin; import org.flowerplatform.editor.model.java.remote.NewJavaClassDiagramAction; import org.flowerplatform.editor.model.remote.DiagramEditableResource; import org.flowerplatform.editor.model.remote.DiagramEditorStatefulService; import org.flowerplatform.web.communication.RecordingTestWebCommunicationChannel; import org.flowerplatform.web.tests.TestUtil; import org.junit.BeforeClass; import org.junit.Test; import com.crispico.flower.mp.codesync.base.communication.CodeSyncEditorStatefulService; import com.crispico.flower.mp.model.codesync.CodeSyncElement; import com.crispico.flower.mp.model.codesync.CodeSyncFactory; public class ChangesProcessorTest { public static final String PROJECT = "editor.model.changes_descriptor"; // TODO CS: here without /; in other places with / private static final String ER_PATH = "org/ws_trunk/" + PROJECT + "/changesDescriptionDiagram.notation"; private static CommunicationChannel communicationChannel = new RecordingTestWebCommunicationChannel(); private static DiagramEditorStatefulService diagramEditorStatefulService; private static CodeSyncEditorStatefulService codeSyncEditorStatefulService; private static DiagramEditableResource diagramEditableResource; private static Map<EObject, Changes> observedChanges = new HashMap<EObject, Changes>(); @BeforeClass public static void setUpBeforeClass() throws Exception { // TODO CS: we absolutely need to solve the issue with CommPlugin & services // here, the dispatch is done on another thread that starts more slowly Thread.sleep(3000); TestUtil.copyFilesAndCreateProject(new ServiceInvocationContext(communicationChannel), null, PROJECT); diagramEditorStatefulService = (DiagramEditorStatefulService) CommunicationPlugin.getInstance().getServiceRegistry() .getService("diagramEditorStatefulService"); assertNotNull("DiagramEditorStatefulService was not registered", diagramEditorStatefulService); codeSyncEditorStatefulService = (CodeSyncEditorStatefulService) CommunicationPlugin.getInstance().getServiceRegistry() .getService("codeSyncEditorStatefulService"); assertNotNull("CodeSyncEditorStatefulService was not registered", codeSyncEditorStatefulService); NewJavaClassDiagramAction action = new NewJavaClassDiagramAction(); action.parentPath = "/org/ws_trunk/" + PROJECT; action.name = "changesDescriptionDiagram.notation"; // TODO CS action.openAutomatically = false; action.executeCommand(); // TODO CS the recording CC.appendHttp... should also be overwritten // TODO CS in FileBased... there is still a manipulation with file, not using FileAccessContr... diagramEditableResource = (DiagramEditableResource) diagramEditorStatefulService.subscribeClientForcefully(communicationChannel, ER_PATH); EditorModelPlugin.getInstance().getClassCriterionDispatcherProcessor().addProcessor(Object.class, new IChangesProcessor() { @Override public void processChanges(Map<String, Object> context, EObject object, Changes changes) { observedChanges.put(object, changes); } }); } private void executeInDiagramEditorStatefulService(final Runnable runnable) { diagramEditorStatefulService.attemptUpdateEditableResourceContent(new StatefulServiceInvocationContext(communicationChannel), ER_PATH, new AbstractServerCommand() { @Override public void executeCommand() { runnable.run(); } }); } @Test public void testAddRemove() { // TODO CS the static references final Resource codeSyncMappingResource = CodeSyncDiagramOperationsService1.getCodeSyncMappingResource(diagramEditableResource); final CodeSyncElement srcDir = AddNewExtension_TopLevelElement.getOrCreateCodeSyncElementForLocation(codeSyncMappingResource, new String[] { "js" }); /** * Adding on an empty list. */ { observedChanges.clear(); final CodeSyncElement a = CodeSyncFactory.eINSTANCE.createCodeSyncElement(); final CodeSyncElement b = CodeSyncFactory.eINSTANCE.createCodeSyncElement(); final CodeSyncElement c = CodeSyncFactory.eINSTANCE.createCodeSyncElement(); executeInDiagramEditorStatefulService(new Runnable() { @Override public void run() { a.setName("a"); b.setName("b"); c.setName("c"); srcDir.getChildren().add(a); srcDir.getChildren().add(b); srcDir.getChildren().add(c); } }); Changes changes; changes = observedChanges.remove(a); assertNotNull("Changes expected", changes); assertEquals("1 addedTo item", 1, changes.getAddedTo().size()); assertNull("No removedItems", changes.getRemovedFrom()); assertSame("addedTo item", srcDir, changes.getAddedTo().get(0).a); changes = observedChanges.remove(b); assertNotNull("Changes expected", changes); assertEquals("1 addedTo item", 1, changes.getAddedTo().size()); assertNull("No removedItems", changes.getRemovedFrom()); assertSame("addedTo item", srcDir, changes.getAddedTo().get(0).a); changes = observedChanges.remove(c); assertNotNull("Changes expected", changes); assertEquals("1 addedTo item", 1, changes.getAddedTo().size()); assertNull("No removedItems", changes.getRemovedFrom()); assertSame("addedTo item", srcDir, changes.getAddedTo().get(0).a); observedChanges.remove(srcDir); assertEquals("No other objects changed", 0, observedChanges.size()); } /** * Same as above. But this time the list is not empty! */ { observedChanges.clear(); final CodeSyncElement a = CodeSyncFactory.eINSTANCE.createCodeSyncElement(); final CodeSyncElement b = CodeSyncFactory.eINSTANCE.createCodeSyncElement(); final CodeSyncElement c = CodeSyncFactory.eINSTANCE.createCodeSyncElement(); executeInDiagramEditorStatefulService(new Runnable() { @Override public void run() { a.setName("a1"); b.setName("b1"); c.setName("c1"); srcDir.getChildren().add(a); srcDir.getChildren().add(b); srcDir.getChildren().add(c); } }); Changes changes; changes = observedChanges.remove(a); assertNotNull("Changes expected", changes); assertEquals("1 addedTo item", 1, changes.getAddedTo().size()); assertNull("No removedItems", changes.getRemovedFrom()); assertSame("addedTo item", srcDir, changes.getAddedTo().get(0).a); changes = observedChanges.remove(b); assertNotNull("Changes expected", changes); assertEquals("1 addedTo item", 1, changes.getAddedTo().size()); assertNull("No removedItems", changes.getRemovedFrom()); assertSame("addedTo item", srcDir, changes.getAddedTo().get(0).a); changes = observedChanges.remove(c); assertNotNull("Changes expected", changes); assertEquals("1 addedTo item", 1, changes.getAddedTo().size()); assertNull("No removedItems", changes.getRemovedFrom()); assertSame("addedTo item", srcDir, changes.getAddedTo().get(0).a); observedChanges.remove(srcDir); assertEquals("No other objects changed", 0, observedChanges.size()); } /** * Same as above. But this time the list is not empty! * And we insert (not add at the end). */ { observedChanges.clear(); final CodeSyncElement a = CodeSyncFactory.eINSTANCE.createCodeSyncElement(); final CodeSyncElement b = CodeSyncFactory.eINSTANCE.createCodeSyncElement(); final CodeSyncElement c = CodeSyncFactory.eINSTANCE.createCodeSyncElement(); executeInDiagramEditorStatefulService(new Runnable() { @Override public void run() { a.setName("a2"); b.setName("b2"); c.setName("c2"); srcDir.getChildren().add(srcDir.getChildren().size() - 1, a); srcDir.getChildren().add(0, b); srcDir.getChildren().add(srcDir.getChildren().size() / 2, c); } }); Changes changes; changes = observedChanges.remove(a); assertNotNull("Changes expected", changes); assertEquals("1 addedTo item", 1, changes.getAddedTo().size()); assertNull("No removedItems", changes.getRemovedFrom()); assertSame("addedTo item", srcDir, changes.getAddedTo().get(0).a); changes = observedChanges.remove(b); assertNotNull("Changes expected", changes); assertEquals("1 addedTo item", 1, changes.getAddedTo().size()); assertNull("No removedItems", changes.getRemovedFrom()); assertSame("addedTo item", srcDir, changes.getAddedTo().get(0).a); changes = observedChanges.remove(c); assertNotNull("Changes expected", changes); assertEquals("1 addedTo item", 1, changes.getAddedTo().size()); assertNull("No removedItems", changes.getRemovedFrom()); assertSame("addedTo item", srcDir, changes.getAddedTo().get(0).a); observedChanges.remove(srcDir); assertEquals("No other objects changed", 0, observedChanges.size()); } /** * Delete elements at various indexes. */ { observedChanges.clear(); assertEquals("Number of elements in srcDir", 9, srcDir.getChildren().size()); final CodeSyncElement a = srcDir.getChildren().get(8); final CodeSyncElement b = srcDir.getChildren().get(7); final CodeSyncElement c = srcDir.getChildren().get(4); final CodeSyncElement d = srcDir.getChildren().get(0); executeInDiagramEditorStatefulService(new Runnable() { @Override public void run() { srcDir.getChildren().remove(a); srcDir.getChildren().remove(b); srcDir.getChildren().remove(c); srcDir.getChildren().remove(d); } }); Changes changes; changes = observedChanges.remove(a); assertNotNull("Changes expected", changes); assertNull("No addedItems", changes.getAddedTo()); assertEquals("1 removedFrom items", 1, changes.getRemovedFrom().size()); assertSame("removedFrom item", srcDir, changes.getRemovedFrom().get(0).a); changes = observedChanges.remove(b); assertNotNull("Changes expected", changes); assertNull("No addedItems", changes.getAddedTo()); assertEquals("1 removedFrom items", 1, changes.getRemovedFrom().size()); assertSame("removedFrom item", srcDir, changes.getRemovedFrom().get(0).a); changes = observedChanges.remove(c); assertNotNull("Changes expected", changes); assertNull("No addedItems", changes.getAddedTo()); assertEquals("1 removedFrom items", 1, changes.getRemovedFrom().size()); assertSame("removedFrom item", srcDir, changes.getRemovedFrom().get(0).a); changes = observedChanges.remove(d); assertNotNull("Changes expected", changes); assertNull("No addedItems", changes.getAddedTo()); assertEquals("1 removedFrom items", 1, changes.getRemovedFrom().size()); assertSame("removedFrom item", srcDir, changes.getRemovedFrom().get(0).a); observedChanges.remove(srcDir); assertEquals("No other objects changed", 0, observedChanges.size()); } /** * Mixed add and delete */ { observedChanges.clear(); assertEquals("Number of elements in srcDir", 5, srcDir.getChildren().size()); final CodeSyncElement a = CodeSyncFactory.eINSTANCE.createCodeSyncElement(); final CodeSyncElement b = CodeSyncFactory.eINSTANCE.createCodeSyncElement(); final CodeSyncElement c = CodeSyncFactory.eINSTANCE.createCodeSyncElement(); final CodeSyncElement d = srcDir.getChildren().get(0); final CodeSyncElement e = srcDir.getChildren().get(srcDir.getChildren().size() - 1); executeInDiagramEditorStatefulService(new Runnable() { @Override public void run() { srcDir.getChildren().remove(d); a.setName("a3"); b.setName("b3"); c.setName("c3"); srcDir.getChildren().add(srcDir.getChildren().size() - 1, a); srcDir.getChildren().add(0, b); srcDir.getChildren().add(srcDir.getChildren().size() / 2, c); srcDir.getChildren().remove(e); } }); Changes changes; changes = observedChanges.remove(a); assertNotNull("Changes expected", changes); assertEquals("1 addedTo item", 1, changes.getAddedTo().size()); assertNull("No removedItems", changes.getRemovedFrom()); assertSame("addedTo item", srcDir, changes.getAddedTo().get(0).a); changes = observedChanges.remove(b); assertNotNull("Changes expected", changes); assertEquals("1 addedTo item", 1, changes.getAddedTo().size()); assertNull("No removedItems", changes.getRemovedFrom()); assertSame("addedTo item", srcDir, changes.getAddedTo().get(0).a); changes = observedChanges.remove(c); assertNotNull("Changes expected", changes); assertEquals("1 addedTo item", 1, changes.getAddedTo().size()); assertNull("No removedItems", changes.getRemovedFrom()); assertSame("addedTo item", srcDir, changes.getAddedTo().get(0).a); changes = observedChanges.remove(d); assertNotNull("Changes expected", changes); assertNull("No addedItems", changes.getAddedTo()); assertEquals("1 removedFrom items", 1, changes.getRemovedFrom().size()); assertSame("removedFrom item", srcDir, changes.getRemovedFrom().get(0).a); changes = observedChanges.remove(e); assertNotNull("Changes expected", changes); assertNull("No addedItems", changes.getAddedTo()); assertEquals("1 removedFrom items", 1, changes.getRemovedFrom().size()); assertSame("removedFrom item", srcDir, changes.getRemovedFrom().get(0).a); observedChanges.remove(srcDir); assertEquals("No other objects changed", 0, observedChanges.size()); } } }