Search in sources :

Example 16 with Field

use of org.eclipse.persistence.internal.oxm.mappings.Field in project eclipselink by eclipse-ee4j.

the class UnmarshalRecordImpl method endDocument.

@Override
public void endDocument() throws SAXException {
    if (unmarshaller.getIDResolver() != null && parentRecord == null) {
        unmarshaller.getIDResolver().endDocument();
    }
    if (null != selfRecords) {
        for (int x = 0, selfRecordsSize = selfRecords.size(); x < selfRecordsSize; x++) {
            UnmarshalRecord selfRecord = selfRecords.get(x);
            if (selfRecord != null) {
                selfRecord.endDocument();
            }
        }
    }
    if (null != xPathNode.getSelfChildren()) {
        int selfChildrenSize = xPathNode.getSelfChildren().size();
        for (int x = 0; x < selfChildrenSize; x++) {
            XPathNode selfNode = xPathNode.getSelfChildren().get(x);
            if (null != selfNode.getNodeValue()) {
                selfNode.getNodeValue().endSelfNodeValue(this, selfRecords.get(x), attributes);
            }
        }
    }
    CoreDescriptor xmlDescriptor = treeObjectBuilder.getDescriptor();
    try {
        // All populated containerValues need to be set on the object
        if (null != populatedContainerValues) {
            for (int populatedCVSize = populatedContainerValues.size(), i = populatedCVSize - 1; i >= 0; i--) {
                ContainerValue cv = (populatedContainerValues.get(i));
                cv.setContainerInstance(currentObject, getContainerInstance(cv, cv.isDefaultEmptyContainer()));
            }
        }
        // Additionally if any containerValues are defaultEmptyContainerValues they need to be set to a new empty container
        if (null != defaultEmptyContainerValues) {
            for (int defaultEmptyCVSize = defaultEmptyContainerValues.size(), i = defaultEmptyCVSize - 1; i >= 0; i--) {
                ContainerValue cv = (defaultEmptyContainerValues.get(i));
                cv.setContainerInstance(currentObject, getContainerInstance(cv, cv.isDefaultEmptyContainer()));
            }
        }
        // trigger the mapping.
        if (null != nullCapableValues) {
            for (int x = 0, nullValuesSize = nullCapableValues.size(); x < nullValuesSize; x++) {
                nullCapableValues.get(x).setNullValue(currentObject, session);
            }
        }
        // PROCESS TRANSFORMATION MAPPINGS
        List<TransformationMapping> transformationMappings = treeObjectBuilder.getTransformationMappings();
        if (null != transformationMappings) {
            for (int x = 0, transformationMappingsSize = transformationMappings.size(); x < transformationMappingsSize; x++) {
                TransformationMapping transformationMapping = transformationMappings.get(x);
                transformationMapping.readFromRowIntoObject((XMLRecord) transformationRecord, currentObject, session, true);
            }
        }
        Unmarshaller.Listener listener = unmarshaller.getUnmarshalListener();
        if (listener != null) {
            if (this.parentRecord != null) {
                listener.afterUnmarshal(currentObject, parentRecord.getCurrentObject());
            } else {
                listener.afterUnmarshal(currentObject, null);
            }
        }
        // HANDLE POST BUILD EVENTS
        if (xmlDescriptor.hasEventManager()) {
            CoreDescriptorEventManager eventManager = xmlDescriptor.getEventManager();
            if (null != eventManager && eventManager.hasAnyEventListeners()) {
                DescriptorEvent event = new DescriptorEvent(currentObject);
                event.setSession((AbstractSession) session);
                // this);
                event.setRecord(null);
                event.setEventCode(DescriptorEventManager.PostBuildEvent);
                eventManager.executeEvent(event);
            }
        }
    } catch (EclipseLinkException e) {
        if (null == xmlReader.getErrorHandler()) {
            throw e;
        } else {
            SAXParseException saxParseException = new SAXParseException(null, getDocumentLocator(), e);
            xmlReader.getErrorHandler().error(saxParseException);
        }
    }
    // if the object has any primary key fields set, add it to the cache
    if (null != referenceResolver) {
        if (null != xmlDescriptor) {
            List primaryKeyFields = xmlDescriptor.getPrimaryKeyFields();
            if (null != primaryKeyFields) {
                int primaryKeyFieldsSize = primaryKeyFields.size();
                if (primaryKeyFieldsSize > 0) {
                    CacheId pk = (CacheId) treeObjectBuilder.extractPrimaryKeyFromObject(currentObject, session);
                    for (int x = 0; x < primaryKeyFieldsSize; x++) {
                        Object value = pk.getPrimaryKey()[x];
                        if (null == value) {
                            Field pkField = (Field) xmlDescriptor.getPrimaryKeyFields().get(x);
                            pk.set(x, unmarshaller.getContext().getValueByXPath(currentObject, pkField.getXPath(), pkField.getNamespaceResolver(), Object.class));
                        }
                    }
                    referenceResolver.putValue(xmlDescriptor.getJavaClass(), pk, currentObject);
                    if (unmarshaller.getIDResolver() != null) {
                        try {
                            if (primaryKeyFieldsSize > 1) {
                                Map<String, Object> idWrapper = new HashMap<>();
                                for (int x = 0; x < primaryKeyFieldsSize; x++) {
                                    String idName = (String) xmlDescriptor.getPrimaryKeyFieldNames().get(x);
                                    Object idValue = pk.getPrimaryKey()[x];
                                    idWrapper.put(idName, idValue);
                                }
                                unmarshaller.getIDResolver().bind(idWrapper, currentObject);
                            } else {
                                unmarshaller.getIDResolver().bind(pk.getPrimaryKey()[0], currentObject);
                            }
                        } catch (SAXException e) {
                            throw XMLMarshalException.unmarshalException(e);
                        }
                    }
                }
            }
        }
    }
    if (null != parentRecord) {
        reset();
    }
    // Set XML Location if applicable
    if (xmlLocation != null && ((Descriptor) xmlDescriptor).getLocationAccessor() != null) {
        ((Descriptor) xmlDescriptor).getLocationAccessor().setAttributeValueInObject(getCurrentObject(), xmlLocation);
    }
}
Also used : CoreDescriptorEventManager(org.eclipse.persistence.core.descriptors.CoreDescriptorEventManager) TransformationMapping(org.eclipse.persistence.internal.oxm.mappings.TransformationMapping) HashMap(java.util.HashMap) CoreDescriptor(org.eclipse.persistence.core.descriptors.CoreDescriptor) DescriptorEvent(org.eclipse.persistence.descriptors.DescriptorEvent) XPathNode(org.eclipse.persistence.internal.oxm.XPathNode) ContainerValue(org.eclipse.persistence.internal.oxm.ContainerValue) SAXException(org.xml.sax.SAXException) Field(org.eclipse.persistence.internal.oxm.mappings.Field) CoreField(org.eclipse.persistence.internal.core.helper.CoreField) EclipseLinkException(org.eclipse.persistence.exceptions.EclipseLinkException) SAXParseException(org.xml.sax.SAXParseException) CacheId(org.eclipse.persistence.internal.identitymaps.CacheId) Descriptor(org.eclipse.persistence.internal.oxm.mappings.Descriptor) CoreDescriptor(org.eclipse.persistence.core.descriptors.CoreDescriptor) List(java.util.List) ArrayList(java.util.ArrayList) Unmarshaller(org.eclipse.persistence.internal.oxm.Unmarshaller)

