org.springframework.oxm.xstream
Class XStreamMarshaller

java.lang.Object
  extended by org.springframework.oxm.support.AbstractMarshaller
      extended by org.springframework.oxm.xstream.XStreamMarshaller
All Implemented Interfaces:
BeanClassLoaderAware, InitializingBean, Marshaller, Unmarshaller

public class XStreamMarshaller
extends AbstractMarshaller
implements InitializingBean, BeanClassLoaderAware

Implementation of the Marshaller interface for XStream.

By default, XStream does not require any further configuration, though class aliases can be used to have more control over the behavior of XStream.

Due to XStream's API, it is required to set the encoding used for writing to OutputStreams. It defaults to UTF-8.

NOTE: XStream is an XML serialization library, not a data binding library. Therefore, it has limited namespace support. As such, it is rather unsuitable for usage within Web services.

Since:
3.0
Author:
Peter Meijer, Arjen Poutsma
See Also:
setAliases(java.util.Map), setConverters(ConverterMatcher[]), setEncoding(java.lang.String)

Field Summary
private  java.lang.ClassLoader classLoader
           
static java.lang.String DEFAULT_ENCODING
          The default encoding used for stream access: UTF-8.
private  java.lang.String encoding
           
private  HierarchicalStreamDriver streamDriver
           
private  java.lang.Class[] supportedClasses
           
private  XStream xstream
           
 
Fields inherited from class org.springframework.oxm.support.AbstractMarshaller
logger
 
Constructor Summary
XStreamMarshaller()
           
 
Method Summary
 void afterPropertiesSet()
          Invoked by a BeanFactory after it has set all bean properties supplied (and satisfied BeanFactoryAware and ApplicationContextAware).
protected  XmlMappingException convertXStreamException(java.lang.Exception ex, boolean marshalling)
          Convert the given XStream exception to an appropriate exception from the org.springframework.oxm hierarchy.
protected  void customizeXStream(XStream xstream)
          Template to allow for customizing of the given XStream.
 XStream getXStream()
          Returns the XStream instance used by this marshaller.
private  void marshal(java.lang.Object graph, HierarchicalStreamWriter streamWriter)
          Marshals the given graph to the given XStream HierarchicalStreamWriter.
protected  void marshalDomNode(java.lang.Object graph, org.w3c.dom.Node node)
          Abstract template method for marshalling the given object graph to a DOM Node.
protected  void marshalOutputStream(java.lang.Object graph, java.io.OutputStream outputStream)
          Abstract template method for marshalling the given object graph to a OutputStream.
protected  void marshalSaxHandlers(java.lang.Object graph, org.xml.sax.ContentHandler contentHandler, org.xml.sax.ext.LexicalHandler lexicalHandler)
          Abstract template method for marshalling the given object graph to a SAX ContentHandler.
protected  void marshalWriter(java.lang.Object graph, java.io.Writer writer)
          Abstract template method for marshalling the given object graph to a Writer.
protected  void marshalXmlEventWriter(java.lang.Object graph, javax.xml.stream.XMLEventWriter eventWriter)
          Abstract template method for marshalling the given object to a StAX XMLEventWriter.
protected  void marshalXmlStreamWriter(java.lang.Object graph, javax.xml.stream.XMLStreamWriter streamWriter)
          Abstract template method for marshalling the given object to a StAX XMLStreamWriter.
 void setAliases(java.util.Map<java.lang.String,?> aliases)
          Sets an alias/type map, consisting of string aliases mapped to classes.
 void setAliasesByType(java.util.Map<java.lang.String,?> aliases)
          Sets the aliases by type map, consisting of string aliases mapped to classes.
 void setAnnotatedClass(java.lang.Class<?> annotatedClass)
          Set the classes for which mappings will be read from class-level JDK 1.5+ annotation metadata.
 void setAnnotatedClasses(java.lang.Class<?>[] annotatedClasses)
          Set annotated classes for which aliases will be read from class-level JDK 1.5+ annotation metadata.
 void setAutodetectAnnotations(boolean autodetectAnnotations)
          Set the auto-detection mode of XStream.
 void setBeanClassLoader(java.lang.ClassLoader classLoader)
          Callback that supplies the bean class loader to a bean instance.
 void setConverters(ConverterMatcher[] converters)
          Set the Converters or SingleValueConverters to be registered with the XStream instance.
 void setEncoding(java.lang.String encoding)
          Set the encoding to be used for stream access.
 void setFieldAliases(java.util.Map<java.lang.String,java.lang.String> aliases)
          Sets a field alias/type map, consiting of field names
 void setImplicitCollections(java.util.Map<java.lang.Class<?>,java.lang.String> implicitCollections)
          Specify implicit collection fields, as a Map consisting of Class instances mapped to comma separated collection field names.
 void setMode(int mode)
          Set the XStream mode.
 void setOmittedFields(java.util.Map<java.lang.Class<?>,java.lang.String> omittedFields)
          Specify omitted fields, as a Map consisting of Class instances mapped to comma separated field names.
 void setStreamDriver(HierarchicalStreamDriver streamDriver)
          Set the XStream hierarchical stream driver to be used with stream readers and writers.
 void setSupportedClasses(java.lang.Class[] supportedClasses)
          Set the classes supported by this marshaller.
 void setUseAttributeFor(java.util.Map<?,?> attributes)
          Set the types to use XML attributes for.
 void setUseAttributeForTypes(java.lang.Class[] types)
          Set types to use XML attributes for.
 boolean supports(java.lang.Class clazz)
          Indicates whether this marshaller can marshal instances of the supplied type.
