Java tutorial
/******************************************************************************* * * Pentaho Data Integration * * Copyright (C) 2002-2012 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ******************************************************************************/ package org.pentaho.di.www; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.zip.GZIPInputStream; import org.apache.commons.codec.binary.Base64; import org.pentaho.di.core.Const; import org.pentaho.di.core.Result; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.exception.KettleXMLException; import org.pentaho.di.core.xml.XMLHandler; import org.pentaho.di.trans.Trans; import org.pentaho.di.trans.TransMeta; import org.pentaho.di.trans.step.StepStatus; import org.w3c.dom.Document; import org.w3c.dom.Node; public class SlaveServerTransStatus { public static final String XML_TAG = "transstatus"; private String id; private String transName; private String statusDescription; private String errorDescription; private String loggingString; private int firstLoggingLineNr; private int lastLoggingLineNr; private List<StepStatus> stepStatusList; private Result result; private boolean paused; public SlaveServerTransStatus() { stepStatusList = new ArrayList<StepStatus>(); } /** * @param transName * @param statusDescription */ public SlaveServerTransStatus(String transName, String id, String statusDescription) { this(); this.transName = transName; this.id = id; this.statusDescription = statusDescription; } public String getXML() throws KettleException { StringBuffer xml = new StringBuffer(); xml.append("<" + XML_TAG + ">").append(Const.CR); xml.append(XMLHandler.addTagValue("transname", transName)); xml.append(XMLHandler.addTagValue("id", id)); xml.append(XMLHandler.addTagValue("status_desc", statusDescription)); xml.append(XMLHandler.addTagValue("error_desc", errorDescription)); xml.append(XMLHandler.addTagValue("paused", paused)); xml.append(" <stepstatuslist>").append(Const.CR); for (int i = 0; i < stepStatusList.size(); i++) { StepStatus stepStatus = (StepStatus) stepStatusList.get(i); xml.append(" ").append(stepStatus.getXML()).append(Const.CR); } xml.append(" </stepstatuslist>").append(Const.CR); xml.append(XMLHandler.addTagValue("first_log_line_nr", firstLoggingLineNr)); xml.append(XMLHandler.addTagValue("last_log_line_nr", lastLoggingLineNr)); if (result != null) { try { String resultXML = result.getXML(); xml.append(resultXML); } catch (IOException e) { throw new KettleException("Unable to serialize result object as XML", e); } } xml.append(XMLHandler.addTagValue("logging_string", XMLHandler.buildCDATA(loggingString))); xml.append("</" + XML_TAG + ">"); return xml.toString(); } public SlaveServerTransStatus(Node transStatusNode) { this(); id = XMLHandler.getTagValue(transStatusNode, "id"); transName = XMLHandler.getTagValue(transStatusNode, "transname"); statusDescription = XMLHandler.getTagValue(transStatusNode, "status_desc"); errorDescription = XMLHandler.getTagValue(transStatusNode, "error_desc"); paused = "Y".equalsIgnoreCase(XMLHandler.getTagValue(transStatusNode, "paused")); Node statusListNode = XMLHandler.getSubNode(transStatusNode, "stepstatuslist"); int nr = XMLHandler.countNodes(statusListNode, StepStatus.XML_TAG); for (int i = 0; i < nr; i++) { Node stepStatusNode = XMLHandler.getSubNodeByNr(statusListNode, StepStatus.XML_TAG, i); StepStatus stepStatus = new StepStatus(stepStatusNode); stepStatusList.add(stepStatus); } firstLoggingLineNr = Const.toInt(XMLHandler.getTagValue(transStatusNode, "first_log_line_nr"), 0); lastLoggingLineNr = Const.toInt(XMLHandler.getTagValue(transStatusNode, "last_log_line_nr"), 0); String loggingString64 = XMLHandler.getTagValue(transStatusNode, "logging_string"); // This is a Base64 encoded GZIP compressed stream of data. try { byte[] bytes = new byte[] {}; if (loggingString64 != null) bytes = Base64.decodeBase64(loggingString64.getBytes()); if (bytes.length > 0) { ByteArrayInputStream bais = new ByteArrayInputStream(bytes); GZIPInputStream gzip = new GZIPInputStream(bais); int c; StringBuffer buffer = new StringBuffer(); while ((c = gzip.read()) != -1) buffer.append((char) c); gzip.close(); loggingString = buffer.toString(); } else { loggingString = ""; } } catch (IOException e) { loggingString = "Unable to decode logging from remote server : " + e.toString() + Const.CR + Const.getStackTracker(e); } // get the result object, if there is any... // Node resultNode = XMLHandler.getSubNode(transStatusNode, Result.XML_TAG); if (resultNode != null) { try { result = new Result(resultNode); } catch (KettleException e) { loggingString += "Unable to serialize result object as XML" + Const.CR + Const.getStackTracker(e) + Const.CR; } } } public static SlaveServerTransStatus fromXML(String xml) throws KettleXMLException { Document document = XMLHandler.loadXMLString(xml); SlaveServerTransStatus status = new SlaveServerTransStatus(XMLHandler.getSubNode(document, XML_TAG)); return status; } /** * @return the statusDescription */ public String getStatusDescription() { return statusDescription; } /** * @param statusDescription the statusDescription to set */ public void setStatusDescription(String statusDescription) { this.statusDescription = statusDescription; } /** * @return the transName */ public String getTransName() { return transName; } /** * @param transName the transName to set */ public void setTransName(String transName) { this.transName = transName; } /** * @return the errorDescription */ public String getErrorDescription() { return errorDescription; } /** * @param errorDescription the errorDescription to set */ public void setErrorDescription(String errorDescription) { this.errorDescription = errorDescription; } /** * @return the stepStatusList */ public List<StepStatus> getStepStatusList() { return stepStatusList; } /** * @param stepStatusList the stepStatusList to set */ public void setStepStatusList(List<StepStatus> stepStatusList) { this.stepStatusList = stepStatusList; } /** * @return the loggingString */ public String getLoggingString() { return loggingString; } /** * @param loggingString the loggingString to set */ public void setLoggingString(String loggingString) { this.loggingString = loggingString; } public boolean isRunning() { return getStatusDescription().equalsIgnoreCase(Trans.STRING_RUNNING) || getStatusDescription().equalsIgnoreCase(Trans.STRING_INITIALIZING); } public boolean isStopped() { return getStatusDescription().equalsIgnoreCase(Trans.STRING_STOPPED); } public boolean isWaiting() { return getStatusDescription().equalsIgnoreCase(Trans.STRING_WAITING); } public long getNrStepErrors() { long errors = 0L; for (int i = 0; i < stepStatusList.size(); i++) { StepStatus stepStatus = (StepStatus) stepStatusList.get(i); errors += stepStatus.getErrors(); } return errors; } public Result getResult(TransMeta transMeta) { Result result = new Result(); for (StepStatus stepStatus : stepStatusList) { result.setNrErrors(result.getNrErrors() + stepStatus.getErrors() + (result.isStopped() ? 1 : 0)); // If the remote trans is stopped, count as an error if (stepStatus.getStepname().equals(transMeta.getTransLogTable().getStepnameRead())) { result.increaseLinesRead(stepStatus.getLinesRead()); } if (stepStatus.getStepname().equals(transMeta.getTransLogTable().getStepnameInput())) { result.increaseLinesInput(stepStatus.getLinesInput()); } if (stepStatus.getStepname().equals(transMeta.getTransLogTable().getStepnameWritten())) { result.increaseLinesWritten(stepStatus.getLinesWritten()); } if (stepStatus.getStepname().equals(transMeta.getTransLogTable().getStepnameOutput())) { result.increaseLinesOutput(stepStatus.getLinesOutput()); } if (stepStatus.getStepname().equals(transMeta.getTransLogTable().getStepnameUpdated())) { result.increaseLinesUpdated(stepStatus.getLinesUpdated()); } if (stepStatus.getStepname().equals(transMeta.getTransLogTable().getStepnameRejected())) { result.increaseLinesRejected(stepStatus.getLinesRejected()); } if (stepStatus.isStopped()) { result.setStopped(true); result.setResult(false); } } return result; } /** * @return the result */ public Result getResult() { return result; } /** * @param result the result to set */ public void setResult(Result result) { this.result = result; } /** * @return the paused */ public boolean isPaused() { return paused; } /** * @param paused the paused to set */ public void setPaused(boolean paused) { this.paused = paused; } /** * @return the lastLoggingLineNr */ public int getLastLoggingLineNr() { return lastLoggingLineNr; } /** * @param lastLoggingLineNr the lastLoggingLineNr to set */ public void setLastLoggingLineNr(int lastLoggingLineNr) { this.lastLoggingLineNr = lastLoggingLineNr; } /** * @return the firstLoggingLineNr */ public int getFirstLoggingLineNr() { return firstLoggingLineNr; } /** * @param firstLoggingLineNr the firstLoggingLineNr to set */ public void setFirstLoggingLineNr(int firstLoggingLineNr) { this.firstLoggingLineNr = firstLoggingLineNr; } /** * @return the id */ public String getId() { return id; } /** * @param id the id to set */ public void setId(String id) { this.id = id; } }