Example usage for org.dom4j.tree AbstractNode valueOf

List of usage examples for org.dom4j.tree AbstractNode valueOf

Introduction

In this page you can find the example usage for org.dom4j.tree AbstractNode valueOf.

Prototype

public String valueOf(String xpathExpression) 

Source Link

Usage

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