From 03a93a3cf7051c03b6d396c620ec4df51c12f075 Mon Sep 17 00:00:00 2001 From: Britt Park Date: Sun, 3 Dec 2006 03:55:49 +0000 Subject: [PATCH] Added a method to AVMService and its dependent services to get an InputStream directly from a node descriptor. It's a minor optimization for a few use scenarios. It's also convenient for accessing content of historical file versions directly. Another CLT, to list the versions of a store. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@4496 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/avm-services-context.xml | 3 ++ .../java/org/alfresco/repo/avm/AVMRemote.java | 11 +++++- .../org/alfresco/repo/avm/AVMRemoteLocal.java | 12 +++++- .../alfresco/repo/avm/AVMRemoteTransport.java | 10 ++++- .../repo/avm/AVMRemoteTransportService.java | 21 +++++++++- .../org/alfresco/repo/avm/AVMRepository.java | 32 +++++++++++++++ .../org/alfresco/repo/avm/AVMServiceImpl.java | 15 +++++++ .../repo/avm/LayeredFileNodeImpl.java | 1 + .../org/alfresco/repo/avm/clt/AVMCopyOut.java | 8 ++-- .../alfresco/repo/avm/clt/AVMLsVersions.java | 39 +++++++++++++++++++ .../alfresco/repo/avm/clt/AVMRemoteImpl.java | 13 ++++++- .../alfresco/repo/avm/clt/AVMSnapshot.java | 6 +-- .../alfresco/service/cmr/avm/AVMService.java | 8 ++++ 13 files changed, 163 insertions(+), 16 deletions(-) create mode 100644 source/java/org/alfresco/repo/avm/clt/AVMLsVersions.java diff --git a/config/alfresco/avm-services-context.xml b/config/alfresco/avm-services-context.xml index 750e0b9413..ad06e1b88f 100644 --- a/config/alfresco/avm-services-context.xml +++ b/config/alfresco/avm-services-context.xml @@ -175,6 +175,9 @@ + + + diff --git a/source/java/org/alfresco/repo/avm/AVMRemote.java b/source/java/org/alfresco/repo/avm/AVMRemote.java index bb38ef6a7d..974a47b9d3 100644 --- a/source/java/org/alfresco/repo/avm/AVMRemote.java +++ b/source/java/org/alfresco/repo/avm/AVMRemote.java @@ -42,10 +42,17 @@ public interface AVMRemote * to a server side input stream. * @param version The version to look under. * @param path The path to the file. - * @return A handle. + * @return An InputStream. */ public InputStream getFileInputStream(int version, String path); + /** + * Get an InputStream from a descriptor directly. + * @param desc The descriptor. + * @return An InputStream. + */ + public InputStream getFileInputStream(AVMNodeDescriptor desc); + /** * Get an opaque handle to a server side output stream. * @param path The path to the existing file. @@ -182,7 +189,7 @@ public interface AVMRemote * @param store The name of the AVMStore to snapshot. * @return The version id of the new snapshot. */ - public int createSnapshot(String store); + public int createSnapshot(String store, String label, String comment); /** * Get a List of all versions in a given store. diff --git a/source/java/org/alfresco/repo/avm/AVMRemoteLocal.java b/source/java/org/alfresco/repo/avm/AVMRemoteLocal.java index 28d7fa8a79..cb35a21543 100644 --- a/source/java/org/alfresco/repo/avm/AVMRemoteLocal.java +++ b/source/java/org/alfresco/repo/avm/AVMRemoteLocal.java @@ -97,9 +97,9 @@ public class AVMRemoteLocal implements AVMRemote /* (non-Javadoc) * @see org.alfresco.repo.avm.AVMRemote#createSnapshot(java.lang.String) */ - public int createSnapshot(String store) + public int createSnapshot(String store, String label, String comment) { - return fService.createSnapshot(store, null, null); + return fService.createSnapshot(store, label, comment); } /* (non-Javadoc) @@ -219,6 +219,14 @@ public class AVMRemoteLocal implements AVMRemote return fService.getFileInputStream(version, path); } + /* (non-Javadoc) + * @see org.alfresco.repo.avm.AVMRemote#getFileInputStream(org.alfresco.service.cmr.avm.AVMNodeDescriptor) + */ + public InputStream getFileInputStream(AVMNodeDescriptor desc) + { + return fService.getFileInputStream(desc); + } + /* (non-Javadoc) * @see org.alfresco.repo.avm.AVMRemote#getFileOutputStream(java.lang.String) */ diff --git a/source/java/org/alfresco/repo/avm/AVMRemoteTransport.java b/source/java/org/alfresco/repo/avm/AVMRemoteTransport.java index 9eaef6ce21..36a1802c9e 100644 --- a/source/java/org/alfresco/repo/avm/AVMRemoteTransport.java +++ b/source/java/org/alfresco/repo/avm/AVMRemoteTransport.java @@ -31,6 +31,14 @@ public interface AVMRemoteTransport */ public String getInputHandle(String ticket, int version, String path); + /** + * Get an input handle from a descriptor. + * @param ticket The authentication ticket. + * @param desc The descriptor. + * @return An input handle. + */ + public String getInputHandle(String ticket, AVMNodeDescriptor desc); + /** * Read a chunk of data from a handle. * @param handle The opaque input stream handle. @@ -199,7 +207,7 @@ public interface AVMRemoteTransport * @param store The name of the AVMStore to snapshot. * @return The version id of the new snapshot. */ - public int createSnapshot(String ticket, String store); + public int createSnapshot(String ticket, String store, String label, String comment); /** * Get a List of all versions in a given store. diff --git a/source/java/org/alfresco/repo/avm/AVMRemoteTransportService.java b/source/java/org/alfresco/repo/avm/AVMRemoteTransportService.java index f7470c417b..c43916380b 100644 --- a/source/java/org/alfresco/repo/avm/AVMRemoteTransportService.java +++ b/source/java/org/alfresco/repo/avm/AVMRemoteTransportService.java @@ -250,6 +250,23 @@ public class AVMRemoteTransportService implements AVMRemoteTransport, Runnable return handle; } + /* (non-Javadoc) + * @see org.alfresco.repo.avm.AVMRemoteTransport#getInputHandle(java.lang.String, org.alfresco.service.cmr.avm.AVMNodeDescriptor) + */ + public String getInputHandle(String ticket, AVMNodeDescriptor desc) + { + fAuthService.validate(ticket); + InputStream in = fAVMService.getFileInputStream(desc); + String handle = GUID.generate(); + synchronized (this) + { + fInputStreams.put(handle, in); + fInputLastAccessTimes.put(handle, System.currentTimeMillis()); + fInputBusy.put(handle, false); + } + return handle; + } + /** * Read a chunk of data from a handle. * @param handle The opaque input stream handle. @@ -611,10 +628,10 @@ public class AVMRemoteTransportService implements AVMRemoteTransport, Runnable * @param store The name of the AVMStore to snapshot. * @return The version id of the new snapshot. */ - public int createSnapshot(String ticket, String store) + public int createSnapshot(String ticket, String store, String label, String comment) { fAuthService.validate(ticket); - return fAVMService.createSnapshot(store, null, null); + return fAVMService.createSnapshot(store, label, comment); } /** diff --git a/source/java/org/alfresco/repo/avm/AVMRepository.java b/source/java/org/alfresco/repo/avm/AVMRepository.java index cb577bebcf..e096ea840a 100644 --- a/source/java/org/alfresco/repo/avm/AVMRepository.java +++ b/source/java/org/alfresco/repo/avm/AVMRepository.java @@ -27,6 +27,7 @@ import java.util.List; import java.util.Map; import java.util.SortedMap; +import org.alfresco.repo.content.ContentStore; import org.alfresco.repo.domain.DbAccessControlList; import org.alfresco.repo.domain.PropertyValue; import org.alfresco.service.cmr.avm.AVMBadArgumentException; @@ -41,6 +42,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.cmr.repository.ContentReader; +import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.namespace.QName; import org.alfresco.util.Pair; @@ -75,6 +77,11 @@ public class AVMRepository */ private Issuer fLayerIssuer; + /** + * Reference to the ContentStoreImpl + */ + private ContentStore fContentStore; + /** * The Lookup Cache instance. */ @@ -107,6 +114,14 @@ public class AVMRepository fLayerIssuer = layerIssuer; } + /** + * Set the ContentService. + */ + public void setContentStore(ContentStore store) + { + fContentStore = store; + } + /** * Set the Lookup Cache instance. * @param cache The instance to set. @@ -798,6 +813,23 @@ public class AVMRepository } } + public InputStream getInputStream(AVMNodeDescriptor desc) + { + AVMNode node = AVMDAOs.Instance().fAVMNodeDAO.getByID(desc.getId()); + if (!(node instanceof FileNode)) + { + throw new AVMWrongTypeException(desc + " is not a File."); + } + FileNode file = (FileNode)node; + ContentData data = file.getContentData(null); + if (data == null) + { + throw new AVMException(desc + " has no content."); + } + ContentReader reader = fContentStore.getReader(data.getContentUrl()); + return reader.getContentInputStream(); + } + /** * Get a listing of a directory. * @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 26622cf3b2..287c80630e 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceImpl.java @@ -108,6 +108,21 @@ public class AVMServiceImpl implements AVMService return fAVMRepository.getInputStream(version, path); } + /** + * Get an InputStream from a descriptor. + * @param desc The descriptor. + * @return An InputStream. + * @throws AVMNotFoundException + */ + public InputStream getFileInputStream(AVMNodeDescriptor desc) + { + if (desc == null) + { + throw new AVMBadArgumentException("Illegal Null Argument."); + } + return fAVMRepository.getInputStream(desc); + } + /** * Get an output stream to a file. Triggers versioning. */ diff --git a/source/java/org/alfresco/repo/avm/LayeredFileNodeImpl.java b/source/java/org/alfresco/repo/avm/LayeredFileNodeImpl.java index 89127489d3..1c3a9040fc 100644 --- a/source/java/org/alfresco/repo/avm/LayeredFileNodeImpl.java +++ b/source/java/org/alfresco/repo/avm/LayeredFileNodeImpl.java @@ -247,6 +247,7 @@ class LayeredFileNodeImpl extends FileNodeImpl implements LayeredFileNode throw new AVMException("Should not be called."); } + // TODO The lPath argument is unnecessary. /** * Get the ContentData for this file. * @return The ContentData object for this file. diff --git a/source/java/org/alfresco/repo/avm/clt/AVMCopyOut.java b/source/java/org/alfresco/repo/avm/clt/AVMCopyOut.java index b6ef4e5704..ca030ddd0d 100644 --- a/source/java/org/alfresco/repo/avm/clt/AVMCopyOut.java +++ b/source/java/org/alfresco/repo/avm/clt/AVMCopyOut.java @@ -50,7 +50,7 @@ public class AVMCopyOut extends AVMCltBase AVMNodeDescriptor desc = fAVMRemote.lookup(version, path); if (flags.containsKey("-r")) { - recursiveCopy(version, desc, args.get(1)); + recursiveCopy(desc, args.get(1)); return; } if (desc == null) @@ -105,7 +105,7 @@ public class AVMCopyOut extends AVMCltBase } } - private void recursiveCopy(int version, AVMNodeDescriptor src, String dst) + private void recursiveCopy(AVMNodeDescriptor src, String dst) { String newDst = dst + File.separator + src.getName(); if (fVerbose) @@ -119,13 +119,13 @@ public class AVMCopyOut extends AVMCltBase Map listing = fAVMRemote.getDirectoryListing(src); for (AVMNodeDescriptor child : listing.values()) { - recursiveCopy(version, child, newDst); + recursiveCopy(child, newDst); } return; } try { - InputStream in = fAVMRemote.getFileInputStream(version, src.getPath()); + InputStream in = fAVMRemote.getFileInputStream(src); OutputStream out = new FileOutputStream(newDst); copyStream(in, out); } diff --git a/source/java/org/alfresco/repo/avm/clt/AVMLsVersions.java b/source/java/org/alfresco/repo/avm/clt/AVMLsVersions.java new file mode 100644 index 0000000000..2ebb866de2 --- /dev/null +++ b/source/java/org/alfresco/repo/avm/clt/AVMLsVersions.java @@ -0,0 +1,39 @@ +/** + * + */ +package org.alfresco.repo.avm.clt; + +import java.util.List; +import java.util.Map; + +import org.alfresco.service.cmr.avm.VersionDescriptor; + +/** + * List all versions of a given store. + * @author britt + */ +public class AVMLsVersions extends AVMCltBase +{ + private static Object [] flagDefs = { }; + + private static String USAGE = "usage: AVMLsVersion storename"; + + /* (non-Javadoc) + * @see org.alfresco.repo.avm.clt.AVMCltBase#run(java.util.Map, java.util.List) + */ + @Override + protected void run(Map> flags, List args) + { + List versions = fAVMRemote.getAVMStoreVersions(args.get(0)); + for (VersionDescriptor version : versions) + { + System.out.println(version); + } + } + + public static void main(String[] args) + { + AVMLsVersions me = new AVMLsVersions(); + me.exec(args, flagDefs, 1, USAGE); + } +} diff --git a/source/java/org/alfresco/repo/avm/clt/AVMRemoteImpl.java b/source/java/org/alfresco/repo/avm/clt/AVMRemoteImpl.java index 5ae14e066e..bc3b5200a5 100644 --- a/source/java/org/alfresco/repo/avm/clt/AVMRemoteImpl.java +++ b/source/java/org/alfresco/repo/avm/clt/AVMRemoteImpl.java @@ -101,9 +101,9 @@ public class AVMRemoteImpl implements AVMRemote /* (non-Javadoc) * @see org.alfresco.repo.avm.AVMRemote#createSnapshot(java.lang.String) */ - public int createSnapshot(String store) + public int createSnapshot(String store, String label, String comment) { - return fTransport.createSnapshot(ClientTicketHolder.GetTicket(), store); + return fTransport.createSnapshot(ClientTicketHolder.GetTicket(), store, label, comment); } /* (non-Javadoc) @@ -224,6 +224,15 @@ public class AVMRemoteImpl implements AVMRemote fTransport); } + /* (non-Javadoc) + * @see org.alfresco.repo.avm.AVMRemote#getFileInputStream(org.alfresco.service.cmr.avm.AVMNodeDescriptor) + */ + public InputStream getFileInputStream(AVMNodeDescriptor desc) + { + return new AVMRemoteInputStream(fTransport.getInputHandle(ClientTicketHolder.GetTicket(), desc), + fTransport); + } + /* (non-Javadoc) * @see org.alfresco.repo.avm.AVMRemote#getFileOutputStream(java.lang.String) */ diff --git a/source/java/org/alfresco/repo/avm/clt/AVMSnapshot.java b/source/java/org/alfresco/repo/avm/clt/AVMSnapshot.java index cc5d4415ed..c7b33426b6 100644 --- a/source/java/org/alfresco/repo/avm/clt/AVMSnapshot.java +++ b/source/java/org/alfresco/repo/avm/clt/AVMSnapshot.java @@ -14,7 +14,7 @@ public class AVMSnapshot extends AVMCltBase { private static Object [] flagDefs = { }; - private static String USAGE = "usage: AVMSnapshot storename"; + private static String USAGE = "usage: AVMSnapshot storename label comment"; /* (non-Javadoc) * @see org.alfresco.repo.avm.clt.AVMCltBase#run(java.util.Map, java.util.List) @@ -22,7 +22,7 @@ public class AVMSnapshot extends AVMCltBase @Override protected void run(Map> flags, List args) { - fAVMRemote.createSnapshot(args.get(0)); + fAVMRemote.createSnapshot(args.get(0), args.get(1), args.get(2)); } /** @@ -31,6 +31,6 @@ public class AVMSnapshot extends AVMCltBase public static void main(String[] args) { AVMSnapshot me = new AVMSnapshot(); - me.exec(args, flagDefs, 1, USAGE); + me.exec(args, flagDefs, 3, USAGE); } } diff --git a/source/java/org/alfresco/service/cmr/avm/AVMService.java b/source/java/org/alfresco/service/cmr/avm/AVMService.java index f98d96b994..47d480c21b 100644 --- a/source/java/org/alfresco/service/cmr/avm/AVMService.java +++ b/source/java/org/alfresco/service/cmr/avm/AVMService.java @@ -53,6 +53,14 @@ public interface AVMService */ public InputStream getFileInputStream(int version, String path); + /** + * Get an InputStream from a descriptor. + * @param desc The descriptor. + * @return An InputStream. + * @throws AVMNotFoundException + */ + public InputStream getFileInputStream(AVMNodeDescriptor desc); + /** * Get an output stream to a file node. The file must already exist. * @param path The simple absolute path to the file node.