diff --git a/source/java/org/alfresco/repo/avm/AVMRepository.java b/source/java/org/alfresco/repo/avm/AVMRepository.java index 4357c10459..3e829dc2af 100644 --- a/source/java/org/alfresco/repo/avm/AVMRepository.java +++ b/source/java/org/alfresco/repo/avm/AVMRepository.java @@ -207,7 +207,7 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(srcPath); AVMStore srcRepo = getAVMStoreByName(pathParts[0]); - Lookup sPath = srcRepo.lookup(version, pathParts[1], false); + Lookup sPath = srcRepo.lookup(version, pathParts[1], false, false); // Lookup the destination directory. fLookupCount.set(1); pathParts = SplitPath(dstPath); @@ -276,7 +276,7 @@ public class AVMRepository AVMStore srcRepo = getAVMStoreByName(pathParts[0]); Lookup sPath = srcRepo.lookupDirectory(-1, pathParts[1], true); DirectoryNode srcDir = (DirectoryNode)sPath.getCurrentNode(); - AVMNode srcNode = srcDir.lookupChild(sPath, srcName, -1, true); + AVMNode srcNode = srcDir.lookupChild(sPath, srcName, -1, true, false); if (srcNode == null) { throw new AVMNotFoundException("Not found: " + srcName); @@ -286,7 +286,7 @@ public class AVMRepository AVMStore dstRepo = getAVMStoreByName(pathParts[0]); Lookup dPath = dstRepo.lookupDirectory(-1, pathParts[1], true); DirectoryNode dstDir = (DirectoryNode)dPath.getCurrentNode(); - AVMNode dstNode = dstDir.lookupChild(dPath, dstName, -1, true); + AVMNode dstNode = dstDir.lookupChild(dPath, dstName, -1, true, false); if (dstNode != null) { throw new AVMExistsException("Node exists: " + dstName); @@ -487,14 +487,16 @@ public class AVMRepository * Get a listing of a directory. * @param version The version to look under. * @param path The path to the directory. + * @param includeDeleted Whether to see DeletedNodes. * @return A List of FolderEntries. */ - public SortedMap getListing(int version, String path) + public SortedMap getListing(int version, String path, + boolean includeDeleted) { fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); - return store.getListing(version, pathParts[1]); + return store.getListing(version, pathParts[1], includeDeleted); } /** @@ -503,12 +505,13 @@ public class AVMRepository * @param path The path to the directory to list. * @return A Map of names to descriptors. */ - public SortedMap getListingDirect(int version, String path) + public SortedMap getListingDirect(int version, String path, + boolean includeDeleted) { fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); - return store.getListingDirect(version, pathParts[1]); + return store.getListingDirect(version, pathParts[1], includeDeleted); } /** @@ -516,7 +519,7 @@ public class AVMRepository * @param dir The directory node descriptor. * @return A SortedMap listing. */ - public SortedMap getListing(AVMNodeDescriptor dir) + public SortedMap getListing(AVMNodeDescriptor dir, boolean includeDeleted) { fLookupCount.set(1); AVMNode node = AVMContext.fgInstance.fAVMNodeDAO.getByID(dir.getId()); @@ -526,7 +529,7 @@ public class AVMRepository throw new AVMWrongTypeException("Not a directory."); } DirectoryNode dirNode = (DirectoryNode)node; - return dirNode.getListing(dir); + return dirNode.getListing(dir, includeDeleted); } /** @@ -674,9 +677,10 @@ public class AVMRepository * Lookup a node. * @param version The version to look under. * @param path The path to lookup. + * @param includeDeleted Whether to see DeletedNodes. * @return A lookup object. */ - public Lookup lookup(int version, String path) + public Lookup lookup(int version, String path, boolean includeDeleted) { Integer count = fLookupCount.get(); try @@ -695,7 +699,7 @@ public class AVMRepository } String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); - Lookup result = store.lookup(version, pathParts[1], false); + Lookup result = store.lookup(version, pathParts[1], false, includeDeleted); return result; } finally @@ -713,7 +717,7 @@ public class AVMRepository * @param name The name of the child to lookup. * @return The child's descriptor. */ - public AVMNodeDescriptor lookup(AVMNodeDescriptor dir, String name) + public AVMNodeDescriptor lookup(AVMNodeDescriptor dir, String name, boolean includeDeleted) { fLookupCount.set(0); AVMNode node = AVMContext.fgInstance.fAVMNodeDAO.getByID(dir.getId()); @@ -727,7 +731,7 @@ public class AVMRepository throw new AVMWrongTypeException("Not a directory."); } DirectoryNode dirNode = (DirectoryNode)node; - return dirNode.lookupChild(dir, name); + return dirNode.lookupChild(dir, name, includeDeleted); } /** @@ -741,7 +745,7 @@ public class AVMRepository fLookupCount.set(1); String [] pathParts = SplitPath(path); AVMStore store = getAVMStoreByName(pathParts[0]); - Lookup lookup = store.lookup(version, pathParts[1], false); + Lookup lookup = store.lookup(version, pathParts[1], false, false); return new LayeringDescriptor(!lookup.getDirectlyContained(), lookup.getAVMStore().getDescriptor(), lookup.getFinalStore().getDescriptor()); diff --git a/source/java/org/alfresco/repo/avm/AVMServiceImpl.java b/source/java/org/alfresco/repo/avm/AVMServiceImpl.java index b1aaadc620..812f178b0e 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceImpl.java @@ -107,12 +107,30 @@ public class AVMServiceImpl implements AVMService * @param path The path to lookup. */ public SortedMap getDirectoryListing(int version, String path) + { + return getDirectoryListing(version, path, false); + } + + /** + * Get a listing of a Folder by name, with the option of seeing + * Deleted Nodes. + * @param version The version id to look in. + * @param path The simple absolute path to the file node. + * @param includeDeleted Whether to see Deleted Nodes. + * @return A Map of names to descriptors. + * @throws AVMNotFoundException If path is not found. + * @throws AVMWrongTypeException If path contains a non-terminal + * component that is not a directory, or if path is not pointing + * at a directory. + */ + public SortedMap getDirectoryListing(int version, String path, + boolean includeDeleted) { if (path == null) { throw new AVMBadArgumentException("Null path."); } - return fAVMRepository.getListing(version, path); + return fAVMRepository.getListing(version, path, includeDeleted); } /** @@ -128,26 +146,59 @@ public class AVMServiceImpl implements AVMService */ public SortedMap getDirectoryListingDirect(int version, String path) + { + return getDirectoryListingDirect(version, path, false); + } + + /** + * Get the listing of nodes contained directly in a directory. This is the + * same as getDirectoryListing for PlainDirectories, but returns only those that + * are directly contained in a layered directory. This has the option of + * seeing Deleted Nodes. + * @param version The version to look up. + * @param path The full path to get listing for. + * @param includeDeleted Whether to see Deleted Nodes. + * @return A Map of names to descriptors. + * @throws AVMNotFoundException If path does not exist. + * @throws AVMWrongTypeException If path contains any non-directory + * elements. + */ + public SortedMap + getDirectoryListingDirect(int version, String path, boolean includeDeleted) { if (path == null) { throw new AVMBadArgumentException("Null path."); } - return fAVMRepository.getListingDirect(version, path); + return fAVMRepository.getListingDirect(version, path, includeDeleted); } - /** * Get a directory listing from a node descriptor. * @param dir The directory node descriptor. * @return A Map of names to node descriptors. */ public SortedMap getDirectoryListing(AVMNodeDescriptor dir) + { + return getDirectoryListing(dir, false); + } + + /** + * Get a directory listing from a node descriptor, with the option of + * seeing deleted nodes. + * @param dir The directory node descriptor. + * @param includeDeleted Whether to see Deleted Nodes. + * @return A Map of names to node descriptors. + * @throws AVMNotFoundException If the descriptor is stale. + * @throws AVMWrongTypeException If the descriptor does not point at a directory. + */ + public SortedMap getDirectoryListing(AVMNodeDescriptor dir, + boolean includeDeleted) { if (dir == null) { throw new AVMBadArgumentException("Null descriptor."); } - return fAVMRepository.getListing(dir); + return fAVMRepository.getListing(dir, includeDeleted); } /** @@ -398,12 +449,29 @@ public class AVMServiceImpl implements AVMService * @return A Descriptor. */ public AVMNodeDescriptor lookup(int version, String path) + { + return lookup(version, path, false); + } + + /** + * Lookup a node by version ids and path, with the option of + * seeing Deleted Nodes. + * @param version The version id to look under. + * @param path The simple absolute path to the parent directory. + * @param includeDeleted Whether to see Deleted Nodes. + * @return An AVMNodeDescriptor. + * @throws AVMNotFoundException If path does not exist or + * if version does not exist. + * @throws AVMWrongTypeException If path contains a non-terminal + * element that is not a directory. + */ + public AVMNodeDescriptor lookup(int version, String path, boolean includeDeleted) { if (path == null) { throw new AVMBadArgumentException("Path is null."); } - Lookup lookup = fAVMRepository.lookup(version, path); + Lookup lookup = fAVMRepository.lookup(version, path, includeDeleted); return lookup.getCurrentNode().getDescriptor(lookup); } @@ -414,14 +482,30 @@ public class AVMServiceImpl implements AVMService * @return The node descriptor of the child. */ public AVMNodeDescriptor lookup(AVMNodeDescriptor dir, String name) + { + return lookup(dir, name, false); + } + + /** + * Lookup a node from a directory node, with the option of seeing + * Deleted Nodes. + * @param dir The descriptor for the directory node. + * @param name The name to lookup. + * @param includeDeleted Whether to see Deleted Nodes. + * @return The descriptor for the child. + * @throws AVMNotFoundException If name does not exist or + * if dir is dangling. + * @throws AVMWrongTypeException If dir does not refer to a directory. + */ + public AVMNodeDescriptor lookup(AVMNodeDescriptor dir, String name, boolean includeDeleted) { if (dir == null || name == null) { throw new AVMBadArgumentException("Illegal null argument."); } - return fAVMRepository.lookup(dir, name); + return fAVMRepository.lookup(dir, name, includeDeleted); } - + /** * Purge an AVMStore. Permanently delete everything that * is only referenced in that AVMStore. diff --git a/source/java/org/alfresco/repo/avm/AVMServiceTest.java b/source/java/org/alfresco/repo/avm/AVMServiceTest.java index 393a8a5978..e6c7e40106 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceTest.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceTest.java @@ -2398,4 +2398,57 @@ public class AVMServiceTest extends AVMServiceTestBase fail(); } } + + /** + * Test lookup and listing of deleted files. + */ + public void testDeleted() + { + try + { + setupBasicTree(); + fService.createLayeredDirectory("main:/a", "main:/", "layer"); + // Delete something in regular directory. + fService.removeNode("main:/a/b/c", "foo"); + AVMNodeDescriptor desc = fService.lookup(-1, "main:/a/b/c/foo", true); + assertTrue(desc.isDeleted()); + Map listing = fService.getDirectoryListing(-1, "main:/a/b/c", true); + assertEquals(2, listing.size()); + assertTrue(listing.get("foo").isDeleted()); + AVMNodeDescriptor dir = fService.lookup(-1, "main:/a/b/c", true); + desc = fService.lookup(dir, "foo", true); + assertTrue(desc.isDeleted()); + listing = fService.getDirectoryListing(dir, true); + assertEquals(2, listing.size()); + assertTrue(listing.get("foo").isDeleted()); + desc = fService.lookup(-1, "main:/layer/b/c/foo", true); + assertTrue(desc.isDeleted()); + listing = fService.getDirectoryListing(-1, "main:/layer/b/c", true); + assertEquals(2, listing.size()); + assertTrue(listing.get("foo").isDeleted()); + dir = fService.lookup(-1, "main:/layer/b/c", true); + listing = fService.getDirectoryListing(dir, true); + assertEquals(2, listing.size()); + assertTrue(listing.get("foo").isDeleted()); + // Delete something in a layer. + fService.removeNode("main:/layer/b/c", "bar"); + desc = fService.lookup(-1, "main:/layer/b/c/bar", true); + assertTrue(desc.isDeleted()); + listing = fService.getDirectoryListing(-1, "main:/layer/b/c", true); + assertEquals(2, listing.size()); + assertTrue(listing.get("foo").isDeleted()); + assertTrue(listing.get("bar").isDeleted()); + listing = fService.getDirectoryListingDirect(-1, "main:/layer/b/c", true); + assertEquals(1, listing.size()); + assertTrue(listing.get("bar").isDeleted()); + dir = fService.lookup(-1, "main:/layer/b/c", true); + desc = fService.lookup(dir, "bar", true); + assertTrue(desc.isDeleted()); + } + catch (Exception e) + { + e.printStackTrace(System.err); + fail(); + } + } } diff --git a/source/java/org/alfresco/repo/avm/AVMServiceTestBase.java b/source/java/org/alfresco/repo/avm/AVMServiceTestBase.java index 74510e1228..6aa6c56fc4 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceTestBase.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceTestBase.java @@ -133,14 +133,14 @@ public class AVMServiceTestBase extends TestCase } builder.append(path.substring(path.lastIndexOf('/') + 1)); builder.append(' '); - AVMNodeDescriptor desc = fService.lookup(version, path); + AVMNodeDescriptor desc = fService.lookup(version, path, true); builder.append(desc.toString()); builder.append('\n'); if (desc.getType() == AVMNodeType.PLAIN_DIRECTORY || (desc.getType() == AVMNodeType.LAYERED_DIRECTORY && followLinks)) { String basename = path.endsWith("/") ? path : path + "/"; - Map listing = fService.getDirectoryListing(version, path); + Map listing = fService.getDirectoryListing(version, path, true); for (String name : listing.keySet()) { builder.append(recursiveList(basename + name, version, indent + 2, followLinks)); diff --git a/source/java/org/alfresco/repo/avm/AVMStore.java b/source/java/org/alfresco/repo/avm/AVMStore.java index 82804ff995..e4aa705072 100644 --- a/source/java/org/alfresco/repo/avm/AVMStore.java +++ b/source/java/org/alfresco/repo/avm/AVMStore.java @@ -111,17 +111,21 @@ public interface AVMStore * Get a listing of the designated directory. * @param version The version to look under. * @param path The path to the directory. + * @param includeDeleted Whether to see Deleted nodes. * @return A listing. */ - public SortedMap getListing(int version, String path); + public SortedMap getListing(int version, String path, + boolean includeDeleted); /** * Get the list of nodes directly contained in a directory. * @param version The version to look under. * @param path The path to the directory. + * @param includeDeleted Whether to see Deleted nodes. * @return A Map of names to descriptors. */ - public SortedMap getListingDirect(int version, String path); + public SortedMap getListingDirect(int version, String path, + boolean includeDeleted); /** * Get the names of the deleted nodes in a directory. @@ -182,9 +186,10 @@ public interface AVMStore * @param version The version to look under. * @param path The path to the node. * @param write Whether this is in a write context. + * @param includeDeleted Whether to see Deleted nodes. * @return A Lookup object. */ - public Lookup lookup(int version, String path, boolean write); + public Lookup lookup(int version, String path, boolean write, boolean includeDeleted); /** * Lookup a directory. diff --git a/source/java/org/alfresco/repo/avm/AVMStoreImpl.java b/source/java/org/alfresco/repo/avm/AVMStoreImpl.java index 3ba980b97b..b52c4baf1f 100644 --- a/source/java/org/alfresco/repo/avm/AVMStoreImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMStoreImpl.java @@ -170,7 +170,7 @@ public class AVMStoreImpl implements AVMStore, Serializable { Lookup lPath = lookupDirectory(-1, path, true); DirectoryNode dir = (DirectoryNode)lPath.getCurrentNode(); - if (dir.lookupChild(lPath, name, -1, true) != null) + if (dir.lookupChild(lPath, name, -1, true, false) != null) { throw new AVMExistsException("Child exists: " + name); } @@ -203,7 +203,7 @@ public class AVMStoreImpl implements AVMStore, Serializable { Lookup lPath = lookupDirectory(-1, dstPath, true); DirectoryNode dir = (DirectoryNode)lPath.getCurrentNode(); - if (dir.lookupChild(lPath, name, -1, true) != null) + if (dir.lookupChild(lPath, name, -1, true, false) != null) { throw new AVMExistsException("Child exists: " + name); } @@ -237,7 +237,7 @@ public class AVMStoreImpl implements AVMStore, Serializable { Lookup lPath = lookupDirectory(-1, path, true); DirectoryNode dir = (DirectoryNode)lPath.getCurrentNode(); - if (dir.lookupChild(lPath, name, -1, true) != null) + if (dir.lookupChild(lPath, name, -1, true, false) != null) { throw new AVMExistsException("Child exists: " + name); } @@ -263,7 +263,7 @@ public class AVMStoreImpl implements AVMStore, Serializable { Lookup lPath = lookupDirectory(-1, path, true); DirectoryNode dir = (DirectoryNode)lPath.getCurrentNode(); - if (dir.lookupChild(lPath, name, -1, true) != null) + if (dir.lookupChild(lPath, name, -1, true, false) != null) { throw new AVMExistsException("Child exists: " + name); } @@ -289,7 +289,7 @@ public class AVMStoreImpl implements AVMStore, Serializable { Lookup lPath = lookupDirectory(-1, dstPath, true); DirectoryNode dir = (DirectoryNode)lPath.getCurrentNode(); - if (dir.lookupChild(lPath, name, -1, true) != null) + if (dir.lookupChild(lPath, name, -1, true, false) != null) { throw new AVMExistsException("Child exists: " + name); } @@ -350,11 +350,12 @@ public class AVMStoreImpl implements AVMStore, Serializable * @param path The path to the directory. * @return A List of FolderEntries. */ - public SortedMap getListing(int version, String path) + public SortedMap getListing(int version, String path, + boolean includeDeleted) { Lookup lPath = lookupDirectory(version, path, false); DirectoryNode dir = (DirectoryNode)lPath.getCurrentNode(); - Map listing = dir.getListing(lPath); + Map listing = dir.getListing(lPath, includeDeleted); return translateListing(listing, lPath); } @@ -364,7 +365,8 @@ public class AVMStoreImpl implements AVMStore, Serializable * @param path The path to the directory. * @return A Map of names to descriptors. */ - public SortedMap getListingDirect(int version, String path) + public SortedMap getListingDirect(int version, String path, + boolean includeDeleted) { Lookup lPath = lookupDirectory(version, path, false); DirectoryNode dir = (DirectoryNode)lPath.getCurrentNode(); @@ -372,7 +374,7 @@ public class AVMStoreImpl implements AVMStore, Serializable { return new TreeMap(); } - Map listing = dir.getListingDirect(lPath); + Map listing = dir.getListingDirect(lPath, includeDeleted); return translateListing(listing, lPath); } @@ -442,7 +444,7 @@ public class AVMStoreImpl implements AVMStore, Serializable { Lookup lPath = lookupDirectory(-1, path, true); DirectoryNode dir = (DirectoryNode)lPath.getCurrentNode(); - if (dir.lookupChild(lPath, name, -1, true) == null) + if (dir.lookupChild(lPath, name, -1, true, false) == null) { throw new AVMNotFoundException("Does not exist: " + name); } @@ -457,7 +459,7 @@ public class AVMStoreImpl implements AVMStore, Serializable */ public void uncover(String dirPath, String name) { - Lookup lPath = lookup(-1, dirPath, true); + Lookup lPath = lookup(-1, dirPath, true, false); AVMNode node = lPath.getCurrentNode(); if (node.getType() != AVMNodeType.LAYERED_DIRECTORY) { @@ -532,7 +534,7 @@ public class AVMStoreImpl implements AVMStore, Serializable * @param write Whether this is in the context of a write. * @return A Lookup object. */ - public Lookup lookup(int version, String path, boolean write) + public Lookup lookup(int version, String path, boolean write, boolean includeDeleted) { // Make up a Lookup to hold the results. Lookup result = new Lookup(this, fName); @@ -571,7 +573,7 @@ public class AVMStoreImpl implements AVMStore, Serializable // before the end. for (int i = 0; i < pathElements.length - 1; i++) { - AVMNode child = dir.lookupChild(result, pathElements[i], version, write); + AVMNode child = dir.lookupChild(result, pathElements[i], version, write, includeDeleted); if (child == null) { throw new AVMNotFoundException("Not found: " + pathElements[i]); @@ -586,7 +588,8 @@ public class AVMStoreImpl implements AVMStore, Serializable dir = (DirectoryNode)result.getCurrentNode(); } // Now look up the last element. - AVMNode child = dir.lookupChild(result, pathElements[pathElements.length - 1], version, write); + AVMNode child = dir.lookupChild(result, pathElements[pathElements.length - 1], version, write, + includeDeleted); if (child == null) { throw new AVMNotFoundException("Not found: " + pathElements[pathElements.length - 1]); @@ -625,7 +628,7 @@ public class AVMStoreImpl implements AVMStore, Serializable { // Just do a regular lookup and assert that the last element // is a directory. - Lookup lPath = lookup(version, path, write); + Lookup lPath = lookup(version, path, write, false); if (lPath.getCurrentNode().getType() != AVMNodeType.PLAIN_DIRECTORY && lPath.getCurrentNode().getType() != AVMNodeType.LAYERED_DIRECTORY) { @@ -642,7 +645,7 @@ public class AVMStoreImpl implements AVMStore, Serializable */ public String getIndirectionPath(int version, String path) { - Lookup lPath = lookup(version, path, false); + Lookup lPath = lookup(version, path, false, false); AVMNode node = lPath.getCurrentNode(); if (node.getType() == AVMNodeType.LAYERED_DIRECTORY) { @@ -840,7 +843,7 @@ public class AVMStoreImpl implements AVMStore, Serializable */ public void setOpacity(String path, boolean opacity) { - Lookup lPath = lookup(-1, path, true); + Lookup lPath = lookup(-1, path, true, false); AVMNode node = lPath.getCurrentNode(); if (!(node instanceof LayeredDirectoryNode)) { @@ -850,6 +853,7 @@ public class AVMStoreImpl implements AVMStore, Serializable node.updateModTime(); } + // TODO Does it make sense to set properties on DeletedNodes? /** * Set a property on a node. * @param path The path to the node. @@ -858,7 +862,7 @@ public class AVMStoreImpl implements AVMStore, Serializable */ public void setNodeProperty(String path, QName name, PropertyValue value) { - Lookup lPath = lookup(-1, path, true); + Lookup lPath = lookup(-1, path, true, false); AVMNode node = lPath.getCurrentNode(); node.setProperty(name, value); } @@ -870,7 +874,7 @@ public class AVMStoreImpl implements AVMStore, Serializable */ public void setNodeProperties(String path, Map properties) { - Lookup lPath = lookup(-1, path, true); + Lookup lPath = lookup(-1, path, true, false); AVMNode node = lPath.getCurrentNode(); node.setProperties(properties); } @@ -884,7 +888,7 @@ public class AVMStoreImpl implements AVMStore, Serializable */ public PropertyValue getNodeProperty(int version, String path, QName name) { - Lookup lPath = lookup(version, path, false); + Lookup lPath = lookup(version, path, false, false); AVMNode node = lPath.getCurrentNode(); return node.getProperty(name); } @@ -897,7 +901,7 @@ public class AVMStoreImpl implements AVMStore, Serializable */ public Map getNodeProperties(int version, String path) { - Lookup lPath = lookup(version, path, false); + Lookup lPath = lookup(version, path, false, false); AVMNode node = lPath.getCurrentNode(); return node.getProperties(); } @@ -909,7 +913,7 @@ public class AVMStoreImpl implements AVMStore, Serializable */ public void deleteNodeProperty(String path, QName name) { - Lookup lPath = lookup(-1, path, true); + Lookup lPath = lookup(-1, path, true, false); AVMNode node = lPath.getCurrentNode(); node.deleteProperty(name); } @@ -920,7 +924,7 @@ public class AVMStoreImpl implements AVMStore, Serializable */ public void deleteNodeProperties(String path) { - Lookup lPath = lookup(-1, path, true); + Lookup lPath = lookup(-1, path, true, false); AVMNode node = lPath.getCurrentNode(); node.deleteProperties(); } @@ -994,7 +998,7 @@ public class AVMStoreImpl implements AVMStore, Serializable */ public ContentData getContentDataForRead(int version, String path) { - Lookup lPath = lookup(version, path, false); + Lookup lPath = lookup(version, path, false, false); AVMNode node = lPath.getCurrentNode(); if (!(node instanceof FileNode)) { @@ -1010,7 +1014,7 @@ public class AVMStoreImpl implements AVMStore, Serializable */ public ContentData getContentDataForWrite(String path) { - Lookup lPath = lookup(-1, path, true); + Lookup lPath = lookup(-1, path, true, false); AVMNode node = lPath.getCurrentNode(); if (!(node instanceof FileNode)) { @@ -1026,7 +1030,7 @@ public class AVMStoreImpl implements AVMStore, Serializable */ public void setContentData(String path, ContentData data) { - Lookup lPath = lookup(-1, path, true); + Lookup lPath = lookup(-1, path, true, false); AVMNode node = lPath.getCurrentNode(); if (!(node instanceof FileNode)) { @@ -1042,7 +1046,7 @@ public class AVMStoreImpl implements AVMStore, Serializable */ public void addAspect(String path, QName aspectName) { - Lookup lPath = lookup(-1, path, true); + Lookup lPath = lookup(-1, path, true, false); AVMNode node = lPath.getCurrentNode(); if (AVMContext.fgInstance.fAVMAspectNameDAO.exists(node, aspectName)) { @@ -1063,7 +1067,7 @@ public class AVMStoreImpl implements AVMStore, Serializable */ public List getAspects(int version, String path) { - Lookup lPath = lookup(version, path, false); + Lookup lPath = lookup(version, path, false, false); AVMNode node = lPath.getCurrentNode(); List names = AVMContext.fgInstance.fAVMAspectNameDAO.get(node); @@ -1082,7 +1086,7 @@ public class AVMStoreImpl implements AVMStore, Serializable */ public void removeAspect(String path, QName aspectName) { - Lookup lPath = lookup(-1, path, true); + Lookup lPath = lookup(-1, path, true, false); AVMNode node = lPath.getCurrentNode(); AVMContext.fgInstance.fAVMAspectNameDAO.delete(node, aspectName); AspectDefinition def = AVMContext.fgInstance.getDictionaryService().getAspect(aspectName); @@ -1103,7 +1107,7 @@ public class AVMStoreImpl implements AVMStore, Serializable */ public boolean hasAspect(int version, String path, QName aspectName) { - Lookup lPath = lookup(version, path, false); + Lookup lPath = lookup(version, path, false, false); AVMNode node = lPath.getCurrentNode(); return AVMContext.fgInstance.fAVMAspectNameDAO.exists(node, aspectName); } @@ -1115,7 +1119,7 @@ public class AVMStoreImpl implements AVMStore, Serializable */ public void setACL(String path, DbAccessControlList acl) { - Lookup lPath = lookup(-1, path, true); + Lookup lPath = lookup(-1, path, true, false); AVMNode node = lPath.getCurrentNode(); node.setAcl(acl); } @@ -1128,7 +1132,7 @@ public class AVMStoreImpl implements AVMStore, Serializable */ public DbAccessControlList getACL(int version, String path) { - Lookup lPath = lookup(version, path, false); + Lookup lPath = lookup(version, path, false, false); return lPath.getCurrentNode().getAcl(); } } diff --git a/source/java/org/alfresco/repo/avm/DirectoryNode.java b/source/java/org/alfresco/repo/avm/DirectoryNode.java index e7419d37a1..f95c57395e 100644 --- a/source/java/org/alfresco/repo/avm/DirectoryNode.java +++ b/source/java/org/alfresco/repo/avm/DirectoryNode.java @@ -49,7 +49,8 @@ public interface DirectoryNode extends AVMNode * @param version The version to look under. * @param write Whether this is occuring in a write context. */ - public AVMNode lookupChild(Lookup lPath, String name, int version, boolean write); + public AVMNode lookupChild(Lookup lPath, String name, int version, boolean write, + boolean includeDeleted); /** * Lookup a child node using an AVMNodeDescriptor as context. @@ -57,7 +58,7 @@ public interface DirectoryNode extends AVMNode * @param name The name of the child to lookup. * @return The descriptor for the looked up child. */ - public AVMNodeDescriptor lookupChild(AVMNodeDescriptor mine, String name); + public AVMNodeDescriptor lookupChild(AVMNodeDescriptor mine, String name, boolean includeDeleted); /** * Remove a child directly. No copy is possible. @@ -71,21 +72,22 @@ public interface DirectoryNode extends AVMNode * @param lPath The lookup context. * @return A SortedMap of names to DirectoryEntries. */ - public Map getListing(Lookup lPath); + public Map getListing(Lookup lPath, boolean includeDeleted); /** * Get a listing of the nodes directly contained by a directory. * @param lPath The Lookup to this directory. * @return A Map of names to nodes. */ - public Map getListingDirect(Lookup lPath); + public Map getListingDirect(Lookup lPath, boolean includeDeleted); /** * Get a listing from a directory specified by an AVMNodeDescriptor. * @param dir The directory to list. * @return A Map of names to node descriptors */ - public SortedMap getListing(AVMNodeDescriptor dir); + public SortedMap getListing(AVMNodeDescriptor dir, + boolean includeDeleted); /** * Get the names of nodes deleted in this directory. diff --git a/source/java/org/alfresco/repo/avm/LayeredDirectoryNodeImpl.java b/source/java/org/alfresco/repo/avm/LayeredDirectoryNodeImpl.java index bc87b0a870..22e8a59490 100644 --- a/source/java/org/alfresco/repo/avm/LayeredDirectoryNodeImpl.java +++ b/source/java/org/alfresco/repo/avm/LayeredDirectoryNodeImpl.java @@ -304,7 +304,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec * @return A Map from names to nodes. This is a sorted Map. */ @SuppressWarnings("unchecked") - public Map getListing(Lookup lPath) + public Map getListing(Lookup lPath, boolean includeDeleted) { // Get the base listing from the thing we indirect to. Map listing = null; @@ -318,7 +318,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec { Lookup lookup = AVMRepository.GetInstance().lookupDirectory(-1, getUnderlying(lPath)); DirectoryNode dir = (DirectoryNode)lookup.getCurrentNode(); - listing = dir.getListing(lookup); + listing = dir.getListing(lookup, includeDeleted); } catch (AVMException re) { @@ -332,7 +332,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec } for (ChildEntry entry : AVMContext.fgInstance.fChildEntryDAO.getByParent(this)) { - if (entry.getChild().getType() == AVMNodeType.DELETED_NODE) + if (!includeDeleted && entry.getChild().getType() == AVMNodeType.DELETED_NODE) { listing.remove(entry.getName()); } @@ -349,12 +349,12 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec * @param lPath The Lookup to this directory. * @return A Map of names to nodes. */ - public Map getListingDirect(Lookup lPath) + public Map getListingDirect(Lookup lPath, boolean includeDeleted) { Map listing = new HashMap(); for (ChildEntry entry : AVMContext.fgInstance.fChildEntryDAO.getByParent(this)) { - if (entry.getChild().getType() != AVMNodeType.DELETED_NODE) + if (includeDeleted || entry.getChild().getType() != AVMNodeType.DELETED_NODE) { listing.put(entry.getName(), entry.getChild()); } @@ -365,9 +365,11 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec /** * Get a listing from a directory node descriptor. * @param dir The directory node descriptor. + * @param includeDeleted Should DeletedNodes be shown. * @return A Map of names to node descriptors. */ - public SortedMap getListing(AVMNodeDescriptor dir) + public SortedMap getListing(AVMNodeDescriptor dir, + boolean includeDeleted) { if (dir.getPath() == null || dir.getIndirection() == null) { @@ -381,7 +383,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec { Lookup lookup = AVMRepository.GetInstance().lookupDirectory(-1, dir.getIndirection()); DirectoryNode dirNode = (DirectoryNode)lookup.getCurrentNode(); - Map listing = dirNode.getListing(lookup); + Map listing = dirNode.getListing(lookup, includeDeleted); for (String name : listing.keySet()) { baseListing.put(name, @@ -400,7 +402,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec List children = AVMContext.fgInstance.fChildEntryDAO.getByParent(this); for (ChildEntry child : children) { - if (child.getChild().getType() == AVMNodeType.DELETED_NODE) + if (!includeDeleted && child.getChild().getType() == AVMNodeType.DELETED_NODE) { baseListing.remove(child.getName()); } @@ -442,12 +444,13 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec * @return The child or null if not found. */ @SuppressWarnings("unchecked") - public AVMNode lookupChild(Lookup lPath, String name, int version, boolean write) + public AVMNode lookupChild(Lookup lPath, String name, int version, boolean write, + boolean includeDeleted) { ChildEntry entry = AVMContext.fgInstance.fChildEntryDAO.getByNameParent(name, this); if (entry != null) { - if (entry.getChild().getType() == AVMNodeType.DELETED_NODE) + if (!includeDeleted && entry.getChild().getType() == AVMNodeType.DELETED_NODE) { return null; } @@ -463,7 +466,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec { Lookup lookup = AVMRepository.GetInstance().lookupDirectory(-1, getUnderlying(lPath)); DirectoryNode dir = (DirectoryNode)lookup.getCurrentNode(); - AVMNode retVal = dir.lookupChild(lookup, name, -1, false); + AVMNode retVal = dir.lookupChild(lookup, name, -1, false, includeDeleted); lPath.setFinalStore(lookup.getFinalStore()); return retVal; } @@ -483,7 +486,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec * @param name The name to lookup, * @return The node descriptor. */ - public AVMNodeDescriptor lookupChild(AVMNodeDescriptor mine, String name) + public AVMNodeDescriptor lookupChild(AVMNodeDescriptor mine, String name, boolean includeDeleted) { if (mine.getPath() == null || mine.getIndirection() == null) { @@ -492,7 +495,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec ChildEntry entry = AVMContext.fgInstance.fChildEntryDAO.getByNameParent(name, this); if (entry != null) { - if (entry.getChild().getType() == AVMNodeType.DELETED_NODE) + if (!includeDeleted && entry.getChild().getType() == AVMNodeType.DELETED_NODE) { return null; } @@ -509,7 +512,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec { Lookup lookup = AVMRepository.GetInstance().lookupDirectory(-1, mine.getIndirection()); DirectoryNode dir = (DirectoryNode)lookup.getCurrentNode(); - AVMNode child = dir.lookupChild(lookup, name, -1, false); + AVMNode child = dir.lookupChild(lookup, name, -1, false, includeDeleted); if (child == null) { return null; @@ -547,7 +550,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec } else { - child = lookupChild(lPath, name, -1, false); + child = lookupChild(lPath, name, -1, false, false); } AVMNode ghost = new DeletedNodeImpl(lPath.getAVMStore().getAVMRepository().issueID(), lPath.getAVMStore()); diff --git a/source/java/org/alfresco/repo/avm/LayeredFileNodeImpl.java b/source/java/org/alfresco/repo/avm/LayeredFileNodeImpl.java index db3da7b683..adcd459af0 100644 --- a/source/java/org/alfresco/repo/avm/LayeredFileNodeImpl.java +++ b/source/java/org/alfresco/repo/avm/LayeredFileNodeImpl.java @@ -78,7 +78,7 @@ class LayeredFileNodeImpl extends FileNodeImpl implements LayeredFileNode public AVMNode copy(Lookup lPath) { // LayeredFileNodes are always copied. - Lookup lookup = AVMRepository.GetInstance().lookup(-1, fIndirection); + Lookup lookup = AVMRepository.GetInstance().lookup(-1, fIndirection, false); AVMNode indirect = lookup.getCurrentNode(); if (indirect.getType() != AVMNodeType.LAYERED_FILE && indirect.getType() != AVMNodeType.PLAIN_FILE) @@ -249,7 +249,7 @@ class LayeredFileNodeImpl extends FileNodeImpl implements LayeredFileNode */ public ContentData getContentData(Lookup lPath) { - Lookup lookup = lPath.getAVMStore().getAVMRepository().lookup(-1, getIndirection()); + Lookup lookup = lPath.getAVMStore().getAVMRepository().lookup(-1, getIndirection(), false); AVMNode node = lookup.getCurrentNode(); if (!(node instanceof FileNode)) { diff --git a/source/java/org/alfresco/repo/avm/PlainDirectoryNodeImpl.java b/source/java/org/alfresco/repo/avm/PlainDirectoryNodeImpl.java index d255969eb0..4b2c0a3efa 100644 --- a/source/java/org/alfresco/repo/avm/PlainDirectoryNodeImpl.java +++ b/source/java/org/alfresco/repo/avm/PlainDirectoryNodeImpl.java @@ -93,13 +93,13 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory * @return The listing. */ @SuppressWarnings("unchecked") - public Map getListing(Lookup lPath) + public Map getListing(Lookup lPath, boolean includeDeleted) { Map result = new HashMap(); List children = AVMContext.fgInstance.fChildEntryDAO.getByParent(this); for (ChildEntry child : children) { - if (child.getChild().getType() == AVMNodeType.DELETED_NODE) + if (!includeDeleted && child.getChild().getType() == AVMNodeType.DELETED_NODE) { continue; } @@ -113,9 +113,9 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory * @param lPath The Lookup to this directory. * @return A Map of names to nodes. */ - public Map getListingDirect(Lookup lPath) + public Map getListingDirect(Lookup lPath, boolean includeDeleted) { - return getListing(lPath); + return getListing(lPath, includeDeleted); } /** @@ -123,7 +123,7 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory * @param dir The directory node descriptor. * @return A Map of names to node descriptors. */ - public SortedMap getListing(AVMNodeDescriptor dir) + public SortedMap getListing(AVMNodeDescriptor dir, boolean includeDeleted) { if (dir.getPath() == null) { @@ -133,7 +133,7 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory List children = AVMContext.fgInstance.fChildEntryDAO.getByParent(this); for (ChildEntry child : children) { - if (child.getChild().getType() == AVMNodeType.DELETED_NODE) + if (!includeDeleted && child.getChild().getType() == AVMNodeType.DELETED_NODE) { continue; } @@ -161,10 +161,12 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory * @return The child or null. */ @SuppressWarnings("unchecked") - public AVMNode lookupChild(Lookup lPath, String name, int version, boolean write) + public AVMNode lookupChild(Lookup lPath, String name, int version, boolean write, + boolean includeDeleted) { ChildEntry entry = AVMContext.fgInstance.fChildEntryDAO.getByNameParent(name, this); - if (entry == null || entry.getChild().getType() == AVMNodeType.DELETED_NODE) + if (entry == null || + (!includeDeleted && entry.getChild().getType() == AVMNodeType.DELETED_NODE)) { return null; } @@ -179,14 +181,15 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory * @param name The name of the child to lookup. * @return A node descriptor for the child. */ - public AVMNodeDescriptor lookupChild(AVMNodeDescriptor mine, String name) + public AVMNodeDescriptor lookupChild(AVMNodeDescriptor mine, String name, boolean includeDeleted) { if (mine.getPath() == null) { throw new AVMBadArgumentException("Path is null."); } ChildEntry entry = AVMContext.fgInstance.fChildEntryDAO.getByNameParent(name, this); - if (entry == null || entry.getChild().getType() == AVMNodeType.DELETED_NODE) + if (entry == null || + (!includeDeleted && entry.getChild().getType() == AVMNodeType.DELETED_NODE)) { return null; } diff --git a/source/java/org/alfresco/service/cmr/avm/AVMNodeDescriptor.java b/source/java/org/alfresco/service/cmr/avm/AVMNodeDescriptor.java index 89f1873415..a2cfa06778 100644 --- a/source/java/org/alfresco/service/cmr/avm/AVMNodeDescriptor.java +++ b/source/java/org/alfresco/service/cmr/avm/AVMNodeDescriptor.java @@ -284,7 +284,15 @@ public class AVMNodeDescriptor implements Serializable return (fType == AVMNodeType.LAYERED_DIRECTORY ); } - + /** + * Is this a deleted node. + * @return Whether this node is a deleted node. + */ + public boolean isDeleted() + { + return fType == AVMNodeType.DELETED_NODE; + } + /** * Get the user who last modified this node. * @return Who last modified this node. @@ -399,6 +407,8 @@ public class AVMNodeDescriptor implements Serializable return "[LF:" + fID + ":" + fIndirection + "]"; case AVMNodeType.LAYERED_DIRECTORY : return "[LD:" + fID + ":" + fIndirection + "]"; + case AVMNodeType.DELETED_NODE : + return "[DN:" + fID + "]"; default : throw new AVMException("Internal Error."); } diff --git a/source/java/org/alfresco/service/cmr/avm/AVMService.java b/source/java/org/alfresco/service/cmr/avm/AVMService.java index 27e4db174f..d8c6d12db7 100644 --- a/source/java/org/alfresco/service/cmr/avm/AVMService.java +++ b/source/java/org/alfresco/service/cmr/avm/AVMService.java @@ -24,7 +24,6 @@ import java.util.List; import java.util.Map; import java.util.SortedMap; -import org.alfresco.repo.domain.DbAccessControlList; import org.alfresco.repo.domain.PropertyValue; import org.alfresco.service.cmr.repository.ContentData; import org.alfresco.service.namespace.QName; @@ -70,6 +69,21 @@ public interface AVMService * at a directory. */ public SortedMap getDirectoryListing(int version, String path); + + /** + * Get a listing of a Folder by name, with the option of seeing + * Deleted Nodes. + * @param version The version id to look in. + * @param path The simple absolute path to the file node. + * @param includeDeleted Whether to see Deleted Nodes. + * @return A Map of names to descriptors. + * @throws AVMNotFoundException If path is not found. + * @throws AVMWrongTypeException If path contains a non-terminal + * component that is not a directory, or if path is not pointing + * at a directory. + */ + public SortedMap getDirectoryListing(int version, String path, + boolean includeDeleted); /** * Get the listing of nodes contained directly in a directory. This is the @@ -84,6 +98,22 @@ public interface AVMService */ public SortedMap getDirectoryListingDirect(int version, String path); + + /** + * Get the listing of nodes contained directly in a directory. This is the + * same as getDirectoryListing for PlainDirectories, but returns only those that + * are directly contained in a layered directory. This has the option of + * seeing Deleted Nodes. + * @param version The version to look up. + * @param path The full path to get listing for. + * @param includeDeleted Whether to see Deleted Nodes. + * @return A Map of names to descriptors. + * @throws AVMNotFoundException If path does not exist. + * @throws AVMWrongTypeException If path contains any non-directory + * elements. + */ + public SortedMap + getDirectoryListingDirect(int version, String path, boolean includeDeleted); /** * Get a directory listing from a node descriptor. @@ -95,6 +125,18 @@ public interface AVMService */ public SortedMap getDirectoryListing(AVMNodeDescriptor dir); + /** + * Get a directory listing from a node descriptor, with the option of + * seeing deleted nodes. + * @param dir The directory node descriptor. + * @param includeDeleted Whether to see Deleted Nodes. + * @return A Map of names to node descriptors. + * @throws AVMNotFoundException If the descriptor is stale. + * @throws AVMWrongTypeException If the descriptor does not point at a directory. + */ + public SortedMap getDirectoryListing(AVMNodeDescriptor dir, + boolean includeDeleted); + /** * Get the names of nodes that have been deleted in a directory. * @param version The version to look under. @@ -318,6 +360,20 @@ public interface AVMService */ public AVMNodeDescriptor lookup(int version, String path); + /** + * Lookup a node by version ids and path, with the option of + * seeing Deleted Nodes. + * @param version The version id to look under. + * @param path The simple absolute path to the parent directory. + * @param includeDeleted Whether to see Deleted Nodes. + * @return An AVMNodeDescriptor. + * @throws AVMNotFoundException If path does not exist or + * if version does not exist. + * @throws AVMWrongTypeException If path contains a non-terminal + * element that is not a directory. + */ + public AVMNodeDescriptor lookup(int version, String path, boolean includeDeleted); + /** * Lookup a node from a directory node. * @param dir The descriptor for the directory node. @@ -329,6 +385,19 @@ public interface AVMService */ public AVMNodeDescriptor lookup(AVMNodeDescriptor dir, String name); + /** + * Lookup a node from a directory node, with the option of seeing + * Deleted Nodes. + * @param dir The descriptor for the directory node. + * @param name The name to lookup. + * @param includeDeleted Whether to see Deleted Nodes. + * @return The descriptor for the child. + * @throws AVMNotFoundException If name does not exist or + * if dir is dangling. + * @throws AVMWrongTypeException If dir does not refer to a directory. + */ + public AVMNodeDescriptor lookup(AVMNodeDescriptor dir, String name, boolean includeDeleted); + /** * Get the indirection path for a layered file or directory. * @param version The version number to get.