This exposes DeletedNodes through AVMService via calls for lookup

and directory listing that take an includeLinks flag.  Original calls 
(w/o a flag) should have unchanged behavior. 


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@3752 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Britt Park
2006-09-11 00:00:57 +00:00
parent 8a95b09b98
commit 5e0378deb2
12 changed files with 329 additions and 92 deletions

View File

@@ -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<String, AVMNodeDescriptor> getListing(int version, String path)
public SortedMap<String, AVMNodeDescriptor> 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<String, AVMNodeDescriptor> getListingDirect(int version, String path)
public SortedMap<String, AVMNodeDescriptor> 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<String, AVMNodeDescriptor> getListing(AVMNodeDescriptor dir)
public SortedMap<String, AVMNodeDescriptor> 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());

View File

@@ -107,12 +107,30 @@ public class AVMServiceImpl implements AVMService
* @param path The path to lookup.
*/
public SortedMap<String, AVMNodeDescriptor> 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 <code>path</code> is not found.
* @throws AVMWrongTypeException If <code>path</code> contains a non-terminal
* component that is not a directory, or if <code>path</code> is not pointing
* at a directory.
*/
public SortedMap<String, AVMNodeDescriptor> 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<String, AVMNodeDescriptor>
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 <code>path</code> does not exist.
* @throws AVMWrongTypeException If <code>path</code> contains any non-directory
* elements.
*/
public SortedMap<String, AVMNodeDescriptor>
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<String, AVMNodeDescriptor> 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<String, AVMNodeDescriptor> 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 <code>path</code> does not exist or
* if <code>version</code> does not exist.
* @throws AVMWrongTypeException If <code>path</code> 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 <code>name</code> does not exist or
* if <code>dir</code> is dangling.
* @throws AVMWrongTypeException If <code>dir</code> 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.

View File

@@ -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<String, AVMNodeDescriptor> 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();
}
}
}

View File

@@ -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<String, AVMNodeDescriptor> listing = fService.getDirectoryListing(version, path);
Map<String, AVMNodeDescriptor> listing = fService.getDirectoryListing(version, path, true);
for (String name : listing.keySet())
{
builder.append(recursiveList(basename + name, version, indent + 2, followLinks));

View File

@@ -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<String, AVMNodeDescriptor> getListing(int version, String path);
public SortedMap<String, AVMNodeDescriptor> 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<String, AVMNodeDescriptor> getListingDirect(int version, String path);
public SortedMap<String, AVMNodeDescriptor> 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.

View File

@@ -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<String, AVMNodeDescriptor> getListing(int version, String path)
public SortedMap<String, AVMNodeDescriptor> getListing(int version, String path,
boolean includeDeleted)
{
Lookup lPath = lookupDirectory(version, path, false);
DirectoryNode dir = (DirectoryNode)lPath.getCurrentNode();
Map<String, AVMNode> listing = dir.getListing(lPath);
Map<String, AVMNode> 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<String, AVMNodeDescriptor> getListingDirect(int version, String path)
public SortedMap<String, AVMNodeDescriptor> 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<String, AVMNodeDescriptor>();
}
Map<String, AVMNode> listing = dir.getListingDirect(lPath);
Map<String, AVMNode> 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<QName, PropertyValue> 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<QName, PropertyValue> 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<QName> getAspects(int version, String path)
{
Lookup lPath = lookup(version, path, false);
Lookup lPath = lookup(version, path, false, false);
AVMNode node = lPath.getCurrentNode();
List<AVMAspectName> 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();
}
}

View File

@@ -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<String, AVMNode> getListing(Lookup lPath);
public Map<String, AVMNode> 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<String, AVMNode> getListingDirect(Lookup lPath);
public Map<String, AVMNode> 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<String, AVMNodeDescriptor> getListing(AVMNodeDescriptor dir);
public SortedMap<String, AVMNodeDescriptor> getListing(AVMNodeDescriptor dir,
boolean includeDeleted);
/**
* Get the names of nodes deleted in this directory.

View File

@@ -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<String, AVMNode> getListing(Lookup lPath)
public Map<String, AVMNode> getListing(Lookup lPath, boolean includeDeleted)
{
// Get the base listing from the thing we indirect to.
Map<String, AVMNode> 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<String, AVMNode> getListingDirect(Lookup lPath)
public Map<String, AVMNode> getListingDirect(Lookup lPath, boolean includeDeleted)
{
Map<String, AVMNode> listing = new HashMap<String, AVMNode>();
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<String, AVMNodeDescriptor> getListing(AVMNodeDescriptor dir)
public SortedMap<String, AVMNodeDescriptor> 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<String, AVMNode> listing = dirNode.getListing(lookup);
Map<String, AVMNode> listing = dirNode.getListing(lookup, includeDeleted);
for (String name : listing.keySet())
{
baseListing.put(name,
@@ -400,7 +402,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
List<ChildEntry> 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());

View File

@@ -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))
{

View File

@@ -93,13 +93,13 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory
* @return The listing.
*/
@SuppressWarnings("unchecked")
public Map<String, AVMNode> getListing(Lookup lPath)
public Map<String, AVMNode> getListing(Lookup lPath, boolean includeDeleted)
{
Map<String, AVMNode> result = new HashMap<String, AVMNode>();
List<ChildEntry> 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<String, AVMNode> getListingDirect(Lookup lPath)
public Map<String, AVMNode> 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<String, AVMNodeDescriptor> getListing(AVMNodeDescriptor dir)
public SortedMap<String, AVMNodeDescriptor> getListing(AVMNodeDescriptor dir, boolean includeDeleted)
{
if (dir.getPath() == null)
{
@@ -133,7 +133,7 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory
List<ChildEntry> 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;
}