Search in sources :

Example 1 with ManyValue

use of org.eclipse.persistence.internal.jaxb.many.ManyValue in project eclipselink by eclipse-ee4j.

the class JAXBUnmarshaller method unmarshal.

/**
 * Unmarshal the object based on the binding metadata associated with the
 * TypeMappingInfo.
 */
public JAXBElement unmarshal(XMLStreamReader streamReader, TypeMappingInfo type) throws JAXBException {
    try {
        Descriptor xmlDescriptor = type.getXmlDescriptor();
        if (type.getType() instanceof Class) {
            Class<?> javaClass = (Class) type.getType();
            Class<?> componentClass = javaClass.getComponentType();
            if (javaClass.isArray() && javaClass != CoreClassConstants.APBYTE && javaClass != CoreClassConstants.ABYTE && XMLConversionManager.getDefaultJavaTypes().get(componentClass) != null) {
                // Top-level array.  Descriptor will be for an EL-generated class, containing one DirectCollection mapping.
                DirectCollectionMapping mapping = (DirectCollectionMapping) xmlDescriptor.getMappings().get(0);
                XMLStreamReaderReader staxReader = new XMLStreamReaderReader(xmlUnmarshaller);
                staxReader.setErrorHandler(xmlUnmarshaller.getErrorHandler());
                PrimitiveArrayContentHandler primitiveArrayContentHandler = new PrimitiveArrayContentHandler(javaClass, componentClass, mapping.usesSingleNode());
                staxReader.setContentHandler(primitiveArrayContentHandler);
                XMLStreamReaderInputSource inputSource = new XMLStreamReaderInputSource(streamReader);
                staxReader.parse(inputSource);
                return primitiveArrayContentHandler.getJaxbElement();
            }
        }
        if (null != xmlDescriptor && null == getSchema()) {
            RootLevelXmlAdapter adapter = null;
            if (jaxbContext.getTypeMappingInfoToJavaTypeAdapters().size() > 0) {
                adapter = jaxbContext.getTypeMappingInfoToJavaTypeAdapters().get(type);
            }
            UnmarshalRecord wrapper = (UnmarshalRecord) xmlDescriptor.getObjectBuilder().createRecordFromXMLContext(xmlUnmarshaller.getXMLContext());
            org.eclipse.persistence.internal.oxm.record.UnmarshalRecord unmarshalRecord = wrapper.getUnmarshalRecord();
            XMLStreamReaderReader staxReader = new XMLStreamReaderReader(xmlUnmarshaller);
            unmarshalRecord.setUnmarshaller(xmlUnmarshaller);
            unmarshalRecord.setXMLReader(staxReader);
            staxReader.setContentHandler(unmarshalRecord);
            staxReader.parse(streamReader);
            Object value = null;
            if (unmarshalRecord.isNil()) {
                value = null;
            } else {
                value = unmarshalRecord.getCurrentObject();
            }
            if (value instanceof WrappedValue) {
                value = ((WrappedValue) value).getValue();
            }
            if (value instanceof ManyValue) {
                value = ((ManyValue) value).getItem();
            }
            if (adapter != null) {
                try {
                    value = adapter.getXmlAdapter().unmarshal(value);
                } catch (Exception ex) {
                    throw new JAXBException(XMLMarshalException.marshalException(ex));
                }
            }
            Class<?> declaredClass = null;
            if (type.getType() instanceof Class) {
                declaredClass = (Class) type.getType();
            } else {
                declaredClass = Object.class;
            }
            return new JAXBElement(new QName(unmarshalRecord.getRootElementNamespaceUri(), unmarshalRecord.getLocalName()), declaredClass, value);
        }
        if (jaxbContext.getTypeMappingInfoToGeneratedType() == null) {
            return unmarshal(streamReader, type.getType());
        }
        RootLevelXmlAdapter adapter = null;
        if (jaxbContext.getTypeMappingInfoToJavaTypeAdapters().size() > 0) {
            adapter = jaxbContext.getTypeMappingInfoToJavaTypeAdapters().get(type);
        }
        Class<?> unmarshalClass = null;
        if (jaxbContext.getTypeMappingInfoToGeneratedType().size() > 0) {
            unmarshalClass = jaxbContext.getTypeMappingInfoToGeneratedType().get(type);
        }
        if (unmarshalClass != null) {
            JAXBElement unmarshalled = unmarshal(streamReader, unmarshalClass);
            Class<?> declaredClass = null;
            if (type.getType() instanceof Class) {
                declaredClass = (Class) type.getType();
            } else {
                declaredClass = Object.class;
            }
            Object value = unmarshalled.getValue();
            if (adapter != null) {
                try {
                    value = adapter.getXmlAdapter().unmarshal(value);
                } catch (Exception ex) {
                    throw new JAXBException(XMLMarshalException.marshalException(ex));
                }
            }
            JAXBElement returnVal = new JAXBElement(unmarshalled.getName(), declaredClass, unmarshalled.getScope(), value);
            return returnVal;
        } else if (type.getType() instanceof Class) {
            if (adapter != null) {
                JAXBElement element = unmarshal(streamReader, adapter.getBoundType());
                try {
                    Object value = adapter.getXmlAdapter().unmarshal(element.getValue());
                    element.setValue(value);
                    return element;
                } catch (Exception ex) {
                    throw new JAXBException(XMLMarshalException.marshalException(ex));
                }
            }
            return unmarshal(streamReader, (Class) type.getType());
        } else if (type.getType() instanceof ParameterizedType) {
            return unmarshal(streamReader, ((ParameterizedType) type.getType()).getRawType());
        }
        return null;
    } catch (XMLMarshalException xmlMarshalException) {
        throw handleXMLMarshalException(xmlMarshalException);
    } catch (SAXException e) {
        throw new JAXBException(e);
    }
}
Also used : QName(javax.xml.namespace.QName) JAXBException(jakarta.xml.bind.JAXBException) ManyValue(org.eclipse.persistence.internal.jaxb.many.ManyValue) JAXBElement(jakarta.xml.bind.JAXBElement) WrappedValue(org.eclipse.persistence.internal.jaxb.WrappedValue) XMLMarshalException(org.eclipse.persistence.exceptions.XMLMarshalException) BeanValidationException(org.eclipse.persistence.exceptions.BeanValidationException) SAXException(org.xml.sax.SAXException) UnmarshalException(jakarta.xml.bind.UnmarshalException) PropertyException(jakarta.xml.bind.PropertyException) JAXBException(jakarta.xml.bind.JAXBException) DirectCollectionMapping(org.eclipse.persistence.internal.oxm.mappings.DirectCollectionMapping) RootLevelXmlAdapter(org.eclipse.persistence.jaxb.JAXBContext.RootLevelXmlAdapter) SAXException(org.xml.sax.SAXException) ParameterizedType(java.lang.reflect.ParameterizedType) XMLStreamReaderReader(org.eclipse.persistence.internal.oxm.record.XMLStreamReaderReader) UnmarshalRecord(org.eclipse.persistence.oxm.record.UnmarshalRecord) XMLStreamReaderInputSource(org.eclipse.persistence.internal.oxm.record.XMLStreamReaderInputSource) Descriptor(org.eclipse.persistence.internal.oxm.mappings.Descriptor) XMLMarshalException(org.eclipse.persistence.exceptions.XMLMarshalException)

