private static void readParsedValue()

in src/main/java/org/apache/commons/scxml2/io/SCXMLReader.java [2133:2188]


    private static void readParsedValue(final XMLStreamReader reader, final Configuration configuration,
                                        final ParsedValueContainer valueContainer, final boolean invokeContent)
            throws XMLStreamException, ModelException {
        final Element element = readElement(reader);
        if (element.hasChildNodes()) {
            final NodeList children = element.getChildNodes();
            Node child = children.item(0);
            final boolean cdata = child.getNodeType() == Node.CDATA_SECTION_NODE;
            if (invokeContent) {
                // search or and only use first <scxml> element
                if (child.getNodeType() != Node.ELEMENT_NODE) {
                    for (int i = 1, size = children.getLength(); i < size; i++) {
                        child = children.item(i);
                        if (child.getNodeType() == Node.ELEMENT_NODE) {
                            break;
                        }
                    }
                }
                if (child.getNodeType() == Node.ELEMENT_NODE && SCXMLConstants.ELEM_SCXML.equals(child.getLocalName()) &&
                        SCXMLConstants.XMLNS_SCXML.equals(child.getNamespaceURI())) {
                    // transform <invoke><content><scxml> back to text
                    try {
                        valueContainer.setParsedValue(new NodeTextValue(ContentParser.DEFAULT_PARSER.toXml(child)));
                    } catch (final IOException e) {
                        throw new XMLStreamException(e);
                    }
                }
                if (valueContainer.getParsedValue() == null) {
                    reportIgnoredElement(reader, configuration, SCXMLConstants.ELEM_INVOKE, SCXMLConstants.XMLNS_SCXML,
                            SCXMLConstants.ELEM_CONTENT);
                }
            }
            else if (children.getLength() == 1 && (cdata || child.getNodeType() == Node.TEXT_NODE )) {
                final String text = ContentParser.trimContent(child.getNodeValue());
                if (ContentParser.hasJsonSignature(text)) {
                    try {
                        valueContainer.setParsedValue(new JsonValue(configuration.contentParser.parseJson(text), cdata));
                    } catch (final IOException e) {
                        throw new ModelException(e);
                    }
                }
                else {
                    valueContainer.setParsedValue(new TextValue(ContentParser.spaceNormalizeContent(text),
                            cdata));
                }
            } else if (children.getLength() == 1) {
                valueContainer.setParsedValue(new NodeValue(child));
            } else {
                final ArrayList<Node> nodeList = new ArrayList<>();
                for (int i = 0, size = children.getLength(); i < size; i++) {
                    nodeList.add(children.item(i));
                }
                valueContainer.setParsedValue(new NodeListValue(nodeList));
            }
        }
    }