Class used to marshal object to XML.
Create an XMLMarshaller from an XMLContext.
Code Sample
XMLContext context = new XMLContext("mySessionName");
XMLMarshaller marshaller = context.createMarshaller();
Objects can be marshalled to the following outputs:
- java.io.OutputStream
- java.io.Writer
- javax.xml.transform.Result
- org.w3c.dom.Node
- org.xml.sax.ContentHandler
Objects that can be marshalled are those which are mapped in the TopLink project associated with the XMLContext, and which are mapped to an XMLDescriptor that has a default root element specified.
@see org.eclipse.persistence.oxm.XMLContext
* INTENAL:
*/
public static void write(XMLEntityMappings entityMappings, Writer writer) {
entityMappings.setVersion(XMLEntityMappingsReader.ECLIPSELINK_ORM_XSD_VERSION);
XMLContext context = new XMLContext(new XMLEntityMappingsMappingProject(XMLEntityMappingsReader.ECLIPSELINK_ORM_NAMESPACE, XMLEntityMappingsReader.ECLIPSELINK_ORM_XSD_NAME));
XMLMarshaller marshaller = context.createMarshaller();
marshaller.setSchemaLocation(XMLEntityMappingsReader.ECLIPSELINK_ORM_NAMESPACE + " " + XMLEntityMappingsReader.ECLIPSELINK_ORM_XSD);
marshaller.marshal(entityMappings, writer);
try {
writer.flush();
} catch (IOException exception) {
throw ValidationException.fileError(exception);
if (xmlAnyObjectMapping.isReadOnly()) {
return false;
}
XMLMarshaller marshaller = marshalRecord.getMarshaller();
Object objectValue = marshalContext.getAttributeValue(object, xmlAnyObjectMapping);
if(xmlAnyObjectMapping.getConverter() != null) {
objectValue = xmlAnyObjectMapping.getConverter().convertObjectValueToDataValue(objectValue, session, marshalRecord.getMarshaller());
}
if (null == objectValue) {
return false;
}
XPathFragment groupingFragment = marshalRecord.openStartGroupingElements(namespaceResolver);
marshalRecord.closeStartGroupingElements(groupingFragment);
boolean wasXMLRoot = false;
XPathFragment xmlRootFragment = null;
Object originalValue = objectValue;
if (xmlAnyObjectMapping.usesXMLRoot() && (objectValue instanceof XMLRoot)) {
xmlRootFragment = new XPathFragment();
wasXMLRoot = true;
objectValue = ((XMLRoot) objectValue).getObject();
}
if (objectValue instanceof String) {
marshalSimpleValue(xmlRootFragment, marshalRecord, originalValue, object, objectValue, session, namespaceResolver);
} else {
Session childSession = null;
try {
childSession = marshaller.getXMLContext().getSession(objectValue);
} catch (XMLMarshalException e) {
marshalSimpleValue(xmlRootFragment, marshalRecord, originalValue, object, objectValue, session, namespaceResolver);
return true;
}
XMLDescriptor descriptor = (XMLDescriptor) childSession.getDescriptor(objectValue);
TreeObjectBuilder objectBuilder = (TreeObjectBuilder) descriptor.getObjectBuilder();
List extraNamespaces = objectBuilder.addExtraNamespacesToNamespaceResolver(descriptor, marshalRecord, session);
if (wasXMLRoot) {
Namespace generatedNamespace = setupFragment(((XMLRoot) originalValue), xmlRootFragment, marshalRecord);
if (generatedNamespace != null) {
extraNamespaces.add(generatedNamespace);
}
}
/*
* B5112171: 25 Apr 2006
* During marshalling - XML AnyObject and AnyCollection
* mappings throw a NullPointerException when the
* "document root element" on child object descriptors are not
* all defined. These nodes will be ignored with a warning.
*/
String defaultRootElementString = descriptor.getDefaultRootElement();
if (!wasXMLRoot && (defaultRootElementString == null)) {
AbstractSessionLog.getLog().log(SessionLog.WARNING, "marshal_warning_null_document_root_element", new Object[] { Helper.getShortClassName(this.getClass()), descriptor });
} else {
if ((marshaller != null) && (marshaller.getMarshalListener() != null)) {
marshaller.getMarshalListener().beforeMarshal(objectValue);
}
if (xmlRootFragment != null) {
rootFragment = xmlRootFragment;
} else {
rootFragment = new XPathFragment(defaultRootElementString);
//resolve URI
if ((rootFragment.getNamespaceURI() == null) && (rootFragment.getPrefix() != null)) {
String uri = descriptor.getNonNullNamespaceResolver().resolveNamespacePrefix(rootFragment.getPrefix());
rootFragment.setNamespaceURI(uri);
}
}
if (!wasXMLRoot) {
marshalRecord.setLeafElementType(descriptor.getDefaultRootElementType());
}
getXPathNode().startElement(marshalRecord, rootFragment, object, session, descriptor.getNonNullNamespaceResolver(), objectBuilder, objectValue);
if (xmlAnyObjectMapping.shouldAddXsiType(marshaller, descriptor, originalValue, wasXMLRoot)) {
String typeValue = descriptor.getSchemaReference().getSchemaContext();
addTypeAttribute(descriptor, marshalRecord, typeValue);
}
writeExtraNamespaces(extraNamespaces, marshalRecord, session);
objectBuilder.buildRow(marshalRecord, objectValue, (org.eclipse.persistence.internal.sessions.AbstractSession) childSession, marshaller);
marshalRecord.endElement(rootFragment, namespaceResolver);
objectBuilder.removeExtraNamespacesFromNamespaceResolver(marshalRecord, extraNamespaces, session);
if ((marshaller != null) && (marshaller.getMarshalListener() != null)) {
marshaller.getMarshalListener().afterMarshal(objectValue);
}
}
}
return true;
public void marshalSingleValue(XPathFragment xPathFragment, MarshalRecord marshalRecord, Object object, Object value, AbstractSession session, NamespaceResolver namespaceResolver, MarshalContext marshalContext) {
if (xPathFragment.hasLeafElementType()) {
marshalRecord.setLeafElementType(xPathFragment.getLeafElementType());
}
XMLMarshaller marshaller = marshalRecord.getMarshaller();
// convert the value - if necessary
if (xmlCompositeCollectionMapping.hasConverter()) {
Converter converter = xmlCompositeCollectionMapping.getConverter();
if (converter instanceof XMLConverter) {
value = ((XMLConverter)converter).convertObjectValueToDataValue(value, session, marshaller);
} else {
value = converter.convertObjectValueToDataValue(value, session);
}
}
if (null == value) {
xmlCompositeCollectionMapping.getNullPolicy().compositeObjectMarshal(xPathFragment, marshalRecord, object, session, namespaceResolver);
return;
}
XMLDescriptor descriptor = (XMLDescriptor)session.getDescriptor(value);
TreeObjectBuilder objectBuilder = (TreeObjectBuilder)descriptor.getObjectBuilder();
if ((marshaller != null) && (marshaller.getMarshalListener() != null)) {
marshaller.getMarshalListener().beforeMarshal(value);
}
getXPathNode().startElement(marshalRecord, xPathFragment, object, session, namespaceResolver, objectBuilder, value);
if ((xmlCompositeCollectionMapping.getReferenceDescriptor() == null) && (descriptor.getSchemaReference() != null)) {
addTypeAttributeIfNeeded(descriptor, xmlCompositeCollectionMapping, marshalRecord);
}
List extraNamespaces = objectBuilder.addExtraNamespacesToNamespaceResolver(descriptor, marshalRecord, session);
writeExtraNamespaces(extraNamespaces, marshalRecord, session);
objectBuilder.buildRow(marshalRecord, value, session, marshaller);
marshalRecord.endElement(xPathFragment, namespaceResolver);
objectBuilder.removeExtraNamespacesFromNamespaceResolver(marshalRecord, extraNamespaces, session);
if ((marshaller != null) && (marshaller.getMarshalListener() != null)) {
marshaller.getMarshalListener().afterMarshal(value);
}
}
marshalRecord.getNamespaceResolver().put(xopPrefix, XMLConstants.XOP_URL);
}
namespaceResolver = marshalRecord.getNamespaceResolver();
}
XMLMarshaller marshaller = marshalRecord.getMarshaller();
if (xmlBinaryDataCollectionMapping.getValueConverter() != null) {
Converter converter = xmlBinaryDataCollectionMapping.getValueConverter();
if (converter instanceof XMLConverter) {
objectValue = ((XMLConverter) converter).convertObjectValueToDataValue(objectValue, session, marshaller);
} else {
objectValue = converter.convertObjectValueToDataValue(objectValue, session);
}
}
XPathFragment groupingFragment = marshalRecord.openStartGroupingElements(namespaceResolver);
marshalRecord.closeStartGroupingElements(groupingFragment);
marshalRecord.openStartElement(xPathFragment, namespaceResolver);
marshalRecord.closeStartElement();
if (xmlBinaryDataCollectionMapping.isSwaRef() && marshaller.getAttachmentMarshaller() != null) {
//object value should be a DataHandler
String c_id = null;
if (xmlBinaryDataCollectionMapping.getAttributeClassification() == XMLBinaryDataHelper.getXMLBinaryDataHelper().DATA_HANDLER) {
c_id = marshaller.getAttachmentMarshaller().addSwaRefAttachment((DataHandler) objectValue);
} else {
XMLBinaryDataHelper.EncodedData data = XMLBinaryDataHelper.getXMLBinaryDataHelper().getBytesForBinaryValue(//
objectValue, marshaller, xmlBinaryDataCollectionMapping.getMimeType(object));
byte[] bytes = data.getData();
c_id = marshaller.getAttachmentMarshaller().addSwaRefAttachment(bytes, 0, bytes.length);
}
marshalRecord.characters(c_id);
} else {
if (marshaller.getAttachmentMarshaller() != null && marshaller.getAttachmentMarshaller().isXOPPackage() && !xmlBinaryDataCollectionMapping.shouldInlineBinaryData()) {
XPathFragment lastFrag = ((XMLField) xmlBinaryDataCollectionMapping.getField()).getLastXPathFragment();
String c_id = "";
if (objectValue.getClass() == ClassConstants.APBYTE) {
byte[] bytes = (byte[]) objectValue;
c_id = marshaller.getAttachmentMarshaller().addMtomAttachment(bytes, 0, bytes.length, lastFrag.getLocalName(), lastFrag.getNamespaceURI(), null);
} else if (xmlBinaryDataCollectionMapping.getAttributeClassification() == XMLBinaryDataHelper.getXMLBinaryDataHelper().DATA_HANDLER) {
c_id = marshaller.getAttachmentMarshaller().addMtomAttachment((DataHandler) objectValue, lastFrag.getLocalName(), lastFrag.getNamespaceURI());
} else {
XMLBinaryDataHelper.EncodedData data = XMLBinaryDataHelper.getXMLBinaryDataHelper().getBytesForBinaryValue(//
objectValue, marshaller, xmlBinaryDataCollectionMapping.getMimeTypePolicy().getMimeType(object));
byte[] bytes = data.getData();
c_id = marshaller.getAttachmentMarshaller().addMtomAttachment(bytes, 0, bytes.length, //
data.getMimeType(), lastFrag.getLocalName(), lastFrag.getNamespaceURI());
}
XPathFragment xopInclude = new XPathFragment(xopPrefix + ":Include");
xopInclude.setNamespaceURI(XMLConstants.XOP_URL);
marshalRecord.openStartElement(xopInclude, namespaceResolver);
if (xPathFragment.hasLeafElementType()) {
marshalRecord.setLeafElementType(xPathFragment.getLeafElementType());
}
XMLMarshaller marshaller = marshalRecord.getMarshaller();
Object objectValue = marshalContext.getAttributeValue(object, xmlCompositeObjectMapping);
if (xmlCompositeObjectMapping.getConverter() != null) {
Converter converter = xmlCompositeObjectMapping.getConverter();
if (converter instanceof XMLConverter) {
objectValue = ((XMLConverter)converter).convertObjectValueToDataValue(objectValue, session, marshaller);
} else {
objectValue = converter.convertObjectValueToDataValue(objectValue, session);
}
}
if (null == objectValue) {
return xmlCompositeObjectMapping.getNullPolicy().compositeObjectMarshal(xPathFragment, marshalRecord, object, session, namespaceResolver);
}
if ((marshaller != null) && (marshaller.getMarshalListener() != null)) {
marshaller.getMarshalListener().beforeMarshal(objectValue);
}
XPathFragment groupingFragment = marshalRecord.openStartGroupingElements(namespaceResolver);
marshalRecord.closeStartGroupingElements(groupingFragment);
XMLDescriptor descriptor = (XMLDescriptor)session.getDescriptor(objectValue);
TreeObjectBuilder objectBuilder = (TreeObjectBuilder)descriptor.getObjectBuilder();
if (!xPathFragment.isSelfFragment()) {
getXPathNode().startElement(marshalRecord, xPathFragment, object, session, namespaceResolver, objectBuilder, objectValue);
}
List extraNamespaces = objectBuilder.addExtraNamespacesToNamespaceResolver(descriptor, marshalRecord, session);
writeExtraNamespaces(extraNamespaces, marshalRecord, session);
if ((xmlCompositeObjectMapping.getReferenceDescriptor() == null) && (descriptor.getSchemaReference() != null)) {
addTypeAttributeIfNeeded(descriptor, xmlCompositeObjectMapping, marshalRecord);
}
objectBuilder.buildRow(marshalRecord, objectValue, session, marshaller);
if (!xPathFragment.isSelfFragment()) {
marshalRecord.endElement(xPathFragment, namespaceResolver);
}
objectBuilder.removeExtraNamespacesFromNamespaceResolver(marshalRecord, extraNamespaces, session);
if ((marshaller != null) && (marshaller.getMarshalListener() != null)) {
marshaller.getMarshalListener().afterMarshal(objectValue);
}
return true;
}
throw new SOAPException(iae);
}
response.setResult(result);
SOAPAttachmentHandler attachmentHandler = new SOAPAttachmentHandler();
XMLMarshaller marshaller = dbwsAdapter.getXMLContext().createMarshaller();
marshaller.setAttachmentMarshaller(attachmentHandler);
marshaller.marshal(response, body);
if (attachmentHandler.hasAttachments()) {
// add attachments to message
for (String id : attachmentHandler.getAttachments().keySet()) {
DataHandler attachment = attachmentHandler.getAttachments().get(id);
}
private Object buildFragment(Property property, SDODataObject parentObject, SDODataObject value) {
//build an XML Fragment from this SDO
XMLPlatform xmlPlatform = XMLPlatformFactory.getInstance().getXMLPlatform();
XMLMarshaller xmlMarshaller = ((SDOXMLHelper)helperContext.getXMLHelper()).getXmlMarshaller();
Document doc = xmlPlatform.createDocument();
XMLRoot root = new XMLRoot();
root.setObject(value);
root.setLocalName(property.getName());
if(((SDOProperty)property).isNamespaceQualified()){
root.setNamespaceURI(parentObject.getType().getURI());
}
xmlMarshaller.marshal(root, doc);
return doc.getDocumentElement();
}
* @throws IllegalArgumentException if the dataObject tree
* is not closed or has no container.
*/
public void save(XMLDocument xmlDocument, Writer outputWriter, Object options) throws IOException {
// get XMLMarshaller once - as we may create a new instance if this helper isDirty=true
XMLMarshaller anXMLMarshaller = getXmlMarshaller();
// Ask the SDOXMLDocument if we should include the XML declaration in the resulting XML
anXMLMarshaller.setFragment(!xmlDocument.isXMLDeclaration());
anXMLMarshaller.setEncoding(xmlDocument.getEncoding());
anXMLMarshaller.setSchemaLocation(xmlDocument.getSchemaLocation());
anXMLMarshaller.setNoNamespaceSchemaLocation(xmlDocument.getNoNamespaceSchemaLocation());
WriterRecord writerRecord;
if(anXMLMarshaller.isFormattedOutput()) {
writerRecord = new FormattedWriterRecord();
} else {
writerRecord = new WriterRecord();
}
writerRecord.setWriter(outputWriter);
writerRecord.setMarshaller(anXMLMarshaller);
((SDOMarshalListener)anXMLMarshaller.getMarshalListener()).setMarshalledObject(xmlDocument.getRootObject());
((SDOMarshalListener)anXMLMarshaller.getMarshalListener()).setMarshalledObjectRootQName(new QName(xmlDocument.getRootElementURI(), xmlDocument.getRootElementName()));
((SDOMarshalListener)anXMLMarshaller.getMarshalListener()).setRootMarshalReocrd(writerRecord);
anXMLMarshaller.marshal(xmlDocument, writerRecord);
outputWriter.flush();
}
save(xmlDocument, writer, options);
}
} else {
// get XMLMarshaller once - as we may create a new instance if this helper isDirty=true
XMLMarshaller anXMLMarshaller = getXmlMarshaller();
// Ask the SDOXMLDocument if we should include the XML declaration in the resulting XML
anXMLMarshaller.setFragment(!xmlDocument.isXMLDeclaration());
anXMLMarshaller.setEncoding(xmlDocument.getEncoding());
anXMLMarshaller.setSchemaLocation(xmlDocument.getSchemaLocation());
anXMLMarshaller.setNoNamespaceSchemaLocation(xmlDocument.getNoNamespaceSchemaLocation());
((SDOMarshalListener)anXMLMarshaller.getMarshalListener()).setMarshalledObject(xmlDocument.getRootObject());
((SDOMarshalListener)anXMLMarshaller.getMarshalListener()).setMarshalledObjectRootQName(new QName(xmlDocument.getRootElementURI(), xmlDocument.getRootElementName()));
if(result instanceof SAXResult) {
ContentHandlerRecord marshalRecord = new ContentHandlerRecord();
marshalRecord.setContentHandler(((SAXResult)result).getHandler());
marshalRecord.setMarshaller(anXMLMarshaller);
((SDOMarshalListener)anXMLMarshaller.getMarshalListener()).setRootMarshalReocrd(marshalRecord);
anXMLMarshaller.marshal(xmlDocument, marshalRecord);
} else if(result instanceof DOMResult) {
NodeRecord marshalRecord = new NodeRecord();
marshalRecord.setDOM(((DOMResult)result).getNode());
marshalRecord.setMarshaller(anXMLMarshaller);
((SDOMarshalListener)anXMLMarshaller.getMarshalListener()).setRootMarshalReocrd(marshalRecord);
anXMLMarshaller.marshal(xmlDocument, marshalRecord);
} else {
StringWriter writer = new StringWriter();
this.save(xmlDocument, writer, options);
String xml = writer.toString();
StreamSource source = new StreamSource(new java.io.StringReader(xml));
anXMLMarshaller.getTransformer().transform(source, result);
}
}
}
*/
private void save(DataObject rootObject, String rootElementURI, String rootElementName, Writer writer) throws XMLMarshalException {
SDOXMLDocument xmlDocument = (SDOXMLDocument)createDocument(rootObject, rootElementURI, rootElementName);
// get XMLMarshaller once - as we may create a new instance if this helper isDirty=true
XMLMarshaller anXMLMarshaller = getXmlMarshaller();
// Ask the SDOXMLDocument if we should include the XML declaration in the resulting XML
anXMLMarshaller.setFragment(!xmlDocument.isXMLDeclaration());
WriterRecord writerRecord;
if(anXMLMarshaller.isFormattedOutput()) {
writerRecord = new FormattedWriterRecord();
} else {
writerRecord = new WriterRecord();
}
writerRecord.setWriter(writer);
writerRecord.setMarshaller(anXMLMarshaller);
((SDOMarshalListener)anXMLMarshaller.getMarshalListener()).setMarshalledObject(rootObject);
((SDOMarshalListener)anXMLMarshaller.getMarshalListener()).setMarshalledObjectRootQName(new QName(rootElementURI, rootElementName));
((SDOMarshalListener)anXMLMarshaller.getMarshalListener()).setRootMarshalReocrd(writerRecord);
anXMLMarshaller.marshal(xmlDocument, writerRecord);
try {
writer.flush();
} catch(IOException ex) {
throw XMLMarshalException.marshalException(ex);
}
Related Classes of org.eclipse.persistence.oxm.XMLMarshaller
Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.