Example 2 with ManyValue

use of org.eclipse.persistence.internal.jaxb.many.ManyValue in project eclipselink by eclipse-ee4j.

the class JAXBMarshaller method createXMLRootFromJAXBElement.

/**
 * Create an instance of XMLRoot populated from the contents of the provided
 * JAXBElement. XMLRoot will be used to hold the contents of the JAXBElement
 * while the marshal operation is performed by TopLink OXM. This will avoid
 * adding any runtime dependencies to TopLink.
 */
private Root createXMLRootFromJAXBElement(JAXBElement elt) {
    // create an XMLRoot to hand into the marshaller
    Root xmlroot = new Root();
    Object objectValue = elt.getValue();
    xmlroot.setObject(objectValue);
    QName qname = elt.getName();
    xmlroot.setLocalName(qname.getLocalPart());
    xmlroot.setNamespaceURI(qname.getNamespaceURI());
    xmlroot.setDeclaredType(elt.getDeclaredType());
    xmlroot.setNil(elt.isNil());
    if (elt.getDeclaredType() == CoreClassConstants.ABYTE || elt.getDeclaredType() == CoreClassConstants.APBYTE || elt.getDeclaredType().getCanonicalName().equals("jakarta.activation.DataHandler") || elt.getDeclaredType().isEnum()) {
        // need a binary data mapping so need to wrap
        Class<?> generatedClass = getClassToGeneratedClasses().get(elt.getDeclaredType().getCanonicalName());
        if (!elt.getDeclaredType().isEnum()) {
            xmlroot.setSchemaType(Constants.BASE_64_BINARY_QNAME);
        }
        if (generatedClass != null && WrappedValue.class.isAssignableFrom(generatedClass)) {
            ClassDescriptor desc = xmlMarshaller.getXMLContext().getSession(generatedClass).getDescriptor(generatedClass);
            Object newObject = desc.getInstantiationPolicy().buildNewInstance();
            ((WrappedValue) newObject).setValue(objectValue);
            xmlroot.setObject(newObject);
            return xmlroot;
        }
    } else {
        xmlroot.setSchemaType(org.eclipse.persistence.internal.oxm.XMLConversionManager.getDefaultJavaTypes().get(elt.getDeclaredType()));
    }
    if (elt instanceof WrappedValue) {
        xmlroot.setObject(elt);
        return xmlroot;
    }
    Map<QName, Class<?>> qNameToGeneratedClasses = jaxbContext.getQNameToGeneratedClasses();
    if (qNameToGeneratedClasses != null) {
        Class<?> theClass = qNameToGeneratedClasses.get(qname);
        if (theClass != null && WrappedValue.class.isAssignableFrom(theClass)) {
            ClassDescriptor desc = xmlMarshaller.getXMLContext().getSession(theClass).getDescriptor(theClass);
            Object newObject = desc.getInstantiationPolicy().buildNewInstance();
            ((WrappedValue) newObject).setValue(objectValue);
            xmlroot.setObject(newObject);
            return xmlroot;
        }
    }
    Class<?> generatedClass = null;
    if (jaxbContext.getTypeMappingInfoToGeneratedType() != null) {
        if (jaxbContext.getTypeToTypeMappingInfo() != null) {
            if (elt.getDeclaredType() != null && elt.getDeclaredType().isArray()) {
                TypeMappingInfo tmi = jaxbContext.getTypeToTypeMappingInfo().get(elt.getDeclaredType());
                generatedClass = jaxbContext.getTypeMappingInfoToGeneratedType().get(tmi);
            } else if (elt instanceof JAXBTypeElement) {
                Type objectType = ((JAXBTypeElement) elt).getType();
                TypeMappingInfo tmi = jaxbContext.getTypeToTypeMappingInfo().get(objectType);
                generatedClass = jaxbContext.getTypeMappingInfoToGeneratedType().get(tmi);
            }
        }
    } else {
        if (elt.getDeclaredType() != null && elt.getDeclaredType().isArray()) {
            if (jaxbContext.getArrayClassesToGeneratedClasses() != null) {
                generatedClass = jaxbContext.getArrayClassesToGeneratedClasses().get(elt.getDeclaredType().getCanonicalName());
            }
        } else if (elt instanceof JAXBTypeElement) {
            Type objectType = ((JAXBTypeElement) elt).getType();
            generatedClass = jaxbContext.getCollectionClassesToGeneratedClasses().get(objectType);
        }
    }
    if (generatedClass != null) {
        ClassDescriptor desc = xmlMarshaller.getXMLContext().getSession(generatedClass).getDescriptor(generatedClass);
        Object newObject = desc.getInstantiationPolicy().buildNewInstance();
        ((ManyValue) newObject).setItem(objectValue);
        xmlroot.setObject(newObject);
    }
    return xmlroot;
}
Also used : Type(java.lang.reflect.Type) MediaType(org.eclipse.persistence.oxm.MediaType) Root(org.eclipse.persistence.internal.oxm.Root) ClassDescriptor(org.eclipse.persistence.descriptors.ClassDescriptor) QName(javax.xml.namespace.QName) ManyValue(org.eclipse.persistence.internal.jaxb.many.ManyValue) WrappedValue(org.eclipse.persistence.internal.jaxb.WrappedValue)

