diff --git a/source/java/org/alfresco/repo/avm/AVMNode.java b/source/java/org/alfresco/repo/avm/AVMNode.java index 8c8e6f8950..295e79b151 100644 --- a/source/java/org/alfresco/repo/avm/AVMNode.java +++ b/source/java/org/alfresco/repo/avm/AVMNode.java @@ -160,4 +160,10 @@ public interface AVMNode * @return A Map of QNames to PropertyValues. */ public Map getProperties(); + + /** + * Delete a property from this node. + * @param name The name of the property. + */ + public void deleteProperty(QName name); } \ No newline at end of file diff --git a/source/java/org/alfresco/repo/avm/AVMNodeImpl.java b/source/java/org/alfresco/repo/avm/AVMNodeImpl.java index 32953245af..56ac0a96e7 100644 --- a/source/java/org/alfresco/repo/avm/AVMNodeImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMNodeImpl.java @@ -347,4 +347,13 @@ public abstract class AVMNodeImpl implements AVMNode, Serializable } return retVal; } + + /** + * Delete a property from this node. + * @param name The name of the property. + */ + public void deleteProperty(QName name) + { + AVMContext.fgInstance.fAVMNodePropertyDAO.delete(this, name); + } } diff --git a/source/java/org/alfresco/repo/avm/AVMNodePropertyDAO.java b/source/java/org/alfresco/repo/avm/AVMNodePropertyDAO.java index eef52af250..e62d2531aa 100644 --- a/source/java/org/alfresco/repo/avm/AVMNodePropertyDAO.java +++ b/source/java/org/alfresco/repo/avm/AVMNodePropertyDAO.java @@ -59,4 +59,11 @@ public interface AVMNodePropertyDAO * @param node The AVMNode whose properties should be deleted. */ public void deleteAll(AVMNode node); + + /** + * Delete the given property from the given node. + * @param node The node to delete the property to delete. + * @param name The name of the property to delete. + */ + public void delete(AVMNode node, QName name); } diff --git a/source/java/org/alfresco/repo/avm/AVMRepository.java b/source/java/org/alfresco/repo/avm/AVMRepository.java index e0e35aa713..7af981963d 100644 --- a/source/java/org/alfresco/repo/avm/AVMRepository.java +++ b/source/java/org/alfresco/repo/avm/AVMRepository.java @@ -921,6 +921,19 @@ class AVMRepository return store.getProperties(version, pathParts[1]); } + /** + * Delete a single property from a node. + * @param path The path to the node. + * @param name The name of the property. + */ + public void deleteProperty(String path, QName name) + { + fLookupCount.set(1); + String [] pathParts = SplitPath(path); + AVMStore store = getAVMStoreByName(pathParts[0], true); + store.deleteProperty(pathParts[1], name); + } + /** * Get the AVMStoreDescriptor for an AVMStore. * @param name The name of the AVMStore. diff --git a/source/java/org/alfresco/repo/avm/AVMService.java b/source/java/org/alfresco/repo/avm/AVMService.java index 5cc3dd70d7..4d7dea7eae 100644 --- a/source/java/org/alfresco/repo/avm/AVMService.java +++ b/source/java/org/alfresco/repo/avm/AVMService.java @@ -342,4 +342,11 @@ public interface AVMService * @return A Map of QNames to PropertyValues. */ public Map getProperties(int version, String path); + + /** + * Delete a property. + * @param path The path to the node. + * @param name The QName of the property to delete. + */ + public void deleteProperty(String path, QName name); } diff --git a/source/java/org/alfresco/repo/avm/AVMServiceImpl.java b/source/java/org/alfresco/repo/avm/AVMServiceImpl.java index bad0443c65..9692323c7f 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceImpl.java @@ -1128,4 +1128,26 @@ public class AVMServiceImpl implements AVMService fTransaction.perform(doit, false); return doit.properties; } + + /** + * Delete a property. + * @param path The path to the node. + * @param name The QName of the property to delete. + */ + public void deleteProperty(final String path, final QName name) + { + if (path == null || name == null) + { + throw new AVMBadArgumentException("Illegal null argument."); + } + class TxnCallback implements RetryingTransactionCallback + { + public void perform() + { + fAVMRepository.deleteProperty(path, name); + } + } + TxnCallback doit = new TxnCallback(); + fTransaction.perform(doit, true); + } } diff --git a/source/java/org/alfresco/repo/avm/AVMServiceTest.java b/source/java/org/alfresco/repo/avm/AVMServiceTest.java index e94384e4df..24b55f6203 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceTest.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceTest.java @@ -2052,9 +2052,16 @@ public class AVMServiceTest extends AVMServiceTestBase fService.setProperties("main:/a/b/c/bar", props); fService.createSnapshot("main"); props = fService.getProperties(-1, "main:/a/b/c/bar"); + assertEquals(3, props.size()); assertEquals(p1.toString(), props.get(n1).toString()); assertEquals(p2.toString(), props.get(n2).toString()); assertEquals(p3.toString(), props.get(n3).toString()); + fService.deleteProperty("main:/a/b/c/bar", n1); + fService.createSnapshot("main"); + props = fService.getProperties(-1, "main:/a/b/c/bar"); + assertEquals(2, props.size()); + assertEquals(p2.toString(), props.get(n2).toString()); + assertEquals(p3.toString(), props.get(n3).toString()); } catch (Exception e) { diff --git a/source/java/org/alfresco/repo/avm/AVMStore.java b/source/java/org/alfresco/repo/avm/AVMStore.java index 697a457987..0c0e6bef76 100644 --- a/source/java/org/alfresco/repo/avm/AVMStore.java +++ b/source/java/org/alfresco/repo/avm/AVMStore.java @@ -292,6 +292,13 @@ public interface AVMStore */ public PropertyValue getProperty(int version, String path, QName name); + /** + * Delete a single property from a node. + * @param path The path to the node. + * @param name The name of the property. + */ + public void deleteProperty(String path, QName name); + /** * Get all the properties associated with a node. * @param version The version to look under. diff --git a/source/java/org/alfresco/repo/avm/AVMStoreImpl.java b/source/java/org/alfresco/repo/avm/AVMStoreImpl.java index 5915b842cc..ed65fc2ba9 100644 --- a/source/java/org/alfresco/repo/avm/AVMStoreImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMStoreImpl.java @@ -878,4 +878,16 @@ public class AVMStoreImpl implements AVMStore, Serializable AVMNode node = lPath.getCurrentNode(); return node.getProperties(); } + + /** + * Delete a single property from a node. + * @param path The path to the node. + * @param name The name of the property. + */ + public void deleteProperty(String path, QName name) + { + Lookup lPath = lookup(-1, path, true); + AVMNode node = lPath.getCurrentNode(); + node.deleteProperty(name); + } } diff --git a/source/java/org/alfresco/repo/avm/hibernate/AVMNodePropertyDAOHibernate.java b/source/java/org/alfresco/repo/avm/hibernate/AVMNodePropertyDAOHibernate.java index c2ef643577..ceb66c5b22 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/AVMNodePropertyDAOHibernate.java +++ b/source/java/org/alfresco/repo/avm/hibernate/AVMNodePropertyDAOHibernate.java @@ -80,4 +80,19 @@ public class AVMNodePropertyDAOHibernate extends HibernateDaoSupport delete.setEntity("node", node); delete.executeUpdate(); } + + /** + * Delete the given property from the given node. + * @param node The node to delete the property to delete. + * @param name The name of the property to delete. + */ + public void delete(AVMNode node, QName name) + { + Query delete = + getSession().createQuery("delete from AVMNodePropertyImpl anp where anp.node = :node " + + "and name = :name"); + delete.setEntity("node", node); + delete.setParameter("name", name); + delete.executeUpdate(); + } }