diff --git a/config/alfresco/model/systemModel.xml b/config/alfresco/model/systemModel.xml index c9e64edd1c..b30ed8c1ec 100644 --- a/config/alfresco/model/systemModel.xml +++ b/config/alfresco/model/systemModel.xml @@ -131,11 +131,6 @@ 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 1d6c1f1115..8dfdc291ec 100644 --- a/source/java/org/alfresco/model/ContentModel.java +++ b/source/java/org/alfresco/model/ContentModel.java @@ -42,7 +42,6 @@ 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 c32e0bf1b4..8c338c180e 100644 --- a/source/java/org/alfresco/repo/domain/hibernate/ChildAssocImpl.java +++ b/source/java/org/alfresco/repo/domain/hibernate/ChildAssocImpl.java @@ -114,7 +114,7 @@ public class ChildAssocImpl implements ChildAssoc this.qName, child.getNodeRef(), this.isPrimary, - -1); + index); } return childAssocRef; } diff --git a/source/java/org/alfresco/repo/domain/hibernate/NodeAssocImpl.java b/source/java/org/alfresco/repo/domain/hibernate/NodeAssocImpl.java index be3897e152..881226e691 100644 --- a/source/java/org/alfresco/repo/domain/hibernate/NodeAssocImpl.java +++ b/source/java/org/alfresco/repo/domain/hibernate/NodeAssocImpl.java @@ -74,13 +74,24 @@ public class NodeAssocImpl implements NodeAssoc public AssociationRef getNodeAssocRef() { + boolean trashReference = false; // first check if it is available refReadLock.lock(); try { if (nodeAssocRef != null) { - return nodeAssocRef; + // double check that the parent and child node references match those of our reference + if (nodeAssocRef.getSourceRef() != source.getNodeRef() || + nodeAssocRef.getTargetRef() != target.getNodeRef()) + { + trashReference = true; + } + else + { + // we are sure that the reference is correct + return nodeAssocRef; + } } } finally @@ -92,7 +103,7 @@ public class NodeAssocImpl implements NodeAssoc try { // double check - if (nodeAssocRef == null ) + if (nodeAssocRef == null || trashReference) { nodeAssocRef = new AssociationRef( getSource().getNodeRef(), diff --git a/source/java/org/alfresco/repo/node/BaseNodeServiceTest.java b/source/java/org/alfresco/repo/node/BaseNodeServiceTest.java index cdcd66f480..60ad2059cb 100644 --- a/source/java/org/alfresco/repo/node/BaseNodeServiceTest.java +++ b/source/java/org/alfresco/repo/node/BaseNodeServiceTest.java @@ -1206,24 +1206,6 @@ public abstract class BaseNodeServiceTest extends BaseSpringTest return assocRef; } - public void testAssociationToIncorrectNodeType() throws Exception - { - AssociationRef assocRef = createAssociation(); - NodeRef sourceRef = assocRef.getSourceRef(); - NodeRef targetRef = assocRef.getTargetRef(); - QName qname = assocRef.getTypeQName(); - try - { - // attempt the association in reverse - nodeService.createAssociation(sourceRef, targetRef, qname); - fail("Incorrect node type not detected"); - } - catch (RuntimeException e) - { - // expected - } - } - public void testDuplicateAssociationDetection() throws Exception { AssociationRef assocRef = createAssociation(); diff --git a/source/java/org/alfresco/repo/node/archive/ArchiveAndRestoreTest.java b/source/java/org/alfresco/repo/node/archive/ArchiveAndRestoreTest.java index 122d835397..ca65ea6679 100644 --- a/source/java/org/alfresco/repo/node/archive/ArchiveAndRestoreTest.java +++ b/source/java/org/alfresco/repo/node/archive/ArchiveAndRestoreTest.java @@ -36,7 +36,6 @@ 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; @@ -55,8 +54,8 @@ import org.springframework.context.ApplicationContext; */ public class ArchiveAndRestoreTest extends TestCase { - private static final String USER_A = "AAAAA"; - private static final String USER_B = "BBBBB"; + private static final String USER_A = "aaaaa"; + private static final String USER_B = "bbbbb"; private static final QName ASPECT_ATTACHABLE = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "attachable"); private static final QName ASSOC_ATTACHMENTS = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "attachments"); private static final QName QNAME_A = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "a"); @@ -123,11 +122,19 @@ public class ArchiveAndRestoreTest extends TestCase // Map the work store to the archive store. This will already be wired into the NodeService. StoreArchiveMap archiveMap = (StoreArchiveMap) ctx.getBean("storeArchiveMap"); archiveMap.getArchiveMap().put(workStoreRef, archiveStoreRef); + + TestWithUserUtils.createUser(USER_A, USER_A, workStoreRootNodeRef, nodeService, authenticationService); + TestWithUserUtils.createUser(USER_B, USER_B, workStoreRootNodeRef, nodeService, authenticationService); - // grant everyone rights to the work store + // grant A and B rights to the work store permissionService.setPermission( workStoreRootNodeRef, - PermissionService.ALL_AUTHORITIES, + USER_A, + PermissionService.ALL_PERMISSIONS, + true); + permissionService.setPermission( + workStoreRootNodeRef, + USER_B, PermissionService.ALL_PERMISSIONS, true); @@ -137,9 +144,6 @@ public class ArchiveAndRestoreTest extends TestCase 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); } finally { @@ -335,8 +339,8 @@ public class ArchiveAndRestoreTest extends TestCase // 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); + ChildAssociationRef bb_originalParent = (ChildAssociationRef) bb_Properties.get(ContentModel.PROP_ARCHIVED_ORIGINAL_PARENT_ASSOC); + assertNotNull("Original parent not stored", bb_originalParent); // restore the node nodeService.restoreNode(bb_, null, null, null); diff --git a/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java b/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java index 431abbc332..add21c98f5 100644 --- a/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java +++ b/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java @@ -1071,14 +1071,20 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl public void removeAssociation(NodeRef sourceRef, NodeRef targetRef, QName assocTypeQName) throws InvalidNodeRefException { - // Invoke policy behaviours - invokeBeforeUpdateNode(sourceRef); - Node sourceNode = getNodeNotNull(sourceRef); Node targetNode = getNodeNotNull(targetRef); // get the association NodeAssoc assoc = nodeDaoService.getNodeAssoc(sourceNode, targetNode, assocTypeQName); + if (assoc == null) + { + // nothing to remove + return; + } AssociationRef assocRef = assoc.getNodeAssocRef(); + + // Invoke policy behaviours + invokeBeforeUpdateNode(sourceRef); + // delete it nodeDaoService.deleteNodeAssoc(assoc); @@ -1302,7 +1308,6 @@ 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); @@ -1319,10 +1324,6 @@ 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); @@ -1559,7 +1560,6 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl // remove the aspect archived aspect aspects.remove(ContentModel.ASPECT_ARCHIVED); properties.remove(ContentModel.PROP_ARCHIVED_ORIGINAL_PARENT_ASSOC); - properties.remove(ContentModel.PROP_ARCHIVED_ORIGINAL_PATH); properties.remove(ContentModel.PROP_ARCHIVED_BY); properties.remove(ContentModel.PROP_ARCHIVED_DATE); diff --git a/source/java/org/alfresco/service/cmr/repository/AssociationRef.java b/source/java/org/alfresco/service/cmr/repository/AssociationRef.java index 31720d79ca..51fd22c368 100644 --- a/source/java/org/alfresco/service/cmr/repository/AssociationRef.java +++ b/source/java/org/alfresco/service/cmr/repository/AssociationRef.java @@ -115,7 +115,7 @@ public class AssociationRef implements EntityRef, Serializable { return true; } - if (!(o instanceof ChildAssociationRef)) + if (!(o instanceof AssociationRef)) { return false; }