Example 3 with ManyValue

use of org.eclipse.persistence.internal.jaxb.many.ManyValue in project eclipselink by eclipse-ee4j.

the class JAXBContext method createJAXBElementFromXMLRoot.

protected JAXBElement createJAXBElementFromXMLRoot(Root xmlRoot, Class<?> declaredType) {
    Object value = xmlRoot.getObject();
    if (value instanceof List) {
        List theList = (List) value;
        for (int i = 0; i < theList.size(); i++) {
            Object next = theList.get(i);
            if (next instanceof Root) {
                theList.set(i, createJAXBElementFromXMLRoot((Root) next, declaredType));
            }
        }
    } else if (value instanceof WrappedValue) {
        QName qname = new QName(xmlRoot.getNamespaceURI(), xmlRoot.getLocalName());
        return new JAXBElement(qname, ((WrappedValue) value).getDeclaredType(), ((WrappedValue) value).getValue());
    } else if (value instanceof JAXBElement) {
        return (JAXBElement) value;
    } else if (value instanceof ManyValue) {
        value = ((ManyValue) value).getItem();
    }
    QName qname = new QName(xmlRoot.getNamespaceURI(), xmlRoot.getLocalName());
    Map<QName, Class<?>> qNamesToDeclaredClasses = getQNamesToDeclaredClasses();
    if (qNamesToDeclaredClasses != null && qNamesToDeclaredClasses.size() > 0) {
        Class<?> declaredClass = qNamesToDeclaredClasses.get(qname);
        if (declaredClass != null) {
            return createJAXBElement(qname, declaredClass, value);
        }
    }
    Class<?> xmlRootDeclaredType = xmlRoot.getDeclaredType();
    if (xmlRootDeclaredType != null) {
        return createJAXBElement(qname, xmlRootDeclaredType, value);
    }
    return createJAXBElement(qname, declaredType, value);
}
Also used : Root(org.eclipse.persistence.internal.oxm.Root) QName(javax.xml.namespace.QName) List(java.util.List) ArrayList(java.util.ArrayList) ManyValue(org.eclipse.persistence.internal.jaxb.many.ManyValue) JavaClass(org.eclipse.persistence.jaxb.javamodel.JavaClass) JAXBElement(jakarta.xml.bind.JAXBElement) WrappedValue(org.eclipse.persistence.internal.jaxb.WrappedValue)

