use of org.dom4j.tree.AbstractNode in project pentaho-kettle by pentaho.
the class GetXMLData method processPutRow.
private Object[] processPutRow(AbstractNode node) throws KettleException {
// Create new row...
Object[] outputRowData = buildEmptyRow();
// Create new row or clone
if (meta.isInFields()) {
System.arraycopy(data.readrow, 0, outputRowData, 0, data.nrReadRow);
}
try {
data.nodenr++;
// 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 = xmlDataField.getXPath();
XPathValue = environmentSubstitute(XPathValue);
if (xmlDataField.getElementType() == GetXMLDataField.ELEMENT_TYPE_ATTRIBUT) {
// We have an attribute
// do we need to add leading @?
// Only put @ to the last element in path, not in front at all
int last = XPathValue.lastIndexOf(GetXMLDataMeta.N0DE_SEPARATOR);
if (last > -1) {
last++;
String attribut = XPathValue.substring(last, XPathValue.length());
if (!attribut.startsWith(GetXMLDataMeta.AT)) {
XPathValue = XPathValue.substring(0, last) + GetXMLDataMeta.AT + attribut;
}
} else {
if (!XPathValue.startsWith(GetXMLDataMeta.AT)) {
XPathValue = GetXMLDataMeta.AT + XPathValue;
}
}
}
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
XPathValue = substituteToken(XPathValue, outputRowData);
if (isDetailed()) {
logDetailed(XPathValue);
}
}
// Get node value
String nodevalue;
// Handle namespaces
if (meta.isNamespaceAware()) {
XPath xpathField = node.createXPath(addNSPrefix(XPathValue, data.PathValue));
xpathField.setNamespaceURIs(data.NAMESPACE);
if (xmlDataField.getResultType() == GetXMLDataField.RESULT_TYPE_VALUE_OF) {
nodevalue = xpathField.valueOf(node);
} else {
// nodevalue=xpathField.selectSingleNode(node).asXML();
Node n = xpathField.selectSingleNode(node);
if (n != null) {
nodevalue = n.asXML();
} else {
nodevalue = "";
}
}
} else {
if (xmlDataField.getResultType() == GetXMLDataField.RESULT_TYPE_VALUE_OF) {
nodevalue = node.valueOf(XPathValue);
} else {
// nodevalue=node.selectSingleNode(XPathValue).asXML();
Node n = node.selectSingleNode(XPathValue);
if (n != null) {
nodevalue = n.asXML();
} else {
nodevalue = "";
}
}
}
// 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;
}
// Do conversions
//
ValueMetaInterface targetValueMeta = data.outputRowMeta.getValueMeta(data.totalpreviousfields + i);
ValueMetaInterface sourceValueMeta = data.convertRowMeta.getValueMeta(data.totalpreviousfields + i);
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 && Utils.isEmpty(nodevalue)) {
outputRowData[data.totalpreviousfields + i] = data.previousRow[data.totalpreviousfields + i];
}
}
}
// End of loop over fields...
int rowIndex = data.totalpreviousfields + data.nrInputFields;
// See if we need to add the filename to the row...
if (meta.includeFilename() && !Utils.isEmpty(meta.getFilenameField())) {
outputRowData[rowIndex++] = data.filename;
}
// See if we need to add the row number to the row...
if (meta.includeRowNumber() && !Utils.isEmpty(meta.getRowNumberField())) {
outputRowData[rowIndex++] = data.rownr;
}
// Possibly add short filename...
if (meta.getShortFileNameField() != null && meta.getShortFileNameField().length() > 0) {
outputRowData[rowIndex++] = data.shortFilename;
}
// Add Extension
if (meta.getExtensionField() != null && meta.getExtensionField().length() > 0) {
outputRowData[rowIndex++] = data.extension;
}
// add path
if (meta.getPathField() != null && meta.getPathField().length() > 0) {
outputRowData[rowIndex++] = data.path;
}
// Add Size
if (meta.getSizeField() != null && meta.getSizeField().length() > 0) {
outputRowData[rowIndex++] = data.size;
}
// add Hidden
if (meta.isHiddenField() != null && meta.isHiddenField().length() > 0) {
outputRowData[rowIndex++] = Boolean.valueOf(data.path);
}
// Add modification date
if (meta.getLastModificationDateField() != null && meta.getLastModificationDateField().length() > 0) {
outputRowData[rowIndex++] = data.lastModificationDateTime;
}
// Add Uri
if (meta.getUriField() != null && meta.getUriField().length() > 0) {
outputRowData[rowIndex++] = data.uriName;
}
// Add RootUri
if (meta.getRootUriField() != null && meta.getRootUriField().length() > 0) {
outputRowData[rowIndex] = data.rootUriName;
}
RowMetaInterface irow = getInputRowMeta();
if (irow == null) {
data.previousRow = outputRowData;
} else {
// clone to previously allocated array to make sure next step doesn't
// change it in between...
System.arraycopy(outputRowData, 0, this.prevRow, 0, outputRowData.length);
// Pick up everything else that needs a real deep clone
data.previousRow = irow.cloneRow(outputRowData, this.prevRow);
}
} 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 {
logError(e.toString());
throw new KettleException(e.toString());
}
}
return outputRowData;
}
Aggregations