diff --git a/config/alfresco/ibatis/org.hibernate.dialect.Dialect/node-common-SqlMap.xml b/config/alfresco/ibatis/org.hibernate.dialect.Dialect/node-common-SqlMap.xml
index 893af5ce5e..f73efdd8a6 100644
--- a/config/alfresco/ibatis/org.hibernate.dialect.Dialect/node-common-SqlMap.xml
+++ b/config/alfresco/ibatis/org.hibernate.dialect.Dialect/node-common-SqlMap.xml
@@ -650,6 +650,12 @@
targetNode.id = #targetNode.id#
+
+
select
diff --git a/source/java/org/alfresco/repo/domain/node/AbstractNodeDAOImpl.java b/source/java/org/alfresco/repo/domain/node/AbstractNodeDAOImpl.java
index 777c086141..d39647df56 100644
--- a/source/java/org/alfresco/repo/domain/node/AbstractNodeDAOImpl.java
+++ b/source/java/org/alfresco/repo/domain/node/AbstractNodeDAOImpl.java
@@ -2124,12 +2124,7 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO
for (NodeAssocEntity nodeAssocEntity : nodeAssocEntities)
{
Long assocId = nodeAssocEntity.getId();
- QName assocTypeQName = qnameDAO.getQName(nodeAssocEntity.getTypeQNameId()).getSecond();
- AssociationRef assocRef = new AssociationRef(
- nodeAssocEntity.getId(),
- nodeAssocEntity.getSourceNode().getNodeRef(),
- assocTypeQName,
- nodeAssocEntity.getTargetNode().getNodeRef());
+ AssociationRef assocRef = nodeAssocEntity.getAssociationRef(qnameDAO);
results.add(new Pair(assocId, assocRef));
}
return results;
@@ -2142,17 +2137,23 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO
for (NodeAssocEntity nodeAssocEntity : nodeAssocEntities)
{
Long assocId = nodeAssocEntity.getId();
- QName assocTypeQName = qnameDAO.getQName(nodeAssocEntity.getTypeQNameId()).getSecond();
- AssociationRef assocRef = new AssociationRef(
- nodeAssocEntity.getId(),
- nodeAssocEntity.getSourceNode().getNodeRef(),
- assocTypeQName,
- nodeAssocEntity.getTargetNode().getNodeRef());
+ AssociationRef assocRef = nodeAssocEntity.getAssociationRef(qnameDAO);
results.add(new Pair(assocId, assocRef));
}
return results;
}
+ public Pair getNodeAssoc(Long assocId)
+ {
+ NodeAssocEntity nodeAssocEntity = selectNodeAssocById(assocId);
+ if (nodeAssocEntity == null)
+ {
+ throw new ConcurrencyFailureException("Assoc ID does not point to a valid association: " + assocId);
+ }
+ AssociationRef assocRef = nodeAssocEntity.getAssociationRef(qnameDAO);
+ return new Pair(assocId, assocRef);
+ }
+
/*
* Child assocs
*/
@@ -3082,6 +3083,7 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO
protected abstract int deleteNodeAssocsToAndFrom(Long nodeId, Set assocTypeQNameIds);
protected abstract List selectNodeAssocsBySource(Long sourceNodeId);
protected abstract List selectNodeAssocsByTarget(Long targetNodeId);
+ protected abstract NodeAssocEntity selectNodeAssocById(Long assocId);
protected abstract Long insertChildAssoc(ChildAssocEntity assoc);
protected abstract int deleteChildAssocById(Long assocId);
protected abstract int updateChildAssocIndex(
diff --git a/source/java/org/alfresco/repo/domain/node/NodeAssocEntity.java b/source/java/org/alfresco/repo/domain/node/NodeAssocEntity.java
index fed79ad05d..7e1817347c 100644
--- a/source/java/org/alfresco/repo/domain/node/NodeAssocEntity.java
+++ b/source/java/org/alfresco/repo/domain/node/NodeAssocEntity.java
@@ -26,6 +26,10 @@ package org.alfresco.repo.domain.node;
import java.util.List;
+import org.alfresco.repo.domain.qname.QNameDAO;
+import org.alfresco.service.cmr.repository.AssociationRef;
+import org.alfresco.service.namespace.QName;
+
/**
* Bean for alf_node_assoc table.
*
@@ -61,6 +65,20 @@ public class NodeAssocEntity
.append("]");
return sb.toString();
}
+
+ /**
+ * Helper method to fetch the association reference
+ */
+ public AssociationRef getAssociationRef(QNameDAO qnameDAO)
+ {
+ QName assocTypeQName = qnameDAO.getQName(typeQNameId).getSecond();
+ AssociationRef assocRef = new AssociationRef(
+ id,
+ sourceNode.getNodeRef(),
+ assocTypeQName,
+ targetNode.getNodeRef());
+ return assocRef;
+ }
public Long getId()
{
diff --git a/source/java/org/alfresco/repo/domain/node/NodeDAO.java b/source/java/org/alfresco/repo/domain/node/NodeDAO.java
index 230e76f0ef..f6b9cba8f1 100644
--- a/source/java/org/alfresco/repo/domain/node/NodeDAO.java
+++ b/source/java/org/alfresco/repo/domain/node/NodeDAO.java
@@ -284,6 +284,13 @@ public interface NodeDAO extends NodeBulkLoader
*/
public Collection> getTargetNodeAssocs(Long sourceNodeId);
+ /**
+ * @return Returns a specific node association with the given ID
+ *
+ * @throws ConcurrencyFailureException if the association ID is invalid
+ */
+ public Pair getNodeAssoc(Long assocId);
+
/*
* Child Assocs
*/
diff --git a/source/java/org/alfresco/repo/domain/node/ibatis/NodeDAOImpl.java b/source/java/org/alfresco/repo/domain/node/ibatis/NodeDAOImpl.java
index 05f794d22d..81feee96e1 100644
--- a/source/java/org/alfresco/repo/domain/node/ibatis/NodeDAOImpl.java
+++ b/source/java/org/alfresco/repo/domain/node/ibatis/NodeDAOImpl.java
@@ -101,6 +101,7 @@ public class NodeDAOImpl extends AbstractNodeDAOImpl
private static final String DELETE_NODE_ASSOCS_TO_AND_FROM = "alfresco.node.delete_NodeAssocsToAndFrom";
private static final String SELECT_NODE_ASSOCS_BY_SOURCE = "alfresco.node.select_NodeAssocsBySource";
private static final String SELECT_NODE_ASSOCS_BY_TARGET = "alfresco.node.select_NodeAssocsByTarget";
+ private static final String SELECT_NODE_ASSOC_BY_ID = "alfresco.node.select_NodeAssocById";
private static final String SELECT_NODE_PRIMARY_CHILD_ACLS = "alfresco.node.select_NodePrimaryChildAcls";
private static final String INSERT_CHILD_ASSOC = "alfresco.node.insert_ChildAssoc";
private static final String DELETE_CHILD_ASSOC_BY_ID = "alfresco.node.delete_ChildAssocById";
@@ -657,6 +658,15 @@ public class NodeDAOImpl extends AbstractNodeDAOImpl
return (List) template.queryForList(SELECT_NODE_ASSOCS_BY_TARGET, assoc);
}
+ @Override
+ protected NodeAssocEntity selectNodeAssocById(Long assocId)
+ {
+ NodeAssocEntity assoc = new NodeAssocEntity();
+ assoc.setId(assocId);
+
+ return (NodeAssocEntity) template.queryForObject(SELECT_NODE_ASSOC_BY_ID, assoc);
+ }
+
@Override
protected Long insertChildAssoc(ChildAssocEntity assoc)
{
diff --git a/source/java/org/alfresco/repo/node/BaseNodeServiceTest.java b/source/java/org/alfresco/repo/node/BaseNodeServiceTest.java
index bf75893e25..4b52a90fc3 100644
--- a/source/java/org/alfresco/repo/node/BaseNodeServiceTest.java
+++ b/source/java/org/alfresco/repo/node/BaseNodeServiceTest.java
@@ -2200,6 +2200,10 @@ public abstract class BaseNodeServiceTest extends BaseSpringTest
sourceRef,
anotherTargetRef,
ASSOC_TYPE_QNAME_TEST_NEXT);
+ Long anotherAssocId = anotherAssocRef.getId();
+ assertNotNull("Created association does not have an ID", anotherAssocId);
+ AssociationRef anotherAssocRefCheck = nodeService.getAssoc(anotherAssocId);
+ assertEquals("Assoc fetched by ID is incorrect.", anotherAssocRef, anotherAssocRefCheck);
// remove assocs
List assocs = nodeService.getTargetAssocs(sourceRef, ASSOC_TYPE_QNAME_TEST_NEXT);
@@ -2222,6 +2226,12 @@ public abstract class BaseNodeServiceTest extends BaseSpringTest
List targetAssocs = nodeService.getTargetAssocs(sourceRef, qname);
assertEquals("Incorrect number of targets", 1, targetAssocs.size());
assertTrue("Target not found", targetAssocs.contains(assocRef));
+
+ // Check that IDs are present
+ for (AssociationRef targetAssoc : targetAssocs)
+ {
+ assertNotNull("Association does not have ID", targetAssoc.getId());
+ }
}
public void testGetSourceAssocs() throws Exception
@@ -2234,6 +2244,12 @@ public abstract class BaseNodeServiceTest extends BaseSpringTest
List sourceAssocs = nodeService.getSourceAssocs(targetRef, qname);
assertEquals("Incorrect number of source assocs", 1, sourceAssocs.size());
assertTrue("Source not found", sourceAssocs.contains(assocRef));
+
+ // Check that IDs are present
+ for (AssociationRef sourceAssoc : sourceAssocs)
+ {
+ assertNotNull("Association does not have ID", sourceAssoc.getId());
+ }
}
/**
diff --git a/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java b/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java
index 8166bdfdc5..7059e9c3fb 100644
--- a/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java
+++ b/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java
@@ -1786,8 +1786,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
public AssociationRef getAssoc(Long id)
{
- throw new UnsupportedOperationException("TODO: Implement the method for the new DAO implementation.");
-// return nodeDaoService.getNodeAssocOrNull(id);
+ return nodeDAO.getNodeAssoc(id).getSecond();
}
public List getTargetAssocs(NodeRef sourceRef, QNamePattern qnamePattern)