Aggregations

QName (javax.xml.namespace.QName)3 WrappedValue (org.eclipse.persistence.internal.jaxb.WrappedValue)3 ManyValue (org.eclipse.persistence.internal.jaxb.many.ManyValue)3 JAXBElement (jakarta.xml.bind.JAXBElement)2 Root (org.eclipse.persistence.internal.oxm.Root)2 JAXBException (jakarta.xml.bind.JAXBException)1 PropertyException (jakarta.xml.bind.PropertyException)1 UnmarshalException (jakarta.xml.bind.UnmarshalException)1 ParameterizedType (java.lang.reflect.ParameterizedType)1 Type (java.lang.reflect.Type)1 ArrayList (java.util.ArrayList)1 List (java.util.List)1 ClassDescriptor (org.eclipse.persistence.descriptors.ClassDescriptor)1 BeanValidationException (org.eclipse.persistence.exceptions.BeanValidationException)1 XMLMarshalException (org.eclipse.persistence.exceptions.XMLMarshalException)1 Descriptor (org.eclipse.persistence.internal.oxm.mappings.Descriptor)1 DirectCollectionMapping (org.eclipse.persistence.internal.oxm.mappings.DirectCollectionMapping)1 XMLStreamReaderInputSource (org.eclipse.persistence.internal.oxm.record.XMLStreamReaderInputSource)1 XMLStreamReaderReader (org.eclipse.persistence.internal.oxm.record.XMLStreamReaderReader)1 RootLevelXmlAdapter (org.eclipse.persistence.jaxb.JAXBContext.RootLevelXmlAdapter)1