/********************************************************* begin of preamble
**
** Copyright (C) 2003-2010 Software- und Organisations-Service GmbH.
** All rights reserved.
**
** This file may be used under the terms of either the
**
** GNU General Public License version 2.0 (GPL)
**
** as published by the Free Software Foundation
** http://www.gnu.org/licenses/gpl-2.0.txt and appearing in the file
** LICENSE.GPL included in the packaging of this file.
**
** or the
**
** Agreement for Purchase and Licensing
**
** as offered by Software- und Organisations-Service GmbH
** in the respective terms of supply that ship with this file.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
** IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
** THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
** BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
** POSSIBILITY OF SUCH DAMAGE.
********************************************************** end of preamble*/
package sos.scheduler.job;
import sos.spooler.Job_impl;
import sos.spooler.Variable_set;
import sos.scheduler.command.SOSSchedulerCommand;
import sos.xml.SOSXMLXPath;
public class JobSchedulerRemoteCommandJob extends Job_impl {
/* remote execution parameters */
String host = "";
int port = 0;
int timeout = 0;
String protocol = "";
/* routing parameters */
String command = "";
String jobName = "";
String orderId = "";
/* parameters for jobs and orders */
String at = "";
String webService = "";
/* parameters for jobs only */
String after = "";
/* parameters for orders only */
boolean replace = true;
String jobChain = "";
String priority = "";
String state = "";
String title = "";
String runTime = "";
public void initParameters() throws Exception {
/* remote execution parameters */
this.setHost("localhost");
this.setPort(4444);
this.setProtocol("tcp");
this.setTimeout(15);
/* routing parameters */
this.setJobName("");
this.setOrderId("");
this.setCommand("");
/* parameters for jobs and orders */
this.setAt("");
this.setWebService("");
/* parameters for jobs only */
this.setAfter("");
/* parameters for orders only */
this.setReplace(true);
this.setJobChain("");
this.setPriority("");
this.setState("");
this.setTitle("");
this.setRunTime("");
}
public void getTaskParameters(boolean logValue) throws Exception {
try {
if (spooler_task.params().var("scheduler_remote_host") != null && spooler_task.params().var("scheduler_remote_host").length() > 0) {
this.setHost( spooler_task.params().var("scheduler_remote_host"));
if (logValue) spooler_log.info(".. job parameter [scheduler_remote_host]: " + this.getHost());
}
if (spooler_task.params().var("scheduler_remote_port") != null && spooler_task.params().var("scheduler_remote_port").length() > 0) {
try {
this.setPort(Integer.parseInt(spooler_task.params().var("scheduler_remote_port")));
if (logValue) spooler_log.info(".. job parameter [scheduler_remote_port]: " + this.getPort());
} catch (Exception e) {
throw new Exception("illegal value specified for parameter [scheduler_remote_port], numeric value expected, found: " + spooler_task.params().var("scheduler_remote_port"));
}
}
if (spooler_task.params().var("scheduler_remote_protocol") != null && spooler_task.params().var("scheduler_remote_protocol").length() > 0) {
if (!spooler_task.params().var("scheduler_remote_protocol").equalsIgnoreCase("tcp") && !spooler_task.params().var("scheduler_remote_protocol").equalsIgnoreCase("udp")) {
throw new Exception("illegal value specified for parameter [scheduler_remote_protocol], \"tcp\" or \"udp\" expected, found: " + spooler_task.params().var("scheduler_remote_protocol"));
}
this.setProtocol(spooler_task.params().var("scheduler_remote_protocol"));
if (logValue) spooler_log.info(".. job parameter [scheduler_remote_protocol]: " + this.getProtocol());
}
if (spooler_task.params().var("scheduler_remote_timeout") != null && spooler_task.params().var("scheduler_remote_timeout").length() > 0) {
try {
this.setTimeout(Integer.parseInt(spooler_task.params().var("scheduler_remote_timeout")));
if (logValue) spooler_log.info(".. job parameter [scheduler_remote_timeout]: " + this.getTimeout());
} catch (Exception e) {
throw new Exception("illegal value specified for parameter [scheduler_remote_timeout], numeric value expected, found: " + spooler_task.params().var("scheduler_remote_timeout"));
}
}
/* routing parameters */
if (spooler_task.params().var("scheduler_remote_job") != null && spooler_task.params().var("scheduler_remote_job").length() > 0) {
this.setJobName(spooler_task.params().var("scheduler_remote_job"));
if (logValue) spooler_log.info(".. job parameter [scheduler_remote_job]: " + this.getJobName());
}
if (spooler_task.params().var("scheduler_remote_order") != null && spooler_task.params().var("scheduler_remote_order").length() > 0) {
this.setOrderId(spooler_task.params().var("scheduler_remote_order"));
if (logValue) spooler_log.info(".. job parameter [scheduler_remote_order]: " + this.getOrderId());
}
if (spooler_task.params().var("scheduler_remote_command") != null && spooler_task.params().var("scheduler_remote_command").length() > 0) {
this.setCommand(spooler_task.params().var("scheduler_remote_command"));
if (logValue) spooler_log.info(".. job parameter [scheduler_remote_command]: " + this.getCommand());
}
/* parameters for jobs and orders */
if (spooler_task.params().var("scheduler_remote_start_at") != null && spooler_task.params().var("scheduler_remote_start_at").length() > 0) {
this.setAt(spooler_task.params().var("scheduler_remote_start_at"));
if (logValue) spooler_log.info(".. job parameter [scheduler_remote_start_at]: " + this.getAt());
}
if (spooler_task.params().var("scheduler_remote_web_service") != null && spooler_task.params().var("scheduler_remote_web_service").length() > 0) {
this.setWebService(spooler_task.params().var("scheduler_remote_web_service"));
if (logValue) spooler_log.info(".. job parameter [scheduler_remote_web_service]: " + this.getWebService());
}
/** parameters for jobs */
if (spooler_task.params().var("scheduler_remote_job_start_after") != null && spooler_task.params().var("scheduler_remote_job_start_after").length() > 0) {
this.setAfter(spooler_task.params().var("scheduler_remote_job_start_after"));
if (logValue) spooler_log.info(".. job parameter [scheduler_remote_job_start_after]: " + this.getAfter());
}
/* parameters for orders */
if (spooler_task.params().var("scheduler_remote_order_replace") != null && spooler_task.params().var("scheduler_remote_order_replace").length() > 0) {
if (spooler_task.params().var("scheduler_remote_order_replace").equalsIgnoreCase("yes")
|| spooler_task.params().var("scheduler_remote_order_replace").equalsIgnoreCase("true")
|| spooler_task.params().var("scheduler_remote_order_replace").equals("1")) {
this.setReplace(true);
} else {
this.setReplace(false);
}
if (logValue) spooler_log.info(".. job parameter [scheduler_remote_order_replace]: " + this.isReplace());
}
if (spooler_task.params().var("scheduler_remote_order_job_chain") != null && spooler_task.params().var("scheduler_remote_order_job_chain").length() > 0) {
this.setJobChain(spooler_task.params().var("scheduler_remote_order_job_chain"));
if (logValue) spooler_log.info(".. job parameter [scheduler_remote_order_job_chain]: " + this.getJobChain());
}
if (spooler_task.params().var("scheduler_remote_order_priority") != null && spooler_task.params().var("scheduler_remote_order_priority").length() > 0) {
this.setPriority(spooler_task.params().var("scheduler_remote_order_priority"));
if (logValue) spooler_log.info(".. job parameter [scheduler_remote_order_priority]: " + this.getPriority());
}
if (spooler_task.params().var("scheduler_remote_order_state") != null && spooler_task.params().var("scheduler_remote_order_state").length() > 0) {
this.setState(spooler_task.params().var("scheduler_remote_order_state"));
if (logValue) spooler_log.info(".. job parameter [scheduler_remote_order_state]: " + this.getState());
}
if (spooler_task.params().var("scheduler_remote_order_title") != null && spooler_task.params().var("scheduler_remote_order_title").length() > 0) {
this.setTitle(spooler_task.params().var("scheduler_remote_order_title"));
if (logValue) spooler_log.info(".. job parameter [scheduler_remote_order_title]: " + this.getTitle());
}
if (spooler_task.params().var("scheduler_remote_order_run_time") != null && spooler_task.params().var("scheduler_remote_order_run_time").length() > 0) {
this.setRunTime(spooler_task.params().var("scheduler_remote_order_run_time"));
if (logValue) spooler_log.info(".. job parameter [scheduler_remote_order_run_time]: " + this.getRunTime());
}
} catch (Exception e) {
throw new Exception("error occurred processing task parameters: " + e.getMessage());
}
}
public void getOrderParameters(Variable_set params, boolean logValue) throws Exception {
try {
if (params.var("scheduler_remote_host") != null && params.var("scheduler_remote_host").length() > 0) {
this.setHost( params.var("scheduler_remote_host"));
if (logValue) spooler_log.info(".. order parameter [scheduler_remote_host]: " + this.getHost());
}
if (params.var("scheduler_remote_port") != null && params.var("scheduler_remote_port").length() > 0) {
try {
this.setPort(Integer.parseInt(params.var("scheduler_remote_port")));
if (logValue) spooler_log.info(".. order parameter [scheduler_remote_port]: " + this.getPort());
} catch (Exception e) {
throw new Exception("illegal value specified for parameter [scheduler_remote_port], numeric value expected, found: " + params.var("scheduler_remote_port"));
}
}
if (params.var("scheduler_remote_protocol") != null && params.var("scheduler_remote_protocol").length() > 0) {
if (!params.var("scheduler_remote_protocol").equalsIgnoreCase("tcp") && !params.var("scheduler_remote_protocol").equalsIgnoreCase("udp")) {
throw new Exception("illegal value specified for parameter [scheduler_remote_protocol], \"tcp\" or \"udp\" expected, found: " + spooler_task.params().var("scheduler_remote_protocol"));
}
this.setProtocol(params.var("scheduler_remote_protocol"));
if (logValue) spooler_log.info(".. order parameter [scheduler_remote_protocol]: " + this.getProtocol());
}
if (params.var("scheduler_remote_timeout") != null && params.var("scheduler_remote_timeout").length() > 0) {
try {
this.setTimeout(Integer.parseInt(params.var("scheduler_remote_timeout")));
if (logValue) spooler_log.info(".. order parameter [scheduler_remote_timeout]: " + this.getTimeout());
} catch (Exception e) {
throw new Exception("illegal value specified for parameter [scheduler_remote_timeout], numeric value expected, found: " + params.var("scheduler_remote_timeout"));
}
}
/* routing parameters */
if (params.var("scheduler_remote_job") != null && params.var("scheduler_remote_job").length() > 0) {
this.setJobName(params.var("scheduler_remote_job"));
if (logValue) spooler_log.info(".. order parameter [scheduler_remote_job]: " + this.getJobName());
}
if (params.var("scheduler_remote_order") != null && params.var("scheduler_remote_order").length() > 0) {
this.setOrderId(params.var("scheduler_remote_order"));
if (logValue) spooler_log.info(".. order parameter [scheduler_remote_order]: " + this.getOrderId());
}
if (params.var("scheduler_remote_command") != null && params.var("scheduler_remote_command").length() > 0) {
this.setCommand(params.var("scheduler_remote_command"));
if (logValue) spooler_log.info(".. order parameter [scheduler_remote_command]: " + this.getCommand());
}
/* parameters for jobs and orders */
if (params.var("scheduler_remote_start_at") != null && params.var("scheduler_remote_start_at").length() > 0) {
this.setAt(params.var("scheduler_remote_start_at"));
if (logValue) spooler_log.info(".. order parameter [scheduler_remote_start_at]: " + this.getAt());
}
if (params.var("scheduler_remote_web_service") != null && params.var("scheduler_remote_web_service").length() > 0) {
this.setWebService(params.var("scheduler_remote_web_service"));
if (logValue) spooler_log.info(".. order parameter [scheduler_remote_web_service]: " + this.getWebService());
}
/* parameters for jobs */
if (params.var("scheduler_remote_job_start_after") != null && params.var("scheduler_remote_job_start_after").length() > 0) {
this.setAfter(params.var("scheduler_remote_job_start_after"));
if (logValue) spooler_log.info(".. order parameter [scheduler_remote_job_start_after]: " + this.getAfter());
}
/* parameters for orders */
if (params.var("scheduler_remote_order_replace") != null && params.var("scheduler_remote_order_replace").length() > 0) {
if (params.var("scheduler_remote_order_replace").equalsIgnoreCase("yes")
|| params.var("scheduler_remote_order_replace").equalsIgnoreCase("true")
|| params.var("scheduler_remote_order_replace").equals("1")) {
this.setReplace(true);
} else {
this.setReplace(false);
}
if (logValue) spooler_log.info(".. order parameter [scheduler_remote_order_replace]: " + this.isReplace());
}
if (params.var("scheduler_remote_order_job_chain") != null && params.var("scheduler_remote_order_job_chain").length() > 0) {
this.setJobChain(params.var("scheduler_remote_order_job_chain"));
if (logValue) spooler_log.info(".. order parameter [scheduler_remote_order_job_chain]: " + this.getJobChain());
}
if (params.var("scheduler_remote_order_priority") != null && params.var("scheduler_remote_order_priority").length() > 0) {
this.setPriority(params.var("scheduler_remote_order_priority"));
if (logValue) spooler_log.info(".. order parameter [scheduler_remote_order_priority]: " + this.getPriority());
}
if (params.var("scheduler_remote_order_state") != null && params.var("scheduler_remote_order_state").length() > 0) {
this.setState(params.var("scheduler_remote_order_state"));
if (logValue) spooler_log.info(".. order parameter [scheduler_remote_order_state]: " + this.getState());
}
if (params.var("scheduler_remote_order_title") != null && params.var("scheduler_remote_order_title").length() > 0) {
this.setTitle(params.var("scheduler_remote_order_title"));
if (logValue) spooler_log.info(".. order parameter [scheduler_remote_order_title]: " + this.getTitle());
}
if (params.var("scheduler_remote_order_run_time") != null && params.var("scheduler_remote_order_run_time").length() > 0) {
this.setRunTime(params.var("scheduler_remote_order_run_time"));
if (logValue) spooler_log.info(".. order parameter [scheduler_remote_order_run_time]: " + this.getRunTime());
}
} catch (Exception e) {
throw new Exception("error occurred processing order parameters: " + e.getMessage());
}
}
/**
* Job Scheduler API implementation.
*
* Initializiation.
*
* @return boolean
*/
public boolean spooler_init() {
try {
this.initParameters();
this.getTaskParameters(true);
if (spooler_job.order_queue() == null) {
if (spooler_task.params().var("scheduler_remote_host") == null || spooler_task.params().var("scheduler_remote_host").length() == 0) {
throw new Exception("no host name parameter [scheduler_remote_host] was specified for remote job scheduler");
}
if ((spooler_task.params().var("scheduler_remote_job") == null || spooler_task.params().var("scheduler_remote_job").length() == 0)
&& (spooler_task.params().var("scheduler_remote_order") == null || spooler_task.params().var("scheduler_remote_order").length() == 0)
&& (spooler_task.params().var("scheduler_remote_command") == null || spooler_task.params().var("scheduler_remote_command").length() == 0)) {
throw new Exception("one of the parameters [scheduler_remote_job, scheduler_remote_order, scheduler_remote_command] must be specified");
}
}
return true;
} catch (Exception e) {
spooler_log.error("error occurred initializing job: " + e.getMessage());
return false;
}
}
/**
* Job Scheduler API implementation.
*
* Method is executed once per job or repeatedly per order.
*
* @return boolean
*/
public boolean spooler_process() {
String request = "";
String response = "";
Variable_set parameters = null;
SOSSchedulerCommand remoteCommand = null;
try {
parameters = spooler_task.params();
if (spooler_job.order_queue() != null) {
parameters.merge(spooler_task.order().params());
this.initParameters();
this.getTaskParameters(false);
this.getOrderParameters(spooler_task.order().params(), true);
}
int oneOfUs = 0;
oneOfUs += (this.getJobName() == null || this.getJobName().length() == 0) ? 0 : 1;
oneOfUs += (this.getOrderId() == null || this.getOrderId().length() == 0) ? 0 : 1;
oneOfUs += (this.getCommand() == null || this.getCommand().length() == 0) ? 0 : 1;
if (oneOfUs == 0) {
throw new Exception("one of the parameters [scheduler_remote_job, scheduler_remote_order, scheduler_remote_command] must be specified");
} else if (oneOfUs > 1) {
throw new Exception("one of the parameters [scheduler_remote_job, scheduler_remote_order, scheduler_remote_command] must be specified, " + oneOfUs + " were given");
}
if (this.getOrderId() != null && this.getOrderId().length() > 0) {
request = "<add_order";
request += " replace=\"" + (this.isReplace() ? "yes" : "no") + "\"";
if (this.getOrderId() != null && this.getOrderId().length() > 0) request += " id=\"" + this.getOrderId() + "\"";
if (this.getAt() != null && this.getAt().length() > 0) request += " at=\"" + this.getAt() + "\"";
if (this.getJobChain() != null && this.getJobChain().length() > 0) request += " job_chain=\"" + this.getJobChain() + "\"";
if (this.getPriority() != null && this.getPriority().length() > 0) request += " priority=\"" + this.getPriority() + "\"";
if (this.getState() != null && this.getState().length() > 0) request += " state=\"" + this.getState() + "\"";
if (this.getTitle() != null && this.getTitle().length() > 0) request += " title=\"" + this.getTitle() + "\"";
if (this.getWebService() != null && this.getWebService().length() > 0) request += " web_service=\"" + this.getWebService() + "\"";
request += ">";
request += "<params>";
String[] params = parameters.names().split(";");
for(int i=0; i<params.length; i++) {
if (!params[i].startsWith("scheduler_remote_")) {
request += "<param name=\"" + params[i] + "\" value=\"" + parameters.var(params[i]) + "\"/>";
}
}
request += "</params>";
if (this.getRunTime() != null && this.getRunTime().length() > 0) request += this.getRunTime();
request += "</add_order>";
} else if (this.getJobName() != null && this.getJobName().length() > 0) {
request = "<start_job job=\"" + this.getJobName() + "\"";
if (this.getAfter() != null && this.getAfter().length() > 0) request += " after=\"" + this.getAfter() + "\"";
if (this.getAt() != null && this.getAt().length() > 0) request += " at=\"" + this.getAt() + "\"";
if (this.getWebService() != null && this.getWebService().length() > 0) request += " web_service=\"" + this.getWebService() + "\"";
request += ">";
request += "<params>";
String[] params = parameters.names().split(";");
for(int i=0; i<params.length; i++) {
if (!params[i].startsWith("scheduler_remote_")) {
request += "<param name=\"" + params[i] + "\" value=\"" + parameters.var(params[i]) + "\"/>";
}
}
request += "</params>";
request += "</start_job>";
} else {
request = this.getCommand();
}
remoteCommand = new SOSSchedulerCommand(this.getHost(), this.getPort(), this.getProtocol());
remoteCommand.connect();
spooler_log.info("sending request to remote Job Scheduler [" + this.getHost() + ":" + this.getPort() + "]: " + request);
remoteCommand.sendRequest(request);
if (this.getProtocol().equalsIgnoreCase("tcp")) { // no response is returned for UDP messages
response = remoteCommand.getResponse();
SOSXMLXPath xpath = new SOSXMLXPath(new StringBuffer(response));
String errCode = xpath.selectSingleNodeValue("//ERROR/@code");
String errMessage = xpath.selectSingleNodeValue("//ERROR/@text");
spooler_log.info("remote job scheduler response: " + response);
if ((errCode != null && errCode.length() > 0) || (errMessage != null && errMessage.length() > 0)) {
spooler_log.warn("remote Job Scheduler response reports error message: " + errMessage + " [" + errCode + "]");
}
}
return (spooler_job.order_queue() != null);
} catch (Exception e) {
spooler_log.error("error occurred for remote execution: " + e.getMessage());
return false;
} finally {
if (remoteCommand != null) { try { remoteCommand.disconnect(); } catch (Exception x) {} } // gracefully ignore this error
}
}
/**
* @return Returns the after.
*/
public String getAfter() {
return after;
}
/**
* @param after The after to set.
*/
public void setAfter(String after) {
this.after = after;
}
/**
* @return Returns the at.
*/
public String getAt() {
return at;
}
/**
* @param at The at to set.
*/
public void setAt(String at) {
this.at = at;
}
/**
* @return Returns the command.
*/
public String getCommand() {
return command;
}
/**
* @param command The command to set.
*/
public void setCommand(String command) {
this.command = command;
}
/**
* @return Returns the host.
*/
public String getHost() {
return host;
}
/**
* @param host The host to set.
*/
public void setHost(String host) {
this.host = host;
}
/**
* @return Returns the jobChain.
*/
public String getJobChain() {
return jobChain;
}
/**
* @param jobChain The jobChain to set.
*/
public void setJobChain(String jobChain) {
this.jobChain = jobChain;
}
/**
* @return Returns the jobName.
*/
public String getJobName() {
return jobName;
}
/**
* @param jobName The jobName to set.
*/
public void setJobName(String jobName) {
this.jobName = jobName;
}
/**
* @return Returns the orderId.
*/
public String getOrderId() {
return orderId;
}
/**
* @param orderId The orderId to set.
*/
public void setOrderId(String orderId) {
this.orderId = orderId;
}
/**
* @return Returns the port.
*/
public int getPort() {
return port;
}
/**
* @param port The port to set.
*/
public void setPort(int port) {
this.port = port;
}
/**
* @return Returns the priority.
*/
public String getPriority() {
return priority;
}
/**
* @param priority The priority to set.
*/
public void setPriority(String priority) {
this.priority = priority;
}
/**
* @return Returns the protocol.
*/
public String getProtocol() {
return protocol;
}
/**
* @param protocol The protocol to set.
*/
public void setProtocol(String protocol) throws Exception {
if ( protocol == null || protocol.length() == 0)
throw new Exception("no value was given for protocol [tcp, udp]");
if (!protocol.equalsIgnoreCase("tcp") && !protocol.equalsIgnoreCase("udp"))
throw new Exception ("illegal value specified for protocol [tcp, udp], found: " + protocol);
this.protocol = protocol.toLowerCase();
}
/**
* @return Returns the runTime.
*/
public String getRunTime() {
return runTime;
}
/**
* @param runTime The runTime to set.
*/
public void setRunTime(String runTime) {
this.runTime = runTime;
}
/**
* @return Returns the state.
*/
public String getState() {
return state;
}
/**
* @param state The state to set.
*/
public void setState(String state) {
this.state = state;
}
/**
* @return Returns the timeout.
*/
public int getTimeout() {
return timeout;
}
/**
* @param timeout The timeout to set.
*/
public void setTimeout(int timeout) {
this.timeout = timeout;
}
/**
* @return Returns the title.
*/
public String getTitle() {
return title;
}
/**
* @param title The title to set.
*/
public void setTitle(String title) {
this.title = title;
}
/**
* @return Returns the webService.
*/
public String getWebService() {
return webService;
}
/**
* @param webService The webService to set.
*/
public void setWebService(String webService) {
this.webService = webService;
}
/**
* @return Returns the replace.
*/
public boolean isReplace() {
return replace;
}
/**
* @param replace The replace to set.
*/
public void setReplace(boolean replace) {
this.replace = replace;
}
}