diff --git a/source/java/org/alfresco/repo/avm/clt/AVMCltBase.java b/source/java/org/alfresco/repo/avm/clt/AVMCltBase.java index 37201c9686..4beb4f030d 100644 --- a/source/java/org/alfresco/repo/avm/clt/AVMCltBase.java +++ b/source/java/org/alfresco/repo/avm/clt/AVMCltBase.java @@ -75,6 +75,10 @@ public abstract class AVMCltBase int pos = 0; while (pos < args.length) { + if (args[pos].equals("-h")) + { + usage(usageMessage); + } // If the argument is one of the accepted flags then it's // a flag. if (flagArgs.containsKey(args[pos])) @@ -123,5 +127,40 @@ public abstract class AVMCltBase System.exit(1); } + /** + * Utility to split an AVM path into a parent path and a + * base name. + * @param path The path to split. + * @return An array of 1 or 2 Strings representing the parent path + * and the base name, or just the path if the path given is a root path. + */ + protected String[] splitPath(String path) + { + if (path.endsWith(":/")) + { + String [] ret = { path }; + return ret; + } + int lastSlash = path.lastIndexOf("/"); + if (lastSlash == -1) + { + System.err.println("Malformed path: " + path); + fContext.close(); + System.exit(1); + } + String name = path.substring(lastSlash + 1); + String parent = path.substring(0, lastSlash); + if (parent.endsWith(":")) + { + parent = parent + "/"; + } + while (parent.endsWith("/") && !parent.endsWith(":/")) + { + parent = parent.substring(0, parent.length() - 1); + } + String [] ret = { parent, name }; + return ret; + } + protected abstract void run(Map> flags, List args); } diff --git a/source/java/org/alfresco/repo/avm/clt/AVMCopyIn.java b/source/java/org/alfresco/repo/avm/clt/AVMCopyIn.java new file mode 100644 index 0000000000..1ea266005d --- /dev/null +++ b/source/java/org/alfresco/repo/avm/clt/AVMCopyIn.java @@ -0,0 +1,182 @@ +/** + * + */ +package org.alfresco.repo.avm.clt; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.List; +import java.util.Map; + +import org.alfresco.repo.avm.AVMRemoteOutputStream; +import org.alfresco.service.cmr.avm.AVMNodeDescriptor; + +/** + * Like cp from a local filesystem to AVM. + * @author britt + */ +public class AVMCopyIn extends AVMCltBase +{ + private static Object [] flagDefs = { "-r", 0, "-v", 0 }; + + private static String USAGE = "usage: [-r] sourcepath nodepath"; + + private boolean fVerbose; + + /* (non-Javadoc) + * @see org.alfresco.repo.avm.clt.AVMCltBase#run(java.util.Map, java.util.List) + */ + @Override + protected void run(Map> flags, List args) + { + if (flags.containsKey("-v")) + { + fVerbose = true; + } + else + { + fVerbose = false; + } + if (flags.containsKey("-r")) + { + recursiveCopy(args.get(0), args.get(1)); + return; + } + File file = new File(args.get(0)); + if (!file.isFile()) + { + System.err.println(args.get(0) + " not found, or not a file."); + fContext.close(); + System.exit(1); + } + AVMNodeDescriptor desc = fAVMRemote.lookup(-1, args.get(1)); + if (desc == null) + { + try + { + String [] pathBase = splitPath(args.get(1)); + if (pathBase.length == 1) + { + System.err.println(args.get(1) + " is a root path."); + fContext.close(); + System.exit(1); + } + if (fVerbose) + { + System.out.println(file.getName() + " -> " + pathBase[0]); + } + InputStream in = + new FileInputStream(file); + OutputStream out = + new AVMRemoteOutputStream(fAVMRemote.createFile(pathBase[0], pathBase[1]), + fAVMRemote); + copyStream(in, out); + } + catch (IOException e) + { + e.printStackTrace(); + fContext.close(); + System.exit(1); + } + } + else + { + if (!desc.isDirectory()) + { + System.err.println("Target must be a directory."); + fContext.close(); + System.exit(1); + } + try + { + if (fVerbose) + { + System.out.println(file.getName() + " -> " + args.get(1)); + } + InputStream in = + new FileInputStream(file); + OutputStream out = + new AVMRemoteOutputStream(fAVMRemote.createFile(args.get(1), + file.getName()), fAVMRemote); + copyStream(in, out); + } + catch (IOException e) + { + e.printStackTrace(); + fContext.close(); + System.exit(1); + } + } + } + + private void copyStream(InputStream in, OutputStream out) + { + try + { + byte [] buff = new byte[8192]; + int read = 0; + while ((read = in.read(buff)) != -1) + { + out.write(buff, 0, read); + } + in.close(); + out.close(); + } + catch (IOException e) + { + e.printStackTrace(); + fContext.close(); + System.exit(1); + } + } + + private void recursiveCopy(String sourcePath, String dest) + { + File file = new File(sourcePath); + if (fVerbose) + { + System.out.println(sourcePath + " -> " + dest); + } + if (file.isDirectory()) + { + fAVMRemote.createDirectory(dest, file.getName()); + String newDest = dest + '/' + file.getName(); + String [] names = file.list(); + for (String name : names) + { + recursiveCopy(sourcePath + File.separatorChar + name, + newDest); + } + } + else + { + try + { + InputStream in = + new FileInputStream(file); + OutputStream out = + new AVMRemoteOutputStream(fAVMRemote.createFile(dest, file.getName()), + fAVMRemote); + copyStream(in, out); + } + catch (IOException e) + { + e.printStackTrace(); + fContext.close(); + System.exit(1); + } + } + } + + /** + * @param args + */ + public static void main(String[] args) + { + AVMCopyIn me = new AVMCopyIn(); + me.exec(args, flagDefs, 2, USAGE); + } +} diff --git a/source/java/org/alfresco/repo/avm/clt/AVMMkDir.java b/source/java/org/alfresco/repo/avm/clt/AVMMkDir.java new file mode 100644 index 0000000000..3970e7933c --- /dev/null +++ b/source/java/org/alfresco/repo/avm/clt/AVMMkDir.java @@ -0,0 +1,68 @@ +/** + * + */ +package org.alfresco.repo.avm.clt; + +import java.util.List; +import java.util.Map; + +import org.alfresco.service.cmr.avm.AVMNodeDescriptor; + +/** + * Make a directory. + * @author britt + */ +public class AVMMkDir extends AVMCltBase +{ + private static Object [] flagDefs = { "-p", 0 }; + + private static String USAGE = "usage: AVMMkDir [-p] nodepath"; + + /* (non-Javadoc) + * @see org.alfresco.repo.avm.clt.AVMCltBase#run(java.util.Map, java.util.List) + */ + @Override + protected void run(Map> flags, List args) + { + if (flags.containsKey("-p")) + { + mkdirp(args.get(0)); + return; + } + String [] parentBase = splitPath(args.get(0)); + if (parentBase.length == 1) + { + System.err.println(args.get(0) + " is a root path."); + fContext.close(); + System.exit(1); + } + fAVMRemote.createDirectory(parentBase[0], parentBase[1]); + } + + private void mkdirp(String path) + { + AVMNodeDescriptor desc = fAVMRemote.lookup(-1, path); + if (desc != null) + { + return; + } + String [] parentBase = splitPath(path); + if (parentBase.length == 1) + { + System.err.println(path + " does not exist."); + fContext.close(); + System.exit(1); + } + mkdirp(parentBase[0]); + fAVMRemote.createDirectory(parentBase[0], parentBase[1]); + } + + /** + * @param args + */ + public static void main(String[] args) + { + AVMMkDir me = new AVMMkDir(); + me.exec(args, flagDefs, 1, USAGE); + } +} diff --git a/source/java/org/alfresco/repo/avm/clt/AVMRm.java b/source/java/org/alfresco/repo/avm/clt/AVMRm.java new file mode 100644 index 0000000000..bc8a5bb62a --- /dev/null +++ b/source/java/org/alfresco/repo/avm/clt/AVMRm.java @@ -0,0 +1,40 @@ +/** + * + */ +package org.alfresco.repo.avm.clt; + +import java.util.List; +import java.util.Map; + +/** + * Remove an AVM Node. + * @author britt + */ +public class AVMRm extends AVMCltBase +{ + private static Object [] flagDefs = { }; + + private static String USAGE = "usage: AVMRm nodepath"; + + /* (non-Javadoc) + * @see org.alfresco.repo.avm.clt.AVMCltBase#run(java.util.Map, java.util.List) + */ + @Override + protected void run(Map> flags, List args) + { + String [] pathBase = splitPath(args.get(0)); + if (pathBase.length == 1) + { + System.err.println("One cannot remove a root node."); + fContext.close(); + System.exit(1); + } + fAVMRemote.removeNode(pathBase[0], pathBase[1]); + } + + public static void main(String[] args) + { + AVMRm me = new AVMRm(); + me.exec(args, flagDefs, 1, USAGE); + } +} diff --git a/source/java/org/alfresco/repo/avm/clt/AVMSnapshot.java b/source/java/org/alfresco/repo/avm/clt/AVMSnapshot.java new file mode 100644 index 0000000000..cc5d4415ed --- /dev/null +++ b/source/java/org/alfresco/repo/avm/clt/AVMSnapshot.java @@ -0,0 +1,36 @@ +/** + * + */ +package org.alfresco.repo.avm.clt; + +import java.util.List; +import java.util.Map; + +/** + * Snapshot a store. + * @author britt + */ +public class AVMSnapshot extends AVMCltBase +{ + private static Object [] flagDefs = { }; + + private static String USAGE = "usage: AVMSnapshot 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) + { + fAVMRemote.createSnapshot(args.get(0)); + } + + /** + * @param args + */ + public static void main(String[] args) + { + AVMSnapshot me = new AVMSnapshot(); + me.exec(args, flagDefs, 1, USAGE); + } +}