private  java.util.Map<java.lang.String,java.lang.Class<?>> toClassMap(java.util.Map<java.lang.String,?> map)
           
private  java.lang.Object unmarshal(HierarchicalStreamReader streamReader)
          Unmarshals the given provided javax.xml.transform.Source into an object graph.
protected  java.lang.Object unmarshalDomNode(org.w3c.dom.Node node)
          Abstract template method for unmarshalling from a given DOM Node.
protected  java.lang.Object unmarshalInputStream(java.io.InputStream inputStream)
          Abstract template method for unmarshalling from a given InputStream.
protected  java.lang.Object unmarshalReader(java.io.Reader reader)
          Abstract template method for unmarshalling from a given Reader.
protected  java.lang.Object unmarshalSaxReader(org.xml.sax.XMLReader xmlReader, org.xml.sax.InputSource inputSource)
          Abstract template method for unmarshalling using a given SAX XMLReader and InputSource.
protected  java.lang.Object unmarshalXmlEventReader(javax.xml.stream.XMLEventReader eventReader)
          Abstract template method for unmarshalling from a given Stax XMLEventReader.
protected  java.lang.Object unmarshalXmlStreamReader(javax.xml.stream.XMLStreamReader streamReader)
          Abstract template method for unmarshalling from a given Stax XMLStreamReader.
 
Methods inherited from class org.springframework.oxm.support.AbstractMarshaller
createDocumentBuilder, createDocumentBuilderFactory, createXmlReader, marshalDomResult, marshalSaxResult, marshalStaxResult, marshalStreamResult, unmarshalDomSource, unmarshalSaxSource, unmarshalStaxSource, unmarshalStreamSource
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

DEFAULT_ENCODING

public static final java.lang.String DEFAULT_ENCODING
The default encoding used for stream access: UTF-8.

See Also:
Constant Field Values

xstream

private final XStream xstream

streamDriver

private HierarchicalStreamDriver streamDriver

encoding

private java.lang.String encoding

supportedClasses

private java.lang.Class[] supportedClasses

classLoader

private java.lang.ClassLoader classLoader
Constructor Detail

XStreamMarshaller

public XStreamMarshaller()
Method Detail

getXStream

public XStream getXStream()
Returns the XStream instance used by this marshaller.


setMode

public void setMode(int mode)
Set the XStream mode.

See Also:
XStream#XPATH_REFERENCES, XStream#ID_REFERENCES, XStream#NO_REFERENCES

setConverters

public void setConverters(ConverterMatcher[] converters)
Set the Converters or SingleValueConverters to be registered with the XStream instance.

See Also:
Converter, SingleValueConverter

setAliases

public void setAliases(java.util.Map<java.lang.String,?> aliases)
                throws java.lang.ClassNotFoundException
Sets an alias/type map, consisting of string aliases mapped to classes. Keys are aliases; values are either Class instances, or String class names.

Throws:
java.lang.ClassNotFoundException
See Also:
XStream#alias(String, Class)

setAliasesByType

public void setAliasesByType(java.util.Map<java.lang.String,?> aliases)
                      throws java.lang.ClassNotFoundException
Sets the aliases by type map, consisting of string aliases mapped to classes. Any class that is assignable to this type will be aliased to the same name. Keys are aliases; values are either Class instances, or String class names.

Throws:
java.lang.ClassNotFoundException
See Also:
XStream#aliasType(String, Class)

toClassMap

