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;
}