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