From d3708a3675bdeecabd6053e8b8a6c21e4f259806 Mon Sep 17 00:00:00 2001 From: Derek Hulley Date: Tue, 9 May 2006 15:22:28 +0000 Subject: [PATCH] Added primary path to the properties archived against a node. Fixed bug in caching of ChildAssociationRef in the ChildAssoc object git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@2797 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/model/systemModel.xml | 5 +++++ .../java/org/alfresco/model/ContentModel.java | 1 + .../repo/domain/hibernate/ChildAssocImpl.java | 19 +++++++++++++++---- .../node/archive/ArchiveAndRestoreTest.java | 13 +++++++++++++ .../repo/node/db/DbNodeServiceImpl.java | 5 +++++ 5 files changed, 39 insertions(+), 4 deletions(-) diff --git a/config/alfresco/model/systemModel.xml b/config/alfresco/model/systemModel.xml index b30ed8c1ec..c9e64edd1c 100644 --- a/config/alfresco/model/systemModel.xml +++ b/config/alfresco/model/systemModel.xml @@ -131,6 +131,11 @@ d:childassocref true + + d:any + true + + d:text true diff --git a/source/java/org/alfresco/model/ContentModel.java b/source/java/org/alfresco/model/ContentModel.java index 8dfdc291ec..1d6c1f1115 100644 --- a/source/java/org/alfresco/model/ContentModel.java +++ b/source/java/org/alfresco/model/ContentModel.java @@ -42,6 +42,7 @@ public interface ContentModel // archived nodes aspect constants static final QName ASPECT_ARCHIVED = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "archived"); static final QName PROP_ARCHIVED_ORIGINAL_PARENT_ASSOC = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "archivedOriginalParentAssoc"); + static final QName PROP_ARCHIVED_ORIGINAL_PATH = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "archivedOriginalPath"); static final QName PROP_ARCHIVED_BY = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "archivedBy"); static final QName PROP_ARCHIVED_DATE = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "archivedDate"); static final QName ASPECT_ARCHIVED_ASSOCS = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "archived-assocs"); diff --git a/source/java/org/alfresco/repo/domain/hibernate/ChildAssocImpl.java b/source/java/org/alfresco/repo/domain/hibernate/ChildAssocImpl.java index fa356b5093..9f618b1ede 100644 --- a/source/java/org/alfresco/repo/domain/hibernate/ChildAssocImpl.java +++ b/source/java/org/alfresco/repo/domain/hibernate/ChildAssocImpl.java @@ -77,13 +77,24 @@ public class ChildAssocImpl implements ChildAssoc public ChildAssociationRef getChildAssocRef() { + boolean trashReference = false; // first check if it is available refReadLock.lock(); try { if (childAssocRef != null) { - return childAssocRef; + // double check that the parent and child node references match those of our reference + if (childAssocRef.getParentRef() != parent.getNodeRef() || + childAssocRef.getChildRef() != child.getNodeRef()) + { + trashReference = true; + } + else + { + // we are sure that the reference is correct + return childAssocRef; + } } } finally @@ -95,13 +106,13 @@ public class ChildAssocImpl implements ChildAssoc try { // double check - if (childAssocRef == null ) + if (childAssocRef == null || trashReference) { childAssocRef = new ChildAssociationRef( this.typeQName, - getParent().getNodeRef(), + parent.getNodeRef(), this.qName, - getChild().getNodeRef(), + child.getNodeRef(), this.isPrimary, -1); } diff --git a/source/java/org/alfresco/repo/node/archive/ArchiveAndRestoreTest.java b/source/java/org/alfresco/repo/node/archive/ArchiveAndRestoreTest.java index 806f36adc6..9ba9c0640d 100644 --- a/source/java/org/alfresco/repo/node/archive/ArchiveAndRestoreTest.java +++ b/source/java/org/alfresco/repo/node/archive/ArchiveAndRestoreTest.java @@ -35,6 +35,7 @@ import org.alfresco.service.cmr.repository.AssociationRef; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.repository.Path; import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.security.AuthenticationService; import org.alfresco.service.cmr.security.PermissionService; @@ -128,6 +129,13 @@ public class ArchiveAndRestoreTest extends TestCase PermissionService.ALL_PERMISSIONS, true); + // grant everyone rights to the archive store + permissionService.setPermission( + archiveStoreRootNodeRef, + PermissionService.ALL_AUTHORITIES, + PermissionService.ALL_PERMISSIONS, + true); + TestWithUserUtils.createUser(USER_A, USER_A, workStoreRootNodeRef, nodeService, authenticationService); TestWithUserUtils.createUser(USER_B, USER_B, workStoreRootNodeRef, nodeService, authenticationService); } @@ -318,6 +326,11 @@ public class ArchiveAndRestoreTest extends TestCase verifyNodeExistence(b_, false); verifyNodeExistence(bb_, true); + // check that the required properties are present and correct + Map bb_Properties = nodeService.getProperties(bb_); + Path bb_originalPath = (Path) bb_Properties.get(ContentModel.PROP_ARCHIVED_ORIGINAL_PATH); + assertNotNull("Original path not stored", bb_originalPath); + // restore the node nodeService.restoreNode(bb_, null, null, null); // check diff --git a/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java b/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java index 4e9be3bbbb..998f60ab8c 100644 --- a/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java +++ b/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java @@ -1279,6 +1279,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl { Node node = getNodeNotNull(nodeRef); ChildAssoc primaryParentAssoc = nodeDaoService.getPrimaryParentAssoc(node); + Path primaryPath = getPath(nodeRef); // add the aspect node.getAspects().add(ContentModel.ASPECT_ARCHIVED); @@ -1295,6 +1296,10 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl dictionaryService.getProperty(ContentModel.PROP_ARCHIVED_ORIGINAL_PARENT_ASSOC), primaryParentAssoc.getChildAssocRef()); properties.put(ContentModel.PROP_ARCHIVED_ORIGINAL_PARENT_ASSOC, archivedPrimaryParentNodeRefProperty); + PropertyValue archivedPrimaryPathProperty = makePropertyValue( + dictionaryService.getProperty(ContentModel.PROP_ARCHIVED_ORIGINAL_PATH), + primaryPath); + properties.put(ContentModel.PROP_ARCHIVED_ORIGINAL_PATH, archivedPrimaryPathProperty); // move the node NodeRef archiveStoreRootNodeRef = getRootNode(archiveStoreRef);