private java.util.Map<java.lang.String,java.lang.Class<?>> toClassMap(java.util.Map<java.lang.String,?> map)
                                                               throws java.lang.ClassNotFoundException
Throws:
java.lang.ClassNotFoundException

setFieldAliases

public void setFieldAliases(java.util.Map<java.lang.String,java.lang.String> aliases)
                     throws java.lang.ClassNotFoundException,
                            java.lang.NoSuchFieldException
Sets a field alias/type map, consiting of field names

Parameters:
aliases -
Throws:
java.lang.ClassNotFoundException
java.lang.NoSuchFieldException
See Also:
XStream#aliasField(String, Class, String)

setUseAttributeForTypes

public void setUseAttributeForTypes(java.lang.Class[] types)
Set types to use XML attributes for.

See Also:
XStream#useAttributeFor(Class)

setUseAttributeFor

public void setUseAttributeFor(java.util.Map<?,?> attributes)
Set the types to use XML attributes for. The given map can contain either <String, Class> pairs, in which case XStream#useAttributeFor(String, Class) is called. Alternatively, the map can contain <Class, String> or <Class, List<String>> pairs, which results in XStream#useAttributeFor(Class, String) calls.


setImplicitCollections

public void setImplicitCollections(java.util.Map<java.lang.Class<?>,java.lang.String> implicitCollections)
Specify implicit collection fields, as a Map consisting of Class instances mapped to comma separated collection field names.

See Also:
XStream#addImplicitCollection(Class, String)

setOmittedFields

public void setOmittedFields(java.util.Map<java.lang.Class<?>,java.lang.String> omittedFields)
Specify omitted fields, as a Map consisting of Class instances mapped to comma separated field names.

See Also:
XStream#omitField(Class, String)

setAnnotatedClass

public void setAnnotatedClass(java.lang.Class<?> annotatedClass)
Set the classes for which mappings will be read from class-level JDK 1.5+ annotation metadata.

See Also:
XStream#processAnnotations(Class)

setAnnotatedClasses

public void setAnnotatedClasses(java.lang.Class<?>[] annotatedClasses)
Set annotated classes for which aliases will be read from class-level JDK 1.5+ annotation metadata.

See Also:
XStream#processAnnotations(Class[])

setAutodetectAnnotations

public void setAutodetectAnnotations(boolean autodetectAnnotations)
Set the auto-detection mode of XStream.

Note that auto-detection implies that the XStream is configured while it is processing the XML steams, and thus introduces a potential concurrency problem.

See Also:
XStream#autodetectAnnotations(boolean)

setStreamDriver

public void setStreamDriver(HierarchicalStreamDriver streamDriver)
Set the XStream hierarchical stream driver to be used with stream readers and writers.


setEncoding

public void setEncoding(java.lang.String encoding)
Set the encoding to be used for stream access.

See Also:
DEFAULT_ENCODING

setSupportedClasses

public void setSupportedClasses(java.lang.Class[] supportedClasses)
Set the classes supported by this marshaller.

If this property is empty (the default), all classes are supported.

See Also:
supports(Class)

afterPropertiesSet

public final void afterPropertiesSet()
                              throws java.lang.Exception
Description copied from interface: InitializingBean
Invoked by a BeanFactory after it has set all bean properties supplied (and satisfied BeanFactoryAware and ApplicationContextAware).

This method allows the bean instance to perform initialization only possible when all bean properties have been set and to throw an exception in the event of misconfiguration.

Specified by:
afterPropertiesSet in interface InitializingBean
Throws:
java.lang.Exception - in the event of misconfiguration (such as failure to set an essential property) or if initialization fails.

setBeanClassLoader

public void setBeanClassLoader(java.lang.ClassLoader classLoader)
Description copied from interface: BeanClassLoaderAware
Callback that supplies the bean class loader to a bean instance.

Invoked after the population of normal bean properties but before an initialization callback such as InitializingBean's InitializingBean.afterPropertiesSet() method or a custom init-method.

Specified by:
setBeanClassLoader in interface BeanClassLoaderAware
Parameters:
classLoader - the owning class loader; may be null in which case a default ClassLoader must be used, for example the ClassLoader obtained via ClassUtils.getDefaultClassLoader()

customizeXStream

protected void customizeXStream(XStream xstream)
Template to allow for customizing of the given XStream.

Default implementation is empty.

Parameters:
xstream - the XStream instance

supports

public boolean supports(java.lang.Class clazz)
Description copied from interface: Marshaller
Indicates whether this marshaller can marshal instances of the supplied type.

