From ecbaa3b40c3e8fe1486f5033261c77650e6a1b6f Mon Sep 17 00:00:00 2001 From: Sara Aspery Date: Thu, 22 Aug 2019 11:19:34 +0100 Subject: [PATCH] MNT-20740 New db query --- .../query/rm-common-SqlMap.xml | 19 ++++++ .../query/rm-common-SqlMapConfig.xml | 11 ---- .../query/RecordsManagementQueryDAO.java | 8 +-- .../query/RecordsManagementQueryDAOImpl.java | 39 ++++++++++-- .../util/ContentBinDuplicationUtility.java | 8 ++- .../ContentBinDuplicationUtilityUnitTest.java | 62 ++++++++++++------- 6 files changed, 100 insertions(+), 47 deletions(-) diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/query/rm-common-SqlMap.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/query/rm-common-SqlMap.xml index 766c80c519..457b70432e 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/query/rm-common-SqlMap.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/query/rm-common-SqlMap.xml @@ -7,6 +7,10 @@ + + + + + + \ No newline at end of file diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/query/rm-common-SqlMapConfig.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/query/rm-common-SqlMapConfig.xml index e1dbaf1bea..fd97f207cb 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/query/rm-common-SqlMapConfig.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/query/rm-common-SqlMapConfig.xml @@ -3,18 +3,8 @@ - - - - - - - - - - @@ -23,7 +13,6 @@ - \ No newline at end of file diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/query/RecordsManagementQueryDAO.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/query/RecordsManagementQueryDAO.java index 43c91c32e0..1a5dcf9916 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/query/RecordsManagementQueryDAO.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/query/RecordsManagementQueryDAO.java @@ -29,7 +29,6 @@ package org.alfresco.module.org_alfresco_module_rm.query; import java.util.Set; -import org.alfresco.repo.domain.contentdata.ContentUrlEntity; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.namespace.QName; @@ -64,9 +63,8 @@ public interface RecordsManagementQueryDAO public Set getChildrenStringPropertyValues(NodeRef parent, QName property); /** - * @param contentUrl the URL of the content url entity - * @return Return the entity or null if it doesn't exist or is still - * referenced by a content_data entity + * @param contentUrl the URL of the content url entity + * @return Return a set of UUIDs which reference the given node */ - public ContentUrlEntity getContentUrlEntityUnreferenced(String contentUrl); + Set getNodeRefsWhichReferenceContentUrl(String contentUrl); } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/query/RecordsManagementQueryDAOImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/query/RecordsManagementQueryDAOImpl.java index 5f8ed0d999..235fc891cf 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/query/RecordsManagementQueryDAOImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/query/RecordsManagementQueryDAOImpl.java @@ -30,18 +30,24 @@ package org.alfresco.module.org_alfresco_module_rm.query; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; +import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; import org.alfresco.repo.domain.contentdata.ContentUrlEntity; import org.alfresco.repo.domain.node.NodeDAO; import org.alfresco.repo.domain.qname.QNameDAO; import org.alfresco.repo.tenant.TenantService; +import org.alfresco.repo.version.Version2Model; import org.alfresco.service.cmr.repository.InvalidNodeRefException; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.namespace.QName; import org.alfresco.util.Pair; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.mybatis.spring.SqlSessionTemplate; /** @@ -54,7 +60,7 @@ public class RecordsManagementQueryDAOImpl implements RecordsManagementQueryDAO, { private static final String COUNT_IDENTIFIER = "alfresco.query.rm.select_CountRMIndentifier"; private static final String GET_CHILDREN_PROPERTY_VALUES = "select_GetStringPropertyValuesOfChildren"; - private static final String SELECT_CONTENT_URL_BY_KEY_UNREFERENCED = "alfresco.content.select_ContentUrlByKeyUnreferenced"; + private static final String SELECT_NODE_IDS_WHICH_REFERENCE_CONTENT_URL = "select_NodeIdsWhichReferenceContentUrl"; /** SQL session template */ protected SqlSessionTemplate template; @@ -103,7 +109,7 @@ public class RecordsManagementQueryDAOImpl implements RecordsManagementQueryDAO, if (pair != null) { // create query params - Map params = new HashMap(2); + Map params = new HashMap<>(2); params.put("qnameId", pair.getFirst()); params.put("idValue", identifierValue); @@ -147,7 +153,7 @@ public class RecordsManagementQueryDAOImpl implements RecordsManagementQueryDAO, } @Override - public ContentUrlEntity getContentUrlEntityUnreferenced(String contentUrl) + public Set getNodeRefsWhichReferenceContentUrl(String contentUrl) { ContentUrlEntity contentUrlEntity = new ContentUrlEntity(); contentUrlEntity.setContentUrl(contentUrl); @@ -155,8 +161,31 @@ public class RecordsManagementQueryDAOImpl implements RecordsManagementQueryDAO, { contentUrlEntity.setContentUrlShort(contentUrlEntity.getContentUrlShort().toLowerCase()); } - contentUrlEntity = (ContentUrlEntity) template.selectOne(SELECT_CONTENT_URL_BY_KEY_UNREFERENCED, contentUrlEntity); - return contentUrlEntity; + // Get all the node ids which reference the given content url + List nodeIds = template.selectList(SELECT_NODE_IDS_WHICH_REFERENCE_CONTENT_URL, contentUrlEntity); + + // create a set of uuids which reference the content url + Set nodesReferencingContentUrl = new HashSet<>(); + for(Long nodeId : nodeIds) + { + String uuidToAdd; + + // if the referencing node is a version2Store reference to the content url, add the uuid for the version 2 frozen node ref + NodeRef version2FrozenNodeRef = (NodeRef) nodeDAO.getNodeProperty(nodeId, Version2Model.PROP_QNAME_FROZEN_NODE_REF); + if (version2FrozenNodeRef != null) + { + uuidToAdd = version2FrozenNodeRef.getId(); + } + + // add the uuid for the node ref of the referencing node + else + { + uuidToAdd = (String) nodeDAO.getNodeProperty(nodeId, ContentModel.PROP_NODE_UUID); + } + nodesReferencingContentUrl.add(uuidToAdd); + } + + return nodesReferencingContentUrl; } } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/util/ContentBinDuplicationUtility.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/util/ContentBinDuplicationUtility.java index da5992a0c0..83b3f9ba9f 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/util/ContentBinDuplicationUtility.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/util/ContentBinDuplicationUtility.java @@ -28,13 +28,14 @@ package org.alfresco.module.org_alfresco_module_rm.util; import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.query.RecordsManagementQueryDAO; -import org.alfresco.repo.domain.contentdata.ContentUrlEntity; import org.alfresco.repo.policy.BehaviourFilter; import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.NodeRef; +import java.util.Set; + /** * Utility class to duplicate the content of a node without triggering the audit or versioning behaviours * @author Ross Gale @@ -94,8 +95,9 @@ public class ContentBinDuplicationUtility { boolean hasAtLeastOneOtherReference = false; String contentUrl = contentService.getReader(nodeRef, ContentModel.PROP_CONTENT).getContentUrl(); - ContentUrlEntity contentUrlEntity = recordsManagementQueryDAO.getContentUrlEntityUnreferenced(contentUrl); - if (contentUrlEntity == null) + + Set referencesToContentNode = recordsManagementQueryDAO.getNodeRefsWhichReferenceContentUrl(contentUrl); + if (referencesToContentNode.size() > 1) { hasAtLeastOneOtherReference = true; } diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/util/ContentBinDuplicationUtilityUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/util/ContentBinDuplicationUtilityUnitTest.java index 2c5299ff4b..d2c12a1005 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/util/ContentBinDuplicationUtilityUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/util/ContentBinDuplicationUtilityUnitTest.java @@ -29,7 +29,6 @@ package org.alfresco.module.org_alfresco_module_rm.util; import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.query.RecordsManagementQueryDAO; -import org.alfresco.repo.domain.contentdata.ContentUrlEntity; import org.alfresco.repo.policy.BehaviourFilter; import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentService; @@ -41,6 +40,10 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.times; @@ -54,6 +57,9 @@ import static org.mockito.Mockito.when; */ public class ContentBinDuplicationUtilityUnitTest { + private final static NodeRef NODE_REF = new NodeRef("some://test/noderef"); + private final static NodeRef NODE_REF2 = new NodeRef("some://test/anothernoderef"); + private final static String CONTENT_URL = "someContentUrl"; @Mock private ContentService contentService; @@ -85,10 +91,9 @@ public class ContentBinDuplicationUtilityUnitTest @Test public void testContentUrlIsUpdated() { - NodeRef nodeRef = new NodeRef("some://test/noderef"); - when(contentService.getReader(nodeRef, ContentModel.PROP_CONTENT)).thenReturn(contentReader); - when(contentService.getWriter(nodeRef, ContentModel.PROP_CONTENT, true)).thenReturn(contentWriter); - contentBinDuplicationUtility.duplicate(nodeRef); + when(contentService.getReader(NODE_REF, ContentModel.PROP_CONTENT)).thenReturn(contentReader); + when(contentService.getWriter(NODE_REF, ContentModel.PROP_CONTENT, true)).thenReturn(contentWriter); + contentBinDuplicationUtility.duplicate(NODE_REF); verify(contentWriter, times(1)).putContent(contentReader); checkBehaviours(1); } @@ -99,9 +104,8 @@ public class ContentBinDuplicationUtilityUnitTest @Test public void testDuplicationDoesntHappenWithNoContent() { - NodeRef nodeRef = new NodeRef("some://test/noderef"); - when(contentService.getReader(nodeRef, ContentModel.PROP_CONTENT)).thenReturn(null); - contentBinDuplicationUtility.duplicate(nodeRef); + when(contentService.getReader(NODE_REF, ContentModel.PROP_CONTENT)).thenReturn(null); + contentBinDuplicationUtility.duplicate(NODE_REF); verify(contentWriter, times(0)).putContent(contentReader); checkBehaviours(1); } @@ -112,32 +116,44 @@ public class ContentBinDuplicationUtilityUnitTest @Test public void testHasAtLeastOneOtherReference() { - NodeRef nodeRef = new NodeRef("some://test/noderef"); - String contentUrl = "someContentUrl"; + Set multipleReferences = new HashSet<>(); + Collections.addAll(multipleReferences, NODE_REF.getId(), NODE_REF2.getId()); - when(contentService.getReader(nodeRef, ContentModel.PROP_CONTENT)).thenReturn(contentReader); - when(contentService.getReader(nodeRef, ContentModel.PROP_CONTENT).getContentUrl()).thenReturn(contentUrl); - when(recordsManagementQueryDAO.getContentUrlEntityUnreferenced(contentUrl)).thenReturn(null); + when(contentService.getReader(NODE_REF, ContentModel.PROP_CONTENT)).thenReturn(contentReader); + when(contentService.getReader(NODE_REF, ContentModel.PROP_CONTENT).getContentUrl()).thenReturn(CONTENT_URL); + when(recordsManagementQueryDAO.getNodeRefsWhichReferenceContentUrl(CONTENT_URL)).thenReturn(multipleReferences); - boolean hasReference = contentBinDuplicationUtility.hasAtLeastOneOtherReference(nodeRef); - assertTrue(hasReference); + assertTrue(contentBinDuplicationUtility.hasAtLeastOneOtherReference(NODE_REF)); } /** - * Test hasAtLeastOneOtherReference returns false when node has no other reference to it + * Test hasAtLeastOneOtherReference returns false when node has no other reference to it other than its own content ref */ @Test public void testHasNoOtherReference() { - NodeRef nodeRef = new NodeRef("some://test/noderef"); - String contentUrl = "someContentUrl"; - ContentUrlEntity contentUrlEntity = new ContentUrlEntity(); + Set singleReference = Collections.singleton(NODE_REF.getId()); - when(contentService.getReader(nodeRef, ContentModel.PROP_CONTENT)).thenReturn(contentReader); - when(contentService.getReader(nodeRef, ContentModel.PROP_CONTENT).getContentUrl()).thenReturn(contentUrl); - when(recordsManagementQueryDAO.getContentUrlEntityUnreferenced(contentUrl)).thenReturn(contentUrlEntity); + when(contentService.getReader(NODE_REF, ContentModel.PROP_CONTENT)).thenReturn(contentReader); + when(contentService.getReader(NODE_REF, ContentModel.PROP_CONTENT).getContentUrl()).thenReturn(CONTENT_URL); + when(recordsManagementQueryDAO.getNodeRefsWhichReferenceContentUrl(CONTENT_URL)).thenReturn(singleReference); - assertFalse(contentBinDuplicationUtility.hasAtLeastOneOtherReference(nodeRef)); + assertFalse(contentBinDuplicationUtility.hasAtLeastOneOtherReference(NODE_REF)); + } + + /** + * Test hasAtLeastOneOtherReference returns false when node has no references to it at all + */ + @Test + public void testHasNoReferences() + { + Set noReferences = Collections. emptySet(); + + when(contentService.getReader(NODE_REF, ContentModel.PROP_CONTENT)).thenReturn(contentReader); + when(contentService.getReader(NODE_REF, ContentModel.PROP_CONTENT).getContentUrl()).thenReturn(CONTENT_URL); + when(recordsManagementQueryDAO.getNodeRefsWhichReferenceContentUrl(CONTENT_URL)).thenReturn(noReferences); + + assertFalse(contentBinDuplicationUtility.hasAtLeastOneOtherReference(NODE_REF)); } /**