A real, if brute force, fix for cycle detection during lookups.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@4106 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Britt Park
2006-10-12 18:10:17 +00:00
parent b6514af611
commit 0774219b75
2 changed files with 714 additions and 380 deletions

View File

@@ -108,14 +108,20 @@ public class AVMRepository
public OutputStream createFile(String path, String name) public OutputStream createFile(String path, String name)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String[] pathParts = SplitPath(path); String[] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null) {
{
throw new AVMNotFoundException("Store not found."); throw new AVMNotFoundException("Store not found.");
} }
return store.createFile(pathParts[1], name); return store.createFile(pathParts[1], name);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Create a file with the given File as content. * Create a file with the given File as content.
@@ -126,6 +132,8 @@ public class AVMRepository
public void createFile(String path, String name, File data) public void createFile(String path, String name, File data)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String[] pathParts = SplitPath(path); String[] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -134,6 +142,11 @@ public class AVMRepository
} }
store.createFile(pathParts[1], name, data); store.createFile(pathParts[1], name, data);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Create a new directory. * Create a new directory.
@@ -143,6 +156,8 @@ public class AVMRepository
public void createDirectory(String path, String name) public void createDirectory(String path, String name)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String[] pathParts = SplitPath(path); String[] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -151,6 +166,11 @@ public class AVMRepository
} }
store.createDirectory(pathParts[1], name); store.createDirectory(pathParts[1], name);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Create a new directory. This assumes that the parent is already * Create a new directory. This assumes that the parent is already
@@ -207,6 +227,8 @@ public class AVMRepository
throw new AVMCycleException("Cycle would be created."); throw new AVMCycleException("Cycle would be created.");
} }
fLookupCount.set(1); fLookupCount.set(1);
try
{
String[] pathParts = SplitPath(dstPath); String[] pathParts = SplitPath(dstPath);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -215,6 +237,11 @@ public class AVMRepository
} }
store.createLayeredDirectory(srcPath, pathParts[1], name); store.createLayeredDirectory(srcPath, pathParts[1], name);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Create a new layered file. * Create a new layered file.
@@ -225,6 +252,8 @@ public class AVMRepository
public void createLayeredFile(String srcPath, String dstPath, String name) public void createLayeredFile(String srcPath, String dstPath, String name)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String[] pathParts = SplitPath(dstPath); String[] pathParts = SplitPath(dstPath);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -233,6 +262,11 @@ public class AVMRepository
} }
store.createLayeredFile(srcPath, pathParts[1], name); store.createLayeredFile(srcPath, pathParts[1], name);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Create a new AVMStore. * Create a new AVMStore.
@@ -266,7 +300,11 @@ public class AVMRepository
} }
// Lookup the src node. // Lookup the src node.
fLookupCount.set(1); fLookupCount.set(1);
String [] pathParts = SplitPath(srcPath); String [] pathParts;
Lookup sPath;
try
{
pathParts = SplitPath(srcPath);
AVMStore srcRepo = getAVMStoreByName(pathParts[0]); AVMStore srcRepo = getAVMStoreByName(pathParts[0]);
if (srcRepo == null) if (srcRepo == null)
{ {
@@ -276,13 +314,20 @@ public class AVMRepository
{ {
version = srcRepo.createSnapshot(); version = srcRepo.createSnapshot();
} }
Lookup sPath = srcRepo.lookup(version, pathParts[1], false, false); sPath = srcRepo.lookup(version, pathParts[1], false, false);
if (sPath == null) if (sPath == null)
{ {
throw new AVMNotFoundException("Path not found."); throw new AVMNotFoundException("Path not found.");
} }
}
finally
{
fLookupCount.set(null);
}
// Lookup the destination directory. // Lookup the destination directory.
fLookupCount.set(1); fLookupCount.set(1);
try
{
pathParts = SplitPath(dstPath); pathParts = SplitPath(dstPath);
AVMStore dstRepo = getAVMStoreByName(pathParts[0]); AVMStore dstRepo = getAVMStoreByName(pathParts[0]);
if (dstRepo == null) if (dstRepo == null)
@@ -323,6 +368,11 @@ public class AVMRepository
dirNode.putChild(name, dstNode); dirNode.putChild(name, dstNode);
dirNode.updateModTime(); dirNode.updateModTime();
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Get an output stream to a file. * Get an output stream to a file.
@@ -332,6 +382,8 @@ public class AVMRepository
public OutputStream getOutputStream(String path) public OutputStream getOutputStream(String path)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -340,6 +392,11 @@ public class AVMRepository
} }
return store.getOutputStream(pathParts[1]); return store.getOutputStream(pathParts[1]);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Rename a node. * Rename a node.
@@ -357,24 +414,37 @@ public class AVMRepository
throw new AVMCycleException("Cyclic rename."); throw new AVMCycleException("Cyclic rename.");
} }
fLookupCount.set(1); fLookupCount.set(1);
String [] pathParts = SplitPath(srcPath); String [] pathParts;
Lookup sPath;
DirectoryNode srcDir;
AVMNode srcNode;
try
{
pathParts = SplitPath(srcPath);
AVMStore srcRepo = getAVMStoreByName(pathParts[0]); AVMStore srcRepo = getAVMStoreByName(pathParts[0]);
if (srcRepo == null) if (srcRepo == null)
{ {
throw new AVMNotFoundException("Store not found."); throw new AVMNotFoundException("Store not found.");
} }
Lookup sPath = srcRepo.lookupDirectory(-1, pathParts[1], true); sPath = srcRepo.lookupDirectory(-1, pathParts[1], true);
if (sPath == null) if (sPath == null)
{ {
throw new AVMNotFoundException("Path not found."); throw new AVMNotFoundException("Path not found.");
} }
DirectoryNode srcDir = (DirectoryNode)sPath.getCurrentNode(); srcDir = (DirectoryNode)sPath.getCurrentNode();
AVMNode srcNode = srcDir.lookupChild(sPath, srcName, false); srcNode = srcDir.lookupChild(sPath, srcName, false);
if (srcNode == null) if (srcNode == null)
{ {
throw new AVMNotFoundException("Not found: " + srcName); throw new AVMNotFoundException("Not found: " + srcName);
} }
}
finally
{
fLookupCount.set(null);
}
fLookupCount.set(1); fLookupCount.set(1);
try
{
pathParts = SplitPath(dstPath); pathParts = SplitPath(dstPath);
AVMStore dstRepo = getAVMStoreByName(pathParts[0]); AVMStore dstRepo = getAVMStoreByName(pathParts[0]);
if (dstRepo == null) if (dstRepo == null)
@@ -477,6 +547,11 @@ public class AVMRepository
dstDir.updateModTime(); dstDir.updateModTime();
dstNode.setAncestor(srcNode); dstNode.setAncestor(srcNode);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Uncover a deleted name in a layered directory. * Uncover a deleted name in a layered directory.
@@ -486,6 +561,8 @@ public class AVMRepository
public void uncover(String dirPath, String name) public void uncover(String dirPath, String name)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(dirPath); String [] pathParts = SplitPath(dirPath);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -494,6 +571,11 @@ public class AVMRepository
} }
store.uncover(pathParts[1], name); store.uncover(pathParts[1], name);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Snapshot the given repositories. * Snapshot the given repositories.
@@ -538,6 +620,8 @@ public class AVMRepository
public void remove(String path, String name) public void remove(String path, String name)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -546,6 +630,11 @@ public class AVMRepository
} }
store.removeNode(pathParts[1], name); store.removeNode(pathParts[1], name);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Get rid of all content that lives only in the given AVMStore. * Get rid of all content that lives only in the given AVMStore.
@@ -603,6 +692,8 @@ public class AVMRepository
public InputStream getInputStream(int version, String path) public InputStream getInputStream(int version, String path)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -611,6 +702,11 @@ public class AVMRepository
} }
return store.getInputStream(version, pathParts[1]); return store.getInputStream(version, pathParts[1]);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Get a listing of a directory. * Get a listing of a directory.
@@ -623,6 +719,8 @@ public class AVMRepository
boolean includeDeleted) boolean includeDeleted)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -631,6 +729,11 @@ public class AVMRepository
} }
return store.getListing(version, pathParts[1], includeDeleted); return store.getListing(version, pathParts[1], includeDeleted);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Get the list of nodes directly contained in a directory. * Get the list of nodes directly contained in a directory.
@@ -642,6 +745,8 @@ public class AVMRepository
boolean includeDeleted) boolean includeDeleted)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -650,6 +755,11 @@ public class AVMRepository
} }
return store.getListingDirect(version, pathParts[1], includeDeleted); return store.getListingDirect(version, pathParts[1], includeDeleted);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Get the list of nodes directly contained in a directory. * Get the list of nodes directly contained in a directory.
@@ -685,6 +795,8 @@ public class AVMRepository
public SortedMap<String, AVMNodeDescriptor> getListing(AVMNodeDescriptor dir, boolean includeDeleted) public SortedMap<String, AVMNodeDescriptor> getListing(AVMNodeDescriptor dir, boolean includeDeleted)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
AVMNode node = AVMDAOs.Instance().fAVMNodeDAO.getByID(dir.getId()); AVMNode node = AVMDAOs.Instance().fAVMNodeDAO.getByID(dir.getId());
if (node == null) if (node == null)
{ {
@@ -698,6 +810,11 @@ public class AVMRepository
DirectoryNode dirNode = (DirectoryNode)node; DirectoryNode dirNode = (DirectoryNode)node;
return dirNode.getListing(dir, includeDeleted); return dirNode.getListing(dir, includeDeleted);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Get the names of deleted nodes in a directory. * Get the names of deleted nodes in a directory.
@@ -708,6 +825,8 @@ public class AVMRepository
public List<String> getDeleted(int version, String path) public List<String> getDeleted(int version, String path)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -716,6 +835,11 @@ public class AVMRepository
} }
return store.getDeleted(version, pathParts[1]); return store.getDeleted(version, pathParts[1]);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Get descriptors of all AVMStores. * Get descriptors of all AVMStores.
@@ -808,6 +932,8 @@ public class AVMRepository
public String getIndirectionPath(int version, String path) public String getIndirectionPath(int version, String path)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -816,6 +942,11 @@ public class AVMRepository
} }
return store.getIndirectionPath(version, pathParts[1]); return store.getIndirectionPath(version, pathParts[1]);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Get the next version id for the given AVMStore. * Get the next version id for the given AVMStore.
@@ -879,10 +1010,10 @@ public class AVMRepository
{ {
fLookupCount.set(count + 1); fLookupCount.set(count + 1);
} }
// if (fLookupCount.get() > 50) if (fLookupCount.get() > 50)
// { {
// throw new AVMCycleException("Cycle in lookup."); throw new AVMCycleException("Cycle in lookup.");
// } }
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -909,7 +1040,9 @@ public class AVMRepository
*/ */
public AVMNodeDescriptor lookup(AVMNodeDescriptor dir, String name, boolean includeDeleted) public AVMNodeDescriptor lookup(AVMNodeDescriptor dir, String name, boolean includeDeleted)
{ {
fLookupCount.set(0); fLookupCount.set(1);
try
{
AVMNode node = AVMDAOs.Instance().fAVMNodeDAO.getByID(dir.getId()); AVMNode node = AVMDAOs.Instance().fAVMNodeDAO.getByID(dir.getId());
if (node == null) if (node == null)
{ {
@@ -923,6 +1056,11 @@ public class AVMRepository
DirectoryNode dirNode = (DirectoryNode)node; DirectoryNode dirNode = (DirectoryNode)node;
return dirNode.lookupChild(dir, name, includeDeleted); return dirNode.lookupChild(dir, name, includeDeleted);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Get all the paths to a particular node. * Get all the paths to a particular node.
@@ -1105,6 +1243,8 @@ public class AVMRepository
public LayeringDescriptor getLayeringInfo(int version, String path) public LayeringDescriptor getLayeringInfo(int version, String path)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -1120,6 +1260,11 @@ public class AVMRepository
lookup.getAVMStore().getDescriptor(), lookup.getAVMStore().getDescriptor(),
lookup.getFinalStore().getDescriptor()); lookup.getFinalStore().getDescriptor());
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Lookup a directory specifically. * Lookup a directory specifically.
@@ -1129,10 +1274,11 @@ public class AVMRepository
*/ */
public Lookup lookupDirectory(int version, String path) public Lookup lookupDirectory(int version, String path)
{ {
// if (fLookupCount.get() > 50) fLookupCount.set(fLookupCount.get() + 1);
// { if (fLookupCount.get() > 50)
// throw new AVMCycleException("Cycle in lookup."); {
// } throw new AVMCycleException("Cycle in lookup.");
}
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -1164,6 +1310,8 @@ public class AVMRepository
public void makePrimary(String path) public void makePrimary(String path)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String[] pathParts = SplitPath(path); String[] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -1172,6 +1320,11 @@ public class AVMRepository
} }
store.makePrimary(pathParts[1]); store.makePrimary(pathParts[1]);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Change what a layered directory points at. * Change what a layered directory points at.
@@ -1181,6 +1334,8 @@ public class AVMRepository
public void retargetLayeredDirectory(String path, String target) public void retargetLayeredDirectory(String path, String target)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String[] pathParts = SplitPath(path); String[] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -1189,6 +1344,11 @@ public class AVMRepository
} }
store.retargetLayeredDirectory(pathParts[1], target); store.retargetLayeredDirectory(pathParts[1], target);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Get the history chain for a node. * Get the history chain for a node.
@@ -1229,6 +1389,8 @@ public class AVMRepository
public void setOpacity(String path, boolean opacity) public void setOpacity(String path, boolean opacity)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String[] pathParts = SplitPath(path); String[] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -1237,6 +1399,11 @@ public class AVMRepository
} }
store.setOpacity(pathParts[1], opacity); store.setOpacity(pathParts[1], opacity);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Set a property on a node. * Set a property on a node.
@@ -1247,6 +1414,8 @@ public class AVMRepository
public void setNodeProperty(String path, QName name, PropertyValue value) public void setNodeProperty(String path, QName name, PropertyValue value)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -1255,6 +1424,11 @@ public class AVMRepository
} }
store.setNodeProperty(pathParts[1], name, value); store.setNodeProperty(pathParts[1], name, value);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Set a collection of properties at once. * Set a collection of properties at once.
@@ -1264,6 +1438,8 @@ public class AVMRepository
public void setNodeProperties(String path, Map<QName, PropertyValue> properties) public void setNodeProperties(String path, Map<QName, PropertyValue> properties)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -1272,6 +1448,11 @@ public class AVMRepository
} }
store.setNodeProperties(pathParts[1], properties); store.setNodeProperties(pathParts[1], properties);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Get a property by name for a node. * Get a property by name for a node.
@@ -1283,6 +1464,8 @@ public class AVMRepository
public PropertyValue getNodeProperty(int version, String path, QName name) public PropertyValue getNodeProperty(int version, String path, QName name)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -1291,6 +1474,11 @@ public class AVMRepository
} }
return store.getNodeProperty(version, pathParts[1], name); return store.getNodeProperty(version, pathParts[1], name);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Get a Map of all the properties of a node. * Get a Map of all the properties of a node.
@@ -1301,6 +1489,8 @@ public class AVMRepository
public Map<QName, PropertyValue> getNodeProperties(int version, String path) public Map<QName, PropertyValue> getNodeProperties(int version, String path)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -1309,6 +1499,11 @@ public class AVMRepository
} }
return store.getNodeProperties(version, pathParts[1]); return store.getNodeProperties(version, pathParts[1]);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Delete a single property from a node. * Delete a single property from a node.
@@ -1318,6 +1513,8 @@ public class AVMRepository
public void deleteNodeProperty(String path, QName name) public void deleteNodeProperty(String path, QName name)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -1326,6 +1523,11 @@ public class AVMRepository
} }
store.deleteNodeProperty(pathParts[1], name); store.deleteNodeProperty(pathParts[1], name);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Delete all properties on a node. * Delete all properties on a node.
@@ -1334,6 +1536,8 @@ public class AVMRepository
public void deleteNodeProperties(String path) public void deleteNodeProperties(String path)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -1342,6 +1546,11 @@ public class AVMRepository
} }
store.deleteNodeProperties(pathParts[1]); store.deleteNodeProperties(pathParts[1]);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Set a property on a store. Overwrites if property exists. * Set a property on a store. Overwrites if property exists.
@@ -1533,10 +1742,17 @@ public class AVMRepository
public ContentData getContentDataForRead(int version, String path) public ContentData getContentDataForRead(int version, String path)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
return store.getContentDataForRead(version, pathParts[1]); return store.getContentDataForRead(version, pathParts[1]);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Get the ContentData for a file for writing. * Get the ContentData for a file for writing.
@@ -1546,6 +1762,8 @@ public class AVMRepository
public ContentData getContentDataForWrite(String path) public ContentData getContentDataForWrite(String path)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -1554,6 +1772,11 @@ public class AVMRepository
} }
return store.getContentDataForWrite(pathParts[1]); return store.getContentDataForWrite(pathParts[1]);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Set the ContentData on a file. * Set the ContentData on a file.
@@ -1563,6 +1786,8 @@ public class AVMRepository
public void setContentData(String path, ContentData data) public void setContentData(String path, ContentData data)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -1571,6 +1796,11 @@ public class AVMRepository
} }
store.setContentData(pathParts[1], data); store.setContentData(pathParts[1], data);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Get the single instance of AVMRepository. * Get the single instance of AVMRepository.
@@ -1584,6 +1814,8 @@ public class AVMRepository
public void setMetaDataFrom(String path, AVMNodeDescriptor from) public void setMetaDataFrom(String path, AVMNodeDescriptor from)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -1597,6 +1829,11 @@ public class AVMRepository
} }
store.setMetaDataFrom(pathParts[1], fromNode); store.setMetaDataFrom(pathParts[1], fromNode);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Add an aspect to an AVM Node. * Add an aspect to an AVM Node.
@@ -1606,6 +1843,8 @@ public class AVMRepository
public void addAspect(String path, QName aspectName) public void addAspect(String path, QName aspectName)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -1614,6 +1853,11 @@ public class AVMRepository
} }
store.addAspect(pathParts[1], aspectName); store.addAspect(pathParts[1], aspectName);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Get all the aspects on an AVM node. * Get all the aspects on an AVM node.
@@ -1624,6 +1868,8 @@ public class AVMRepository
public List<QName> getAspects(int version, String path) public List<QName> getAspects(int version, String path)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -1632,6 +1878,11 @@ public class AVMRepository
} }
return store.getAspects(version, pathParts[1]); return store.getAspects(version, pathParts[1]);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Remove an aspect and all associated properties from a node. * Remove an aspect and all associated properties from a node.
@@ -1641,6 +1892,8 @@ public class AVMRepository
public void removeAspect(String path, QName aspectName) public void removeAspect(String path, QName aspectName)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -1649,6 +1902,11 @@ public class AVMRepository
} }
store.removeAspect(pathParts[1], aspectName); store.removeAspect(pathParts[1], aspectName);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Does a node have a particular aspect. * Does a node have a particular aspect.
@@ -1660,6 +1918,8 @@ public class AVMRepository
public boolean hasAspect(int version, String path, QName aspectName) public boolean hasAspect(int version, String path, QName aspectName)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -1668,6 +1928,11 @@ public class AVMRepository
} }
return store.hasAspect(version, pathParts[1], aspectName); return store.hasAspect(version, pathParts[1], aspectName);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Set the ACL on a node. * Set the ACL on a node.
@@ -1677,6 +1942,8 @@ public class AVMRepository
public void setACL(String path, DbAccessControlList acl) public void setACL(String path, DbAccessControlList acl)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -1685,6 +1952,11 @@ public class AVMRepository
} }
store.setACL(pathParts[1], acl); store.setACL(pathParts[1], acl);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Get the ACL on a node. * Get the ACL on a node.
@@ -1695,6 +1967,8 @@ public class AVMRepository
public DbAccessControlList getACL(int version, String path) public DbAccessControlList getACL(int version, String path)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -1703,6 +1977,11 @@ public class AVMRepository
} }
return store.getACL(version, pathParts[1]); return store.getACL(version, pathParts[1]);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Link a node into a directory, directly. * Link a node into a directory, directly.
@@ -1713,6 +1992,8 @@ public class AVMRepository
public void link(String parentPath, String name, AVMNodeDescriptor toLink) public void link(String parentPath, String name, AVMNodeDescriptor toLink)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(parentPath); String [] pathParts = SplitPath(parentPath);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -1721,6 +2002,11 @@ public class AVMRepository
} }
store.link(pathParts[1], name, toLink); store.link(pathParts[1], name, toLink);
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* This is the danger version of link. It must be called on * This is the danger version of link. It must be called on
@@ -1754,6 +2040,8 @@ public class AVMRepository
public void flatten(String path, String name) public void flatten(String path, String name)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -1774,6 +2062,11 @@ public class AVMRepository
dir.flatten(name); dir.flatten(name);
AVMDAOs.Instance().fAVMNodeDAO.flush(); AVMDAOs.Instance().fAVMNodeDAO.flush();
} }
finally
{
fLookupCount.set(null);
}
}
/** /**
* Force a copy on write. * Force a copy on write.
@@ -1782,6 +2075,8 @@ public class AVMRepository
public AVMNodeDescriptor forceCopy(String path) public AVMNodeDescriptor forceCopy(String path)
{ {
fLookupCount.set(1); fLookupCount.set(1);
try
{
String [] pathParts = SplitPath(path); String [] pathParts = SplitPath(path);
AVMStore store = getAVMStoreByName(pathParts[0]); AVMStore store = getAVMStoreByName(pathParts[0]);
if (store == null) if (store == null)
@@ -1797,4 +2092,9 @@ public class AVMRepository
AVMNode node = lPath.getCurrentNode(); AVMNode node = lPath.getCurrentNode();
return node.getDescriptor(lPath); return node.getDescriptor(lPath);
} }
finally
{
fLookupCount.set(null);
}
}
} }

View File

@@ -40,6 +40,7 @@ import org.alfresco.repo.domain.PropertyValue;
import org.alfresco.repo.security.authentication.AuthenticationComponent; import org.alfresco.repo.security.authentication.AuthenticationComponent;
import org.alfresco.repo.transaction.TransactionUtil; import org.alfresco.repo.transaction.TransactionUtil;
import org.alfresco.service.cmr.avm.AVMBadArgumentException; import org.alfresco.service.cmr.avm.AVMBadArgumentException;
import org.alfresco.service.cmr.avm.AVMCycleException;
import org.alfresco.service.cmr.avm.AVMException; import org.alfresco.service.cmr.avm.AVMException;
import org.alfresco.service.cmr.avm.AVMExistsException; import org.alfresco.service.cmr.avm.AVMExistsException;
import org.alfresco.service.cmr.avm.AVMNodeDescriptor; import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
@@ -65,6 +66,39 @@ import org.alfresco.util.Pair;
*/ */
public class AVMServiceTest extends AVMServiceTestBase public class AVMServiceTest extends AVMServiceTestBase
{ {
/**
* Test cyclic lookup behavior.
*/
public void testCyclicLookup()
{
try
{
fService.createDirectory("main:/", "a");
fService.createFile("main:/a", "foo").close();
for (int i = 0; i < 1000; i++)
{
fService.lookup(-1, "main:/a/bar");
}
fService.lookup(-1, "main:/a/foo");
fService.createLayeredDirectory("main:/c", "main:/", "b");
fService.createLayeredDirectory("main:/b", "main:/", "c");
try
{
fService.lookup(-1, "main:/b/bar");
fail();
}
catch (AVMCycleException ce)
{
// Do nothing; this means success.
}
}
catch (Exception e)
{
e.printStackTrace(System.err);
fail();
}
}
/** /**
* Test getting all paths for a node. * Test getting all paths for a node.
* *