From 76bd8a310d9d28a513dbe409fca8230c8a06fac7 Mon Sep 17 00:00:00 2001 From: Britt Park Date: Sun, 24 Sep 2006 22:43:54 +0000 Subject: [PATCH] A fix for some incorrect behaviors in AVMSyncService.flatten() brought on by some incorrect cacheing and the lack of some necessary flushes. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@3910 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../org/alfresco/repo/avm/AVMRepository.java | 23 +++++++++----- .../org/alfresco/repo/avm/AVMServiceTest.java | 31 +++++++++++++++++++ .../alfresco/repo/avm/AVMSyncServiceImpl.java | 17 +++++----- .../avm/actions/SimpleAVMSubmitAction.java | 7 ++--- .../alfresco/repo/avm/hibernate/AVM.hbm.xml | 2 +- .../AVMNodePropertyDAOHibernate.java | 4 --- .../avm/hibernate/ChildEntryDAOHibernate.java | 5 --- 7 files changed, 57 insertions(+), 32 deletions(-) diff --git a/source/java/org/alfresco/repo/avm/AVMRepository.java b/source/java/org/alfresco/repo/avm/AVMRepository.java index 6d6e25ae52..5d22bc6370 100644 --- a/source/java/org/alfresco/repo/avm/AVMRepository.java +++ b/source/java/org/alfresco/repo/avm/AVMRepository.java @@ -1558,22 +1558,31 @@ public class AVMRepository /** * Remove name without leaving behind a deleted node. Dangerous * if used unwisely. - * @param lDir The layered directory node. + * @param path The path to the layered directory. * @param name The name of the child. */ - public void flatten(AVMNodeDescriptor lDir, String name) + public void flatten(String path, String name) { - AVMNode node = AVMContext.fgInstance.fAVMNodeDAO.getByID(lDir.getId()); + fLookupCount.set(1); + String [] pathParts = SplitPath(path); + AVMStore store = getAVMStoreByName(pathParts[0]); + if (store == null) + { + throw new AVMNotFoundException("Store not found."); + } + Lookup lPath = store.lookup(-1, pathParts[1], true, false); + AVMNode node = lPath.getCurrentNode(); + if (node == null) + { + throw new AVMNotFoundException("Path not found."); + } if (!(node instanceof LayeredDirectoryNode)) { throw new AVMWrongTypeException("Not a Layered Directory."); } LayeredDirectoryNode dir = (LayeredDirectoryNode)node; - if (!dir.getIsNew()) - { - throw new AVMException("Directory has not already been copied."); - } dir.flatten(name); + AVMContext.fgInstance.fAVMNodeDAO.flush(); } /** diff --git a/source/java/org/alfresco/repo/avm/AVMServiceTest.java b/source/java/org/alfresco/repo/avm/AVMServiceTest.java index 3f211a5439..1bedfb4431 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceTest.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceTest.java @@ -63,6 +63,37 @@ import org.alfresco.util.GUID; */ public class AVMServiceTest extends AVMServiceTestBase { + /** + * Test partial flatten. + */ + public void testPartialFlatten() + { + try + { + setupBasicTree(); + fService.createAVMStore("layer"); + fService.createLayeredDirectory("main:/a", "layer:/", "a"); + fService.getFileOutputStream("layer:/a/b/c/foo").close(); + fService.createFile("layer:/a/b", "bing").close(); + List diffs = new ArrayList(); + diffs.add(new AVMDifference(-1, "layer:/a/b/c/foo", + -1, "main:/a/b/c/foo", + AVMDifference.NEWER)); + fSyncService.update(diffs, false, false, false, false); + fSyncService.flatten("layer:/a", "main:/a"); + AVMNodeDescriptor b = fService.lookup(-1, "layer:/a/b"); + assertTrue(b.isLayeredDirectory()); + AVMNodeDescriptor c = fService.lookup(-1, "layer:/a/b/c"); + assertTrue(c.isPlainDirectory()); + } + catch (Exception e) + { + e.printStackTrace(System.err); + fail(); + } + } + + /** * Test getIndirection. */ diff --git a/source/java/org/alfresco/repo/avm/AVMSyncServiceImpl.java b/source/java/org/alfresco/repo/avm/AVMSyncServiceImpl.java index afe17544ee..16c85ede55 100644 --- a/source/java/org/alfresco/repo/avm/AVMSyncServiceImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMSyncServiceImpl.java @@ -461,12 +461,10 @@ public class AVMSyncServiceImpl implements AVMSyncService // Otherwise make a directory in the target parent, and recursiveCopy all the source // children into it. AVMNodeDescriptor newParentDesc = fAVMRepository.createDirectory(parent, name); - fgLogger.error(newParentDesc); Map children = fAVMService.getDirectoryListing(toCopy, true); for (Map.Entry entry : children.entrySet()) { - fgLogger.error(entry.getKey()); recursiveCopy(newParentDesc, entry.getKey(), entry.getValue()); } } @@ -629,13 +627,13 @@ public class AVMSyncServiceImpl implements AVMSyncService throw new AVMWrongTypeException("Underlying is not a directory: " + underlying); } Map layerListing = - fAVMService.getDirectoryListingDirect(layer, true); + fAVMService.getDirectoryListingDirect(-1, layer.getPath(), true); // If the layer is empty (directly, that is) we're done. if (layerListing.size() == 0) { return true; } - layer = fAVMService.forceCopy(layer.getPath()); +// layer = fAVMService.forceCopy(layer.getPath()); // Grab the listing Map underListing = fAVMService.getDirectoryListing(underlying, true); @@ -644,7 +642,7 @@ public class AVMSyncServiceImpl implements AVMSyncService { AVMNodeDescriptor topNode = layerListing.get(name); AVMNodeDescriptor bottomNode = underListing.get(name); - fgLogger.error("Trying to flatten out: " + name); +// fgLogger.error("Trying to flatten out: " + name); if (bottomNode == null) { flattened = false; @@ -653,16 +651,16 @@ public class AVMSyncServiceImpl implements AVMSyncService // We've found an identity so flatten it. if (topNode.getId() == bottomNode.getId()) { - fAVMRepository.flatten(layer, name); - fgLogger.error("Identity flattened: " + name); + fAVMRepository.flatten(layer.getPath(), name); +// fgLogger.error("Identity flattened: " + name); } else { // Otherwise recursively flatten the children. if (flatten(topNode, bottomNode)) { - fAVMRepository.flatten(layer, name); - fgLogger.error("Recursively flattened: " + name); + fAVMRepository.flatten(layer.getPath(), name); +// fgLogger.error("Recursively flattened: " + name); } else { @@ -710,6 +708,5 @@ public class AVMSyncServiceImpl implements AVMSyncService } mkdirs(pathParts[0]); fAVMService.createDirectory(pathParts[0], pathParts[1]); - fgLogger.error("mkdir " + pathParts[0] + " " + pathParts[1]); } } diff --git a/source/java/org/alfresco/repo/avm/actions/SimpleAVMSubmitAction.java b/source/java/org/alfresco/repo/avm/actions/SimpleAVMSubmitAction.java index 399400670b..e645fcbcee 100644 --- a/source/java/org/alfresco/repo/avm/actions/SimpleAVMSubmitAction.java +++ b/source/java/org/alfresco/repo/avm/actions/SimpleAVMSubmitAction.java @@ -115,14 +115,11 @@ public class SimpleAVMSubmitAction extends ActionExecuterAbstractBase // Get the difference between source and destination. List diffs = fAVMSyncService.compare(version, path, -1, avmDest); - for (AVMDifference diff : diffs) - { - fgLogger.error(diff); - } // Do the update. fAVMSyncService.update(diffs, true, true, false, false); // Cleanup by flattening the source relative to the destination. - //fAVMSyncService.flatten(storePath[0] + ":/appBase", websiteName + "-staging:/appBase"); + AVMContext.fgInstance.fAVMNodeDAO.flush(); + fAVMSyncService.flatten(storePath[0] + ":/appBase", websiteName + "-staging:/appBase"); } /** diff --git a/source/java/org/alfresco/repo/avm/hibernate/AVM.hbm.xml b/source/java/org/alfresco/repo/avm/hibernate/AVM.hbm.xml index 69b0cbb3b5..8c904f648a 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/AVM.hbm.xml +++ b/source/java/org/alfresco/repo/avm/hibernate/AVM.hbm.xml @@ -137,7 +137,7 @@ - + diff --git a/source/java/org/alfresco/repo/avm/hibernate/AVMNodePropertyDAOHibernate.java b/source/java/org/alfresco/repo/avm/hibernate/AVMNodePropertyDAOHibernate.java index 9c5fe6f3c9..585fafde04 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/AVMNodePropertyDAOHibernate.java +++ b/source/java/org/alfresco/repo/avm/hibernate/AVMNodePropertyDAOHibernate.java @@ -29,8 +29,6 @@ class AVMNodePropertyDAOHibernate extends HibernateDaoSupport "from AVMNodePropertyImpl anp where anp.node = :node and anp.name = :name"); query.setEntity("node", node); query.setParameter("name", name); - query.setCacheable(true); - query.setCacheRegion("Property.Lookup"); return (AVMNodeProperty)query.uniqueResult(); } @@ -46,8 +44,6 @@ class AVMNodePropertyDAOHibernate extends HibernateDaoSupport getSession().createQuery( "from AVMNodePropertyImpl anp where anp.node = :node"); query.setEntity("node", node); - query.setCacheable(true); - query.setCacheRegion("Properties.Lookup"); return (List)query.list(); } diff --git a/source/java/org/alfresco/repo/avm/hibernate/ChildEntryDAOHibernate.java b/source/java/org/alfresco/repo/avm/hibernate/ChildEntryDAOHibernate.java index 0b777db167..da53e3ef74 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/ChildEntryDAOHibernate.java +++ b/source/java/org/alfresco/repo/avm/hibernate/ChildEntryDAOHibernate.java @@ -62,7 +62,6 @@ class ChildEntryDAOHibernate extends HibernateDaoSupport implements "from ChildEntryImpl ce where ce.name = :name and ce.parent = :parent"); query.setString("name", name); query.setEntity("parent", parent); - query.setCacheable(true); return (ChildEntry)query.uniqueResult(); } @@ -76,8 +75,6 @@ class ChildEntryDAOHibernate extends HibernateDaoSupport implements { Query query = getSession().getNamedQuery("ChildEntry.ByParent"); query.setEntity("parent", parent); - query.setCacheable(true); - query.setCacheRegion("ChildEntry.ByParent"); return (List)query.list(); } @@ -92,8 +89,6 @@ class ChildEntryDAOHibernate extends HibernateDaoSupport implements Query query = getSession().getNamedQuery("ChildEntry.ByParentChild"); query.setEntity("parent", parent); query.setEntity("child", child); - query.setCacheable(true); - query.setCacheRegion("ChildEntry.ByParentChild"); return (ChildEntry)query.uniqueResult(); }