mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-24 17:32:48 +00:00
Added some more CLTs: AVMRm, removes nodes, AVMSnapshot, takes a snapshot of a store,
AVMCopyIn, copies a file or a directory recursively local filesystem to a store, AVMMkDir, creates a directory. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@4478 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -75,6 +75,10 @@ public abstract class AVMCltBase
|
|||||||
int pos = 0;
|
int pos = 0;
|
||||||
while (pos < args.length)
|
while (pos < args.length)
|
||||||
{
|
{
|
||||||
|
if (args[pos].equals("-h"))
|
||||||
|
{
|
||||||
|
usage(usageMessage);
|
||||||
|
}
|
||||||
// If the argument is one of the accepted flags then it's
|
// If the argument is one of the accepted flags then it's
|
||||||
// a flag.
|
// a flag.
|
||||||
if (flagArgs.containsKey(args[pos]))
|
if (flagArgs.containsKey(args[pos]))
|
||||||
@@ -123,5 +127,40 @@ public abstract class AVMCltBase
|
|||||||
System.exit(1);
|
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<String, List<String>> flags, List<String> args);
|
protected abstract void run(Map<String, List<String>> flags, List<String> args);
|
||||||
}
|
}
|
||||||
|
182
source/java/org/alfresco/repo/avm/clt/AVMCopyIn.java
Normal file
182
source/java/org/alfresco/repo/avm/clt/AVMCopyIn.java
Normal file
@@ -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<String, List<String>> flags, List<String> 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);
|
||||||
|
}
|
||||||
|
}
|
68
source/java/org/alfresco/repo/avm/clt/AVMMkDir.java
Normal file
68
source/java/org/alfresco/repo/avm/clt/AVMMkDir.java
Normal file
@@ -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<String, List<String>> flags, List<String> 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);
|
||||||
|
}
|
||||||
|
}
|
40
source/java/org/alfresco/repo/avm/clt/AVMRm.java
Normal file
40
source/java/org/alfresco/repo/avm/clt/AVMRm.java
Normal file
@@ -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<String, List<String>> flags, List<String> 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);
|
||||||
|
}
|
||||||
|
}
|
36
source/java/org/alfresco/repo/avm/clt/AVMSnapshot.java
Normal file
36
source/java/org/alfresco/repo/avm/clt/AVMSnapshot.java
Normal file
@@ -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<String, List<String>> flags, List<String> args)
|
||||||
|
{
|
||||||
|
fAVMRemote.createSnapshot(args.get(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param args
|
||||||
|
*/
|
||||||
|
public static void main(String[] args)
|
||||||
|
{
|
||||||
|
AVMSnapshot me = new AVMSnapshot();
|
||||||
|
me.exec(args, flagDefs, 1, USAGE);
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user