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.