use of org.pentaho.di.job.Job in project pentaho-kettle by pentaho.
the class GetJobImageServlet method doGet.
/**
*<div id="mindtouch">
* <h1>/kettle/jobImage</h1>
* <a name="GET"></a>
* <h2>GET</h2>
* <p>Generates and returns image of the specified job.
* Generates PNG image of the specified job currently present on Carte server. Job name and Carte job ID (optional)
* is used for specifying job to get information for. Response is binary of the PNG image.</p>
*
* <p><b>Example Request:</b><br />
* <pre function="syntax.xml">
* GET /kettle/jobImage?name=dummy_job
* </pre>
*
* </p>
* <h3>Parameters</h3>
* <table class="pentaho-table">
* <tbody>
* <tr>
* <th>name</th>
* <th>description</th>
* <th>type</th>
* </tr>
* <tr>
* <td>name</td>
* <td>Name of the job to be used for image generation.</td>
* <td>query</td>
* </tr>
* <tr>
* <td>id</td>
* <td>Carte id of the job to be used for image generation.</td>
* <td>query, optional</td>
* </tr>
* </tbody>
* </table>
*
* <h3>Response Body</h3>
*
* <table class="pentaho-table">
* <tbody>
* <tr>
* <td align="right">binary streak:</td>
* <td>image</td>
* </tr>
* <tr>
* <td align="right">media types:</td>
* <td>image/png</td>
* </tr>
* </tbody>
* </table>
* <p>A binary PNG image or empty response if no job is found.</p>
*
* <h3>Status Codes</h3>
* <table class="pentaho-table">
* <tbody>
* <tr>
* <th>code</th>
* <th>description</th>
* </tr>
* <tr>
* <td>200</td>
* <td>Request was processed.</td>
* </tr>
* <tr>
* <td>500</td>
* <td>Internal server error occurs during request processing.</td>
* </tr>
* </tbody>
*</table>
*</div>
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if (isJettyMode() && !request.getContextPath().startsWith(CONTEXT_PATH)) {
return;
}
if (log.isDebug()) {
logDebug(BaseMessages.getString(PKG, "GetJobImageServlet.Log.JobImageRequested"));
}
String jobName = request.getParameter("name");
String id = request.getParameter("id");
// ID is optional...
//
Job job;
CarteObjectEntry entry;
if (Utils.isEmpty(id)) {
// get the first transformation that matches...
//
entry = getJobMap().getFirstCarteObjectEntry(jobName);
if (entry == null) {
job = null;
} else {
id = entry.getId();
job = getJobMap().getJob(entry);
}
} else {
// Take the ID into account!
//
entry = new CarteObjectEntry(jobName, id);
job = getJobMap().getJob(entry);
}
try {
if (job != null) {
response.setStatus(HttpServletResponse.SC_OK);
response.setCharacterEncoding("UTF-8");
response.setContentType("image/png");
// Generate xform image
//
BufferedImage image = generateJobImage(job.getJobMeta());
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
ImageIO.write(image, "png", os);
} finally {
os.flush();
}
response.setContentLength(os.size());
OutputStream out = response.getOutputStream();
out.write(os.toByteArray());
}
} catch (Exception e) {
e.printStackTrace();
}
}
use of org.pentaho.di.job.Job in project pentaho-kettle by pentaho.
the class GetStatusServlet method doGet.
/**
* <div id="mindtouch">
* <h1>/kettle/status</h1>
* <a name="GET"></a>
* <h2>GET</h2>
* <p>Retrieve server status. The status contains information about the server itself (OS, memory, etc)
* and information about jobs and transformations present on the server.</p>
*
* <p><b>Example Request:</b><br />
* <pre function="syntax.xml">
* GET /kettle/status/?xml=Y
* </pre>
*
* </p>
* <h3>Parameters</h3>
* <table class="pentaho-table">
* <tbody>
* <tr>
* <th>name</th>
* <th>description</th>
* <th>type</th>
* </tr>
* <tr>
* <td>xml</td>
* <td>Boolean flag which defines output format <code>Y</code> forces XML output to be generated.
* HTML is returned otherwise.</td>
* <td>boolean, optional</td>
* </tr>
* </tbody>
* </table>
*
* <h3>Response Body</h3>
*
* <table class="pentaho-table">
* <tbody>
* <tr>
* <td align="right">element:</td>
* <td>(custom)</td>
* </tr>
* <tr>
* <td align="right">media types:</td>
* <td>text/xml, text/html</td>
* </tr>
* </tbody>
* </table>
* <p>Response XML or HTML response containing details about the transformation specified.
* If an error occurs during method invocation <code>result</code> field of the response
* will contain <code>ERROR</code> status.</p>
*
* <p><b>Example Response:</b></p>
* <pre function="syntax.xml">
* <?xml version="1.0" encoding="UTF-8"?>
* <serverstatus>
* <statusdesc>Online</statusdesc>
* <memory_free>229093440</memory_free>
* <memory_total>285736960</memory_total>
* <cpu_cores>4</cpu_cores>
* <cpu_process_time>7534848300</cpu_process_time>
* <uptime>68818403</uptime>
* <thread_count>45</thread_count>
* <load_avg>-1.0</load_avg>
* <os_name>Windows 7</os_name>
* <os_version>6.1</os_version>
* <os_arch>amd64</os_arch>
* <transstatuslist>
* <transstatus>
* <transname>Row generator test</transname>
* <id>56c93d4e-96c1-4fae-92d9-d864b0779845</id>
* <status_desc>Waiting</status_desc>
* <error_desc/>
* <paused>N</paused>
* <stepstatuslist>
* </stepstatuslist>
* <first_log_line_nr>0</first_log_line_nr>
* <last_log_line_nr>0</last_log_line_nr>
* <logging_string><![CDATA[]]></logging_string>
* </transstatus>
* <transstatus>
* <transname>dummy-trans</transname>
* <id>c56961b2-c848-49b8-abde-76c8015e29b0</id>
* <status_desc>Stopped</status_desc>
* <error_desc/>
* <paused>N</paused>
* <stepstatuslist>
* </stepstatuslist>
* <first_log_line_nr>0</first_log_line_nr>
* <last_log_line_nr>0</last_log_line_nr>
* <logging_string><![CDATA[]]></logging_string>
* </transstatus>
* </transstatuslist>
* <jobstatuslist>
* <jobstatus>
* <jobname>dummy_job</jobname>
* <id>abd61143-8174-4f27-9037-6b22fbd3e229</id>
* <status_desc>Stopped</status_desc>
* <error_desc/>
* <logging_string><![CDATA[]]></logging_string>
* <first_log_line_nr>0</first_log_line_nr>
* <last_log_line_nr>0</last_log_line_nr>
* </jobstatus>
* </jobstatuslist>
* </serverstatus>
* </pre>
*
* <h3>Status Codes</h3>
* <table class="pentaho-table">
* <tbody>
* <tr>
* <th>code</th>
* <th>description</th>
* </tr>
* <tr>
* <td>200</td>
* <td>Request was processed.</td>
* </tr>
* <tr>
* <td>500</td>
* <td>Internal server error occurs during request processing.</td>
* </tr>
* </tbody>
* </table>
* </div>
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if (isJettyMode() && !request.getContextPath().startsWith(CONTEXT_PATH)) {
return;
}
if (log.isDebug()) {
logDebug(BaseMessages.getString(PKG, "GetStatusServlet.StatusRequested"));
}
response.setStatus(HttpServletResponse.SC_OK);
boolean useXML = "Y".equalsIgnoreCase(request.getParameter("xml"));
if (useXML) {
response.setContentType("text/xml");
response.setCharacterEncoding(Const.XML_ENCODING);
} else {
response.setContentType("text/html;charset=UTF-8");
}
PrintWriter out = response.getWriter();
List<CarteObjectEntry> transEntries = getTransformationMap().getTransformationObjects();
List<CarteObjectEntry> jobEntries = getJobMap().getJobObjects();
if (useXML) {
out.print(XMLHandler.getXMLHeader(Const.XML_ENCODING));
SlaveServerStatus serverStatus = new SlaveServerStatus();
serverStatus.setStatusDescription("Online");
getSystemInfo(serverStatus);
for (CarteObjectEntry entry : transEntries) {
Trans trans = getTransformationMap().getTransformation(entry);
String status = trans.getStatus();
SlaveServerTransStatus sstatus = new SlaveServerTransStatus(entry.getName(), entry.getId(), status);
sstatus.setLogDate(trans.getLogDate());
sstatus.setPaused(trans.isPaused());
serverStatus.getTransStatusList().add(sstatus);
}
for (CarteObjectEntry entry : jobEntries) {
Job job = getJobMap().getJob(entry);
String status = job.getStatus();
SlaveServerJobStatus jobStatus = new SlaveServerJobStatus(entry.getName(), entry.getId(), status);
jobStatus.setLogDate(job.getLogDate());
serverStatus.getJobStatusList().add(jobStatus);
}
try {
out.println(serverStatus.getXML());
} catch (KettleException e) {
throw new ServletException("Unable to get the server status in XML format", e);
}
} else {
out.println("<HTML>");
out.println("<HEAD><TITLE>" + BaseMessages.getString(PKG, "GetStatusServlet.KettleSlaveServerStatus") + "</TITLE>");
out.println("<META http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
out.println("</HEAD>");
out.println("<BODY>");
out.println("<H1>" + BaseMessages.getString(PKG, "GetStatusServlet.TopStatus") + "</H1>");
try {
out.println("<table border=\"1\">");
out.print("<tr> <th>" + BaseMessages.getString(PKG, "GetStatusServlet.TransName") + "</th> <th>" + BaseMessages.getString(PKG, "GetStatusServlet.CarteId") + "</th> <th>" + BaseMessages.getString(PKG, "GetStatusServlet.Status") + "</th> <th>" + BaseMessages.getString(PKG, "GetStatusServlet.LastLogDate") + "</th> <th>" + BaseMessages.getString(PKG, "GetStatusServlet.Remove") + "</th> </tr>");
Comparator<CarteObjectEntry> transComparator = new Comparator<CarteObjectEntry>() {
@Override
public int compare(CarteObjectEntry o1, CarteObjectEntry o2) {
Trans t1 = getTransformationMap().getTransformation(o1);
Trans t2 = getTransformationMap().getTransformation(o2);
Date d1 = t1.getLogDate();
Date d2 = t2.getLogDate();
// if both transformations have last log date, desc sort by log date
if (d1 != null && d2 != null) {
int logDateCompare = d2.compareTo(d1);
if (logDateCompare != 0) {
return logDateCompare;
}
}
return o1.compareTo(o2);
}
};
Collections.sort(transEntries, transComparator);
for (CarteObjectEntry entry : transEntries) {
String name = entry.getName();
String id = entry.getId();
Trans trans = getTransformationMap().getTransformation(entry);
String status = trans.getStatus();
String removeText = "";
//
if (trans.isFinished() || trans.isStopped() || (!trans.isInitializing() && !trans.isRunning())) {
removeText = "<a href=\"" + convertContextPath(RemoveTransServlet.CONTEXT_PATH) + "?name=" + URLEncoder.encode(name, "UTF-8") + "&id=" + id + "\"> Remove </a>";
}
out.print("<tr>");
out.print("<td><a href=\"" + convertContextPath(GetTransStatusServlet.CONTEXT_PATH) + "?name=" + URLEncoder.encode(name, "UTF-8") + "&id=" + id + "\">" + name + "</a></td>");
out.print("<td>" + id + "</td>");
out.print("<td>" + status + "</td>");
out.print("<td>" + (trans.getLogDate() == null ? "-" : XMLHandler.date2string(trans.getLogDate())) + "</td>");
out.print("<td>" + removeText + "</td>");
out.print("</tr>");
}
out.print("</table><p>");
out.println("<table border=\"1\">");
out.print("<tr> <th>" + BaseMessages.getString(PKG, "GetStatusServlet.JobName") + "</th> <th>" + BaseMessages.getString(PKG, "GetStatusServlet.CarteId") + "</th> <th>" + BaseMessages.getString(PKG, "GetStatusServlet.Status") + "</th> <th>" + BaseMessages.getString(PKG, "GetStatusServlet.LastLogDate") + "</th> <th>" + BaseMessages.getString(PKG, "GetStatusServlet.Remove") + "</th> </tr>");
Comparator<CarteObjectEntry> jobComparator = new Comparator<CarteObjectEntry>() {
@Override
public int compare(CarteObjectEntry o1, CarteObjectEntry o2) {
Job t1 = getJobMap().getJob(o1);
Job t2 = getJobMap().getJob(o2);
Date d1 = t1.getLogDate();
Date d2 = t2.getLogDate();
// if both jobs have last log date, desc sort by log date
if (d1 != null && d2 != null) {
int logDateCompare = d2.compareTo(d1);
if (logDateCompare != 0) {
return logDateCompare;
}
}
return o1.compareTo(o2);
}
};
Collections.sort(jobEntries, jobComparator);
for (CarteObjectEntry entry : jobEntries) {
String name = entry.getName();
String id = entry.getId();
Job job = getJobMap().getJob(entry);
String status = job.getStatus();
String removeText;
if (job.isFinished() || job.isStopped()) {
removeText = "<a href=\"" + convertContextPath(RemoveJobServlet.CONTEXT_PATH) + "?name=" + URLEncoder.encode(name, "UTF-8") + "&id=" + id + "\"> Remove </a>";
} else {
removeText = "";
}
out.print("<tr>");
out.print("<td><a href=\"" + convertContextPath(GetJobStatusServlet.CONTEXT_PATH) + "?name=" + URLEncoder.encode(name, "UTF-8") + "&id=" + id + "\">" + name + "</a></td>");
out.print("<td>" + id + "</td>");
out.print("<td>" + status + "</td>");
out.print("<td>" + (job.getLogDate() == null ? "-" : XMLHandler.date2string(job.getLogDate())) + "</td>");
out.print("<td>" + removeText + "</td>");
out.print("</tr>");
}
out.print("</table>");
} catch (Exception ex) {
out.println("<p>");
out.println("<pre>");
ex.printStackTrace(out);
out.println("</pre>");
}
out.println("<p>");
out.println("<H1>" + BaseMessages.getString(PKG, "GetStatusServlet.ConfigurationDetails.Title") + "</H1><p>");
out.println("<table border=\"1\">");
out.print("<tr> <th>" + BaseMessages.getString(PKG, "GetStatusServlet.Parameter.Title") + "</th> <th>" + BaseMessages.getString(PKG, "GetStatusServlet.Value.Title") + "</th> </tr>");
// The max number of log lines in the back-end
//
SlaveServerConfig serverConfig = getTransformationMap().getSlaveServerConfig();
if (serverConfig != null) {
String maxLines = "";
if (serverConfig.getMaxLogLines() == 0) {
maxLines = BaseMessages.getString(PKG, "GetStatusServlet.NoLimit");
} else {
maxLines = serverConfig.getMaxLogLines() + BaseMessages.getString(PKG, "GetStatusServlet.Lines");
}
out.print("<tr> <td>" + BaseMessages.getString(PKG, "GetStatusServlet.Parameter.MaxLogLines") + "</td> <td>" + maxLines + "</td> </tr>");
// The max age of log lines
//
String maxAge = "";
if (serverConfig.getMaxLogTimeoutMinutes() == 0) {
maxAge = BaseMessages.getString(PKG, "GetStatusServlet.NoLimit");
} else {
maxAge = serverConfig.getMaxLogTimeoutMinutes() + BaseMessages.getString(PKG, "GetStatusServlet.Minutes");
}
out.print("<tr> <td>" + BaseMessages.getString(PKG, "GetStatusServlet.Parameter.MaxLogLinesAge") + "</td> <td>" + maxAge + "</td> </tr>");
// The max age of stale objects
//
String maxObjAge = "";
if (serverConfig.getObjectTimeoutMinutes() == 0) {
maxObjAge = BaseMessages.getString(PKG, "GetStatusServlet.NoLimit");
} else {
maxObjAge = serverConfig.getObjectTimeoutMinutes() + BaseMessages.getString(PKG, "GetStatusServlet.Minutes");
}
out.print("<tr> <td>" + BaseMessages.getString(PKG, "GetStatusServlet.Parameter.MaxObjectsAge") + "</td> <td>" + maxObjAge + "</td> </tr>");
// The name of the specified repository
//
String repositoryName;
try {
repositoryName = serverConfig.getRepository() != null ? serverConfig.getRepository().getName() : "";
} catch (Exception e) {
logError(BaseMessages.getString(PKG, "GetStatusServlet.Parameter.RepositoryName.UnableToConnect", serverConfig.getRepositoryId()), e);
repositoryName = BaseMessages.getString(PKG, "GetStatusServlet.Parameter.RepositoryName.UnableToConnect", serverConfig.getRepositoryId());
}
out.print("<tr> <td>" + BaseMessages.getString(PKG, "GetStatusServlet.Parameter.RepositoryName") + "</td> <td>" + repositoryName + "</td> </tr>");
out.print("</table>");
String filename = serverConfig.getFilename();
if (filename == null) {
filename = BaseMessages.getString(PKG, "GetStatusServlet.ConfigurationDetails.UsingDefaults");
}
out.println("<i>" + BaseMessages.getString(PKG, "GetStatusServlet.ConfigurationDetails.Advice", filename) + "</i><br>");
}
out.println("</BODY>");
out.println("</HTML>");
}
}
use of org.pentaho.di.job.Job in project pentaho-kettle by pentaho.
the class StartJobServlet method doGet.
/**
* <div id="mindtouch">
* <h1>/kettle/startJob</h1>
* <a name="GET"></a>
* <h2>GET</h2>
* <p>Starts the job. If the job cannot be started, an error is returned.</p>
*
* <p><b>Example Request:</b><br />
* <pre function="syntax.xml">
* GET /kettle/startJob/?name=dummy_job&xml=Y
* </pre>
*
* </p>
* <h3>Parameters</h3>
* <table class="pentaho-table">
* <tbody>
* <tr>
* <th>name</th>
* <th>description</th>
* <th>type</th>
* </tr>
* <tr>
* <td>name</td>
* <td>Name of the job to be executed.</td>
* <td>query</td>
* </tr>
* <tr>
* <td>xml</td>
* <td>Boolean flag which sets the output format required. Use <code>Y</code> to receive XML response.</td>
* <td>boolean, optional</td>
* </tr>
* <tr>
* <td>id</td>
* <td>Carte job ID of the job to be executed. This parameter is optional when xml=Y is used.</td>
* <td>query, optional</td>
* </tr>
* </tbody>
* </table>
*
* <h3>Response Body</h3>
*
* <table class="pentaho-table">
* <tbody>
* <tr>
* <td align="right">text:</td>
* <td>HTML</td>
* </tr>
* <tr>
* <td align="right">media types:</td>
* <td>text/xml, text/html</td>
* </tr>
* </tbody>
* </table>
* <p>Response XML or HTML containing operation result. When using xml=Y <code>result</code> field indicates whether
* operation was successful (<code>OK</code>) or not (<code>ERROR</code>).</p>
*
* <p><b>Example Response:</b></p>
* <pre function="syntax.xml">
* <?xml version="1.0" encoding="UTF-8"?>
* <webresult>
* <result>OK</result>
* <message>Job [dummy_job] was started.</message>
* <id>abd61143-8174-4f27-9037-6b22fbd3e229</id>
* </webresult>
* </pre>
*
* <h3>Status Codes</h3>
* <table class="pentaho-table">
* <tbody>
* <tr>
* <th>code</th>
* <th>description</th>
* </tr>
* <tr>
* <td>200</td>
* <td>Request was processed.</td>
* </tr>
* <tr>
* <td>500</td>
* <td>Internal server error occurs during request processing.</td>
* </tr>
* </tbody>
* </table>
* </div>
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if (isJettyMode() && !request.getContextPath().startsWith(CONTEXT_PATH)) {
return;
}
if (log.isDebug()) {
logDebug(BaseMessages.getString(PKG, "StartJobServlet.Log.StartJobRequested"));
}
String jobName = request.getParameter("name");
String id = request.getParameter("id");
boolean useXML = "Y".equalsIgnoreCase(request.getParameter("xml"));
response.setStatus(HttpServletResponse.SC_OK);
PrintWriter out = response.getWriter();
if (useXML) {
response.setContentType("text/xml");
response.setCharacterEncoding(Const.XML_ENCODING);
out.print(XMLHandler.getXMLHeader(Const.XML_ENCODING));
} else {
response.setContentType("text/html;charset=UTF-8");
out.println("<HTML>");
out.println("<HEAD>");
out.println("<TITLE>Start job</TITLE>");
out.println("<META http-equiv=\"Refresh\" content=\"2;url=" + convertContextPath(GetStatusServlet.CONTEXT_PATH) + "?name=" + URLEncoder.encode(jobName, "UTF-8") + "\">");
out.println("<META http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
out.println("</HEAD>");
out.println("<BODY>");
}
try {
// ID is optional...
//
Job job;
CarteObjectEntry entry;
if (Utils.isEmpty(id)) {
// get the first job that matches...
//
entry = getJobMap().getFirstCarteObjectEntry(jobName);
if (entry == null) {
job = null;
} else {
id = entry.getId();
job = getJobMap().getJob(entry);
}
} else {
// Take the ID into account!
//
entry = new CarteObjectEntry(jobName, id);
job = getJobMap().getJob(entry);
}
if (job != null) {
//
if (job.isInitialized() && !job.isActive()) {
//
if (job.getRep() != null && !job.getRep().isConnected()) {
if (job.getRep().getUserInfo() != null) {
job.getRep().connect(job.getRep().getUserInfo().getLogin(), job.getRep().getUserInfo().getPassword());
} else {
job.getRep().connect(null, null);
}
}
cache.remove(job.getLogChannelId());
//
synchronized (this) {
JobConfiguration jobConfiguration = getJobMap().getConfiguration(jobName);
String carteObjectId = UUID.randomUUID().toString();
SimpleLoggingObject servletLoggingObject = new SimpleLoggingObject(CONTEXT_PATH, LoggingObjectType.CARTE, null);
servletLoggingObject.setContainerObjectId(carteObjectId);
Job newJob = new Job(job.getRep(), job.getJobMeta(), servletLoggingObject);
newJob.setLogLevel(job.getLogLevel());
// Discard old log lines from the old job
//
KettleLogStore.discardLines(job.getLogChannelId(), true);
getJobMap().replaceJob(entry, newJob, jobConfiguration);
job = newJob;
}
}
runJob(job);
String message = BaseMessages.getString(PKG, "StartJobServlet.Log.JobStarted", jobName);
if (useXML) {
out.println(new WebResult(WebResult.STRING_OK, message, id).getXML());
} else {
out.println("<H1>" + Encode.forHtml(message) + "</H1>");
out.println("<a href=\"" + convertContextPath(GetJobStatusServlet.CONTEXT_PATH) + "?name=" + URLEncoder.encode(jobName, "UTF-8") + "&id=" + URLEncoder.encode(id, "UTF-8") + "\">" + BaseMessages.getString(PKG, "JobStatusServlet.BackToJobStatusPage") + "</a><p>");
}
} else {
String message = BaseMessages.getString(PKG, "StartJobServlet.Log.SpecifiedJobNotFound", jobName);
if (useXML) {
out.println(new WebResult(WebResult.STRING_ERROR, message));
} else {
out.println("<H1>" + Encode.forHtml(message) + "</H1>");
out.println("<a href=\"" + convertContextPath(GetStatusServlet.CONTEXT_PATH) + "\">" + BaseMessages.getString(PKG, "TransStatusServlet.BackToStatusPage") + "</a><p>");
}
}
} catch (Exception ex) {
if (useXML) {
out.println(new WebResult(WebResult.STRING_ERROR, BaseMessages.getString(PKG, "StartJobServlet.Error.UnexpectedError", Const.CR + Const.getStackTracker(ex))));
} else {
out.println("<p>");
out.println("<pre>");
out.println(Encode.forHtml(Const.getStackTracker(ex)));
out.println("</pre>");
}
}
if (!useXML) {
out.println("<p>");
out.println("</BODY>");
out.println("</HTML>");
}
}
use of org.pentaho.di.job.Job in project pentaho-kettle by pentaho.
the class StopJobServlet method doGet.
/**
* <div id="mindtouch">
* <h1>/kettle/stopJob</h1>
* <a name="GET"></a>
* <h2>GET</h2>
* <p>Stops job execution on Carte server.</p>
*
* <p><b>Example Request:</b><br />
* <pre function="syntax.xml">
* GET /kettle/stopJob/?name=dummy_job&xml=Y
* </pre>
*
* </p>
* <h3>Parameters</h3>
* <table class="pentaho-table">
* <tbody>
* <tr>
* <th>name</th>
* <th>description</th>
* <th>type</th>
* </tr>
* <tr>
* <td>name</td>
* <td>Name of the job to be stopped.</td>
* <td>query</td>
* </tr>
* <tr>
* <td>xml</td>
* <td>Boolean flag which sets the output format required. Use <code>Y</code> to receive XML response.</td>
* <td>boolean, optional</td>
* </tr>
* <tr>
* <td>id</td>
* <td>Carte job ID of the job to be stopped. This parameter is optional when xml=Y is used.</td>
* <td>query, optional</td>
* </tr>
* </tbody>
* </table>
*
* <h3>Response Body</h3>
*
* <table class="pentaho-table">
* <tbody>
* <tr>
* <td align="right">text:</td>
* <td>HTML</td>
* </tr>
* <tr>
* <td align="right">media types:</td>
* <td>text/xml, text/html</td>
* </tr>
* </tbody>
* </table>
* <p>Response XML or HTML containing operation result. When using xml=Y <code>result</code> field indicates whether
* operation was successful (<code>OK</code>) or not (<code>ERROR</code>).</p>
*
* <p><b>Example Response:</b></p>
* <pre function="syntax.xml">
* <?xml version="1.0" encoding="UTF-8"?>
* <webresult>
* <result>OK</result>
* <message>Job [dummy_job] stop requested.</message>
* <id/>
* </webresult>
* </pre>
*
* <h3>Status Codes</h3>
* <table class="pentaho-table">
* <tbody>
* <tr>
* <th>code</th>
* <th>description</th>
* </tr>
* <tr>
* <td>200</td>
* <td>Request was processed.</td>
* </tr>
* <tr>
* <td>500</td>
* <td>Internal server error occurs during request processing.</td>
* </tr>
* </tbody>
* </table>
* </div>
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if (isJettyMode() && !request.getContextPath().startsWith(CONTEXT_PATH)) {
return;
}
if (log.isDebug()) {
logDebug(BaseMessages.getString(PKG, "StopJobServlet.log.StopJobRequested"));
}
String jobName = request.getParameter("name");
String id = request.getParameter("id");
boolean useXML = "Y".equalsIgnoreCase(request.getParameter("xml"));
PrintWriter out = response.getWriter();
try {
if (useXML) {
response.setContentType("text/xml");
response.setCharacterEncoding(Const.XML_ENCODING);
out.print(XMLHandler.getXMLHeader(Const.XML_ENCODING));
} else {
response.setContentType("text/html;charset=UTF-8");
out.println("<HTML>");
out.println("<HEAD>");
out.println("<TITLE>Stop job</TITLE>");
out.println("<META http-equiv=\"Refresh\" content=\"2;url=" + convertContextPath(GetJobStatusServlet.CONTEXT_PATH) + "?name=" + URLEncoder.encode(jobName, "UTF-8") + "\">");
out.println("<META http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
out.println("</HEAD>");
out.println("<BODY>");
}
// ID is optional...
//
Job job;
CarteObjectEntry entry;
if (Utils.isEmpty(id)) {
// get the first job that matches...
//
entry = getJobMap().getFirstCarteObjectEntry(jobName);
if (entry == null) {
job = null;
} else {
id = entry.getId();
job = getJobMap().getJob(entry);
}
} else {
// Take the ID into account!
//
entry = new CarteObjectEntry(jobName, id);
job = getJobMap().getJob(entry);
}
if (job != null) {
job.stopAll();
String message = BaseMessages.getString(PKG, "JobStatusServlet.Log.JobStopRequested", jobName);
if (useXML) {
out.println(new WebResult(WebResult.STRING_OK, message).getXML());
} else {
out.println("<H1>" + Encode.forHtml(message) + "</H1>");
out.println("<a href=\"" + convertContextPath(GetJobStatusServlet.CONTEXT_PATH) + "?name=" + URLEncoder.encode(jobName, "UTF-8") + "&id=" + URLEncoder.encode(id, "UTF-8") + "\">" + BaseMessages.getString(PKG, "JobStatusServlet.BackToJobStatusPage") + "</a><p>");
}
} else {
String message = BaseMessages.getString(PKG, "StopJobServlet.Log.CoundNotFindJob", jobName);
if (useXML) {
out.println(new WebResult(WebResult.STRING_ERROR, message).getXML());
} else {
out.println("<H1>" + Encode.forHtml(message) + "</H1>");
out.println("<a href=\"" + convertContextPath(GetStatusServlet.CONTEXT_PATH) + ">" + BaseMessages.getString(PKG, "TransStatusServlet.BackToStatusPage") + "</a><p>");
}
}
} catch (Exception ex) {
if (useXML) {
out.println(new WebResult(WebResult.STRING_ERROR, Const.getStackTracker(ex)).getXML());
} else {
out.println("<p>");
out.println("<pre>");
out.println(Encode.forHtml(Const.getStackTracker(ex)));
out.println("</pre>");
}
}
if (!useXML) {
out.println("<p>");
out.println("</BODY>");
out.println("</HTML>");
}
}
use of org.pentaho.di.job.Job in project pentaho-kettle by pentaho.
the class JobResource method getJobStatus.
@GET
@Path("/status/{id : .+}")
@Produces({ MediaType.APPLICATION_JSON })
public JobStatus getJobStatus(@PathParam("id") String id) {
JobStatus status = new JobStatus();
// find job
Job job = CarteResource.getJob(id);
CarteObjectEntry entry = CarteResource.getCarteObjectEntry(id);
status.setId(entry.getId());
status.setName(entry.getName());
status.setStatus(job.getStatus());
return status;
}
Aggregations