From 426d419e53bceadc38276de9181bb511553d1e3a Mon Sep 17 00:00:00 2001 From: Derek Hulley Date: Thu, 11 Mar 2010 11:03:29 +0000 Subject: [PATCH] Merged BRANCHES/V3.2 to HEAD: 18564: Fixed ETHREEOH-4031: ParentAssocsCache gets out of date when parent NodeRefs are modified 18569: Fix ETHREEOH-3632: UI - View versioned properties fails when node associations are present 18579: Fix failing unit test after CHK-11190 18580: Fixed parentAssocsCache invalidation for parent NodeRef modification 18597: Fixed ETHREEOH-3996 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@19214 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../HibernateNodeDaoServiceImpl.java | 82 +++++++++++-------- .../repo/version/Node2ServiceImpl.java | 7 +- .../repo/version/NodeServiceImplTest.java | 19 ++--- 3 files changed, 56 insertions(+), 52 deletions(-) diff --git a/source/java/org/alfresco/repo/node/db/hibernate/HibernateNodeDaoServiceImpl.java b/source/java/org/alfresco/repo/node/db/hibernate/HibernateNodeDaoServiceImpl.java index de03740969..4619feb749 100644 --- a/source/java/org/alfresco/repo/node/db/hibernate/HibernateNodeDaoServiceImpl.java +++ b/source/java/org/alfresco/repo/node/db/hibernate/HibernateNodeDaoServiceImpl.java @@ -1165,8 +1165,7 @@ public class HibernateNodeDaoServiceImpl // Update the node updateNode(nodeId, storeRef, null, null); NodeRef nodeRef = node.getNodeRef(); - this.parentAssocsCache.remove(nodeId); - + return new Pair(node.getId(), nodeRef); } @@ -1297,6 +1296,9 @@ public class HibernateNodeDaoServiceImpl DirtySessionMethodInterceptor.flushSession(getSession(), true); // The cache entry will be overwritten so we don't need to do it here } + // ETHREEOH-4031: ParentAssocsCache gets out of date when parent NodeRefs are modified + parentAssocsCache.remove(nodeId); + removeParentAssocCacheEntriesForParent(nodeId); // Change the store node.setStore(storeAfter); @@ -1784,6 +1786,48 @@ public class HibernateNodeDaoServiceImpl getHibernateTemplate().delete(node); } } + + /** + * Ensures that parent association entries are removed for all children of a given node + */ + private void removeParentAssocCacheEntriesForParent(final Long parentNodeId) + { + HibernateCallback getChildNodeIdsCallback = new HibernateCallback() + { + public Object doInHibernate(Session session) + { + Query query = session + .getNamedQuery(HibernateNodeDaoServiceImpl.QUERY_GET_CHILD_NODE_IDS) + .setLong("parentId", parentNodeId); + DirtySessionMethodInterceptor.setQueryFlushMode(session, query); + return query.scroll(ScrollMode.FORWARD_ONLY); + } + }; + ScrollableResults results = null; + try + { + results = (ScrollableResults) getHibernateTemplate().execute(getChildNodeIdsCallback); + + while (results.next()) + { + Long childNodeId = results.getLong(0); + parentAssocsCache.remove(childNodeId); + if (isDebugParentAssocCacheEnabled) + { + loggerParentAssocsCache.debug( + "Parent associations cache - Removing entry: \n" + + " Node: " + childNodeId); + } + } + } + finally + { + if(results != null) + { + results.close(); + } + } + } private static final String QUERY_DELETE_PARENT_ASSOCS = "node.DeleteParentAssocs"; private static final String QUERY_DELETE_CHILD_ASSOCS = "node.DeleteChildAssocs"; @@ -1808,39 +1852,9 @@ public class HibernateNodeDaoServiceImpl { logger.debug("Deleting child assocs of node " + nodeId); } - HibernateCallback getChildNodeIdsCallback = new HibernateCallback() - { - public Object doInHibernate(Session session) - { - Query query = session - .getNamedQuery(HibernateNodeDaoServiceImpl.QUERY_GET_CHILD_NODE_IDS) - .setLong("parentId", nodeId); - DirtySessionMethodInterceptor.setQueryFlushMode(session, query); - return query.scroll(ScrollMode.FORWARD_ONLY); - } - }; - ScrollableResults childNodeIds = null; - try - { - childNodeIds = (ScrollableResults) getHibernateTemplate().execute(getChildNodeIdsCallback); + // Make sure that the cache is updated + removeParentAssocCacheEntriesForParent(nodeId); - while (childNodeIds.next()) - { - Long childNodeId = childNodeIds.getLong(0); - parentAssocsCache.remove(childNodeId); - if (isDebugParentAssocCacheEnabled) - { - loggerParentAssocsCache.debug("\n" + "Parent associations cache - Removing entry: \n" + " Node: " + childNodeId); - } - } - } - finally - { - if(childNodeIds != null) - { - childNodeIds.close(); - } - } HibernateCallback deleteParentAssocsCallback = new HibernateCallback() { public Object doInHibernate(Session session) diff --git a/source/java/org/alfresco/repo/version/Node2ServiceImpl.java b/source/java/org/alfresco/repo/version/Node2ServiceImpl.java index 1afa9454bf..2779e01405 100644 --- a/source/java/org/alfresco/repo/version/Node2ServiceImpl.java +++ b/source/java/org/alfresco/repo/version/Node2ServiceImpl.java @@ -188,7 +188,7 @@ public class Node2ServiceImpl extends NodeServiceImpl implements NodeService, Ve } /** - * @throws UnsupportedOperationException always + * @return an empty list - ALWAYS. */ @Override public List getTargetAssocs(NodeRef sourceRef, QNamePattern qnamePattern) @@ -197,8 +197,7 @@ public class Node2ServiceImpl extends NodeServiceImpl implements NodeService, Ve { return super.getTargetAssocs(sourceRef, qnamePattern); } - - // This operation is not supported for a version2 store - throw new UnsupportedOperationException(MSG_UNSUPPORTED); + // TODO: Persist these so they are retrievable + return Collections.emptyList(); } } diff --git a/source/java/org/alfresco/repo/version/NodeServiceImplTest.java b/source/java/org/alfresco/repo/version/NodeServiceImplTest.java index 9b441ded1d..f7fb458efb 100644 --- a/source/java/org/alfresco/repo/version/NodeServiceImplTest.java +++ b/source/java/org/alfresco/repo/version/NodeServiceImplTest.java @@ -235,20 +235,11 @@ public class NodeServiceImplTest extends BaseVersionStoreTest if (versionService.getVersionStoreReference().getIdentifier().equals(Version2Model.STORE_ID)) { // V2 version store (eg. workspace://version2Store) - try - { - this.lightWeightVersionStoreNodeService.getTargetAssocs( - dummyNodeRef, - RegexQNamePattern.MATCH_ALL); - fail("This operation is not supported."); - } - catch (UnsupportedOperationException exception) - { - if (exception.getMessage() != MSG_ERR) - { - fail("Unexpected exception raised during method excution: " + exception.getMessage()); - } - } + // See ETHREEOH-3632: method now doesn't blow up. + List assocs = this.lightWeightVersionStoreNodeService.getTargetAssocs( + dummyNodeRef, + RegexQNamePattern.MATCH_ALL); + assertEquals("Currently the assocs will be empty", 0, assocs.size()); } else if (versionService.getVersionStoreReference().getIdentifier().equals(VersionModel.STORE_ID)) {