Example 17 with Field

use of org.eclipse.persistence.internal.oxm.mappings.Field in project eclipselink by eclipse-ee4j.

the class XMLMarshaller method buildRootFragment.

private XPathFragment buildRootFragment(Object object, DESCRIPTOR descriptor, boolean isXMLRoot, MarshalRecord marshalRecord) {
    XPathFragment rootFragment = null;
    if (isXMLRoot) {
        String xmlRootUri = ((Root) object).getNamespaceURI();
        String xmlRootLocalName = ((Root) object).getLocalName();
        rootFragment = new XPathFragment();
        rootFragment.setLocalName(xmlRootLocalName);
        rootFragment.setNamespaceURI(xmlRootUri);
        rootFragment.setNamespaceAware(marshalRecord.isNamespaceAware());
        rootFragment.setNamespaceSeparator(marshalRecord.getNamespaceSeparator());
        if (xmlRootUri != null) {
            if (descriptor != null) {
                String xmlRootPrefix = marshalRecord.getNamespaceResolver().resolveNamespaceURI(xmlRootUri);
                if (xmlRootPrefix == null && !(xmlRootUri.equals(marshalRecord.getNamespaceResolver().getDefaultNamespaceURI()))) {
                    xmlRootPrefix = marshalRecord.getNamespaceResolver().generatePrefix();
                    marshalRecord.getNamespaceResolver().put(xmlRootPrefix, xmlRootUri);
                }
                if (xmlRootPrefix == null) {
                    rootFragment.setXPath(xmlRootLocalName);
                } else {
                    rootFragment.setPrefix(xmlRootPrefix);
                }
            } else {
                if (marshalRecord.isNamespaceAware()) {
                    String xmlRootPrefix = "ns0";
                    marshalRecord.getNamespaceResolver().put(xmlRootPrefix, xmlRootUri);
                    rootFragment.setXPath(xmlRootPrefix + marshalRecord.getNamespaceSeparator() + xmlRootLocalName);
                } else {
                    rootFragment.setXPath(xmlRootLocalName);
                }
            }
        }
    } else {
        Field defaultRootField = descriptor.getDefaultRootElementField();
        if (defaultRootField != null) {
            rootFragment = defaultRootField.getXPathFragment();
        }
    }
    return rootFragment;
}
Also used : Field(org.eclipse.persistence.internal.oxm.mappings.Field)

