diff --git a/org.springframework.oxm/oxm.iml b/org.springframework.oxm/oxm.iml index e4111f1520..d533066117 100644 --- a/org.springframework.oxm/oxm.iml +++ b/org.springframework.oxm/oxm.iml @@ -33,7 +33,6 @@ - @@ -45,7 +44,6 @@ - @@ -112,15 +110,6 @@ - - - - - - - - - @@ -155,11 +144,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/GenericMarshaller.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/GenericMarshaller.java deleted file mode 100644 index 102adde85f..0000000000 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/GenericMarshaller.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2007 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; - -import java.lang.reflect.Method; -import java.lang.reflect.Type; - -/** - * Extension of the {@link Marshaller} interface that supports Java 5 generics. More specifically, this marshaller adds - * support for the new {@link Type} hierarchy, returned by methods such as {@link Method#getGenericParameterTypes()} and - * {@link Method#getGenericReturnType()}. - * - * @author Arjen Poutsma - * @since 3.0 - */ -public interface GenericMarshaller extends Marshaller { - - /** - * Indicates whether this marshaller can marshal instances of the supplied type. - * - * @param type the type that this marshaller is being asked if it can marshal - * @return true if this marshaller can indeed marshal instances of the supplied type; false - * otherwise - */ - boolean supports(Type type); -} diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/GenericUnmarshaller.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/GenericUnmarshaller.java deleted file mode 100644 index e98f14b3d7..0000000000 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/GenericUnmarshaller.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2007 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; - -import java.lang.reflect.Method; -import java.lang.reflect.Type; - -/** - * Extension of the {@link Unmarshaller} interface that supports Java 5 generics. More specifically, this unmarshaller - * adds support for the new {@link Type} hierarchy, returned by methods such as {@link - * Method#getGenericParameterTypes()} and {@link Method#getGenericReturnType()}. - * - * @author Arjen Poutsma - * @since 3.0 - */ -public interface GenericUnmarshaller extends Unmarshaller { - - /** - * Indicates whether this unmarshaller can unmarshal instances of the supplied type. - * - * @param type the type that this unmarshaller is being asked if it can marshal - * @return true if this unmarshaller can indeed unmarshal to the supplied type; false - * otherwise - */ - boolean supports(Type type); -} 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 60ea799485..d8b60aa121 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 @@ -46,6 +46,6 @@ public interface Marshaller { * @return true if this marshaller can indeed marshal instances of the supplied class; false * otherwise */ - boolean supports(Class clazz); + boolean supports(Class clazz); } 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 c346c16bd7..156ee9f7ad 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 @@ -44,6 +44,6 @@ public interface Unmarshaller { * @return true if this unmarshaller can indeed unmarshal to the supplied class; false * otherwise */ - boolean supports(Class clazz); + boolean supports(Class clazz); } 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 8d9447b4a9..6fe76dfde9 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 @@ -75,7 +75,9 @@ 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. + */ public static final String DEFAULT_ENCODING = "UTF-8"; private Resource[] mappingLocations; @@ -96,7 +98,9 @@ public class CastorMarshaller extends AbstractMarshaller implements Initializing private Properties namespaceMappings; - /** Returns whether the Castor {@link Unmarshaller} should ignore attributes that do not match a specific field. */ + /** + * Returns whether the Castor {@link Unmarshaller} should ignore attributes that do not match a specific field. + */ public boolean getIgnoreExtraAttributes() { return ignoreExtraAttributes; } @@ -111,7 +115,9 @@ public class CastorMarshaller extends AbstractMarshaller implements Initializing this.ignoreExtraAttributes = ignoreExtraAttributes; } - /** Returns whether the Castor {@link Unmarshaller} should ignore elements that do not match a specific field. */ + /** + * Returns whether the Castor {@link Unmarshaller} should ignore elements that do not match a specific field. + */ public boolean getIgnoreExtraElements() { return ignoreExtraElements; } @@ -126,7 +132,9 @@ public class CastorMarshaller extends AbstractMarshaller implements Initializing this.ignoreExtraElements = ignoreExtraElements; } - /** Returns whether the Castor {@link Unmarshaller} should preserve "ignorable" whitespace. */ + /** + * Returns whether the Castor {@link Unmarshaller} should preserve "ignorable" whitespace. + */ public boolean getWhitespacePreserve() { return whitespacePreserve; } @@ -140,7 +148,9 @@ public class CastorMarshaller extends AbstractMarshaller implements Initializing this.whitespacePreserve = whitespacePreserve; } - /** Returns whether this marshaller should validate in- and outgoing documents. */ + /** + * Returns whether this marshaller should validate in- and outgoing documents. + */ public boolean isValidating() { return validating; } @@ -154,7 +164,9 @@ public class CastorMarshaller extends AbstractMarshaller implements Initializing this.validating = validating; } - /** Returns the namespace mappings. Property names are interpreted as namespace prefixes; values are namespace URIs. */ + /** + * Returns the namespace mappings. Property names are interpreted as namespace prefixes; values are namespace URIs. + */ public Properties getNamespaceMappings() { return namespaceMappings; } @@ -177,12 +189,16 @@ public class CastorMarshaller extends AbstractMarshaller implements Initializing this.encoding = encoding; } - /** Sets the locations of the Castor XML Mapping files. */ + /** + * Sets the locations of the Castor XML Mapping files. + */ public void setMappingLocation(Resource mappingLocation) { mappingLocations = new Resource[]{mappingLocation}; } - /** Sets the locations of the Castor XML Mapping files. */ + /** + * Sets the locations of the Castor XML Mapping files. + */ public void setMappingLocations(Resource[] mappingLocations) { this.mappingLocations = mappingLocations; } @@ -223,8 +239,10 @@ public class CastorMarshaller extends AbstractMarshaller implements Initializing } } - /** Returns true for all classes, i.e. Castor supports arbitrary classes. */ - public boolean supports(Class clazz) { + /** + * Returns true for all classes, i.e. Castor supports arbitrary classes. + */ + public boolean supports(Class clazz) { return true; } diff --git a/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/AbstractJaxbMarshaller.java b/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/AbstractJaxbMarshaller.java deleted file mode 100644 index 5b3f18f229..0000000000 --- a/org.springframework.oxm/src/main/java/org/springframework/oxm/jaxb/AbstractJaxbMarshaller.java +++ /dev/null @@ -1,204 +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.jaxb; - -import java.util.Iterator; -import java.util.Map; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; -import javax.xml.bind.Unmarshaller; -import javax.xml.bind.ValidationEventHandler; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import org.springframework.beans.factory.InitializingBean; -import org.springframework.oxm.XmlMappingException; -import org.springframework.util.Assert; -import org.springframework.util.StringUtils; - -/** - * Abstract base class for implementations of the Marshaller and Unmarshaller interfaces that - * use JAXB. This base class is responsible for creating JAXB marshallers from a JAXBContext.

JAXB 2.0 - * added breaking API changes, so specific subclasses must be used for JAXB 1.0 and 2.0 (Jaxb1Marshaller - * and Jaxb2Marshaller respectivaly). - * - * @author Arjen Poutsma - * @see Jaxb2Marshaller - * @since 3.0 - */ -public abstract class AbstractJaxbMarshaller - implements org.springframework.oxm.Marshaller, org.springframework.oxm.Unmarshaller, InitializingBean { - - /** Logger available to subclasses. */ - protected final Log logger = LogFactory.getLog(getClass()); - - private String contextPath; - - private Map marshallerProperties; - - private Map unmarshallerProperties; - - private JAXBContext jaxbContext; - - private ValidationEventHandler validationEventHandler; - - /** Returns the JAXB Context path. */ - protected String getContextPath() { - return contextPath; - } - - /** Sets the JAXB Context path. */ - public void setContextPath(String contextPath) { - Assert.notNull(contextPath, "'contextPath' must not be null"); - this.contextPath = contextPath; - } - - /** - * Sets 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"); - this.contextPath = StringUtils.arrayToDelimitedString(contextPaths, ":"); - } - - /** - * 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 javax.xml.bind.Marshaller#setProperty(String,Object) - * @see javax.xml.bind.Marshaller#JAXB_ENCODING - * @see javax.xml.bind.Marshaller#JAXB_FORMATTED_OUTPUT - * @see javax.xml.bind.Marshaller#JAXB_NO_NAMESPACE_SCHEMA_LOCATION - * @see javax.xml.bind.Marshaller#JAXB_SCHEMA_LOCATION - */ - public void setMarshallerProperties(Map properties) { - this.marshallerProperties = properties; - } - - /** - * 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) - */ - public void setUnmarshallerProperties(Map properties) { - this.unmarshallerProperties = properties; - } - - /** - * 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 - */ - public void setValidationEventHandler(ValidationEventHandler validationEventHandler) { - this.validationEventHandler = validationEventHandler; - } - - /** Returns the {@link JAXBContext} created in {@link #afterPropertiesSet()}. */ - public JAXBContext getJaxbContext() { - return jaxbContext; - } - - public final void afterPropertiesSet() throws Exception { - try { - jaxbContext = createJaxbContext(); - } - catch (JAXBException ex) { - throw convertJaxbException(ex); - } - } - - /** - * 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. - * - * @param ex JAXBException that occured - * @return the corresponding XmlMappingException instance - * @see JaxbUtils#convertJaxbException - */ - protected XmlMappingException convertJaxbException(JAXBException ex) { - return JaxbUtils.convertJaxbException(ex); - } - - /** Returns a newly created JAXB marshaller. JAXB marshallers are not necessarily thread safe. */ - protected Marshaller createMarshaller() { - try { - Marshaller marshaller = jaxbContext.createMarshaller(); - if (marshallerProperties != null) { - for (Iterator iterator = marshallerProperties.keySet().iterator(); iterator.hasNext();) { - String name = (String) iterator.next(); - marshaller.setProperty(name, marshallerProperties.get(name)); - } - } - if (validationEventHandler != null) { - marshaller.setEventHandler(validationEventHandler); - } - initJaxbMarshaller(marshaller); - return marshaller; - } - catch (JAXBException ex) { - throw convertJaxbException(ex); - } - } - - /** Returns a newly created JAXB unmarshaller. JAXB unmarshallers are not necessarily thread safe. */ - protected Unmarshaller createUnmarshaller() { - try { - Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); - if (unmarshallerProperties != null) { - for (Iterator iterator = unmarshallerProperties.keySet().iterator(); iterator.hasNext();) { - String name = (String) iterator.next(); - unmarshaller.setProperty(name, unmarshallerProperties.get(name)); - } - } - if (validationEventHandler != null) { - unmarshaller.setEventHandler(validationEventHandler); - } - 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.

Default - * implementation does nothing. - */ - protected void initJaxbMarshaller(Marshaller marshaller) throws JAXBException { - } - - /** - * Template method that can overridden by concrete JAXB marshallers for custom initialization behavior. Gets called - * after creation of JAXB Unmarshaller, and after the respective properties have been set.

Default - * implementation does nothing. - */ - protected void initJaxbUnmarshaller(Unmarshaller unmarshaller) throws JAXBException { - } - - /** Template method that returns a newly created JAXB context. Called from afterPropertiesSet(). */ - protected abstract JAXBContext createJaxbContext() throws Exception; -} 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 6b7565b48f..73a4e1093b 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 @@ -16,24 +16,16 @@ package org.springframework.oxm.jaxb; -import java.awt.*; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; -import java.lang.reflect.GenericArrayType; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.math.BigDecimal; -import java.math.BigInteger; import java.net.URI; import java.net.URISyntaxException; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.Arrays; -import java.util.Calendar; -import java.util.Date; import java.util.Map; import java.util.UUID; import javax.activation.DataHandler; @@ -44,14 +36,11 @@ import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; +import javax.xml.bind.ValidationEventHandler; import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.adapters.XmlAdapter; import javax.xml.bind.attachment.AttachmentMarshaller; import javax.xml.bind.attachment.AttachmentUnmarshaller; -import javax.xml.datatype.Duration; -import javax.xml.datatype.XMLGregorianCalendar; -import javax.xml.namespace.QName; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLEventWriter; import javax.xml.stream.XMLStreamReader; @@ -62,15 +51,16 @@ import javax.xml.transform.sax.SAXSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; 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.GenericMarshaller; -import org.springframework.oxm.GenericUnmarshaller; import org.springframework.oxm.XmlMappingException; import org.springframework.oxm.mime.MimeContainer; import org.springframework.oxm.mime.MimeMarshaller; @@ -84,25 +74,43 @@ import org.springframework.util.xml.SaxUtils; import org.springframework.util.xml.StaxUtils; /** - * Implementation of the Marshaller interface for JAXB 2.0.

The typical usage will be to set either - * the contextPath or the classesToBeBound property on this bean, possibly customize the - * marshaller and unmarshaller by setting properties, schemas, adapters, and listeners, and to refer to it. + * Implementation of the Marshaller interface for JAXB 2.0. + * + *

The typical usage will be to set either the contextPath or the classesToBeBound property + * on this bean, possibly customize the marshaller and unmarshaller by setting properties, schemas, adapters, and + * listeners, and to refer to it. * * @author Arjen Poutsma * @see #setContextPath(String) * @see #setClassesToBeBound(Class[]) - * @see #setJaxbContextProperties(java.util.Map) - * @see #setMarshallerProperties(java.util.Map) - * @see #setUnmarshallerProperties(java.util.Map) - * @see #setSchema(org.springframework.core.io.Resource) - * @see #setSchemas(org.springframework.core.io.Resource[]) - * @see #setMarshallerListener(javax.xml.bind.Marshaller.Listener) + * @see #setJaxbContextProperties(Map) + * @see #setMarshallerProperties(Map) + * @see #setUnmarshallerProperties(Map) + * @see #setSchema(Resource) + * @see #setSchemas(Resource[]) + * @see #setMarshallerListener(Marshaller.Listener) * @see #setUnmarshallerListener(javax.xml.bind.Unmarshaller.Listener) - * @see #setAdapters(javax.xml.bind.annotation.adapters.XmlAdapter[]) + * @see #setAdapters(XmlAdapter[]) * @since 3.0 */ -public class Jaxb2Marshaller extends AbstractJaxbMarshaller - implements MimeMarshaller, MimeUnmarshaller, GenericMarshaller, GenericUnmarshaller, BeanClassLoaderAware { +public class Jaxb2Marshaller implements MimeMarshaller, MimeUnmarshaller, BeanClassLoaderAware, InitializingBean { + + private static final String CID = "cid:"; + + /** + * Logger available to subclasses. + */ + private static final Log logger = LogFactory.getLog(Jaxb2Marshaller.class); + + private String contextPath; + + private Map marshallerProperties; + + private Map unmarshallerProperties; + + private JAXBContext jaxbContext; + + private ValidationEventHandler validationEventHandler; private ClassLoader classLoader; @@ -136,6 +144,23 @@ public class Jaxb2Marshaller extends AbstractJaxbMarshaller this.adapters = adapters; } + /** + * Sets the JAXB Context path. + */ + public void setContextPath(String contextPath) { + Assert.hasText(contextPath, "'contextPath' must not be null"); + this.contextPath = contextPath; + } + + /** + * Sets 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"); + this.contextPath = StringUtils.arrayToDelimitedString(contextPaths, ":"); + } + /** * Sets the list of java classes to be recognized by a newly created JAXBContext. Setting this property or * contextPath is required. @@ -154,7 +179,9 @@ public class Jaxb2Marshaller extends AbstractJaxbMarshaller this.jaxbContextProperties = jaxbContextProperties; } - /** Sets the Marshaller.Listener to be registered with the JAXB Marshaller. */ + /** + * Sets the Marshaller.Listener to be registered with the JAXB Marshaller. + */ public void setMarshallerListener(Marshaller.Listener marshallerListener) { this.marshallerListener = marshallerListener; } @@ -177,110 +204,80 @@ public class Jaxb2Marshaller extends AbstractJaxbMarshaller this.schemaLanguage = schemaLanguage; } - /** Sets the schema resource to use for validation. */ + /** + * Sets the schema resource to use for validation. + */ public void setSchema(Resource schemaResource) { schemaResources = new Resource[]{schemaResource}; } - /** Sets the schema resources to use for validation. */ + /** + * Sets the schema resources to use for validation. + */ public void setSchemas(Resource[] schemaResources) { this.schemaResources = schemaResources; } - /** Sets the Unmarshaller.Listener to be registered with the JAXB Unmarshaller. */ + /** + * Sets the Unmarshaller.Listener to be registered with the JAXB Unmarshaller. + */ public void setUnmarshallerListener(Unmarshaller.Listener unmarshallerListener) { this.unmarshallerListener = unmarshallerListener; } - public boolean supports(Type type) { - if (type instanceof Class) { - return supportsInternal((Class) type, true); - } - else if (type instanceof ParameterizedType) { - ParameterizedType parameterizedType = (ParameterizedType) type; - if (JAXBElement.class.equals(parameterizedType.getRawType())) { - Assert.isTrue(parameterizedType.getActualTypeArguments().length == 1, - "Invalid amount of parameterized types in JAXBElement"); - Type typeArgument = parameterizedType.getActualTypeArguments()[0]; - if (typeArgument instanceof Class) { - Class clazz = (Class) typeArgument; - if (!isPrimitiveType(clazz) && !isStandardType(clazz) && !supportsInternal(clazz, false)) { - return false; - } - } - else if (typeArgument instanceof GenericArrayType) { - GenericArrayType genericArrayType = (GenericArrayType) typeArgument; - return genericArrayType.getGenericComponentType().equals(Byte.TYPE); - } - else if (!supports(typeArgument)) { - return false; - } - return true; - } - } - return false; + /** + * 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 + */ + public void setMarshallerProperties(Map properties) { + this.marshallerProperties = properties; } - private boolean isPrimitiveType(Class clazz) { - return (Boolean.class.equals(clazz) || Byte.class.equals(clazz) || Short.class.equals(clazz) || - Integer.class.equals(clazz) || Long.class.equals(clazz) || Float.class.equals(clazz) || - Double.class.equals(clazz) || byte[].class.equals(clazz)); + /** + * 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) + */ + public void setUnmarshallerProperties(Map properties) { + this.unmarshallerProperties = properties; } - private boolean isStandardType(Class clazz) { - return (String.class.equals(clazz) || BigInteger.class.equals(clazz) || BigDecimal.class.equals(clazz) || - Calendar.class.isAssignableFrom(clazz) || Date.class.isAssignableFrom(clazz) || - QName.class.equals(clazz) || URI.class.equals(clazz) || - XMLGregorianCalendar.class.isAssignableFrom(clazz) || Duration.class.isAssignableFrom(clazz) || - Object.class.equals(clazz) || Image.class.isAssignableFrom(clazz) || DataHandler.class.equals(clazz) || - Source.class.isAssignableFrom(clazz) || UUID.class.equals(clazz)); + /** + * 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 + */ + public void setValidationEventHandler(ValidationEventHandler validationEventHandler) { + this.validationEventHandler = validationEventHandler; } - public boolean supports(Class clazz) { - return supportsInternal(clazz, true); - } - - private boolean supportsInternal(Class clazz, boolean checkForXmlRootElement) { - if (checkForXmlRootElement && clazz.getAnnotation(XmlRootElement.class) == null) { - return false; + public final void afterPropertiesSet() throws Exception { + if (StringUtils.hasLength(contextPath) && !ObjectUtils.isEmpty(classesToBeBound)) { + throw new IllegalArgumentException("specify either contextPath or classesToBeBound property; not both"); } - if (clazz.getAnnotation(XmlType.class) == null) { - return false; + try { + jaxbContext = createJaxbContext(); } - if (StringUtils.hasLength(getContextPath())) { - String className = ClassUtils.getQualifiedName(clazz); - int lastDotIndex = className.lastIndexOf('.'); - if (lastDotIndex == -1) { - return false; - } - String packageName = className.substring(0, lastDotIndex); - String[] contextPaths = StringUtils.tokenizeToStringArray(getContextPath(), ":"); - for (String contextPath : contextPaths) { - if (contextPath.equals(packageName)) { - return true; - } - } - return false; + catch (JAXBException ex) { + throw convertJaxbException(ex); } - else if (!ObjectUtils.isEmpty(classesToBeBound)) { - return Arrays.asList(classesToBeBound).contains(clazz); - } - return false; } /* - * JAXBContext - */ + * JAXBContext + */ - @Override protected JAXBContext createJaxbContext() throws Exception { - if (JaxbUtils.getJaxbVersion() < JaxbUtils.JAXB_2) { - throw new IllegalStateException( - "Cannot use Jaxb2Marshaller in combination with JAXB 1.0. Use Jaxb1Marshaller instead."); - } - if (StringUtils.hasLength(getContextPath()) && !ObjectUtils.isEmpty(classesToBeBound)) { - throw new IllegalArgumentException("specify either contextPath or classesToBeBound property; not both"); - } if (!ObjectUtils.isEmpty(schemaResources)) { if (logger.isDebugEnabled()) { logger.debug( @@ -288,7 +285,7 @@ public class Jaxb2Marshaller extends AbstractJaxbMarshaller } schema = loadSchema(schemaResources, schemaLanguage); } - if (StringUtils.hasLength(getContextPath())) { + if (StringUtils.hasLength(contextPath)) { return createJaxbContextFromContextPath(); } else if (!ObjectUtils.isEmpty(classesToBeBound)) { @@ -299,6 +296,41 @@ public class Jaxb2Marshaller extends AbstractJaxbMarshaller } } + private JAXBContext createJaxbContextFromContextPath() throws JAXBException { + if (logger.isInfoEnabled()) { + logger.info("Creating JAXBContext with context path [" + contextPath + "]"); + } + if (jaxbContextProperties != null) { + if (classLoader != null) { + return JAXBContext.newInstance(contextPath, classLoader, jaxbContextProperties); + } + else { + return JAXBContext.newInstance(contextPath, ClassUtils.getDefaultClassLoader(), jaxbContextProperties); + } + } + else { + if (classLoader != null) { + return JAXBContext.newInstance(contextPath, classLoader); + } + else { + return JAXBContext.newInstance(contextPath); + } + } + } + + private JAXBContext createJaxbContextFromClasses() throws JAXBException { + if (logger.isInfoEnabled()) { + logger.info("Creating JAXBContext with classes to be bound [" + + StringUtils.arrayToCommaDelimitedString(classesToBeBound) + "]"); + } + if (jaxbContextProperties != null) { + return JAXBContext.newInstance(classesToBeBound, jaxbContextProperties); + } + else { + return JAXBContext.newInstance(classesToBeBound); + } + } + private Schema loadSchema(Resource[] resources, String schemaLanguage) throws IOException, SAXException { Assert.notEmpty(resources, "No resources given"); Assert.hasLength(schemaLanguage, "No schema language provided"); @@ -315,44 +347,65 @@ public class Jaxb2Marshaller extends AbstractJaxbMarshaller return schemaFactory.newSchema(schemaSources); } - private JAXBContext createJaxbContextFromContextPath() throws JAXBException { - if (logger.isInfoEnabled()) { - logger.info("Creating JAXBContext with context path [" + getContextPath() + "]"); + public boolean supports(Class clazz) { + if (JAXBElement.class.isAssignableFrom(clazz)) { + return true; } - if (jaxbContextProperties != null) { - if (classLoader != null) { - return JAXBContext.newInstance(getContextPath(), classLoader, jaxbContextProperties); - } - else { - return JAXBContext - .newInstance(getContextPath(), ClassUtils.getDefaultClassLoader(), jaxbContextProperties); + else if (clazz.getAnnotation(XmlRootElement.class) != null) { + return true; + } + if (StringUtils.hasLength(contextPath)) { + String packageName = ClassUtils.getPackageName(clazz); + String[] contextPaths = StringUtils.tokenizeToStringArray(contextPath, ":"); + for (String contextPath : contextPaths) { + if (contextPath.equals(packageName)) { + return true; + } } + return false; } - else { - return classLoader != null ? JAXBContext.newInstance(getContextPath(), classLoader) : - JAXBContext.newInstance(getContextPath()); - } - } - - private JAXBContext createJaxbContextFromClasses() throws JAXBException { - if (logger.isInfoEnabled()) { - logger.info("Creating JAXBContext with classes to be bound [" + - StringUtils.arrayToCommaDelimitedString(classesToBeBound) + "]"); - } - if (jaxbContextProperties != null) { - return JAXBContext.newInstance(classesToBeBound, jaxbContextProperties); - } - else { - return JAXBContext.newInstance(classesToBeBound); + else if (!ObjectUtils.isEmpty(classesToBeBound)) { + return Arrays.asList(classesToBeBound).contains(clazz); } + return false; } /* - * Marshaller/Unmarshaller - */ + * Marshalling + */ - @Override + /** + * 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); } @@ -366,25 +419,6 @@ public class Jaxb2Marshaller extends AbstractJaxbMarshaller } } - @Override - protected void initJaxbUnmarshaller(Unmarshaller unmarshaller) throws JAXBException { - if (schema != null) { - unmarshaller.setSchema(schema); - } - if (unmarshallerListener != null) { - unmarshaller.setListener(unmarshallerListener); - } - if (adapters != null) { - for (XmlAdapter adapter : adapters) { - unmarshaller.setAdapter(adapter); - } - } - } - - /* - * Marshalling - */ - public void marshal(Object graph, Result result) throws XmlMappingException { marshal(graph, result, null); } @@ -424,8 +458,53 @@ public class Jaxb2Marshaller extends AbstractJaxbMarshaller } /* - * Unmarshalling - */ + * Unmarshalling + */ + + /** + * Returns a newly created JAXB unmarshaller. JAXB unmarshallers are not necessarily thread safe. + */ + private Unmarshaller createUnmarshaller() { + try { + Unmarshaller unmarshaller = 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. + * + *

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 (unmarshallerProperties != null) { + for (String name : unmarshallerProperties.keySet()) { + unmarshaller.setProperty(name, unmarshallerProperties.get(name)); + } + } + if (validationEventHandler != null) { + unmarshaller.setEventHandler(validationEventHandler); + } + if (schema != null) { + unmarshaller.setSchema(schema); + } + if (unmarshallerListener != null) { + unmarshaller.setListener(unmarshallerListener); + } + if (adapters != null) { + for (XmlAdapter adapter : adapters) { + unmarshaller.setAdapter(adapter); + } + } + } public Object unmarshal(Source source) throws XmlMappingException { return unmarshal(source, null); @@ -465,9 +544,22 @@ public class Jaxb2Marshaller extends AbstractJaxbMarshaller } } + /** + * 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. + * + * @param ex JAXBException that occured + * @return the corresponding XmlMappingException instance + * @see org.springframework.oxm.jaxb.JaxbUtils#convertJaxbException + */ + protected XmlMappingException convertJaxbException(JAXBException ex) { + return JaxbUtils.convertJaxbException(ex); + } + /* - * Inner classes - */ + * Inner classes + */ private static class Jaxb2AttachmentMarshaller extends AttachmentMarshaller { @@ -499,7 +591,7 @@ public class Jaxb2Marshaller extends AbstractJaxbMarshaller catch (UnsupportedEncodingException e) { // ignore } - return "cid:" + contentId; + return CID + contentId; } private String getHost(String elementNamespace, DataHandler dataHandler) { @@ -547,8 +639,8 @@ public class Jaxb2Marshaller extends AbstractJaxbMarshaller @Override public DataHandler getAttachmentAsDataHandler(String contentId) { - if (contentId.startsWith("cid:")) { - contentId = contentId.substring("cid:".length()); + if (contentId.startsWith(CID)) { + contentId = contentId.substring(CID.length()); try { contentId = URLDecoder.decode(contentId, "UTF-8"); } @@ -566,9 +658,9 @@ public class Jaxb2Marshaller extends AbstractJaxbMarshaller } } - /* - * DataSource that wraps around a byte array - */ + /** + * DataSource that wraps around a byte array. + */ private static class ByteArrayDataSource implements DataSource { private byte[] data; 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 index 9946a73d45..902be90db0 100644 --- 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 @@ -21,7 +21,6 @@ import javax.xml.bind.UnmarshalException; import javax.xml.bind.ValidationException; import org.springframework.oxm.XmlMappingException; -import org.springframework.util.ClassUtils; /** * Generic utility methods for working with JAXB. Mainly for internal use within the framework. @@ -31,35 +30,6 @@ import org.springframework.util.ClassUtils; */ public abstract class JaxbUtils { - public static final int JAXB_1 = 0; - - public static final int JAXB_2 = 1; - - private static final String JAXB_2_CLASS_NAME = "javax.xml.bind.Binder"; - - private static int jaxbVersion = JAXB_1; - - static { - try { - ClassUtils.forName(JAXB_2_CLASS_NAME); - jaxbVersion = JAXB_2; - } - catch (ClassNotFoundException ex1) { - // leave JAXB 1 as default - } - } - - /** - * Gets the major JAXB version. This means we can do things like if (getJaxbVersion() <= JAXB_2). - * - * @return a code comparable to the JAXP_XX codes in this class - * @see #JAXB_1 - * @see #JAXB_2 - */ - public static int getJaxbVersion() { - return jaxbVersion; - } - /** * Converts the given JAXBException to an appropriate exception from the * org.springframework.oxm hierarchy. 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 f15bea3478..1cfcffb0ae 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 @@ -88,27 +88,37 @@ public class JibxMarshaller extends AbstractMarshaller implements InitializingBe private Boolean standalone; - /** Sets the optional binding name for this instance. */ + /** + * Sets the optional binding name for this instance. + */ public void setBindingName(String bindingName) { this.bindingName = bindingName; } - /** Sets the target class for this instance. This property is required. */ + /** + * Sets the target class for this instance. This property is required. + */ public void setTargetClass(Class targetClass) { this.targetClass = targetClass; } - /** Sets the number of nesting indent spaces. Default is -1, i.e. no indentation. */ + /** + * Sets 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. */ + /** + * Sets 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. */ + /** + * Sets the document standalone flag for marshalling. By default, this flag is not present. + */ public void setStandalone(Boolean standalone) { this.standalone = standalone; } @@ -136,7 +146,7 @@ public class JibxMarshaller extends AbstractMarshaller implements InitializingBe } } - public boolean supports(Class clazz) { + public boolean supports(Class clazz) { Assert.notNull(clazz, "'clazz' must not be null"); String[] mappedClasses = bindingFactory.getMappedClasses(); String className = clazz.getName(); 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 cf25a21569..05a7aecb26 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 @@ -55,7 +55,9 @@ public class XmlBeansMarshaller extends AbstractMarshaller { private boolean validating = false; - /** Returns the XmlOptions. */ + /** + * Returns the XmlOptions. + */ public XmlOptions getXmlOptions() { return xmlOptions; } @@ -69,18 +71,24 @@ public class XmlBeansMarshaller extends AbstractMarshaller { this.xmlOptions = xmlOptions; } - /** Returns whether this marshaller should validate in- and outgoing documents. */ + /** + * Returns whether this marshaller should validate in- and outgoing documents. + */ public boolean isValidating() { return validating; } - /** Sets whether this marshaller should validate in- and outgoing documents. Default is false. */ + /** + * Sets 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}. */ - public boolean supports(Class clazz) { + /** + * Returns true if the given class is an implementation of {@link XmlObject}. + */ + public boolean supports(Class clazz) { return XmlObject.class.isAssignableFrom(clazz); } diff --git a/org.springframework.oxm/src/test/java/org/springframework/oxm/jaxb/AbstractJaxbMarshallerTestCase.java b/org.springframework.oxm/src/test/java/org/springframework/oxm/jaxb/AbstractJaxbMarshallerTestCase.java deleted file mode 100644 index 3e7895463f..0000000000 --- a/org.springframework.oxm/src/test/java/org/springframework/oxm/jaxb/AbstractJaxbMarshallerTestCase.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.jaxb; - -import javax.xml.transform.sax.SAXResult; - -import org.easymock.MockControl; -import org.xml.sax.ContentHandler; - -import org.springframework.oxm.AbstractMarshallerTestCase; - -public abstract class AbstractJaxbMarshallerTestCase extends AbstractMarshallerTestCase { - - public void testMarshalSaxResult() throws Exception { - MockControl handlerControl = MockControl.createStrictControl(ContentHandler.class); - ContentHandler handlerMock = (ContentHandler) handlerControl.getMock(); - handlerMock.setDocumentLocator(null); - handlerControl.setMatcher(MockControl.ALWAYS_MATCHER); - handlerMock.startDocument(); - handlerMock.startPrefixMapping("", "http://samples.springframework.org/flight"); - handlerMock.startElement("http://samples.springframework.org/flight", "flights", "flights", null); - handlerControl.setMatcher(MockControl.ALWAYS_MATCHER); - handlerMock.startElement("http://samples.springframework.org/flight", "flight", "flight", null); - handlerControl.setMatcher(MockControl.ALWAYS_MATCHER); - handlerMock.startElement("http://samples.springframework.org/flight", "number", "number", null); - handlerControl.setMatcher(MockControl.ALWAYS_MATCHER); - handlerMock.characters(new char[]{'4', '2'}, 0, 2); - handlerControl.setMatcher(MockControl.ALWAYS_MATCHER); - handlerMock.endElement("http://samples.springframework.org/flight", "number", "number"); - handlerMock.endElement("http://samples.springframework.org/flight", "flight", "flight"); - handlerMock.endElement("http://samples.springframework.org/flight", "flights", "flights"); - handlerMock.endPrefixMapping(""); - handlerMock.endDocument(); - - handlerControl.replay(); - SAXResult result = new SAXResult(handlerMock); - marshaller.marshal(flights, result); - handlerControl.verify(); - } - - -} 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/Jaxb2MarshallerTest.java index cccf427f3c..6b3624426b 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/Jaxb2MarshallerTest.java @@ -16,153 +16,78 @@ package org.springframework.oxm.jaxb; -import java.awt.*; -import java.io.ByteArrayOutputStream; import java.io.StringWriter; import java.lang.reflect.Method; -import java.lang.reflect.Type; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.net.URI; -import java.util.Calendar; import java.util.Collections; -import java.util.Date; -import java.util.UUID; import javax.activation.DataHandler; import javax.activation.FileDataSource; -import javax.xml.bind.JAXBElement; -import javax.xml.datatype.Duration; -import javax.xml.datatype.XMLGregorianCalendar; -import javax.xml.namespace.QName; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.stream.XMLEventWriter; -import javax.xml.stream.XMLOutputFactory; -import javax.xml.stream.XMLStreamWriter; import javax.xml.transform.Result; -import javax.xml.transform.Source; -import javax.xml.transform.dom.DOMResult; import javax.xml.transform.sax.SAXResult; -import javax.xml.transform.stax.StAXResult; import javax.xml.transform.stream.StreamResult; -import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual; import static org.easymock.EasyMock.*; -import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import org.junit.Before; import org.junit.Test; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Text; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; 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.Marshaller; import org.springframework.oxm.XmlMappingException; import org.springframework.oxm.mime.MimeContainer; import org.springframework.util.FileCopyUtils; -import org.springframework.util.xml.StaxUtils; -public class Jaxb2MarshallerTest { +public class Jaxb2MarshallerTest extends AbstractMarshallerTestCase { private static final String CONTEXT_PATH = "org.springframework.oxm.jaxb"; - private static final String EXPECTED_STRING = - "" + - "42"; - private Jaxb2Marshaller marshaller; private Flights flights; - @Before - public void createMarshaller() throws Exception { + @Override + public Marshaller createMarshaller() throws Exception { marshaller = new Jaxb2Marshaller(); marshaller.setContextPath(CONTEXT_PATH); marshaller.afterPropertiesSet(); + return marshaller; + } + + @Override + protected Object createFlights() { FlightType flight = new FlightType(); flight.setNumber(42L); flights = new Flights(); flights.getFlight().add(flight); + return flights; } @Test - public void marshalDOMResult() throws Exception { - DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder(); - Document document = builder.newDocument(); - DOMResult domResult = new DOMResult(document); - marshaller.marshal(flights, domResult); - Document expected = builder.newDocument(); - Element flightsElement = expected.createElementNS("http://samples.springframework.org/flight", "tns:flights"); - expected.appendChild(flightsElement); - Element flightElement = expected.createElementNS("http://samples.springframework.org/flight", "tns:flight"); - flightsElement.appendChild(flightElement); - Element numberElement = expected.createElementNS("http://samples.springframework.org/flight", "tns:number"); - flightElement.appendChild(numberElement); - Text text = expected.createTextNode("42"); - numberElement.appendChild(text); - assertXMLEqual("Marshaller writes invalid DOMResult", expected, document); - } + public void marshalSAXResult() throws Exception { + ContentHandler handlerMock = createStrictMock(ContentHandler.class); + handlerMock.setDocumentLocator(isA(Locator.class)); + handlerMock.startDocument(); + handlerMock.startPrefixMapping("", "http://samples.springframework.org/flight"); + handlerMock.startElement(eq("http://samples.springframework.org/flight"), eq("flights"), eq("flights"), + isA(Attributes.class)); + handlerMock.startElement(eq("http://samples.springframework.org/flight"), eq("flight"), eq("flight"), + isA(Attributes.class)); + handlerMock.startElement(eq("http://samples.springframework.org/flight"), eq("number"), eq("number"), + isA(Attributes.class)); + handlerMock.characters(isA(char[].class), eq(0), eq(2)); + handlerMock.endElement("http://samples.springframework.org/flight", "number", "number"); + handlerMock.endElement("http://samples.springframework.org/flight", "flight", "flight"); + handlerMock.endElement("http://samples.springframework.org/flight", "flights", "flights"); + handlerMock.endPrefixMapping(""); + handlerMock.endDocument(); + replay(handlerMock); - @Test - public void marshalStreamResultWriter() throws Exception { - StringWriter writer = new StringWriter(); - StreamResult result = new StreamResult(writer); + SAXResult result = new SAXResult(handlerMock); marshaller.marshal(flights, result); - assertXMLEqual("Marshaller writes invalid StreamResult", EXPECTED_STRING, writer.toString()); - } - - @Test - public void marshalStreamResultOutputStream() throws Exception { - ByteArrayOutputStream os = new ByteArrayOutputStream(); - StreamResult result = new StreamResult(os); - marshaller.marshal(flights, result); - assertXMLEqual("Marshaller writes invalid StreamResult", EXPECTED_STRING, - new String(os.toByteArray(), "UTF-8")); - } - - @Test - public void marshalStaxResultXMLStreamWriter() throws Exception { - XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); - StringWriter writer = new StringWriter(); - XMLStreamWriter streamWriter = outputFactory.createXMLStreamWriter(writer); - Result result = StaxUtils.createStaxResult(streamWriter); - marshaller.marshal(flights, result); - assertXMLEqual("Marshaller writes invalid StreamResult", EXPECTED_STRING, writer.toString()); - } - - @Test - public void marshalStaxResultXMLEventWriter() throws Exception { - XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); - StringWriter writer = new StringWriter(); - XMLEventWriter eventWriter = outputFactory.createXMLEventWriter(writer); - Result result = StaxUtils.createStaxResult(eventWriter); - marshaller.marshal(flights, result); - assertXMLEqual("Marshaller writes invalid StreamResult", EXPECTED_STRING, writer.toString()); - } - - @Test - public void marshalStaxResultXMLStreamWriterJaxp14() throws Exception { - XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); - StringWriter writer = new StringWriter(); - XMLStreamWriter streamWriter = outputFactory.createXMLStreamWriter(writer); - StAXResult result = new StAXResult(streamWriter); - marshaller.marshal(flights, result); - assertXMLEqual("Marshaller writes invalid StreamResult", EXPECTED_STRING, writer.toString()); - } - - @Test - public void marshalStaxResultXMLEventWriterJaxp14() throws Exception { - XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); - StringWriter writer = new StringWriter(); - XMLEventWriter eventWriter = outputFactory.createXMLEventWriter(writer); - StAXResult result = new StAXResult(eventWriter); - marshaller.marshal(flights, result); - assertXMLEqual("Marshaller writes invalid StreamResult", EXPECTED_STRING, writer.toString()); + verify(handlerMock); } @Test @@ -170,7 +95,8 @@ public class Jaxb2MarshallerTest { Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); marshaller.setContextPath(CONTEXT_PATH); marshaller.setMarshallerProperties( - Collections.singletonMap(javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE)); + Collections.singletonMap(javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT, + Boolean.TRUE)); marshaller.afterPropertiesSet(); } @@ -197,43 +123,13 @@ public class Jaxb2MarshallerTest { marshaller.marshal(flights, result); } - @Test - public void marshalSaxResult() throws Exception { - ContentHandler handlerMock = createStrictMock(ContentHandler.class); - handlerMock.setDocumentLocator(isA(Locator.class)); - handlerMock.startDocument(); - handlerMock.startPrefixMapping("", "http://samples.springframework.org/flight"); - handlerMock.startElement(eq("http://samples.springframework.org/flight"), eq("flights"), eq("flights"), - isA(Attributes.class)); - handlerMock.startElement(eq("http://samples.springframework.org/flight"), eq("flight"), eq("flight"), - isA(Attributes.class)); - handlerMock.startElement(eq("http://samples.springframework.org/flight"), eq("number"), eq("number"), - isA(Attributes.class)); - handlerMock.characters(isA(char[].class), eq(0), eq(2)); - handlerMock.endElement("http://samples.springframework.org/flight", "number", "number"); - handlerMock.endElement("http://samples.springframework.org/flight", "flight", "flight"); - handlerMock.endElement("http://samples.springframework.org/flight", "flights", "flights"); - handlerMock.endPrefixMapping(""); - handlerMock.endDocument(); - replay(handlerMock); - - SAXResult result = new SAXResult(handlerMock); - marshaller.marshal(flights, result); - verify(handlerMock); - } - @Test public void supportsContextPath() throws Exception { Method createFlights = ObjectFactory.class.getDeclaredMethod("createFlights"); - assertTrue("Jaxb2Marshaller does not support Flights", - marshaller.supports(createFlights.getGenericReturnType())); + assertTrue("Jaxb2Marshaller does not support Flights", marshaller.supports(createFlights.getReturnType())); Method createFlight = ObjectFactory.class.getDeclaredMethod("createFlight", FlightType.class); assertTrue("Jaxb2Marshaller does not support JAXBElement", - marshaller.supports(createFlight.getGenericReturnType())); - assertFalse("Jaxb2Marshaller supports non-parameterized JAXBElement", marshaller.supports(JAXBElement.class)); - JAXBElement testElement = - new JAXBElement(new QName("something"), Jaxb2MarshallerTest.class, null, this); - assertFalse("Jaxb2Marshaller supports wrong JAXBElement", marshaller.supports(testElement.getClass())); + marshaller.supports(createFlight.getReturnType())); } @Test @@ -242,39 +138,10 @@ public class Jaxb2MarshallerTest { marshaller.setClassesToBeBound(new Class[]{Flights.class, FlightType.class}); marshaller.afterPropertiesSet(); Method createFlights = ObjectFactory.class.getDeclaredMethod("createFlights"); - assertTrue("Jaxb2Marshaller does not support Flights", - marshaller.supports(createFlights.getGenericReturnType())); + assertTrue("Jaxb2Marshaller does not support Flights", marshaller.supports(createFlights.getReturnType())); Method createFlight = ObjectFactory.class.getDeclaredMethod("createFlight", FlightType.class); assertTrue("Jaxb2Marshaller does not support JAXBElement", - marshaller.supports(createFlight.getGenericReturnType())); - assertFalse("Jaxb2Marshaller supports non-parameterized JAXBElement", marshaller.supports(JAXBElement.class)); - JAXBElement testElement = - new JAXBElement(new QName("something"), Jaxb2MarshallerTest.class, null, this); - assertFalse("Jaxb2Marshaller supports wrong JAXBElement", marshaller.supports(testElement.getClass())); - } - - @Test - public void supportsPrimitives() throws Exception { - Method primitives = getClass() - .getDeclaredMethod("primitives", JAXBElement.class, JAXBElement.class, JAXBElement.class, - JAXBElement.class, JAXBElement.class, JAXBElement.class, JAXBElement.class, JAXBElement.class); - Type[] types = primitives.getGenericParameterTypes(); - for (Type type : types) { - assertTrue("Jaxb2Marshaller does not support " + type, marshaller.supports(type)); - } - } - - @Test - public void supportsStandards() throws Exception { - Method standards = getClass() - .getDeclaredMethod("standards", JAXBElement.class, JAXBElement.class, JAXBElement.class, - JAXBElement.class, JAXBElement.class, JAXBElement.class, JAXBElement.class, JAXBElement.class, - JAXBElement.class, JAXBElement.class, JAXBElement.class, JAXBElement.class, JAXBElement.class, - JAXBElement.class); - Type[] types = standards.getGenericParameterTypes(); - for (Type type : types) { - assertTrue("Jaxb2Marshaller does not support " + type, marshaller.supports(type)); - } + marshaller.supports(createFlight.getReturnType())); } @Test @@ -300,30 +167,4 @@ public class Jaxb2MarshallerTest { verify(mimeContainer); assertTrue("No XML written", writer.toString().length() > 0); } - - private void primitives(JAXBElement bool, - JAXBElement aByte, - JAXBElement aShort, - JAXBElement anInteger, - JAXBElement aLong, - JAXBElement aFloat, - JAXBElement aDouble, - JAXBElement byteArray) { - } - - private void standards(JAXBElement string, - JAXBElement integer, - JAXBElement decimal, - JAXBElement calendar, - JAXBElement date, - JAXBElement qName, - JAXBElement uri, - JAXBElement xmlGregorianCalendar, - JAXBElement duration, - JAXBElement object, - JAXBElement image, - JAXBElement dataHandler, - JAXBElement source, - JAXBElement uuid) { - } } 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/Jaxb2UnmarshallerTest.java index d8523c51ee..2c83ece02a 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/Jaxb2UnmarshallerTest.java @@ -16,126 +16,40 @@ package org.springframework.oxm.jaxb; -import java.io.ByteArrayInputStream; import java.io.StringReader; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.xml.bind.JAXBElement; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamReader; import javax.xml.transform.Source; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.sax.SAXSource; -import javax.xml.transform.stax.StAXSource; import javax.xml.transform.stream.StreamSource; import static org.easymock.EasyMock.*; import static org.junit.Assert.*; -import org.junit.Before; import org.junit.Test; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Text; -import org.xml.sax.InputSource; -import org.xml.sax.XMLReader; -import org.xml.sax.helpers.XMLReaderFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; +import org.springframework.oxm.AbstractUnmarshallerTestCase; +import org.springframework.oxm.Unmarshaller; import org.springframework.oxm.mime.MimeContainer; import org.springframework.util.xml.StaxUtils; -public class Jaxb2UnmarshallerTest { +public class Jaxb2UnmarshallerTest extends AbstractUnmarshallerTestCase { private static final String INPUT_STRING = "" + "42"; private Jaxb2Marshaller unmarshaller; - @Before - public void createMarshaller() throws Exception { + @Override + public Unmarshaller createUnmarshaller() throws Exception { unmarshaller = new Jaxb2Marshaller(); unmarshaller.setContextPath("org.springframework.oxm.jaxb"); unmarshaller.setSchema(new ClassPathResource("org/springframework/oxm/flight.xsd")); unmarshaller.afterPropertiesSet(); - } - - @Test - public void unmarshalDomSource() throws Exception { - DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); - Document document = builder.newDocument(); - Element flightsElement = document.createElementNS("http://samples.springframework.org/flight", "tns:flights"); - document.appendChild(flightsElement); - Element flightElement = document.createElementNS("http://samples.springframework.org/flight", "tns:flight"); - flightsElement.appendChild(flightElement); - Element numberElement = document.createElementNS("http://samples.springframework.org/flight", "tns:number"); - flightElement.appendChild(numberElement); - Text text = document.createTextNode("42"); - numberElement.appendChild(text); - DOMSource source = new DOMSource(document); - Object flights = unmarshaller.unmarshal(source); - testFlights(flights); - } - - @Test - public void unmarshalStreamSourceReader() throws Exception { - StreamSource source = new StreamSource(new StringReader(INPUT_STRING)); - Object flights = unmarshaller.unmarshal(source); - testFlights(flights); - } - - @Test - public void testUnmarshalStreamSourceInputStream() throws Exception { - StreamSource source = new StreamSource(new ByteArrayInputStream(INPUT_STRING.getBytes("UTF-8"))); - Object flights = unmarshaller.unmarshal(source); - testFlights(flights); - } - - @Test - public void unmarshalSAXSource() throws Exception { - XMLReader reader = XMLReaderFactory.createXMLReader(); - SAXSource source = new SAXSource(reader, new InputSource(new StringReader(INPUT_STRING))); - Object flights = unmarshaller.unmarshal(source); - testFlights(flights); - } - - @Test - public void unmarshalStaxSourceXmlStreamReader() throws Exception { - XMLInputFactory inputFactory = XMLInputFactory.newInstance(); - XMLStreamReader streamReader = inputFactory.createXMLStreamReader(new StringReader(INPUT_STRING)); - Source source = StaxUtils.createStaxSource(streamReader); - Object flights = unmarshaller.unmarshal(source); - testFlights(flights); - } - - @Test - public void unmarshalStaxSourceXmlEventReader() throws Exception { - XMLInputFactory inputFactory = XMLInputFactory.newInstance(); - XMLEventReader eventReader = inputFactory.createXMLEventReader(new StringReader(INPUT_STRING)); - Source source = StaxUtils.createStaxSource(eventReader); - Object flights = unmarshaller.unmarshal(source); - testFlights(flights); - } - - @Test - public void unmarshalStaxSourceXmlStreamReaderJaxp14() throws Exception { - XMLInputFactory inputFactory = XMLInputFactory.newInstance(); - XMLStreamReader streamReader = inputFactory.createXMLStreamReader(new StringReader(INPUT_STRING)); - StAXSource source = new StAXSource(streamReader); - Object flights = unmarshaller.unmarshal(source); - testFlights(flights); - } - - @Test - public void unmarshalStaxSourceXmlEventReaderJaxp14() throws Exception { - XMLInputFactory inputFactory = XMLInputFactory.newInstance(); - XMLEventReader eventReader = inputFactory.createXMLEventReader(new StringReader(INPUT_STRING)); - StAXSource source = new StAXSource(eventReader); - Object flights = unmarshaller.unmarshal(source); - testFlights(flights); + return unmarshaller; } @Test @@ -175,20 +89,23 @@ public class Jaxb2UnmarshallerTest { assertNotNull("datahandler property not set", object.getSwaDataHandler()); } - private void testFlights(Object o) { + @Override + protected void testFlights(Object o) { Flights flights = (Flights) o; assertNotNull("Flights is null", flights); assertEquals("Invalid amount of flight elements", 1, flights.getFlight().size()); testFlight(flights.getFlight().get(0)); } - private void testFlight(Object o) { + @Override + protected void testFlight(Object o) { FlightType flight = (FlightType) o; assertNotNull("Flight is null", flight); assertEquals("Number is invalid", 42L, flight.getNumber()); } @Test + @Override public void unmarshalPartialStaxSourceXmlStreamReader() throws Exception { XMLInputFactory inputFactory = XMLInputFactory.newInstance(); XMLStreamReader streamReader = inputFactory.createXMLStreamReader(new StringReader(INPUT_STRING)); diff --git a/org.springframework.oxm/src/test/java/org/springframework/oxm/jaxb/JaxbUtilsTest.java b/org.springframework.oxm/src/test/java/org/springframework/oxm/jaxb/JaxbUtilsTest.java deleted file mode 100644 index 393770fb46..0000000000 --- a/org.springframework.oxm/src/test/java/org/springframework/oxm/jaxb/JaxbUtilsTest.java +++ /dev/null @@ -1,30 +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.jaxb; - -import javax.xml.bind.JAXBException; -import javax.xml.bind.MarshalException; -import javax.xml.bind.UnmarshalException; -import javax.xml.bind.ValidationException; - -import junit.framework.TestCase; - -public class JaxbUtilsTest extends TestCase { - - public void testGetJaxbVersion() throws Exception { - assertEquals("Invalid JAXB version", JaxbUtils.JAXB_2, JaxbUtils.getJaxbVersion()); - } -} 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/JibxMarshallerTest.java index ad8fddb5bc..3d9ad5dd97 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/JibxMarshallerTest.java @@ -29,7 +29,7 @@ import org.junit.Test; import org.springframework.oxm.AbstractMarshallerTestCase; import org.springframework.oxm.Marshaller; -@Ignore +@Ignore("Code generation not yet support by Spring Build") public class JibxMarshallerTest extends AbstractMarshallerTestCase { @Override 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/JibxUnmarshallerTest.java index c9d6b72254..fcffe7f3ed 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/JibxUnmarshallerTest.java @@ -22,7 +22,7 @@ import org.junit.Ignore; import org.springframework.oxm.AbstractUnmarshallerTestCase; import org.springframework.oxm.Unmarshaller; -@Ignore +@Ignore("Code generation not yet support by Spring Build") public class JibxUnmarshallerTest extends AbstractUnmarshallerTestCase { @Override 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/XmlBeansMarshallerTest.java index 2cd90e0c3d..bf9a35b7a4 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/XmlBeansMarshallerTest.java @@ -27,7 +27,7 @@ import org.junit.Test; import org.springframework.oxm.AbstractMarshallerTestCase; import org.springframework.oxm.Marshaller; -@Ignore +@Ignore("Code generation not yet support by Spring Build") public class XmlBeansMarshallerTest extends AbstractMarshallerTestCase { @Override 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/XmlBeansUnmarshallerTest.java index eeaa0e5456..44077be3c7 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/XmlBeansUnmarshallerTest.java @@ -31,7 +31,7 @@ import org.springframework.oxm.AbstractUnmarshallerTestCase; import org.springframework.oxm.Unmarshaller; import org.springframework.util.xml.StaxUtils; -@Ignore +@Ignore("Code generation not yet support by Spring Build") public class XmlBeansUnmarshallerTest extends AbstractUnmarshallerTestCase { @Override