Fixed createBranch() so that layered node lookups behave properly.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@5579 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Britt Park 2007-04-30 18:48:19 +00:00
parent 7567867be1
commit f91cedfd69
5 changed files with 158 additions and 43 deletions

View File

@ -214,6 +214,24 @@
<property name="purgeVersionTxnListener">
<ref bean="purgeVersionTxnListener"/>
</property>
<property name="avmStoreDAO">
<ref bean="avmStoreDAO"/>
</property>
<property name="avmNodeDAO">
<ref bean="avmNodeDAO"/>
</property>
<property name="versionRootDAO">
<ref bean="versionRootDAO"/>
</property>
<property name="versionLayeredNodeEntryDAO">
<ref bean="versionLayeredNodeEntryDAO"/>
</property>
<property name="avmStorePropertyDAO">
<ref bean="avmStorePropertyDAO"/>
</property>
<property name="childEntryDAO">
<ref bean="childEntryDAO"/>
</property>
</bean>
<!-- A Local implementation of the Remote AVM interface. -->

View File

@ -141,4 +141,16 @@ public class AVMNodeConverter
decomposed[1] = path.substring(off + 1);
return decomposed;
}
/**
* Normalize an AVM path.
* @param path The incoming path.
* @return The normalized path.
*/
public static String NormalizePath(String path)
{
path = path.replaceAll("/+", "/");
path = path.replaceAll("/$", "");
return path;
}
}

View File

