From 4f715ac9bc195eff7326e2b7e4dd32cde41d7a3f Mon Sep 17 00:00:00 2001 From: Britt Park Date: Sat, 23 Sep 2006 17:40:54 +0000 Subject: [PATCH] Reworks AVMService.getIndirection() to return the indirection path for a plain node in a layered context. Modified AVMHostConfig to use this method. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@3903 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../org/alfresco/repo/avm/AVMServiceTest.java | 24 +++++++++++++++++++ .../org/alfresco/repo/avm/AVMStoreImpl.java | 14 +++++++---- source/java/org/alfresco/repo/avm/Lookup.java | 8 +++++++ .../alfresco/service/cmr/avm/AVMService.java | 4 ++-- 4 files changed, 44 insertions(+), 6 deletions(-) diff --git a/source/java/org/alfresco/repo/avm/AVMServiceTest.java b/source/java/org/alfresco/repo/avm/AVMServiceTest.java index 3075347832..e796361184 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceTest.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceTest.java @@ -63,6 +63,30 @@ import org.alfresco.util.GUID; */ public class AVMServiceTest extends AVMServiceTestBase { + /** + * Test getIndirection. + */ + public void testGetIndirection() + { + try + { + setupBasicTree(); + fService.createAVMStore("layer"); + fService.createLayeredDirectory("main:/a", "layer:/", "layer"); + assertEquals("main:/a", fService.getIndirectionPath(-1, "layer:/layer")); + assertEquals("main:/a/b", fService.getIndirectionPath(-1, "layer:/layer/b")); + assertEquals("main:/a/b/c", fService.getIndirectionPath(-1, "layer:/layer/b/c")); + assertEquals("main:/a/b/c/foo", fService.getIndirectionPath(-1, "layer:/layer/b/c/foo")); + fService.createLayeredDirectory("main:/d", "layer:/layer/b", "dlayer"); + assertEquals("main:/d", fService.getIndirectionPath(-1, "layer:/layer/b/dlayer")); + } + catch (Exception e) + { + e.printStackTrace(System.err); + fail(); + } + } + /** * Test the promote action. */ diff --git a/source/java/org/alfresco/repo/avm/AVMStoreImpl.java b/source/java/org/alfresco/repo/avm/AVMStoreImpl.java index 375d8c0cdb..6476861c89 100644 --- a/source/java/org/alfresco/repo/avm/AVMStoreImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMStoreImpl.java @@ -692,16 +692,22 @@ public class AVMStoreImpl implements AVMStore, Serializable { throw new AVMNotFoundException("Path not found."); } + if (!lPath.isLayered()) + { + return null; + } AVMNode node = lPath.getCurrentNode(); if (node.getType() == AVMNodeType.LAYERED_DIRECTORY) { - return ((LayeredDirectoryNode)node).getUnderlying(lPath); + LayeredDirectoryNode dir = (LayeredDirectoryNode)node; + return dir.getUnderlying(lPath); } - if (node.getType() == AVMNodeType.LAYERED_FILE) + else if (node.getType() == AVMNodeType.LAYERED_FILE) { - return ((LayeredFileNode)node).getUnderlying(lPath); + LayeredFileNode file = (LayeredFileNode)node; + return file.getUnderlying(lPath); } - throw new AVMWrongTypeException("Not a layered node: " + path); + return lPath.getIndirectionPath(); } /** diff --git a/source/java/org/alfresco/repo/avm/Lookup.java b/source/java/org/alfresco/repo/avm/Lookup.java index 4b8891a4f8..5321dc697d 100644 --- a/source/java/org/alfresco/repo/avm/Lookup.java +++ b/source/java/org/alfresco/repo/avm/Lookup.java @@ -104,6 +104,7 @@ class Lookup fFinalStore = store; } + // TODO This is badly in need of cleanup. /** * Add a new node to the lookup. * @param node The node to add. @@ -135,6 +136,13 @@ class Lookup comp.setIndirection(computeIndirection(name)); } fLayeredYet = true; + // Record the first layer seen. + if (fTopLayer == null) + { + fTopLayer = oNode; + fTopLayerIndex = fPosition + 1; + } + fLowestLayerIndex = fPosition + 1; } fComponents.add(comp); fPosition++; diff --git a/source/java/org/alfresco/service/cmr/avm/AVMService.java b/source/java/org/alfresco/service/cmr/avm/AVMService.java index 5ac0fed4c2..dc55f0a879 100644 --- a/source/java/org/alfresco/service/cmr/avm/AVMService.java +++ b/source/java/org/alfresco/service/cmr/avm/AVMService.java @@ -408,10 +408,10 @@ public interface AVMService public AVMNodeDescriptor lookup(AVMNodeDescriptor dir, String name, boolean includeDeleted); /** - * Get the indirection path for a layered file or directory. + * Get the indirection path for a node in a layered context. * @param version The version number to get. * @param path The path to the node of interest. - * @return The indirection path. + * @return The indirection path, or null if the path is not in a layered context. * @throws AVMNotFoundException If path does not exist or * if version does not exist. * @throws AVMWrongTypeException If path contains a non-terminal