import org.eclipse.persistence.config.DescriptorCustomizer; import org.eclipse.persistence.descriptors.ClassDescriptor; import org.eclipse.persistence.oxm.mappings.XMLObjectReferenceMapping; public class PhoneNumberCustomizer implements DescriptorCustomizer { @Override public void customize(ClassDescriptor descriptor) throws Exception { descriptor.removeMappingForAttributeName("contact"); XMLObjectReferenceMapping contactMapping = new XMLObjectReferenceMapping(); contactMapping.setAttributeName("contact"); contactMapping.setReferenceClass(Employee.class); contactMapping.addSourceToTargetKeyFieldAssociation("contact/@eID", "eId/text()"); contactMapping.addSourceToTargetKeyFieldAssociation("contact/@country", "country/text()"); descriptor.addMapping(contactMapping); } }
public void writeSingleValue(Object value, Object parent, XMLRecord row, AbstractSession session) { for (Iterator fieldIt = getFields().iterator(); fieldIt.hasNext();) { XMLField xmlField = (XMLField) fieldIt.next(); Object fieldValue = buildFieldValue(value, xmlField, session); if (fieldValue != null) { QName schemaType = getSchemaType(xmlField, fieldValue, session); String stringValue = getValueToWrite(schemaType, fieldValue, session); row.put(xmlField, stringValue); } } }
public void preInitialize(AbstractSession session) throws DescriptorException { getAttributeAccessor().setIsWriteOnly(this.isWriteOnly()); getAttributeAccessor().setIsReadOnly(this.isReadOnly()); super.preInitialize(session); }
/** * INTERNAL: * Write the attribute value from the object to the row. */ @Override public void writeFromObjectIntoRow(Object object, AbstractRecord row, AbstractSession session, WriteType writeType) { // for each xmlField on this mapping Object targetObject = getAttributeValueFromObject(object); writeSingleValue(targetObject, object, (XMLRecord) row, session); }
private void addChoiceElementMapping(XMLField sourceField, String className, XMLField targetField) { XMLObjectReferenceMapping mapping = new XMLObjectReferenceMapping(); mapping.setReferenceClassName(className); mapping.setAttributeAccessor(temporaryAccessor); mapping.addSourceToTargetKeyFieldAssociation(sourceField, targetField); this.choiceElementMappings.put(sourceField, mapping); this.choiceElementMappingsByClassName.put(className, mapping); }
private void addChoiceElementMapping(XMLField sourceField, Class theClass, XMLField targetField) { XMLObjectReferenceMapping mapping = new XMLObjectReferenceMapping(); mapping.setReferenceClass(theClass); mapping.setAttributeAccessor(temporaryAccessor); mapping.addSourceToTargetKeyFieldAssociation(sourceField, targetField); this.choiceElementMappings.put(sourceField, mapping); this.choiceElementMappingsByClass.put(theClass, mapping); }
if (getReferenceClass() == null) { setReferenceClass(session.getDatasourcePlatform().getConversionManager().convertClassNameToClass(getReferenceClassName())); XMLDescriptor descriptor = (XMLDescriptor) this.getDescriptor(); XMLDescriptor targetDescriptor = (XMLDescriptor) getReferenceDescriptor(); for (int index = 0; index < sourceToTargetKeys.size(); index++) { XMLField sourceField = (XMLField) sourceToTargetKeys.get(index);
if (null == referenceClass) { if(referenceClassName != null){ setReferenceClass(session.getDatasourcePlatform().getConversionManager().convertClassNameToClass(referenceClassName)); XMLDescriptor descriptor = (XMLDescriptor) this.getDescriptor(); XMLDescriptor targetDescriptor = (XMLDescriptor) getReferenceDescriptor(); for (int index = 0; index < sourceToTargetKeys.size(); index++) { XMLField sourceField = (XMLField) sourceToTargetKeys.get(index);
/** * INTERNAL: * Cascade registerNew for Create through mappings that require the cascade */ public void cascadeRegisterNewIfRequired(Object object, UnitOfWorkImpl uow, Map visitedObjects) { // Aggregate objects are not registered but their mappings should be. Object objectReferenced = getRealAttributeValueFromObject(object, uow); if (objectReferenced == null) { return; } if (!visitedObjects.containsKey(objectReferenced)) { visitedObjects.put(objectReferenced, objectReferenced); ObjectBuilder builder = getReferenceDescriptor(objectReferenced.getClass(), uow).getObjectBuilder(); builder.cascadeRegisterNewForCreate(objectReferenced, uow, visitedObjects); } }
/** * INTERNAL: * Retrieve the target object's primary key value that is mapped to a given * source xpath (in the source-target key field association list). * * @param sourceObject * @param xmlFld * @param session * @return null if the target object is null, the reference class is null, or * a primary key field name does not exist on the reference descriptor that * matches the target field name - otherwise, return the associated primary * key value */ public Object buildFieldValue(Object targetObject, XMLField xmlFld, AbstractSession session) { if (targetObject == null || getReferenceClass() == null) { return null; } ClassDescriptor descriptor = getReferenceDescriptor(); ObjectBuilder objectBuilder = descriptor.getObjectBuilder(); Vector pks = objectBuilder.extractPrimaryKeyFromObject(targetObject, session); int idx = descriptor.getPrimaryKeyFields().indexOf(getSourceToTargetKeyFieldAssociations().get(xmlFld)); if (idx == -1) { return null; } return pks.get(idx); }
if (targetObject == null || getReferenceClass() == null) { return null; Object primaryKey = objectBuilder.extractPrimaryKeyFromObject(targetObject, session); int idx = 0; if(!(null == referenceClass || ClassConstants.OBJECT == getReferenceClass())) { idx = descriptor.getPrimaryKeyFields().indexOf(getSourceToTargetKeyFieldAssociations().get(xmlFld)); if (idx == -1) { return null;
private Setting convertToSetting(DatabaseMapping mapping, Object value) { XMLDescriptor xmlDescriptor = (XMLDescriptor) mapping.getDescriptor(); NamespaceResolver nsResolver = xmlDescriptor.getNamespaceResolver(); Setting rootSetting = new Setting(); XMLField xmlField = (XMLField) mapping.getField(); if (xmlField == null) { if (mapping instanceof XMLObjectReferenceMapping) { xmlField = (XMLField) ((XMLObjectReferenceMapping) mapping).getFields().get(0); } else if (mapping instanceof XMLCollectionReferenceMapping) { xmlField = (XMLField) ((XMLCollectionReferenceMapping) mapping).getFields().get(0); } } Setting setting = rootSetting; if (xmlField != null) { XPathFragment xPathFragment = xmlField.getXPathFragment(); rootSetting = convertToSetting(xPathFragment, nsResolver); setting = rootSetting; while (xPathFragment.getNextFragment() != null) { xPathFragment = xPathFragment.getNextFragment(); Setting childSetting = convertToSetting(xPathFragment, nsResolver); setting.addChild(childSetting); setting = childSetting; } } setting.setObject(dataObject); setting.setMapping(mapping); setting.setValue(value, false); return rootSetting; }
oppositeMapping.setInverseReferenceMapping(this); if(refMapping.getReferenceClass() == this.getDescriptor().getJavaClass()) { refMapping.setInverseReferenceMapping(this);
ObjectReferenceMapping mapping = new XMLObjectReferenceMapping(); initializeXMLMapping((XMLMapping)mapping, property); mapping.setReferenceClassName(referenceClass.getQualifiedName());
public boolean marshalSingleValue(XPathFragment xPathFragment, MarshalRecord marshalRecord, Object object, Object targetObject, AbstractSession session, NamespaceResolver namespaceResolver, MarshalContext marshalContext) { Object fieldValue = xmlObjectReferenceMapping.buildFieldValue(targetObject, xmlField, session); if (fieldValue == null) { if(null != targetObject) { XMLField fkField = (XMLField) xmlObjectReferenceMapping.getSourceToTargetKeyFieldAssociations().get(xmlField); fieldValue = marshalRecord.getMarshaller().getXMLContext().getValueByXPath(targetObject, fkField.getXPath(), fkField.getNamespaceResolver(), Object.class); } if(null == fieldValue) { return false; } } QName schemaType = getSchemaType(xmlField, fieldValue, session); String stringValue = getValueToWrite(schemaType, fieldValue, (XMLConversionManager) session.getDatasourcePlatform().getConversionManager(),namespaceResolver); XPathFragment groupingFragment = marshalRecord.openStartGroupingElements(namespaceResolver); if (xPathFragment.isAttribute()) { marshalRecord.attribute(xPathFragment, namespaceResolver, stringValue); marshalRecord.closeStartGroupingElements(groupingFragment); } else { marshalRecord.closeStartGroupingElements(groupingFragment); marshalRecord.characters(stringValue); } return true; }
if(nextMapping instanceof XMLObjectReferenceMapping) { XMLObjectReferenceMapping refMapping = (XMLObjectReferenceMapping)nextMapping; if(refMapping.getInverseReferenceMapping().getAttributeAccessor() != null && refMapping.getInverseReferenceMapping().getContainerPolicy() != null) { ClassDescriptor refDescriptor = ormSession.getClassDescriptor(refMapping.getReferenceClass()); if(refDescriptor != null) { DatabaseMapping backpointerMapping =refDescriptor.getMappingForAttributeName(refMapping.getInverseReferenceMapping().getAttributeName()); if(backpointerMapping != null && backpointerMapping.isCollectionMapping()) { refMapping.getInverseReferenceMapping().getContainerPolicy().setContainerClass(((CollectionMapping)backpointerMapping).getContainerPolicy().getContainerClass());
private void addChoiceElementMapping(XMLField sourceField, Class theClass, XMLField targetField) { XMLObjectReferenceMapping mapping = new XMLObjectReferenceMapping(); mapping.setReferenceClass(theClass); mapping.setAttributeAccessor(temporaryAccessor); mapping.addSourceToTargetKeyFieldAssociation(sourceField, targetField); this.choiceElementMappings.put(sourceField, mapping); this.choiceElementMappingsByClass.put(theClass, mapping); }
private void addChoiceElementMapping(XMLField sourceField, String className, XMLField targetField) { XMLObjectReferenceMapping mapping = new XMLObjectReferenceMapping(); mapping.setReferenceClassName(className); mapping.setAttributeAccessor(temporaryAccessor); mapping.addSourceToTargetKeyFieldAssociation(sourceField, targetField); this.choiceElementMappings.put(sourceField, mapping); this.choiceElementMappingsByClassName.put(className, mapping); }
if (null == referenceClass) { if(referenceClassName != null){ setReferenceClass(session.getDatasourcePlatform().getConversionManager().convertClassNameToClass(referenceClassName)); XMLDescriptor descriptor = (XMLDescriptor) this.getDescriptor(); XMLDescriptor targetDescriptor = (XMLDescriptor) getReferenceDescriptor(); for (int index = 0; index < sourceToTargetKeys.size(); index++) { XMLField sourceField = (XMLField) sourceToTargetKeys.get(index);
/** * INTERNAL: * Cascade perform delete through mappings that require the cascade */ public void cascadePerformRemoveIfRequired(Object object, UnitOfWorkImpl uow, Map visitedObjects) { // objects referenced by this mapping are not registered as they have // no identity, however mappings from the referenced object may need cascading. Object objectReferenced = getRealAttributeValueFromObject(object, uow); if (objectReferenced == null) { return; } if (!visitedObjects.containsKey(objectReferenced)) { visitedObjects.put(objectReferenced, objectReferenced); ObjectBuilder builder = getReferenceDescriptor(objectReferenced.getClass(), uow).getObjectBuilder(); builder.cascadePerformRemove(objectReferenced, uow, visitedObjects); } }