From d94db4e310b4667fd21dfd149f91c2aa663d93e8 Mon Sep 17 00:00:00 2001 From: Derek Hulley Date: Thu, 26 Apr 2007 08:34:43 +0000 Subject: [PATCH] Added removeProperty method to NodeService. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@5558 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../public-services-security-context.xml | 1 + .../org/alfresco/repo/avm/AVMNodeService.java | 21 ++++++++++++++ .../repo/node/BaseNodeServiceTest.java | 5 ++++ .../repo/node/db/DbNodeServiceImpl.java | 28 ++++++++++++++++++- .../repo/version/NodeServiceImpl.java | 9 ++++++ .../service/cmr/repository/NodeService.java | 14 ++++++++-- 6 files changed, 74 insertions(+), 4 deletions(-) diff --git a/config/alfresco/public-services-security-context.xml b/config/alfresco/public-services-security-context.xml index 54ef7379d7..83cde8adc0 100644 --- a/config/alfresco/public-services-security-context.xml +++ b/config/alfresco/public-services-security-context.xml @@ -349,6 +349,7 @@ org.alfresco.service.cmr.repository.NodeService.getProperty=ACL_NODE.0.sys:base.ReadProperties org.alfresco.service.cmr.repository.NodeService.setProperties=ACL_NODE.0.sys:base.WriteProperties org.alfresco.service.cmr.repository.NodeService.setProperty=ACL_NODE.0.sys:base.WriteProperties + org.alfresco.service.cmr.repository.NodeService.removeProperty=ACL_NODE.0.sys:base.WriteProperties org.alfresco.service.cmr.repository.NodeService.getParentAssocs=ACL_NODE.0.sys:base.ReadProperties,AFTER_ACL_PARENT.sys:base.Read org.alfresco.service.cmr.repository.NodeService.getChildAssocs=ACL_NODE.0.sys:base.ReadChildren,AFTER_ACL_NODE.sys:base.Read org.alfresco.service.cmr.repository.NodeService.getChildByName=ACL_NODE.0.sys:base.ReadChildren,AFTER_ACL_NODE.sys:base.Read diff --git a/source/java/org/alfresco/repo/avm/AVMNodeService.java b/source/java/org/alfresco/repo/avm/AVMNodeService.java index cfb3b11f06..7af924fb41 100644 --- a/source/java/org/alfresco/repo/avm/AVMNodeService.java +++ b/source/java/org/alfresco/repo/avm/AVMNodeService.java @@ -1022,6 +1022,27 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi } } + /** + * @inheritDoc + */ + public void removeProperty(NodeRef nodeRef, QName qname) throws InvalidNodeRefException + { + Pair avmVersionPath = AVMNodeConverter.ToAVMVersionPath(nodeRef); + if (isBuiltInProperty(qname)) + { + // Ignore + return; + } + try + { + fAVMService.deleteNodeProperty(avmVersionPath.getSecond(), qname); + } + catch (AVMNotFoundException e) + { + throw new InvalidNodeRefException(avmVersionPath.getSecond() + " not found.", nodeRef); + } + } + /** * A Helper to spoof built in properties. * @param avmVersionPath The broken out version and path from a NodeRef. diff --git a/source/java/org/alfresco/repo/node/BaseNodeServiceTest.java b/source/java/org/alfresco/repo/node/BaseNodeServiceTest.java index aa61c85b01..c11f272b47 100644 --- a/source/java/org/alfresco/repo/node/BaseNodeServiceTest.java +++ b/source/java/org/alfresco/repo/node/BaseNodeServiceTest.java @@ -983,6 +983,11 @@ public abstract class BaseNodeServiceTest extends BaseSpringTest assertNotNull("Property value not set", valueCheck); assertEquals("Property value incorrect", "VALUE2", valueCheck); + // Remove a property + nodeService.removeProperty(nodeRef, qnameProperty2); + valueCheck = nodeService.getProperty(nodeRef, qnameProperty2); + assertNull("Property not removed", valueCheck); + // set the property value to null try { diff --git a/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java b/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java index da979030c1..0824f24781 100644 --- a/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java +++ b/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java @@ -1047,7 +1047,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl * @return the values of the properties after the set operation is complete * @throws InvalidNodeRefException */ - public Map setPropertyImpl(Node node, QName qname, Serializable value) throws InvalidNodeRefException + private Map setPropertyImpl(Node node, QName qname, Serializable value) throws InvalidNodeRefException { NodeRef nodeRef = node.getNodeRef(); @@ -1063,6 +1063,32 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl return getPropertiesImpl(node); } + public void removeProperty(NodeRef nodeRef, QName qname) throws InvalidNodeRefException + { + if (qname.equals(ContentModel.PROP_NAME)) + { + throw new UnsupportedOperationException("The property " + qname + " may not be removed individually"); + } + + // Invoke policy behaviours + invokeBeforeUpdateNode(nodeRef); + + // Get the node + Node node = getNodeNotNull(nodeRef); + + // Get the values before + Map propertiesBefore = getPropertiesImpl(node); + // Remove the property + Map properties = node.getProperties(); + properties.remove(qname); + // Get the values afterwards + Map propertiesAfter = getPropertiesImpl(node); + + // Invoke policy behaviours + invokeOnUpdateNode(nodeRef); + invokeOnUpdateProperties(nodeRef, propertiesBefore, propertiesAfter); + } + /** * Transforms {@link Node#getParentAssocs()} to a new collection */ diff --git a/source/java/org/alfresco/repo/version/NodeServiceImpl.java b/source/java/org/alfresco/repo/version/NodeServiceImpl.java index d376570bdd..ed3a556572 100644 --- a/source/java/org/alfresco/repo/version/NodeServiceImpl.java +++ b/source/java/org/alfresco/repo/version/NodeServiceImpl.java @@ -376,6 +376,15 @@ public class NodeServiceImpl implements NodeService, VersionModel throw new UnsupportedOperationException(MSG_UNSUPPORTED); } + /** + * @throws UnsupportedOperationException always + */ + public void removeProperty(NodeRef nodeRef, QName qname) throws InvalidNodeRefException + { + // This operation is not supported for a version store + throw new UnsupportedOperationException(MSG_UNSUPPORTED); + } + /** * The node will appear to be attached to the root of the version store * diff --git a/source/java/org/alfresco/service/cmr/repository/NodeService.java b/source/java/org/alfresco/service/cmr/repository/NodeService.java index 7e6f38be27..f7a26058a5 100644 --- a/source/java/org/alfresco/service/cmr/repository/NodeService.java +++ b/source/java/org/alfresco/service/cmr/repository/NodeService.java @@ -372,12 +372,10 @@ public interface NodeService /** * Sets the value of a property to be any Serializable instance. - * To remove a property value, use {@link #getProperties(NodeRef)}, remove the - * value and call {@link #setProperties(NodeRef, Map)}. *

* NOTE: Null values are allowed. * - * @param nodeRef + * @param nodeRef a reference to an existing node * @param qname the fully qualified name of the property * @param propertyValue the value of the property - never null * @throws InvalidNodeRefException if the node could not be found @@ -385,6 +383,16 @@ public interface NodeService @Auditable(key = Auditable.Key.ARG_0 ,parameters = {"nodeRef", "qname", "value"}) public void setProperty(NodeRef nodeRef, QName qname, Serializable value) throws InvalidNodeRefException; + /** + * Removes a property value completely. + * + * @param nodeRef a reference to an existing node + * @param qname the fully qualified name of the property + * @throws InvalidNodeRefException if the node could not be found + */ + @Auditable(key = Auditable.Key.ARG_0 ,parameters = {"nodeRef", "qname"}) + public void removeProperty(NodeRef nodeRef, QName qname) throws InvalidNodeRefException; + /** * @param nodeRef the child node * @return Returns a list of all parent-child associations that exist where the given