Search in sources :

Example 1 with CompositeCollectionMappingContentHandler

use of org.eclipse.persistence.internal.oxm.record.deferred.CompositeCollectionMappingContentHandler in project eclipselink by eclipse-ee4j.

the class XMLCompositeCollectionMappingNodeValue method startElement.

@Override
public boolean startElement(XPathFragment xPathFragment, UnmarshalRecord unmarshalRecord, Attributes atts) {
    try {
        Descriptor xmlDescriptor = (Descriptor) xmlCompositeCollectionMapping.getReferenceDescriptor();
        if (xmlDescriptor == null) {
            xmlDescriptor = findReferenceDescriptor(xPathFragment, unmarshalRecord, atts, xmlCompositeCollectionMapping, xmlCompositeCollectionMapping.getKeepAsElementPolicy());
            if (xmlDescriptor == null) {
                if (unmarshalRecord.getXMLReader().isNullRepresentedByXsiNil(xmlCompositeCollectionMapping.getNullPolicy())) {
                    if (unmarshalRecord.isNil()) {
                        return true;
                    }
                } else if (xmlCompositeCollectionMapping.getNullPolicy().valueIsNull(atts)) {
                    getContainerPolicy().addInto(null, unmarshalRecord.getContainerInstance(this), unmarshalRecord.getSession());
                    return true;
                }
                if (xmlCompositeCollectionMapping.getField() != null) {
                    // try leaf element type
                    QName leafType = ((Field) xmlCompositeCollectionMapping.getField()).getLastXPathFragment().getLeafElementType();
                    if (leafType != null) {
                        XPathFragment frag = new XPathFragment();
                        frag.setNamespaceAware(unmarshalRecord.isNamespaceAware());
                        String xpath = leafType.getLocalPart();
                        String uri = leafType.getNamespaceURI();
                        if (uri != null && uri.length() > 0) {
                            frag.setNamespaceURI(uri);
                            String prefix = ((Descriptor) xmlCompositeCollectionMapping.getDescriptor()).getNonNullNamespaceResolver().resolveNamespaceURI(uri);
                            if (prefix != null && prefix.length() > 0) {
                                xpath = prefix + Constants.COLON + xpath;
                            }
                        }
                        frag.setXPath(xpath);
                        Context xmlContext = unmarshalRecord.getUnmarshaller().getContext();
                        xmlDescriptor = xmlContext.getDescriptorByGlobalType(frag);
                    }
                }
            }
            UnmarshalKeepAsElementPolicy policy = xmlCompositeCollectionMapping.getKeepAsElementPolicy();
            if (policy != null && ((xmlDescriptor == null && policy.isKeepUnknownAsElement()) || policy.isKeepAllAsElement())) {
                if (unmarshalRecord.getTypeQName() != null) {
                    Class<Object> theClass = unmarshalRecord.getConversionManager().javaType(unmarshalRecord.getTypeQName());
                    if (theClass == null) {
                        setupHandlerForKeepAsElementPolicy(unmarshalRecord, xPathFragment, atts);
                        return true;
                    }
                } else {
                    setupHandlerForKeepAsElementPolicy(unmarshalRecord, xPathFragment, atts);
                    return true;
                }
            }
        }
        AbstractNullPolicy nullPolicy = xmlCompositeCollectionMapping.getNullPolicy();
        if (nullPolicy.isNullRepresentedByEmptyNode()) {
            String qnameString = xPathFragment.getLocalName();
            if (xPathFragment.getPrefix() != null) {
                qnameString = xPathFragment.getPrefix() + Constants.COLON + qnameString;
            }
            if (null != xmlDescriptor) {
                // Process null capable value
                CompositeCollectionMappingContentHandler aHandler = new // 
                CompositeCollectionMappingContentHandler(unmarshalRecord, this, xmlCompositeCollectionMapping, atts, xPathFragment, xmlDescriptor);
                // Send control to the handler
                aHandler.startElement(xPathFragment.getNamespaceURI(), xPathFragment.getLocalName(), qnameString, atts);
                XMLReader xmlReader = unmarshalRecord.getXMLReader();
                xmlReader.setContentHandler(aHandler);
                xmlReader.setLexicalHandler(aHandler);
            }
        } else if (!(unmarshalRecord.getXMLReader().isNullRecord(nullPolicy, atts, unmarshalRecord))) {
            Field xmlFld = (Field) this.xmlCompositeCollectionMapping.getField();
            if (xmlFld.hasLastXPathFragment()) {
                unmarshalRecord.setLeafElementType(xmlFld.getLastXPathFragment().getLeafElementType());
            }
            processChild(xPathFragment, unmarshalRecord, atts, xmlDescriptor, xmlCompositeCollectionMapping);
        }
    } catch (SAXException e) {
        throw XMLMarshalException.unmarshalException(e);
    }
    return true;
}
Also used : MarshalContext(org.eclipse.persistence.internal.oxm.record.MarshalContext) ObjectMarshalContext(org.eclipse.persistence.internal.oxm.record.ObjectMarshalContext) AbstractNullPolicy(org.eclipse.persistence.oxm.mappings.nullpolicy.AbstractNullPolicy) CompositeCollectionMappingContentHandler(org.eclipse.persistence.internal.oxm.record.deferred.CompositeCollectionMappingContentHandler) QName(javax.xml.namespace.QName) SAXException(org.xml.sax.SAXException) Field(org.eclipse.persistence.internal.oxm.mappings.Field) Descriptor(org.eclipse.persistence.internal.oxm.mappings.Descriptor) UnmarshalKeepAsElementPolicy(org.eclipse.persistence.internal.oxm.mappings.UnmarshalKeepAsElementPolicy) XMLReader(org.eclipse.persistence.internal.oxm.record.XMLReader)

Aggregations

QName (javax.xml.namespace.QName)1 Descriptor (org.eclipse.persistence.internal.oxm.mappings.Descriptor)1 Field (org.eclipse.persistence.internal.oxm.mappings.Field)1 UnmarshalKeepAsElementPolicy (org.eclipse.persistence.internal.oxm.mappings.UnmarshalKeepAsElementPolicy)1 MarshalContext (org.eclipse.persistence.internal.oxm.record.MarshalContext)1 ObjectMarshalContext (org.eclipse.persistence.internal.oxm.record.ObjectMarshalContext)1 XMLReader (org.eclipse.persistence.internal.oxm.record.XMLReader)1 CompositeCollectionMappingContentHandler (org.eclipse.persistence.internal.oxm.record.deferred.CompositeCollectionMappingContentHandler)1 AbstractNullPolicy (org.eclipse.persistence.oxm.mappings.nullpolicy.AbstractNullPolicy)1 SAXException (org.xml.sax.SAXException)1