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