blob: d300588cda64bf17bc3ed8526f77f6e4b373eba8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2007 Boeing.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.osee.client.integration.tests.integration.skynet.core;
import static org.eclipse.osee.client.demo.DemoChoice.OSEE_CLIENT_DEMO;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.osee.client.test.framework.OseeClientIntegrationRule;
import org.eclipse.osee.client.test.framework.OseeHousekeepingRule;
import org.eclipse.osee.client.test.framework.OseeLogMonitorRule;
import org.eclipse.osee.framework.core.data.IRelationType;
import org.eclipse.osee.framework.core.enums.CoreArtifactTypes;
import org.eclipse.osee.framework.core.enums.CoreAttributeTypes;
import org.eclipse.osee.framework.core.enums.CoreRelationTypes;
import org.eclipse.osee.framework.core.exception.OseeCoreException;
import org.eclipse.osee.framework.core.exception.OseeDataStoreException;
import org.eclipse.osee.framework.core.model.event.DefaultBasicGuidRelationReorder;
import org.eclipse.osee.framework.core.model.event.RelationOrderModType;
import org.eclipse.osee.framework.database.core.ConnectionHandler;
import org.eclipse.osee.framework.jdk.core.util.GUID;
import org.eclipse.osee.framework.messaging.event.res.AttributeEventModificationType;
import org.eclipse.osee.framework.messaging.event.res.msgs.RemoteAttributeChange1;
import org.eclipse.osee.framework.messaging.event.res.msgs.RemoteBasicGuidArtifact1;
import org.eclipse.osee.framework.messaging.event.res.msgs.RemoteBasicGuidRelation1;
import org.eclipse.osee.framework.messaging.event.res.msgs.RemoteBasicGuidRelationReorder1;
import org.eclipse.osee.framework.messaging.event.res.msgs.RemoteNetworkSender1;
import org.eclipse.osee.framework.messaging.event.res.msgs.RemotePersistEvent1;
import org.eclipse.osee.framework.skynet.core.OseeSystemArtifacts;
import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
import org.eclipse.osee.framework.skynet.core.artifact.BranchManager;
import org.eclipse.osee.framework.skynet.core.artifact.ChangeArtifactType;
import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
import org.eclipse.osee.framework.skynet.core.event.FrameworkEventUtil;
import org.eclipse.osee.framework.skynet.core.event.OseeEventManager;
import org.eclipse.osee.framework.skynet.core.event.filter.IEventFilter;
import org.eclipse.osee.framework.skynet.core.event.listener.IArtifactEventListener;
import org.eclipse.osee.framework.skynet.core.event.model.ArtifactEvent;
import org.eclipse.osee.framework.skynet.core.event.model.AttributeChange;
import org.eclipse.osee.framework.skynet.core.event.model.EventBasicGuidArtifact;
import org.eclipse.osee.framework.skynet.core.event.model.EventBasicGuidRelation;
import org.eclipse.osee.framework.skynet.core.event.model.EventChangeTypeBasicGuidArtifact;
import org.eclipse.osee.framework.skynet.core.event.model.EventModType;
import org.eclipse.osee.framework.skynet.core.event.model.EventModifiedBasicGuidArtifact;
import org.eclipse.osee.framework.skynet.core.event.model.Sender;
import org.eclipse.osee.framework.skynet.core.relation.RelationEventType;
import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction;
import org.eclipse.osee.framework.skynet.core.transaction.TransactionManager;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
/**
* @author Donald G. Dunne
*/
public class ArtifactEventTest {
@Rule
public OseeClientIntegrationRule integration = new OseeClientIntegrationRule(OSEE_CLIENT_DEMO);
private final String[] ignoreLogs = isRemoteTest() ? new String[] {
"OEM: ArtifactEvent Loopback enabled",
"OEM: kickArtifactReloadEvent Loopback enabled",
"OEM2: ArtifactEvent Loopback enabled",
"OEM2: kickArtifactReloadEvent Loopback enabled"} : new String[] {"Duplicate relation objects"};
@Rule
public OseeLogMonitorRule monitorRule = new OseeLogMonitorRule(ignoreLogs);
@Rule
public OseeHousekeepingRule oseeHousekeepingRule = new OseeHousekeepingRule();
private static int incrementingGammaId = 2231;
private ArtifactEventListener listener;
private RemoteNetworkSender1 networkSender;
@Before
public void setup() {
listener = new ArtifactEventListener();
networkSender = new RemoteNetworkSender1();
networkSender.setSourceObject(ArtifactEventTest.class.getName());
networkSender.setSessionId("N23422.32");
networkSender.setMachineName("A2340422");
networkSender.setUserId("b345344");
networkSender.setMachineIp("123.421.56.342");
networkSender.setPort(485);
networkSender.setClientVersion("123.2");
OseeEventManager.getPreferences().setPendRunning(true);
}
@After
public void cleanup() {
OseeEventManager.getPreferences().setPendRunning(false);
}
@Test
public void testRegistration() throws Exception {
OseeEventManager.removeAllListeners();
Assert.assertEquals(0, OseeEventManager.getNumberOfListeners());
OseeEventManager.addListener(listener);
Assert.assertEquals(1, OseeEventManager.getNumberOfListeners());
OseeEventManager.removeListener(listener);
Assert.assertEquals(0, OseeEventManager.getNumberOfListeners());
}
/**
* Test remote event system's injection of changes coming in by creating fake remote events and sending them through
* remote event manager's onEvent then check the corresponding artifact/relation for changes. This tests that
* incoming events correctly inject changes into artifact/relations.
*/
@Test
public void testArtifactRelationInjectionEvents() throws Exception {
// Nothing to test in remote test
if (isRemoteTest()) {
return;
}
OseeEventManager.removeAllListeners();
Assert.assertEquals(0, OseeEventManager.getNumberOfListeners());
OseeEventManager.addListener(listener);
Assert.assertEquals(1, OseeEventManager.getNumberOfListeners());
// Test attribute injection
Artifact injectArt = remoteInjection_attributes_modifyName();
remoteInjection_attributes_addNewAttribute(injectArt);
remoteInjection_attributes_deleteAttribute(injectArt);
// Test relation injection
Artifact rootArt = OseeSystemArtifacts.getDefaultHierarchyRootArtifact(BranchManager.getCommonBranch());
Assert.assertEquals(0, injectArt.internalGetRelations(rootArt).size());
remoteInjection_relations_addNewRelation(rootArt, injectArt);
remoteInjection_relations_deleteRelation(rootArt, injectArt);
remoteInjection_relations_addNewRelationWithRationale(rootArt, injectArt);
remoteInjection_relations_modifyRelationRationale(rootArt, injectArt);
remoteInjection_relations_reorderRelation(rootArt, injectArt);
}
@Test
public void testArtifactRelationEvents() throws Exception {
OseeEventManager.removeAllListeners();
Assert.assertEquals(0, OseeEventManager.getNumberOfListeners());
OseeEventManager.addListener(listener);
Assert.assertEquals(1, OseeEventManager.getNumberOfListeners());
Artifact newArt = testArtifactRelationEvents__addArtifact();
testArtifactRelationEvents__addRelation(newArt);
testArtifactRelationEvents__modifyArtifact(newArt);
testArtifactRelationEvents__modifyRelation(newArt);
testArtifactRelationEvents__deleteArtifact(newArt);
}
@Test
public void testArtifactRelationReorderEvents() throws Exception {
OseeEventManager.removeAllListeners();
Assert.assertEquals(0, OseeEventManager.getNumberOfListeners());
// Setup artifact and children to reorder
SkynetTransaction transaction =
TransactionManager.createTransaction(BranchManager.getCommonBranch(), getClass().getSimpleName());
Artifact newArt =
ArtifactTypeManager.addArtifact(CoreArtifactTypes.Folder, BranchManager.getCommonBranch(),
getClass().getSimpleName() + " - testArtifactRelationReorderEvents");
newArt.persist(transaction);
for (int x = 1; x < 6; x++) {
Artifact childArt =
ArtifactTypeManager.addArtifact(CoreArtifactTypes.Folder, BranchManager.getCommonBranch(),
"testRelationReorder - child " + x);
newArt.addChild(childArt);
newArt.persist(transaction);
}
transaction.execute();
OseeEventManager.addListener(listener);
Assert.assertEquals(1, OseeEventManager.getNumberOfListeners());
List<Artifact> orderedChildren = newArt.getChildren();
Assert.assertEquals(5, orderedChildren.size());
Assert.assertTrue(orderedChildren.get(0).getName().endsWith(" 1"));
Assert.assertTrue(orderedChildren.get(1).getName().endsWith(" 2"));
Assert.assertTrue(orderedChildren.get(2).getName().endsWith(" 3"));
Assert.assertTrue(orderedChildren.get(3).getName().endsWith(" 4"));
Assert.assertTrue(orderedChildren.get(4).getName().endsWith(" 5"));
List<Artifact> artifactsInNewOrder = new ArrayList<Artifact>();
artifactsInNewOrder.add(orderedChildren.get(0));
artifactsInNewOrder.add(orderedChildren.get(1));
artifactsInNewOrder.add(orderedChildren.get(3));
artifactsInNewOrder.add(orderedChildren.get(2));
artifactsInNewOrder.add(orderedChildren.get(4));
newArt.setRelationOrder(CoreRelationTypes.Default_Hierarchical__Child, artifactsInNewOrder);
newArt.persist(getClass().getSimpleName());
Assert.assertEquals("newArt will change cause attribute modified", 1, listener.getArtifacts().size());
Assert.assertEquals("No relations events should be sent", 0, listener.getRelations().size());
Assert.assertEquals("1 reorder events should be sent", 1, listener.getReorders().size());
if (isRemoteTest()) {
Assert.assertTrue(listener.getSender().isRemote());
} else {
Assert.assertTrue(listener.getSender().isLocal());
}
DefaultBasicGuidRelationReorder guidReorder = listener.getReorders().iterator().next();
Assert.assertEquals(RelationOrderModType.Absolute, guidReorder.getModType());
Assert.assertEquals(newArt.getGuid(), guidReorder.getParentArt().getGuid());
Assert.assertEquals(newArt.getArtTypeGuid(), guidReorder.getParentArt().getArtTypeGuid());
Assert.assertEquals(newArt.getBranchGuid(), guidReorder.getParentArt().getBranchGuid());
Assert.assertEquals(CoreRelationTypes.Default_Hierarchical__Child.getGuid(), guidReorder.getRelTypeGuid());
List<Artifact> newOrderedChildren = newArt.getChildren();
Assert.assertEquals(5, newOrderedChildren.size());
Assert.assertTrue(newOrderedChildren.get(0).getName().endsWith(" 1"));
Assert.assertTrue(newOrderedChildren.get(1).getName().endsWith(" 2"));
Assert.assertTrue(newOrderedChildren.get(2).getName().endsWith(" 4"));
Assert.assertTrue(newOrderedChildren.get(3).getName().endsWith(" 3"));
Assert.assertTrue(newOrderedChildren.get(4).getName().endsWith(" 5"));
}
@Test
public void testPurgeArtifactEvents() throws Exception {
OseeEventManager.removeAllListeners();
Assert.assertEquals(0, OseeEventManager.getNumberOfListeners());
// Add new Artifact Test
Artifact newArt = ArtifactTypeManager.addArtifact(CoreArtifactTypes.GeneralData, BranchManager.getCommonBranch());
newArt.setName(getClass().getSimpleName() + " - testPurgeArtifactEvents");
newArt.persist(getClass().getSimpleName());
OseeEventManager.addListener(listener);
Assert.assertEquals(1, OseeEventManager.getNumberOfListeners());
// Purge Artifact
newArt.purgeFromBranch();
Assert.assertEquals(1, listener.getArtifacts().size());
EventBasicGuidArtifact guidArt = listener.getArtifacts().iterator().next();
Assert.assertEquals(EventModType.Purged, guidArt.getModType());
if (isRemoteTest()) {
Assert.assertTrue(listener.getSender().isRemote());
} else {
Assert.assertTrue(listener.getSender().isLocal());
}
Assert.assertEquals(newArt.getGuid(), guidArt.getGuid());
Assert.assertEquals(newArt.getArtifactType().getGuid(), guidArt.getArtTypeGuid());
Assert.assertEquals(newArt.getBranch().getGuid(), guidArt.getBranchGuid());
}
@Test
public void testReloadArtifactEvents() throws Exception {
OseeEventManager.removeAllListeners();
Assert.assertEquals(0, OseeEventManager.getNumberOfListeners());
// Add new Artifact Test
Artifact newArt = ArtifactTypeManager.addArtifact(CoreArtifactTypes.GeneralData, BranchManager.getCommonBranch());
newArt.setName(getClass().getSimpleName() + " - testReloadArtifactEvents");
newArt.persist(getClass().getSimpleName());
OseeEventManager.addListener(listener);
Assert.assertEquals(1, OseeEventManager.getNumberOfListeners());
// reload Artifact
newArt.setSingletonAttributeValue(CoreAttributeTypes.StaticId, "this");
Assert.assertTrue(newArt.isDirty());
newArt.reloadAttributesAndRelations();
Assert.assertFalse(newArt.isDirty());
// Reload events are local only, confirm that nothing comes through remote
if (isRemoteTest()) {
Assert.assertEquals(0, listener.getArtifacts().size());
} else {
Assert.assertEquals(1, listener.getArtifacts().size());
EventBasicGuidArtifact guidArt = listener.getArtifacts().iterator().next();
Assert.assertEquals(EventModType.Reloaded, guidArt.getModType());
Assert.assertTrue(listener.getSender().isLocal());
Assert.assertEquals(newArt.getGuid(), guidArt.getGuid());
Assert.assertEquals(newArt.getArtifactType().getGuid(), guidArt.getArtTypeGuid());
Assert.assertEquals(newArt.getBranch().getGuid(), guidArt.getBranchGuid());
}
}
@Test
public void testChangeTypeArtifactEvents() throws Exception {
OseeEventManager.removeAllListeners();
Assert.assertEquals(0, OseeEventManager.getNumberOfListeners());
// Add new Artifact for Test
Artifact newArt = ArtifactTypeManager.addArtifact(CoreArtifactTypes.GeneralData, BranchManager.getCommonBranch());
newArt.setName(getClass().getSimpleName() + " - testChangeTypeArtifactEvents");
newArt.persist(getClass().getSimpleName());
OseeEventManager.addListener(listener);
Assert.assertEquals(1, OseeEventManager.getNumberOfListeners());
// reload Artifact
Assert.assertTrue(newArt.isOfType(CoreArtifactTypes.GeneralData));
ChangeArtifactType.changeArtifactType(Arrays.asList(newArt), CoreArtifactTypes.Heading);
Assert.assertEquals(1, listener.getArtifacts().size());
EventChangeTypeBasicGuidArtifact guidArt =
(EventChangeTypeBasicGuidArtifact) listener.getArtifacts().iterator().next();
Assert.assertEquals(EventModType.ChangeType, guidArt.getModType());
if (isRemoteTest()) {
Assert.assertTrue(listener.getSender().isRemote());
} else {
Assert.assertTrue(listener.getSender().isLocal());
}
Assert.assertEquals(newArt.getGuid(), guidArt.getGuid());
Assert.assertEquals(newArt.getBranch().getGuid(), guidArt.getBranchGuid());
Assert.assertEquals(CoreArtifactTypes.Heading.getGuid(), guidArt.getArtTypeGuid());
Assert.assertEquals(CoreArtifactTypes.GeneralData.getGuid(), guidArt.getFromArtTypeGuid());
// Reload artifact; since artifact cache cleared, it should be loaded as new artifact type
Artifact changedArt = ArtifactQuery.getArtifactFromId(newArt.getGuid(), newArt.getBranch());
Assert.assertEquals(CoreArtifactTypes.Heading.getGuid(), changedArt.getArtifactType().getGuid());
}
protected boolean isRemoteTest() {
return false;
}
private RemotePersistEvent1 getFakeGeneralDataArtifactRemoteEventForArtifactModified(Artifact modifiedArt) throws OseeCoreException {
// Create fake remote event that would come in from another client
RemotePersistEvent1 remoteEvent = new RemotePersistEvent1();
// Set sender to something other than this client so event system will think came from another client
remoteEvent.setNetworkSender(networkSender);
remoteEvent.setTransactionId(1000);
remoteEvent.setBranchGuid(BranchManager.getCommonBranch().getGuid());
RemoteBasicGuidArtifact1 remGuidArt = new RemoteBasicGuidArtifact1();
remGuidArt.setModTypeGuid(EventModType.Modified.getGuid());
remGuidArt.setBranchGuid(BranchManager.getCommonBranch().getGuid());
remGuidArt.setArtTypeGuid(CoreArtifactTypes.GeneralData.getGuid());
remGuidArt.setArtGuid(modifiedArt.getGuid());
remoteEvent.getArtifacts().add(remGuidArt);
return remoteEvent;
}
private RemotePersistEvent1 getFakeGeneralDataArtifactRemoteEventForArtifactRelationModified(int relationId, RelationEventType relationEventType, IRelationType relType, Artifact artA, Artifact artB) throws OseeCoreException {
// Create fake remote event that would come in from another client
RemotePersistEvent1 remoteEvent = new RemotePersistEvent1();
// Set sender to something other than this client so event system will think came from another client
remoteEvent.setNetworkSender(networkSender);
remoteEvent.setTransactionId(1000);
remoteEvent.setBranchGuid(BranchManager.getCommonBranch().getGuid());
RemoteBasicGuidRelation1 remGuidRel = new RemoteBasicGuidRelation1();
remGuidRel.setModTypeGuid(relationEventType.getGuid());
remGuidRel.setBranchGuid(BranchManager.getCommonBranch().getGuid());
remGuidRel.setGammaId(incrementingGammaId++);
remGuidRel.setRelTypeGuid(relType.getGuid());
remGuidRel.setRelationId(relationId);
remGuidRel.setArtAId(artA.getArtId());
remGuidRel.setArtBId(artB.getArtId());
remGuidRel.setArtA(FrameworkEventUtil.getRemoteBasicGuidArtifact(artA.getBasicGuidArtifact()));
remGuidRel.setArtB(FrameworkEventUtil.getRemoteBasicGuidArtifact(artB.getBasicGuidArtifact()));
remoteEvent.getRelations().add(remGuidRel);
return remoteEvent;
}
private Artifact testArtifactRelationEvents__addArtifact() throws Exception {
Artifact newArt = ArtifactTypeManager.addArtifact(CoreArtifactTypes.GeneralData, BranchManager.getCommonBranch());
newArt.persist(getClass().getSimpleName());
Assert.assertEquals(2, listener.getArtifacts().size());
Assert.assertTrue("No relations events should be sent", listener.getRelations().isEmpty());
if (isRemoteTest()) {
Assert.assertTrue(listener.getSender().isRemote());
} else {
Assert.assertTrue(listener.getSender().isLocal());
}
boolean addedFound = false, modifiedFound = false;
for (EventBasicGuidArtifact guidArt : listener.getArtifacts()) {
if (guidArt.getModType() == EventModType.Added) {
addedFound = true;
}
if (guidArt.getModType() == EventModType.Modified) {
modifiedFound = true;
}
Assert.assertEquals(newArt.getGuid(), guidArt.getGuid());
Assert.assertEquals(newArt.getArtifactType().getGuid(), guidArt.getArtTypeGuid());
Assert.assertEquals(newArt.getBranch().getGuid(), guidArt.getBranchGuid());
}
Assert.assertTrue(addedFound);
Assert.assertTrue(modifiedFound);
Assert.assertFalse(newArt.isDirty());
return newArt;
}
private void testArtifactRelationEvents__addRelation(Artifact newArt) throws Exception {
listener.reset();
Artifact rootArt = OseeSystemArtifacts.getDefaultHierarchyRootArtifact(BranchManager.getCommonBranch());
rootArt.addChild(newArt);
rootArt.persist(getClass().getSimpleName());
Assert.assertEquals("No artifact events should be sent", 0, listener.getArtifacts().size());
Assert.assertEquals(1, listener.getRelations().size());
if (isRemoteTest()) {
Assert.assertTrue(listener.getSender().isRemote());
} else {
Assert.assertTrue(listener.getSender().isLocal());
}
EventBasicGuidRelation guidArt = listener.getRelations().iterator().next();
Assert.assertEquals(RelationEventType.Added, guidArt.getModType());
Assert.assertEquals(CoreRelationTypes.Default_Hierarchical__Child.getGuid(), guidArt.getRelTypeGuid());
RelationLink relLink = newArt.internalGetRelations(rootArt).iterator().next();
Assert.assertEquals(relLink.getGammaId(), guidArt.getGammaId());
Assert.assertEquals("", relLink.getRationale());
Assert.assertEquals(rootArt, guidArt.getArtA());
Assert.assertEquals(newArt, guidArt.getArtB());
Assert.assertFalse(rootArt.isDirty());
Assert.assertFalse(newArt.isDirty());
}
private void testArtifactRelationEvents__modifyArtifact(Artifact newArt) throws Exception {
listener.reset();
newArt.setSingletonAttributeValue(CoreAttributeTypes.StaticId, "this");
newArt.persist(getClass().getSimpleName());
Assert.assertEquals(1, listener.getArtifacts().size());
Assert.assertEquals("No relations events should be sent", 0, listener.getRelations().size());
if (isRemoteTest()) {
Assert.assertTrue(listener.getSender().isRemote());
} else {
Assert.assertTrue(listener.getSender().isLocal());
}
EventBasicGuidArtifact guidArt = listener.getArtifacts().iterator().next();
Assert.assertEquals(EventModType.Modified, guidArt.getModType());
Assert.assertEquals(newArt.getGuid(), guidArt.getGuid());
Assert.assertEquals(newArt.getArtifactType().getGuid(), guidArt.getArtTypeGuid());
Assert.assertEquals(newArt.getBranch().getGuid(), guidArt.getBranchGuid());
Assert.assertFalse(newArt.isDirty());
}
private void testArtifactRelationEvents__modifyRelation(Artifact newArt) throws Exception {
listener.reset();
Artifact rootArt = OseeSystemArtifacts.getDefaultHierarchyRootArtifact(BranchManager.getCommonBranch());
String NEW_RATIONALE_STR = "This is the rationale";
Assert.assertEquals(1, newArt.internalGetRelations(rootArt).size());
RelationLink relLink = newArt.internalGetRelations(rootArt).iterator().next();
relLink.setRationale(NEW_RATIONALE_STR);
newArt.persist(getClass().getSimpleName());
Assert.assertEquals("No artifact events should be sent", 0, listener.getArtifacts().size());
Assert.assertEquals(1, listener.getRelations().size());
if (isRemoteTest()) {
Assert.assertTrue(listener.getSender().isRemote());
} else {
Assert.assertTrue(listener.getSender().isLocal());
}
EventBasicGuidRelation guidArt = listener.getRelations().iterator().next();
Assert.assertEquals(RelationEventType.ModifiedRationale, guidArt.getModType());
Assert.assertEquals(CoreRelationTypes.Default_Hierarchical__Child.getGuid(), guidArt.getRelTypeGuid());
Assert.assertEquals(newArt.internalGetRelations(rootArt).iterator().next().getGammaId(), guidArt.getGammaId());
RelationLink modifiedRelLink = newArt.internalGetRelations(rootArt).iterator().next();
Assert.assertEquals(NEW_RATIONALE_STR, modifiedRelLink.getRationale());
Assert.assertEquals(rootArt, guidArt.getArtA());
Assert.assertEquals(newArt, guidArt.getArtB());
Assert.assertFalse(rootArt.isDirty());
Assert.assertFalse(newArt.isDirty());
}
private void testArtifactRelationEvents__deleteArtifact(Artifact newArt) throws Exception {
listener.reset();
newArt.deleteAndPersist();
Assert.assertEquals(2, listener.getArtifacts().size());
Assert.assertEquals(1, listener.getRelations().size());
boolean deletedFound = false;
boolean modifiedFound = false;
for (EventBasicGuidArtifact guidArt1 : listener.getArtifacts()) {
if (isRemoteTest()) {
Assert.assertTrue(listener.getSender().isRemote());
} else {
Assert.assertTrue(listener.getSender().isLocal());
}
if (guidArt1.getModType() == EventModType.Deleted) {
deletedFound = true;
}
if (guidArt1.getModType() == EventModType.Modified) {
modifiedFound = true;
}
Assert.assertEquals(newArt.getGuid(), guidArt1.getGuid());
Assert.assertEquals(newArt.getArtifactType().getGuid(), guidArt1.getArtTypeGuid());
Assert.assertEquals(newArt.getBranch().getGuid(), guidArt1.getBranchGuid());
}
Assert.assertTrue(deletedFound);
Assert.assertTrue(modifiedFound);
Artifact rootArt = OseeSystemArtifacts.getDefaultHierarchyRootArtifact(BranchManager.getCommonBranch());
EventBasicGuidRelation guidArt = listener.getRelations().iterator().next();
Assert.assertEquals(RelationEventType.Deleted, guidArt.getModType());
Assert.assertEquals(CoreRelationTypes.Default_Hierarchical__Child.getGuid(), guidArt.getRelTypeGuid());
Assert.assertEquals(rootArt, guidArt.getArtA());
Assert.assertEquals(newArt, guidArt.getArtB());
Assert.assertFalse(rootArt.isDirty());
Assert.assertFalse(newArt.isDirty());
}
private Artifact remoteInjection_relations_addNewRelation(Artifact rootArt, Artifact injectArt) throws Exception {
listener.reset();
// Create fake remote event that would come in from another client
RemotePersistEvent1 remoteEvent =
getFakeGeneralDataArtifactRemoteEventForArtifactRelationModified(getIncrementingRelationId(),
RelationEventType.Added, CoreRelationTypes.Default_Hierarchical__Child, rootArt, injectArt);
// Send
OseeEventManager.internalTestSendRemoteEvent(remoteEvent);
// Wait for event to propagate
Assert.assertEquals("No artifact events should be sent", 0, listener.getArtifacts().size());
Assert.assertEquals(1, listener.getRelations().size());
Assert.assertTrue(listener.getSender().isRemote());
EventBasicGuidRelation guidRel = listener.getRelations().iterator().next();
Assert.assertEquals(RelationEventType.Added, guidRel.getModType());
Assert.assertEquals(rootArt, guidRel.getArtA());
Assert.assertEquals(injectArt, guidRel.getArtB());
Assert.assertEquals(CoreRelationTypes.Default_Hierarchical__Child.getGuid(), guidRel.getRelTypeGuid());
Assert.assertEquals(injectArt.getBranch().getGuid(), guidRel.getBranchGuid());
Assert.assertEquals(1, injectArt.getRelatedArtifacts(CoreRelationTypes.Default_Hierarchical__Parent).size());
RelationLink relLink = injectArt.getRelations(CoreRelationTypes.Default_Hierarchical__Parent).iterator().next();
Assert.assertEquals("", relLink.getRationale());
Assert.assertFalse(injectArt.isDirty());
Assert.assertFalse(rootArt.isDirty());
return injectArt;
}
private Artifact remoteInjection_relations_deleteRelation(Artifact rootArt, Artifact injectArt) throws Exception {
listener.reset();
RelationLink relLink = injectArt.getRelations(CoreRelationTypes.Default_Hierarchical__Parent).iterator().next();
// Create fake remote event that would come in from another client
RemotePersistEvent1 remoteEvent =
getFakeGeneralDataArtifactRemoteEventForArtifactRelationModified(relLink.getId(), RelationEventType.Deleted,
CoreRelationTypes.Default_Hierarchical__Child, rootArt, injectArt);
// Send
OseeEventManager.internalTestSendRemoteEvent(remoteEvent);
// Wait for event to propagate
Assert.assertEquals("No artifact events should be sent", 0, listener.getArtifacts().size());
Assert.assertEquals(1, listener.getRelations().size());
Assert.assertTrue(listener.getSender().isRemote());
EventBasicGuidRelation guidRel = listener.getRelations().iterator().next();
Assert.assertEquals(RelationEventType.Deleted, guidRel.getModType());
Assert.assertEquals(rootArt, guidRel.getArtA());
Assert.assertEquals(injectArt, guidRel.getArtB());
Assert.assertEquals(CoreRelationTypes.Default_Hierarchical__Child.getGuid(), guidRel.getRelTypeGuid());
Assert.assertEquals(injectArt.getBranch().getGuid(), guidRel.getBranchGuid());
Assert.assertEquals(0, injectArt.getRelatedArtifacts(CoreRelationTypes.Default_Hierarchical__Parent).size());
Assert.assertFalse(injectArt.isDirty());
Assert.assertFalse(rootArt.isDirty());
return injectArt;
}
private Artifact remoteInjection_relations_reorderRelation(Artifact rootArt, Artifact injectArt) throws Exception {
listener.reset();
// Create fake remote event that would come in from another client
RemotePersistEvent1 remoteEvent = new RemotePersistEvent1();
// Set sender to something other than this client so event system will think came from another client
remoteEvent.setNetworkSender(networkSender);
remoteEvent.setTransactionId(1000);
remoteEvent.setBranchGuid(BranchManager.getCommonBranch().getGuid());
RemoteBasicGuidRelationReorder1 remoteReorder = new RemoteBasicGuidRelationReorder1();
remoteReorder.setBranchGuid(BranchManager.getCommonBranch().getGuid());
remoteReorder.setModTypeGuid(RelationOrderModType.Absolute.getGuid());
remoteReorder.setRelTypeGuid(CoreRelationTypes.Default_Hierarchical__Child.getGuid());
RemoteBasicGuidArtifact1 parentRemGuidArt = new RemoteBasicGuidArtifact1();
parentRemGuidArt.setModTypeGuid(EventModType.Modified.getGuid());
parentRemGuidArt.setBranchGuid(BranchManager.getCommonBranch().getGuid());
parentRemGuidArt.setArtTypeGuid(CoreArtifactTypes.GeneralData.getGuid());
parentRemGuidArt.setArtGuid(GUID.create());
remoteReorder.setParentArt(parentRemGuidArt);
remoteEvent.getRelationReorders().add(remoteReorder);
// Send
OseeEventManager.internalTestSendRemoteEvent(remoteEvent);
// Wait for event to propagate
Assert.assertEquals("No artifact events should be sent", 0, listener.getArtifacts().size());
Assert.assertEquals("No relations events should be sent", 0, listener.getRelations().size());
Assert.assertEquals("1 reorder events should be sent", 1, listener.getReorders().size());
Assert.assertTrue(listener.getSender().isRemote());
DefaultBasicGuidRelationReorder guidReorder = listener.getReorders().iterator().next();
Assert.assertEquals(RelationOrderModType.Absolute, guidReorder.getModType());
Assert.assertEquals(parentRemGuidArt.getArtGuid(), guidReorder.getParentArt().getGuid());
Assert.assertEquals(parentRemGuidArt.getArtTypeGuid(), (long) guidReorder.getParentArt().getArtTypeGuid());
Assert.assertEquals(parentRemGuidArt.getBranchGuid(), guidReorder.getParentArt().getBranchGuid());
Assert.assertEquals(CoreRelationTypes.Default_Hierarchical__Child.getGuid(), guidReorder.getRelTypeGuid());
Assert.assertEquals(injectArt.getBranch().getGuid(), guidReorder.getBranchGuid());
return injectArt;
}
private Artifact remoteInjection_relations_addNewRelationWithRationale(Artifact rootArt, Artifact injectArt) throws Exception {
listener.reset();
String RATIONALE_STR = "This is the rationale";
// Create fake remote event that would come in from another client
RemotePersistEvent1 remoteEvent =
getFakeGeneralDataArtifactRemoteEventForArtifactRelationModified(getIncrementingRelationId(),
RelationEventType.Added, CoreRelationTypes.Default_Hierarchical__Child, rootArt, injectArt);
RemoteBasicGuidRelation1 relation = remoteEvent.getRelations().iterator().next();
relation.setRationale(RATIONALE_STR);
// Send
OseeEventManager.internalTestSendRemoteEvent(remoteEvent);
// Wait for event to propagate
Assert.assertEquals("No artifact events should be sent", 0, listener.getArtifacts().size());
Assert.assertEquals(1, listener.getRelations().size());
Assert.assertTrue(listener.getSender().isRemote());
EventBasicGuidRelation guidRel = listener.getRelations().iterator().next();
Assert.assertEquals(RelationEventType.Added, guidRel.getModType());
Assert.assertEquals(rootArt, guidRel.getArtA());
Assert.assertEquals(injectArt, guidRel.getArtB());
Assert.assertEquals(CoreRelationTypes.Default_Hierarchical__Child.getGuid(), guidRel.getRelTypeGuid());
Assert.assertEquals(injectArt.getBranch().getGuid(), guidRel.getBranchGuid());
Assert.assertEquals(1, injectArt.getRelatedArtifacts(CoreRelationTypes.Default_Hierarchical__Parent).size());
RelationLink relLink = injectArt.getRelations(CoreRelationTypes.Default_Hierarchical__Parent).iterator().next();
Assert.assertEquals(RATIONALE_STR, relLink.getRationale());
Assert.assertFalse(injectArt.isDirty());
Assert.assertFalse(rootArt.isDirty());
return injectArt;
}
private Artifact remoteInjection_relations_modifyRelationRationale(Artifact rootArt, Artifact injectArt) throws Exception {
listener.reset();
String NEW_RATIONALE_STR = "This is the NEW rationale";
RelationLink relLink = injectArt.getRelations(CoreRelationTypes.Default_Hierarchical__Parent).iterator().next();
// Create fake remote event that would come in from another client
RemotePersistEvent1 remoteEvent =
getFakeGeneralDataArtifactRemoteEventForArtifactRelationModified(relLink.getId(),
RelationEventType.ModifiedRationale, CoreRelationTypes.Default_Hierarchical__Child, rootArt, injectArt);
RemoteBasicGuidRelation1 relation = remoteEvent.getRelations().iterator().next();
relation.setRationale(NEW_RATIONALE_STR);
// Send
OseeEventManager.internalTestSendRemoteEvent(remoteEvent);
// Wait for event to propagate
Assert.assertEquals("No artifact events should be sent", 0, listener.getArtifacts().size());
Assert.assertEquals(1, listener.getRelations().size());
Assert.assertTrue(listener.getSender().isRemote());
EventBasicGuidRelation guidRel = listener.getRelations().iterator().next();
Assert.assertEquals(RelationEventType.ModifiedRationale, guidRel.getModType());
Assert.assertEquals(rootArt, guidRel.getArtA());
Assert.assertEquals(injectArt, guidRel.getArtB());
Assert.assertEquals(CoreRelationTypes.Default_Hierarchical__Child.getGuid(), guidRel.getRelTypeGuid());
Assert.assertEquals(injectArt.getBranch().getGuid(), guidRel.getBranchGuid());
Assert.assertEquals(1, injectArt.getRelatedArtifacts(CoreRelationTypes.Default_Hierarchical__Parent).size());
relLink = injectArt.getRelations(CoreRelationTypes.Default_Hierarchical__Parent).iterator().next();
Assert.assertEquals(NEW_RATIONALE_STR, relLink.getRationale());
Assert.assertFalse(injectArt.isDirty());
Assert.assertFalse(rootArt.isDirty());
return injectArt;
}
private Artifact remoteInjection_attributes_modifyName() throws Exception {
String ORIG_NAME = "Remote Injected Artifact";
String NEW_NAME = "Remote Injected Artifact Chg";
// Create artifact to test injection; this will also put it in cache which is necessary for it's update
// Artifact must be stored static so it doesn't get garbage collected
Artifact injectArt =
ArtifactTypeManager.addArtifact(CoreArtifactTypes.GeneralData, BranchManager.getCommonBranch());
injectArt.setName(ORIG_NAME);
injectArt.persist(getClass().getSimpleName());
listener.reset();
// Create fake remote event that would come in from another client
RemotePersistEvent1 remoteEvent = getFakeGeneralDataArtifactRemoteEventForArtifactModified(injectArt);
RemoteBasicGuidArtifact1 remGuidArt = remoteEvent.getArtifacts().iterator().next();
RemoteAttributeChange1 remAttrChg = new RemoteAttributeChange1();
// Create modify attribute record
int nameAttrId = injectArt.getAttributes().iterator().next().getId();
remAttrChg.setAttributeId(nameAttrId);
remAttrChg.setGammaId(1000);
remAttrChg.setAttrTypeGuid(CoreAttributeTypes.Name.getGuid());
remAttrChg.setModTypeGuid(AttributeEventModificationType.Modified.getGuid());
remAttrChg.getData().add(NEW_NAME);
remAttrChg.getData().add("");
remGuidArt.getAttributes().add(remAttrChg);
// Send
OseeEventManager.internalTestSendRemoteEvent(remoteEvent);
// Wait for event to propagate
Assert.assertEquals(1, listener.getArtifacts().size());
Assert.assertEquals("No relations events should be sent", 0, listener.getRelations().size());
Assert.assertTrue(listener.getSender().isRemote());
EventModifiedBasicGuidArtifact guidArt =
(EventModifiedBasicGuidArtifact) listener.getArtifacts().iterator().next();
Assert.assertEquals(EventModType.Modified, guidArt.getModType());
Assert.assertEquals(injectArt.getGuid(), guidArt.getGuid());
Assert.assertEquals(injectArt.getArtifactType().getGuid(), guidArt.getArtTypeGuid());
Assert.assertEquals(injectArt.getBranch().getGuid(), guidArt.getBranchGuid());
Assert.assertEquals(1, guidArt.getAttributeChanges().size());
// Validate attribute change in event message
AttributeChange attrChg = guidArt.getAttributeChanges().iterator().next();
Assert.assertEquals(nameAttrId, attrChg.getAttributeId());
Assert.assertEquals(AttributeEventModificationType.Modified,
AttributeEventModificationType.getType(attrChg.getModTypeGuid()));
Assert.assertEquals(CoreAttributeTypes.Name.getGuid(), attrChg.getAttrTypeGuid());
Assert.assertEquals(1000, attrChg.getGammaId());
Assert.assertEquals(Arrays.asList(NEW_NAME, ""), remAttrChg.getData());
// Validate that artifact was updated
Assert.assertEquals(NEW_NAME, injectArt.getName());
Assert.assertFalse(injectArt.isDirty());
return injectArt;
}
private Artifact remoteInjection_attributes_addNewAttribute(Artifact injectArt) throws Exception {
listener.reset();
String GENERAL_DATA_STRING = "This is the string";
// Create fake remote event that would come in from another client
RemotePersistEvent1 remoteEvent = getFakeGeneralDataArtifactRemoteEventForArtifactModified(injectArt);
RemoteBasicGuidArtifact1 remGuidArt = remoteEvent.getArtifacts().iterator().next();
// Create add attribute record
RemoteAttributeChange1 remAttrChg = new RemoteAttributeChange1();
remAttrChg.setAttributeId(2343);
remAttrChg.setGammaId(1000);
remAttrChg.setAttrTypeGuid(CoreAttributeTypes.GeneralStringData.getGuid());
remAttrChg.setModTypeGuid(AttributeEventModificationType.New.getGuid());
remAttrChg.getData().add(GENERAL_DATA_STRING);
remAttrChg.getData().add("");
remGuidArt.getAttributes().add(remAttrChg);
// Send
OseeEventManager.internalTestSendRemoteEvent(remoteEvent);
// Wait for event to propagate
Assert.assertEquals(1, listener.getArtifacts().size());
Assert.assertEquals("No relations events should be sent", 0, listener.getRelations().size());
Assert.assertTrue(listener.getSender().isRemote());
EventModifiedBasicGuidArtifact guidArt =
(EventModifiedBasicGuidArtifact) listener.getArtifacts().iterator().next();
Assert.assertEquals(EventModType.Modified, guidArt.getModType());
Assert.assertEquals(injectArt.getGuid(), guidArt.getGuid());
Assert.assertEquals(injectArt.getArtifactType().getGuid(), guidArt.getArtTypeGuid());
Assert.assertEquals(injectArt.getBranch().getGuid(), guidArt.getBranchGuid());
Assert.assertEquals(1, guidArt.getAttributeChanges().size());
// Validate attribute change in event message
AttributeChange attrChg = guidArt.getAttributeChanges().iterator().next();
Assert.assertEquals(2343, attrChg.getAttributeId());
Assert.assertEquals(AttributeEventModificationType.New,
AttributeEventModificationType.getType(attrChg.getModTypeGuid()));
Assert.assertEquals(CoreAttributeTypes.GeneralStringData.getGuid(), attrChg.getAttrTypeGuid());
Assert.assertEquals(1000, attrChg.getGammaId());
Assert.assertEquals(Arrays.asList(GENERAL_DATA_STRING, ""), remAttrChg.getData());
// Validate that artifact was updated
Assert.assertEquals(GENERAL_DATA_STRING,
injectArt.getSoleAttributeValueAsString(CoreAttributeTypes.GeneralStringData, ""));
Assert.assertFalse(injectArt.isDirty());
return injectArt;
}
private Artifact remoteInjection_attributes_deleteAttribute(Artifact injectArt) throws Exception {
listener.reset();
// Create fake remote event that would come in from another client
RemotePersistEvent1 remoteEvent = getFakeGeneralDataArtifactRemoteEventForArtifactModified(injectArt);
RemoteBasicGuidArtifact1 remGuidArt = remoteEvent.getArtifacts().iterator().next();
// Create delete attribute record
RemoteAttributeChange1 remAttrChg = new RemoteAttributeChange1();
int genStrAttrId = injectArt.getAttributes(CoreAttributeTypes.GeneralStringData).iterator().next().getId();
remAttrChg.setAttributeId(genStrAttrId);
remAttrChg.setGammaId(1000);
remAttrChg.setAttrTypeGuid(CoreAttributeTypes.GeneralStringData.getGuid());
remAttrChg.setModTypeGuid(AttributeEventModificationType.Deleted.getGuid());
remGuidArt.getAttributes().add(remAttrChg);
// Send
OseeEventManager.internalTestSendRemoteEvent(remoteEvent);
// Wait for event to propagate
Assert.assertEquals(1, listener.getArtifacts().size());
Assert.assertEquals("No relations events should be sent", 0, listener.getRelations().size());
Assert.assertTrue(listener.getSender().isRemote());
EventModifiedBasicGuidArtifact guidArt =
(EventModifiedBasicGuidArtifact) listener.getArtifacts().iterator().next();
// Artifact is modified, attribute id deleted
Assert.assertEquals(EventModType.Modified, guidArt.getModType());
Assert.assertEquals(injectArt.getGuid(), guidArt.getGuid());
Assert.assertEquals(injectArt.getArtifactType().getGuid(), guidArt.getArtTypeGuid());
Assert.assertEquals(injectArt.getBranch().getGuid(), guidArt.getBranchGuid());
Assert.assertEquals(1, guidArt.getAttributeChanges().size());
// Validate attribute change in event message
AttributeChange attrChg = guidArt.getAttributeChanges().iterator().next();
Assert.assertEquals(genStrAttrId, attrChg.getAttributeId());
Assert.assertEquals(AttributeEventModificationType.Deleted,
AttributeEventModificationType.getType(attrChg.getModTypeGuid()));
Assert.assertEquals(CoreAttributeTypes.GeneralStringData.getGuid(), attrChg.getAttrTypeGuid());
Assert.assertEquals(1000, attrChg.getGammaId());
// Validate that artifact was updated
Assert.assertEquals(0, injectArt.getAttributes(CoreAttributeTypes.GeneralStringData).size());
return injectArt;
}
/**
* Need to always get a new relationId that hasn't been used in this DB yet
*
* @throws OseeCoreException
* @throws OseeDataStoreException
*/
private int getIncrementingRelationId() throws OseeCoreException {
return ConnectionHandler.getSequence().getNextRelationId();
}
private static final class ArtifactEventListener implements IArtifactEventListener {
private final Set<EventBasicGuidArtifact> resultEventArtifacts = new HashSet<EventBasicGuidArtifact>();
private final Set<EventBasicGuidRelation> resultEventRelations = new HashSet<EventBasicGuidRelation>();
private final Set<DefaultBasicGuidRelationReorder> resultEventReorders =
new HashSet<DefaultBasicGuidRelationReorder>();
private Sender resultSender;
@Override
public void handleArtifactEvent(ArtifactEvent artifactEvent, Sender sender) {
resultEventArtifacts.addAll(artifactEvent.getArtifacts());
resultEventRelations.addAll(artifactEvent.getRelations());
resultEventReorders.addAll(artifactEvent.getRelationOrderRecords());
resultSender = sender;
}
public void reset() {
resultEventArtifacts.clear();
resultEventRelations.clear();
resultEventReorders.clear();
resultSender = null;
}
@Override
public List<? extends IEventFilter> getEventFilters() {
return null;
}
public Set<EventBasicGuidArtifact> getArtifacts() {
return resultEventArtifacts;
}
public Set<EventBasicGuidRelation> getRelations() {
return resultEventRelations;
}
public Set<DefaultBasicGuidRelationReorder> getReorders() {
return resultEventReorders;
}
public Sender getSender() {
return resultSender;
}
}
}