public boolean spooler_process() {
Order order = null;
Variable_set params = null;
SCPClient scpClient = null;
try {
try { // to fetch parameters from orders that have precedence over job parameters
params = spooler_task.params();
if (spooler_task.job().order_queue() != null) {
order = spooler_task.order();
if ( order.params() != null)
params.merge(order.params());
}
// get basic authentication parameters
this.getBaseParameters();
if (params.value("action") != null && params.value("action").length() > 0) {
if (!params.value("action").equalsIgnoreCase("get") && !params.value("action").equalsIgnoreCase("put"))
throw new Exception("invalid action parameter [action] specified, expected get, put: " + params.value("action"));
this.setAction(params.value("action").toLowerCase());
spooler_log.info(".. parameter [action]: " + this.getAction());
} else {
throw new Exception("no action parameter [action] was specified");
}
if (params.value("file_list") != null && params.value("file_list").length() > 0) {
this.setFileList(params.value("file_list"));
spooler_log.info(".. parameter [file_list]: " + this.getFileList());
} else {
if (this.getAction().equals("get")) throw new Exception("action [get] requires filenames being specified as parameter [file_list]");
this.setFileList("");
}
if (params.value("file_spec") != null && params.value("file_spec").length() > 0) {
this.setFileSpec(params.value("file_spec"));
spooler_log.info(".. parameter [file_spec]: " + this.getFileSpec());
} else {
this.setFileSpec("^(.*)$");
}
if (params.value("local_dir") != null && params.value("local_dir").length() > 0) {
this.setLocalDir(this.normalizePath(params.value("local_dir")));
spooler_log.info(".. parameter [local_dir]: " + this.getLocalDir());
} else {
this.setLocalDir(".");
}
if (params.value("remote_dir") != null && params.value("remote_dir").length() > 0) {
this.setRemoteDir(this.normalizePath(params.value("remote_dir")));
spooler_log.info(".. parameter [remote_dir]: " + this.getRemoteDir());
} else {
this.setRemoteDir(".");
}
if (params.value("create_dir") != null && params.value("create_dir").length() > 0) {
if (params.value("create_dir").equalsIgnoreCase("true") || params.value("create_dir").equalsIgnoreCase("yes") || params.value("create_dir").equals("1")) {
this.setCreateDir(true);
} else {
this.setCreateDir(false);
}
spooler_log.info(".. parameter [create_dir]: " + this.isCreateDir());
} else {
this.setCreateDir(true);
}
if (params.value("recursive") != null && params.value("recursive").length() > 0) {
if (params.value("recursive").equalsIgnoreCase("true") || params.value("recursive").equalsIgnoreCase("yes") || params.value("recursive").equals("1")) {
this.setRecursive(true);
} else {
this.setRecursive(false);
}
spooler_log.info(".. parameter [recursive]: " + this.isRecursive());
} else {
this.setRecursive(false);
}
if (params.value("permissions") != null && params.value("permissions").length() > 0) {
try {
this.setPermissions(Integer.parseInt(params.value("permissions")));
spooler_log.info(".. parameter [permissions]: " + this.getPermissions());
} catch (Exception e) {
throw new Exception("illegal octal value for parameter [permissions]: " + params.value("permissions"));
}
} else {
this.setPermissions(0);
}
} catch (Exception e) {
throw new Exception("error occurred processing parameters: " + e.getMessage());
}
try { // to connect, authenticate and process files
this.getBaseAuthentication();
scpClient = new SCPClient(this.getSshConnection());
File localCheckDir = new File(this.getLocalDir());
if (!localCheckDir.exists()) {
if (this.isCreateDir()) {
try {
// TODO use permissions: should no explicit permissions have been set then use the default permissions of the users home directory
localCheckDir.mkdirs();
} catch (Exception e) {
throw new Exception("error occurred creating local directory [" + this.getLocalDir() + "]: " + e.getMessage());
}
} else {
throw new Exception("local directory does not exist: " + this.getLocalDir());
}
}
// we know what we do: either String or File objects are stored in this Vector
if (this.getFileList() != null && this.getFileList().length() > 0) {
// list of files for get or put operations
this.setFilenames(new Vector(Arrays.asList(this.getFileList().split(";"))));
} else {
// list of files for put operations only
this.setFilenames(SOSFile.getFilelist( new File(this.getLocalDir()).getAbsolutePath(), this.getFileSpec(), java.util.regex.Pattern.MULTILINE,this.isRecursive()));
}
int count = 0;
for(int i=0; i<this.getFilenames().size(); i++) {
try {
String filename = null;
if (this.getFileList() != null && this.getFileList().length() > 0) {
filename = (String) this.getFilenames().get(i);
} else {
filename = ((File) this.getFilenames().get(i)).getAbsolutePath();
}
if (this.getAction().equals("get")) {
if (this.getRemoteDir() != null && !this.getRemoteDir().equals(".")
&& !filename.startsWith("/") && !filename.startsWith(":\\", 1))
filename = this.getRemoteDir() + "/" + filename;
spooler_log.info("file to receive: " + filename);
} else {
if (this.getLocalDir() != null && !this.getLocalDir().equals(".")
&& !filename.startsWith("/") && !filename.startsWith(":\\", 1))
filename = this.getLocalDir() + "/" + filename;
spooler_log.info("file to send: " + filename);
}
this.getFilenames().setElementAt(filename, i);
count++;
} catch (Exception e) {
throw new Exception(e.getMessage());
}
}
String[] files = new String[this.getFilenames().size()];
this.getFilenames().toArray(files);
if (this.getAction().equals("get")) {
scpClient.get(files, this.getLocalDir());
} else {
if (this.getPermissions() > 0) {
if ( isRecursive() )
scp_recursive(new File(this.getLocalDir()),this.getRemoteDir(), scpClient);
else
scpClient.put(files, this.getRemoteDir());
} else {
if ( isRecursive() )
scp_recursive(new File(this.getLocalDir()),this.getRemoteDir(), scpClient);
else
scpClient.put(files, this.getRemoteDir());
}
}
switch (count) {
case 0: throw new Exception("no matching files found");