private void compatibleProcessRows()

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);
    }
  }