package org.archstudio.xadl; import java.util.Arrays; import java.util.List; import org.archstudio.xadl3.domain_3_0.DomainExtension; import org.archstudio.xadl3.domain_3_0.Domain_3_0Factory; import org.archstudio.xadl3.domain_3_0.Domain_3_0Package; import org.archstudio.xadl3.hints_3_0.HintsExtension; import org.archstudio.xadl3.hints_3_0.Hints_3_0Factory; import org.archstudio.xadl3.hints_3_0.Hints_3_0Package; import org.archstudio.xadl3.structure_3_0.Component; import org.archstudio.xadl3.structure_3_0.Interface; import org.archstudio.xadl3.structure_3_0.Structure; import org.archstudio.xadl3.structure_3_0.Structure_3_0Factory; import org.archstudio.xadl3.structure_3_0.Structure_3_0Package; import org.archstudio.xadl3.structure_3_0.SubStructure; import org.archstudio.xadl3.xadlcore_3_0.DocumentRoot; import org.archstudio.xadl3.xadlcore_3_0.XADLType; import org.archstudio.xadl3.xadlcore_3_0.Xadlcore_3_0Factory; import org.archstudio.xadl3.xadlcore_3_0.Xadlcore_3_0Package; import org.archstudio.xarchadt.IXArchADT; import org.archstudio.xarchadt.ObjRef; import org.archstudio.xarchadt.XArchADTModelEvent; import org.archstudio.xarchadt.XArchADTProxy; import org.archstudio.xarchadt.core.XArchADTImpl; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import com.google.common.collect.Lists; import junit.framework.TestCase; public class XArchRelativePathTrackerTest extends TestCase { static { @SuppressWarnings("unused") EPackage p; p = Xadlcore_3_0Package.eINSTANCE; p = Structure_3_0Package.eINSTANCE; p = Hints_3_0Package.eINSTANCE; p = Domain_3_0Package.eINSTANCE; } IXArchADT xarch; int documentCount = 0; Xadlcore_3_0Factory coreF; Structure_3_0Factory structureF; Hints_3_0Factory hintsF; Domain_3_0Factory domainF; DocumentRoot documentRoot; XADLType xadl; Structure structure; Component comp; Interface iface; SubStructure compSubStructure; Structure subStructure; Component subComp; XArchRelativePathTracker tracker; List<String> results; @Override protected void setUp() throws Exception { xarch = new XArchADTImpl(); coreF = XArchADTProxy.proxy(xarch, Xadlcore_3_0Package.eNS_URI); structureF = XArchADTProxy.proxy(xarch, Structure_3_0Package.eNS_URI); hintsF = XArchADTProxy.proxy(xarch, Hints_3_0Package.eNS_URI); domainF = XArchADTProxy.proxy(xarch, Domain_3_0Package.eNS_URI); documentRoot = XArchADTProxy.proxy(xarch, xarch.createDocument(URI.createURI("urn://" + ++documentCount))); xadl = coreF.createXADLType(); structure = structureF.createStructure(); comp = structureF.createComponent(); iface = structureF.createInterface(); compSubStructure = structureF.createSubStructure(); subStructure = structureF.createStructure(); subComp = structureF.createComponent(); documentRoot.setXADL(xadl); xadl.getTopLevelElement().add(structure); structure.getComponent().add(comp); comp.getInterface().add(iface); comp.setSubStructure(compSubStructure); compSubStructure.setInnerStructureLink(subStructure); subStructure.getComponent().add(subComp); results = Lists.newArrayList(); } private void initTracker(ObjRef rootRef, String xPath) { tracker = new XArchRelativePathTracker(xarch, rootRef, xPath, false); tracker.addTrackerListener(new IXArchRelativePathTrackerListener() { private void checkDescendants(List<ObjRef> descendantRefs) { for (int i = 1; i < descendantRefs.size(); ++i) { ObjRef parentRef = xarch.getParent(descendantRefs.get(i)); if (parentRef != null) { assertEquals(descendantRefs.get(i - 1), parentRef); } } } @Override public void processAdd(List<ObjRef> descendantRefs, ObjRef addedRef) { checkDescendants(descendantRefs); results.add("A:" + addedRef); } @Override public void processUpdate(List<ObjRef> descendantRefs, ObjRef modifiedRef, XArchADTModelEvent relativeEvt) { checkDescendants(descendantRefs); results.add("U:" + modifiedRef + ":" + relativeEvt.getSourcePath()); } @Override public void processRemove(List<ObjRef> descendantRefs, ObjRef objRef) { checkDescendants(descendantRefs); results.add("R:" + objRef); } }); ((XArchADTImpl) xarch).addXArchADTModelListener(tracker); tracker.startScanning(); } private static String a(EObject o) { return "A:" + XArchADTProxy.unproxy(o); } private static String u(EObject o, String path) { return "U:" + XArchADTProxy.unproxy(o) + ":" + path; } private static String r(EObject o) { return "R:" + XArchADTProxy.unproxy(o); } private void assertEvents(String... a) { assertEquals(Arrays.asList(a), results); } public void testTrack1() { initTracker(XArchADTProxy.unproxy(structure), "component"); assertEvents(a(comp)); structure.getComponent().remove(comp); assertEvents(a(comp), r(comp)); } public void testTrack1Attribute() { initTracker(XArchADTProxy.unproxy(structure), "component"); assertEvents(a(comp)); comp.setId("SomeID"); assertEvents(a(comp), u(comp, "")); comp.setId(null); assertEvents(a(comp), u(comp, ""), u(comp, "")); } public void testTrack1Attribute2() { initTracker(XArchADTProxy.unproxy(structure), "component"); assertEvents(a(comp)); iface.setId(null); assertEvents(a(comp)); iface.setId("SomeID"); assertEvents(a(comp), u(comp, "interface")); } public void testTrack1Attributec() { initTracker(XArchADTProxy.unproxy(structure), "component"); assertEvents(a(comp)); comp.setId("SomeID"); assertEvents(a(comp), u(comp, "")); xarch.clear(XArchADTProxy.unproxy(comp), "id"); assertEvents(a(comp), u(comp, ""), u(comp, "")); } public void testTrack1Attribute2c() { initTracker(XArchADTProxy.unproxy(structure), "component"); assertEvents(a(comp)); xarch.clear(XArchADTProxy.unproxy(iface), "id"); assertEvents(a(comp)); iface.setId("SomeID"); assertEvents(a(comp), u(comp, "interface")); } public void testTrack1Attribute3() { initTracker(XArchADTProxy.unproxy(structure), "component"); assertEvents(a(comp)); iface.setId("SomeID"); assertEvents(a(comp), u(comp, "interface")); iface.setId("SomeOtherId"); assertEvents(a(comp), u(comp, "interface"), u(comp, "interface")); } public void testTrack1Substructure1() { initTracker(XArchADTProxy.unproxy(structure), "component"); assertEvents(a(comp)); comp.setSubStructure(null); assertEvents(a(comp), u(comp, "")); comp.setSubStructure(compSubStructure); assertEvents(a(comp), u(comp, ""), u(comp, "")); compSubStructure.setId("id"); assertEvents(a(comp), u(comp, ""), u(comp, ""), u(comp, "subStructure")); } public void testTrack1Add1() { initTracker(XArchADTProxy.unproxy(structure), "component"); assertEvents(a(comp)); Component comp2 = structureF.createComponent(); structure.getComponent().add(comp2); assertEvents(a(comp), a(comp2)); structure.getComponent().remove(comp2); assertEvents(a(comp), a(comp2), r(comp2)); } public void testTrack1Add1_2() { initTracker(XArchADTProxy.unproxy(structure), "component"); assertEvents(a(comp)); Component comp2 = structureF.createComponent(); Interface iface2 = structureF.createInterface(); structure.getComponent().add(comp2); assertEvents(a(comp), a(comp2)); comp2.getInterface().add(iface2); assertEvents(a(comp), a(comp2), u(comp2, "")); iface2.setId("id"); assertEvents(a(comp), a(comp2), u(comp2, ""), u(comp2, "interface")); comp2.getInterface().remove(iface2); assertEvents(a(comp), a(comp2), u(comp2, ""), u(comp2, "interface"), u(comp2, "")); structure.getComponent().remove(comp2); assertEvents(a(comp), a(comp2), u(comp2, ""), u(comp2, "interface"), u(comp2, ""), r(comp2)); } public void testTrack1Add2_1() { initTracker(XArchADTProxy.unproxy(structure), "component"); assertEvents(a(comp)); Component comp2 = structureF.createComponent(); Interface iface2 = structureF.createInterface(); comp2.getInterface().add(iface2); assertEvents(a(comp)); structure.getComponent().add(comp2); assertEvents(a(comp), a(comp2)); structure.getComponent().remove(comp2); assertEvents(a(comp), a(comp2), r(comp2)); comp2.getInterface().remove(iface2); assertEvents(a(comp), a(comp2), r(comp2)); } public void testTrack2Add1_2() { initTracker(XArchADTProxy.unproxy(structure), "component/interface"); assertEvents(a(iface)); Component comp2 = structureF.createComponent(); Interface iface2 = structureF.createInterface(); structure.getComponent().add(comp2); assertEvents(a(iface)); comp2.getInterface().add(iface2); assertEvents(a(iface), a(iface2)); comp2.getInterface().remove(iface2); assertEvents(a(iface), a(iface2), r(iface2)); structure.getComponent().remove(comp2); assertEvents(a(iface), a(iface2), r(iface2)); } public void testTrack2Add2_1() { initTracker(XArchADTProxy.unproxy(structure), "component/interface"); assertEvents(a(iface)); Component comp2 = structureF.createComponent(); Interface iface2 = structureF.createInterface(); comp2.getInterface().add(iface2); assertEvents(a(iface)); structure.getComponent().add(comp2); assertEvents(a(iface), a(iface2)); structure.getComponent().remove(comp2); assertEvents(a(iface), a(iface2), r(iface2)); comp2.getInterface().remove(iface2); assertEvents(a(iface), a(iface2), r(iface2)); } public void testTrack2Add2_3() { initTracker(XArchADTProxy.unproxy(structure), "component/interface"); assertEvents(a(iface)); Component comp2 = structureF.createComponent(); Interface iface2 = structureF.createInterface(); comp2.getInterface().add(iface2); assertEvents(a(iface)); structure.getComponent().add(comp2); assertEvents(a(iface), a(iface2)); HintsExtension compHintsExtension = hintsF.createHintsExtension(); comp2.getExt().add(compHintsExtension); assertEvents(a(iface), a(iface2)); HintsExtension ifaceHintsExtension = hintsF.createHintsExtension(); iface2.getExt().add(ifaceHintsExtension); assertEvents(a(iface), a(iface2), u(iface2, "")); } public void testExtension1() { initTracker(XArchADTProxy.unproxy(structure), // "component/ext[*[namespace-uri()='" + Domain_3_0Package.eNS_URI + "']]"); assertEvents(); DomainExtension domainExt = domainF.createDomainExtension(); comp.getExt().add(domainExt); assertEvents(a(domainExt)); HintsExtension hintsExt = hintsF.createHintsExtension(); comp.getExt().add(hintsExt); assertEvents(a(domainExt)); comp.getExt().remove(domainExt); assertEvents(a(domainExt), r(domainExt)); Component comp2 = structureF.createComponent(); DomainExtension domainExt2 = domainF.createDomainExtension(); comp2.getExt().add(domainExt2); HintsExtension hintsExt2 = hintsF.createHintsExtension(); comp2.getExt().add(hintsExt2); structure.getComponent().add(comp2); assertEvents(a(domainExt), r(domainExt), a(domainExt2)); } public void testAttributeChange() { initTracker(XArchADTProxy.unproxy(structure), // "component[contains(@name, 'x')]"); Component comp1 = structureF.createComponent(); comp1.setName("1x"); structure.getComponent().add(comp1); assertEvents(a(comp1)); Component comp2 = structureF.createComponent(); structure.getComponent().add(comp2); assertEvents(a(comp1)); comp2.setName("2x"); assertEvents(a(comp1), a(comp2)); comp1.setName("1y"); assertEvents(a(comp1), a(comp2), r(comp1)); comp2.setName("2y"); assertEvents(a(comp1), a(comp2), r(comp1), r(comp2)); } public void testChildAttributeChange() { initTracker(XArchADTProxy.unproxy(structure), // "component[contains(@name, 'x')]/interface"); Component comp1 = structureF.createComponent(); Interface iface1a = structureF.createInterface(); comp1.getInterface().add(iface1a); comp1.setName("1x"); structure.getComponent().add(comp1); assertEvents(a(iface1a)); Component comp2 = structureF.createComponent(); Interface iface2a = structureF.createInterface(); comp2.getInterface().add(iface2a); structure.getComponent().add(comp2); assertEvents(a(iface1a)); comp2.setName("2x"); assertEvents(a(iface1a), a(iface2a)); comp1.setName("1y"); assertEvents(a(iface1a), a(iface2a), r(iface1a)); comp2.setName("2y"); assertEvents(a(iface1a), a(iface2a), r(iface1a), r(iface2a)); } }