From c45bb470ba6bf397e7fc66d5a821427c12c0a92c Mon Sep 17 00:00:00 2001 From: Britt Park Date: Fri, 26 Jan 2007 16:34:36 +0000 Subject: [PATCH] Added utility method to get a path for an AVM node as quickly as possible. Switched history viewing to use it. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@4944 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/public-services-context.xml | 1 + .../org/alfresco/repo/avm/AVMRemoteLocal.java | 9 +++ .../repo/avm/AVMRemoteTransportService.java | 10 +++ .../org/alfresco/repo/avm/AVMRepository.java | 78 ++++++++++++++++++- .../org/alfresco/repo/avm/AVMServiceImpl.java | 12 +++ .../org/alfresco/repo/avm/AVMServiceTest.java | 1 + .../alfresco/repo/remote/AVMRemoteImpl.java | 9 +++ .../alfresco/service/cmr/avm/AVMService.java | 7 ++ .../service/cmr/remote/AVMRemote.java | 11 ++- .../cmr/remote/AVMRemoteTransport.java | 11 ++- 10 files changed, 143 insertions(+), 6 deletions(-) diff --git a/config/alfresco/public-services-context.xml b/config/alfresco/public-services-context.xml index 2bfb1efdbb..11a9027c0c 100644 --- a/config/alfresco/public-services-context.xml +++ b/config/alfresco/public-services-context.xml @@ -1004,6 +1004,7 @@ getContentDataForRead getAspects hasAspect + getAPath diff --git a/source/java/org/alfresco/repo/avm/AVMRemoteLocal.java b/source/java/org/alfresco/repo/avm/AVMRemoteLocal.java index 2599376b03..9978f18eae 100644 --- a/source/java/org/alfresco/repo/avm/AVMRemoteLocal.java +++ b/source/java/org/alfresco/repo/avm/AVMRemoteLocal.java @@ -18,6 +18,7 @@ import org.alfresco.service.cmr.avm.LayeringDescriptor; import org.alfresco.service.cmr.avm.VersionDescriptor; import org.alfresco.service.cmr.remote.AVMRemote; import org.alfresco.service.namespace.QName; +import org.alfresco.util.Pair; /** * A loopback implementation of the AVMRemote interface? @@ -487,4 +488,12 @@ public class AVMRemoteLocal implements AVMRemote { fService.revert(path, toRevertTo); } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.remote.AVMRemote#getAPath(org.alfresco.service.cmr.avm.AVMNodeDescriptor) + */ + public Pair getAPath(AVMNodeDescriptor desc) + { + return fService.getAPath(desc); + } } diff --git a/source/java/org/alfresco/repo/avm/AVMRemoteTransportService.java b/source/java/org/alfresco/repo/avm/AVMRemoteTransportService.java index 1d2ec8a229..7708879cb1 100644 --- a/source/java/org/alfresco/repo/avm/AVMRemoteTransportService.java +++ b/source/java/org/alfresco/repo/avm/AVMRemoteTransportService.java @@ -24,6 +24,7 @@ import org.alfresco.service.cmr.remote.AVMRemoteTransport; import org.alfresco.service.cmr.security.AuthenticationService; import org.alfresco.service.namespace.QName; import org.alfresco.util.GUID; +import org.alfresco.util.Pair; /** * Implementation of AVMRemoteTransport for the server side. It's @@ -1008,4 +1009,13 @@ public class AVMRemoteTransportService implements AVMRemoteTransport, Runnable fAuthService.validate(ticket); fAVMService.revert(path, toRevertTo); } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.remote.AVMRemoteTransport#getAPath(java.lang.String, org.alfresco.service.cmr.avm.AVMNodeDescriptor) + */ + public Pair getAPath(String ticket, AVMNodeDescriptor desc) + { + fAuthService.validate(ticket); + return fAVMService.getAPath(desc); + } } diff --git a/source/java/org/alfresco/repo/avm/AVMRepository.java b/source/java/org/alfresco/repo/avm/AVMRepository.java index 8adc0a48c8..cfca704470 100644 --- a/source/java/org/alfresco/repo/avm/AVMRepository.java +++ b/source/java/org/alfresco/repo/avm/AVMRepository.java @@ -1254,6 +1254,22 @@ public class AVMRepository return paths; } + /** + * Get a single valid path for a node. + * @param desc The node descriptor. + * @return A version, path + */ + public Pair getAPath(AVMNodeDescriptor desc) + { + AVMNode node = AVMDAOs.Instance().fAVMNodeDAO.getByID(desc.getId()); + if (node == null) + { + throw new AVMNotFoundException("Could not find node: " + desc); + } + List components = new ArrayList(); + return recursiveGetAPath(node, components); + } + /** * Get all paths for a node reachable by HEAD. * @param desc The node descriptor. @@ -1272,6 +1288,13 @@ public class AVMRepository return paths; } + /** + * Get all paths in a particular store in the head version for + * a particular node. + * @param desc The node descriptor. + * @param store The name of the store. + * @return All matching paths. + */ public List> getPathsInStoreHead(AVMNodeDescriptor desc, String store) { AVMStore st = getAVMStoreByName(store); @@ -1325,6 +1348,43 @@ public class AVMRepository } } + /** + * Do the work of getting one path for a node. + * @param node The node to get the path of. + * @param components The storage for path components. + * @return A path or null. + */ + private Pair recursiveGetAPath(AVMNode node, List components) + { + if (node.getIsRoot()) + { + AVMStore store = AVMDAOs.Instance().fAVMStoreDAO.getByRoot(node); + if (store != null) + { + return new Pair(-1, makePath(components, store.getName())); + } + VersionRoot vr = AVMDAOs.Instance().fVersionRootDAO.getByRoot(node); + if (vr != null) + { + return new Pair(vr.getVersionID(), makePath(components, vr.getAvmStore().getName())); + } + return null; + } + List entries = AVMDAOs.Instance().fChildEntryDAO.getByChild(node); + for (ChildEntry entry : entries) + { + String name = entry.getKey().getName(); + components.add(name); + Pair path = recursiveGetAPath(entry.getKey().getParent(), components); + if (path != null) + { + return path; + } + components.remove(components.size() - 1); + } + return null; + } + /** * Do the actual work. * @param node The current node. @@ -1390,6 +1450,17 @@ public class AVMRepository */ private void addPath(List components, int version, String storeName, List> paths) + { + paths.add(new Pair(version, makePath(components, storeName))); + } + + /** + * Helper for generating paths. + * @param components The path components. + * @param storeName The store that the path is in. + * @return The path. + */ + private String makePath(List components, String storeName) { StringBuilder pathBuilder = new StringBuilder(); pathBuilder.append(storeName); @@ -1397,17 +1468,16 @@ public class AVMRepository if (components.size() == 0) { pathBuilder.append("/"); - paths.add(new Pair(version, pathBuilder.toString())); - return; + return pathBuilder.toString(); } for (int i = components.size() - 1; i >= 0; i--) { pathBuilder.append("/"); pathBuilder.append(components.get(i)); } - paths.add(new Pair(version, pathBuilder.toString())); + return pathBuilder.toString(); } - + /** * Get information about layering of a path. * @param version The version to look under. diff --git a/source/java/org/alfresco/repo/avm/AVMServiceImpl.java b/source/java/org/alfresco/repo/avm/AVMServiceImpl.java index d0e5357bc8..de1171654b 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceImpl.java @@ -716,6 +716,18 @@ public class AVMServiceImpl implements AVMService return fAVMRepository.getPaths(desc); } + /* (non-Javadoc) + * @see org.alfresco.service.cmr.avm.AVMService#getAPath(org.alfresco.service.cmr.avm.AVMNodeDescriptor) + */ + public Pair getAPath(AVMNodeDescriptor desc) + { + if (desc == null) + { + throw new AVMBadArgumentException("Descriptor is null."); + } + return fAVMRepository.getAPath(desc); + } + /** * Get all paths that a given node has that are in the head version. * @param desc The node descriptor to get paths for. diff --git a/source/java/org/alfresco/repo/avm/AVMServiceTest.java b/source/java/org/alfresco/repo/avm/AVMServiceTest.java index fef0d386c9..81b7e2142e 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceTest.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceTest.java @@ -295,6 +295,7 @@ public class AVMServiceTest extends AVMServiceTestBase { System.out.println(path.getFirst() + " " + path.getSecond()); } + assertNotNull(fService.getAPath(fService.lookup(-1, "main:/a/b/c/foo"))); } catch (Exception e) { diff --git a/source/java/org/alfresco/repo/remote/AVMRemoteImpl.java b/source/java/org/alfresco/repo/remote/AVMRemoteImpl.java index 96649bbf04..7efa30e77c 100644 --- a/source/java/org/alfresco/repo/remote/AVMRemoteImpl.java +++ b/source/java/org/alfresco/repo/remote/AVMRemoteImpl.java @@ -18,6 +18,7 @@ import org.alfresco.service.cmr.avm.VersionDescriptor; import org.alfresco.service.cmr.remote.AVMRemote; import org.alfresco.service.cmr.remote.AVMRemoteTransport; import org.alfresco.service.namespace.QName; +import org.alfresco.util.Pair; /** * Client side wrapper for AVMRemoteTransport. @@ -491,4 +492,12 @@ public class AVMRemoteImpl implements AVMRemote { fTransport.revert(ClientTicketHolder.GetTicket(), path, toRevertTo); } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.remote.AVMRemote#getAPath(org.alfresco.service.cmr.avm.AVMNodeDescriptor) + */ + public Pair getAPath(AVMNodeDescriptor desc) + { + return fTransport.getAPath(ClientTicketHolder.GetTicket(), desc); + } } diff --git a/source/java/org/alfresco/service/cmr/avm/AVMService.java b/source/java/org/alfresco/service/cmr/avm/AVMService.java index 79b91fff08..5ba403dcee 100644 --- a/source/java/org/alfresco/service/cmr/avm/AVMService.java +++ b/source/java/org/alfresco/service/cmr/avm/AVMService.java @@ -778,6 +778,13 @@ public interface AVMService public List> getPaths(AVMNodeDescriptor desc); + /** + * Get a single valid path to a given node. + * @param desc The node descriptor to get a path for. + * @return AVMNotFoundException + */ + public Pair getAPath(AVMNodeDescriptor desc); + /** * Get all paths that a given node has that are in the * HEAD version ( -1 ). diff --git a/source/java/org/alfresco/service/cmr/remote/AVMRemote.java b/source/java/org/alfresco/service/cmr/remote/AVMRemote.java index 9e69adc80f..654d9d586f 100644 --- a/source/java/org/alfresco/service/cmr/remote/AVMRemote.java +++ b/source/java/org/alfresco/service/cmr/remote/AVMRemote.java @@ -32,6 +32,7 @@ import org.alfresco.service.cmr.avm.AVMStoreDescriptor; import org.alfresco.service.cmr.avm.LayeringDescriptor; import org.alfresco.service.cmr.avm.VersionDescriptor; import org.alfresco.service.namespace.QName; +import org.alfresco.util.Pair; /** * Remote interface for AVM. @@ -452,5 +453,13 @@ public interface AVMRemote * @param toRevertTo The descriptor of the version to revert to. * @throws AVMNotFoundException */ - public void revert(String path, AVMNodeDescriptor toRevertTo); + public void revert(String path, AVMNodeDescriptor toRevertTo); + + /** + * Get a version and path of a node. + * @param desc The descriptor for the node to which we want a path. + * @return version and path. + * @throws AVMNotFoundException + */ + public Pair getAPath(AVMNodeDescriptor desc); } diff --git a/source/java/org/alfresco/service/cmr/remote/AVMRemoteTransport.java b/source/java/org/alfresco/service/cmr/remote/AVMRemoteTransport.java index 77732053a5..6e0069889e 100644 --- a/source/java/org/alfresco/service/cmr/remote/AVMRemoteTransport.java +++ b/source/java/org/alfresco/service/cmr/remote/AVMRemoteTransport.java @@ -16,6 +16,7 @@ import org.alfresco.service.cmr.avm.AVMStoreDescriptor; import org.alfresco.service.cmr.avm.LayeringDescriptor; import org.alfresco.service.cmr.avm.VersionDescriptor; import org.alfresco.service.namespace.QName; +import org.alfresco.util.Pair; /** * This is the actual remote interface that is wrapped by @@ -470,5 +471,13 @@ public interface AVMRemoteTransport * @param toRevertTo The descriptor of the version to revert to. * @throws AVMNotFoundException */ - public void revert(String ticket, String path, AVMNodeDescriptor toRevertTo); + public void revert(String ticket, String path, AVMNodeDescriptor toRevertTo); + + /** + * Get a version and path for a node. + * @param ticket The authentication ticket. + * @param desc The node descriptor for the node we want to get a path to. + * @return version and path. + */ + public Pair getAPath(String ticket, AVMNodeDescriptor desc); }