Example 18 with Field

use of org.eclipse.persistence.internal.oxm.mappings.Field in project eclipselink by eclipse-ee4j.

the class XMLObjectReferenceMappingNodeValue method marshalSingleValue.

@Override
public boolean marshalSingleValue(XPathFragment xPathFragment, MarshalRecord marshalRecord, Object object, Object targetObject, CoreAbstractSession session, NamespaceResolver namespaceResolver, MarshalContext marshalContext) {
    Object fieldValue = xmlObjectReferenceMapping.buildFieldValue(targetObject, xmlField, session);
    if (fieldValue == null) {
        if (null != targetObject) {
            Field fkField = (Field) xmlObjectReferenceMapping.getSourceToTargetKeyFieldAssociations().get(xmlField);
            if (null == fkField) {
                Descriptor targetDescriptor = (Descriptor) session.getDescriptor(targetObject);
                fieldValue = marshalRecord.getMarshaller().getContext().getValueByXPath(targetObject, ((CoreField) targetDescriptor.getPrimaryKeyFields().get(0)).getName(), targetDescriptor.getNamespaceResolver(), Object.class);
            } else {
                fieldValue = marshalRecord.getMarshaller().getContext().getValueByXPath(targetObject, fkField.getXPath(), fkField.getNamespaceResolver(), Object.class);
            }
        }
        if (null == fieldValue) {
            return false;
        }
    }
    QName schemaType = xmlField.getSchemaTypeForValue(fieldValue, session);
    XPathFragment groupingFragment = marshalRecord.openStartGroupingElements(namespaceResolver);
    if (xPathFragment != null && xPathFragment.isAttribute()) {
        marshalRecord.attribute(xPathFragment, namespaceResolver, fieldValue, schemaType);
        marshalRecord.closeStartGroupingElements(groupingFragment);
    } else {
        marshalRecord.closeStartGroupingElements(groupingFragment);
        marshalRecord.characters(schemaType, fieldValue, null, false);
    }
    return true;
}
Also used : CoreField(org.eclipse.persistence.internal.core.helper.CoreField) Field(org.eclipse.persistence.internal.oxm.mappings.Field) QName(javax.xml.namespace.QName) Descriptor(org.eclipse.persistence.internal.oxm.mappings.Descriptor) CoreField(org.eclipse.persistence.internal.core.helper.CoreField)

Example 19 with Field

use of org.eclipse.persistence.internal.oxm.mappings.Field in project eclipselink by eclipse-ee4j.

the class XMLCompositeCollectionMappingNodeValue method marshalSingleValue.