Specified by:
supports in interface Marshaller
Specified by:
supports in interface Unmarshaller
Parameters:
clazz - the class that this marshaller is being asked if it can marshal
Returns:
true if this marshaller can indeed marshal instances of the supplied class; false otherwise

marshalDomNode

protected void marshalDomNode(java.lang.Object graph,
                              org.w3c.dom.Node node)
                       throws XmlMappingException
Description copied from class: AbstractMarshaller
Abstract template method for marshalling the given object graph to a DOM Node.

In practice, node is be a Document node, a DocumentFragment node, or a Element node. In other words, a node that accepts children.

Specified by:
marshalDomNode in class AbstractMarshaller
Parameters:
graph - the root of the object graph to marshal
node - the DOM node that will contain the result tree
Throws:
XmlMappingException - if the given object cannot be marshalled to the DOM node
See Also:
Document, DocumentFragment, Element

marshalXmlEventWriter

protected void marshalXmlEventWriter(java.lang.Object graph,
                                     javax.xml.stream.XMLEventWriter eventWriter)
                              throws XmlMappingException
Description copied from class: AbstractMarshaller
Abstract template method for marshalling the given object to a StAX XMLEventWriter.

Specified by:
marshalXmlEventWriter in class AbstractMarshaller
Parameters:
graph - the root of the object graph to marshal
eventWriter - the XMLEventWriter to write to
Throws:
XmlMappingException - if the given object cannot be marshalled to the DOM node

marshalXmlStreamWriter

protected void marshalXmlStreamWriter(java.lang.Object graph,
                                      javax.xml.stream.XMLStreamWriter streamWriter)
                               throws XmlMappingException
Description copied from class: AbstractMarshaller
Abstract template method for marshalling the given object to a StAX XMLStreamWriter.

Specified by:
marshalXmlStreamWriter in class AbstractMarshaller
Parameters:
graph - the root of the object graph to marshal
streamWriter - the XMLStreamWriter to write to
Throws:
XmlMappingException - if the given object cannot be marshalled to the DOM node

marshalOutputStream

protected void marshalOutputStream(java.lang.Object graph,
                                   java.io.OutputStream outputStream)
                            throws XmlMappingException,
                                   java.io.IOException
Description copied from class: AbstractMarshaller
Abstract template method for marshalling the given object graph to a OutputStream.

Specified by:
marshalOutputStream in class AbstractMarshaller
Parameters:
graph - the root of the object graph to marshal
outputStream - the OutputStream to write to
Throws:
XmlMappingException - if the given object cannot be marshalled to the writer
java.io.IOException - if an I/O exception occurs

marshalSaxHandlers

protected void marshalSaxHandlers(java.lang.Object graph,
                                  org.xml.sax.ContentHandler contentHandler,
                                  org.xml.sax.ext.LexicalHandler lexicalHandler)
                           throws XmlMappingException
Description copied from class: AbstractMarshaller
Abstract template method for marshalling the given object graph to a SAX ContentHandler.

Specified by:
marshalSaxHandlers in class AbstractMarshaller
Parameters:
graph - the root of the object graph to marshal
contentHandler - the SAX ContentHandler
lexicalHandler - the SAX2 LexicalHandler. Can be null.
Throws:
XmlMappingException - if the given object cannot be marshalled to the handlers

marshalWriter

protected void marshalWriter(java.lang.Object graph,
                             java.io.Writer writer)
                      throws XmlMappingException,
                             java.io.IOException
Description copied from class: AbstractMarshaller
Abstract template method for marshalling the given object graph to a Writer.

Specified by:
marshalWriter in class AbstractMarshaller
Parameters:
graph - the root of the object graph to marshal
writer - the Writer to write to
Throws:
XmlMappingException - if the given object cannot be marshalled to the writer
java.io.IOException - if an I/O exception occurs

marshal

private void marshal(java.lang.Object graph,
                     HierarchicalStreamWriter streamWriter)
Marshals the given graph to the given XStream HierarchicalStreamWriter. Converts exceptions using convertXStreamException(java.lang.Exception, boolean).

Specified by:
marshal in interface Marshaller
Overrides:
marshal in class AbstractMarshaller
Parameters:
graph - the root of the object graph to marshal
streamWriter - the result to marshal to
See Also:
AbstractMarshaller.marshalDomResult(Object, javax.xml.transform.dom.DOMResult), AbstractMarshaller.marshalSaxResult(Object, javax.xml.transform.sax.SAXResult), AbstractMarshaller.marshalStreamResult(Object, javax.xml.transform.stream.StreamResult)

unmarshalDomNode

