List of usage examples for org.dom4j.tree AbstractNode valueOf
public String valueOf(String xpathExpression)
From source file:com.panet.imeta.trans.steps.getxmldata.GetXMLData.java
License:Open Source License
private Object[] processPutRow(Object[] row, AbstractNode node) throws KettleException { // Create new row... Object[] outputRowData = buildEmptyRow(); try {/*www.j a va 2s .c o m*/ data.nodenr++; if (row != null) System.arraycopy(row, 0, outputRowData, 0, data.totalpreviousfields); // Read fields... for (int i = 0; i < data.nrInputFields; i++) { // Get field GetXMLDataField xmlDataField = meta.getInputFields()[i]; // Get the Path to look for String XPathValue = environmentSubstitute(xmlDataField.getXPath()); // Get the path type String Element_Type = xmlDataField.getElementTypeCode(); if (meta.isuseToken()) { // See if user use Token inside path field // The syntax is : @_Fieldname- // PDI will search for Fieldname value and replace it // Fieldname must be defined before the current node int indexvarstart = XPathValue.indexOf(data.tokenStart); int indexvarend = XPathValue.indexOf(data.tokenEnd); if (indexvarstart >= 0 && indexvarend >= 0) { String NameVarInputField = XPathValue.substring(indexvarstart + 2, indexvarend); for (int k = 0; k < meta.getInputFields().length; k++) { GetXMLDataField Tmp_xmlInputField = meta.getInputFields()[k]; if (Tmp_xmlInputField.getName().equalsIgnoreCase(NameVarInputField)) { XPathValue = XPathValue.replaceAll( data.tokenStart + NameVarInputField + data.tokenEnd, "'" + outputRowData[data.totalpreviousfields + k] + "'"); if (log.isDetailed()) log.logDetailed(toString(), XPathValue); } } } } // end if use token // Get node value String nodevalue = null; if (!Element_Type.equals("node")) XPathValue = '@' + XPathValue; // TODO only put @ to the // last element in path, not // in front at all if (meta.isNamespaceAware()) { XPath xpathField = node.createXPath(addNSPrefix(XPathValue, data.PathValue)); xpathField.setNamespaceURIs(data.NAMESPACE); nodevalue = xpathField.valueOf(node); } else { nodevalue = node.valueOf(XPathValue); } // Do trimming switch (xmlDataField.getTrimType()) { case GetXMLDataField.TYPE_TRIM_LEFT: nodevalue = Const.ltrim(nodevalue); break; case GetXMLDataField.TYPE_TRIM_RIGHT: nodevalue = Const.rtrim(nodevalue); break; case GetXMLDataField.TYPE_TRIM_BOTH: nodevalue = Const.trim(nodevalue); break; default: break; } if (meta.getIsInFields()) { // Add result field to input stream outputRowData = RowDataUtil.addValueData(outputRowData, data.totalpreviousfields + i, nodevalue); } // Do conversions // ValueMetaInterface targetValueMeta = data.outputRowMeta.getValueMeta(data.totalpreviousfields + i); ValueMetaInterface sourceValueMeta = data.convertRowMeta.getValueMeta(data.totalpreviousfields + i); if (targetValueMeta.isBinary()) { byte[] b = new sun.misc.BASE64Decoder().decodeBuffer(nodevalue); outputRowData[data.totalpreviousfields + i] = b; } else { outputRowData[data.totalpreviousfields + i] = targetValueMeta.convertData(sourceValueMeta, nodevalue); } // Do we need to repeat this field if it is null? if (meta.getInputFields()[i].isRepeated()) { if (data.previousRow != null && Const.isEmpty(nodevalue) && data.previousRow != null && data.previousRow.length > data.totalpreviousfields + i) { outputRowData[data.totalpreviousfields + i] = data.previousRow[data.totalpreviousfields + i]; } } } // End of loop over fields... int rowIndex = data.nrInputFields; // See if we need to add the filename to the row... if (meta.includeFilename() && !Const.isEmpty(meta.getFilenameField())) { outputRowData[rowIndex++] = KettleVFS.getFilename(data.file); } // See if we need to add the row number to the row... if (meta.includeRowNumber() && !Const.isEmpty(meta.getRowNumberField())) { outputRowData[rowIndex++] = new Long(data.rownr); } RowMetaInterface irow = getInputRowMeta(); data.previousRow = irow == null ? outputRowData : (Object[]) irow.cloneRow(outputRowData); // copy it to make // surely the next step doesn't change it in between... } catch (Exception e) { if (getStepMeta().isDoingErrorHandling()) { // Simply add this row to the error row putError(data.outputRowMeta, outputRowData, 1, e.toString(), null, "GetXMLData001"); data.errorInRowButContinue = true; return null; } else { log.logError(toString(), e.toString()); throw new KettleException(e.toString()); } } return outputRowData; }