@Override
public boolean marshalSingleValue(XPathFragment xPathFragment, MarshalRecord marshalRecord, Object object, Object value, CoreAbstractSession session, NamespaceResolver namespaceResolver, MarshalContext marshalContext) {
    Marshaller marshaller = marshalRecord.getMarshaller();
    // convert the value - if necessary
    boolean isNil = false;
    if (value instanceof Root) {
        isNil = ((Root) value).nil;
        value = ((Root) value).getObject();
    }
    value = xmlCompositeCollectionMapping.convertObjectValueToDataValue(value, session, marshaller);
    if (null == value) {
        return xmlCompositeCollectionMapping.getNullPolicy().compositeObjectMarshal(xPathFragment, marshalRecord, object, session, namespaceResolver);
    }
    Descriptor descriptor = (Descriptor) xmlCompositeCollectionMapping.getReferenceDescriptor();
    if (descriptor == null) {
        descriptor = (Descriptor) session.getDescriptor(value.getClass());
    } else if (descriptor.hasInheritance()) {
        Class<?> objectValueClass = value.getClass();
        if (!(objectValueClass == descriptor.getJavaClass())) {
            descriptor = (Descriptor) session.getDescriptor(objectValueClass);
        }
    }
    UnmarshalKeepAsElementPolicy keepAsElementPolicy = xmlCompositeCollectionMapping.getKeepAsElementPolicy();
    if (null != keepAsElementPolicy && (keepAsElementPolicy.isKeepUnknownAsElement() || keepAsElementPolicy.isKeepAllAsElement()) && value instanceof org.w3c.dom.Node) {
        marshalRecord.node((org.w3c.dom.Node) value, marshalRecord.getNamespaceResolver());
        return true;
    }
    if (descriptor != null) {
        marshalRecord.beforeContainmentMarshal(value);
        ObjectBuilder objectBuilder = (ObjectBuilder) descriptor.getObjectBuilder();
        CoreAttributeGroup group = marshalRecord.getCurrentAttributeGroup();
        CoreAttributeGroup nestedGroup = XMLRecord.DEFAULT_ATTRIBUTE_GROUP;
        CoreAttributeItem item = group.getItem(getMapping().getAttributeName());
        if (item != null) {
            if (item.getGroups() != null) {
                nestedGroup = item.getGroup(descriptor.getJavaClass());
            }
            if (nestedGroup == null) {
                nestedGroup = item.getGroup() == null ? XMLRecord.DEFAULT_ATTRIBUTE_GROUP : item.getGroup();
            }
        }
        marshalRecord.pushAttributeGroup(nestedGroup);
        xPathNode.startElement(marshalRecord, xPathFragment, object, session, namespaceResolver, objectBuilder, value);
        if (isNil) {
            marshalRecord.nilSimple(namespaceResolver);
        }
        List extraNamespaces = objectBuilder.addExtraNamespacesToNamespaceResolver(descriptor, marshalRecord, session, true, false);
        writeExtraNamespaces(extraNamespaces, marshalRecord, session);
        marshalRecord.addXsiTypeAndClassIndicatorIfRequired(descriptor, (Descriptor) xmlCompositeCollectionMapping.getReferenceDescriptor(), (Field) xmlCompositeCollectionMapping.getField(), false);
        objectBuilder.buildRow(marshalRecord, value, session, marshaller, xPathFragment);
        marshalRecord.afterContainmentMarshal(object, value);
        marshalRecord.popAttributeGroup();
        marshalRecord.endElement(xPathFragment, namespaceResolver);
        marshalRecord.removeExtraNamespacesFromNamespaceResolver(extraNamespaces, session);
    } else {
        if (Constants.UNKNOWN_OR_TRANSIENT_CLASS.equals(xmlCompositeCollectionMapping.getReferenceClassName())) {
            throw XMLMarshalException.descriptorNotFoundInProject(value.getClass().getName());
        }
        xPathNode.startElement(marshalRecord, xPathFragment, object, session, namespaceResolver, null, value);
        QName schemaType = ((Field) xmlCompositeCollectionMapping.getField()).getSchemaTypeForValue(value, session);
        updateNamespaces(schemaType, marshalRecord, ((Field) xmlCompositeCollectionMapping.getField()));
        marshalRecord.characters(schemaType, value, null, false);
        marshalRecord.endElement(xPathFragment, namespaceResolver);
    }
    return true;
}
Also used : CoreAttributeGroup(org.eclipse.persistence.core.queries.CoreAttributeGroup) QName(javax.xml.namespace.QName) Field(org.eclipse.persistence.internal.oxm.mappings.Field) CoreAttributeItem(org.eclipse.persistence.core.queries.CoreAttributeItem) Descriptor(org.eclipse.persistence.internal.oxm.mappings.Descriptor) List(java.util.List) UnmarshalKeepAsElementPolicy(org.eclipse.persistence.internal.oxm.mappings.UnmarshalKeepAsElementPolicy)

