in plugins/transforms/webservices/src/main/java/org/apache/hop/pipeline/transforms/webservices/WebService.java [831:1075]
private void compatibleProcessRows(
InputStream anXml,
Object[] rowData,
IRowMeta rowMeta,
boolean ignoreNamespacePrefix,
String encoding)
throws HopException {
// First we should get the complete string
// The problem is that the string can contain XML or any other format such as HTML saying the
// service is no longer
// available.
// We're talking about a WEB service here.
// As such, to keep the original parsing scheme, we first read the content.
// Then we create an input stream from the content again.
// It's elaborate, but that way we can report on the failure more correctly.
//
String response = readStringFromInputStream(anXml, encoding);
// Create a new reader to feed into the XML Input Factory below...
//
StringReader stringReader = new StringReader(response);
// TODO Very empirical : see if we can do something better here
try {
XMLInputFactory vFactory = XMLInputFactory.newInstance();
vFactory.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
vFactory.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
XMLStreamReader vReader = vFactory.createXMLStreamReader(stringReader);
Object[] outputRowData = RowDataUtil.allocateRowData(data.outputRowMeta.size());
int outputIndex = 0;
boolean processing = false;
boolean oneValueRowProcessing = false;
for (int event = vReader.next(); vReader.hasNext(); event = vReader.next()) {
switch (event) {
case XMLStreamConstants.START_ELEMENT:
// Start new code
// START_ELEMENT= 1
//
if (isRowLevel()) {
logRowlevel(
"START_ELEMENT / "
+ vReader.getAttributeCount()
+ " / "
+ vReader.getNamespaceCount());
}
// If we start the xml element named like the return type,
// we start a new row
//
if (isRowLevel()) {
logRowlevel(CONST_V_READER_GET_LOCAL_NAME + vReader.getLocalName());
}
if (Utils.isEmpty(meta.getOutFieldArgumentName())) {
// getOutFieldArgumentName() == null
if (oneValueRowProcessing) {
WebServiceField field =
meta.getFieldOutFromWsName(vReader.getLocalName(), ignoreNamespacePrefix);
if (field != null) {
outputRowData[outputIndex++] = getValue(vReader.getElementText(), field);
putRow(data.outputRowMeta, outputRowData);
oneValueRowProcessing = false;
} else {
if (meta.getOutFieldContainerName().equals(vReader.getLocalName())) {
// meta.getOutFieldContainerName() = vReader.getLocalName()
if (isRowLevel()) {
logRowlevel("OutFieldContainerName = " + meta.getOutFieldContainerName());
}
oneValueRowProcessing = true;
}
}
}
} else {
// getOutFieldArgumentName() != null
if (isRowLevel()) {
logRowlevel(CONST_OUT_FIELD_ARGUMENT_NAME + meta.getOutFieldArgumentName());
}
if (meta.getOutFieldArgumentName().equals(vReader.getLocalName())) {
if (isRowLevel()) {
logRowlevel(CONST_V_READER_GET_LOCAL_NAME + vReader.getLocalName());
}
if (isRowLevel()) {
logRowlevel(CONST_OUT_FIELD_ARGUMENT_NAME);
}
if (processing) {
WebServiceField field =
meta.getFieldOutFromWsName(vReader.getLocalName(), ignoreNamespacePrefix);
if (field != null) {
int index = data.outputRowMeta.indexOfValue(field.getName());
if (index >= 0) {
outputRowData[index] = getValue(vReader.getElementText(), field);
}
}
processing = false;
} else {
WebServiceField field =
meta.getFieldOutFromWsName(vReader.getLocalName(), ignoreNamespacePrefix);
if (meta.getFieldsOut().size() == 1 && field != null) {
// This can be either a simple return element, or a complex type...
//
try {
if (meta.isPassingInputData()) {
for (int i = 0; i < rowMeta.getValueMetaList().size(); i++) {
IValueMeta valueMeta = getInputRowMeta().getValueMeta(i);
outputRowData[outputIndex++] = valueMeta.cloneValueData(rowData[i]);
}
}
outputRowData[outputIndex++] = getValue(vReader.getElementText(), field);
putRow(data.outputRowMeta, outputRowData);
} catch (XMLStreamException e) {
throw new HopTransformException(
"Unable to get value for field ["
+ field.getName()
+ "]. Verify that this is not a complex data type by looking at the response XML.",
e);
}
} else {
for (WebServiceField curField : meta.getFieldsOut()) {
if (!Utils.isEmpty(curField.getName())) {
outputRowData[outputIndex++] = getValue(vReader.getElementText(), curField);
}
}
processing = true;
}
}
} else {
if (isRowLevel()) {
logRowlevel(CONST_V_READER_GET_LOCAL_NAME + vReader.getLocalName());
logRowlevel(CONST_OUT_FIELD_ARGUMENT_NAME + meta.getOutFieldArgumentName());
}
}
}
break;
case XMLStreamConstants.END_ELEMENT:
// END_ELEMENT= 2
if (isRowLevel()) {
logRowlevel("END_ELEMENT");
}
// If we end the xml element named as the return type, we
// finish a row
if ((meta.getOutFieldArgumentName() == null
&& meta.getOperationName().equals(vReader.getLocalName()))) {
oneValueRowProcessing = false;
} else if (meta.getOutFieldArgumentName() != null
&& meta.getOutFieldArgumentName().equals(vReader.getLocalName())) {
putRow(data.outputRowMeta, outputRowData);
processing = false;
}
break;
case XMLStreamConstants.PROCESSING_INSTRUCTION:
// PROCESSING_INSTRUCTION= 3
if (isRowLevel()) {
logRowlevel("PROCESSING_INSTRUCTION");
}
break;
case XMLStreamConstants.CHARACTERS:
// CHARACTERS= 4
if (isRowLevel()) {
logRowlevel("CHARACTERS");
}
break;
case XMLStreamConstants.COMMENT:
// COMMENT= 5
if (isRowLevel()) {
logRowlevel("COMMENT");
}
break;
case XMLStreamConstants.SPACE:
// PROCESSING_INSTRUCTION= 6
if (isRowLevel()) {
logRowlevel("PROCESSING_INSTRUCTION");
}
break;
case XMLStreamConstants.START_DOCUMENT:
// START_DOCUMENT= 7
if (isRowLevel()) {
logRowlevel("START_DOCUMENT");
}
if (isRowLevel()) {
logRowlevel(vReader.getText());
}
break;
case XMLStreamConstants.END_DOCUMENT:
// END_DOCUMENT= 8
if (isRowLevel()) {
logRowlevel("END_DOCUMENT");
}
break;
case XMLStreamConstants.ENTITY_REFERENCE:
// ENTITY_REFERENCE= 9
if (isRowLevel()) {
logRowlevel("ENTITY_REFERENCE");
}
break;
case XMLStreamConstants.ATTRIBUTE:
// ATTRIBUTE= 10
if (isRowLevel()) {
logRowlevel("ATTRIBUTE");
}
break;
case XMLStreamConstants.DTD:
// DTD= 11
if (isRowLevel()) {
logRowlevel("DTD");
}
break;
case XMLStreamConstants.CDATA:
// CDATA= 12
if (isRowLevel()) {
logRowlevel("CDATA");
}
break;
case XMLStreamConstants.NAMESPACE:
// NAMESPACE= 13
if (isRowLevel()) {
logRowlevel("NAMESPACE");
}
break;
case XMLStreamConstants.NOTATION_DECLARATION:
// NOTATION_DECLARATION= 14
if (isRowLevel()) {
logRowlevel("NOTATION_DECLARATION");
}
break;
case XMLStreamConstants.ENTITY_DECLARATION:
// ENTITY_DECLARATION= 15
if (isRowLevel()) {
logRowlevel("ENTITY_DECLARATION");
}
break;
default:
break;
}
}
} catch (Exception e) {
throw new HopTransformException(
BaseMessages.getString(PKG, "WebServices.ERROR0010.OutputParsingError", response), e);
}
}