@ -94,6 +94,18 @@ public class AVMRepository
*/
private LookupCache fLookupCache;
private AVMStoreDAO fAVMStoreDAO;
private AVMNodeDAO fAVMNodeDAO;
private VersionRootDAO fVersionRootDAO;
private VersionLayeredNodeEntryDAO fVersionLayeredNodeEntryDAO;
private AVMStorePropertyDAO fAVMStorePropertyDAO;
private ChildEntryDAO fChildEntryDAO;
// A bunch of TransactionListeners that do work for this.
/**
@ -180,6 +192,36 @@ public class AVMRepository
fPurgeVersionTxnListener = listener;
}
public void setAvmStoreDAO(AVMStoreDAO dao)
{
fAVMStoreDAO = dao;
}
public void setAvmNodeDAO(AVMNodeDAO dao)
{
fAVMNodeDAO = dao;
}
public void setVersionRootDAO(VersionRootDAO dao)
{
fVersionRootDAO = dao;
}
public void setVersionLayeredNodeEntryDAO(VersionLayeredNodeEntryDAO dao)
{
fVersionLayeredNodeEntryDAO = dao;
}
public void setAvmStorePropertyDAO(AVMStorePropertyDAO dao)
{
fAVMStorePropertyDAO = dao;
}
public void setChildEntryDAO(ChildEntryDAO dao)
{
fChildEntryDAO = dao;
}
/**
* Create a file.
* @param path The path to the containing directory.
@ -265,7 +307,7 @@ public class AVMRepository
*/
public AVMNodeDescriptor createDirectory(AVMNodeDescriptor parent, String name)
{
AVMNode node = AVMDAOs.Instance().fAVMNodeDAO.getByID(parent.getId());
AVMNode node = fAVMNodeDAO.getByID(parent.getId());
if (node == null)
{
throw new AVMNotFoundException(parent.getId() + " not found.");
@ -391,6 +433,7 @@ public class AVMRepository
fLookupCount.set(1);
String [] pathParts;
Lookup sPath;
List<VersionLayeredNodeEntry> layeredEntries = null;
try
{
pathParts = SplitPath(srcPath);
@ -409,6 +452,8 @@ public class AVMRepository
{
throw new AVMNotFoundException("Path not found.");
}
VersionRoot lastVersion = fVersionRootDAO.getByVersionID(srcRepo, version);
layeredEntries = fVersionLayeredNodeEntryDAO.get(lastVersion);
}
finally
{
@ -458,6 +503,22 @@ public class AVMRepository
dstNode.setAncestor(srcNode);
dirNode.putChild(name, dstNode);
dirNode.updateModTime();
String beginingPath = AVMNodeConverter.NormalizePath(srcPath);
String finalPath = AVMNodeConverter.ExtendAVMPath(dstPath, name);
finalPath = AVMNodeConverter.NormalizePath(finalPath);
VersionRoot latestVersion = fVersionRootDAO.getMaxVersion(dstRepo);
for (VersionLayeredNodeEntry entry : layeredEntries)
{
String path = entry.getPath();
if (!path.startsWith(srcPath))
{
continue;
}
String newPath = finalPath + path.substring(beginingPath.length());
VersionLayeredNodeEntry newEntry =
new VersionLayeredNodeEntryImpl(latestVersion, newPath);
fVersionLayeredNodeEntryDAO.save(newEntry);
}
}
finally
{
@ -639,8 +700,6 @@ public class AVMRepository
}
else if (srcNode.getType() == AVMNodeType.LAYERED_DIRECTORY)
{
// TODO I think I need to subdivide this logic again.
// based on whether the destination is a layer or not.
if (!sPath.isLayered() || (sPath.isInThisLayer() &&
srcDir.getType() == AVMNodeType.LAYERED_DIRECTORY &&
((LayeredDirectoryNode)srcDir).directlyContains(srcNode)))
@ -795,23 +854,22 @@ public class AVMRepository
fLookupCache.onDelete(name);
AVMNode root = store.getRoot();
root.setIsRoot(false);
VersionRootDAO vrDAO = AVMDAOs.Instance().fVersionRootDAO;
List<VersionRoot> vRoots = vrDAO.getAllInAVMStore(store);
List<VersionRoot> vRoots = fVersionRootDAO.getAllInAVMStore(store);
for (VersionRoot vr : vRoots)
{
AVMNode node = vr.getRoot();
node.setIsRoot(false);
AVMDAOs.Instance().fVersionLayeredNodeEntryDAO.delete(vr);
vrDAO.delete(vr);
fVersionLayeredNodeEntryDAO.delete(vr);
fVersionRootDAO.delete(vr);
}
List<AVMNode> newGuys = AVMDAOs.Instance().fAVMNodeDAO.getNewInStore(store);
List<AVMNode> newGuys = fAVMNodeDAO.getNewInStore(store);
for (AVMNode newGuy : newGuys)
{
newGuy.setStoreNew(null);
}
AVMDAOs.Instance().fAVMStorePropertyDAO.delete(store);
AVMDAOs.Instance().fAVMStoreDAO.delete(store);
AVMDAOs.Instance().fAVMStoreDAO.invalidateCache();
fAVMStorePropertyDAO.delete(store);
fAVMStoreDAO.delete(store);
fAVMStoreDAO.invalidateCache();
fPurgeStoreTxnListener.storePurged(name);
}
@ -860,7 +918,7 @@ public class AVMRepository
public InputStream getInputStream(AVMNodeDescriptor desc)
{
AVMNode node = AVMDAOs.Instance().fAVMNodeDAO.getByID(desc.getId());
AVMNode node = fAVMNodeDAO.getByID(desc.getId());
if (!(node instanceof FileNode))
{
throw new AVMWrongTypeException(desc + " is not a File.");
@ -937,7 +995,7 @@ public class AVMRepository
public SortedMap<String, AVMNodeDescriptor>
getListingDirect(AVMNodeDescriptor dir, boolean includeDeleted)
{
AVMNode node = AVMDAOs.Instance().fAVMNodeDAO.getByID(dir.getId());
AVMNode node = fAVMNodeDAO.getByID(dir.getId());
if (node == null)
{
throw new AVMBadArgumentException("Invalid Node.");
@ -964,7 +1022,7 @@ public class AVMRepository
fLookupCount.set(1);
try
{
AVMNode node = AVMDAOs.Instance().fAVMNodeDAO.getByID(dir.getId());
AVMNode node = fAVMNodeDAO.getByID(dir.getId());
if (node == null)
{
throw new AVMBadArgumentException("Invalid Node.");
@ -1015,7 +1073,7 @@ public class AVMRepository
@SuppressWarnings("unchecked")
public List<AVMStoreDescriptor> getAVMStores()
{
List<AVMStore> l = AVMDAOs.Instance().fAVMStoreDAO.getAll();
List<AVMStore> l = fAVMStoreDAO.getAll();
List<AVMStoreDescriptor> result = new ArrayList<AVMStoreDescriptor>();
for (AVMStore store : l)
{
@ -1151,7 +1209,7 @@ public class AVMRepository
*/
private AVMStore getAVMStoreByName(String name)
{
AVMStore store = AVMDAOs.Instance().fAVMStoreDAO.getByName(name);
AVMStore store = fAVMStoreDAO.getByName(name);
return store;
}
@ -1213,7 +1271,6 @@ public class AVMRepository
}
}
// TODO This should really return null for not found.
/**
* Lookup a descriptor from a directory descriptor.
* @param dir The directory descriptor.
@ -1225,7 +1282,7 @@ public class AVMRepository
fLookupCount.set(1);
try
{
AVMNode node = AVMDAOs.Instance().fAVMNodeDAO.getByID(dir.getId());
AVMNode node = fAVMNodeDAO.getByID(dir.getId());
if (node == null)
{
throw new AVMNotFoundException("Not found: " + dir.getId());
@ -1251,7 +1308,7 @@ public class AVMRepository
*/
public List<Pair<Integer, String>> getPaths(AVMNodeDescriptor desc)
{
AVMNode node = AVMDAOs.Instance().fAVMNodeDAO.getByID(desc.getId());
AVMNode node = fAVMNodeDAO.getByID(desc.getId());
if (node == null)
{
throw new AVMNotFoundException("Not found: " + desc.getPath());
@ -1269,7 +1326,7 @@ public class AVMRepository
*/
public Pair<Integer, String> getAPath(AVMNodeDescriptor desc)
{
AVMNode node = AVMDAOs.Instance().fAVMNodeDAO.getByID(desc.getId());
AVMNode node = fAVMNodeDAO.getByID(desc.getId());
if (node == null)
{
throw new AVMNotFoundException("Could not find node: " + desc);
@ -1285,7 +1342,7 @@ public class AVMRepository
*/
public List<Pair<Integer, String>> getHeadPaths(AVMNodeDescriptor desc)
{
AVMNode node = AVMDAOs.Instance().fAVMNodeDAO.getByID(desc.getId());
AVMNode node = fAVMNodeDAO.getByID(desc.getId());
if (node == null)
{
throw new AVMNotFoundException("Not found: " + desc.getPath());
@ -1325,7 +1382,7 @@ public class AVMRepository
paths.add(this.makePath(components, storeName));
return;
}
List<ChildEntry> entries = AVMDAOs.Instance().fChildEntryDAO.getByChild(node);
List<ChildEntry> entries = fChildEntryDAO.getByChild(node);
for (ChildEntry entry : entries)
{
String name = entry.getKey().getName();
@ -1350,7 +1407,7 @@ public class AVMRepository
{
throw new AVMNotFoundException("Store not found: " + store);
}
AVMNode node = AVMDAOs.Instance().fAVMNodeDAO.getByID(desc.getId());
AVMNode node = fAVMNodeDAO.getByID(desc.getId());
if (node == null)
{
throw new AVMNotFoundException("Not found: " + desc.getPath());
@ -1372,20 +1429,20 @@ public class AVMRepository
{
if (node.getIsRoot())
{
AVMStore store = AVMDAOs.Instance().fAVMStoreDAO.getByRoot(node);
AVMStore store = fAVMStoreDAO.getByRoot(node);
if (store != null)
{
addPath(components, -1, store.getName(), paths);
return;
}
VersionRoot vr = AVMDAOs.Instance().fVersionRootDAO.getByRoot(node);
VersionRoot vr = fVersionRootDAO.getByRoot(node);
if (vr != null)
{
addPath(components, vr.getVersionID(), vr.getAvmStore().getName(), paths);
}
return;
}
List<ChildEntry> entries = AVMDAOs.Instance().fChildEntryDAO.getByChild(node);
List<ChildEntry> entries = fChildEntryDAO.getByChild(node);
for (ChildEntry entry : entries)
{
String name = entry.getKey().getName();
@ -1406,19 +1463,19 @@ public class AVMRepository
{
if (node.getIsRoot())
{
AVMStore store = AVMDAOs.Instance().fAVMStoreDAO.getByRoot(node);
AVMStore store = fAVMStoreDAO.getByRoot(node);
if (store != null)
{
return new Pair<Integer, String>(-1, makePath(components, store.getName()));
}
VersionRoot vr = AVMDAOs.Instance().fVersionRootDAO.getByRoot(node);
VersionRoot vr = fVersionRootDAO.getByRoot(node);
if (vr != null)
{
return new Pair<Integer, String>(vr.getVersionID(), makePath(components, vr.getAvmStore().getName()));
}
return null;
}
List<ChildEntry> entries = AVMDAOs.Instance().fChildEntryDAO.getByChild(node);
List<ChildEntry> entries = fChildEntryDAO.getByChild(node);
for (ChildEntry entry : entries)
{
String name = entry.getKey().getName();
@ -1444,7 +1501,7 @@ public class AVMRepository
{
if (node.getIsRoot())
{
AVMStore store = AVMDAOs.Instance().fAVMStoreDAO.getByRoot(node);
AVMStore store = fAVMStoreDAO.getByRoot(node);
if (store != null)
{
addPath(components, -1, store.getName(), paths);
@ -1452,7 +1509,7 @@ public class AVMRepository
}
return;
}
List<ChildEntry> entries = AVMDAOs.Instance().fChildEntryDAO.getByChild(node);
List<ChildEntry> entries = fChildEntryDAO.getByChild(node);
for (ChildEntry entry : entries)
{
String name = entry.getKey().getName();
@ -1478,7 +1535,7 @@ public class AVMRepository
addPath(components, -1, storeName, paths);
return;
}
List<ChildEntry> entries = AVMDAOs.Instance().fChildEntryDAO.getByChild(node);
List<ChildEntry> entries = fChildEntryDAO.getByChild(node);
for (ChildEntry entry : entries)
{
String name = entry.getKey().getName();
@ -1652,7 +1709,7 @@ public class AVMRepository
*/
public List<AVMNodeDescriptor> getHistory(AVMNodeDescriptor desc, int count)
{
AVMNode node = AVMDAOs.Instance().fAVMNodeDAO.getByID(desc.getId());
AVMNode node = fAVMNodeDAO.getByID(desc.getId());
if (node == null)
{
throw new AVMNotFoundException("Not found.");
@ -1916,7 +1973,7 @@ public class AVMRepository
throw new AVMNotFoundException("Store not found.");
}
List<AVMStoreProperty> matches =
AVMDAOs.Instance().fAVMStorePropertyDAO.queryByKeyPattern(st,
fAVMStorePropertyDAO.queryByKeyPattern(st,
keyPattern);
Map<QName, PropertyValue> results = new HashMap<QName, PropertyValue>();
for (AVMStoreProperty prop : matches)
@ -1935,7 +1992,7 @@ public class AVMRepository
queryStoresPropertyKeys(QName keyPattern)
{
List<AVMStoreProperty> matches =
AVMDAOs.Instance().fAVMStorePropertyDAO.queryByKeyPattern(keyPattern);
fAVMStorePropertyDAO.queryByKeyPattern(keyPattern);
Map<String, Map<QName, PropertyValue>> results =
new HashMap<String, Map<QName, PropertyValue>>();
for (AVMStoreProperty prop : matches)
@ -2001,8 +2058,8 @@ public class AVMRepository
public AVMNodeDescriptor getCommonAncestor(AVMNodeDescriptor left,
AVMNodeDescriptor right)
{
AVMNode lNode = AVMDAOs.Instance().fAVMNodeDAO.getByID(left.getId());
AVMNode rNode = AVMDAOs.Instance().fAVMNodeDAO.getByID(right.getId());
AVMNode lNode = fAVMNodeDAO.getByID(left.getId());
AVMNode rNode = fAVMNodeDAO.getByID(right.getId());
if (lNode == null || rNode == null)
{
throw new AVMNotFoundException("Node not found.");
@ -2143,7 +2200,7 @@ public class AVMRepository
{
throw new AVMNotFoundException("Store not found: " + pathParts[0]);
}
AVMNode fromNode = AVMDAOs.Instance().fAVMNodeDAO.getByID(from.getId());
AVMNode fromNode = fAVMNodeDAO.getByID(from.getId());
if (fromNode == null)
{
throw new AVMNotFoundException("Node not found: " + from.getPath());
@ -2344,7 +2401,7 @@ public class AVMRepository
*/
public void link(AVMNodeDescriptor parent, String name, AVMNodeDescriptor child)
{
AVMNode node = AVMDAOs.Instance().fAVMNodeDAO.getByID(parent.getId());
AVMNode node = fAVMNodeDAO.getByID(parent.getId());
if (!(node instanceof DirectoryNode))
{
throw new AVMWrongTypeException("Not a Directory.");
@ -2387,7 +2444,7 @@ public class AVMRepository
}
LayeredDirectoryNode dir = (LayeredDirectoryNode)node;
dir.flatten(name);
AVMDAOs.Instance().fAVMNodeDAO.flush();
fAVMNodeDAO.flush();
}
finally
{
@ -2452,7 +2509,7 @@ public class AVMRepository
}
store.setName(destName);
fLookupCache.onDelete(sourceName);
AVMDAOs.Instance().fAVMStoreDAO.invalidateCache();
fAVMStoreDAO.invalidateCache();
fPurgeStoreTxnListener.storePurged(sourceName);
fCreateStoreTxnListener.storeCreated(destName);
}

View File

@ -83,6 +83,34 @@ import org.alfresco.util.Pair;
*/
public class AVMServiceTest extends AVMServiceTestBase
{
public void testBranchLayerSnapshot()
{
try
{
setupBasicTree();
fService.createStore("layer");
fService.createDirectory("layer:/", "root");
fService.createLayeredDirectory("main:/a", "layer:/root", "layer");
fService.createSnapshot("layer", null, null);
fService.createFile("main:/a", "dummy").close();
fService.createFile("layer:/root/layer", "pygmy");
fService.createSnapshot("layer", null, null);
fService.createStore("branch");
fService.createBranch(1, "layer:/root", "branch:/", "branch");
fService.createSnapshot("branch", null, null);
fService.getFileOutputStream("main:/a/b/c/foo").close();
assertEquals(fService.lookup(1, "main:/a/b/c/foo").getId(),
fService.lookup(1, "branch:/branch/layer/b/c/foo").getId());
assertEquals(fService.lookup(-1, "main:/a/b/c/foo").getId(),
fService.lookup(-1, "branch:/branch/layer/b/c/foo").getId());
}
catch (Exception e)
{
e.printStackTrace();
fail();
}
}
/**
* Test Deployment.
*/

View File

@ -235,7 +235,7 @@ public class AVMStoreImpl implements AVMStore, Serializable
}
parent.putChild(parentName[1], newChild);
}
AVMDAOs.Instance().fVersionLayeredNodeEntryDAO.delete(lastVersion);
// AVMDAOs.Instance().fVersionLayeredNodeEntryDAO.delete(lastVersion);
// Clear out the new nodes.
List<AVMNode> newInRep = AVMDAOs.Instance().fAVMNodeDAO.getNewInStore(this);
List<AVMNode> layeredNodes = new ArrayList<AVMNode>();