diff --git a/org.springframework.core/src/main/java/org/springframework/util/Md5HashUtils.java b/org.springframework.core/src/main/java/org/springframework/util/Md5HashUtils.java index 25a60954af2..f0c80ac6bfb 100644 --- a/org.springframework.core/src/main/java/org/springframework/util/Md5HashUtils.java +++ b/org.springframework.core/src/main/java/org/springframework/util/Md5HashUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2008 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,8 +31,7 @@ public abstract class Md5HashUtils { {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; /** - * Calculates the MD5 hash of the given bytes. - * + * Calculate the MD5 hash of the given bytes. * @param bytes the bytes to calculate the hash over * @return the hash */ @@ -59,8 +58,7 @@ public abstract class Md5HashUtils { } /** - * Returns a hex string representation of the MD5 hash of the given bytes. - * + * Return a hex string representation of the MD5 hash of the given bytes. * @param bytes the bytes to calculate the hash over * @return a hexadecimal hash string */ @@ -69,9 +67,8 @@ public abstract class Md5HashUtils { } /** - * Appends a hex string representation of the MD5 hash of the given bytes to the given {@link StringBuilder}. - * - * @param bytes the bytes to calculate the hash over + * Append a hex string representation of the MD5 hash of the given bytes to the given {@link StringBuilder}. + * @param bytes the bytes to calculate the hash over * @param builder the string builder to append the hash to * @return the given string builder */ diff --git a/org.springframework.core/src/main/java/org/springframework/util/xml/AbstractStaxXMLReader.java b/org.springframework.core/src/main/java/org/springframework/util/xml/AbstractStaxXMLReader.java index b70127bf073..93289e5eff9 100644 --- a/org.springframework.core/src/main/java/org/springframework/util/xml/AbstractStaxXMLReader.java +++ b/org.springframework.core/src/main/java/org/springframework/util/xml/AbstractStaxXMLReader.java @@ -34,11 +34,11 @@ import org.springframework.util.StringUtils; * Abstract base class for SAX XMLReader implementations that use StAX as a basis. * * @author Arjen Poutsma + * @since 3.0 * @see #setContentHandler(org.xml.sax.ContentHandler) * @see #setDTDHandler(org.xml.sax.DTDHandler) * @see #setEntityResolver(org.xml.sax.EntityResolver) * @see #setErrorHandler(org.xml.sax.ErrorHandler) - * @since 3.0 */ abstract class AbstractStaxXMLReader extends AbstractXMLReader { @@ -48,23 +48,25 @@ abstract class AbstractStaxXMLReader extends AbstractXMLReader { private static final String IS_STANDALONE_FEATURE_NAME = "http://xml.org/sax/features/is-standalone"; + private boolean namespacesFeature = true; private boolean namespacePrefixesFeature = false; private Boolean isStandalone; + @Override public boolean getFeature(String name) throws SAXNotRecognizedException, SAXNotSupportedException { if (NAMESPACES_FEATURE_NAME.equals(name)) { - return namespacesFeature; + return this.namespacesFeature; } else if (NAMESPACE_PREFIXES_FEATURE_NAME.equals(name)) { - return namespacePrefixesFeature; + return this.namespacePrefixesFeature; } else if (IS_STANDALONE_FEATURE_NAME.equals(name)) { - if (isStandalone != null) { - return isStandalone; + if (this.isStandalone != null) { + return this.isStandalone; } else { throw new SAXNotSupportedException("startDocument() callback not completed yet"); @@ -88,35 +90,66 @@ abstract class AbstractStaxXMLReader extends AbstractXMLReader { } } - /** Indicates whether the SAX feature http://xml.org/sax/features/namespaces is turned on. */ + protected void setStandalone(boolean standalone) { + this.isStandalone = standalone; + } + + /** + * Indicates whether the SAX feature http://xml.org/sax/features/namespaces is turned on. + */ protected boolean hasNamespacesFeature() { - return namespacesFeature; + return this.namespacesFeature; } - /** Indicates whether the SAX feature http://xml.org/sax/features/namespaces-prefixes is turned on. */ + /** + * Indicates whether the SAX feature http://xml.org/sax/features/namespaces-prefixes is turned on. + */ protected boolean hasNamespacePrefixesFeature() { - return namespacePrefixesFeature; + return this.namespacePrefixesFeature; } - protected void setStandalone(boolean standalone) { - isStandalone = (standalone) ? Boolean.TRUE : Boolean.FALSE; + /** + * Sett the SAX Locator based on the given StAX Location. + * @param location the location + * @see ContentHandler#setDocumentLocator(org.xml.sax.Locator) + */ + protected void setLocator(Location location) { + if (getContentHandler() != null) { + getContentHandler().setDocumentLocator(new StaxLocator(location)); + } + } + + /** + * Convert a QName to a qualified name, as used by DOM and SAX. + * The returned string has a format of prefix:localName if the + * prefix is set, or just localName if not. + * @param qName the QName + * @return the qualified name + */ + protected String toQualifiedName(QName qName) { + String prefix = qName.getPrefix(); + if (!StringUtils.hasLength(prefix)) { + return qName.getLocalPart(); + } + else { + return prefix + ":" + qName.getLocalPart(); + } } + /** - * Parses the StAX XML reader passed at construction-time.

Note that the given - * InputSource is not read, but ignored. - * + * Parse the StAX XML reader passed at construction-time. + *

NOTE:: The given InputSource is not read, but ignored. * @param ignored is ignored - * @throws SAXException A SAX exception, possibly wrapping a XMLStreamException + * @throws SAXException a SAX exception, possibly wrapping a XMLStreamException */ public final void parse(InputSource ignored) throws SAXException { parse(); } /** - * Parses the StAX XML reader passed at construction-time.

Note that the given system identifier - * is not read, but ignored. - * + * Parse the StAX XML reader passed at construction-time. + *

NOTE:: The given system identifier is not read, but ignored. * @param ignored is ignored * @throws SAXException A SAX exception, possibly wrapping a XMLStreamException */ @@ -144,40 +177,13 @@ abstract class AbstractStaxXMLReader extends AbstractXMLReader { } /** - * Sets the SAX Locator based on the given StAX Location. - * - * @param location the location - * @see ContentHandler#setDocumentLocator(org.xml.sax.Locator) + * Template-method that parses the StAX reader passed at construction-time. */ - protected void setLocator(Location location) { - if (getContentHandler() != null) { - getContentHandler().setDocumentLocator(new StaxLocator(location)); - } - } - - /** Template-method that parses the StAX reader passed at construction-time. */ protected abstract void parseInternal() throws SAXException, XMLStreamException; - /** - * Convert a QName to a qualified name, as used by DOM and SAX. The returned string has a format of - * prefix:localName if the prefix is set, or just localName if not. - * - * @param qName the QName - * @return the qualified name - */ - protected String toQualifiedName(QName qName) { - String prefix = qName.getPrefix(); - if (!StringUtils.hasLength(prefix)) { - return qName.getLocalPart(); - } - else { - return prefix + ":" + qName.getLocalPart(); - } - } /** * Implementation of the Locator interface that is based on a StAX Location. - * * @see Locator * @see Location */ @@ -205,4 +211,5 @@ abstract class AbstractStaxXMLReader extends AbstractXMLReader { return location.getColumnNumber(); } } + } diff --git a/org.springframework.core/src/main/java/org/springframework/util/xml/JaxpVersion.java b/org.springframework.core/src/main/java/org/springframework/util/xml/JaxpVersion.java deleted file mode 100644 index 0ee4eb17dbc..00000000000 --- a/org.springframework.core/src/main/java/org/springframework/util/xml/JaxpVersion.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2002-2009 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.util.xml; - -import org.springframework.util.ClassUtils; - -/** - * Helper class used to find the current version of JAXP. We cannot depend on the Java version, since JAXP can be - * upgraded independently of the Java version.

Only distinguishes between JAXP 1.0, 1.1, 1.3, and 1.4, since JAXP - * 1.2 was a maintenance release with no new classes. - * - * @author Arjen Poutsma - * @since 3.0.0 - */ -abstract class JaxpVersion { - - public static final int JAXP_10 = 0; - - public static final int JAXP_11 = 1; - - public static final int JAXP_13 = 3; - - public static final int JAXP_14 = 4; - - private static final String JAXP_14_CLASS_NAME = "javax.xml.transform.stax.StAXSource"; - - private static int jaxpVersion; - - static { - try { - ClassUtils.forName(JAXP_14_CLASS_NAME); - jaxpVersion = JAXP_14; - } - catch (ClassNotFoundException ignored) { - // default to JAXP 1.3, since Spring 3 requires JDK 1.5 - jaxpVersion = JAXP_13; - } - } - - /** - * Gets the JAXP version. This means we can do things like if (getJaxpVersion() < JAXP_13). - * - * @return a code comparable to the JAXP_XX codes in this class - * @see #JAXP_10 - * @see #JAXP_11 - * @see #JAXP_13 - * @see #JAXP_14 - */ - public static int getJaxpVersion() { - return jaxpVersion; - } - - /** - * Convenience method to determine if the current JAXP version is at least 1.3 (packaged with JDK 1.5). - * - * @return true if the current JAXP version is at least JAXP 1.3 - * @see #getJaxpVersion() - * @see #JAXP_13 - */ - public static boolean isAtLeastJaxp13() { - return getJaxpVersion() >= JAXP_13; - } - - /** - * Convenience method to determine if the current JAXP version is at least 1.4 (packaged with JDK 1.6). - * - * @return true if the current JAXP version is at least JAXP 1.4 - * @see #getJaxpVersion() - * @see #JAXP_14 - */ - public static boolean isAtLeastJaxp14() { - return getJaxpVersion() >= JAXP_14; - } - -} \ No newline at end of file diff --git a/org.springframework.core/src/main/java/org/springframework/util/xml/StaxUtils.java b/org.springframework.core/src/main/java/org/springframework/util/xml/StaxUtils.java index 71ce0abbbf1..1734093e8b3 100644 --- a/org.springframework.core/src/main/java/org/springframework/util/xml/StaxUtils.java +++ b/org.springframework.core/src/main/java/org/springframework/util/xml/StaxUtils.java @@ -30,27 +30,32 @@ import org.xml.sax.ContentHandler; import org.xml.sax.XMLReader; import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; /** * Convenience methods for working with the StAX API. * - * In particular, methods for using StAX in combination with the TrAX API (javax.xml.transform), and - * converting StAX readers/writers into SAX readers/handlers and vice-versa. + *

In particular, methods for using StAX in combination with the TrAX API + * (javax.xml.transform), and converting StAX readers/writers + * into SAX readers/handlers and vice-versa. * * @author Arjen Poutsma + * @author Juergen Hoeller * @since 3.0 */ public abstract class StaxUtils { + private static boolean jaxp14Available = + ClassUtils.isPresent("javax.xml.transform.stax.StAXSource", StaxUtils.class.getClassLoader()); + + /** - * Creates a StAX {@link Source} for the given {@link XMLStreamReader}. Returns a {@link StAXSource} under JAXP 1.4 or - * higher, or a {@link StaxSource} otherwise. - * + * Create a StAX {@link Source} for the given {@link XMLStreamReader}. * @param streamReader the StAX stream reader * @return a source wrapping streamReader */ public static Source createStaxSource(XMLStreamReader streamReader) { - if (JaxpVersion.isAtLeastJaxp14()) { + if (jaxp14Available) { return Jaxp14StaxHandler.createStaxSource(streamReader); } else { @@ -59,15 +64,13 @@ public abstract class StaxUtils { } /** - * Creates a StAX {@link Source} for the given {@link XMLEventReader}. Returns a {@link StAXSource} under JAXP 1.4 or - * higher, or a {@link StaxSource} otherwise. - * + * Create a StAX {@link Source} for the given {@link XMLEventReader}. * @param eventReader the StAX event reader * @return a source wrapping streamReader * @throws XMLStreamException in case of StAX errors */ public static Source createStaxSource(XMLEventReader eventReader) throws XMLStreamException { - if (JaxpVersion.isAtLeastJaxp14()) { + if (jaxp14Available) { return Jaxp14StaxHandler.createStaxSource(eventReader); } else { @@ -76,14 +79,21 @@ public abstract class StaxUtils { } /** - * Creates a StAX {@link Result} for the given {@link XMLStreamWriter}. Returns a {@link StAXResult} under JAXP 1.4 or - * higher, or a {@link StaxResult} otherwise. - * + * Indicate whether the given {@link javax.xml.transform.Source} is a StAX Source. + * @return true if source is a Spring StaxSource or JAXP + * 1.4 {@link javax.xml.transform.stax.StAXSource}; false otherwise. + */ + public static boolean isStaxSource(Source source) { + return (source instanceof StaxSource || (jaxp14Available && Jaxp14StaxHandler.isStaxSource(source))); + } + + /** + * Create a StAX {@link Result} for the given {@link XMLStreamWriter}. * @param streamWriter the StAX stream writer * @return a result wrapping streamWriter */ public static Result createStaxResult(XMLStreamWriter streamWriter) { - if (JaxpVersion.isAtLeastJaxp14()) { + if (jaxp14Available) { return Jaxp14StaxHandler.createStaxResult(streamWriter); } else { @@ -92,15 +102,13 @@ public abstract class StaxUtils { } /** - * Creates a StAX {@link Result} for the given {@link XMLEventWriter}. Returns a {@link StAXResult} under JAXP 1.4 or - * higher, or a {@link StaxResult} otherwise. - * + * Create a StAX {@link Result} for the given {@link XMLEventWriter}. * @param eventWriter the StAX event writer * @return a result wrapping streamReader * @throws XMLStreamException in case of StAX errors */ public static Result createStaxResult(XMLEventWriter eventWriter) throws XMLStreamException { - if (JaxpVersion.isAtLeastJaxp14()) { + if (jaxp14Available) { return Jaxp14StaxHandler.createStaxResult(eventWriter); } else { @@ -109,54 +117,26 @@ public abstract class StaxUtils { } /** - * Indicates whether the given {@link javax.xml.transform.Source} is a StAX Source. - * - * @return true if source is a Spring {@link org.springframework.util.xml.StaxSource} or JAXP - * 1.4 {@link javax.xml.transform.stax.StAXSource}; false otherwise. - */ - public static boolean isStaxSource(Source source) { - if (source instanceof StaxSource) { - return true; - } - else if (JaxpVersion.isAtLeastJaxp14()) { - return Jaxp14StaxHandler.isStaxSource(source); - } - else { - return false; - } - } - - /** - * Indicates whether the given {@link javax.xml.transform.Result} is a StAX Result. - * - * @return true if result is a Spring {@link org.springframework.util.xml.StaxResult} or JAXP - * 1.4 {@link javax.xml.transform.stax.StAXResult}; false otherwise. + * Indicate whether the given {@link javax.xml.transform.Result} is a StAX Result. + * @return true if result is a Spring StaxResult or JAXP + * 1.4 {@link javax.xml.transform.stax.StAXResult}; false otherwise. */ public static boolean isStaxResult(Result result) { - if (result instanceof StaxResult) { - return true; - } - else if (JaxpVersion.isAtLeastJaxp14()) { - return Jaxp14StaxHandler.isStaxResult(result); - } - else { - return false; - } + return (result instanceof StaxResult || (jaxp14Available && Jaxp14StaxHandler.isStaxResult(result))); } /** - * Returns the {@link javax.xml.stream.XMLStreamReader} for the given StAX Source. - * - * @param source a Spring {@link org.springframework.util.xml.StaxSource} or {@link javax.xml.transform.stax.StAXSource} + * Return the {@link javax.xml.stream.XMLStreamReader} for the given StAX Source. + * @param source a Spring StaxSource or JAXP 1.4 {@link javax.xml.transform.stax.StAXSource} * @return the {@link javax.xml.stream.XMLStreamReader} - * @throws IllegalArgumentException if source is neither a Spring-WS {@link org.springframework.util.xml.StaxSource} - * or {@link javax.xml.transform.stax.StAXSource} + * @throws IllegalArgumentException if source is neither a Spring StaxSource + * nor JAXP 1.4 {@link javax.xml.transform.stax.StAXSource} */ public static XMLStreamReader getXMLStreamReader(Source source) { if (source instanceof StaxSource) { return ((StaxSource) source).getXMLStreamReader(); } - else if (JaxpVersion.isAtLeastJaxp14()) { + else if (jaxp14Available) { return Jaxp14StaxHandler.getXMLStreamReader(source); } else { @@ -165,18 +145,17 @@ public abstract class StaxUtils { } /** - * Returns the {@link javax.xml.stream.XMLEventReader} for the given StAX Source. - * - * @param source a Spring {@link org.springframework.util.xml.StaxSource} or {@link javax.xml.transform.stax.StAXSource} + * Return the {@link javax.xml.stream.XMLEventReader} for the given StAX Source. + * @param source a Spring StaxSource or JAXP 1.4 {@link javax.xml.transform.stax.StAXSource} * @return the {@link javax.xml.stream.XMLEventReader} - * @throws IllegalArgumentException if source is neither a Spring {@link org.springframework.util.xml.StaxSource} - * or {@link javax.xml.transform.stax.StAXSource} + * @throws IllegalArgumentException if source is neither a Spring StaxSource + * nor a JAXP 1.4 {@link javax.xml.transform.stax.StAXSource} */ public static XMLEventReader getXMLEventReader(Source source) { if (source instanceof StaxSource) { return ((StaxSource) source).getXMLEventReader(); } - else if (JaxpVersion.isAtLeastJaxp14()) { + else if (jaxp14Available) { return Jaxp14StaxHandler.getXMLEventReader(source); } else { @@ -185,18 +164,17 @@ public abstract class StaxUtils { } /** - * Returns the {@link javax.xml.stream.XMLStreamWriter} for the given StAX Result. - * - * @param result a Spring {@link org.springframework.util.xml.StaxResult} or {@link javax.xml.transform.stax.StAXResult} + * Return the {@link javax.xml.stream.XMLStreamWriter} for the given StAX Result. + * @param result a Spring StaxResult or JAXP 1.4 {@link javax.xml.transform.stax.StAXResult} * @return the {@link javax.xml.stream.XMLStreamReader} - * @throws IllegalArgumentException if source is neither a Spring {@link org.springframework.util.xml.StaxResult} - * or {@link javax.xml.transform.stax.StAXResult} + * @throws IllegalArgumentException if source is neither a Spring StaxResult + * nor a JAXP 1.4 {@link javax.xml.transform.stax.StAXResult} */ public static XMLStreamWriter getXMLStreamWriter(Result result) { if (result instanceof StaxResult) { return ((StaxResult) result).getXMLStreamWriter(); } - else if (JaxpVersion.isAtLeastJaxp14()) { + else if (jaxp14Available) { return Jaxp14StaxHandler.getXMLStreamWriter(result); } else { @@ -205,18 +183,17 @@ public abstract class StaxUtils { } /** - * Returns the {@link XMLEventWriter} for the given StAX Result. - * - * @param result a Spring {@link org.springframework.util.xml.StaxResult} or {@link javax.xml.transform.stax.StAXResult} + * Return the {@link XMLEventWriter} for the given StAX Result. + * @param result a Spring StaxResult or JAXP 1.4 {@link javax.xml.transform.stax.StAXResult} * @return the {@link javax.xml.stream.XMLStreamReader} - * @throws IllegalArgumentException if source is neither a Spring {@link org.springframework.util.xml.StaxResult} - * or {@link javax.xml.transform.stax.StAXResult} + * @throws IllegalArgumentException if source is neither a Spring StaxResult + * nor a JAXP 1.4 {@link javax.xml.transform.stax.StAXResult} */ public static XMLEventWriter getXMLEventWriter(Result result) { if (result instanceof StaxResult) { return ((StaxResult) result).getXMLEventWriter(); } - else if (JaxpVersion.isAtLeastJaxp14()) { + else if (jaxp14Available) { return Jaxp14StaxHandler.getXMLEventWriter(result); } else { @@ -225,8 +202,7 @@ public abstract class StaxUtils { } /** - * Creates a SAX {@link ContentHandler} that writes to the given StAX {@link XMLStreamWriter}. - * + * Create a SAX {@link ContentHandler} that writes to the given StAX {@link XMLStreamWriter}. * @param streamWriter the StAX stream writer * @return a content handler writing to the streamWriter */ @@ -235,8 +211,7 @@ public abstract class StaxUtils { } /** - * Creates a SAX {@link ContentHandler} that writes events to the given StAX {@link XMLEventWriter}. - * + * Create a SAX {@link ContentHandler} that writes events to the given StAX {@link XMLEventWriter}. * @param eventWriter the StAX event writer * @return a content handler writing to the eventWriter */ @@ -245,8 +220,7 @@ public abstract class StaxUtils { } /** - * Creates a SAX {@link XMLReader} that reads from the given StAX {@link XMLStreamReader}. - * + * Create a SAX {@link XMLReader} that reads from the given StAX {@link XMLStreamReader}. * @param streamReader the StAX stream reader * @return a XMLReader reading from the streamWriter */ @@ -255,8 +229,7 @@ public abstract class StaxUtils { } /** - * Creates a SAX {@link XMLReader} that reads from the given StAX {@link XMLEventReader}. - * + * Create a SAX {@link XMLReader} that reads from the given StAX {@link XMLEventReader}. * @param eventReader the StAX event reader * @return a XMLReader reading from the eventWriter */ @@ -265,16 +238,18 @@ public abstract class StaxUtils { } /** - * Returns a {@link XMLStreamReader} that reads from a {@link XMLEventReader}. Useful, because the StAX + * Return a {@link XMLStreamReader} that reads from a {@link XMLEventReader}. Useful, because the StAX * XMLInputFactory allows one to create a event reader from a stream reader, but not vice-versa. - * * @return a stream reader that reads from an event reader */ public static XMLStreamReader createEventStreamReader(XMLEventReader eventReader) throws XMLStreamException { return new XMLEventStreamReader(eventReader); } - /** Inner class to avoid a static JAXP 1.4 dependency. */ + + /** + * Inner class to avoid a static JAXP 1.4 dependency. + */ private static class Jaxp14StaxHandler { private static Source createStaxSource(XMLStreamReader streamReader) { diff --git a/org.springframework.jms/src/main/java/org/springframework/jms/support/converter/MarshallingMessageConverter.java b/org.springframework.jms/src/main/java/org/springframework/jms/support/converter/MarshallingMessageConverter.java index 7be914a41d2..12929172b71 100644 --- a/org.springframework.jms/src/main/java/org/springframework/jms/support/converter/MarshallingMessageConverter.java +++ b/org.springframework.jms/src/main/java/org/springframework/jms/support/converter/MarshallingMessageConverter.java @@ -1,5 +1,5 @@ /* - * Copyright 2007 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,57 +33,54 @@ import javax.xml.transform.stream.StreamSource; import org.springframework.beans.factory.InitializingBean; import org.springframework.oxm.Marshaller; -import org.springframework.oxm.MarshallingFailureException; import org.springframework.oxm.Unmarshaller; -import org.springframework.oxm.UnmarshallingFailureException; +import org.springframework.oxm.XmlMappingException; import org.springframework.util.Assert; /** - * Spring JMS {@link MessageConverter} that uses a {@link Marshaller} and {@link Unmarshaller}. Marshals an object to a - * {@link BytesMessage}, or to a {@link TextMessage} if the {@link #setMarshalTo marshalTo} is set to {@link - * #MARSHAL_TO_TEXT_MESSAGE}. Unmarshals from a {@link TextMessage} or {@link BytesMessage} to an object. + * Spring JMS {@link MessageConverter} that uses a {@link Marshaller} and {@link Unmarshaller}. + * Marshals an object to a {@link BytesMessage}, or to a {@link TextMessage} if the + * {@link #setTargetType marshalTo} is set to {@link MessageType#TEXT}. + * Unmarshals from a {@link TextMessage} or {@link BytesMessage} to an object. * * @author Arjen Poutsma + * @author Juergen Hoeller + * @since 3.0 * @see org.springframework.jms.core.JmsTemplate#convertAndSend * @see org.springframework.jms.core.JmsTemplate#receiveAndConvert - * @since 3.0 */ public class MarshallingMessageConverter implements MessageConverter, InitializingBean { - /** Constant that indicates that {@link #toMessage(Object, Session)} should marshal to a {@link BytesMessage}. */ - public static final int MARSHAL_TO_BYTES_MESSAGE = 1; - - /** Constant that indicates that {@link #toMessage(Object, Session)} should marshal to a {@link TextMessage}. */ - public static final int MARSHAL_TO_TEXT_MESSAGE = 2; - private Marshaller marshaller; private Unmarshaller unmarshaller; - private int marshalTo = MARSHAL_TO_BYTES_MESSAGE; + private MessageType targetType = MessageType.BYTES; /** - * Constructs a new MarshallingMessageConverter with no {@link Marshaller} set. The marshaller must be set - * after construction by invoking {@link #setMarshaller(Marshaller)}. + * Construct a new MarshallingMessageConverter with no {@link Marshaller} set. + * The marshaller must be set after construction by invoking {@link #setMarshaller(Marshaller)}. */ public MarshallingMessageConverter() { } /** - * Constructs a new MarshallingMessageConverter with the given {@link Marshaller} set. If the given - * {@link Marshaller} also implements the {@link Unmarshaller} interface, it is used for both marshalling and - * unmarshalling. Otherwise, an exception is thrown.

Note that all {@link Marshaller} implementations in Spring-WS - * also implement the {@link Unmarshaller} interface, so that you can safely use this constructor. - * + * Construct a new MarshallingMessageConverter with the given {@link Marshaller} set. + *

If the given {@link Marshaller} also implements the {@link Unmarshaller} interface, + * it is used for both marshalling and unmarshalling. Otherwise, an exception is thrown. + *

Note that all {@link Marshaller} implementations in Spring also implement the + * {@link Unmarshaller} interface, so that you can safely use this constructor. * @param marshaller object used as marshaller and unmarshaller - * @throws IllegalArgumentException when marshaller does not implement the {@link Unmarshaller} interface + * @throws IllegalArgumentException when marshaller does not implement the + * {@link Unmarshaller} interface as well */ public MarshallingMessageConverter(Marshaller marshaller) { Assert.notNull(marshaller, "marshaller must not be null"); if (!(marshaller instanceof Unmarshaller)) { - throw new IllegalArgumentException("Marshaller [" + marshaller + "] does not implement the Unmarshaller " + + throw new IllegalArgumentException( + "Marshaller [" + marshaller + "] does not implement the Unmarshaller " + "interface. Please set an Unmarshaller explicitely by using the " + - "AbstractMarshallingPayloadEndpoint(Marshaller, Unmarshaller) constructor."); + "MarshallingMessageConverter(Marshaller, Unmarshaller) constructor."); } else { this.marshaller = marshaller; @@ -92,10 +89,10 @@ public class MarshallingMessageConverter implements MessageConverter, Initializi } /** - * Creates a new MarshallingMessageConverter with the given marshaller and unmarshaller. - * - * @param marshaller the marshaller to use - * @param unmarshaller the unmarshaller to use + * Construct a new MarshallingMessageConverter with the + * given Marshaller and Unmarshaller. + * @param marshaller the Marshaller to use + * @param unmarshaller the Unmarshaller to use */ public MarshallingMessageConverter(Marshaller marshaller, Unmarshaller unmarshaller) { Assert.notNull(marshaller, "marshaller must not be null"); @@ -104,52 +101,59 @@ public class MarshallingMessageConverter implements MessageConverter, Initializi this.unmarshaller = unmarshaller; } + /** - * Indicates whether {@link #toMessage(Object,Session)} should marshal to a {@link BytesMessage} or a {@link - * TextMessage}. The default is {@link #MARSHAL_TO_BYTES_MESSAGE}, i.e. this converter marshals to a {@link - * BytesMessage}. - * - * @see #MARSHAL_TO_BYTES_MESSAGE - * @see #MARSHAL_TO_TEXT_MESSAGE + * Set the {@link Marshaller} to be used by this message converter. */ - public void setMarshalTo(int marshalTo) { - this.marshalTo = marshalTo; - } - - /** Sets the {@link Marshaller} to be used by this message converter. */ public void setMarshaller(Marshaller marshaller) { this.marshaller = marshaller; } - /** Sets the {@link Unmarshaller} to be used by this message converter. */ + /** + * Set the {@link Unmarshaller} to be used by this message converter. + */ public void setUnmarshaller(Unmarshaller unmarshaller) { this.unmarshaller = unmarshaller; } - public void afterPropertiesSet() throws Exception { - Assert.notNull(marshaller, "Property 'marshaller' is required"); - Assert.notNull(unmarshaller, "Property 'unmarshaller' is required"); + /** + * Specify whether {@link #toMessage(Object, Session)} should marshal to + * a {@link BytesMessage} or a {@link TextMessage}. + *

The default is {@link MessageType#BYTES}, i.e. this converter marshals + * to a {@link BytesMessage}. Note that the default version of this converter + * supports {@link MessageType#BYTES} and {@link MessageType#TEXT} only. + * @see MessageType#BYTES + * @see MessageType#TEXT + */ + public void setTargetType(MessageType targetType) { + this.targetType = targetType; + } + + public void afterPropertiesSet() { + Assert.notNull(this.marshaller, "Property 'marshaller' is required"); + Assert.notNull(this.unmarshaller, "Property 'unmarshaller' is required"); } + /** - * Marshals the given object to a {@link TextMessage} or {@link javax.jms.BytesMessage}. The desired message type can - * be defined by setting the {@link #setMarshalTo(int) marshalTo} property. - * + * This implementation marshals the given object to a {@link javax.jms.TextMessage} or + * {@link javax.jms.BytesMessage}. The desired message type can be defined by setting + * the {@link #setTargetType "marshalTo"} property. * @see #marshalToTextMessage * @see #marshalToBytesMessage */ public Message toMessage(Object object, Session session) throws JMSException, MessageConversionException { try { - switch (marshalTo) { - case MARSHAL_TO_TEXT_MESSAGE: - return marshalToTextMessage(object, session, marshaller); - case MARSHAL_TO_BYTES_MESSAGE: - return marshalToBytesMessage(object, session, marshaller); + switch (this.targetType) { + case TEXT: + return marshalToTextMessage(object, session, this.marshaller); + case BYTES: + return marshalToBytesMessage(object, session, this.marshaller); default: - return marshalToMessage(object, session, marshaller); + return marshalToMessage(object, session, this.marshaller, this.targetType); } } - catch (MarshallingFailureException ex) { + catch (XmlMappingException ex) { throw new MessageConversionException("Could not marshal [" + object + "]", ex); } catch (IOException ex) { @@ -158,8 +162,7 @@ public class MarshallingMessageConverter implements MessageConverter, Initializi } /** - * Unmarshals the given {@link Message} into an object. - * + * This implementation unmarshals the given {@link Message} into an object. * @see #unmarshalFromTextMessage * @see #unmarshalFromBytesMessage */ @@ -167,38 +170,40 @@ public class MarshallingMessageConverter implements MessageConverter, Initializi try { if (message instanceof TextMessage) { TextMessage textMessage = (TextMessage) message; - return unmarshalFromTextMessage(textMessage, unmarshaller); + return unmarshalFromTextMessage(textMessage, this.unmarshaller); } else if (message instanceof BytesMessage) { BytesMessage bytesMessage = (BytesMessage) message; - return unmarshalFromBytesMessage(bytesMessage, unmarshaller); + return unmarshalFromBytesMessage(bytesMessage, this.unmarshaller); } else { - return unmarshalFromMessage(message, unmarshaller); + return unmarshalFromMessage(message, this.unmarshaller); } } - catch (UnmarshallingFailureException ex) { - throw new MessageConversionException("Could not unmarshal message [" + message + "]", ex); - } catch (IOException ex) { - throw new MessageConversionException("Could not unmarshal message [" + message + "]", ex); + throw new MessageConversionException("Could not access message content: " + message, ex); + } + catch (XmlMappingException ex) { + throw new MessageConversionException("Could not unmarshal message: " + message, ex); } } + /** - * Marshals the given object to a {@link TextMessage}. - * - * @param object the object to be marshalled - * @param session current JMS session + * Marshal the given object to a {@link TextMessage}. + * @param object the object to be marshalled + * @param session current JMS session * @param marshaller the marshaller to use * @return the resulting message * @throws JMSException if thrown by JMS methods - * @throws IOException in case of I/O errors + * @throws IOException in case of I/O errors + * @throws XmlMappingException in case of OXM mapping errors * @see Session#createTextMessage * @see Marshaller#marshal(Object, Result) */ protected TextMessage marshalToTextMessage(Object object, Session session, Marshaller marshaller) - throws JMSException, IOException { + throws JMSException, IOException, XmlMappingException { + StringWriter writer = new StringWriter(); Result result = new StreamResult(writer); marshaller.marshal(object, result); @@ -206,19 +211,20 @@ public class MarshallingMessageConverter implements MessageConverter, Initializi } /** - * Marshals the given object to a {@link BytesMessage}. - * - * @param object the object to be marshalled - * @param session current JMS session + * Marshal the given object to a {@link BytesMessage}. + * @param object the object to be marshalled + * @param session current JMS session * @param marshaller the marshaller to use * @return the resulting message * @throws JMSException if thrown by JMS methods - * @throws IOException in case of I/O errors + * @throws IOException in case of I/O errors + * @throws XmlMappingException in case of OXM mapping errors * @see Session#createBytesMessage * @see Marshaller#marshal(Object, Result) */ protected BytesMessage marshalToBytesMessage(Object object, Session session, Marshaller marshaller) - throws JMSException, IOException { + throws JMSException, IOException, XmlMappingException { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); StreamResult streamResult = new StreamResult(bos); marshaller.marshal(object, streamResult); @@ -228,51 +234,57 @@ public class MarshallingMessageConverter implements MessageConverter, Initializi } /** - * Template method that allows for custom message marshalling. Invoked when {@link #setMarshalTo(int)} is not {@link - * #MARSHAL_TO_TEXT_MESSAGE} or {@link #MARSHAL_TO_BYTES_MESSAGE}.

Default implemenetation throws a {@link - * MessageConversionException}. - * - * @param object the object to marshal - * @param session the JMS session + * Template method that allows for custom message marshalling. + * Invoked when {@link #setTargetType} is not {@link MessageType#TEXT} or + * {@link MessageType#BYTES}. + *

The default implementation throws an {@link IllegalArgumentException}. + * @param object the object to marshal + * @param session the JMS session * @param marshaller the marshaller to use + * @param targetType the target message type (other than TEXT or BYTES) * @return the resulting message * @throws JMSException if thrown by JMS methods - * @throws IOException in case of I/O errors + * @throws IOException in case of I/O errors + * @throws XmlMappingException in case of OXM mapping errors */ - protected Message marshalToMessage(Object object, Session session, Marshaller marshaller) - throws JMSException, IOException { - throw new MessageConversionException( - "Unknown 'marshalTo' value [" + marshalTo + "]. Cannot convert object to Message"); + protected Message marshalToMessage(Object object, Session session, Marshaller marshaller, MessageType targetType) + throws JMSException, IOException, XmlMappingException { + + throw new IllegalArgumentException( + "Unsupported message type [" + targetType + "]. Cannot marshal to the specified message type."); } + /** - * Unmarshals the given {@link TextMessage} into an object. - * - * @param message the message + * Unmarshal the given {@link TextMessage} into an object. + * @param message the message * @param unmarshaller the unmarshaller to use * @return the unmarshalled object * @throws JMSException if thrown by JMS methods - * @throws IOException in case of I/O errors + * @throws IOException in case of I/O errors + * @throws XmlMappingException in case of OXM mapping errors * @see Unmarshaller#unmarshal(Source) */ protected Object unmarshalFromTextMessage(TextMessage message, Unmarshaller unmarshaller) - throws JMSException, IOException { + throws JMSException, IOException, XmlMappingException { + Source source = new StreamSource(new StringReader(message.getText())); return unmarshaller.unmarshal(source); } /** - * Unmarshals the given {@link BytesMessage} into an object. - * - * @param message the message + * Unmarshal the given {@link BytesMessage} into an object. + * @param message the message * @param unmarshaller the unmarshaller to use * @return the unmarshalled object * @throws JMSException if thrown by JMS methods - * @throws IOException in case of I/O errors + * @throws IOException in case of I/O errors + * @throws XmlMappingException in case of OXM mapping errors * @see Unmarshaller#unmarshal(Source) */ protected Object unmarshalFromBytesMessage(BytesMessage message, Unmarshaller unmarshaller) - throws JMSException, IOException { + throws JMSException, IOException, XmlMappingException { + byte[] bytes = new byte[(int) message.getBodyLength()]; message.readBytes(bytes); ByteArrayInputStream bis = new ByteArrayInputStream(bytes); @@ -281,19 +293,22 @@ public class MarshallingMessageConverter implements MessageConverter, Initializi } /** - * Template method that allows for custom message unmarshalling. Invoked when {@link #fromMessage(Message)} is invoked - * with a message that is not a {@link TextMessage} or {@link BytesMessage}.

Default implemenetation throws a - * {@link MessageConversionException}. - * - * @param message the message + * Template method that allows for custom message unmarshalling. + * Invoked when {@link #fromMessage(Message)} is invoked with a message + * that is not a {@link TextMessage} or {@link BytesMessage}. + *

The default implemenetation throws an {@link IllegalArgumentException}. + * @param message the message * @param unmarshaller the unmarshaller to use * @return the unmarshalled object * @throws JMSException if thrown by JMS methods - * @throws IOException in case of I/O errors + * @throws IOException in case of I/O errors + * @throws XmlMappingException in case of OXM mapping errors */ - protected Object unmarshalFromMessage(Message message, Unmarshaller unmarshaller) throws JMSException, IOException { - throw new MessageConversionException( + protected Object unmarshalFromMessage(Message message, Unmarshaller unmarshaller) + throws JMSException, IOException, XmlMappingException { + + throw new IllegalArgumentException( "MarshallingMessageConverter only supports TextMessages and BytesMessages"); } -} +} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorSystemException.java b/org.springframework.jms/src/main/java/org/springframework/jms/support/converter/MessageType.java similarity index 55% rename from org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorSystemException.java rename to org.springframework.jms/src/main/java/org/springframework/jms/support/converter/MessageType.java index d8a84a945bf..cf62d34f483 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorSystemException.java +++ b/org.springframework.jms/src/main/java/org/springframework/jms/support/converter/MessageType.java @@ -1,32 +1,32 @@ -/* - * Copyright 2005 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.oxm.castor; - -import org.springframework.oxm.UncategorizedXmlMappingException; - -/** - * Castor-specific subclass of UncategorizedXmlMappingException, for Castor exceptions that cannot be - * distinguished further. - * - * @author Arjen Poutsma - * @since 3.0 - */ -public class CastorSystemException extends UncategorizedXmlMappingException { - - public CastorSystemException(String msg, Throwable ex) { - super(msg, ex); - } -} +/* + * Copyright 2002-2009 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.jms.support.converter; + +/** + * Constants that indicate a target message type to convert to: a + * {@link javax.jms.TextMessage}, a {@link javax.jms.BytesMessage}, + * a {@link javax.jms.MapMessage} or an {@link ObjectMessage}. + * + * @author Juergen Hoeller + * @since 3.0 + * @see MarshallingMessageConverter#setTargetType + */ +public enum MessageType { + + TEXT, BYTES, MAP, OBJECT + +} diff --git a/org.springframework.jms/src/test/java/org/springframework/jms/support/converter/MarshallingMessageConverterTests.java b/org.springframework.jms/src/test/java/org/springframework/jms/support/converter/MarshallingMessageConverterTests.java index b6a562a3a97..861179583d7 100644 --- a/org.springframework.jms/src/test/java/org/springframework/jms/support/converter/MarshallingMessageConverterTests.java +++ b/org.springframework.jms/src/test/java/org/springframework/jms/support/converter/MarshallingMessageConverterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2007 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,13 +23,16 @@ import javax.xml.transform.Result; import javax.xml.transform.Source; import static org.easymock.EasyMock.*; -import static org.junit.Assert.assertEquals; +import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; import org.springframework.oxm.Marshaller; import org.springframework.oxm.Unmarshaller; +/** + * @author Arjen Poutsma + */ public class MarshallingMessageConverterTests { private MarshallingMessageConverter converter; @@ -83,7 +86,7 @@ public class MarshallingMessageConverterTests { @Test public void toTextMessage() throws Exception { - converter.setMarshalTo(MarshallingMessageConverter.MARSHAL_TO_TEXT_MESSAGE); + converter.setTargetType(MessageType.TEXT); TextMessage textMessageMock = createMock(TextMessage.class); Object toBeMarshalled = new Object(); @@ -114,4 +117,4 @@ public class MarshallingMessageConverterTests { verify(marshallerMock, unmarshallerMock, sessionMock, textMessageMock); } -} \ No newline at end of file +} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/Marshaller.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/Marshaller.java index d8b60aa1218..aaa3198025a 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/Marshaller.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/Marshaller.java @@ -1,5 +1,5 @@ /* - * Copyright 2005 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,39 +13,42 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.oxm; import java.io.IOException; import javax.xml.transform.Result; /** - * Defines the contract for Object XML Mapping Marshallers. Implementations of this interface can serialize a given - * Object to an XML Stream.

Although the marshal method accepts a java.lang.Object as its - * first parameter, most Marshaller implementations cannot handle arbitrary java.lang.Object. - * Instead, a object class must be registered with the marshaller, or have a common base class. + * Defines the contract for Object XML Mapping Marshallers. Implementations of this interface + * can serialize a given Object to an XML Stream. + * + *

Although the marshal method accepts a java.lang.Object as its + * first parameter, most Marshaller implementations cannot handle arbitrary + * Objects. Instead, a object class must be registered with the marshaller, + * or have a common base class. * * @author Arjen Poutsma * @since 3.0 + * @see Unmarshaller */ public interface Marshaller { - /** - * Marshals the object graph with the given root into the provided {@link Result}. - * - * @param graph the root of the object graph to marshal - * @param result the result to marshal to - * @throws XmlMappingException if the given object cannot be marshalled to the result - * @throws IOException if an I/O exception occurs - */ - void marshal(Object graph, Result result) throws XmlMappingException, IOException; - /** * Indicates whether this marshaller can marshal instances of the supplied type. - * * @param clazz the class that this marshaller is being asked if it can marshal - * @return true if this marshaller can indeed marshal instances of the supplied class; false - * otherwise + * @return true if this marshaller can indeed marshal instances of the supplied class; + * false otherwise */ boolean supports(Class clazz); + /** + * Marshals the object graph with the given root into the provided {@link Result}. + * @param graph the root of the object graph to marshal + * @param result the result to marshal to + * @throws IOException if an I/O error occurs + * @throws XmlMappingException if the given object cannot be marshalled to the result + */ + void marshal(Object graph, Result result) throws IOException, XmlMappingException; + } diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/GenericMarshallingFailureException.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/MarshallingException.java similarity index 57% rename from org.springframework.oxm/src/main/java/org/springframework/oxm/GenericMarshallingFailureException.java rename to org.springframework.oxm/src/main/java/org/springframework/oxm/MarshallingException.java index ec1abe053de..799bf9b6626 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/GenericMarshallingFailureException.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/MarshallingException.java @@ -1,5 +1,5 @@ /* - * Copyright 2005 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,26 +13,36 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.oxm; /** * Base class for exception thrown when a marshalling or unmarshalling error occurs. * * @author Arjen Poutsma + * @author Juergen Hoeller + * @since 3.0 * @see MarshallingFailureException * @see UnmarshallingFailureException - * @since 3.0 */ -public abstract class GenericMarshallingFailureException extends XmlMappingException { +public abstract class MarshallingException extends XmlMappingException { - /** Constructor for GenericMarshallingFailureException. */ - public GenericMarshallingFailureException(String msg) { + /** + * Construct a MarshallingException with the specified detail message. + * @param msg the detail message + */ + protected MarshallingException(String msg) { super(msg); } - /** Constructor for GenericMarshallingFailureException. */ - public GenericMarshallingFailureException(String msg, Throwable ex) { - super(msg, ex); + /** + * Construct a MarshallingException with the specified detail message + * and nested exception. + * @param msg the detail message + * @param cause the nested exception + */ + protected MarshallingException(String msg, Throwable cause) { + super(msg, cause); } } diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/MarshallingFailureException.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/MarshallingFailureException.java index 995e0db8d15..fb486b3dafd 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/MarshallingFailureException.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/MarshallingFailureException.java @@ -1,5 +1,5 @@ /* - * Copyright 2005 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.oxm; /** @@ -21,11 +22,10 @@ package org.springframework.oxm; * @author Arjen Poutsma * @since 3.0 */ -public class MarshallingFailureException extends GenericMarshallingFailureException { +public class MarshallingFailureException extends MarshallingException { /** * Construct a MarshallingFailureException with the specified detail message. - * * @param msg the detail message */ public MarshallingFailureException(String msg) { @@ -33,12 +33,13 @@ public class MarshallingFailureException extends GenericMarshallingFailureExcept } /** - * Construct a MarshallingFailureException with the specified detail message and nested exception. - * + * Construct a MarshallingFailureException with the specified detail message + * and nested exception. * @param msg the detail message - * @param ex the nested exception + * @param cause the nested exception */ - public MarshallingFailureException(String msg, Throwable ex) { - super(msg, ex); + public MarshallingFailureException(String msg, Throwable cause) { + super(msg, cause); } + } diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/UncategorizedXmlMappingException.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/UncategorizedMappingException.java similarity index 56% rename from org.springframework.oxm/src/main/java/org/springframework/oxm/UncategorizedXmlMappingException.java rename to org.springframework.oxm/src/main/java/org/springframework/oxm/UncategorizedMappingException.java index ea2d0d1b902..127c38b7ecf 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/UncategorizedXmlMappingException.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/UncategorizedMappingException.java @@ -1,5 +1,5 @@ /* - * Copyright 2005 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,18 +13,25 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.oxm; /** - * Superclass for exceptions that cannot be distinguished further. + * Exception that indicates that the cause cannot be distinguished further. * * @author Arjen Poutsma * @since 3.0 */ -public abstract class UncategorizedXmlMappingException extends XmlMappingException { +public class UncategorizedMappingException extends XmlMappingException { - /** Constructor for UncategorizedXmlMappingException. */ - protected UncategorizedXmlMappingException(String msg, Throwable ex) { - super(msg, ex); + /** + * Construct an UncategorizedMappingException with the specified detail message + * and nested exception. + * @param msg the detail message + * @param cause the nested exception + */ + public UncategorizedMappingException(String msg, Throwable cause) { + super(msg, cause); } + } diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/Unmarshaller.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/Unmarshaller.java index 156ee9f7ad6..e1534f3f2f0 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/Unmarshaller.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/Unmarshaller.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2007 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,37 +13,37 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.oxm; import java.io.IOException; import javax.xml.transform.Source; /** - * Defines the contract for Object XML Mapping unmarshallers.

Implementations of this interface can deserialize - * a given XML Stream to an Object graph. + * Defines the contract for Object XML Mapping unmarshallers. Implementations of this + * interface can deserialize a given XML Stream to an Object graph. * * @author Arjen Poutsma * @since 3.0 + * @see Marshaller */ public interface Unmarshaller { + /** + * Indicates whether this unmarshaller can unmarshal instances of the supplied type. + * @param clazz the class that this unmarshaller is being asked if it can marshal + * @return true if this unmarshaller can indeed unmarshal to the supplied class; + * false otherwise + */ + boolean supports(Class clazz); + /** * Unmarshals the given {@link Source} into an object graph. - * * @param source the source to marshal from * @return the object graph + * @throws IOException if an I/O error occurs * @throws XmlMappingException if the given source cannot be mapped to an object - * @throws IOException if an I/O Exception occurs */ - Object unmarshal(Source source) throws XmlMappingException, IOException; - - /** - * Indicates whether this unmarshaller can unmarshal instances of the supplied type. - * - * @param clazz the class that this unmarshaller is being asked if it can marshal - * @return true if this unmarshaller can indeed unmarshal to the supplied class; false - * otherwise - */ - boolean supports(Class clazz); + Object unmarshal(Source source) throws IOException, XmlMappingException; } diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/UnmarshallingFailureException.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/UnmarshallingFailureException.java index 877c63eb286..16b93de1df2 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/UnmarshallingFailureException.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/UnmarshallingFailureException.java @@ -1,5 +1,5 @@ /* - * Copyright 2005 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.oxm; /** @@ -21,15 +22,24 @@ package org.springframework.oxm; * @author Arjen Poutsma * @since 3.0 */ -public class UnmarshallingFailureException extends GenericMarshallingFailureException { +public class UnmarshallingFailureException extends MarshallingException { - /** Constructor for UnmarshallingFailureException. */ + /** + * Construct a MarshallingFailureException with the specified detail message. + * @param msg the detail message + */ public UnmarshallingFailureException(String msg) { super(msg); } - /** Constructor for UnmarshallingFailureException. */ - public UnmarshallingFailureException(String msg, Throwable ex) { - super(msg, ex); + /** + * Construct a MarshallingFailureException with the specified detail message + * and nested exception. + * @param msg the detail message + * @param cause the nested exception + */ + public UnmarshallingFailureException(String msg, Throwable cause) { + super(msg, cause); } + } diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/ValidationFailureException.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/ValidationFailureException.java index addc48db5a2..6b2aadcbcab 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/ValidationFailureException.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/ValidationFailureException.java @@ -1,5 +1,5 @@ /* - * Copyright 2005 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.oxm; /** @@ -23,13 +24,22 @@ package org.springframework.oxm; */ public class ValidationFailureException extends XmlMappingException { - /** Constructor for ValidationFailureException. */ + /** + * Construct a ValidationFailureException with the specified detail message. + * @param msg the detail message + */ public ValidationFailureException(String msg) { super(msg); } - /** Constructor for ValidationFailureException. */ - public ValidationFailureException(String msg, Throwable ex) { - super(msg, ex); + /** + * Construct a ValidationFailureException with the specified detail message + * and nested exception. + * @param msg the detail message + * @param cause the nested exception + */ + public ValidationFailureException(String msg, Throwable cause) { + super(msg, cause); } + } diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/XmlMappingException.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/XmlMappingException.java index 12f5575959a..bdcef11a4ca 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/XmlMappingException.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/XmlMappingException.java @@ -1,5 +1,5 @@ /* - * Copyright 2005 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.oxm; import org.springframework.core.NestedRuntimeException; @@ -25,13 +26,22 @@ import org.springframework.core.NestedRuntimeException; */ public abstract class XmlMappingException extends NestedRuntimeException { - /** Constructor for XmlMappingException. */ + /** + * Construct an XmlMappingException with the specified detail message. + * @param msg the detail message + */ public XmlMappingException(String msg) { super(msg); } - /** Constructor for XmlMappingException. */ - public XmlMappingException(String msg, Throwable ex) { - super(msg, ex); + /** + * Construct an XmlMappingException with the specified detail message + * and nested exception. + * @param msg the detail message + * @param cause the nested exception + */ + public XmlMappingException(String msg, Throwable cause) { + super(msg, cause); } + } diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorMarshallingFailureException.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorMappingException.java similarity index 51% rename from org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorMarshallingFailureException.java rename to org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorMappingException.java index f225106095b..fc881da516b 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorMarshallingFailureException.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorMappingException.java @@ -1,35 +1,39 @@ -/* - * Copyright 2005 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.oxm.castor; - -import org.exolab.castor.xml.MarshalException; - -import org.springframework.oxm.MarshallingFailureException; - -/** - * Castor-specific subclass of MarshallingFailureException. - * - * @author Arjen Poutsma - * @see CastorUtils#convertXmlException - * @since 3.0 - */ -public class CastorMarshallingFailureException extends MarshallingFailureException { - - public CastorMarshallingFailureException(MarshalException ex) { - super("Castor marshalling exception: " + ex.getMessage(), ex); - } - -} +/* + * Copyright 2002-2009 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.oxm.castor; + +import org.springframework.oxm.XmlMappingException; + +/** + * Exception thrown by {@link CastorMarshaller} whenever it encounters a mapping problem. + * + * @author Juergen Hoeller + * @since 3.0 + */ +public class CastorMappingException extends XmlMappingException { + + /** + * Construct a CastorMappingException with the specified detail message + * and nested exception. + * @param msg the detail message + * @param cause the nested exception + */ + public CastorMappingException(String msg, Throwable cause) { + super(msg, cause); + } + +} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorMarshaller.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorMarshaller.java index 6fe76dfde98..e4b5d998259 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorMarshaller.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorMarshaller.java @@ -1,5 +1,5 @@ /* - * Copyright 2005 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.oxm.castor; import java.io.IOException; @@ -21,8 +22,7 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.Writer; -import java.util.Iterator; -import java.util.Properties; +import java.util.Map; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLEventWriter; import javax.xml.stream.XMLStreamReader; @@ -30,13 +30,14 @@ import javax.xml.stream.XMLStreamWriter; import org.exolab.castor.mapping.Mapping; import org.exolab.castor.mapping.MappingException; -import org.exolab.castor.xml.MarshalException; import org.exolab.castor.xml.Marshaller; import org.exolab.castor.xml.ResolverException; import org.exolab.castor.xml.UnmarshalHandler; import org.exolab.castor.xml.Unmarshaller; import org.exolab.castor.xml.XMLContext; import org.exolab.castor.xml.XMLException; +import org.exolab.castor.xml.ValidationException; +import org.exolab.castor.xml.MarshalException; import org.w3c.dom.Node; import org.xml.sax.ContentHandler; import org.xml.sax.InputSource; @@ -46,12 +47,16 @@ import org.xml.sax.ext.LexicalHandler; import org.springframework.beans.factory.InitializingBean; import org.springframework.core.io.Resource; -import org.springframework.oxm.AbstractMarshaller; +import org.springframework.oxm.UnmarshallingFailureException; import org.springframework.oxm.XmlMappingException; +import org.springframework.oxm.ValidationFailureException; +import org.springframework.oxm.MarshallingFailureException; +import org.springframework.oxm.UncategorizedMappingException; +import org.springframework.oxm.support.AbstractMarshaller; +import org.springframework.oxm.support.SaxResourceUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; -import org.springframework.util.xml.SaxUtils; import org.springframework.util.xml.StaxUtils; /** @@ -76,18 +81,17 @@ import org.springframework.util.xml.StaxUtils; public class CastorMarshaller extends AbstractMarshaller implements InitializingBean { /** - * The default encoding used for stream access. + * The default encoding used for stream access: UTF-8. */ public static final String DEFAULT_ENCODING = "UTF-8"; + private Resource[] mappingLocations; private String encoding = DEFAULT_ENCODING; private Class targetClass; - private XMLContext xmlContext; - private boolean validating = false; private boolean whitespacePreserve = false; @@ -96,68 +100,45 @@ public class CastorMarshaller extends AbstractMarshaller implements Initializing private boolean ignoreExtraElements = false; - private Properties namespaceMappings; + private Map namespaceMappings; - /** - * Returns whether the Castor {@link Unmarshaller} should ignore attributes that do not match a specific field. - */ - public boolean getIgnoreExtraAttributes() { - return ignoreExtraAttributes; - } - - /** - * Sets whether the Castor {@link Unmarshaller} should ignore attributes that do not match a specific field. Default - * is true: extra attributes are ignored. - * - * @see org.exolab.castor.xml.Unmarshaller#setIgnoreExtraAttributes(boolean) - */ - public void setIgnoreExtraAttributes(boolean ignoreExtraAttributes) { - this.ignoreExtraAttributes = ignoreExtraAttributes; - } + private XMLContext xmlContext; - /** - * Returns whether the Castor {@link Unmarshaller} should ignore elements that do not match a specific field. - */ - public boolean getIgnoreExtraElements() { - return ignoreExtraElements; - } /** - * Sets whether the Castor {@link Unmarshaller} should ignore elements that do not match a specific field. Default is - * false, extra attributes are flagged as an error. - * - * @see org.exolab.castor.xml.Unmarshaller#setIgnoreExtraElements(boolean) + * Set the encoding to be used for stream access. + * @see #DEFAULT_ENCODING */ - public void setIgnoreExtraElements(boolean ignoreExtraElements) { - this.ignoreExtraElements = ignoreExtraElements; + public void setEncoding(String encoding) { + this.encoding = encoding; } /** - * Returns whether the Castor {@link Unmarshaller} should preserve "ignorable" whitespace. + * Set the locations of the Castor XML Mapping files. */ - public boolean getWhitespacePreserve() { - return whitespacePreserve; + public void setMappingLocation(Resource mappingLocation) { + this.mappingLocations = new Resource[] {mappingLocation}; } /** - * Sets whether the Castor {@link Unmarshaller} should preserve "ignorable" whitespace. Default is false. - * - * @see org.exolab.castor.xml.Unmarshaller#setWhitespacePreserve(boolean) + * Set the locations of the Castor XML Mapping files. */ - public void setWhitespacePreserve(boolean whitespacePreserve) { - this.whitespacePreserve = whitespacePreserve; + public void setMappingLocations(Resource[] mappingLocations) { + this.mappingLocations = mappingLocations; } /** - * Returns whether this marshaller should validate in- and outgoing documents. + * Set the Castor target class. If this property is set, this CastorMarshaller + * is tied to this one specific class. Use a mapping file for unmarshalling multiple classes. + *

You cannot set both this property and the mapping (location). */ - public boolean isValidating() { - return validating; + public void setTargetClass(Class targetClass) { + this.targetClass = targetClass; } /** - * Sets whether this marshaller should validate in- and outgoing documents. Default is false. - * + * Set whether this marshaller should validate in- and outgoing documents. + *

Default is false. * @see Marshaller#setValidation(boolean) */ public void setValidating(boolean validating) { @@ -165,104 +146,86 @@ public class CastorMarshaller extends AbstractMarshaller implements Initializing } /** - * Returns the namespace mappings. Property names are interpreted as namespace prefixes; values are namespace URIs. + * Set whether the Castor {@link Unmarshaller} should preserve "ignorable" whitespace. + *

Default is false. + * @see org.exolab.castor.xml.Unmarshaller#setWhitespacePreserve(boolean) */ - public Properties getNamespaceMappings() { - return namespaceMappings; + public void setWhitespacePreserve(boolean whitespacePreserve) { + this.whitespacePreserve = whitespacePreserve; } /** - * Sets the namespace mappings. Property names are interpreted as namespace prefixes; values are namespace URIs. - * - * @see org.exolab.castor.xml.Marshaller#setNamespaceMapping(String, String) + * Set whether the Castor {@link Unmarshaller} should ignore attributes that do not match a specific field. + *

Default is true: extra attributes are ignored. + * @see org.exolab.castor.xml.Unmarshaller#setIgnoreExtraAttributes(boolean) */ - public void setNamespaceMappings(Properties namespaceMappings) { - this.namespaceMappings = namespaceMappings; + public void setIgnoreExtraAttributes(boolean ignoreExtraAttributes) { + this.ignoreExtraAttributes = ignoreExtraAttributes; } /** - * Sets the encoding to be used for stream access. If this property is not set, the default encoding is used. - * - * @see #DEFAULT_ENCODING + * Set whether the Castor {@link Unmarshaller} should ignore elements that do not match a specific field. + *

Default is false, extra attributes are flagged as an error. + * @see org.exolab.castor.xml.Unmarshaller#setIgnoreExtraElements(boolean) */ - public void setEncoding(String encoding) { - this.encoding = encoding; + public void setIgnoreExtraElements(boolean ignoreExtraElements) { + this.ignoreExtraElements = ignoreExtraElements; } /** - * Sets the locations of the Castor XML Mapping files. + * Set the namespace mappings. Property names are interpreted as namespace prefixes; values are namespace URIs. + * @see org.exolab.castor.xml.Marshaller#setNamespaceMapping(String, String) */ - public void setMappingLocation(Resource mappingLocation) { - mappingLocations = new Resource[]{mappingLocation}; + public void setNamespaceMappings(Map namespaceMappings) { + this.namespaceMappings = namespaceMappings; } - /** - * Sets the locations of the Castor XML Mapping files. - */ - public void setMappingLocations(Resource[] mappingLocations) { - this.mappingLocations = mappingLocations; - } - /** - * Sets the Castor target class. If this property is set, this CastorMarshaller is tied to this one - * specific class. Use a mapping file for unmarshalling multiple classes.

You cannot set both this property and - * the mapping (location). - */ - public void setTargetClass(Class targetClass) { - this.targetClass = targetClass; - } - public final void afterPropertiesSet() throws IOException { - if (mappingLocations != null && targetClass != null) { + public final void afterPropertiesSet() throws CastorMappingException, IOException { + if (this.mappingLocations != null && this.targetClass != null) { throw new IllegalArgumentException("Cannot set both the 'mappingLocations' and 'targetClass' property. " + - "Set targetClass for unmarshalling a single class, and 'mappingLocations' for multiple classes'"); + "Set 'targetClass' for unmarshalling a single class, and 'mappingLocations' for multiple classes."); } if (logger.isInfoEnabled()) { - if (mappingLocations != null) { - logger.info("Configured using " + StringUtils.arrayToCommaDelimitedString(mappingLocations)); + if (this.mappingLocations != null) { + logger.info("Configured using " + StringUtils.arrayToCommaDelimitedString(this.mappingLocations)); } - else if (targetClass != null) { - logger.info("Configured for target class [" + targetClass.getName() + "]"); + else if (this.targetClass != null) { + logger.info("Configured for target class [" + this.targetClass.getName() + "]"); } else { logger.info("Using default configuration"); } } try { - xmlContext = createXMLContext(mappingLocations, targetClass); + this.xmlContext = createXMLContext(this.mappingLocations, this.targetClass); } catch (MappingException ex) { - throw new CastorSystemException("Could not load Castor mapping: " + ex.getMessage(), ex); + throw new CastorMappingException("Could not load Castor mapping", ex); } - catch (ResolverException rex) { - throw new CastorSystemException("Could not load Castor mapping: " + rex.getMessage(), rex); + catch (ResolverException ex) { + throw new CastorMappingException("Could not resolve Castor mapping", ex); } } /** - * Returns true for all classes, i.e. Castor supports arbitrary classes. - */ - public boolean supports(Class clazz) { - return true; - } - - /** - * Creates the Castor XMLContext. Subclasses can override this to create a custom context.

The - * default implementation loads mapping files if defined, and the target class if not defined. - * + * Create the Castor XMLContext. Subclasses can override this to create a custom context. + *

The default implementation loads mapping files if defined, and the target class if not defined. * @return the created resolver * @throws MappingException when the mapping file cannot be loaded - * @throws IOException in case of I/O errors + * @throws IOException in case of I/O errors * @see XMLContext#addMapping(org.exolab.castor.mapping.Mapping) * @see XMLContext#addClass(Class) */ protected XMLContext createXMLContext(Resource[] mappingLocations, Class targetClass) - throws MappingException, IOException, ResolverException { + throws MappingException, ResolverException, IOException { + XMLContext context = new XMLContext(); if (!ObjectUtils.isEmpty(mappingLocations)) { Mapping mapping = new Mapping(); for (Resource mappingLocation : mappingLocations) { - mapping.loadMapping(SaxUtils.createInputSource(mappingLocation)); + mapping.loadMapping(SaxResourceUtils.createInputSource(mappingLocation)); } context.addMapping(mapping); } @@ -272,9 +235,16 @@ public class CastorMarshaller extends AbstractMarshaller implements Initializing return context; } - // + + /** + * Returns true for all classes, i.e. Castor supports arbitrary classes. + */ + public boolean supports(Class clazz) { + return true; + } + + // Marshalling - // @Override protected final void marshalDomNode(Object graph, Node node) throws XmlMappingException { @@ -323,26 +293,22 @@ public class CastorMarshaller extends AbstractMarshaller implements Initializing } /** - * Template method that allows for customizing of the given Castor {@link Marshaller}.

Default implementation - * invokes {@link Marshaller#setValidation(boolean)} with the property set on this marshaller, and calls {@link - * Marshaller#setNamespaceMapping(String, String)} with the {@linkplain #setNamespaceMappings(java.util.Properties) - * namespace mappings}. + * Template method that allows for customizing of the given Castor {@link Marshaller}. + *

The default implementation invokes {@link Marshaller#setValidation(boolean)} + * with the property set on this marshaller, and calls {@link Marshaller#setNamespaceMapping(String, String)} + * with the {@linkplain #setNamespaceMappings(java.util.Properties) namespace mappings}. */ protected void customizeMarshaller(Marshaller marshaller) { - marshaller.setValidation(isValidating()); - Properties namespaceMappings = getNamespaceMappings(); - if (namespaceMappings != null) { - for (Iterator iterator = namespaceMappings.keySet().iterator(); iterator.hasNext();) { - String prefix = (String) iterator.next(); - String uri = namespaceMappings.getProperty(prefix); - marshaller.setNamespaceMapping(prefix, uri); + marshaller.setValidation(this.validating); + if (this.namespaceMappings != null) { + for (Map.Entry entry : namespaceMappings.entrySet()) { + marshaller.setNamespaceMapping(entry.getKey(), entry.getValue()); } } } - // + // Unmarshalling - // @Override protected final Object unmarshalDomNode(Node node) throws XmlMappingException { @@ -381,13 +347,14 @@ public class CastorMarshaller extends AbstractMarshaller implements Initializing return unmarshalSaxReader(reader, new InputSource()); } catch (IOException ex) { - throw new CastorUnmarshallingFailureException(new MarshalException(ex)); + throw new UnmarshallingFailureException("Failed to read XML stream", ex); } } @Override protected final Object unmarshalSaxReader(XMLReader xmlReader, InputSource inputSource) throws XmlMappingException, IOException { + UnmarshalHandler unmarshalHandler = createUnmarshaller().createHandler(); try { ContentHandler contentHandler = Unmarshaller.getContentHandler(unmarshalHandler); @@ -396,7 +363,7 @@ public class CastorMarshaller extends AbstractMarshaller implements Initializing return unmarshalHandler.getObject(); } catch (SAXException ex) { - throw new CastorUnmarshallingFailureException(ex); + throw new UnmarshallingFailureException("SAX reader exception", ex); } } @@ -407,47 +374,60 @@ public class CastorMarshaller extends AbstractMarshaller implements Initializing return unmarshalSaxReader(reader, new InputSource()); } catch (IOException ex) { - throw new CastorUnmarshallingFailureException(new MarshalException(ex)); + throw new UnmarshallingFailureException("Failed to read XML stream", ex); } } private Unmarshaller createUnmarshaller() { - Unmarshaller unmarshaller = xmlContext.createUnmarshaller(); - if (targetClass != null) { - unmarshaller.setClass(targetClass); - unmarshaller.setClassLoader(targetClass.getClassLoader()); + Unmarshaller unmarshaller = this.xmlContext.createUnmarshaller(); + if (this.targetClass != null) { + unmarshaller.setClass(this.targetClass); + unmarshaller.setClassLoader(this.targetClass.getClassLoader()); } customizeUnmarshaller(unmarshaller); return unmarshaller; } /** - * Template method that allows for customizing of the given Castor {@link Unmarshaller}.

Default implementation - * invokes {@link Unmarshaller#setValidation(boolean)}, {@link Unmarshaller#setWhitespacePreserve(boolean)}, {@link - * Unmarshaller#setIgnoreExtraAttributes(boolean)}, and {@link Unmarshaller#setIgnoreExtraElements(boolean)} with the - * properties set on this marshaller. + * Template method that allows for customizing of the given Castor {@link Unmarshaller}. + *

The default implementation invokes {@link Unmarshaller#setValidation(boolean)}, + * {@link Unmarshaller#setWhitespacePreserve(boolean)}, {@link Unmarshaller#setIgnoreExtraAttributes(boolean)}, + * and {@link Unmarshaller#setIgnoreExtraElements(boolean)} with the properties set on this marshaller. */ protected void customizeUnmarshaller(Unmarshaller unmarshaller) { - unmarshaller.setValidation(isValidating()); - unmarshaller.setWhitespacePreserve(getWhitespacePreserve()); - unmarshaller.setIgnoreExtraAttributes(getIgnoreExtraAttributes()); - unmarshaller.setIgnoreExtraElements(getIgnoreExtraElements()); + unmarshaller.setValidation(this.validating); + unmarshaller.setWhitespacePreserve(this.whitespacePreserve); + unmarshaller.setIgnoreExtraAttributes(this.ignoreExtraAttributes); + unmarshaller.setIgnoreExtraElements(this.ignoreExtraElements); } /** - * Converts the given CastorException to an appropriate exception from the - * org.springframework.oxm hierarchy.

The default implementation delegates to - * CastorUtils. Can be overridden in subclasses.

A boolean flag is used to indicate whether this - * exception occurs during marshalling or unmarshalling, since Castor itself does not make this distinction in its - * exception hierarchy. - * - * @param ex Castor XMLException that occured - * @param marshalling indicates whether the exception occurs during marshalling (true), or unmarshalling - * (false) + * Convert the given XMLException 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 Castor itself does not make this distinction in its exception hierarchy. + * @param ex Castor XMLException that occured + * @param marshalling indicates whether the exception occurs during marshalling (true), + * or unmarshalling (false) * @return the corresponding XmlMappingException - * @see CastorUtils#convertXmlException + * @see CastorUtils#convertCastorException */ - public XmlMappingException convertCastorException(XMLException ex, boolean marshalling) { - return CastorUtils.convertXmlException(ex, marshalling); + protected XmlMappingException convertCastorException(XMLException ex, boolean marshalling) { + if (ex instanceof ValidationException) { + return new ValidationFailureException("Castor validation exception", ex); + } + else if (ex instanceof MarshalException) { + if (marshalling) { + return new MarshallingFailureException("Castor marshalling exception", ex); + } + else { + return new UnmarshallingFailureException("Castor unmarshalling exception", ex); + } + } + else { + // fallback + return new UncategorizedMappingException("Unknown Castor exception", ex); + } } + } diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorUnmarshallingFailureException.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorUnmarshallingFailureException.java deleted file mode 100644 index 307cb696340..00000000000 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorUnmarshallingFailureException.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2005 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.oxm.castor; - -import org.exolab.castor.xml.MarshalException; -import org.xml.sax.SAXException; - -import org.springframework.oxm.UnmarshallingFailureException; - -/** - * Castor-specific subclass of UnmarshallingFailureException. - * - * @author Arjen Poutsma - * @see CastorUtils#convertXmlException - * @since 3.0 - */ -public class CastorUnmarshallingFailureException extends UnmarshallingFailureException { - - public CastorUnmarshallingFailureException(MarshalException ex) { - super("Castor unmarshalling exception: " + ex.getMessage(), ex); - } - - public CastorUnmarshallingFailureException(SAXException ex) { - super("Castor unmarshalling exception: " + ex.getMessage(), ex); - } -} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorUtils.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorUtils.java deleted file mode 100644 index 3515e97cd3f..00000000000 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorUtils.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2005 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.oxm.castor; - -import org.exolab.castor.xml.MarshalException; -import org.exolab.castor.xml.ValidationException; -import org.exolab.castor.xml.XMLException; - -import org.springframework.oxm.XmlMappingException; - -/** - * Generic utility methods for working with Castor. Mainly for internal use within the framework. - * - * @author Arjen Poutsma - * @since 3.0 - */ -public class CastorUtils { - - /** - * Converts the given XMLException 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 Castor itself does not make this distinction in its exception - * hierarchy. - * - * @param ex Castor XMLException that occured - * @param marshalling indicates whether the exception occurs during marshalling (true), or unmarshalling - * (false) - * @return the corresponding XmlMappingException - */ - public static XmlMappingException convertXmlException(XMLException ex, boolean marshalling) { - if (ex instanceof MarshalException) { - MarshalException marshalException = (MarshalException) ex; - if (marshalling) { - return new CastorMarshallingFailureException(marshalException); - } - else { - return new CastorUnmarshallingFailureException(marshalException); - } - } - else if (ex instanceof ValidationException) { - return new CastorValidationFailureException((ValidationException) ex); - } - // fallback - return new CastorSystemException("Unknown Castor exception: " + ex.getMessage(), ex); - } - -} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorValidationFailureException.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorValidationFailureException.java deleted file mode 100644 index e33fd7285ea..00000000000 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/castor/CastorValidationFailureException.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2005 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.oxm.castor; - -import org.exolab.castor.xml.ValidationException; - -import org.springframework.oxm.ValidationFailureException; - -/** - * Castor-specific subclass of MarshallingFailureException. - * - * @author Arjen Poutsma - * @see CastorUtils#convertXmlException - * @since 3.0 - */ -public class CastorValidationFailureException extends ValidationFailureException { - - public CastorValidationFailureException(ValidationException ex) { - super("Castor validation exception: " + ex.getMessage(), ex); - } -} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/config/Jaxb2MarshallerBeanDefinitionParser.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/config/Jaxb2MarshallerBeanDefinitionParser.java index 9172b87d9b6..3d60be51c1f 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/config/Jaxb2MarshallerBeanDefinitionParser.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/config/Jaxb2MarshallerBeanDefinitionParser.java @@ -1,6 +1,6 @@ /* - * Copyright 2007 the original author or authors. - * +* Copyright 2002-2009 the original author or authors. + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/config/JibxMarshallerBeanDefinitionParser.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/config/JibxMarshallerBeanDefinitionParser.java index 71faac2dc43..b3a0773f27a 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/config/JibxMarshallerBeanDefinitionParser.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/config/JibxMarshallerBeanDefinitionParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2008 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/config/OxmNamespaceHandler.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/config/OxmNamespaceHandler.java index 8f73923e614..7d9d1c797f0 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/config/OxmNamespaceHandler.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/config/OxmNamespaceHandler.java @@ -1,6 +1,6 @@ /* - * Copyright 2008 the original author or authors. - * +* Copyright 2002-2009 the original author or authors. + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -32,4 +32,5 @@ public class OxmNamespaceHandler extends NamespaceHandlerSupport { registerBeanDefinitionParser("jibx-marshaller", new JibxMarshallerBeanDefinitionParser()); registerBeanDefinitionParser("xmlbeans-marshaller", new XmlBeansMarshallerBeanDefinitionParser()); } + } diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/config/XmlBeansMarshallerBeanDefinitionParser.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/config/XmlBeansMarshallerBeanDefinitionParser.java index 075ea7b1527..a27fec56bd0 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/config/XmlBeansMarshallerBeanDefinitionParser.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/config/XmlBeansMarshallerBeanDefinitionParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2008 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -45,4 +45,5 @@ class XmlBeansMarshallerBeanDefinitionParser extends AbstractSingleBeanDefinitio beanDefinitionBuilder.addPropertyReference("xmlOptions", optionsName); } } -} \ No newline at end of file + +} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/Jaxb2Marshaller.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/Jaxb2Marshaller.java index 73a4e1093bd..4ce357dda8a 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/Jaxb2Marshaller.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/Jaxb2Marshaller.java @@ -1,5 +1,5 @@ /* - * Copyright 2006 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,9 +34,12 @@ import javax.xml.XMLConstants; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; +import javax.xml.bind.MarshalException; import javax.xml.bind.Marshaller; +import javax.xml.bind.UnmarshalException; import javax.xml.bind.Unmarshaller; import javax.xml.bind.ValidationEventHandler; +import javax.xml.bind.ValidationException; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.adapters.XmlAdapter; import javax.xml.bind.attachment.AttachmentMarshaller; @@ -61,16 +64,20 @@ import org.xml.sax.helpers.XMLReaderFactory; import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.beans.factory.InitializingBean; import org.springframework.core.io.Resource; +import org.springframework.oxm.MarshallingFailureException; +import org.springframework.oxm.UncategorizedMappingException; +import org.springframework.oxm.UnmarshallingFailureException; +import org.springframework.oxm.ValidationFailureException; import org.springframework.oxm.XmlMappingException; import org.springframework.oxm.mime.MimeContainer; import org.springframework.oxm.mime.MimeMarshaller; import org.springframework.oxm.mime.MimeUnmarshaller; +import org.springframework.oxm.support.SaxResourceUtils; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.FileCopyUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; -import org.springframework.util.xml.SaxUtils; import org.springframework.util.xml.StaxUtils; /** @@ -97,55 +104,45 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, BeanCl private static final String CID = "cid:"; + /** * Logger available to subclasses. */ - private static final Log logger = LogFactory.getLog(Jaxb2Marshaller.class); + protected final Log logger = LogFactory.getLog(getClass()); private String contextPath; + private Class[] classesToBeBound; + + private Map jaxbContextProperties; + private Map marshallerProperties; private Map unmarshallerProperties; - private JAXBContext jaxbContext; + private Marshaller.Listener marshallerListener; + + private Unmarshaller.Listener unmarshallerListener; private ValidationEventHandler validationEventHandler; - private ClassLoader classLoader; + private XmlAdapter[] adapters; private Resource[] schemaResources; private String schemaLanguage = XMLConstants.W3C_XML_SCHEMA_NS_URI; - private Marshaller.Listener marshallerListener; + private boolean mtomEnabled = false; - private Unmarshaller.Listener unmarshallerListener; + private ClassLoader beanClassLoader; - private XmlAdapter[] adapters; + private JAXBContext jaxbContext; private Schema schema; - private Class[] classesToBeBound; - - private Map jaxbContextProperties; - - private boolean mtomEnabled = false; - - public void setBeanClassLoader(ClassLoader classLoader) { - this.classLoader = classLoader; - } - - /** - * Sets the XmlAdapters to be registered with the JAXB Marshaller and - * Unmarshaller - */ - public void setAdapters(XmlAdapter[] adapters) { - this.adapters = adapters; - } /** - * Sets the JAXB Context path. + * Set a JAXB context path. */ public void setContextPath(String contextPath) { Assert.hasText(contextPath, "'contextPath' must not be null"); @@ -153,8 +150,8 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, BeanCl } /** - * Sets multiple JAXB Context paths. The given array of context paths is converted to a colon-delimited string, as - * supported by JAXB. + * Set multiple JAXB context paths. The given array of context paths is converted to a + * colon-delimited string, as supported by JAXB. */ public void setContextPaths(String[] contextPaths) { Assert.notEmpty(contextPaths, "'contextPaths' must not be empty"); @@ -162,133 +159,126 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, BeanCl } /** - * Sets the list of java classes to be recognized by a newly created JAXBContext. Setting this property or - * contextPath is required. - * - * @see #setContextPath(String) + * Set the list of Java classes to be recognized by a newly created JAXBContext. + * Setting this property or {@link #setContextPath "contextPath"} is required. */ public void setClassesToBeBound(Class[] classesToBeBound) { this.classesToBeBound = classesToBeBound; } /** - * Sets the JAXBContext properties. These implementation-specific properties will be set on the - * JAXBContext. + * Set the JAXBContext properties. These implementation-specific + * properties will be set on the underlying JAXBContext. */ public void setJaxbContextProperties(Map jaxbContextProperties) { this.jaxbContextProperties = jaxbContextProperties; } /** - * Sets the Marshaller.Listener to be registered with the JAXB Marshaller. + * Set the JAXB Marshaller properties. These properties will be set on the + * underlying JAXB Marshaller, and allow for features such as indentation. + * @param properties the properties + * @see Marshaller#setProperty(String,Object) + * @see Marshaller#JAXB_ENCODING + * @see Marshaller#JAXB_FORMATTED_OUTPUT + * @see Marshaller#JAXB_NO_NAMESPACE_SCHEMA_LOCATION + * @see Marshaller#JAXB_SCHEMA_LOCATION */ - public void setMarshallerListener(Marshaller.Listener marshallerListener) { - this.marshallerListener = marshallerListener; + public void setMarshallerProperties(Map properties) { + this.marshallerProperties = properties; } /** - * Indicates whether MTOM support should be enabled or not. Default is false, marshalling using XOP/MTOM - * is not enabled. + * Set the JAXB Unmarshaller properties. These properties will be set on the + * underlying JAXB Unmarshaller. + * @param properties the properties + * @see javax.xml.bind.Unmarshaller#setProperty(String,Object) */ - public void setMtomEnabled(boolean mtomEnabled) { - this.mtomEnabled = mtomEnabled; + public void setUnmarshallerProperties(Map properties) { + this.unmarshallerProperties = properties; } /** - * Sets the schema language. Default is the W3C XML Schema: http://www.w3.org/2001/XMLSchema". - * - * @see XMLConstants#W3C_XML_SCHEMA_NS_URI - * @see XMLConstants#RELAXNG_NS_URI + * Specify the Marshaller.Listener to be registered with the JAXB Marshaller. */ - public void setSchemaLanguage(String schemaLanguage) { - this.schemaLanguage = schemaLanguage; + public void setMarshallerListener(Marshaller.Listener marshallerListener) { + this.marshallerListener = marshallerListener; } /** - * Sets the schema resource to use for validation. + * Set the Unmarshaller.Listener to be registered with the JAXB Unmarshaller. */ - public void setSchema(Resource schemaResource) { - schemaResources = new Resource[]{schemaResource}; + public void setUnmarshallerListener(Unmarshaller.Listener unmarshallerListener) { + this.unmarshallerListener = unmarshallerListener; } /** - * Sets the schema resources to use for validation. + * Set the JAXB validation event handler. This event handler will be called by JAXB + * if any validation errors are encountered during calls to any of the marshal APIs. */ - public void setSchemas(Resource[] schemaResources) { - this.schemaResources = schemaResources; + public void setValidationEventHandler(ValidationEventHandler validationEventHandler) { + this.validationEventHandler = validationEventHandler; } /** - * Sets the Unmarshaller.Listener to be registered with the JAXB Unmarshaller. + * Specify the XmlAdapters to be registered with the JAXB Marshaller + * and Unmarshaller */ - public void setUnmarshallerListener(Unmarshaller.Listener unmarshallerListener) { - this.unmarshallerListener = unmarshallerListener; + public void setAdapters(XmlAdapter[] adapters) { + this.adapters = adapters; } /** - * Sets the JAXB Marshaller properties. These properties will be set on the underlying JAXB - * Marshaller, and allow for features such as indentation. - * - * @param properties the properties - * @see Marshaller#setProperty(String,Object) - * @see Marshaller#JAXB_ENCODING - * @see Marshaller#JAXB_FORMATTED_OUTPUT - * @see Marshaller#JAXB_NO_NAMESPACE_SCHEMA_LOCATION - * @see Marshaller#JAXB_SCHEMA_LOCATION + * Set the schema resource to use for validation. */ - public void setMarshallerProperties(Map properties) { - this.marshallerProperties = properties; + public void setSchema(Resource schemaResource) { + this.schemaResources = new Resource[] {schemaResource}; } /** - * Sets the JAXB Unmarshaller properties. These properties will be set on the underlying JAXB - * Unmarshaller. - * - * @param properties the properties - * @see javax.xml.bind.Unmarshaller#setProperty(String,Object) + * Set the schema resources to use for validation. */ - public void setUnmarshallerProperties(Map properties) { - this.unmarshallerProperties = properties; + public void setSchemas(Resource[] schemaResources) { + this.schemaResources = schemaResources; } /** - * Sets the JAXB validation event handler. This event handler will be called by JAXB if any validation errors are - * encountered during calls to any of the marshal API's. - * - * @param validationEventHandler the event handler + * Set the schema language. Default is the W3C XML Schema: http://www.w3.org/2001/XMLSchema". + * @see XMLConstants#W3C_XML_SCHEMA_NS_URI + * @see XMLConstants#RELAXNG_NS_URI */ - public void setValidationEventHandler(ValidationEventHandler validationEventHandler) { - this.validationEventHandler = validationEventHandler; + public void setSchemaLanguage(String schemaLanguage) { + this.schemaLanguage = schemaLanguage; } + /** + * Specify whether MTOM support should be enabled or not. + * Default is false: marshalling using XOP/MTOM not being enabled. + */ + public void setMtomEnabled(boolean mtomEnabled) { + this.mtomEnabled = mtomEnabled; + } + + public void setBeanClassLoader(ClassLoader classLoader) { + this.beanClassLoader = classLoader; + } + + public final void afterPropertiesSet() throws Exception { - if (StringUtils.hasLength(contextPath) && !ObjectUtils.isEmpty(classesToBeBound)) { - throw new IllegalArgumentException("specify either contextPath or classesToBeBound property; not both"); - } - try { - jaxbContext = createJaxbContext(); - } - catch (JAXBException ex) { - throw convertJaxbException(ex); + this.jaxbContext = createJaxbContext(); + if (!ObjectUtils.isEmpty(this.schemaResources)) { + this.schema = loadSchema(this.schemaResources, this.schemaLanguage); } } - /* - * JAXBContext - */ - protected JAXBContext createJaxbContext() throws Exception { - if (!ObjectUtils.isEmpty(schemaResources)) { - if (logger.isDebugEnabled()) { - logger.debug( - "Setting validation schema to " + StringUtils.arrayToCommaDelimitedString(schemaResources)); - } - schema = loadSchema(schemaResources, schemaLanguage); + if (StringUtils.hasLength(this.contextPath) && !ObjectUtils.isEmpty(this.classesToBeBound)) { + throw new IllegalArgumentException("Specify either 'contextPath' or 'classesToBeBound property'; not both"); } - if (StringUtils.hasLength(contextPath)) { + if (StringUtils.hasLength(this.contextPath)) { return createJaxbContextFromContextPath(); } - else if (!ObjectUtils.isEmpty(classesToBeBound)) { + else if (!ObjectUtils.isEmpty(this.classesToBeBound)) { return createJaxbContextFromClasses(); } else { @@ -298,22 +288,22 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, BeanCl private JAXBContext createJaxbContextFromContextPath() throws JAXBException { if (logger.isInfoEnabled()) { - logger.info("Creating JAXBContext with context path [" + contextPath + "]"); + logger.info("Creating JAXBContext with context path [" + this.contextPath + "]"); } - if (jaxbContextProperties != null) { - if (classLoader != null) { - return JAXBContext.newInstance(contextPath, classLoader, jaxbContextProperties); + if (this.jaxbContextProperties != null) { + if (this.beanClassLoader != null) { + return JAXBContext.newInstance(this.contextPath, this.beanClassLoader, this.jaxbContextProperties); } else { - return JAXBContext.newInstance(contextPath, ClassUtils.getDefaultClassLoader(), jaxbContextProperties); + return JAXBContext.newInstance(this.contextPath, ClassUtils.getDefaultClassLoader(), this.jaxbContextProperties); } } else { - if (classLoader != null) { - return JAXBContext.newInstance(contextPath, classLoader); + if (this.beanClassLoader != null) { + return JAXBContext.newInstance(this.contextPath, this.beanClassLoader); } else { - return JAXBContext.newInstance(contextPath); + return JAXBContext.newInstance(this.contextPath); } } } @@ -321,17 +311,20 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, BeanCl private JAXBContext createJaxbContextFromClasses() throws JAXBException { if (logger.isInfoEnabled()) { logger.info("Creating JAXBContext with classes to be bound [" + - StringUtils.arrayToCommaDelimitedString(classesToBeBound) + "]"); + StringUtils.arrayToCommaDelimitedString(this.classesToBeBound) + "]"); } - if (jaxbContextProperties != null) { - return JAXBContext.newInstance(classesToBeBound, jaxbContextProperties); + if (this.jaxbContextProperties != null) { + return JAXBContext.newInstance(this.classesToBeBound, this.jaxbContextProperties); } else { - return JAXBContext.newInstance(classesToBeBound); + return JAXBContext.newInstance(this.classesToBeBound); } } private Schema loadSchema(Resource[] resources, String schemaLanguage) throws IOException, SAXException { + if (logger.isDebugEnabled()) { + logger.debug("Setting validation schema to " + StringUtils.arrayToCommaDelimitedString(this.schemaResources)); + } Assert.notEmpty(resources, "No resources given"); Assert.hasLength(schemaLanguage, "No schema language provided"); Source[] schemaSources = new Source[resources.length]; @@ -340,13 +333,14 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, BeanCl for (int i = 0; i < resources.length; i++) { Assert.notNull(resources[i], "Resource is null"); Assert.isTrue(resources[i].exists(), "Resource " + resources[i] + " does not exist"); - InputSource inputSource = SaxUtils.createInputSource(resources[i]); + InputSource inputSource = SaxResourceUtils.createInputSource(resources[i]); schemaSources[i] = new SAXSource(xmlReader, inputSource); } SchemaFactory schemaFactory = SchemaFactory.newInstance(schemaLanguage); return schemaFactory.newSchema(schemaSources); } + public boolean supports(Class clazz) { if (JAXBElement.class.isAssignableFrom(clazz)) { return true; @@ -354,9 +348,9 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, BeanCl else if (clazz.getAnnotation(XmlRootElement.class) != null) { return true; } - if (StringUtils.hasLength(contextPath)) { + if (StringUtils.hasLength(this.contextPath)) { String packageName = ClassUtils.getPackageName(clazz); - String[] contextPaths = StringUtils.tokenizeToStringArray(contextPath, ":"); + String[] contextPaths = StringUtils.tokenizeToStringArray(this.contextPath, ":"); for (String contextPath : contextPaths) { if (contextPath.equals(packageName)) { return true; @@ -364,60 +358,14 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, BeanCl } return false; } - else if (!ObjectUtils.isEmpty(classesToBeBound)) { - return Arrays.asList(classesToBeBound).contains(clazz); + else if (!ObjectUtils.isEmpty(this.classesToBeBound)) { + return Arrays.asList(this.classesToBeBound).contains(clazz); } return false; } - /* - * Marshalling - */ - /** - * Returns a newly created JAXB marshaller. JAXB marshallers are not necessarily thread safe. - */ - private Marshaller createMarshaller() { - try { - Marshaller marshaller = jaxbContext.createMarshaller(); - initJaxbMarshaller(marshaller); - return marshaller; - } - catch (JAXBException ex) { - throw convertJaxbException(ex); - } - } - - /** - * Template method that can be overridden by concrete JAXB marshallers for custom initialization behavior. Gets called - * after creation of JAXB Marshaller, and after the respective properties have been set. - * - *

Default implementation sets the {@link #setMarshallerProperties(Map) defined properties}, the {@link - * #setValidationEventHandler(ValidationEventHandler) validation event handler}, the {@link #setSchemas(Resource[]) - * schemas}, {@link #setMarshallerListener(Marshaller.Listener) listener}, and {@link #setAdapters(XmlAdapter[]) - * adapters}. - */ - protected void initJaxbMarshaller(Marshaller marshaller) throws JAXBException { - if (marshallerProperties != null) { - for (String name : marshallerProperties.keySet()) { - marshaller.setProperty(name, marshallerProperties.get(name)); - } - } - if (validationEventHandler != null) { - marshaller.setEventHandler(validationEventHandler); - } - if (schema != null) { - marshaller.setSchema(schema); - } - if (marshallerListener != null) { - marshaller.setListener(marshallerListener); - } - if (adapters != null) { - for (XmlAdapter adapter : adapters) { - marshaller.setAdapter(adapter); - } - } - } + // Marshalling public void marshal(Object graph, Result result) throws XmlMappingException { marshal(graph, result, null); @@ -426,7 +374,7 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, BeanCl public void marshal(Object graph, Result result, MimeContainer mimeContainer) throws XmlMappingException { try { Marshaller marshaller = createMarshaller(); - if (mtomEnabled && mimeContainer != null) { + if (this.mtomEnabled && mimeContainer != null) { marshaller.setAttachmentMarshaller(new Jaxb2AttachmentMarshaller(mimeContainer)); } if (StaxUtils.isStaxResult(result)) { @@ -457,18 +405,14 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, BeanCl } } - /* - * Unmarshalling - */ - /** - * Returns a newly created JAXB unmarshaller. JAXB unmarshallers are not necessarily thread safe. + * Return a newly created JAXB marshaller. JAXB marshallers are not necessarily thread safe. */ - private Unmarshaller createUnmarshaller() { + protected Marshaller createMarshaller() { try { - Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); - initJaxbUnmarshaller(unmarshaller); - return unmarshaller; + Marshaller marshaller = this.jaxbContext.createMarshaller(); + initJaxbMarshaller(marshaller); + return marshaller; } catch (JAXBException ex) { throw convertJaxbException(ex); @@ -476,36 +420,38 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, BeanCl } /** - * Template method that can be overridden by concrete JAXB marshallers for custom initialization behavior. Gets called - * after creation of JAXB Marshaller, and after the respective properties have been set. - * - *

Default implementation sets the {@link #setUnmarshallerProperties(Map) defined properties}, the {@link + * Template method that can be overridden by concrete JAXB marshallers for custom initialization behavior. + * Gets called after creation of JAXB Marshaller, and after the respective properties have been set. + *

The default implementation sets the {@link #setMarshallerProperties(Map) defined properties}, the {@link * #setValidationEventHandler(ValidationEventHandler) validation event handler}, the {@link #setSchemas(Resource[]) - * schemas}, {@link #setUnmarshallerListener(Unmarshaller.Listener) listener}, and {@link #setAdapters(XmlAdapter[]) + * schemas}, {@link #setMarshallerListener(Marshaller.Listener) listener}, and {@link #setAdapters(XmlAdapter[]) * adapters}. */ - protected void initJaxbUnmarshaller(Unmarshaller unmarshaller) throws JAXBException { - if (unmarshallerProperties != null) { - for (String name : unmarshallerProperties.keySet()) { - unmarshaller.setProperty(name, unmarshallerProperties.get(name)); + protected void initJaxbMarshaller(Marshaller marshaller) throws JAXBException { + if (this.marshallerProperties != null) { + for (String name : this.marshallerProperties.keySet()) { + marshaller.setProperty(name, this.marshallerProperties.get(name)); } } - if (validationEventHandler != null) { - unmarshaller.setEventHandler(validationEventHandler); - } - if (schema != null) { - unmarshaller.setSchema(schema); + if (this.marshallerListener != null) { + marshaller.setListener(this.marshallerListener); } - if (unmarshallerListener != null) { - unmarshaller.setListener(unmarshallerListener); + if (this.validationEventHandler != null) { + marshaller.setEventHandler(this.validationEventHandler); } - if (adapters != null) { - for (XmlAdapter adapter : adapters) { - unmarshaller.setAdapter(adapter); + if (this.adapters != null) { + for (XmlAdapter adapter : this.adapters) { + marshaller.setAdapter(adapter); } } + if (this.schema != null) { + marshaller.setSchema(this.schema); + } } + + // Unmarshalling + public Object unmarshal(Source source) throws XmlMappingException { return unmarshal(source, null); } @@ -513,7 +459,7 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, BeanCl public Object unmarshal(Source source, MimeContainer mimeContainer) throws XmlMappingException { try { Unmarshaller unmarshaller = createUnmarshaller(); - if (mtomEnabled && mimeContainer != null) { + if (this.mtomEnabled && mimeContainer != null) { unmarshaller.setAttachmentUnmarshaller(new Jaxb2AttachmentUnmarshaller(mimeContainer)); } if (StaxUtils.isStaxSource(source)) { @@ -544,22 +490,73 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, BeanCl } } + /** + * Return a newly created JAXB unmarshaller. JAXB unmarshallers are not necessarily thread safe. + */ + protected Unmarshaller createUnmarshaller() { + try { + Unmarshaller unmarshaller = this.jaxbContext.createUnmarshaller(); + initJaxbUnmarshaller(unmarshaller); + return unmarshaller; + } + catch (JAXBException ex) { + throw convertJaxbException(ex); + } + } + + /** + * Template method that can be overridden by concrete JAXB marshallers for custom initialization behavior. + * Gets called after creation of JAXB Marshaller, and after the respective properties have been set. + *

The default implementation sets the {@link #setUnmarshallerProperties(Map) defined properties}, the {@link + * #setValidationEventHandler(ValidationEventHandler) validation event handler}, the {@link #setSchemas(Resource[]) + * schemas}, {@link #setUnmarshallerListener(Unmarshaller.Listener) listener}, and {@link #setAdapters(XmlAdapter[]) + * adapters}. + */ + protected void initJaxbUnmarshaller(Unmarshaller unmarshaller) throws JAXBException { + if (this.unmarshallerProperties != null) { + for (String name : this.unmarshallerProperties.keySet()) { + unmarshaller.setProperty(name, this.unmarshallerProperties.get(name)); + } + } + if (this.unmarshallerListener != null) { + unmarshaller.setListener(this.unmarshallerListener); + } + if (this.validationEventHandler != null) { + unmarshaller.setEventHandler(this.validationEventHandler); + } + if (this.adapters != null) { + for (XmlAdapter adapter : this.adapters) { + unmarshaller.setAdapter(adapter); + } + } + if (this.schema != null) { + unmarshaller.setSchema(this.schema); + } + } + + /** * Convert the given JAXBException to an appropriate exception from the - * org.springframework.oxm hierarchy.

The default implementation delegates to JaxbUtils. - * Can be overridden in subclasses. - * + * org.springframework.oxm hierarchy. * @param ex JAXBException that occured - * @return the corresponding XmlMappingException instance - * @see org.springframework.oxm.jaxb.JaxbUtils#convertJaxbException + * @return the corresponding XmlMappingException */ protected XmlMappingException convertJaxbException(JAXBException ex) { - return JaxbUtils.convertJaxbException(ex); + if (ex instanceof ValidationException) { + return new ValidationFailureException("JAXB validation exception", ex); + } + else if (ex instanceof MarshalException) { + return new MarshallingFailureException("JAXB marshalling exception", ex); + } + else if (ex instanceof UnmarshalException) { + return new UnmarshallingFailureException("JAXB unmarshalling exception", ex); + } + else { + // fallback + return new UncategorizedMappingException("Unknown JAXB exception", ex); + } } - /* - * Inner classes - */ private static class Jaxb2AttachmentMarshaller extends AttachmentMarshaller { @@ -570,12 +567,8 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, BeanCl } @Override - public String addMtomAttachment(byte[] data, - int offset, - int length, - String mimeType, - String elementNamespace, - String elementLocalName) { + public String addMtomAttachment(byte[] data, int offset, int length, String mimeType, + String elementNamespace, String elementLocalName) { ByteArrayDataSource dataSource = new ByteArrayDataSource(mimeType, data, offset, length); return addMtomAttachment(new DataHandler(dataSource), elementNamespace, elementLocalName); } @@ -584,7 +577,7 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, BeanCl public String addMtomAttachment(DataHandler dataHandler, String elementNamespace, String elementLocalName) { String host = getHost(elementNamespace, dataHandler); String contentId = UUID.randomUUID() + "@" + host; - mimeContainer.addAttachment("<" + contentId + ">", dataHandler); + this.mimeContainer.addAttachment("<" + contentId + ">", dataHandler); try { contentId = URLEncoder.encode(contentId, "UTF-8"); } @@ -614,10 +607,11 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, BeanCl @Override public boolean isXOPPackage() { - return mimeContainer.convertToXopPackage(); + return this.mimeContainer.convertToXopPackage(); } } + private static class Jaxb2AttachmentUnmarshaller extends AttachmentUnmarshaller { private final MimeContainer mimeContainer; @@ -633,7 +627,7 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, BeanCl return FileCopyUtils.copyToByteArray(dataHandler.getInputStream()); } catch (IOException ex) { - throw new JaxbUnmarshallingFailureException(ex); + throw new UnmarshallingFailureException("Couldn't read attachment", ex); } } @@ -649,15 +643,16 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, BeanCl } contentId = '<' + contentId + '>'; } - return mimeContainer.getAttachment(contentId); + return this.mimeContainer.getAttachment(contentId); } @Override public boolean isXOPPackage() { - return mimeContainer.isXopPackage(); + return this.mimeContainer.isXopPackage(); } } + /** * DataSource that wraps around a byte array. */ @@ -679,7 +674,7 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, BeanCl } public InputStream getInputStream() throws IOException { - return new ByteArrayInputStream(data, offset, length); + return new ByteArrayInputStream(this.data, this.offset, this.length); } public OutputStream getOutputStream() throws IOException { @@ -687,7 +682,7 @@ public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, BeanCl } public String getContentType() { - return contentType; + return this.contentType; } public String getName() { diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/JaxbMarshallingFailureException.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/JaxbMarshallingFailureException.java deleted file mode 100644 index 05ab8190fae..00000000000 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/JaxbMarshallingFailureException.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2005 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.oxm.jaxb; - -import javax.xml.bind.MarshalException; - -import org.springframework.oxm.MarshallingFailureException; - -/** - * JAXB-specific subclass of MarshallingFailureException. - * - * @author Arjen Poutsma - * @see JaxbUtils#convertJaxbException - * @since 3.0 - */ -public class JaxbMarshallingFailureException extends MarshallingFailureException { - - public JaxbMarshallingFailureException(MarshalException ex) { - super("JAXB marshalling exception: " + ex.getMessage(), ex); - } - -} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/JaxbSystemException.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/JaxbSystemException.java deleted file mode 100644 index c0bfccf6acc..00000000000 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/JaxbSystemException.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2005 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.oxm.jaxb; - -import javax.xml.bind.JAXBException; - -import org.springframework.oxm.UncategorizedXmlMappingException; - -/** - * JAXB-specific subclass of UncategorizedXmlMappingException, for JAXBExceptions that cannot - * be distinguished further. - * - * @author Arjen Poutsma - * @see JaxbUtils#convertJaxbException(javax.xml.bind.JAXBException) - * @since 3.0 - */ -public class JaxbSystemException extends UncategorizedXmlMappingException { - - public JaxbSystemException(JAXBException ex) { - super(ex.getMessage(), ex); - } -} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/JaxbUnmarshallingFailureException.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/JaxbUnmarshallingFailureException.java deleted file mode 100644 index fb8e2e9384d..00000000000 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/JaxbUnmarshallingFailureException.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2005 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.oxm.jaxb; - -import java.io.IOException; -import javax.xml.bind.UnmarshalException; - -import org.springframework.oxm.UnmarshallingFailureException; - -/** - * JAXB-specific subclass of UnmarshallingFailureException. - * - * @author Arjen Poutsma - * @since 3.0 - */ -public class JaxbUnmarshallingFailureException extends UnmarshallingFailureException { - - public JaxbUnmarshallingFailureException(UnmarshalException ex) { - super("JAXB unmarshalling exception: " + ex.getMessage(), ex); - } - - public JaxbUnmarshallingFailureException(IOException ex) { - super("JAXB unmarshalling exception: " + ex.getMessage(), ex); - } -} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/JaxbUtils.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/JaxbUtils.java deleted file mode 100644 index 902be90db01..00000000000 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/JaxbUtils.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2005 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.oxm.jaxb; - -import javax.xml.bind.JAXBException; -import javax.xml.bind.MarshalException; -import javax.xml.bind.UnmarshalException; -import javax.xml.bind.ValidationException; - -import org.springframework.oxm.XmlMappingException; - -/** - * Generic utility methods for working with JAXB. Mainly for internal use within the framework. - * - * @author Arjen Poutsma - * @since 3.0 - */ -public abstract class JaxbUtils { - - /** - * Converts the given JAXBException to an appropriate exception from the - * org.springframework.oxm hierarchy. - * - * @param ex JAXBException that occured - * @return the corresponding XmlMappingException - */ - public static XmlMappingException convertJaxbException(JAXBException ex) { - if (ex instanceof MarshalException) { - return new JaxbMarshallingFailureException((MarshalException) ex); - } - else if (ex instanceof UnmarshalException) { - return new JaxbUnmarshallingFailureException((UnmarshalException) ex); - } - else if (ex instanceof ValidationException) { - return new JaxbValidationFailureException((ValidationException) ex); - } - // fallback - return new JaxbSystemException(ex); - } - -} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/JaxbValidationFailureException.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/JaxbValidationFailureException.java deleted file mode 100644 index 85cb639fa9f..00000000000 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/JaxbValidationFailureException.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2005 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.oxm.jaxb; - -import javax.xml.bind.ValidationException; - -import org.springframework.oxm.ValidationFailureException; - -/** - * JAXB-specific subclass of ValidationFailureException. - * - * @author Arjen Poutsma - * @see JaxbUtils#convertJaxbException - * @since 3.0 - */ -public class JaxbValidationFailureException extends ValidationFailureException { - - public JaxbValidationFailureException(ValidationException ex) { - super("JAXB validation exception: " + ex.getMessage(), ex); - } - -} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/jibx/JibxMarshaller.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/jibx/JibxMarshaller.java index 1cfcffb0ae4..026c9e55aaf 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/jibx/JibxMarshaller.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/jibx/JibxMarshaller.java @@ -1,5 +1,5 @@ /* - * Copyright 2006 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -45,6 +45,7 @@ import org.jibx.runtime.IUnmarshallingContext; import org.jibx.runtime.IXMLReader; import org.jibx.runtime.IXMLWriter; import org.jibx.runtime.JiBXException; +import org.jibx.runtime.ValidationException; import org.jibx.runtime.impl.MarshallingContext; import org.jibx.runtime.impl.StAXReaderWrapper; import org.jibx.runtime.impl.StAXWriter; @@ -56,21 +57,25 @@ import org.xml.sax.XMLReader; import org.xml.sax.ext.LexicalHandler; import org.springframework.beans.factory.InitializingBean; -import org.springframework.oxm.AbstractMarshaller; +import org.springframework.oxm.MarshallingFailureException; +import org.springframework.oxm.UnmarshallingFailureException; +import org.springframework.oxm.ValidationFailureException; import org.springframework.oxm.XmlMappingException; +import org.springframework.oxm.support.AbstractMarshaller; import org.springframework.util.Assert; import org.springframework.util.StringUtils; import org.springframework.util.xml.StaxUtils; /** - * Implementation of the Marshaller and Unmarshaller interfaces for JiBX.

The typical - * usage will be to set the targetClass and optionally the bindingName property on this bean, - * and to refer to it. + * Implementation of the Marshaller and Unmarshaller interfaces for JiBX. + * + *

The typical usage will be to set the targetClass and optionally the + * bindingName property on this bean. * * @author Arjen Poutsma + * @since 3.0 * @see org.jibx.runtime.IMarshallingContext * @see org.jibx.runtime.IUnmarshallingContext - * @since 3.0 */ public class JibxMarshaller extends AbstractMarshaller implements InitializingBean { @@ -78,77 +83,73 @@ public class JibxMarshaller extends AbstractMarshaller implements InitializingBe private String bindingName; - private IBindingFactory bindingFactory; - - private static TransformerFactory transformerFactory = TransformerFactory.newInstance(); - private int indent = -1; private String encoding; private Boolean standalone; + private IBindingFactory bindingFactory; + + private TransformerFactory transformerFactory = TransformerFactory.newInstance(); + + /** - * Sets the optional binding name for this instance. + * Set the target class for this instance. This property is required. */ - public void setBindingName(String bindingName) { - this.bindingName = bindingName; + public void setTargetClass(Class targetClass) { + this.targetClass = targetClass; } /** - * Sets the target class for this instance. This property is required. + * Set the optional binding name for this instance. */ - public void setTargetClass(Class targetClass) { - this.targetClass = targetClass; + public void setBindingName(String bindingName) { + this.bindingName = bindingName; } /** - * Sets the number of nesting indent spaces. Default is -1, i.e. no indentation. + * Set the number of nesting indent spaces. Default is -1, i.e. no indentation. */ public void setIndent(int indent) { this.indent = indent; } /** - * Sets the document encoding using for marshalling. Default is UTF-8. + * Set the document encoding using for marshalling. Default is UTF-8. */ public void setEncoding(String encoding) { this.encoding = encoding; } /** - * Sets the document standalone flag for marshalling. By default, this flag is not present. + * Set the document standalone flag for marshalling. By default, this flag is not present. */ public void setStandalone(Boolean standalone) { this.standalone = standalone; } - public void afterPropertiesSet() throws Exception { - Assert.notNull(targetClass, "targetClass is required"); - if (logger.isInfoEnabled()) { - if (StringUtils.hasLength(bindingName)) { - logger.info("Configured for target class [" + targetClass + "] using binding [" + bindingName + "]"); - } - else { - logger.info("Configured for target class [" + targetClass + "]"); + + public void afterPropertiesSet() throws JiBXException { + Assert.notNull(this.targetClass, "targetClass is required"); + if (StringUtils.hasLength(this.bindingName)) { + if (logger.isInfoEnabled()) { + logger.info("Configured for target class [" + this.targetClass + "] using binding [" + this.bindingName + "]"); } + this.bindingFactory = BindingDirectory.getFactory(this.bindingName, this.targetClass); } - try { - if (StringUtils.hasLength(bindingName)) { - bindingFactory = BindingDirectory.getFactory(bindingName, targetClass); - } - else { - bindingFactory = BindingDirectory.getFactory(targetClass); + else { + if (logger.isInfoEnabled()) { + logger.info("Configured for target class [" + this.targetClass + "]"); } - } - catch (JiBXException ex) { - throw new JibxSystemException(ex); + this.bindingFactory = BindingDirectory.getFactory(this.targetClass); } } + public boolean supports(Class clazz) { Assert.notNull(clazz, "'clazz' must not be null"); - String[] mappedClasses = bindingFactory.getMappedClasses(); + String[] mappedClasses = this.bindingFactory.getMappedClasses(); String className = clazz.getName(); for (String mappedClass : mappedClasses) { if (className.equals(mappedClass)) { @@ -158,32 +159,15 @@ public class JibxMarshaller extends AbstractMarshaller implements InitializingBe return false; } - /** - * Convert the given JiBXException to an appropriate exception from the - * org.springframework.oxm hierarchy.

The default implementation delegates to JibxUtils. - * Can be overridden in subclasses.

A boolean flag is used to indicate whether this exception occurs during - * marshalling or unmarshalling, since JiBX itself does not make this distinction in its exception hierarchy. - * - * @param ex JiBXException that occured - * @param marshalling indicates whether the exception occurs during marshalling (true), or unmarshalling - * (false) - * @return the corresponding XmlMappingException instance - * @see JibxUtils#convertJibxException(org.jibx.runtime.JiBXException,boolean) - */ - public XmlMappingException convertJibxException(JiBXException ex, boolean marshalling) { - return JibxUtils.convertJibxException(ex, marshalling); - } - // // Supported Marshalling - // @Override protected void marshalOutputStream(Object graph, OutputStream outputStream) throws XmlMappingException, IOException { try { IMarshallingContext marshallingContext = createMarshallingContext(); - marshallingContext.marshalDocument(graph, encoding, standalone, outputStream); + marshallingContext.marshalDocument(graph, this.encoding, this.standalone, outputStream); } catch (JiBXException ex) { throw convertJibxException(ex, true); @@ -194,7 +178,7 @@ public class JibxMarshaller extends AbstractMarshaller implements InitializingBe protected void marshalWriter(Object graph, Writer writer) throws XmlMappingException, IOException { try { IMarshallingContext marshallingContext = createMarshallingContext(); - marshallingContext.marshalDocument(graph, encoding, standalone, writer); + marshallingContext.marshalDocument(graph, this.encoding, this.standalone, writer); } catch (JiBXException ex) { throw convertJibxException(ex, true); @@ -214,9 +198,8 @@ public class JibxMarshaller extends AbstractMarshaller implements InitializingBe } } - // + // Unsupported Marshalling - // @Override protected void marshalDomNode(Object graph, Node node) throws XmlMappingException { @@ -225,14 +208,11 @@ public class JibxMarshaller extends AbstractMarshaller implements InitializingBe ByteArrayOutputStream os = new ByteArrayOutputStream(); marshalOutputStream(graph, os); ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray()); - Transformer transformer = transformerFactory.newTransformer(); + Transformer transformer = this.transformerFactory.newTransformer(); transformer.transform(new StreamSource(is), new DOMResult(node)); } - catch (IOException ex) { - throw new JibxSystemException(ex); - } - catch (TransformerException ex) { - throw new JibxSystemException(ex); + catch (Exception ex) { + throw new MarshallingFailureException("JiBX marshalling exception", ex); } } @@ -244,16 +224,13 @@ public class JibxMarshaller extends AbstractMarshaller implements InitializingBe ByteArrayOutputStream os = new ByteArrayOutputStream(); marshalOutputStream(graph, os); ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray()); - Transformer transformer = transformerFactory.newTransformer(); + Transformer transformer = this.transformerFactory.newTransformer(); SAXResult saxResult = new SAXResult(contentHandler); saxResult.setLexicalHandler(lexicalHandler); transformer.transform(new StreamSource(is), saxResult); } - catch (IOException ex) { - throw new JibxSystemException(ex); - } - catch (TransformerException ex) { - throw new JibxSystemException(ex); + catch (Exception ex) { + throw new MarshallingFailureException("JiBX marshalling exception", ex); } } @@ -263,9 +240,8 @@ public class JibxMarshaller extends AbstractMarshaller implements InitializingBe marshalSaxHandlers(graph, contentHandler, null); } - // + // Unmarshalling - // @Override protected Object unmarshalInputStream(InputStream inputStream) throws XmlMappingException, IOException { @@ -309,13 +285,12 @@ public class JibxMarshaller extends AbstractMarshaller implements InitializingBe return unmarshalXmlStreamReader(streamReader); } catch (XMLStreamException ex) { - throw new JibxSystemException(ex); + return new UnmarshallingFailureException("JiBX unmarshalling exception", ex); } } - // + // Unsupported Unmarshalling - // @Override protected Object unmarshalDomNode(Node node) throws XmlMappingException { @@ -326,11 +301,8 @@ public class JibxMarshaller extends AbstractMarshaller implements InitializingBe ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray()); return unmarshalInputStream(is); } - catch (IOException ex) { - throw new JibxSystemException(ex); - } - catch (TransformerException ex) { - throw new JibxSystemException(ex); + catch (Exception ex) { + throw new UnmarshallingFailureException("JiBX unmarshalling exception", ex); } } @@ -338,41 +310,60 @@ public class JibxMarshaller extends AbstractMarshaller implements InitializingBe protected Object unmarshalSaxReader(XMLReader xmlReader, InputSource inputSource) throws XmlMappingException, IOException { try { - Transformer transformer = transformerFactory.newTransformer(); + Transformer transformer = this.transformerFactory.newTransformer(); ByteArrayOutputStream os = new ByteArrayOutputStream(); transformer.transform(new SAXSource(xmlReader, inputSource), new StreamResult(os)); ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray()); return unmarshalInputStream(is); } - catch (IOException ex) { - throw new JibxSystemException(ex); - } catch (TransformerException ex) { - throw new JibxSystemException(ex); + throw new UnmarshallingFailureException("JiBX unmarshalling exception", ex); } } + /** - * Creates a new IMarshallingContext, set with the correct indentation. - * + * Create a new IMarshallingContext, configured with the correct indentation. * @return the created marshalling context * @throws JiBXException in case of errors */ protected IMarshallingContext createMarshallingContext() throws JiBXException { - IMarshallingContext marshallingContext = bindingFactory.createMarshallingContext(); - marshallingContext.setIndent(indent); + IMarshallingContext marshallingContext = this.bindingFactory.createMarshallingContext(); + marshallingContext.setIndent(this.indent); return marshallingContext; } /** - * Creates a new IUnmarshallingContext, set with the correct indentation. - * + * Create a new IUnmarshallingContext. * @return the created unmarshalling context * @throws JiBXException in case of errors */ protected IUnmarshallingContext createUnmarshallingContext() throws JiBXException { - return bindingFactory.createUnmarshallingContext(); + return this.bindingFactory.createUnmarshallingContext(); } + /** + * Convert the given JiBXException 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 JiBX itself does not make this distinction in its exception hierarchy. + * @param ex JiBXException that occured + * @param marshalling indicates whether the exception occurs during marshalling (true), + * or unmarshalling (false) + * @return the corresponding XmlMappingException + */ + public XmlMappingException convertJibxException(JiBXException ex, boolean marshalling) { + if (ex instanceof ValidationException) { + return new ValidationFailureException("JiBX validation exception", ex); + } + else { + if (marshalling) { + return new MarshallingFailureException("JiBX marshalling exception", ex); + } + else { + return new UnmarshallingFailureException("JiBX unmarshalling exception", ex); + } + } + } } diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/jibx/JibxMarshallingFailureException.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/jibx/JibxMarshallingFailureException.java deleted file mode 100644 index dae314b960d..00000000000 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/jibx/JibxMarshallingFailureException.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.oxm.jibx; - -import org.jibx.runtime.JiBXException; - -import org.springframework.oxm.MarshallingFailureException; - -/** - * JiXB-specific subclass of MarshallingFailureException. - * - * @author Arjen Poutsma - * @see JibxUtils#convertJibxException(org.jibx.runtime.JiBXException,boolean) - * @since 3.0 - */ -public class JibxMarshallingFailureException extends MarshallingFailureException { - - public JibxMarshallingFailureException(JiBXException ex) { - super("JiBX marshalling exception: " + ex.getMessage(), ex); - } -} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/jibx/JibxSystemException.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/jibx/JibxSystemException.java deleted file mode 100644 index ede06119d9d..00000000000 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/jibx/JibxSystemException.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.oxm.jibx; - -import org.springframework.oxm.UncategorizedXmlMappingException; - -/** - * JiBX-specific subclass of UncategorizedXmlMappingException, for JiBXBExceptions that cannot - * be distinguished further. - * - * @author Arjen Poutsma - * @see JibxUtils#convertJibxException(org.jibx.runtime.JiBXException,boolean) - * @since 3.0 - */ -public class JibxSystemException extends UncategorizedXmlMappingException { - - public JibxSystemException(Exception ex) { - super(ex.getMessage(), ex); - } -} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/jibx/JibxUnmarshallingFailureException.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/jibx/JibxUnmarshallingFailureException.java deleted file mode 100644 index 421dc69c261..00000000000 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/jibx/JibxUnmarshallingFailureException.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.oxm.jibx; - -import org.jibx.runtime.JiBXException; - -import org.springframework.oxm.UnmarshallingFailureException; - -/** - * JiXB-specific subclass of UnmarshallingFailureException. - * - * @author Arjen Poutsma - * @see JibxUtils#convertJibxException(org.jibx.runtime.JiBXException,boolean) - * @since 3.0 - */ -public class JibxUnmarshallingFailureException extends UnmarshallingFailureException { - - public JibxUnmarshallingFailureException(JiBXException ex) { - super("JiBX unmarshalling exception: " + ex.getMessage(), ex); - } - -} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/jibx/JibxUtils.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/jibx/JibxUtils.java deleted file mode 100644 index 43bdc04037a..00000000000 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/jibx/JibxUtils.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.oxm.jibx; - -import org.jibx.runtime.JiBXException; -import org.jibx.runtime.ValidationException; - -import org.springframework.oxm.XmlMappingException; - -/** - * Generic utility methods for working with JiBX. Mainly for internal use within the framework. - * - * @author Arjen Poutsma - * @since 3.0 - */ -public abstract class JibxUtils { - - /** - * Converts the given JiBXException 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 JiBX itself does not make this distinction in its exception - * hierarchy. - * - * @param ex JiBXException that occured - * @param marshalling indicates whether the exception occurs during marshalling (true), or unmarshalling - * (false) - * @return the corresponding XmlMappingException - */ - public static XmlMappingException convertJibxException(JiBXException ex, boolean marshalling) { - if (ex instanceof ValidationException) { - return new JibxValidationFailureException((ValidationException) ex); - } - else { - if (marshalling) { - return new JibxMarshallingFailureException(ex); - } - else { - return new JibxUnmarshallingFailureException(ex); - } - } - } -} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/jibx/JibxValidationFailureException.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/jibx/JibxValidationFailureException.java deleted file mode 100644 index 69132a5d05f..00000000000 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/jibx/JibxValidationFailureException.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.oxm.jibx; - -import org.jibx.runtime.ValidationException; - -import org.springframework.oxm.ValidationFailureException; - -/** - * JAXB-specific subclass of ValidationFailureException. - * - * @author Arjen Poutsma - * @see JibxUtils#convertJibxException(org.jibx.runtime.JiBXException,boolean) - * @since 3.0 - */ -public class JibxValidationFailureException extends ValidationFailureException { - - public JibxValidationFailureException(ValidationException ex) { - super("JiBX validation exception: " + ex.getMessage(), ex); - } - -} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/mime/MimeContainer.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/mime/MimeContainer.java index 3887a093b04..5d2ce35bb55 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/mime/MimeContainer.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/mime/MimeContainer.java @@ -1,5 +1,5 @@ /* - * Copyright 2007 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,44 +19,43 @@ package org.springframework.oxm.mime; import javax.activation.DataHandler; /** - * Represents a container for MIME attachments. Concrete implementations might adapt a SOAPMesage, or an email message. + * Represents a container for MIME attachments + * Concrete implementations might adapt a SOAPMessage or an email message. * * @author Arjen Poutsma - * @see XML-binary Optimized Packaging * @since 3.0 + * @see XML-binary Optimized Packaging */ public interface MimeContainer { /** - * Indicates whether this container is a XOP package. - * - * @return true when the constraints specified in Identifying - * XOP Documents are met. + * Indicate whether this container is a XOP package. + * @return true when the constraints specified in + * Identifying XOP Documents + * are met * @see XOP Packages */ boolean isXopPackage(); /** - * Turns this message into a XOP package. - * - * @return true when the message is a XOP package + * Turn this message into a XOP package. + * @return true when the message actually is a XOP package * @see XOP Packages */ boolean convertToXopPackage(); /** - * Adds the given data handler as an attachment to this container. - * - * @param contentId the content id of the attachment + * Add the given data handler as an attachment to this container. + * @param contentId the content id of the attachment * @param dataHandler the data handler containing the data of the attachment */ void addAttachment(String contentId, DataHandler dataHandler); /** - * Returns the attachment with the given content id, or null if not found. - * + * Return the attachment with the given content id, or null if not found. * @param contentId the content id * @return the attachment, as a data handler */ DataHandler getAttachment(String contentId); + } diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/mime/MimeMarshaller.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/mime/MimeMarshaller.java index d692453fe96..d66c321d15d 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/mime/MimeMarshaller.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/mime/MimeMarshaller.java @@ -1,5 +1,5 @@ /* - * Copyright 2007 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,28 +23,25 @@ import org.springframework.oxm.Marshaller; import org.springframework.oxm.XmlMappingException; /** - * Subinterface of {@link Marshaller} that can use MIME attachments to optimize storage of binary data. Attachments can - * be added as MTOM, XOP, or SwA. + * Subinterface of {@link Marshaller} that can use MIME attachments to optimize + * storage of binary data. Attachments can be added as MTOM, XOP, or SwA. * * @author Arjen Poutsma - * @see SOAP Message Transmission Optimization - * Mechanism - * @see XML-binary Optimized Packaging * @since 3.0 + * @see SOAP Message Transmission Optimization Mechanism + * @see XML-binary Optimized Packaging */ public interface MimeMarshaller extends Marshaller { /** - * Marshals the object graph with the given root into the provided {@link Result}, writing binary data to a {@link - * MimeContainer}. - * - * @param graph the root of the object graph to marshal - * @param result the result to marshal to + * Marshals the object graph with the given root into the provided {@link Result}, + * writing binary data to a {@link MimeContainer}. + * @param graph the root of the object graph to marshal + * @param result the result to marshal to * @param mimeContainer the MIME container to write extracted binary content to * @throws XmlMappingException if the given object cannot be marshalled to the result - * @throws IOException if an I/O exception occurs + * @throws IOException if an I/O exception occurs */ void marshal(Object graph, Result result, MimeContainer mimeContainer) throws XmlMappingException, IOException; - } diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/mime/MimeUnmarshaller.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/mime/MimeUnmarshaller.java index 1e880d65f88..9526c18446d 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/mime/MimeUnmarshaller.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/mime/MimeUnmarshaller.java @@ -1,5 +1,5 @@ /* - * Copyright 2007 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,26 +23,25 @@ import org.springframework.oxm.Unmarshaller; import org.springframework.oxm.XmlMappingException; /** - * Subinterface of {@link org.springframework.oxm.Marshaller} that can use MIME attachments to optimize storage of - * binary data. Attachments can be added as MTOM, XOP, or SwA. + * Subinterface of {@link org.springframework.oxm.Marshaller} that can use MIME attachments + * to optimize storage of binary data. Attachments can be added as MTOM, XOP, or SwA. * * @author Arjen Poutsma - * @see SOAP Message Transmission Optimization - * Mechanism - * @see XML-binary Optimized Packaging * @since 3.0 + * @see SOAP Message Transmission Optimization Mechanism + * @see XML-binary Optimized Packaging */ public interface MimeUnmarshaller extends Unmarshaller { /** - * Unmarshals the given provided {@link Source} into an object graph, reading binary attachments from a {@link - * MimeContainer}. - * - * @param source the source to marshal from + * Unmarshals the given provided {@link Source} into an object graph, + * reading binary attachments from a {@link MimeContainer}. + * @param source the source to marshal from * @param mimeContainer the MIME container to read extracted binary content from * @return the object graph * @throws XmlMappingException if the given source cannot be mapped to an object - * @throws IOException if an I/O Exception occurs + * @throws IOException if an I/O Exception occurs */ Object unmarshal(Source source, MimeContainer mimeContainer) throws XmlMappingException, IOException; + } diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/AbstractMarshaller.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/support/AbstractMarshaller.java similarity index 67% rename from org.springframework.oxm/src/main/java/org/springframework/oxm/AbstractMarshaller.java rename to org.springframework.oxm/src/main/java/org/springframework/oxm/support/AbstractMarshaller.java index b7b11a2745d..c6aa545eed5 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/AbstractMarshaller.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/support/AbstractMarshaller.java @@ -1,5 +1,5 @@ /* - * Copyright 2006 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.oxm; +package org.springframework.oxm.support; import java.io.IOException; import java.io.InputStream; @@ -48,15 +48,20 @@ import org.xml.sax.XMLReader; import org.xml.sax.ext.LexicalHandler; import org.xml.sax.helpers.XMLReaderFactory; +import org.springframework.oxm.Marshaller; +import org.springframework.oxm.Unmarshaller; +import org.springframework.oxm.UnmarshallingFailureException; +import org.springframework.oxm.XmlMappingException; import org.springframework.util.Assert; import org.springframework.util.xml.StaxUtils; /** - * Abstract implementation of the Marshaller and Unmarshaller interface. This implementation - * inspects the given Source or Result, and defers further handling to overridable template - * methods. + * Abstract implementation of the Marshaller and Unmarshaller interface. + * This implementation inspects the given Source or Result, and defers + * further handling to overridable template methods. * * @author Arjen Poutsma + * @author Juergen Hoeller * @since 3.0 */ public abstract class AbstractMarshaller implements Marshaller, Unmarshaller { @@ -66,22 +71,24 @@ public abstract class AbstractMarshaller implements Marshaller, Unmarshaller { private DocumentBuilderFactory documentBuilderFactory; + private final Object documentBuilderFactoryMonitor = new Object(); + + /** - * Marshals the object graph with the given root into the provided javax.xml.transform.Result.

This - * implementation inspects the given result, and calls marshalDomResult, marshalSaxResult, or - * marshalStreamResult. - * - * @param graph the root of the object graph to marshal + * Marshals the object graph with the given root into the provided javax.xml.transform.Result. + *

This implementation inspects the given result, and calls marshalDomResult, + * marshalSaxResult, or marshalStreamResult. + * @param graph the root of the object graph to marshal * @param result the result to marshal to - * @throws XmlMappingException if the given object cannot be marshalled to the result - * @throws IOException if an I/O exception occurs - * @throws IllegalArgumentException if result if neither a DOMResult, SAXResult, - * StreamResult - * @see #marshalDomResult(Object,javax.xml.transform.dom.DOMResult) - * @see #marshalSaxResult(Object,javax.xml.transform.sax.SAXResult) - * @see #marshalStreamResult(Object,javax.xml.transform.stream.StreamResult) + * @throws IOException if an I/O exception occurs + * @throws XmlMappingException if the given object cannot be marshalled to the result + * @throws IllegalArgumentException if result if neither a DOMResult, + * a SAXResult, nor a StreamResult + * @see #marshalDomResult(Object, javax.xml.transform.dom.DOMResult) + * @see #marshalSaxResult(Object, javax.xml.transform.sax.SAXResult) + * @see #marshalStreamResult(Object, javax.xml.transform.stream.StreamResult) */ - public final void marshal(Object graph, Result result) throws XmlMappingException, IOException { + public final void marshal(Object graph, Result result) throws IOException, XmlMappingException { if (result instanceof DOMResult) { marshalDomResult(graph, (DOMResult) result); } @@ -100,21 +107,20 @@ public abstract class AbstractMarshaller implements Marshaller, Unmarshaller { } /** - * Unmarshals the given provided javax.xml.transform.Source into an object graph.

This implementation - * inspects the given result, and calls unmarshalDomSource, unmarshalSaxSource, or - * unmarshalStreamSource. - * + * Unmarshals the given provided javax.xml.transform.Source into an object graph. + *

This implementation inspects the given result, and calls unmarshalDomSource, + * unmarshalSaxSource, or unmarshalStreamSource. * @param source the source to marshal from * @return the object graph - * @throws XmlMappingException if the given source cannot be mapped to an object - * @throws IOException if an I/O Exception occurs - * @throws IllegalArgumentException if source is neither a DOMSource, a - * SAXSource, nor a StreamSource + * @throws IOException if an I/O Exception occurs + * @throws XmlMappingException if the given source cannot be mapped to an object + * @throws IllegalArgumentException if source is neither a DOMSource, + * a SAXSource, nor a StreamSource * @see #unmarshalDomSource(javax.xml.transform.dom.DOMSource) * @see #unmarshalSaxSource(javax.xml.transform.sax.SAXSource) * @see #unmarshalStreamSource(javax.xml.transform.stream.StreamSource) */ - public final Object unmarshal(Source source) throws XmlMappingException, IOException { + public final Object unmarshal(Source source) throws IOException, XmlMappingException { if (source instanceof DOMSource) { return unmarshalDomSource((DOMSource) source); } @@ -133,24 +139,24 @@ public abstract class AbstractMarshaller implements Marshaller, Unmarshaller { } /** - * Create a DocumentBuilder that this marshaller will use for creating DOM documents when passed an empty - * DOMSource. Can be overridden in subclasses, adding further initialization of the builder. - * + * Create a DocumentBuilder that this marshaller will use for creating + * DOM documents when passed an empty DOMSource. + *

Can be overridden in subclasses, adding further initialization of the builder. * @param factory the DocumentBuilderFactory that the DocumentBuilder should be created with * @return the DocumentBuilder - * @throws javax.xml.parsers.ParserConfigurationException - * if thrown by JAXP methods + * @throws ParserConfigurationException if thrown by JAXP methods */ protected DocumentBuilder createDocumentBuilder(DocumentBuilderFactory factory) throws ParserConfigurationException { + return factory.newDocumentBuilder(); } /** - * Create a DocumentBuilder that this marshaller will use for creating DOM documents when passed an empty - * DOMSource. The resulting DocumentBuilderFactory is cached, so this method will only be - * called once. - * + * Create a DocumentBuilder that this marshaller will use for creating + * DOM documents when passed an empty DOMSource. + *

The resulting DocumentBuilderFactory is cached, so this method + * will only be called once. * @return the DocumentBuilderFactory * @throws ParserConfigurationException if thrown by JAXP methods */ @@ -163,7 +169,6 @@ public abstract class AbstractMarshaller implements Marshaller, Unmarshaller { /** * Create a XMLReader that this marshaller will when passed an empty SAXSource. - * * @return the XMLReader * @throws SAXException if thrown by JAXP methods */ @@ -171,18 +176,17 @@ public abstract class AbstractMarshaller implements Marshaller, Unmarshaller { return XMLReaderFactory.createXMLReader(); } - // + // Marshalling - // /** - * Template method for handling DOMResults. This implementation defers to marshalDomNode. - * - * @param graph the root of the object graph to marshal + * Template method for handling DOMResults. + *

This implementation delegates to marshalDomNode. + * @param graph the root of the object graph to marshal * @param domResult the DOMResult - * @throws XmlMappingException if the given object cannot be marshalled to the result + * @throws XmlMappingException if the given object cannot be marshalled to the result * @throws IllegalArgumentException if the domResult is empty - * @see #marshalDomNode(Object,org.w3c.dom.Node) + * @see #marshalDomNode(Object, org.w3c.dom.Node) */ protected void marshalDomResult(Object graph, DOMResult domResult) throws XmlMappingException { Assert.notNull(domResult.getNode(), "DOMResult does not contain Node"); @@ -190,13 +194,13 @@ public abstract class AbstractMarshaller implements Marshaller, Unmarshaller { } /** - * Template method for handling StaxResults. This implementation defers to - * marshalXMLSteamWriter, or marshalXMLEventConsumer, depending on what is contained in the + * Template method for handling StaxResults. + *

This implementation delegates to marshalXMLSteamWriter or + * marshalXMLEventConsumer, depending on what is contained in the * StaxResult. - * - * @param graph the root of the object graph to marshal + * @param graph the root of the object graph to marshal * @param staxResult a Spring {@link org.springframework.util.xml.StaxSource} or JAXP 1.4 {@link StAXSource} - * @throws XmlMappingException if the given object cannot be marshalled to the result + * @throws XmlMappingException if the given object cannot be marshalled to the result * @throws IllegalArgumentException if the domResult is empty * @see #marshalDomNode(Object,org.w3c.dom.Node) */ @@ -217,13 +221,12 @@ public abstract class AbstractMarshaller implements Marshaller, Unmarshaller { } /** - * Template method for handling SAXResults. This implementation defers to - * marshalSaxHandlers. - * - * @param graph the root of the object graph to marshal + * Template method for handling SAXResults. + *

This implementation delegates to marshalSaxHandlers. + * @param graph the root of the object graph to marshal * @param saxResult the SAXResult * @throws XmlMappingException if the given object cannot be marshalled to the result - * @see #marshalSaxHandlers(Object,org.xml.sax.ContentHandler,org.xml.sax.ext.LexicalHandler) + * @see #marshalSaxHandlers(Object, org.xml.sax.ContentHandler, org.xml.sax.ext.LexicalHandler) */ protected void marshalSaxResult(Object graph, SAXResult saxResult) throws XmlMappingException { ContentHandler contentHandler = saxResult.getHandler(); @@ -233,19 +236,19 @@ public abstract class AbstractMarshaller implements Marshaller, Unmarshaller { } /** - * Template method for handling StreamResults. This implementation defers to - * marshalOutputStream, or marshalWriter, depending on what is contained in the - * StreamResult - * - * @param graph the root of the object graph to marshal + * Template method for handling StreamResults. + *

This implementation delegates to marshalOutputStream or marshalWriter, + * depending on what is contained in the StreamResult + * @param graph the root of the object graph to marshal * @param streamResult the StreamResult - * @throws IOException if an I/O Exception occurs - * @throws XmlMappingException if the given object cannot be marshalled to the result - * @throws IllegalArgumentException if streamResult contains neither OutputStream nor - * Writer. + * @throws IOException if an I/O Exception occurs + * @throws XmlMappingException if the given object cannot be marshalled to the result + * @throws IllegalArgumentException if streamResult does neither + * contain an OutputStream nor a Writer */ protected void marshalStreamResult(Object graph, StreamResult streamResult) throws XmlMappingException, IOException { + if (streamResult.getOutputStream() != null) { marshalOutputStream(graph, streamResult.getOutputStream()); } @@ -257,27 +260,29 @@ public abstract class AbstractMarshaller implements Marshaller, Unmarshaller { } } - // + // Unmarshalling - // /** - * Template method for handling DOMSources. This implementation defers to unmarshalDomNode. - * If the given source is empty, an empty source Document will be created as a placeholder. - * + * Template method for handling DOMSources. + *

This implementation delegates to unmarshalDomNode. + * If the given source is empty, an empty source Document + * will be created as a placeholder. * @param domSource the DOMSource * @return the object graph + * @throws XmlMappingException if the given source cannot be mapped to an object * @throws IllegalArgumentException if the domSource is empty - * @throws XmlMappingException if the given source cannot be mapped to an object * @see #unmarshalDomNode(org.w3c.dom.Node) */ protected Object unmarshalDomSource(DOMSource domSource) throws XmlMappingException { if (domSource.getNode() == null) { try { - if (documentBuilderFactory == null) { - documentBuilderFactory = createDocumentBuilderFactory(); + synchronized (this.documentBuilderFactoryMonitor) { + if (this.documentBuilderFactory == null) { + this.documentBuilderFactory = createDocumentBuilderFactory(); + } } - DocumentBuilder documentBuilder = createDocumentBuilder(documentBuilderFactory); + DocumentBuilder documentBuilder = createDocumentBuilder(this.documentBuilderFactory); domSource.setNode(documentBuilder.newDocument()); } catch (ParserConfigurationException ex) { @@ -289,9 +294,9 @@ public abstract class AbstractMarshaller implements Marshaller, Unmarshaller { } /** - * Template method for handling StaxSources. This implementation defers to - * unmarshalXmlStreamReader, or unmarshalXmlEventReader. - * + * Template method for handling StaxSources. + *

This implementation delegates to unmarshalXmlStreamReader or + * unmarshalXmlEventReader. * @param staxSource the StaxSource * @return the object graph * @throws XmlMappingException if the given source cannot be mapped to an object @@ -313,14 +318,13 @@ public abstract class AbstractMarshaller implements Marshaller, Unmarshaller { } /** - * Template method for handling SAXSources. This implementation defers to - * unmarshalSaxReader. - * + * Template method for handling SAXSources. + *

This implementation delegates to unmarshalSaxReader. * @param saxSource the SAXSource * @return the object graph * @throws XmlMappingException if the given source cannot be mapped to an object - * @throws IOException if an I/O Exception occurs - * @see #unmarshalSaxReader(org.xml.sax.XMLReader,org.xml.sax.InputSource) + * @throws IOException if an I/O Exception occurs + * @see #unmarshalSaxReader(org.xml.sax.XMLReader, org.xml.sax.InputSource) */ protected Object unmarshalSaxSource(SAXSource saxSource) throws XmlMappingException, IOException { if (saxSource.getXMLReader() == null) { @@ -328,8 +332,7 @@ public abstract class AbstractMarshaller implements Marshaller, Unmarshaller { saxSource.setXMLReader(createXmlReader()); } catch (SAXException ex) { - throw new UnmarshallingFailureException("Could not create XMLReader for SAXSource: " + ex.getMessage(), - ex); + throw new UnmarshallingFailureException("Could not create XMLReader for SAXSource", ex); } } if (saxSource.getInputSource() == null) { @@ -339,12 +342,11 @@ public abstract class AbstractMarshaller implements Marshaller, Unmarshaller { } /** - * Template method for handling StreamSources. This implementation defers to - * unmarshalInputStream, or unmarshalReader. - * + * Template method for handling StreamSources. + *

This implementation defers to unmarshalInputStream or unmarshalReader. * @param streamSource the StreamSource * @return the object graph - * @throws IOException if an I/O exception occurs + * @throws IOException if an I/O exception occurs * @throws XmlMappingException if the given source cannot be mapped to an object */ protected Object unmarshalStreamSource(StreamSource streamSource) throws XmlMappingException, IOException { @@ -359,37 +361,35 @@ public abstract class AbstractMarshaller implements Marshaller, Unmarshaller { } } - // + // Abstract template methods - // /** - * 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. - * + * 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. * @param graph the root of the object graph to marshal - * @param node The DOM node that will contain the result tree + * @param node the DOM node that will contain the result tree * @throws XmlMappingException if the given object cannot be marshalled to the DOM node * @see org.w3c.dom.Document * @see org.w3c.dom.DocumentFragment * @see org.w3c.dom.Element */ - protected abstract void marshalDomNode(Object graph, Node node) throws XmlMappingException; + protected abstract void marshalDomNode(Object graph, Node node) + throws XmlMappingException; /** * Abstract template method for marshalling the given object to a StAX XMLEventWriter. - * - * @param graph the root of the object graph to marshal + * @param graph the root of the object graph to marshal * @param eventWriter the XMLEventWriter to write to * @throws XmlMappingException if the given object cannot be marshalled to the DOM node */ - protected abstract void marshalXmlEventWriter(Object graph, XMLEventWriter eventWriter) throws XmlMappingException; + protected abstract void marshalXmlEventWriter(Object graph, XMLEventWriter eventWriter) + throws XmlMappingException; /** * Abstract template method for marshalling the given object to a StAX XMLStreamWriter. - * - * @param graph the root of the object graph to marshal + * @param graph the root of the object graph to marshal * @param streamWriter the XMLStreamWriter to write to * @throws XmlMappingException if the given object cannot be marshalled to the DOM node */ @@ -398,41 +398,38 @@ public abstract class AbstractMarshaller implements Marshaller, Unmarshaller { /** * Abstract template method for marshalling the given object graph to a OutputStream. - * - * @param graph the root of the object graph to marshal + * @param graph the root of the object graph to marshal * @param outputStream the OutputStream to write to * @throws XmlMappingException if the given object cannot be marshalled to the writer - * @throws IOException if an I/O exception occurs + * @throws IOException if an I/O exception occurs */ protected abstract void marshalOutputStream(Object graph, OutputStream outputStream) throws XmlMappingException, IOException; /** * Abstract template method for marshalling the given object graph to a SAX ContentHandler. - * - * @param graph the root of the object graph to marshal + * @param graph the root of the object graph to marshal * @param contentHandler the SAX ContentHandler * @param lexicalHandler the SAX2 LexicalHandler. Can be null. * @throws XmlMappingException if the given object cannot be marshalled to the handlers */ - protected abstract void marshalSaxHandlers(Object graph, - ContentHandler contentHandler, - LexicalHandler lexicalHandler) throws XmlMappingException; + protected abstract void marshalSaxHandlers( + Object graph, ContentHandler contentHandler, LexicalHandler lexicalHandler) + throws XmlMappingException; /** * Abstract template method for marshalling the given object graph to a Writer. - * - * @param graph the root of the object graph to marshal + * @param graph the root of the object graph to marshal * @param writer the Writer to write to * @throws XmlMappingException if the given object cannot be marshalled to the writer - * @throws IOException if an I/O exception occurs + * @throws IOException if an I/O exception occurs */ - protected abstract void marshalWriter(Object graph, Writer writer) throws XmlMappingException, IOException; + protected abstract void marshalWriter(Object graph, Writer writer) + throws XmlMappingException, IOException; /** * Abstract template method for unmarshalling from a given DOM Node. - * - * @param node The DOM node that contains the objects to be unmarshalled + * @param node the DOM node that contains the objects to be unmarshalled * @return the object graph * @throws XmlMappingException if the given DOM node cannot be mapped to an object */ @@ -440,51 +437,52 @@ public abstract class AbstractMarshaller implements Marshaller, Unmarshaller { /** * Abstract template method for unmarshalling from a given Stax XMLEventReader. - * - * @param eventReader The XMLEventReader to read from + * @param eventReader the XMLEventReader to read from * @return the object graph * @throws XmlMappingException if the given event reader cannot be converted to an object */ - protected abstract Object unmarshalXmlEventReader(XMLEventReader eventReader) throws XmlMappingException; + protected abstract Object unmarshalXmlEventReader(XMLEventReader eventReader) + throws XmlMappingException; /** * Abstract template method for unmarshalling from a given Stax XMLStreamReader. - * - * @param streamReader The XMLStreamReader to read from + * @param streamReader the XMLStreamReader to read from * @return the object graph * @throws XmlMappingException if the given stream reader cannot be converted to an object */ - protected abstract Object unmarshalXmlStreamReader(XMLStreamReader streamReader) throws XmlMappingException; + protected abstract Object unmarshalXmlStreamReader(XMLStreamReader streamReader) + throws XmlMappingException; /** * Abstract template method for unmarshalling from a given InputStream. - * * @param inputStream the InputStreamStream to read from * @return the object graph * @throws XmlMappingException if the given stream cannot be converted to an object - * @throws IOException if an I/O exception occurs + * @throws IOException if an I/O exception occurs */ - protected abstract Object unmarshalInputStream(InputStream inputStream) throws XmlMappingException, IOException; + protected abstract Object unmarshalInputStream(InputStream inputStream) + throws XmlMappingException, IOException; /** * Abstract template method for unmarshalling from a given Reader. - * * @param reader the Reader to read from * @return the object graph * @throws XmlMappingException if the given reader cannot be converted to an object - * @throws IOException if an I/O exception occurs + * @throws IOException if an I/O exception occurs */ - protected abstract Object unmarshalReader(Reader reader) throws XmlMappingException, IOException; + protected abstract Object unmarshalReader(Reader reader) + throws XmlMappingException, IOException; /** - * Abstract template method for unmarshalling using a given SAX XMLReader and InputSource. - * - * @param xmlReader the SAX XMLReader to parse with + * Abstract template method for unmarshalling using a given SAX XMLReader + * and InputSource. + * @param xmlReader the SAX XMLReader to parse with * @param inputSource the input source to parse from * @return the object graph * @throws XmlMappingException if the given reader and input source cannot be converted to an object - * @throws java.io.IOException if an I/O exception occurs + * @throws IOException if an I/O exception occurs */ protected abstract Object unmarshalSaxReader(XMLReader xmlReader, InputSource inputSource) throws XmlMappingException, IOException; + } diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/support/MarshallingSource.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/support/MarshallingSource.java index a563ac0edaa..9ebc45ba098 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/support/MarshallingSource.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/support/MarshallingSource.java @@ -28,7 +28,6 @@ import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXNotRecognizedException; -import org.xml.sax.SAXNotSupportedException; import org.xml.sax.SAXParseException; import org.xml.sax.XMLReader; import org.xml.sax.ext.LexicalHandler; @@ -37,8 +36,8 @@ import org.springframework.oxm.Marshaller; import org.springframework.util.Assert; /** - * {@link Source} implementation that uses a {@link Marshaller}.Can be constructed with a Marshaller and an - * object to be marshalled. + * {@link Source} implementation that uses a {@link Marshaller}.Can be constructed with a + * Marshaller and an object to be marshalled. * *

Even though MarshallingSource extends from SAXSource, calling the methods of * SAXSource is not supported. In general, the only supported operation on this class is @@ -47,8 +46,8 @@ import org.springframework.util.Assert; * UnsupportedOperationExceptions. * * @author Arjen Poutsma - * @see javax.xml.transform.Transformer * @since 3.0 + * @see javax.xml.transform.Transformer */ public class MarshallingSource extends SAXSource { @@ -56,11 +55,11 @@ public class MarshallingSource extends SAXSource { private final Object content; + /** - * Creates a new MarshallingSource with the given marshaller and content. - * + * Create a new MarshallingSource with the given marshaller and content. * @param marshaller the marshaller to use - * @param content the object to be marshalled + * @param content the object to be marshalled */ public MarshallingSource(Marshaller marshaller, Object content) { super(new MarshallingXMLReader(marshaller, content), new InputSource()); @@ -70,20 +69,23 @@ public class MarshallingSource extends SAXSource { this.content = content; } - /** Returns the Marshaller used by this MarshallingSource. */ + + /** + * Return the Marshaller used by this MarshallingSource. + */ public Marshaller getMarshaller() { - return marshaller; + return this.marshaller; } - /** Returns the object to be marshalled. */ + /** + * Return the object to be marshalled. + */ public Object getContent() { - return content; + return this.content; } /** * Throws a UnsupportedOperationException. - * - * @throws UnsupportedOperationException always */ @Override public void setInputSource(InputSource inputSource) { @@ -92,14 +94,13 @@ public class MarshallingSource extends SAXSource { /** * Throws a UnsupportedOperationException. - * - * @throws UnsupportedOperationException always */ @Override public void setXMLReader(XMLReader reader) { throw new UnsupportedOperationException("setXMLReader is not supported"); } + private static class MarshallingXMLReader implements XMLReader { private final Marshaller marshaller; @@ -123,51 +124,51 @@ public class MarshallingSource extends SAXSource { this.content = content; } - public ContentHandler getContentHandler() { - return contentHandler; - } - public void setContentHandler(ContentHandler contentHandler) { this.contentHandler = contentHandler; } + public ContentHandler getContentHandler() { + return this.contentHandler; + } + public void setDTDHandler(DTDHandler dtdHandler) { this.dtdHandler = dtdHandler; } public DTDHandler getDTDHandler() { - return dtdHandler; - } - - public EntityResolver getEntityResolver() { - return entityResolver; + return this.dtdHandler; } public void setEntityResolver(EntityResolver entityResolver) { this.entityResolver = entityResolver; } - public ErrorHandler getErrorHandler() { - return errorHandler; + public EntityResolver getEntityResolver() { + return this.entityResolver; } public void setErrorHandler(ErrorHandler errorHandler) { this.errorHandler = errorHandler; } + public ErrorHandler getErrorHandler() { + return this.errorHandler; + } + protected LexicalHandler getLexicalHandler() { - return lexicalHandler; + return this.lexicalHandler; } - public boolean getFeature(String name) throws SAXNotRecognizedException, SAXNotSupportedException { + public boolean getFeature(String name) throws SAXNotRecognizedException { throw new SAXNotRecognizedException(name); } - public void setFeature(String name, boolean value) throws SAXNotRecognizedException, SAXNotSupportedException { + public void setFeature(String name, boolean value) throws SAXNotRecognizedException { throw new SAXNotRecognizedException(name); } - public Object getProperty(String name) throws SAXNotRecognizedException, SAXNotSupportedException { + public Object getProperty(String name) throws SAXNotRecognizedException { if ("http://xml.org/sax/properties/lexical-handler".equals(name)) { return lexicalHandler; } @@ -176,20 +177,20 @@ public class MarshallingSource extends SAXSource { } } - public void setProperty(String name, Object value) throws SAXNotRecognizedException, SAXNotSupportedException { + public void setProperty(String name, Object value) throws SAXNotRecognizedException { if ("http://xml.org/sax/properties/lexical-handler".equals(name)) { - lexicalHandler = (LexicalHandler) value; + this.lexicalHandler = (LexicalHandler) value; } else { throw new SAXNotRecognizedException(name); } } - public void parse(InputSource input) throws IOException, SAXException { + public void parse(InputSource input) throws SAXException { parse(); } - public void parse(String systemId) throws IOException, SAXException { + public void parse(String systemId) throws SAXException { parse(); } @@ -197,18 +198,19 @@ public class MarshallingSource extends SAXSource { SAXResult result = new SAXResult(getContentHandler()); result.setLexicalHandler(getLexicalHandler()); try { - marshaller.marshal(content, result); + this.marshaller.marshal(this.content, result); } catch (IOException ex) { SAXParseException saxException = new SAXParseException(ex.getMessage(), null, null, -1, -1, ex); - if (getErrorHandler() != null) { - getErrorHandler().fatalError(saxException); + ErrorHandler errorHandler = getErrorHandler(); + if (errorHandler != null) { + errorHandler.fatalError(saxException); } else { throw saxException; } } } - } + } diff --git a/org.springframework.core/src/main/java/org/springframework/util/xml/SaxUtils.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/support/SaxResourceUtils.java similarity index 77% rename from org.springframework.core/src/main/java/org/springframework/util/xml/SaxUtils.java rename to org.springframework.oxm/src/main/java/org/springframework/oxm/support/SaxResourceUtils.java index 823da314fcd..6f653024d63 100644 --- a/org.springframework.core/src/main/java/org/springframework/util/xml/SaxUtils.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/support/SaxResourceUtils.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.util.xml; +package org.springframework.oxm.support; import java.io.IOException; @@ -26,14 +26,14 @@ import org.springframework.core.io.Resource; * Convenient utility methods for dealing with SAX. * * @author Arjen Poutsma + * @author Juergen Hoeller * @since 3.0 */ -public abstract class SaxUtils { +public abstract class SaxResourceUtils { /** - * Creates a SAX InputSource from the given resource. Sets the system identifier to the resource's - * URL, if available. - * + * Create a SAX InputSource from the given resource. + *

Sets the system identifier to the resource's URL, if available. * @param resource the resource * @return the input source created from the resource * @throws IOException if an I/O exception occurs @@ -46,12 +46,15 @@ public abstract class SaxUtils { return inputSource; } - /** Retrieves the URL from the given resource as System ID. Returns null if it cannot be openened. */ + /** + * Retrieve the URL from the given resource as System ID. + *

Returns null if it cannot be opened. + */ private static String getSystemId(Resource resource) { try { return resource.getURI().toString(); } - catch (IOException e) { + catch (IOException ex) { return null; } } diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlBeansMarshaller.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlBeansMarshaller.java index 05a7aecb264..d94d6ef5c68 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlBeansMarshaller.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlBeansMarshaller.java @@ -1,3 +1,19 @@ +/* + * Copyright 2002-2009 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.springframework.oxm.xmlbeans; import java.io.IOException; @@ -6,7 +22,6 @@ import java.io.OutputStream; import java.io.Reader; import java.io.Writer; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLEventWriter; @@ -19,6 +34,7 @@ import org.apache.xmlbeans.XmlObject; import org.apache.xmlbeans.XmlOptions; import org.apache.xmlbeans.XmlSaxHandler; import org.apache.xmlbeans.XmlValidationError; +import org.apache.xmlbeans.XMLStreamValidationException; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; @@ -30,24 +46,33 @@ import org.xml.sax.SAXNotSupportedException; import org.xml.sax.XMLReader; import org.xml.sax.ext.LexicalHandler; -import org.springframework.oxm.AbstractMarshaller; import org.springframework.oxm.Marshaller; +import org.springframework.oxm.ValidationFailureException; import org.springframework.oxm.XmlMappingException; +import org.springframework.oxm.MarshallingFailureException; +import org.springframework.oxm.UnmarshallingFailureException; +import org.springframework.oxm.UncategorizedMappingException; +import org.springframework.oxm.support.AbstractMarshaller; import org.springframework.util.xml.StaxUtils; /** - * Implementation of the {@link Marshaller} interface for XMLBeans. Further options can be set by setting the - * xmlOptions property. The {@link XmlOptionsFactoryBean} is provided to easily wire up {@link XmlOptions} - * instances.

Unmarshalled objects can be validated by setting the validating property, or by calling - * the {@link #validate(XmlObject)} method directly. Invalid objects will result in an {@link - * XmlBeansValidationFailureException}.

Note that due to the nature of XMLBeans, this marshaller - * requires all passed objects to be of type {@link XmlObject}. + * Implementation of the {@link Marshaller} interface for Apache XMLBeans. + * + *

Options can be set by setting the xmlOptions property. + * The {@link XmlOptionsFactoryBean} is provided to easily set up an {@link XmlOptions} instance. + * + *

Unmarshalled objects can be validated by setting the validating property, + * or by calling the {@link #validate(XmlObject)} method directly. Invalid objects will + * result in an {@link XmlBeansValidationFailureException}. + * + *

NOTE: Due to the nature of XMLBeans, this marshaller requires + * all passed objects to be of type {@link XmlObject}. * * @author Arjen Poutsma - * @see #setXmlOptions(org.apache.xmlbeans.XmlOptions) - * @see XmlOptionsFactoryBean - * @see #setValidating(boolean) * @since 3.0 + * @see #setValidating + * @see #setXmlOptions + * @see XmlOptionsFactoryBean */ public class XmlBeansMarshaller extends AbstractMarshaller { @@ -55,16 +80,9 @@ public class XmlBeansMarshaller extends AbstractMarshaller { private boolean validating = false; - /** - * Returns the XmlOptions. - */ - public XmlOptions getXmlOptions() { - return xmlOptions; - } /** - * Sets the XmlOptions. - * + * Set the XmlOptions. * @see XmlOptionsFactoryBean */ public void setXmlOptions(XmlOptions xmlOptions) { @@ -72,21 +90,30 @@ public class XmlBeansMarshaller extends AbstractMarshaller { } /** - * Returns whether this marshaller should validate in- and outgoing documents. + * Return the XmlOptions. */ - public boolean isValidating() { - return validating; + public XmlOptions getXmlOptions() { + return this.xmlOptions; } /** - * Sets whether this marshaller should validate in- and outgoing documents. Default is false. + * Set whether this marshaller should validate in- and outgoing documents. + * Default is false. */ public void setValidating(boolean validating) { this.validating = validating; } /** - * Returns true if the given class is an implementation of {@link XmlObject}. + * Return whether this marshaller should validate in- and outgoing documents. + */ + public boolean isValidating() { + return this.validating; + } + + + /** + * This implementation returns true if the given class is an implementation of {@link XmlObject}. */ public boolean supports(Class clazz) { return XmlObject.class.isAssignableFrom(clazz); @@ -107,6 +134,7 @@ public class XmlBeansMarshaller extends AbstractMarshaller { @Override protected final void marshalOutputStream(Object graph, OutputStream outputStream) throws XmlMappingException, IOException { + ((XmlObject) graph).save(outputStream, getXmlOptions()); } @@ -225,30 +253,13 @@ public class XmlBeansMarshaller extends AbstractMarshaller { } } - /** - * Converts the given XMLBeans exception to an appropriate exception from the org.springframework.oxm - * hierarchy.

The default implementation delegates to XmlBeansUtils. Can be overridden in subclasses. - *

A boolean flag is used to indicate whether this exception occurs during marshalling or unmarshalling, since - * XMLBeans itself does not make this distinction in its exception hierarchy. - * - * @param ex XMLBeans Exception that occured - * @param marshalling indicates whether the exception occurs during marshalling (true), or unmarshalling - * (false) - * @return the corresponding XmlMappingException - * @see XmlBeansUtils#convertXmlBeansException(Exception,boolean) - */ - public XmlMappingException convertXmlBeansException(Exception ex, boolean marshalling) { - return XmlBeansUtils.convertXmlBeansException(ex, marshalling); - } /** - * Validates the given XmlObject. - * + * Validate the given XmlObject. * @param object the xml object to validate - * @throws XmlBeansValidationFailureException - * if the given object is not valid + * @throws XmlBeansValidationFailureException if the given object is not valid */ - public void validate(XmlObject object) throws XmlBeansValidationFailureException { + protected void validate(XmlObject object) throws ValidationFailureException { if (isValidating() && object != null) { // create a temporary xmlOptions just for validation XmlOptions validateOptions = getXmlOptions() != null ? getXmlOptions() : new XmlOptions(); @@ -256,15 +267,44 @@ public class XmlBeansMarshaller extends AbstractMarshaller { validateOptions.setErrorListener(errorsList); if (!object.validate(validateOptions)) { StringBuilder builder = new StringBuilder("Could not validate XmlObject :"); - for (Iterator iterator = errorsList.iterator(); iterator.hasNext();) { - XmlError xmlError = (XmlError) iterator.next(); + for (Object anErrorsList : errorsList) { + XmlError xmlError = (XmlError) anErrorsList; if (xmlError instanceof XmlValidationError) { builder.append(xmlError.toString()); } } - XmlException ex = new XmlException(builder.toString(), null, errorsList); - throw new XmlBeansValidationFailureException(ex); + throw new ValidationFailureException("XMLBeans validation failure", + new XmlException(builder.toString(), null, errorsList)); } } } + + /** + * Convert the given XMLBeans 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 XMLBeans itself does not make this distinction in its exception hierarchy. + * @param ex XMLBeans Exception that occured + * @param marshalling indicates whether the exception occurs during marshalling (true), + * or unmarshalling (false) + * @return the corresponding XmlMappingException + */ + protected XmlMappingException convertXmlBeansException(Exception ex, boolean marshalling) { + if (ex instanceof XMLStreamValidationException) { + return new ValidationFailureException("XmlBeans validation exception", ex); + } + else if (ex instanceof XmlException || ex instanceof SAXException) { + if (marshalling) { + return new MarshallingFailureException("XMLBeans marshalling exception", ex); + } + else { + return new UnmarshallingFailureException("XMLBeans unmarshalling exception", ex); + } + } + else { + // fallback + return new UncategorizedMappingException("Unknown XMLBeans exception", ex); + } + } + } diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlBeansMarshallingFailureException.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlBeansMarshallingFailureException.java deleted file mode 100644 index ecaa82a8993..00000000000 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlBeansMarshallingFailureException.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2005 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.oxm.xmlbeans; - -import org.apache.xmlbeans.XmlException; -import org.xml.sax.SAXException; - -import org.springframework.oxm.MarshallingFailureException; - -/** - * XMLBeans-specific subclass of MarshallingFailureException. - * - * @author Arjen Poutsma - * @see XmlBeansUtils#convertXmlBeansException(Exception,boolean) - * @since 3.0 - */ -public class XmlBeansMarshallingFailureException extends MarshallingFailureException { - - public XmlBeansMarshallingFailureException(XmlException ex) { - super("XMLBeans marshalling exception: " + ex.getMessage(), ex); - } - - public XmlBeansMarshallingFailureException(SAXException ex) { - super("XMLBeans marshalling exception: " + ex.getMessage(), ex); - } - -} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlBeansSystemException.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlBeansSystemException.java deleted file mode 100644 index cef8c5a8805..00000000000 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlBeansSystemException.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2005 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.oxm.xmlbeans; - -import org.springframework.oxm.UncategorizedXmlMappingException; - -/** - * XMLBeans-specific subclass of UncategorizedXmlMappingException, for XMLBeans exceptions that cannot be - * distinguished further. - * - * @author Arjen Poutsma - * @since 3.0 - */ -public class XmlBeansSystemException extends UncategorizedXmlMappingException { - - public XmlBeansSystemException(Exception e) { - super(e.getMessage(), e); - } - -} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlBeansUnmarshallingFailureException.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlBeansUnmarshallingFailureException.java deleted file mode 100644 index edd9cb4fd11..00000000000 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlBeansUnmarshallingFailureException.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2005 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.oxm.xmlbeans; - -import org.apache.xmlbeans.XmlException; -import org.xml.sax.SAXException; - -import org.springframework.oxm.UnmarshallingFailureException; - -/** - * XMLBeans-specific subclass of UnmarshallingFailureException. - * - * @author Arjen Poutsma - * @see XmlBeansUtils#convertXmlBeansException(Exception,boolean) - * @since 3.0 - */ -public class XmlBeansUnmarshallingFailureException extends UnmarshallingFailureException { - - public XmlBeansUnmarshallingFailureException(XmlException ex) { - super("XMLBeans unmarshalling exception: " + ex.getMessage(), ex); - } - - public XmlBeansUnmarshallingFailureException(SAXException ex) { - super("XMLBeans unmarshalling exception: " + ex.getMessage(), ex); - } - -} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlBeansUtils.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlBeansUtils.java deleted file mode 100644 index d84c813b969..00000000000 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlBeansUtils.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2005 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.oxm.xmlbeans; - -import org.apache.xmlbeans.XMLStreamValidationException; -import org.apache.xmlbeans.XmlException; -import org.xml.sax.SAXException; - -import org.springframework.oxm.XmlMappingException; - -/** - * Generic utility methods for working with XMLBeans. Mainly for internal use within the framework. - * - * @author Arjen Poutsma - * @since 3.0 - */ -public class XmlBeansUtils { - - /** - * Converts the given XMLBeans 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 XMLBeans itself does not make this distinction in its exception hierarchy. - * - * @param ex XMLBeans Exception that occured - * @param marshalling indicates whether the exception occurs during marshalling (true), or unmarshalling - * (false) - * @return the corresponding XmlMappingException - */ - public static XmlMappingException convertXmlBeansException(Exception ex, boolean marshalling) { - if (ex instanceof XMLStreamValidationException) { - return new XmlBeansValidationFailureException((XMLStreamValidationException) ex); - } - else if (ex instanceof XmlException) { - XmlException xmlException = (XmlException) ex; - if (marshalling) { - return new XmlBeansMarshallingFailureException(xmlException); - } - else { - return new XmlBeansUnmarshallingFailureException(xmlException); - } - } - else if (ex instanceof SAXException) { - SAXException saxException = (SAXException) ex; - if (marshalling) { - return new XmlBeansMarshallingFailureException(saxException); - } - else { - return new XmlBeansUnmarshallingFailureException(saxException); - } - } - // fallback - return new XmlBeansSystemException(ex); - } - -} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlBeansValidationFailureException.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlBeansValidationFailureException.java deleted file mode 100644 index c5899850756..00000000000 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlBeansValidationFailureException.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2005 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.oxm.xmlbeans; - -import org.apache.xmlbeans.XMLStreamValidationException; -import org.apache.xmlbeans.XmlException; - -import org.springframework.oxm.ValidationFailureException; - -/** - * XMLBeans-specific subclass of ValidationFailureException. - * - * @author Arjen Poutsma - * @see org.springframework.oxm.xmlbeans.XmlBeansUtils#convertXmlBeansException - * @since 3.0 - */ -public class XmlBeansValidationFailureException extends ValidationFailureException { - - public XmlBeansValidationFailureException(XMLStreamValidationException ex) { - super("XmlBeans validation exception: " + ex.getMessage(), ex); - } - - public XmlBeansValidationFailureException(XmlException ex) { - super("XmlBeans validation exception: " + ex.getMessage(), ex); - } -} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlOptionsFactoryBean.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlOptionsFactoryBean.java index 001d751a626..2c90c53fd4a 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlOptionsFactoryBean.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/xmlbeans/XmlOptionsFactoryBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2006 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,64 +16,58 @@ package org.springframework.oxm.xmlbeans; -import java.util.Iterator; import java.util.Map; import org.apache.xmlbeans.XmlOptions; import org.springframework.beans.factory.FactoryBean; -import org.springframework.beans.factory.InitializingBean; /** - * Factory bean that configures an XMLBeans XmlOptions object and provides it as a bean reference.

- * Typical usage will be to set XMLBeans options on this bean, and refer to it in the XmlBeansMarshaller. + * {@link FactoryBean} that configures an XMLBeans XmlOptions object + * and provides it as a bean reference. + * + *

Typical usage will be to set XMLBeans options on this bean, and refer to it + * in the {@link XmlBeansMarshaller}. * * @author Arjen Poutsma + * @since 3.0 * @see XmlOptions * @see #setOptions(java.util.Map) - * @see XmlBeansMarshaller#setXmlOptions(org.apache.xmlbeans.XmlOptions) - * @since 3.0 + * @see XmlBeansMarshaller#setXmlOptions(XmlOptions) */ -public class XmlOptionsFactoryBean implements FactoryBean, InitializingBean { +public class XmlOptionsFactoryBean implements FactoryBean { private XmlOptions xmlOptions; - private Map options; - /** Returns the singleton XmlOptions. */ - public Object getObject() throws Exception { - return xmlOptions; + /** + * Set options on the underlying XmlOptions object. + *

The keys of the supplied map should be one of the String constants + * defined in XmlOptions, the values vary per option. + * @see XmlOptions#put(Object,Object) + * @see XmlOptions#SAVE_PRETTY_PRINT + * @see XmlOptions#LOAD_STRIP_COMMENTS + */ + public void setOptions(Map optionsMap) { + this.xmlOptions = new XmlOptions(); + if (optionsMap != null) { + for (String option : optionsMap.keySet()) { + this.xmlOptions.put(option, optionsMap.get(option)); + } + } } - /** Returns the class of XmlOptions. */ - public Class getObjectType() { + + public XmlOptions getObject() { + return this.xmlOptions; + } + + public Class getObjectType() { return XmlOptions.class; } - /** Returns true. */ public boolean isSingleton() { return true; } - /** - * Sets options on the underlying XmlOptions object. The keys of the supplied map should be one of the - * string constants defined in XmlOptions, the values vary per option. - * - * @see XmlOptions#put(Object,Object) - * @see XmlOptions#SAVE_PRETTY_PRINT - * @see XmlOptions#LOAD_STRIP_COMMENTS - */ - public void setOptions(Map options) { - this.options = options; - } - - public void afterPropertiesSet() throws Exception { - xmlOptions = new XmlOptions(); - if (options != null) { - for (Iterator iterator = options.keySet().iterator(); iterator.hasNext();) { - Object option = iterator.next(); - xmlOptions.put(option, options.get(option)); - } - } - } } diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/xstream/XStreamMarshaller.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/xstream/XStreamMarshaller.java index c9b9d5eb2f3..ac2a439f423 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/xstream/XStreamMarshaller.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/xstream/XStreamMarshaller.java @@ -1,5 +1,5 @@ /* - * Copyright 2006 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,7 +23,6 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.Writer; -import java.util.Iterator; import java.util.Map; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLEventWriter; @@ -32,12 +31,14 @@ import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamWriter; import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.converters.ConversionException; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.ConverterMatcher; import com.thoughtworks.xstream.converters.SingleValueConverter; import com.thoughtworks.xstream.io.HierarchicalStreamDriver; import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; +import com.thoughtworks.xstream.io.StreamException; import com.thoughtworks.xstream.io.xml.CompactWriter; import com.thoughtworks.xstream.io.xml.DomReader; import com.thoughtworks.xstream.io.xml.DomWriter; @@ -47,6 +48,7 @@ import com.thoughtworks.xstream.io.xml.StaxReader; import com.thoughtworks.xstream.io.xml.StaxWriter; import com.thoughtworks.xstream.io.xml.XmlFriendlyReplacer; import com.thoughtworks.xstream.io.xml.XppReader; +import com.thoughtworks.xstream.mapper.CannotResolveClassException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -55,100 +57,83 @@ import org.xml.sax.InputSource; import org.xml.sax.XMLReader; import org.xml.sax.ext.LexicalHandler; -import org.springframework.beans.propertyeditors.ClassEditor; -import org.springframework.oxm.AbstractMarshaller; +import org.springframework.oxm.MarshallingFailureException; +import org.springframework.oxm.UncategorizedMappingException; +import org.springframework.oxm.UnmarshallingFailureException; import org.springframework.oxm.XmlMappingException; +import org.springframework.oxm.support.AbstractMarshaller; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import org.springframework.util.xml.StaxUtils; /** - * 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 that 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. + * 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. * * @author Peter Meijer * @author Arjen Poutsma - * @see #setEncoding(String) - * @see #DEFAULT_ENCODING - * @see #setAliases(Map) - * @see #setConverters(ConverterMatcher[]) * @since 3.0 + * @see #setAliases + * @see #setConverters + * @see #setEncoding */ public class XStreamMarshaller extends AbstractMarshaller { - /** The default encoding used for stream access. */ + /** + * The default encoding used for stream access: UTF-8. + */ public static final String DEFAULT_ENCODING = "UTF-8"; - private XStream xstream = new XStream(); - - private String encoding; - private Class[] supportedClasses; + private final XStream xstream = new XStream(); - /** Specialized driver to be used with stream readers and writers */ private HierarchicalStreamDriver streamDriver; - /** - * Returns the encoding to be used for stream access. If this property is not set, the default encoding is used. - * - * @see #DEFAULT_ENCODING - */ - public String getEncoding() { - return encoding != null ? encoding : DEFAULT_ENCODING; - } + private String encoding = DEFAULT_ENCODING; + + private Class[] supportedClasses; + /** - * Sets the encoding to be used for stream access. If this property is not set, the default encoding is used. - * - * @see #DEFAULT_ENCODING + * Returns the XStream instance used by this marshaller. */ - public void setEncoding(String encoding) { - this.encoding = encoding; - } - - /** Returns the XStream instance used by this marshaller. */ - public XStream getXStream() { - return xstream; + public final XStream getXStream() { + return this.xstream; } /** - * Sets the XStream mode. - * + * Set the XStream mode. * @see XStream#XPATH_REFERENCES * @see XStream#ID_REFERENCES * @see XStream#NO_REFERENCES */ public void setMode(int mode) { - getXStream().setMode(mode); + this.xstream.setMode(mode); } /** - * Sets the classes supported by this marshaller. If this property is empty (the default), all classes are supported. - * - * @see #supports(Class) - */ - public void setSupportedClasses(Class[] supportedClasses) { - this.supportedClasses = supportedClasses; - } - - /** - * Sets the Converters or SingleValueConverters to be registered with the - * XStream instance. - * + * Set the Converters or SingleValueConverters to be registered + * with the XStream instance. * @see Converter * @see SingleValueConverter */ public void setConverters(ConverterMatcher[] converters) { for (int i = 0; i < converters.length; i++) { if (converters[i] instanceof Converter) { - getXStream().registerConverter((Converter) converters[i], i); + this.xstream.registerConverter((Converter) converters[i], i); } else if (converters[i] instanceof SingleValueConverter) { - getXStream().registerConverter((SingleValueConverter) converters[i], i); + this.xstream.registerConverter((SingleValueConverter) converters[i], i); } else { throw new IllegalArgumentException("Invalid ConverterMatcher [" + converters[i] + "]"); @@ -156,68 +141,48 @@ public class XStreamMarshaller extends AbstractMarshaller { } } - /** Sets the XStream hierarchical stream driver to be used with stream readers and writers */ - public void setStreamDriver(HierarchicalStreamDriver streamDriver) { - this.streamDriver = streamDriver; - } - /** - * Set a alias/type map, consisting of string aliases mapped to Class instances (or Strings to be - * converted to Class instances). - * - * @see org.springframework.beans.propertyeditors.ClassEditor + * Set an alias/type map, consisting of string aliases mapped to Class instances. */ - public void setAliases(Map aliases) { - for (Iterator iterator = aliases.entrySet().iterator(); iterator.hasNext();) { - Map.Entry entry = (Map.Entry) iterator.next(); - // Check whether we need to convert from String to Class. - Class type; - if (entry.getValue() instanceof Class) { - type = (Class) entry.getValue(); - } - else { - ClassEditor editor = new ClassEditor(); - editor.setAsText(String.valueOf(entry.getValue())); - type = (Class) editor.getValue(); - } - addAlias((String) entry.getKey(), type); + public void setAliases(Map aliases) { + for (Map.Entry entry : aliases.entrySet()) { + this.xstream.alias(entry.getKey(), entry.getValue()); } } /** - * Adds an alias for the given type. - * + * Add an alias for the given type. * @param name alias to be used for the type * @param type the type to be aliased */ public void addAlias(String name, Class type) { - getXStream().alias(name, type); + this.xstream.alias(name, type); } /** - * Sets types to use XML attributes for. - * + * Set types to use XML attributes for. * @see XStream#useAttributeFor(Class) */ public void setUseAttributeForTypes(Class[] types) { for (Class type : types) { - getXStream().useAttributeFor(type); + this.xstream.useAttributeFor(type); } } /** - * Sets the types to use XML attributes for. The given map can contain either <String, Class> pairs, - * in which case {@link XStream#useAttributeFor(String,Class)} is called, or <Class, String> pairs, - * which results in {@link XStream#useAttributeFor(Class,String)}. + * Set the types to use XML attributes for. The given map can contain + * either <String, Class> pairs, in which case + * {@link XStream#useAttributeFor(String, Class)} is called, + * or <Class, String> pairs, which results in + * {@link XStream#useAttributeFor(Class, String)} calls. */ - public void setUseAttributeFor(Map attributes) { - for (Iterator iterator = attributes.entrySet().iterator(); iterator.hasNext();) { - Map.Entry entry = (Map.Entry) iterator.next(); + public void setUseAttributeFor(Map attributes) { + for (Map.Entry entry : attributes.entrySet()) { if (entry.getKey() instanceof String && entry.getValue() instanceof Class) { - getXStream().useAttributeFor((String) entry.getKey(), (Class) entry.getValue()); + this.xstream.useAttributeFor((String) entry.getKey(), (Class) entry.getValue()); } else if (entry.getKey() instanceof Class && entry.getValue() instanceof String) { - getXStream().useAttributeFor((Class) entry.getKey(), (String) entry.getValue()); + this.xstream.useAttributeFor((Class) entry.getKey(), (String) entry.getValue()); } else { throw new IllegalArgumentException("Invalid attribute key and value pair. " + @@ -227,102 +192,97 @@ public class XStreamMarshaller extends AbstractMarshaller { } /** - * Adds an implicit Collection for the given type. - * + * Set a implicit colletion/type map, consisting of implicit collection String keys + * mapped to Class values. * @see XStream#addImplicitCollection(Class, String) */ - public void addImplicitCollection(String name, Class type) { - getXStream().addImplicitCollection(type, name); + public void setImplicitCollection(Map implicitCollection) { + for (Map.Entry entry : implicitCollection.entrySet()) { + this.xstream.addImplicitCollection(entry.getValue(), entry.getKey()); + } } /** - * Set a implicit colletion/type map, consisting of string implicit collection mapped to Class instances - * (or Strings to be converted to Class instances). - * + * Add an implicit Collection for the given type. * @see XStream#addImplicitCollection(Class, String) */ - public void setImplicitCollection(Map implicitCollection) { - for (Iterator iterator = implicitCollection.entrySet().iterator(); iterator.hasNext();) { - Map.Entry entry = (Map.Entry) iterator.next(); - // Check whether we need to convert from String to Class. - Class type; - if (entry.getValue() instanceof Class) { - type = (Class) entry.getValue(); - } - else { - ClassEditor editor = new ClassEditor(); - editor.setAsText(String.valueOf(entry.getValue())); - type = (Class) editor.getValue(); - } - addImplicitCollection((String) entry.getKey(), type); - } + public void addImplicitCollection(String name, Class type) { + this.xstream.addImplicitCollection(type, name); } /** - * Adds an omitted field for the given type. - * - * @param type the type to be containing the field - * @param fieldName field to omitt + * Specify omitted fields, as a Map consisting of Class instances + * mapped to comma separated field names. * @see XStream#omitField(Class, String) */ - public void addOmittedField(Class type, String fieldName) { - getXStream().omitField(type, fieldName); + public void setOmittedFields(Map omittedFields) { + for (Map.Entry entry : omittedFields.entrySet()) { + String[] fields = StringUtils.commaDelimitedListToStringArray(entry.getValue()); + for (String field : fields) { + this.xstream.omitField(entry.getKey(), field); + } + } } /** - * Sets a ommited field map, consisting of Class instances (or Strings to be converted to - * Class instances) mapped to comma separated field names. - * + * Add an omitted field for the given type. + * @param type the type to be containing the field + * @param fieldName field to omitt * @see XStream#omitField(Class, String) */ - public void setOmittedFields(Map omittedFields) { - for (Iterator iterator = omittedFields.entrySet().iterator(); iterator.hasNext();) { - Map.Entry entry = (Map.Entry) iterator.next(); - // Check whether we need to convert from String to Class. - Class type; - if (entry.getKey() instanceof Class) { - type = (Class) entry.getKey(); - } - else { - ClassEditor editor = new ClassEditor(); - editor.setAsText(String.valueOf(entry.getKey())); - type = (Class) editor.getValue(); - } - // add each omitted field for the current type - String fieldsString = (String) entry.getValue(); - String[] fields = StringUtils.commaDelimitedListToStringArray(fieldsString); - for (String field : fields) { - addOmittedField(type, field); - } - } + public void addOmittedField(Class type, String fieldName) { + this.xstream.omitField(type, fieldName); } /** - * Sets the classes, for which mappings will be read from class-level JDK 1.5+ annotation metadata. - * - * @see com.thoughtworks.xstream.annotations.Annotations#configureAliases(com.thoughtworks.xstream.XStream, Class[]) + * Set the classes for which mappings will be read from class-level JDK 1.5+ annotation metadata. + * @see com.thoughtworks.xstream.XStream#processAnnotations(Class) */ public void setAnnotatedClass(Class annotatedClass) { Assert.notNull(annotatedClass, "'annotatedClass' must not be null"); - getXStream().processAnnotations(annotatedClass); + this.xstream.processAnnotations(annotatedClass); } /** - * Sets annotated classes, for which aliases will be read from class-level JDK 1.5+ annotation metadata. - * - * @see com.thoughtworks.xstream.annotations.Annotations#configureAliases(com.thoughtworks.xstream.XStream, Class[]) + * Set annotated classes for which aliases will be read from class-level JDK 1.5+ annotation metadata. + * @see com.thoughtworks.xstream.XStream#processAnnotations(Class[]) */ public void setAnnotatedClasses(Class[] annotatedClasses) { Assert.notEmpty(annotatedClasses, "'annotatedClasses' must not be empty"); - getXStream().processAnnotations(annotatedClasses); + this.xstream.processAnnotations(annotatedClasses); + } + + /** + * Set the XStream hierarchical stream driver to be used with stream readers and writers. + */ + public void setStreamDriver(HierarchicalStreamDriver streamDriver) { + this.streamDriver = streamDriver; + } + + /** + * Set the encoding to be used for stream access. + * @see #DEFAULT_ENCODING + */ + public void setEncoding(String encoding) { + this.encoding = encoding; } + /** + * Set the classes supported by this marshaller. + *

If this property is empty (the default), all classes are supported. + * @see #supports(Class) + */ + public void setSupportedClasses(Class[] supportedClasses) { + this.supportedClasses = supportedClasses; + } + + public boolean supports(Class clazz) { - if (ObjectUtils.isEmpty(supportedClasses)) { + if (ObjectUtils.isEmpty(this.supportedClasses)) { return true; } else { - for (Class supportedClass : supportedClasses) { + for (Class supportedClass : this.supportedClasses) { if (supportedClass.isAssignableFrom(clazz)) { return true; } @@ -331,36 +291,8 @@ public class XStreamMarshaller extends AbstractMarshaller { } } - /** - * Convert the given XStream exception to an appropriate exception from the org.springframework.oxm - * hierarchy.

The default implementation delegates to XStreamUtils. Can be overridden in subclasses. - * - * @param ex exception that occured - * @param marshalling indicates whether the exception occurs during marshalling (true), or unmarshalling - * (false) - * @return the corresponding XmlMappingException instance - * @see XStreamUtils#convertXStreamException(Exception,boolean) - */ - public XmlMappingException convertXStreamException(Exception ex, boolean marshalling) { - return XStreamUtils.convertXStreamException(ex, marshalling); - } - // // Marshalling - // - - /** - * Marshals the given graph to the given XStream HierarchicalStreamWriter. Converts exceptions using - * convertXStreamException. - */ - private void marshal(Object graph, HierarchicalStreamWriter streamWriter) { - try { - getXStream().marshal(graph, streamWriter); - } - catch (Exception ex) { - throw convertXStreamException(ex, true); - } - } @Override protected void marshalDomNode(Object graph, Node node) throws XmlMappingException { @@ -394,14 +326,14 @@ public class XStreamMarshaller extends AbstractMarshaller { } @Override - protected void marshalOutputStream(Object graph, OutputStream outputStream) - throws XmlMappingException, IOException { - marshalWriter(graph, new OutputStreamWriter(outputStream, getEncoding())); + protected void marshalOutputStream(Object graph, OutputStream outputStream) throws XmlMappingException, IOException { + marshalWriter(graph, new OutputStreamWriter(outputStream, this.encoding)); } @Override protected void marshalSaxHandlers(Object graph, ContentHandler contentHandler, LexicalHandler lexicalHandler) throws XmlMappingException { + SaxWriter saxWriter = new SaxWriter(); saxWriter.setContentHandler(contentHandler); marshal(graph, saxWriter); @@ -417,19 +349,22 @@ public class XStreamMarshaller extends AbstractMarshaller { } } - // - // Unmarshalling - // - - private Object unmarshal(HierarchicalStreamReader streamReader) { + /** + * Marshals the given graph to the given XStream HierarchicalStreamWriter. + * Converts exceptions using {@link #convertXStreamException}. + */ + private void marshal(Object graph, HierarchicalStreamWriter streamWriter) { try { - return getXStream().unmarshal(streamReader); + this.xstream.marshal(graph, streamWriter); } catch (Exception ex) { - throw convertXStreamException(ex, false); + throw convertXStreamException(ex, true); } } + + // Unmarshalling + @Override protected Object unmarshalDomNode(Node node) throws XmlMappingException { HierarchicalStreamReader streamReader; @@ -463,7 +398,7 @@ public class XStreamMarshaller extends AbstractMarshaller { @Override protected Object unmarshalInputStream(InputStream inputStream) throws XmlMappingException, IOException { - return unmarshalReader(new InputStreamReader(inputStream, getEncoding())); + return unmarshalReader(new InputStreamReader(inputStream, this.encoding)); } @Override @@ -479,8 +414,45 @@ public class XStreamMarshaller extends AbstractMarshaller { @Override protected Object unmarshalSaxReader(XMLReader xmlReader, InputSource inputSource) throws XmlMappingException, IOException { + throw new UnsupportedOperationException( "XStreamMarshaller does not support unmarshalling using SAX XMLReaders"); } + private Object unmarshal(HierarchicalStreamReader streamReader) { + try { + return this.xstream.unmarshal(streamReader); + } + catch (Exception ex) { + throw convertXStreamException(ex, false); + } + } + + + /** + * 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. + * @param ex XStream exception that occured + * @param marshalling indicates whether the exception occurs during marshalling (true), + * or unmarshalling (false) + * @return the corresponding XmlMappingException + */ + protected XmlMappingException convertXStreamException(Exception ex, boolean marshalling) { + if (ex instanceof StreamException || ex instanceof CannotResolveClassException || + ex instanceof ConversionException) { + if (marshalling) { + return new MarshallingFailureException("XStream marshalling exception", ex); + } + else { + return new UnmarshallingFailureException("XStream unmarshalling exception", ex); + } + } + else { + // fallback + return new UncategorizedMappingException("Unknown XStream exception", ex); + } + } + } diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/xstream/XStreamMarshallingFailureException.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/xstream/XStreamMarshallingFailureException.java deleted file mode 100644 index 2dc30f234c5..00000000000 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/xstream/XStreamMarshallingFailureException.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.oxm.xstream; - -import com.thoughtworks.xstream.alias.CannotResolveClassException; -import com.thoughtworks.xstream.converters.ConversionException; -import com.thoughtworks.xstream.io.StreamException; - -import org.springframework.oxm.MarshallingFailureException; - -/** - * XStream-specific subclass of MarshallingFailureException. - * - * @author Arjen Poutsma - * @since 3.0 - */ -public class XStreamMarshallingFailureException extends MarshallingFailureException { - - public XStreamMarshallingFailureException(String msg) { - super(msg); - } - - public XStreamMarshallingFailureException(StreamException ex) { - super("XStream marshalling exception: " + ex.getMessage(), ex); - - } - - public XStreamMarshallingFailureException(CannotResolveClassException ex) { - super("XStream resolving exception: " + ex.getMessage(), ex); - } - - public XStreamMarshallingFailureException(ConversionException ex) { - super("XStream conversion exception: " + ex.getMessage(), ex); - } - -} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/xstream/XStreamSystemException.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/xstream/XStreamSystemException.java deleted file mode 100644 index 31dd3565bd7..00000000000 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/xstream/XStreamSystemException.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.oxm.xstream; - -import org.springframework.oxm.UncategorizedXmlMappingException; - -/** - * XStream-specific subclass of UncategorizedXmlMappingException, for XStream exceptions that cannot be - * distinguished further. - * - * @author Arjen Poutsma - * @since 3.0 - */ -public class XStreamSystemException extends UncategorizedXmlMappingException { - - public XStreamSystemException(String msg, Throwable ex) { - super(msg, ex); - } - -} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/xstream/XStreamUnmarshallingFailureException.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/xstream/XStreamUnmarshallingFailureException.java deleted file mode 100644 index 7b7671fde58..00000000000 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/xstream/XStreamUnmarshallingFailureException.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.oxm.xstream; - -import javax.xml.stream.XMLStreamException; - -import com.thoughtworks.xstream.alias.CannotResolveClassException; -import com.thoughtworks.xstream.converters.ConversionException; -import com.thoughtworks.xstream.io.StreamException; - -import org.springframework.oxm.UnmarshallingFailureException; - -/** - * XStream-specific subclass of UnmarshallingFailureException. - * - * @author Arjen Poutsma - * @since 3.0 - */ -public class XStreamUnmarshallingFailureException extends UnmarshallingFailureException { - - public XStreamUnmarshallingFailureException(StreamException ex) { - super("XStream unmarshalling exception: " + ex.getMessage(), ex); - } - - public XStreamUnmarshallingFailureException(CannotResolveClassException ex) { - super("XStream resolving exception: " + ex.getMessage(), ex); - } - - public XStreamUnmarshallingFailureException(ConversionException ex) { - super("XStream conversion exception: " + ex.getMessage(), ex); - } - - public XStreamUnmarshallingFailureException(String msg) { - super(msg); - } - - public XStreamUnmarshallingFailureException(String msg, XMLStreamException ex) { - super(msg, ex); - } - -} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/xstream/XStreamUtils.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/xstream/XStreamUtils.java index 5c4ab5c66c3..1750cb5c752 100644 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/xstream/XStreamUtils.java +++ b/org.springframework.oxm/src/main/java/org/springframework/oxm/xstream/XStreamUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2006 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,57 +16,48 @@ package org.springframework.oxm.xstream; -import com.thoughtworks.xstream.alias.CannotResolveClassException; import com.thoughtworks.xstream.converters.ConversionException; import com.thoughtworks.xstream.io.StreamException; +import com.thoughtworks.xstream.mapper.CannotResolveClassException; +import org.springframework.oxm.MarshallingFailureException; +import org.springframework.oxm.UncategorizedMappingException; +import org.springframework.oxm.UnmarshallingFailureException; import org.springframework.oxm.XmlMappingException; /** * Generic utility methods for working with XStream. Mainly for internal use within the framework. * * @author Arjen Poutsma + * @author Juergen Hoeller * @since 3.0 */ -public abstract class XStreamUtils { +abstract class XStreamUtils { /** - * Converts 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 + * 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. - * - * @param ex XStream exception that occured - * @param marshalling indicates whether the exception occurs during marshalling (true), or unmarshalling - * (false) + * @param ex XStream exception that occured + * @param marshalling indicates whether the exception occurs during marshalling (true), + * or unmarshalling (false) * @return the corresponding XmlMappingException */ public static XmlMappingException convertXStreamException(Exception ex, boolean marshalling) { - if (ex instanceof StreamException) { + if (ex instanceof StreamException || ex instanceof CannotResolveClassException || + ex instanceof ConversionException) { if (marshalling) { - return new XStreamMarshallingFailureException((StreamException) ex); + return new MarshallingFailureException("XStream marshalling exception", ex); } else { - return new XStreamUnmarshallingFailureException((StreamException) ex); + return new UnmarshallingFailureException("XStream unmarshalling exception", ex); } } - else if (ex instanceof CannotResolveClassException) { - if (marshalling) { - return new XStreamMarshallingFailureException((CannotResolveClassException) ex); - } - else { - return new XStreamUnmarshallingFailureException((CannotResolveClassException) ex); - } - } - else if (ex instanceof ConversionException) { - if (marshalling) { - return new XStreamMarshallingFailureException((ConversionException) ex); - } - else { - return new XStreamUnmarshallingFailureException((ConversionException) ex); - } + else { + // fallback + return new UncategorizedMappingException("Unknown XStream exception", ex); } - // fallback - return new XStreamSystemException("Unknown XStream exception: " + ex.getMessage(), ex); } } diff --git a/org.springframework.oxm/src/test/java/org/springframework/oxm/AbstractMarshallerTestCase.java b/org.springframework.oxm/src/test/java/org/springframework/oxm/AbstractMarshallerTests.java similarity index 97% rename from org.springframework.oxm/src/test/java/org/springframework/oxm/AbstractMarshallerTestCase.java rename to org.springframework.oxm/src/test/java/org/springframework/oxm/AbstractMarshallerTests.java index 15c83191488..f69e71def9d 100644 --- a/org.springframework.oxm/src/test/java/org/springframework/oxm/AbstractMarshallerTestCase.java +++ b/org.springframework.oxm/src/test/java/org/springframework/oxm/AbstractMarshallerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2005 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.oxm; import java.io.ByteArrayOutputStream; @@ -38,7 +39,10 @@ import org.w3c.dom.Text; import org.springframework.util.xml.StaxUtils; -public abstract class AbstractMarshallerTestCase { +/** + * @author Arjen Poutsma + */ +public abstract class AbstractMarshallerTests { protected Marshaller marshaller; diff --git a/org.springframework.oxm/src/test/java/org/springframework/oxm/AbstractUnmarshallerTestCase.java b/org.springframework.oxm/src/test/java/org/springframework/oxm/AbstractUnmarshallerTests.java similarity index 97% rename from org.springframework.oxm/src/test/java/org/springframework/oxm/AbstractUnmarshallerTestCase.java rename to org.springframework.oxm/src/test/java/org/springframework/oxm/AbstractUnmarshallerTests.java index d2158f415a8..d92510e4554 100644 --- a/org.springframework.oxm/src/test/java/org/springframework/oxm/AbstractUnmarshallerTestCase.java +++ b/org.springframework.oxm/src/test/java/org/springframework/oxm/AbstractUnmarshallerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2005 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.oxm; import java.io.ByteArrayInputStream; @@ -41,7 +42,10 @@ import org.xml.sax.helpers.XMLReaderFactory; import org.springframework.util.xml.StaxUtils; -public abstract class AbstractUnmarshallerTestCase { +/** + * @author Arjen Poutsma + */ +public abstract class AbstractUnmarshallerTests { protected Unmarshaller unmarshaller; diff --git a/org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorMarshallerTest.java b/org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorMarshallerTests.java similarity index 93% rename from org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorMarshallerTest.java rename to org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorMarshallerTests.java index 870d56b5f48..74ff29b371d 100644 --- a/org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorMarshallerTest.java +++ b/org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorMarshallerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2005 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.oxm.castor; import javax.xml.transform.sax.SAXResult; @@ -24,10 +25,13 @@ import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.springframework.core.io.ClassPathResource; -import org.springframework.oxm.AbstractMarshallerTestCase; +import org.springframework.oxm.AbstractMarshallerTests; import org.springframework.oxm.Marshaller; -public class CastorMarshallerTest extends AbstractMarshallerTestCase { +/** + * @author Arjen Poutsma + */ +public class CastorMarshallerTests extends AbstractMarshallerTests { @Override protected Marshaller createMarshaller() throws Exception { @@ -77,5 +81,4 @@ public class CastorMarshallerTest extends AbstractMarshallerTestCase { assertTrue("CastorMarshaller does not support Flight", marshaller.supports(Flight.class)); } - } diff --git a/org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorUnmarshallerTest.java b/org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorUnmarshallerTests.java similarity index 91% rename from org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorUnmarshallerTest.java rename to org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorUnmarshallerTests.java index 4789bf03af5..c9a9c44f40e 100644 --- a/org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorUnmarshallerTest.java +++ b/org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorUnmarshallerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2005 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.oxm.castor; import java.io.ByteArrayInputStream; @@ -24,10 +25,13 @@ import static org.junit.Assert.assertNotNull; import org.junit.Test; import org.springframework.core.io.ClassPathResource; -import org.springframework.oxm.AbstractUnmarshallerTestCase; +import org.springframework.oxm.AbstractUnmarshallerTests; import org.springframework.oxm.Unmarshaller; -public class CastorUnmarshallerTest extends AbstractUnmarshallerTestCase { +/** + * @author Arjen Poutsma + */ +public class CastorUnmarshallerTests extends AbstractUnmarshallerTests { @Override protected void testFlights(Object o) { diff --git a/org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorUtilsTest.java b/org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorUtilsTest.java deleted file mode 100644 index 8f663d0d132..00000000000 --- a/org.springframework.oxm/src/test/java/org/springframework/oxm/castor/CastorUtilsTest.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2005 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.oxm.castor; - -import junit.framework.TestCase; -import org.exolab.castor.xml.MarshalException; -import org.exolab.castor.xml.ValidationException; -import org.exolab.castor.xml.XMLException; - -public class CastorUtilsTest extends TestCase { - - public void testConvertMarshalException() { - assertTrue("Invalid exception conversion", CastorUtils - .convertXmlException(new MarshalException(""), true) instanceof CastorMarshallingFailureException); - assertTrue("Invalid exception conversion", CastorUtils - .convertXmlException(new MarshalException(""), false) instanceof CastorUnmarshallingFailureException); - } - - public void testConvertValidationException() { - assertTrue("Invalid exception conversion", CastorUtils - .convertXmlException(new ValidationException(""), false) instanceof CastorValidationFailureException); - } - - public void testConvertXMLException() { - assertTrue("Invalid exception conversion", - CastorUtils.convertXmlException(new XMLException(""), false) instanceof CastorSystemException); - } - -} diff --git a/org.springframework.oxm/src/test/java/org/springframework/oxm/jaxb/Jaxb2MarshallerTest.java b/org.springframework.oxm/src/test/java/org/springframework/oxm/jaxb/Jaxb2MarshallerTests.java similarity index 95% rename from org.springframework.oxm/src/test/java/org/springframework/oxm/jaxb/Jaxb2MarshallerTest.java rename to org.springframework.oxm/src/test/java/org/springframework/oxm/jaxb/Jaxb2MarshallerTests.java index 6b3624426b5..7a262afacbb 100644 --- a/org.springframework.oxm/src/test/java/org/springframework/oxm/jaxb/Jaxb2MarshallerTest.java +++ b/org.springframework.oxm/src/test/java/org/springframework/oxm/jaxb/Jaxb2MarshallerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2006 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,12 +21,13 @@ import java.lang.reflect.Method; import java.util.Collections; import javax.activation.DataHandler; import javax.activation.FileDataSource; +import javax.xml.bind.JAXBException; import javax.xml.transform.Result; import javax.xml.transform.sax.SAXResult; import javax.xml.transform.stream.StreamResult; import static org.easymock.EasyMock.*; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; import org.junit.Test; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; @@ -34,13 +35,13 @@ import org.xml.sax.Locator; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.oxm.AbstractMarshallerTestCase; +import org.springframework.oxm.AbstractMarshallerTests; import org.springframework.oxm.Marshaller; import org.springframework.oxm.XmlMappingException; import org.springframework.oxm.mime.MimeContainer; import org.springframework.util.FileCopyUtils; -public class Jaxb2MarshallerTest extends AbstractMarshallerTestCase { +public class Jaxb2MarshallerTests extends AbstractMarshallerTests { private static final String CONTEXT_PATH = "org.springframework.oxm.jaxb"; @@ -106,7 +107,7 @@ public class Jaxb2MarshallerTest extends AbstractMarshallerTestCase { marshaller.afterPropertiesSet(); } - @Test(expected = XmlMappingException.class) + @Test(expected = JAXBException.class) public void testInvalidContextPath() throws Exception { Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); marshaller.setContextPath("ab"); diff --git a/org.springframework.oxm/src/test/java/org/springframework/oxm/jaxb/Jaxb2UnmarshallerTest.java b/org.springframework.oxm/src/test/java/org/springframework/oxm/jaxb/Jaxb2UnmarshallerTests.java similarity index 96% rename from org.springframework.oxm/src/test/java/org/springframework/oxm/jaxb/Jaxb2UnmarshallerTest.java rename to org.springframework.oxm/src/test/java/org/springframework/oxm/jaxb/Jaxb2UnmarshallerTests.java index 2c83ece02a1..a0468483e09 100644 --- a/org.springframework.oxm/src/test/java/org/springframework/oxm/jaxb/Jaxb2UnmarshallerTest.java +++ b/org.springframework.oxm/src/test/java/org/springframework/oxm/jaxb/Jaxb2UnmarshallerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2006 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,12 +31,12 @@ import org.junit.Test; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.oxm.AbstractUnmarshallerTestCase; +import org.springframework.oxm.AbstractUnmarshallerTests; import org.springframework.oxm.Unmarshaller; import org.springframework.oxm.mime.MimeContainer; import org.springframework.util.xml.StaxUtils; -public class Jaxb2UnmarshallerTest extends AbstractUnmarshallerTestCase { +public class Jaxb2UnmarshallerTests extends AbstractUnmarshallerTests { private static final String INPUT_STRING = "" + "42"; diff --git a/org.springframework.oxm/src/test/java/org/springframework/oxm/jibx/JibxMarshallerTest.java b/org.springframework.oxm/src/test/java/org/springframework/oxm/jibx/JibxMarshallerTests.java similarity index 94% rename from org.springframework.oxm/src/test/java/org/springframework/oxm/jibx/JibxMarshallerTest.java rename to org.springframework.oxm/src/test/java/org/springframework/oxm/jibx/JibxMarshallerTests.java index 58ca7f5669a..4f3f31b1990 100644 --- a/org.springframework.oxm/src/test/java/org/springframework/oxm/jibx/JibxMarshallerTest.java +++ b/org.springframework.oxm/src/test/java/org/springframework/oxm/jibx/JibxMarshallerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2006 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,10 +25,10 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.Test; -import org.springframework.oxm.AbstractMarshallerTestCase; +import org.springframework.oxm.AbstractMarshallerTests; import org.springframework.oxm.Marshaller; -public class JibxMarshallerTest extends AbstractMarshallerTestCase { +public class JibxMarshallerTests extends AbstractMarshallerTests { @Override protected Marshaller createMarshaller() throws Exception { diff --git a/org.springframework.oxm/src/test/java/org/springframework/oxm/jibx/JibxUnmarshallerTest.java b/org.springframework.oxm/src/test/java/org/springframework/oxm/jibx/JibxUnmarshallerTests.java similarity index 88% rename from org.springframework.oxm/src/test/java/org/springframework/oxm/jibx/JibxUnmarshallerTest.java rename to org.springframework.oxm/src/test/java/org/springframework/oxm/jibx/JibxUnmarshallerTests.java index eea4f94b8cc..9db180c5f4a 100644 --- a/org.springframework.oxm/src/test/java/org/springframework/oxm/jibx/JibxUnmarshallerTest.java +++ b/org.springframework.oxm/src/test/java/org/springframework/oxm/jibx/JibxUnmarshallerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2005 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,16 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.oxm.jibx; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import org.junit.Ignore; -import org.springframework.oxm.AbstractUnmarshallerTestCase; +import org.springframework.oxm.AbstractUnmarshallerTests; import org.springframework.oxm.Unmarshaller; -public class JibxUnmarshallerTest extends AbstractUnmarshallerTestCase { +/** + * @author Arjen Poutsma + */ +public class JibxUnmarshallerTests extends AbstractUnmarshallerTests { @Override protected Unmarshaller createUnmarshaller() throws Exception { @@ -52,4 +56,5 @@ public class JibxUnmarshallerTest extends AbstractUnmarshallerTestCase { public void unmarshalPartialStaxSourceXmlStreamReader() throws Exception { // JiBX does not support reading XML fragments, hence the override here } + } diff --git a/org.springframework.oxm/src/test/java/org/springframework/oxm/jibx/JibxUtilsTest.java b/org.springframework.oxm/src/test/java/org/springframework/oxm/jibx/JibxUtilsTest.java deleted file mode 100644 index 545139a27d3..00000000000 --- a/org.springframework.oxm/src/test/java/org/springframework/oxm/jibx/JibxUtilsTest.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.oxm.jibx; - -import junit.framework.TestCase; -import org.jibx.runtime.JiBXException; -import org.jibx.runtime.ValidationException; - -public class JibxUtilsTest extends TestCase { - - public void testConvertMarshallingException() throws Exception { - assertTrue("Invalid exception conversion", - JibxUtils.convertJibxException(new JiBXException(""), true) instanceof JibxMarshallingFailureException); - } - - public void testConvertUnmarshallingException() throws Exception { - assertTrue("Invalid exception conversion", JibxUtils - .convertJibxException(new JiBXException(""), false) instanceof JibxUnmarshallingFailureException); - } - - public void testConvertValidationException() throws Exception { - assertTrue("Invalid exception conversion", JibxUtils - .convertJibxException(new ValidationException(""), true) instanceof JibxValidationFailureException); - } -} \ No newline at end of file diff --git a/org.springframework.oxm/src/test/java/org/springframework/oxm/xmlbeans/XmlBeansMarshallerTest.java b/org.springframework.oxm/src/test/java/org/springframework/oxm/xmlbeans/XmlBeansMarshallerTests.java similarity index 90% rename from org.springframework.oxm/src/test/java/org/springframework/oxm/xmlbeans/XmlBeansMarshallerTest.java rename to org.springframework.oxm/src/test/java/org/springframework/oxm/xmlbeans/XmlBeansMarshallerTests.java index 32d714dc14b..25723825298 100644 --- a/org.springframework.oxm/src/test/java/org/springframework/oxm/xmlbeans/XmlBeansMarshallerTest.java +++ b/org.springframework.oxm/src/test/java/org/springframework/oxm/xmlbeans/XmlBeansMarshallerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2005 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.oxm.xmlbeans; import java.io.ByteArrayOutputStream; @@ -23,12 +24,15 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.Test; -import org.springframework.oxm.AbstractMarshallerTestCase; +import org.springframework.oxm.AbstractMarshallerTests; import org.springframework.oxm.Marshaller; import org.springframework.samples.flight.FlightType; import org.springframework.samples.flight.FlightsDocument; -public class XmlBeansMarshallerTest extends AbstractMarshallerTestCase { +/** + * @author Arjen Poutsma + */ +public class XmlBeansMarshallerTests extends AbstractMarshallerTests { @Override protected Marshaller createMarshaller() throws Exception { @@ -57,4 +61,5 @@ public class XmlBeansMarshallerTest extends AbstractMarshallerTestCase { assertTrue("XmlBeansMarshaller does not support Flights", marshaller.supports(FlightsDocument.Flights.class)); assertTrue("XmlBeansMarshaller does not support FlightType", marshaller.supports(FlightType.class)); } + } diff --git a/org.springframework.oxm/src/test/java/org/springframework/oxm/xmlbeans/XmlBeansUnmarshallerTest.java b/org.springframework.oxm/src/test/java/org/springframework/oxm/xmlbeans/XmlBeansUnmarshallerTests.java similarity index 89% rename from org.springframework.oxm/src/test/java/org/springframework/oxm/xmlbeans/XmlBeansUnmarshallerTest.java rename to org.springframework.oxm/src/test/java/org/springframework/oxm/xmlbeans/XmlBeansUnmarshallerTests.java index b50ff9a9de8..695518e1d01 100644 --- a/org.springframework.oxm/src/test/java/org/springframework/oxm/xmlbeans/XmlBeansUnmarshallerTest.java +++ b/org.springframework.oxm/src/test/java/org/springframework/oxm/xmlbeans/XmlBeansUnmarshallerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2005 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.oxm.xmlbeans; import java.io.StringReader; @@ -22,18 +23,21 @@ import javax.xml.stream.XMLStreamReader; import javax.xml.transform.Source; import javax.xml.transform.stream.StreamSource; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.*; import org.junit.Test; -import org.springframework.oxm.AbstractUnmarshallerTestCase; +import org.springframework.oxm.AbstractUnmarshallerTests; import org.springframework.oxm.Unmarshaller; +import org.springframework.oxm.ValidationFailureException; import org.springframework.samples.flight.FlightDocument; import org.springframework.samples.flight.FlightType; import org.springframework.samples.flight.FlightsDocument; import org.springframework.util.xml.StaxUtils; -public class XmlBeansUnmarshallerTest extends AbstractUnmarshallerTestCase { +/** + * @author Arjen Poutsma + */ +public class XmlBeansUnmarshallerTests extends AbstractUnmarshallerTests { @Override protected Unmarshaller createUnmarshaller() throws Exception { @@ -78,7 +82,7 @@ public class XmlBeansUnmarshallerTest extends AbstractUnmarshallerTestCase { testFlight(flight); } - @Test(expected = XmlBeansValidationFailureException.class) + @Test(expected = ValidationFailureException.class) public void testValidate() throws Exception { ((XmlBeansMarshaller) unmarshaller).setValidating(true); String invalidInput = "" + diff --git a/org.springframework.oxm/src/test/java/org/springframework/oxm/xmlbeans/XmlBeansUtilsTest.java b/org.springframework.oxm/src/test/java/org/springframework/oxm/xmlbeans/XmlBeansUtilsTest.java deleted file mode 100644 index 9b765b1fef1..00000000000 --- a/org.springframework.oxm/src/test/java/org/springframework/oxm/xmlbeans/XmlBeansUtilsTest.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2005 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.oxm.xmlbeans; - -import junit.framework.TestCase; -import org.apache.xmlbeans.XMLStreamValidationException; -import org.apache.xmlbeans.XmlError; -import org.apache.xmlbeans.XmlException; -import org.xml.sax.SAXException; - -public class XmlBeansUtilsTest extends TestCase { - - public void testConvertXMLStreamValidationException() { - assertTrue("Invalid exception conversion", XmlBeansUtils.convertXmlBeansException( - new XMLStreamValidationException(XmlError.forMessage("")), - true) instanceof XmlBeansValidationFailureException); - - } - - public void testConvertXmlException() { - assertTrue("Invalid exception conversion", XmlBeansUtils - .convertXmlBeansException(new XmlException(""), true) instanceof XmlBeansMarshallingFailureException); - assertTrue("Invalid exception conversion", XmlBeansUtils.convertXmlBeansException(new XmlException(""), - false) instanceof XmlBeansUnmarshallingFailureException); - } - - public void testConvertSAXException() { - assertTrue("Invalid exception conversion", XmlBeansUtils - .convertXmlBeansException(new SAXException(""), true) instanceof XmlBeansMarshallingFailureException); - assertTrue("Invalid exception conversion", XmlBeansUtils.convertXmlBeansException(new SAXException(""), - false) instanceof XmlBeansUnmarshallingFailureException); - } - - public void testFallbackException() { - assertTrue("Invalid exception conversion", - XmlBeansUtils.convertXmlBeansException(new Exception(""), false) instanceof XmlBeansSystemException); - - } - -} diff --git a/org.springframework.oxm/src/test/java/org/springframework/oxm/xmlbeans/XmlOptionsFactoryBeanTest.java b/org.springframework.oxm/src/test/java/org/springframework/oxm/xmlbeans/XmlOptionsFactoryBeanTests.java similarity index 68% rename from org.springframework.oxm/src/test/java/org/springframework/oxm/xmlbeans/XmlOptionsFactoryBeanTest.java rename to org.springframework.oxm/src/test/java/org/springframework/oxm/xmlbeans/XmlOptionsFactoryBeanTests.java index 26fc31de947..70bd44b5d17 100644 --- a/org.springframework.oxm/src/test/java/org/springframework/oxm/xmlbeans/XmlOptionsFactoryBeanTest.java +++ b/org.springframework.oxm/src/test/java/org/springframework/oxm/xmlbeans/XmlOptionsFactoryBeanTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2006 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,23 +18,24 @@ package org.springframework.oxm.xmlbeans; import java.util.Collections; -import junit.framework.TestCase; import org.apache.xmlbeans.XmlOptions; +import static org.junit.Assert.*; +import org.junit.Test; -public class XmlOptionsFactoryBeanTest extends TestCase { - - private XmlOptionsFactoryBean factoryBean; +/** + * @author Arjen Poutsma + */ +public class XmlOptionsFactoryBeanTests { - protected void setUp() throws Exception { - factoryBean = new XmlOptionsFactoryBean(); - } + private XmlOptionsFactoryBean factoryBean = new XmlOptionsFactoryBean(); - public void testXmlOptionsFactoryBean() throws Exception { + @Test + public void xmlOptionsFactoryBean() throws Exception { factoryBean.setOptions(Collections.singletonMap(XmlOptions.SAVE_PRETTY_PRINT, Boolean.TRUE)); - factoryBean.afterPropertiesSet(); - XmlOptions xmlOptions = (XmlOptions) factoryBean.getObject(); + XmlOptions xmlOptions = factoryBean.getObject(); assertNotNull("No XmlOptions returned", xmlOptions); assertTrue("Option not set", xmlOptions.hasOption(XmlOptions.SAVE_PRETTY_PRINT)); assertFalse("Invalid option set", xmlOptions.hasOption(XmlOptions.LOAD_LINE_NUMBERS)); } -} \ No newline at end of file + +} diff --git a/org.springframework.oxm/src/test/java/org/springframework/oxm/xstream/XStreamMarshallerTest.java b/org.springframework.oxm/src/test/java/org/springframework/oxm/xstream/XStreamMarshallerTests.java similarity index 95% rename from org.springframework.oxm/src/test/java/org/springframework/oxm/xstream/XStreamMarshallerTest.java rename to org.springframework.oxm/src/test/java/org/springframework/oxm/xstream/XStreamMarshallerTests.java index b3393d63b29..2175b1d2d50 100644 --- a/org.springframework.oxm/src/test/java/org/springframework/oxm/xstream/XStreamMarshallerTest.java +++ b/org.springframework.oxm/src/test/java/org/springframework/oxm/xstream/XStreamMarshallerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2006 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,8 +23,8 @@ import java.io.StringWriter; import java.io.Writer; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.Map; -import java.util.Properties; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.stream.XMLEventWriter; @@ -39,10 +39,11 @@ import javax.xml.transform.stream.StreamSource; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.extended.EncodedByteArrayConverter; import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver; -import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual; -import static org.custommonkey.xmlunit.XMLAssert.assertXpathNotExists; +import static org.custommonkey.xmlunit.XMLAssert.*; import org.easymock.MockControl; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.Test; import org.w3c.dom.Document; @@ -52,7 +53,10 @@ import org.xml.sax.ContentHandler; import org.springframework.util.xml.StaxUtils; -public class XStreamMarshallerTest { +/** + * @author Arjen Poutsma + */ +public class XStreamMarshallerTests { private static final String EXPECTED_STRING = "42"; @@ -63,8 +67,8 @@ public class XStreamMarshallerTest { @Before public void createMarshaller() throws Exception { marshaller = new XStreamMarshaller(); - Properties aliases = new Properties(); - aliases.setProperty("flight", AnnotatedFlight.class.getName()); + Map aliases = new HashMap(); + aliases.put("flight", AnnotatedFlight.class); marshaller.setAliases(aliases); flight = new AnnotatedFlight(); flight.setFlightNumber(42L); diff --git a/org.springframework.oxm/src/test/java/org/springframework/oxm/xstream/XStreamUnmarshallerTest.java b/org.springframework.oxm/src/test/java/org/springframework/oxm/xstream/XStreamUnmarshallerTests.java similarity index 91% rename from org.springframework.oxm/src/test/java/org/springframework/oxm/xstream/XStreamUnmarshallerTest.java rename to org.springframework.oxm/src/test/java/org/springframework/oxm/xstream/XStreamUnmarshallerTests.java index 487362428ed..4c9f9f0cbc9 100644 --- a/org.springframework.oxm/src/test/java/org/springframework/oxm/xstream/XStreamUnmarshallerTest.java +++ b/org.springframework.oxm/src/test/java/org/springframework/oxm/xstream/XStreamUnmarshallerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2006 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,8 @@ package org.springframework.oxm.xstream; import java.io.ByteArrayInputStream; import java.io.StringReader; -import java.util.Properties; +import java.util.HashMap; +import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.stream.XMLInputFactory; @@ -35,7 +36,10 @@ import org.xml.sax.InputSource; import org.springframework.util.xml.StaxUtils; -public class XStreamUnmarshallerTest { +/** + * @author Arjen Poutsma + */ +public class XStreamUnmarshallerTests { protected static final String INPUT_STRING = "42"; @@ -44,8 +48,8 @@ public class XStreamUnmarshallerTest { @Before public void creteUnmarshaller() throws Exception { unmarshaller = new XStreamMarshaller(); - Properties aliases = new Properties(); - aliases.setProperty("flight", AnnotatedFlight.class.getName()); + Map aliases = new HashMap(); + aliases.put("flight", AnnotatedFlight.class); unmarshaller.setAliases(aliases); } diff --git a/org.springframework.oxm/src/test/java/org/springframework/oxm/xstream/XStreamUtilsTest.java b/org.springframework.oxm/src/test/java/org/springframework/oxm/xstream/XStreamUtilsTest.java deleted file mode 100644 index 3e20331f213..00000000000 --- a/org.springframework.oxm/src/test/java/org/springframework/oxm/xstream/XStreamUtilsTest.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.oxm.xstream; - -import com.thoughtworks.xstream.io.StreamException; -import com.thoughtworks.xstream.mapper.CannotResolveClassException; - -import junit.framework.TestCase; - -public class XStreamUtilsTest extends TestCase { - - public void testConvertStreamException() { - assertTrue("Invalid exception conversion", XStreamUtils.convertXStreamException( - new StreamException(new Exception()), true) instanceof XStreamMarshallingFailureException); - assertTrue("Invalid exception conversion", XStreamUtils.convertXStreamException( - new StreamException(new Exception()), false) instanceof XStreamUnmarshallingFailureException); - } - - public void testConvertCannotResolveClassException() { - assertTrue("Invalid exception conversion", XStreamUtils.convertXStreamException( - new CannotResolveClassException(""), true) instanceof XStreamMarshallingFailureException); - assertTrue("Invalid exception conversion", XStreamUtils.convertXStreamException( - new CannotResolveClassException(""), false) instanceof XStreamUnmarshallingFailureException); - } -} \ No newline at end of file