* object's primary key values that are mapped to the collection mapping's fields
* (in the XMLCollectionReferenceMapping's source-target key field association list)
* are retrieved and written out.
*/
public boolean marshal(XPathFragment xPathFragment, MarshalRecord marshalRecord, Object object, AbstractSession session, NamespaceResolver namespaceResolver) {
ContainerPolicy cp = xmlCollectionReferenceMapping.getContainerPolicy();
Object collection = xmlCollectionReferenceMapping.getAttributeAccessor().getAttributeValueFromObject(object);
if (collection == null) {
return false;
}
Object iterator = cp.iteratorFor(collection);
if (cp.hasNext(iterator)) {
XPathFragment groupingFragment = marshalRecord.openStartGroupingElements(namespaceResolver);
marshalRecord.closeStartGroupingElements(groupingFragment);
} else {
return false;
}
Object objectValue;
String stringValue = "";
String newValue;
QName schemaType;
if (xmlCollectionReferenceMapping.usesSingleNode()) {
while (cp.hasNext(iterator)) {
objectValue = cp.next(iterator, session);
Object fieldValue = xmlCollectionReferenceMapping.buildFieldValue(objectValue, xmlField, session);
if (fieldValue == null) {
return false;
}
schemaType = getSchemaType(xmlField, fieldValue, session);
newValue = getValueToWrite(schemaType, fieldValue, (XMLConversionManager) session.getDatasourcePlatform().getConversionManager());
if (newValue != null) {
stringValue += newValue;
if (cp.hasNext(iterator)) {
stringValue += SPACE;
}
}
}
marshalSingleValue(xPathFragment, marshalRecord, object, stringValue, session, namespaceResolver, ObjectMarshalContext.getInstance());
} else {
while (cp.hasNext(iterator)) {
objectValue = cp.next(iterator, session);
marshalSingleValue(xPathFragment, marshalRecord, object, objectValue, session, namespaceResolver, ObjectMarshalContext.getInstance());
}
}
return true;
}