Search in sources :

Example 1 with XMLRootRecord

use of org.eclipse.persistence.oxm.record.XMLRootRecord in project eclipselink by eclipse-ee4j.

the class JsonStructureReader method parsePair.

private void parsePair(String name, JsonValue jsonValue) throws SAXException {
    if (jsonValue == null) {
        return;
    }
    ValueType valueType = jsonValue.getValueType();
    if (valueType == ValueType.ARRAY) {
        JsonArray jsonArray = (JsonArray) jsonValue;
        String parentLocalName = name;
        if (attributePrefix != null && parentLocalName.startsWith(attributePrefix)) {
            // do nothing;
            return;
        }
        String uri = Constants.EMPTY_STRING;
        if (isNamespaceAware() && namespaces != null) {
            if (parentLocalName.length() > 2) {
                int nsIndex = parentLocalName.indexOf(getNamespaceSeparator(), 1);
                if (nsIndex > -1) {
                    String prefix = parentLocalName.substring(0, nsIndex);
                    uri = namespaces.resolveNamespacePrefix(prefix);
                }
                if (uri == null || uri == Constants.EMPTY_STRING) {
                    uri = namespaces.getDefaultNamespaceURI();
                } else {
                    parentLocalName = parentLocalName.substring(nsIndex + 1);
                }
            } else {
                uri = namespaces.getDefaultNamespaceURI();
            }
        }
        boolean isTextValue;
        int arraySize = jsonArray.size();
        if (arraySize == 0) {
            if (contentHandler instanceof UnmarshalRecord || isUnmarshalRecordWithinAdapter()) {
                final UnmarshalRecord ur = this.contentHandler instanceof UnmarshalRecord ? (UnmarshalRecord) this.contentHandler : getUnmarshalRecordFromAdapter();
                XPathNode node = ur.getNonAttributeXPathNode(uri, parentLocalName, parentLocalName, null);
                if (node != null) {
                    NodeValue nv = node.getNodeValue();
                    if (nv == null && node.getTextNode() != null) {
                        nv = node.getTextNode().getUnmarshalNodeValue();
                    }
                    if (nv != null && nv.isContainerValue()) {
                        ur.getContainerInstance(((ContainerValue) nv));
                    }
                }
            }
        }
        startCollection();
        XPathFragment groupingXPathFragment = null;
        XPathFragment itemXPathFragment = null;
        if (contentHandler instanceof UnmarshalRecord || isUnmarshalRecordWithinAdapter()) {
            final UnmarshalRecord contentHandler_ = contentHandler instanceof UnmarshalRecord ? (UnmarshalRecord) contentHandler : getUnmarshalRecordFromAdapter();
            isTextValue = isTextValue(parentLocalName, contentHandler_);
            UnmarshalRecord unmarshalRecord = contentHandler_;
            if (unmarshalRecord.getUnmarshaller().isWrapperAsCollectionName()) {
                XPathNode unmarshalRecordXPathNode = unmarshalRecord.getXPathNode();
                if (null != unmarshalRecordXPathNode) {
                    XPathFragment currentFragment = new XPathFragment();
                    currentFragment.setLocalName(parentLocalName);
                    currentFragment.setNamespaceURI(uri);
                    currentFragment.setNamespaceAware(isNamespaceAware());
                    XPathNode groupingXPathNode = unmarshalRecordXPathNode.getNonAttributeChildrenMap().get(currentFragment);
                    if (groupingXPathNode != null) {
                        if (groupingXPathNode.getUnmarshalNodeValue() instanceof CollectionGroupingElementNodeValue) {
                            groupingXPathFragment = groupingXPathNode.getXPathFragment();
                            contentHandler_.startElement(uri, parentLocalName, parentLocalName, new AttributesImpl());
                            XPathNode itemXPathNode = groupingXPathNode.getNonAttributeChildren().get(0);
                            itemXPathFragment = itemXPathNode.getXPathFragment();
                        } else if (groupingXPathNode.getUnmarshalNodeValue() == null) {
                            XPathNode itemXPathNode = groupingXPathNode.getNonAttributeChildren().get(0);
                            if (itemXPathNode != null) {
                                if ((itemXPathNode.getUnmarshalNodeValue()).isContainerValue()) {
                                    groupingXPathFragment = groupingXPathNode.getXPathFragment();
                                    contentHandler_.startElement(uri, parentLocalName, parentLocalName, new AttributesImpl());
                                    itemXPathFragment = itemXPathNode.getXPathFragment();
                                }
                            }
                        }
                    }
                }
            }
            for (JsonValue nextArrayValue : jsonArray) {
                if (nextArrayValue.getValueType() == ValueType.NULL) {
                    contentHandler.setNil(true);
                }
                if (!isTextValue) {
                    if (null != itemXPathFragment) {
                        contentHandler.startElement(itemXPathFragment.getNamespaceURI(), itemXPathFragment.getLocalName(), itemXPathFragment.getLocalName(), attributes.setValue(nextArrayValue, attributePrefix, namespaces, getNamespaceSeparator(), isNamespaceAware()));
                    } else {
                        contentHandler.startElement(uri, parentLocalName, parentLocalName, attributes.setValue(nextArrayValue, attributePrefix, namespaces, getNamespaceSeparator(), isNamespaceAware()));
                    }
                }
                // Internally store each nested array it as JsonObject with name: "item"
                if (valueType == nextArrayValue.getValueType()) {
                    JsonBuilderFactory factory = Json.createBuilderFactory(null);
                    JsonObjectBuilder jsonObjectBuilder = factory.createObjectBuilder();
                    jsonObjectBuilder.add("item", nextArrayValue);
                    nextArrayValue = jsonObjectBuilder.build();
                }
                parseValue(nextArrayValue);
                if (!isTextValue) {
                    if (null != itemXPathFragment) {
                        contentHandler.endElement(itemXPathFragment.getNamespaceURI(), itemXPathFragment.getLocalName(), itemXPathFragment.getLocalName());
                    } else {
                        contentHandler.endElement(uri, parentLocalName, parentLocalName);
                    }
                }
            }
        }
        if (null != groupingXPathFragment) {
            contentHandler.endElement(uri, groupingXPathFragment.getLocalName(), groupingXPathFragment.getLocalName());
        }
        endCollection();
    } else {
        if (attributePrefix != null && name.startsWith(attributePrefix)) {
            return;
        }
        String localName = name;
        String uri = Constants.EMPTY_STRING;
        if (isNamespaceAware() && namespaces != null) {
            if (localName.length() > 2) {
                int nsIndex = localName.indexOf(getNamespaceSeparator(), 1);
                String prefix = Constants.EMPTY_STRING;
                if (nsIndex > -1) {
                    prefix = localName.substring(0, nsIndex);
                }
                uri = namespaces.resolveNamespacePrefix(prefix);
                if (uri == null || uri == Constants.EMPTY_STRING) {
                    uri = namespaces.getDefaultNamespaceURI();
                } else {
                    localName = localName.substring(nsIndex + 1);
                }
                if (localName.equals(Constants.SCHEMA_TYPE_ATTRIBUTE) && uri != null && uri.equals(javax.xml.XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI)) {
                    return;
                }
            } else {
                uri = namespaces.getDefaultNamespaceURI();
            }
        }
        if (contentHandler instanceof XMLRootRecord || contentHandler instanceof DeferredContentHandler) {
            if (jsonTypeCompatibility) {
                // is will be read by the xsi:type lookup
                if (!isNamespaceAware() && localName.equals(Constants.SCHEMA_TYPE_ATTRIBUTE)) {
                    return;
                }
            }
            if (textWrapper != null && textWrapper.equals(localName)) {
                parseValue(jsonValue);
                return;
            }
        } else if (contentHandler instanceof UnmarshalRecord && ((UnmarshalRecord) contentHandler).getXPathNode() != null) {
            if (jsonTypeCompatibility) {
                if (!isNamespaceAware() && localName.equals(Constants.SCHEMA_TYPE_ATTRIBUTE) && !((UnmarshalRecord) contentHandler).getXPathNode().hasTypeChild()) {
                    return;
                }
            }
            boolean isTextValue = isTextValue(localName, (UnmarshalRecord) contentHandler);
            if (isTextValue) {
                parseValue(jsonValue);
                return;
            }
            NodeValue nv = ((UnmarshalRecord) contentHandler).getAttributeChildNodeValue(uri, localName);
            if (attributePrefix == null && nv != null) {
                return;
            }
        } else if (isUnmarshalRecordWithinAdapter()) {
            @SuppressWarnings("rawtypes") final UnmarshalRecord contentHandler_ = getUnmarshalRecordFromAdapter();
            if (jsonTypeCompatibility) {
                if (!isNamespaceAware() && localName.equals(Constants.SCHEMA_TYPE_ATTRIBUTE) && !contentHandler_.getXPathNode().hasTypeChild()) {
                    return;
                }
            }
            boolean isTextValue = isTextValue(localName, contentHandler_);
            if (isTextValue) {
                parseValue(jsonValue);
                return;
            }
            NodeValue nv = contentHandler_.getAttributeChildNodeValue(uri, localName);
            if (attributePrefix == null && nv != null) {
                return;
            }
        }
        if (jsonValue.getValueType() == ValueType.NULL) {
            contentHandler.setNil(true);
        }
        contentHandler.startElement(uri, localName, localName, attributes.setValue(jsonValue, attributePrefix, namespaces, getNamespaceSeparator(), isNamespaceAware()));
        parseValue(jsonValue);
        contentHandler.endElement(uri, localName, localName);
    }
}
Also used : CollectionGroupingElementNodeValue(org.eclipse.persistence.internal.oxm.CollectionGroupingElementNodeValue) NodeValue(org.eclipse.persistence.internal.oxm.NodeValue) ValueType(jakarta.json.JsonValue.ValueType) JsonValue(jakarta.json.JsonValue) XPathFragment(org.eclipse.persistence.internal.oxm.XPathFragment) JsonString(jakarta.json.JsonString) CollectionGroupingElementNodeValue(org.eclipse.persistence.internal.oxm.CollectionGroupingElementNodeValue) XPathNode(org.eclipse.persistence.internal.oxm.XPathNode) ContainerValue(org.eclipse.persistence.internal.oxm.ContainerValue) JsonArray(jakarta.json.JsonArray) AttributesImpl(org.xml.sax.helpers.AttributesImpl) JsonBuilderFactory(jakarta.json.JsonBuilderFactory) UnmarshalRecord(org.eclipse.persistence.internal.oxm.record.UnmarshalRecord) AbstractUnmarshalRecord(org.eclipse.persistence.internal.oxm.record.AbstractUnmarshalRecord) XMLRootRecord(org.eclipse.persistence.oxm.record.XMLRootRecord) JsonObjectBuilder(jakarta.json.JsonObjectBuilder) DeferredContentHandler(org.eclipse.persistence.internal.oxm.record.deferred.DeferredContentHandler)