Example 20 with Field

use of org.eclipse.persistence.internal.oxm.mappings.Field in project eclipselink by eclipse-ee4j.

the class XMLCompositeDirectCollectionMappingNodeValue method addUnmarshalValue.

private void addUnmarshalValue(UnmarshalRecord unmarshalRecord, Object value, Object collection) {
    if (unmarshalRecord.isNil() && unmarshalRecord.getXMLReader().isNullRepresentedByXsiNil(xmlCompositeDirectCollectionMapping.getNullPolicy())) {
        value = null;
    } else if (!isWhitespaceAware() && Constants.EMPTY_STRING.equals(value)) {
        value = null;
    }
    Field xmlField = (Field) xmlCompositeDirectCollectionMapping.getField();
    ConversionManager conversionManager = unmarshalRecord.getConversionManager();
    if (unmarshalRecord.getTypeQName() != null) {
        Class<?> typeClass = xmlField.getJavaClass(unmarshalRecord.getTypeQName(), conversionManager);
        value = conversionManager.convertObject(value, typeClass, unmarshalRecord.getTypeQName());
    } else {
        value = unmarshalRecord.getXMLReader().convertValueBasedOnSchemaType(xmlField, value, conversionManager, unmarshalRecord);
    }
    value = xmlCompositeDirectCollectionMapping.convertDataValueToObjectValue(value, unmarshalRecord.getSession(), unmarshalRecord.getUnmarshaller());
    if (value != null && value.getClass() == CoreClassConstants.STRING) {
        if (xmlCompositeDirectCollectionMapping.isCollapsingStringValues()) {
            value = conversionManager.collapseStringValue((String) value);
        } else if (xmlCompositeDirectCollectionMapping.isNormalizingStringValues()) {
            value = conversionManager.normalizeStringValue((String) value);
        }
    }
    unmarshalRecord.addAttributeValue(this, value, collection);
}
Also used : Field(org.eclipse.persistence.internal.oxm.mappings.Field)

Aggregations

Field (org.eclipse.persistence.internal.oxm.mappings.Field)65 DatabaseField (org.eclipse.persistence.internal.helper.DatabaseField)20 XMLField (org.eclipse.persistence.oxm.XMLField)20 QName (javax.xml.namespace.QName)18 Descriptor (org.eclipse.persistence.internal.oxm.mappings.Descriptor)18 JavaField (org.eclipse.persistence.jaxb.javamodel.JavaField)16 DirectMapping (org.eclipse.persistence.internal.oxm.mappings.DirectMapping)14 JavaClass (org.eclipse.persistence.jaxb.javamodel.JavaClass)13 CompositeObjectMapping (org.eclipse.persistence.internal.oxm.mappings.CompositeObjectMapping)12 ArrayList (java.util.ArrayList)11 Mapping (org.eclipse.persistence.internal.oxm.mappings.Mapping)11 AbstractNullPolicy (org.eclipse.persistence.oxm.mappings.nullpolicy.AbstractNullPolicy)11 List (java.util.List)10 BinaryDataMapping (org.eclipse.persistence.internal.oxm.mappings.BinaryDataMapping)10 CoreMapping (org.eclipse.persistence.core.mappings.CoreMapping)9 ClassDescriptor (org.eclipse.persistence.descriptors.ClassDescriptor)8 SAXException (org.xml.sax.SAXException)8 CoreConverter (org.eclipse.persistence.core.mappings.converters.CoreConverter)7 XPathFragment (org.eclipse.persistence.internal.oxm.XPathFragment)7 BinaryDataCollectionMapping (org.eclipse.persistence.internal.oxm.mappings.BinaryDataCollectionMapping)7