blob: 1e7dba17e2442860bc7752fe319664bf14740e3d [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// mmacivor - June 05/2008 - 1.0 - Initial implementation
package org.eclipse.persistence.internal.oxm;
import org.xml.sax.SAXException;
import org.eclipse.persistence.internal.core.queries.CoreContainerPolicy;
import org.eclipse.persistence.internal.helper.ClassConstants;
import org.eclipse.persistence.internal.oxm.mappings.BinaryDataCollectionMapping;
import org.eclipse.persistence.internal.oxm.mappings.BinaryDataMapping;
import org.eclipse.persistence.internal.oxm.mappings.Field;
import org.eclipse.persistence.internal.oxm.mappings.Mapping;
import org.eclipse.persistence.internal.oxm.mappings.XMLConverterMapping;
import org.eclipse.persistence.internal.oxm.record.UnmarshalRecord;
import org.eclipse.persistence.oxm.XMLField;
import org.eclipse.persistence.oxm.mappings.nullpolicy.AbstractNullPolicy;
public class XMLInlineBinaryHandler extends org.eclipse.persistence.internal.oxm.record.UnmarshalRecordImpl {
NodeValue nodeValue;
Mapping mapping;
boolean isCollection = false;
XMLConverterMapping converter;
UnmarshalRecord parent;
CharSequence characters;
public XMLInlineBinaryHandler(UnmarshalRecord parent, NodeValue nodeValue, Mapping mapping, XMLConverterMapping converter, boolean isCollection) {
super(null);
this.nodeValue = nodeValue;
this.isCollection = isCollection;
this.mapping = mapping;
this.parent = parent;
this.converter = converter;
this.setUnmarshaller(parent.getUnmarshaller());
}
@Override
public CharSequence getCharacters() {
if(null != characters) {
return characters;
}
return super.getCharacters();
}
@Override
public void characters(char[] ch, int offset, int length) throws SAXException {
this.getStringBuffer().append(ch, offset, length);
}
@Override
public void characters(CharSequence characters) throws SAXException {
this.characters = characters;
}
@Override
public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
//Since we know this was a simple or empty element, we know that we only got a characters event and then this. Process the
//text.
Field field = null;
Object value = this.getCharacters();
boolean isHex = Constants.HEX_BINARY_QNAME.equals(((XMLField)this.mapping.getField()).getSchemaType());
Class<?> attributeClassification = null;
AbstractNullPolicy nullPolicy;
boolean isSwaRef = false;
CoreContainerPolicy cp = null;
if(isCollection) {
isSwaRef = ((BinaryDataCollectionMapping)mapping).isSwaRef();
field = (Field) mapping.getField();
attributeClassification =((BinaryDataCollectionMapping)mapping).getAttributeElementClass();
nullPolicy =((BinaryDataCollectionMapping)mapping).getNullPolicy();
cp = mapping.getContainerPolicy();
} else {
isSwaRef = ((BinaryDataMapping)mapping).isSwaRef();
field = (Field) mapping.getField();
attributeClassification = mapping.getAttributeClassification();
nullPolicy =((BinaryDataMapping)mapping).getNullPolicy();
}
if (isSwaRef && (parent.getUnmarshaller().getAttachmentUnmarshaller() != null)) {
if(attributeClassification != null && attributeClassification == XMLBinaryDataHelper.getXMLBinaryDataHelper().DATA_HANDLER) {
value = parent.getUnmarshaller().getAttachmentUnmarshaller().getAttachmentAsDataHandler(value.toString());
} else {
value = parent.getUnmarshaller().getAttachmentUnmarshaller().getAttachmentAsByteArray(value.toString());
}
} else {
Object valueFromReader = this.parent.getXMLReader().getValue(getCharacters(), attributeClassification);
if(parent.isNil() && parent.getXMLReader().isNullRepresentedByXsiNil(nullPolicy)){
value = null;
isCollection = isCollection && parent.getXMLReader().isInCollection();
}
else{
if(null != valueFromReader) {
value = valueFromReader;
} else {
String valueString = value.toString();
if(valueString.length() == 0 && nullPolicy.isNullRepresentedByEmptyNode()){
value = null;
}else{
if(field.usesSingleNode()){
if(isHex) {
value = parent.getConversionManager().convertHexBinaryListToByteArrayList(valueString, cp, parent.getSession());
} else {
value = parent.getConversionManager().convertSchemaBase64ListToByteArrayList(valueString, cp, parent.getSession());
}
}else{
if(isHex) {
value = parent.getConversionManager().convertObject(valueString, ClassConstants.APBYTE, Constants.HEX_BINARY_QNAME);
} else {
value = parent.getConversionManager().convertSchemaBase64ToByteArray(valueString);
}
}
}
}
value = XMLBinaryDataHelper.getXMLBinaryDataHelper().convertObject(value, attributeClassification, parent.getSession(), cp);
}
}
value = converter.convertDataValueToObjectValue(value, parent.getSession(), parent.getUnmarshaller());
if(isCollection) {
parent.addAttributeValue((ContainerValue)nodeValue, value);
} else {
parent.setAttributeValue(value, mapping);
}
if(!field.isSelfField()){
//Return control to the parent record
parent.getXMLReader().setContentHandler(parent);
parent.endElement(namespaceURI, localName, qName);
}
resetStringBuffer();
}
@Override
public void resetStringBuffer() {
super.resetStringBuffer();
characters = null;
}
}