Aggregations

JsonArray (jakarta.json.JsonArray)1 JsonBuilderFactory (jakarta.json.JsonBuilderFactory)1 JsonObjectBuilder (jakarta.json.JsonObjectBuilder)1 JsonString (jakarta.json.JsonString)1 JsonValue (jakarta.json.JsonValue)1 ValueType (jakarta.json.JsonValue.ValueType)1 CollectionGroupingElementNodeValue (org.eclipse.persistence.internal.oxm.CollectionGroupingElementNodeValue)1 ContainerValue (org.eclipse.persistence.internal.oxm.ContainerValue)1 NodeValue (org.eclipse.persistence.internal.oxm.NodeValue)1 XPathFragment (org.eclipse.persistence.internal.oxm.XPathFragment)1 XPathNode (org.eclipse.persistence.internal.oxm.XPathNode)1 AbstractUnmarshalRecord (org.eclipse.persistence.internal.oxm.record.AbstractUnmarshalRecord)1 UnmarshalRecord (org.eclipse.persistence.internal.oxm.record.UnmarshalRecord)1 DeferredContentHandler (org.eclipse.persistence.internal.oxm.record.deferred.DeferredContentHandler)1 XMLRootRecord (org.eclipse.persistence.oxm.record.XMLRootRecord)1 AttributesImpl (org.xml.sax.helpers.AttributesImpl)1