diff --git a/config/alfresco/hibernate-context.xml b/config/alfresco/hibernate-context.xml index fd2b32af68..f9fd5473a8 100644 --- a/config/alfresco/hibernate-context.xml +++ b/config/alfresco/hibernate-context.xml @@ -213,6 +213,9 @@ + + + diff --git a/source/java/org/alfresco/repo/avm/AVMNodeImpl.java b/source/java/org/alfresco/repo/avm/AVMNodeImpl.java index be8400fdfc..de8bc9da2f 100644 --- a/source/java/org/alfresco/repo/avm/AVMNodeImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMNodeImpl.java @@ -310,6 +310,24 @@ public abstract class AVMNodeImpl implements AVMNode, Serializable } } + /** + * Copy all aspects from another node. + * @param other The other node. + */ + protected void copyAspects(AVMNode other) + { + List aspects = + AVMContext.fgInstance.fAVMAspectNameDAO.get(other); + for (AVMAspectName name : aspects) + { + AVMAspectName newName = + new AVMAspectNameImpl(); + newName.setName(name.getName()); + newName.setNode(this); + AVMContext.fgInstance.fAVMAspectNameDAO.save(newName); + } + } + /** * Set a property on a node. Overwrite it if it exists. * @param name The name of the property. diff --git a/source/java/org/alfresco/repo/avm/AVMServiceTest.java b/source/java/org/alfresco/repo/avm/AVMServiceTest.java index c297e9212f..ce60bb1f53 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceTest.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceTest.java @@ -2220,7 +2220,9 @@ public class AVMServiceTest extends AVMServiceTestBase assertFalse(fService.hasAspect(-1, "main:/a/b/c/foo", ContentModel.ASPECT_AUTHOR)); fService.removeAspect("main:/a/b/c/foo", ContentModel.ASPECT_TITLED); fService.createSnapshot("main"); + fService.getFileOutputStream("main:/a/b/c/foo").close(); assertFalse(fService.hasAspect(-1, "main:/a/b/c/foo", ContentModel.ASPECT_TITLED)); + assertTrue(fService.hasAspect(-1, "main:/a/b/c/foo", ContentModel.ASPECT_AUDITABLE)); } catch (Exception e) { diff --git a/source/java/org/alfresco/repo/avm/LayeredDirectoryNodeImpl.java b/source/java/org/alfresco/repo/avm/LayeredDirectoryNodeImpl.java index cd1281033b..4de69afef6 100644 --- a/source/java/org/alfresco/repo/avm/LayeredDirectoryNodeImpl.java +++ b/source/java/org/alfresco/repo/avm/LayeredDirectoryNodeImpl.java @@ -114,6 +114,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec } AVMContext.fgInstance.fAVMNodeDAO.flush(); copyProperties(other); + copyAspects(other); } /** @@ -147,6 +148,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec } AVMContext.fgInstance.fAVMNodeDAO.flush(); copyProperties(other); + copyAspects(other); } /** @@ -170,6 +172,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec AVMContext.fgInstance.fAVMNodeDAO.save(this); AVMContext.fgInstance.fAVMNodeDAO.flush(); copyProperties(dir); + copyAspects(dir); } /** diff --git a/source/java/org/alfresco/repo/avm/LayeredFileNodeImpl.java b/source/java/org/alfresco/repo/avm/LayeredFileNodeImpl.java index 861131aa66..88b297278f 100644 --- a/source/java/org/alfresco/repo/avm/LayeredFileNodeImpl.java +++ b/source/java/org/alfresco/repo/avm/LayeredFileNodeImpl.java @@ -54,6 +54,7 @@ class LayeredFileNodeImpl extends FileNodeImpl implements LayeredFileNode AVMContext.fgInstance.fAVMNodeDAO.save(this); AVMContext.fgInstance.fAVMNodeDAO.flush(); copyProperties(other); + copyAspects(other); } /** @@ -83,10 +84,12 @@ class LayeredFileNodeImpl extends FileNodeImpl implements LayeredFileNode { throw new AVMException("Unbacked layered file node."); } + // TODO This doesn't look quite right. PlainFileNodeImpl newMe = new PlainFileNodeImpl(lPath.getAVMStore(), getBasicAttributes(), getContentData(lPath), - getProperties()); + indirect.getProperties(), + AVMContext.fgInstance.fAVMAspectNameDAO.get(indirect)); newMe.setAncestor(this); return newMe; } diff --git a/source/java/org/alfresco/repo/avm/PlainDirectoryNodeImpl.java b/source/java/org/alfresco/repo/avm/PlainDirectoryNodeImpl.java index c6b404173f..f034bfdcde 100644 --- a/source/java/org/alfresco/repo/avm/PlainDirectoryNodeImpl.java +++ b/source/java/org/alfresco/repo/avm/PlainDirectoryNodeImpl.java @@ -73,6 +73,7 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory } AVMContext.fgInstance.fAVMNodeDAO.flush(); copyProperties(other); + copyAspects(other); } /** diff --git a/source/java/org/alfresco/repo/avm/PlainFileNodeImpl.java b/source/java/org/alfresco/repo/avm/PlainFileNodeImpl.java index 2302a7f000..d7545c69f4 100644 --- a/source/java/org/alfresco/repo/avm/PlainFileNodeImpl.java +++ b/source/java/org/alfresco/repo/avm/PlainFileNodeImpl.java @@ -17,6 +17,7 @@ package org.alfresco.repo.avm; +import java.util.List; import java.util.Map; import org.alfresco.repo.domain.PropertyValue; @@ -90,6 +91,7 @@ class PlainFileNodeImpl extends FileNodeImpl implements PlainFileNode AVMContext.fgInstance.fAVMNodeDAO.save(this); AVMContext.fgInstance.fAVMNodeDAO.flush(); copyProperties(other); + copyAspects(other); } /** @@ -102,14 +104,23 @@ class PlainFileNodeImpl extends FileNodeImpl implements PlainFileNode public PlainFileNodeImpl(AVMStore store, BasicAttributes attrs, ContentData content, - Map props) + Map props, + List aspects) { super(store.getAVMRepository().issueID(), store); setContentData(content); setBasicAttributes(attrs); AVMContext.fgInstance.fAVMNodeDAO.save(this); AVMContext.fgInstance.fAVMNodeDAO.flush(); - this.setProperties(props); + setProperties(props); + for (AVMAspectName name : aspects) + { + AVMAspectName newName = + new AVMAspectNameImpl(); + newName.setName(name.getName()); + newName.setNode(this); + AVMContext.fgInstance.fAVMAspectNameDAO.save(newName); + } } /**