From b59b9604e91ae015672aa57b90278a6f62c1ceb2 Mon Sep 17 00:00:00 2001 From: Derek Hulley Date: Mon, 5 Jul 2010 14:04:36 +0000 Subject: [PATCH] Fixed SAIL-384: HEAD merge fallout: CMIS TCK - Implemented NodeService.getAssoc(id) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@20939 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../node-common-SqlMap.xml | 6 +++++ .../repo/domain/node/AbstractNodeDAOImpl.java | 26 ++++++++++--------- .../repo/domain/node/NodeAssocEntity.java | 18 +++++++++++++ .../alfresco/repo/domain/node/NodeDAO.java | 7 +++++ .../repo/domain/node/ibatis/NodeDAOImpl.java | 10 +++++++ .../repo/node/BaseNodeServiceTest.java | 16 ++++++++++++ .../repo/node/db/DbNodeServiceImpl.java | 3 +-- 7 files changed, 72 insertions(+), 14 deletions(-) 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)