Added missing callbacks to AVMNodeService. This makes things slow.

Have to do something about that.
Added getPaths call to AVMService.  Retrieves all possible paths to a node.
Need to do timing tests.
I believe, the 6th version of a Pair template class. This one's public and 
perhaps when we have time we could use it in place of all the inner class
implementations.


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@3964 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Britt Park
2006-09-28 20:19:48 +00:00
parent 99cce28c2d
commit 8e56ad390c
12 changed files with 243 additions and 19 deletions

View File

@@ -285,7 +285,7 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
throw new InvalidTypeException("Invalid node type for AVM.", nodeTypeQName);
}
addDefaultPropertyValues(nodeTypeDef, properties);
// TODO Add default aspects to the child..
addDefaultAspects(nodeTypeDef, avmPath, properties);
}
catch (AVMNotFoundException e)
{
@@ -318,8 +318,10 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
-1);
invokeOnCreateNode(ref);
invokeOnUpdateNode(parentRef);
// TODO invokeOnUpdateProperties
if (properties.size() != 0)
{
invokeOnUpdateProperties(childRef, new HashMap<QName, Serializable>(), properties);
}
return ref;
}
@@ -388,19 +390,37 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
String dstParent = (String)dst[1];
String dstName = assocQName.getLocalName();
// TODO Invoke policy behavior. Not quite sure how to translate this.
NodeRef oldParentRef = AVMNodeConverter.ToNodeRef(-1, srcParent);
ChildAssociationRef oldAssocRef =
new ChildAssociationRef(assocTypeQName,
oldParentRef,
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, srcName),
nodeToMoveRef,
true,
-1);
invokeBeforeDeleteChildAssociation(oldAssocRef);
String dstPath = AVMNodeConverter.ExtendAVMPath(dstParent, dstName);
NodeRef newChildRef = AVMNodeConverter.ToNodeRef(-1, dstPath);
invokeBeforeCreateChildAssociation(newParentRef, newChildRef, assocTypeQName, assocQName);
invokeBeforeUpdateNode(oldParentRef);
invokeBeforeUpdateNode(newParentRef);
// Actually perform the rename and return a pseudo
// ChildAssociationRef.
try
{
fAVMService.rename(srcParent, srcName, dstParent, dstName);
String dstPath = AVMNodeConverter.ExtendAVMPath(dstParent, dstName);
// TODO Invoke policy behaviors. Not sure how to translate that.
return new ChildAssociationRef(assocTypeQName,
newParentRef,
assocQName,
AVMNodeConverter.ToNodeRef(-1, dstPath),
true,
-1);
ChildAssociationRef newAssocRef =
new ChildAssociationRef(assocTypeQName,
newParentRef,
assocQName,
newChildRef,
true,
-1);
invokeOnCreateChildAssociation(newAssocRef);
invokeOnDeleteChildAssociation(oldAssocRef);
invokeOnUpdateNode(oldParentRef);
invokeOnUpdateNode(newParentRef);
return newAssocRef;
}
catch (AVMNotFoundException e)
{
@@ -739,9 +759,16 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
}
try
{
QName nodeTypeQName = getType(nodeRef);
Set<QName> aspects = getAspects(nodeRef);
fAVMService.removeNode(avmPathBase[0], avmPathBase[1]);
// Invoke policy behaviors.
// TODO invokeOnDeleteNode() Need to fake up ChildAssocRef.
ChildAssociationRef childAssocRef =
new ChildAssociationRef(ContentModel.ASSOC_CHILDREN,
AVMNodeConverter.ToNodeRef(-1, avmPathBase[0]),
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
avmPathBase[1]),
nodeRef);
invokeOnDeleteNode(childAssocRef, nodeTypeQName, aspects, false);
}
catch (AVMNotFoundException e)
{
@@ -767,6 +794,8 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
QName assocTypeQName,
QName qname) throws InvalidNodeRefException
{
// TODO This can be supported theoretically. I'm not sure if
// the link operation is semantically equivalent.
throw new UnsupportedOperationException("addChild: unsupported");
}
@@ -803,9 +832,16 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
}
try
{
ChildAssociationRef assocRef =
new ChildAssociationRef(ContentModel.ASSOC_CHILDREN,
AVMNodeConverter.ToNodeRef(-1, parentPath),
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
childPathBase[1]),
AVMNodeConverter.ToNodeRef(-1, childPath));
invokeBeforeDeleteChildAssociation(assocRef);
fAVMService.removeNode(childPathBase[0], childPathBase[1]);
// Invoke policy behaviors.
// TODO Need to fake up ChildAssocRef.
invokeOnDeleteChildAssociation(assocRef);
invokeOnUpdateNode(AVMNodeConverter.ToNodeRef(-1, parentPath));
}
catch (AVMNotFoundException e)
{
@@ -1027,6 +1063,7 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
{
// Invoke policy behaviors.
invokeBeforeUpdateNode(nodeRef);
Map<QName, Serializable> oldProps = getProperties(nodeRef);
fAVMService.deleteNodeProperties((String)avmVersionPath[1]);
Map<QName, PropertyValue> values = new HashMap<QName, PropertyValue>();
for (QName qName : properties.keySet())
@@ -1053,6 +1090,7 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
fAVMService.setNodeProperties((String)avmVersionPath[1], values);
// Invoke policy behaviors.
invokeOnUpdateNode(nodeRef);
invokeOnUpdateProperties(nodeRef, oldProps, properties);
}
catch (AVMNotFoundException e)
{
@@ -1115,7 +1153,6 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
{
throw new InvalidNodeRefException("Read only store.", nodeRef);
}
// TODO Just until we can set built in properties on AVM Nodes.
if (isBuiltInProperty(qname))
{
if (qname.equals(ContentModel.PROP_CONTENT))
@@ -1133,9 +1170,12 @@ public class AVMNodeService extends AbstractNodeServiceImpl implements NodeServi
}
try
{
Map<QName, Serializable> propsBefore = getProperties(nodeRef);
fAVMService.setNodeProperty((String)avmVersionPath[1], qname, new PropertyValue(null, value));
Map<QName, Serializable> propsAfter = getProperties(nodeRef);
// Invoke policy behaviors.
invokeOnUpdateNode(nodeRef);
invokeOnUpdateProperties(nodeRef, propsBefore, propsAfter);
}
catch (AVMNotFoundException e)
{

View File

@@ -41,6 +41,7 @@ import org.alfresco.service.cmr.avm.LayeringDescriptor;
import org.alfresco.service.cmr.avm.VersionDescriptor;
import org.alfresco.service.cmr.repository.ContentData;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.Pair;
import org.apache.log4j.Logger;
/**
@@ -923,6 +924,76 @@ public class AVMRepository
return dirNode.lookupChild(dir, name, includeDeleted);
}
/**
* Get all the paths to a particular node.
* @param desc The node descriptor.
* @return The list of version, paths.
*/
public List<Pair<Integer, String>> getPaths(AVMNodeDescriptor desc)
{
AVMNode node = AVMContext.fgInstance.fAVMNodeDAO.getByID(desc.getId());
List<Pair<Integer, String>> paths = new ArrayList<Pair<Integer, String>>();
List<String> components = new ArrayList<String>();
recursiveGetPaths(node, components, paths);
return paths;
}
private void recursiveGetPaths(AVMNode node, List<String> components,
List<Pair<Integer, String>> paths)
{
if (node.getIsRoot())
{
AVMStore store = AVMContext.fgInstance.fAVMStoreDAO.getByRoot(node);
if (store != null)
{
addPath(components, -1, store.getName(), paths);
return;
}
VersionRoot vr = AVMContext.fgInstance.fVersionRootDAO.getByRoot(node);
if (vr != null)
{
addPath(components, vr.getVersionID(), vr.getAvmStore().getName(), paths);
}
return;
}
List<ChildEntry> entries = AVMContext.fgInstance.fChildEntryDAO.getByChild(node);
for (ChildEntry entry : entries)
{
String name = entry.getName();
components.add(name);
AVMNode parent = entry.getParent();
recursiveGetPaths(parent, components, paths);
components.remove(components.size() - 1);
}
}
/**
* Add a path to the list.
* @param components The path name components.
* @param version The version id.
* @param storeName The name of the
* @param paths The List to add to.
*/
private void addPath(List<String> components, int version, String storeName,
List<Pair<Integer, String>> paths)
{
StringBuilder pathBuilder = new StringBuilder();
pathBuilder.append(storeName);
pathBuilder.append(":");
if (components.size() == 0)
{
pathBuilder.append("/");
paths.add(new Pair<Integer, String>(version, pathBuilder.toString()));
return;
}
for (int i = components.size() - 1; i >= 0; i--)
{
pathBuilder.append("/");
pathBuilder.append(components.get(i));
}
paths.add(new Pair<Integer, String>(version, pathBuilder.toString()));
}
/**
* Get information about layering of a path.
* @param version The version to look under.

View File

@@ -41,6 +41,7 @@ import org.alfresco.service.cmr.avm.LayeringDescriptor;
import org.alfresco.service.cmr.avm.VersionDescriptor;
import org.alfresco.service.cmr.repository.ContentData;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.Pair;
import org.alfresco.util.TempFileProvider;
import org.apache.log4j.Logger;
@@ -567,6 +568,21 @@ public class AVMServiceImpl implements AVMService
}
}
/**
* Get a list of all paths that a given node has.
* @param desc The node descriptor to get paths for.
* @return A List of version, path Pairs.
*/
public List<Pair<Integer, String>> getPaths(AVMNodeDescriptor desc)
{
if (desc == null)
{
throw new AVMBadArgumentException("Descriptor is null.");
}
return fAVMRepository.getPaths(desc);
}
/**
* Purge an AVMStore. Permanently delete everything that
* is only referenced in that AVMStore.

View File

@@ -56,6 +56,7 @@ import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.transaction.TransactionService;
import org.alfresco.util.GUID;
import org.alfresco.util.Pair;
/**
* Big test of AVM behavior.
@@ -63,6 +64,31 @@ import org.alfresco.util.GUID;
*/
public class AVMServiceTest extends AVMServiceTestBase
{
/**
* Test getting all paths for a node.
*
*/
public void testGetPaths()
{
try
{
setupBasicTree();
fService.createBranch(-1, "main:/a", "main:/", "abranch");
fService.createSnapshot("main");
fService.createBranch(-1, "main:/a/b", "main:/", "bbranch");
List<Pair<Integer, String>> paths = fService.getPaths(fService.lookup(-1, "main:/a/b/c/foo"));
for (Pair<Integer, String> path : paths)
{
System.out.println(path.getFirst() + " " + path.getSecond());
}
}
catch (Exception e)
{
e.printStackTrace(System.err);
fail();
}
}
/**
* Test partial flatten.
*/
@@ -85,6 +111,7 @@ public class AVMServiceTest extends AVMServiceTestBase
assertTrue(b.isLayeredDirectory());
AVMNodeDescriptor c = fService.lookup(-1, "layer:/a/b/c");
assertTrue(c.isPlainDirectory());
assertEquals(1, fSyncService.compare(-1, "layer:/a", -1, "main:/a").size());
}
catch (Exception e)
{

View File

@@ -50,6 +50,13 @@ public interface AVMStoreDAO
*/
public AVMStore getByName(String name);
/**
* Get the AVM Store that has the given root as HEAD.
* @param root The root to query.
* @return The matching store or null.
*/
public AVMStore getByRoot(AVMNode root);
/**
* Update the given AVMStore record.
* @param rep The dirty AVMStore.

View File

@@ -54,6 +54,13 @@ public interface ChildEntryDAO
*/
public ChildEntry getByParentChild(DirectoryNode parent, AVMNode child);
/**
* Get all the ChildEntries corresponding to the given child.
* @param child The child for which to look up entries.
* @return The matching entries.
*/
public List<ChildEntry> getByChild(AVMNode child);
/**
* Update a dirty ChildEntry.
* @param child The dirty entry.

View File

@@ -53,6 +53,13 @@ public interface VersionRootDAO
*/
public VersionRoot getByVersionID(AVMStore store, int id);
/**
* Get one from its root.
* @param root The root to match.
* @return The version root or null.
*/
public VersionRoot getByRoot(AVMNode root);
/**
* Get the version of a store by dates.
* @param store The store.

View File

@@ -92,7 +92,6 @@ public class SimpleAVMSubmitAction extends ActionExecuterAbstractBase
Object [] avmVersionPath = AVMNodeConverter.ToAVMVersionPath(actionedUponNodeRef);
int version = (Integer)avmVersionPath[0];
String path = (String)avmVersionPath[1];
fgLogger.error(path);
// Get store name and path parts.
String [] storePath = path.split(":");
if (storePath.length != 2)

View File

@@ -19,6 +19,7 @@ package org.alfresco.repo.avm.hibernate;
import java.util.List;
import org.alfresco.repo.avm.AVMNode;
import org.alfresco.repo.avm.AVMStore;
import org.alfresco.repo.avm.AVMStoreDAO;
import org.alfresco.repo.avm.AVMStoreImpl;
@@ -78,7 +79,20 @@ class AVMStoreDAOHibernate extends HibernateDaoSupport implements
{
return (AVMStore)getSession().get(AVMStoreImpl.class, name);
}
/**
* Get the AVM Store that has the given root as HEAD.
* @param root The root to query.
* @return The matching store or null.
*/
public AVMStore getByRoot(AVMNode root)
{
Query query = getSession().createQuery("from AVMStoreImpl st " +
"where st.root = :root");
query.setEntity("root", root);
return (AVMStore)query.uniqueResult();
}
/**
* Update the given AVMStore record.
* @param store The dirty AVMStore.

View File

@@ -92,6 +92,20 @@ class ChildEntryDAOHibernate extends HibernateDaoSupport implements
return (ChildEntry)query.uniqueResult();
}
/**
* Get all the ChildEntries corresponding to the given child.
* @param child The child for which to look up entries.
* @return The matching entries.
*/
@SuppressWarnings("unchecked")
public List<ChildEntry> getByChild(AVMNode child)
{
Query query = getSession().createQuery("from ChildEntryImpl ce " +
"where ce.child = :child");
query.setEntity("child", child);
return (List<ChildEntry>)query.list();
}
/**
* Update a dirty ChildEntry.
* @param child The dirty entry.

View File

@@ -20,6 +20,7 @@ package org.alfresco.repo.avm.hibernate;
import java.util.Date;
import java.util.List;
import org.alfresco.repo.avm.AVMNode;
import org.alfresco.repo.avm.AVMStore;
import org.alfresco.repo.avm.VersionRoot;
import org.alfresco.repo.avm.VersionRootDAO;
@@ -128,7 +129,20 @@ class VersionRootDAOHibernate extends HibernateDaoSupport implements
query.setInteger("version", id);
return (VersionRoot)query.uniqueResult();
}
/**
* Get one from its root.
* @param root The root to match.
* @return The version root or null.
*/
public VersionRoot getByRoot(AVMNode root)
{
Query query = getSession().createQuery("from VersionRootImpl vr " +
"where vr.root = :root");
query.setEntity("root", root);
return (VersionRoot)query.uniqueResult();
}
/**
* Get the highest numbered version in a repository.
* @param rep The repository.

View File

@@ -27,6 +27,7 @@ import java.util.SortedMap;
import org.alfresco.repo.domain.PropertyValue;
import org.alfresco.service.cmr.repository.ContentData;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.Pair;
/**
* This is the service interface for the [Alfresco|Addled|Advanced|Aleatoric|Apotheosed|Awful]
@@ -407,6 +408,13 @@ public interface AVMService
*/
public AVMNodeDescriptor lookup(AVMNodeDescriptor dir, String name, boolean includeDeleted);
/**
* Get a list of all paths that a given node has.
* @param desc The node descriptor to get paths for.
* @return A List of version, path Pairs.
*/
public List<Pair<Integer, String>> getPaths(AVMNodeDescriptor desc);
/**
* Get the indirection path for a node in a layered context.
* @param version The version number to get.