diff --git a/repository/src/main/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java b/repository/src/main/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java index 73731c4604..fde3556812 100644 --- a/repository/src/main/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java +++ b/repository/src/main/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java @@ -859,9 +859,18 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl implements Extens if (aspectDef != null) { // Remove default properties + Map propsBefore = nodeDAO.getNodeProperties(nodeId); Map propertyDefs = aspectDef.getProperties(); Set propertyToRemoveQNames = propertyDefs.keySet(); - nodeDAO.removeNodeProperties(nodeId, propertyToRemoveQNames); + boolean propertiesRemoved = nodeDAO.removeNodeProperties(nodeId, propertyToRemoveQNames); + + if (propertiesRemoved) + { + invokeOnUpdateProperties( + nodeRef, + propsBefore, // before + nodeDAO.getNodeProperties(nodeId)); // after + } // Remove child associations // We have to iterate over the associations and remove all those between the parent and child diff --git a/repository/src/test/java/org/alfresco/repo/event2/UpdateRepoEventIT.java b/repository/src/test/java/org/alfresco/repo/event2/UpdateRepoEventIT.java index c6efe5ef5e..a78d301634 100644 --- a/repository/src/test/java/org/alfresco/repo/event2/UpdateRepoEventIT.java +++ b/repository/src/test/java/org/alfresco/repo/event2/UpdateRepoEventIT.java @@ -26,6 +26,12 @@ package org.alfresco.repo.event2; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + import static org.alfresco.model.ContentModel.PROP_DESCRIPTION; import java.io.Serializable; @@ -544,6 +550,49 @@ public class UpdateRepoEventIT extends AbstractContextAwareRepoEvent assertEquals(aspectsBeforeRemove, resourceBefore.getAspectNames()); } + @Test + public void testRemoveAspectPropertiesTest() + { + final NodeRef nodeRef = createNode(ContentModel.TYPE_CONTENT); + NodeResource resource = getNodeResource(1); + final Set originalAspects = resource.getAspectNames(); + assertNotNull(originalAspects); + + // Add cm:geographic aspect with properties + retryingTransactionHelper.doInTransaction(() -> { + Map aspectProperties = new HashMap<>(); + aspectProperties.put(ContentModel.PROP_LATITUDE, "12.345678"); + aspectProperties.put(ContentModel.PROP_LONGITUDE, "12.345678"); + nodeService.addAspect(nodeRef, ContentModel.ASPECT_GEOGRAPHIC, aspectProperties); + return null; + }); + resource = getNodeResource(2); + Set aspectsBeforeRemove = resource.getAspectNames(); + assertNotNull(aspectsBeforeRemove); + assertTrue(aspectsBeforeRemove.contains("cm:geographic")); + + // Remove cm:geographic aspect - this automatically removes the properties from the node + retryingTransactionHelper.doInTransaction(() -> { + nodeService.removeAspect(nodeRef, ContentModel.ASPECT_GEOGRAPHIC); + return null; + }); + + resource = getNodeResource(3); + assertEquals(originalAspects, resource.getAspectNames()); + + NodeResource resourceBefore = getNodeResourceBefore(3); + assertNotNull(resourceBefore.getAspectNames()); + assertEquals(aspectsBeforeRemove, resourceBefore.getAspectNames()); + // Resource before should contain cm:latitude and cm:longitude properties + assertNotNull(resourceBefore.getProperties()); + assertTrue(resourceBefore.getProperties().containsKey("cm:latitude")); + assertTrue(resourceBefore.getProperties().containsKey("cm:longitude")); + // Resource after should NOT contain cm:latitude and cm:longitude properties + assertNotNull(resource.getProperties()); + assertFalse(resource.getProperties().containsKey("cm:latitude")); + assertFalse(resource.getProperties().containsKey("cm:longitude")); + } + @Test public void testCreateAndUpdateInTheSameTransaction() {