protected java.lang.Object unmarshalDomNode(org.w3c.dom.Node node)
                                     throws XmlMappingException
Description copied from class: AbstractMarshaller
Abstract template method for unmarshalling from a given DOM Node.

Specified by:
unmarshalDomNode in class AbstractMarshaller
Parameters:
node - the DOM node that contains the objects to be unmarshalled
Returns:
the object graph
Throws:
XmlMappingException - if the given DOM node cannot be mapped to an object

unmarshalXmlEventReader

protected java.lang.Object unmarshalXmlEventReader(javax.xml.stream.XMLEventReader eventReader)
                                            throws XmlMappingException
Description copied from class: AbstractMarshaller
Abstract template method for unmarshalling from a given Stax XMLEventReader.

Specified by:
unmarshalXmlEventReader in class AbstractMarshaller
Parameters:
eventReader - the XMLEventReader to read from
Returns:
the object graph
Throws:
XmlMappingException - if the given event reader cannot be converted to an object

unmarshalXmlStreamReader

protected java.lang.Object unmarshalXmlStreamReader(javax.xml.stream.XMLStreamReader streamReader)
                                             throws XmlMappingException
Description copied from class: AbstractMarshaller
Abstract template method for unmarshalling from a given Stax XMLStreamReader.

Specified by:
unmarshalXmlStreamReader in class AbstractMarshaller
Parameters:
streamReader - the XMLStreamReader to read from
Returns:
the object graph
Throws:
XmlMappingException - if the given stream reader cannot be converted to an object

unmarshalInputStream

protected java.lang.Object unmarshalInputStream(java.io.InputStream inputStream)
                                         throws XmlMappingException,
                                                java.io.IOException
Description copied from class: AbstractMarshaller
Abstract template method for unmarshalling from a given InputStream.

Specified by:
unmarshalInputStream in class AbstractMarshaller
Parameters:
inputStream - the InputStreamStream to read from
Returns:
the object graph
Throws:
XmlMappingException - if the given stream cannot be converted to an object
java.io.IOException - if an I/O exception occurs

unmarshalReader

protected java.lang.Object unmarshalReader(java.io.Reader reader)
                                    throws XmlMappingException,
                                           java.io.IOException
Description copied from class: AbstractMarshaller
Abstract template method for unmarshalling from a given Reader.

Specified by:
unmarshalReader in class AbstractMarshaller
Parameters:
reader - the Reader to read from
Returns:
the object graph
Throws:
XmlMappingException - if the given reader cannot be converted to an object
java.io.IOException - if an I/O exception occurs

unmarshalSaxReader

protected java.lang.Object unmarshalSaxReader(org.xml.sax.XMLReader xmlReader,
                                              org.xml.sax.InputSource inputSource)
                                       throws XmlMappingException,
                                              java.io.IOException
Description copied from class: AbstractMarshaller
Abstract template method for unmarshalling using a given SAX XMLReader and InputSource.

Specified by:
unmarshalSaxReader in class AbstractMarshaller
Parameters:
xmlReader - the SAX XMLReader to parse with
inputSource - the input source to parse from
Returns:
the object graph
Throws:
XmlMappingException - if the given reader and input source cannot be converted to an object
java.io.IOException - if an I/O exception occurs

unmarshal

private java.lang.Object unmarshal(HierarchicalStreamReader streamReader)
Description copied from class: AbstractMarshaller
Unmarshals the given provided javax.xml.transform.Source into an object graph.

This implementation inspects the given result, and calls unmarshalDomSource, unmarshalSaxSource, or unmarshalStreamSource.

Specified by:
unmarshal in interface Unmarshaller
Overrides:
unmarshal in class AbstractMarshaller
Parameters:
streamReader - the source to marshal from
Returns:
the object graph
See Also:
AbstractMarshaller.unmarshalDomSource(javax.xml.transform.dom.DOMSource), AbstractMarshaller.unmarshalSaxSource(javax.xml.transform.sax.SAXSource), AbstractMarshaller.unmarshalStreamSource(javax.xml.transform.stream.StreamSource)

convertXStreamException

protected XmlMappingException convertXStreamException(java.lang.Exception ex,
                                                      boolean marshalling)
Convert the given XStream exception to an appropriate exception from the org.springframework.oxm hierarchy.

A boolean flag is used to indicate whether this exception occurs during marshalling or unmarshalling, since XStream itself does not make this distinction in its exception hierarchy.

Parameters:
ex - XStream exception that occured
marshalling - indicates whether the exception occurs during marshalling (true), or unmarshalling (false)
Returns:
the corresponding XmlMappingException