diff --git a/pom.xml b/pom.xml index fd0db53642..5ef44dfdb2 100644 --- a/pom.xml +++ b/pom.xml @@ -53,7 +53,7 @@ 5.23.0 1.4.0 6.2 - 0.0.12 + 0.0.13 5.3.9 3.5.2 diff --git a/repository/src/main/java/org/alfresco/repo/event2/ChildAssociationEventConsolidator.java b/repository/src/main/java/org/alfresco/repo/event2/ChildAssociationEventConsolidator.java index 8837f3648e..d09833b74e 100644 --- a/repository/src/main/java/org/alfresco/repo/event2/ChildAssociationEventConsolidator.java +++ b/repository/src/main/java/org/alfresco/repo/event2/ChildAssociationEventConsolidator.java @@ -27,7 +27,6 @@ package org.alfresco.repo.event2; import java.util.ArrayDeque; import java.util.Deque; - import org.alfresco.repo.event.v1.model.ChildAssociationResource; import org.alfresco.repo.event.v1.model.DataAttributes; import org.alfresco.repo.event.v1.model.EventData; @@ -117,8 +116,9 @@ public class ChildAssociationEventConsolidator implements ChildAssociationEventS { String parentId = childAssociationRef.getParentRef().getId(); String childId = childAssociationRef.getChildRef().getId(); + String assocQName = helper.getQNamePrefixString(childAssociationRef.getQName()); String assocType = helper.getQNamePrefixString(childAssociationRef.getTypeQName()); - return new ChildAssociationResource(parentId, childId, assocType); + return new ChildAssociationResource(parentId, childId, assocType, assocQName); } /** diff --git a/repository/src/main/java/org/alfresco/repo/event2/NodeResourceHelper.java b/repository/src/main/java/org/alfresco/repo/event2/NodeResourceHelper.java index 7ce7e40d21..9212f2a1b8 100644 --- a/repository/src/main/java/org/alfresco/repo/event2/NodeResourceHelper.java +++ b/repository/src/main/java/org/alfresco/repo/event2/NodeResourceHelper.java @@ -46,6 +46,7 @@ import org.alfresco.repo.event2.filter.NodePropertyFilter; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.permissions.AccessDeniedException; import org.alfresco.service.cmr.dictionary.DictionaryService; +import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.ContentData; import org.alfresco.service.cmr.repository.MLText; import org.alfresco.service.cmr.repository.NodeRef; @@ -148,6 +149,7 @@ public class NodeResourceHelper implements InitializingBean .setModifiedByUser(getUserInfo((String) properties.get(ContentModel.PROP_MODIFIER), mapUserCache)) .setModifiedAt(getZonedDateTime((Date)properties.get(ContentModel.PROP_MODIFIED))) .setContent(getContentInfo(properties)) + .setPrimaryAssocQName(getPrimaryAssocQName(nodeRef)) .setPrimaryHierarchy(PathUtil.getNodeIdsInReverse(path, false)) .setProperties(mapToNodeProperties(properties)) .setAspectNames(getMappedAspects(nodeRef)); @@ -158,6 +160,23 @@ public class NodeResourceHelper implements InitializingBean return dictionaryService.isSubClass(className, ofClassQName); } + private String getPrimaryAssocQName(NodeRef nodeRef) + { + String result = null; + try + { + ChildAssociationRef primaryParent = nodeService.getPrimaryParent(nodeRef); + if(primaryParent != null && primaryParent.getQName() != null) + { + result = primaryParent.getQName().getPrefixedQName(namespaceService).getPrefixString(); + } + } catch (NamespaceException namespaceException) + { + LOGGER.error("Cannot return a valid primary association QName: " + namespaceException.getMessage()); + } + return result; + } + private UserInfo getUserInfo(String userName, Map mapUserCache) { UserInfo userInfo = mapUserCache.get(userName); diff --git a/repository/src/test/java/org/alfresco/repo/event2/AbstractContextAwareRepoEvent.java b/repository/src/test/java/org/alfresco/repo/event2/AbstractContextAwareRepoEvent.java index c5f3f9248f..995bec4cfe 100644 --- a/repository/src/test/java/org/alfresco/repo/event2/AbstractContextAwareRepoEvent.java +++ b/repository/src/test/java/org/alfresco/repo/event2/AbstractContextAwareRepoEvent.java @@ -36,6 +36,7 @@ import java.util.List; import javax.jms.ConnectionFactory; import org.alfresco.model.ContentModel; +import org.alfresco.repo.dictionary.NamespaceDAO; import org.alfresco.repo.event.v1.model.ChildAssociationResource; import org.alfresco.repo.event.v1.model.DataAttributes; import org.alfresco.repo.event.v1.model.EventType; @@ -114,6 +115,9 @@ public abstract class AbstractContextAwareRepoEvent extends BaseSpringTest @Qualifier("eventGeneratorQueue") protected EventGeneratorQueue eventQueue; + @Autowired + private NamespaceDAO namespaceDAO; + protected NodeRef rootNodeRef; @BeforeClass @@ -152,9 +156,19 @@ public abstract class AbstractContextAwareRepoEvent extends BaseSpringTest return nodeService.getRootNode(storeRef); }); + initTestNamespacePrefixMapping(); + flushSpuriousEvents(); } + protected void initTestNamespacePrefixMapping() { + if(namespaceDAO.getNamespaceURI("ce") == null) + { + namespaceDAO.addURI(TEST_NAMESPACE); + namespaceDAO.addPrefix("ce", TEST_NAMESPACE); + } + } + /* * When running with an empty database some events related to the creation may * creep up here making the test fails. After attempting several other @@ -207,11 +221,16 @@ public abstract class AbstractContextAwareRepoEvent extends BaseSpringTest } protected NodeRef createNode(QName contentType, PropertyMap propertyMap) + { + return createNode(contentType, GUID.generate(), propertyMap); + } + + protected NodeRef createNode(QName contentType, String localName, PropertyMap propertyMap) { return retryingTransactionHelper.doInTransaction(() -> nodeService.createNode( rootNodeRef, ContentModel.ASSOC_CHILDREN, - QName.createQName(TEST_NAMESPACE, GUID.generate()), + QName.createQName(TEST_NAMESPACE, localName), contentType, propertyMap).getChildRef()); } diff --git a/repository/src/test/java/org/alfresco/repo/event2/ChildAssociationRepoEventIT.java b/repository/src/test/java/org/alfresco/repo/event2/ChildAssociationRepoEventIT.java index d7db0e007a..11b6bcf77d 100644 --- a/repository/src/test/java/org/alfresco/repo/event2/ChildAssociationRepoEventIT.java +++ b/repository/src/test/java/org/alfresco/repo/event2/ChildAssociationRepoEventIT.java @@ -50,6 +50,7 @@ public class ChildAssociationRepoEventIT extends AbstractContextAwareRepoEvent @Test public void testAddChildAssociation() { + String assocLocalName = GUID.generate(); final NodeRef parentNodeRef = createNode(ContentModel.TYPE_FOLDER); final NodeRef childNodeRef = createNode(ContentModel.TYPE_CONTENT); @@ -64,11 +65,11 @@ public class ChildAssociationRepoEventIT extends AbstractContextAwareRepoEvent resultRepoEvent.getType()); retryingTransactionHelper.doInTransaction(() -> - nodeService.addChild( - parentNodeRef, - childNodeRef, - ContentModel.ASSOC_CONTAINS, - QName.createQName(TEST_NAMESPACE, GUID.generate()))); + nodeService.addChild( + parentNodeRef, + childNodeRef, + ContentModel.ASSOC_CONTAINS, + QName.createQName(TEST_NAMESPACE, assocLocalName))); List childAssociationRefs = retryingTransactionHelper.doInTransaction(() -> nodeService.getChildAssocs(parentNodeRef)); @@ -101,6 +102,7 @@ public class ChildAssociationRepoEventIT extends AbstractContextAwareRepoEvent assertEquals("Wrong parent", parentNodeRef.getId(), childAssociationResource.getParent().getId()); assertEquals("Wrong child", childNodeRef.getId(), childAssociationResource.getChild().getId()); assertEquals("Wrong assoc type", "cm:contains", childAssociationResource.getAssocType()); + assertEquals("Wrong assoc name", "ce:" + assocLocalName, childAssociationResource.getAssocQName()); } @Test diff --git a/repository/src/test/java/org/alfresco/repo/event2/CreateRepoEventIT.java b/repository/src/test/java/org/alfresco/repo/event2/CreateRepoEventIT.java index db6b592c70..1e801ad206 100644 --- a/repository/src/test/java/org/alfresco/repo/event2/CreateRepoEventIT.java +++ b/repository/src/test/java/org/alfresco/repo/event2/CreateRepoEventIT.java @@ -53,16 +53,17 @@ public class CreateRepoEventIT extends AbstractContextAwareRepoEvent @Autowired private NodeDAO nodeDAO; - + @Test public void testCreateEvent() { // Create a node without content final String name = "TestFile-" + System.currentTimeMillis() + ".txt"; + String localName = GUID.generate(); PropertyMap propertyMap = new PropertyMap(); propertyMap.put(ContentModel.PROP_TITLE, "test title"); propertyMap.put(ContentModel.PROP_NAME, name); - final NodeRef nodeRef = createNode(ContentModel.TYPE_CONTENT, propertyMap); + final NodeRef nodeRef = createNode(ContentModel.TYPE_CONTENT, localName, propertyMap); final RepoEvent> resultRepoEvent = getRepoEvent(1); // Repo event attributes @@ -103,6 +104,7 @@ public class CreateRepoEventIT extends AbstractContextAwareRepoEvent assertEquals("Wrong node modifier display name.", "Administrator", nodeResource.getModifiedByUser().getDisplayName()); assertNotNull("Missing modifiedAt property.", nodeResource.getModifiedAt()); + assertEquals("Wrong primaryAssocQName prefix.", "ce:" + localName, nodeResource.getPrimaryAssocQName()); } @Test diff --git a/repository/src/test/java/org/alfresco/repo/event2/DeleteRepoEventIT.java b/repository/src/test/java/org/alfresco/repo/event2/DeleteRepoEventIT.java index 52a69434af..d7115c6677 100644 --- a/repository/src/test/java/org/alfresco/repo/event2/DeleteRepoEventIT.java +++ b/repository/src/test/java/org/alfresco/repo/event2/DeleteRepoEventIT.java @@ -45,9 +45,10 @@ public class DeleteRepoEventIT extends AbstractContextAwareRepoEvent @Test public void testDeleteContent() { + String localName = GUID.generate(); PropertyMap propertyMap = new PropertyMap(); propertyMap.put(ContentModel.PROP_TITLE, "test title"); - NodeRef nodeRef = createNode(ContentModel.TYPE_CONTENT, propertyMap); + NodeRef nodeRef = createNode(ContentModel.TYPE_CONTENT, localName, propertyMap); NodeResource createdResource = getNodeResource(1); @@ -64,6 +65,7 @@ public class DeleteRepoEventIT extends AbstractContextAwareRepoEvent assertEquals("Repo event type:", EventType.NODE_DELETED.getType(), resultRepoEvent.getType()); assertEquals(createdResource.getId(), getNodeResource(resultRepoEvent).getId()); + assertEquals("Wrong primaryAssocQName prefix.", "ce:" + localName, createdResource.getPrimaryAssocQName()); // There should be no resourceBefore EventData eventData = getEventData(resultRepoEvent); diff --git a/repository/src/test/java/org/alfresco/repo/event2/UpdateRepoEventIT.java b/repository/src/test/java/org/alfresco/repo/event2/UpdateRepoEventIT.java index 413fa7d395..6075c2fd0c 100644 --- a/repository/src/test/java/org/alfresco/repo/event2/UpdateRepoEventIT.java +++ b/repository/src/test/java/org/alfresco/repo/event2/UpdateRepoEventIT.java @@ -33,7 +33,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; - import org.alfresco.model.ContentModel; import org.alfresco.repo.content.MimetypeMap; import org.alfresco.repo.dictionary.M2Model; @@ -59,6 +58,7 @@ import org.junit.Test; */ public class UpdateRepoEventIT extends AbstractContextAwareRepoEvent { + @Test public void testUpdateNodeResourceContent() { @@ -138,6 +138,7 @@ public class UpdateRepoEventIT extends AbstractContextAwareRepoEvent assertNull(resourceBefore.getProperties()); assertNull(resourceBefore.getAspectNames()); assertNull(resourceBefore.getPrimaryHierarchy()); + assertNull(resourceBefore.getPrimaryAssocQName()); } @Test @@ -198,6 +199,7 @@ public class UpdateRepoEventIT extends AbstractContextAwareRepoEvent assertNull(resourceBefore.getProperties()); assertNull(resourceBefore.getAspectNames()); assertNull(resourceBefore.getPrimaryHierarchy()); + assertNull(resourceBefore.getPrimaryAssocQName()); } @Test @@ -274,6 +276,7 @@ public class UpdateRepoEventIT extends AbstractContextAwareRepoEvent assertNull(resourceBefore.getProperties()); assertNull(resourceBefore.getAspectNames()); assertNull(resourceBefore.getPrimaryHierarchy()); + assertNull(resourceBefore.getPrimaryAssocQName()); } @Test @@ -539,6 +542,7 @@ public class UpdateRepoEventIT extends AbstractContextAwareRepoEvent assertNull(resourceBefore.getProperties()); assertNull(resourceBefore.getAspectNames()); assertNull(resourceBefore.getPrimaryHierarchy()); + assertNull(resourceBefore.getPrimaryAssocQName()); } @Test @@ -574,6 +578,7 @@ public class UpdateRepoEventIT extends AbstractContextAwareRepoEvent NodeResource nodeResource = getNodeResource(resultRepoEvent); assertEquals("Incorrect node type was found", "cm:dictionaryModel", nodeResource.getNodeType()); + initTestNamespacePrefixMapping(); final NodeRef nodeRef = createNode(ContentModel.TYPE_CONTENT); // old node's type assertEquals(ContentModel.TYPE_CONTENT, nodeService.getType(nodeRef)); @@ -613,7 +618,7 @@ public class UpdateRepoEventIT extends AbstractContextAwareRepoEvent assertNull(resourceBefore.getProperties()); assertNull(resourceBefore.getAspectNames()); assertNull(resourceBefore.getPrimaryHierarchy()); - + assertNull(resourceBefore.getPrimaryAssocQName()); } @Test @@ -660,6 +665,7 @@ public class UpdateRepoEventIT extends AbstractContextAwareRepoEvent assertNull(resourceBefore.getProperties()); assertNull(resourceBefore.getAspectNames()); assertNull(resourceBefore.getPrimaryHierarchy()); + assertNull(resourceBefore.getPrimaryAssocQName()); } @Test