diff --git a/source/java/org/alfresco/repo/avm/AVMServiceTest.java b/source/java/org/alfresco/repo/avm/AVMServiceTest.java index ed7edf801b..401a8d1b27 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceTest.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceTest.java @@ -31,7 +31,6 @@ import java.util.Set; import java.util.TreeMap; import org.alfresco.model.ContentModel; -import org.alfresco.repo.action.ActionImpl; import org.alfresco.repo.avm.actions.SimpleAVMSubmitAction; import org.alfresco.repo.avm.util.BulkLoader; import org.alfresco.repo.domain.PropertyValue; @@ -61,6 +60,34 @@ import org.alfresco.service.transaction.TransactionService; */ public class AVMServiceTest extends AVMServiceTestBase { + /** + * Test a noodle update. + */ + public void testNoodleUpdate() + { + try + { + setupBasicTree(); + fService.createAVMStore("staging"); + List diffs = fSyncService.compare(-1, "main:/", -1, "staging:/"); + assertEquals(2, diffs.size()); + List noodle = new ArrayList(); + noodle.add(new AVMDifference(-1, "main:/a/b/c/foo", -1, "staging:/a/b/c/foo", + AVMDifference.NEWER)); + noodle.add(new AVMDifference(-1, "main:/d", -1, "staging:/d", + AVMDifference.NEWER)); + fSyncService.update(noodle, false, false, false, false); + diffs = fSyncService.compare(-1, "main:/", -1, "staging:/"); + assertEquals(1, diffs.size()); + assertEquals("main:/a/b/c/bar", diffs.get(0).getSourcePath()); + } + catch (Exception e) + { + e.printStackTrace(System.err); + fail(); + } + } + /** * Test the SimpleAVMSubmitAction. */ diff --git a/source/java/org/alfresco/repo/avm/AVMSyncServiceImpl.java b/source/java/org/alfresco/repo/avm/AVMSyncServiceImpl.java index ec81e10aa7..64c1d85964 100644 --- a/source/java/org/alfresco/repo/avm/AVMSyncServiceImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMSyncServiceImpl.java @@ -401,6 +401,7 @@ public class AVMSyncServiceImpl implements AVMSyncService */ private void linkIn(String parentPath, String name, AVMNodeDescriptor toLink, boolean removeFirst) { + mkdirs(parentPath); if (removeFirst) { fAVMService.removeNode(parentPath, name); @@ -674,4 +675,25 @@ public class AVMSyncServiceImpl implements AVMSyncService fAVMService.removeNode(parts[0], parts[1]); fAVMService.createLayeredDirectory(desc.getIndirection(), parts[0], parts[1]); } + + /** + * Make sure this entire directory path exists. + * @param path + */ + private void mkdirs(String path) + { + if (fAVMService.lookup(-1, path) != null) + { + return; + } + String [] pathParts = AVMNodeConverter.SplitBase(path); + if (pathParts[0] == null) + { + // This is a root path and as such has to exist. + // Something else is going on. + throw new AVMSyncException("No corresponding destination path: " + path); + } + mkdirs(pathParts[0]); + fAVMService.createDirectory(pathParts[0], pathParts[1]); + } }