diff --git a/spring-web/src/main/java/org/springframework/http/converter/xml/SourceHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/xml/SourceHttpMessageConverter.java index 3b9fe81938..e970450cf3 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/xml/SourceHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/xml/SourceHttpMessageConverter.java @@ -20,7 +20,8 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; - +import java.util.HashSet; +import java.util.Set; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -42,6 +43,7 @@ import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; + import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpOutputMessage; import org.springframework.http.MediaType; @@ -60,10 +62,22 @@ import org.springframework.util.StreamUtils; */ public class SourceHttpMessageConverter extends AbstractHttpMessageConverter { + private static final Set> SUPPORTED_CLASSES = new HashSet>(5); + + static { + SUPPORTED_CLASSES.add(DOMSource.class); + SUPPORTED_CLASSES.add(SAXSource.class); + SUPPORTED_CLASSES.add(StAXSource.class); + SUPPORTED_CLASSES.add(StreamSource.class); + SUPPORTED_CLASSES.add(Source.class); + } + + private final TransformerFactory transformerFactory = TransformerFactory.newInstance(); private boolean processExternalEntities = false; + /** * Sets the {@link #setSupportedMediaTypes(java.util.List) supportedMediaTypes} * to {@code text/xml} and {@code application/xml}, and {@code application/*-xml}. @@ -74,18 +88,17 @@ public class SourceHttpMessageConverter extends AbstractHttpMe /** - * Indicates whether external XML entities are processed when converting - * to a Source. + * Indicates whether external XML entities are processed when converting to a Source. *

Default is {@code false}, meaning that external entities are not resolved. */ public void setProcessExternalEntities(boolean processExternalEntities) { this.processExternalEntities = processExternalEntities; } + @Override public boolean supports(Class clazz) { - return DOMSource.class.equals(clazz) || SAXSource.class.equals(clazz) - || StreamSource.class.equals(clazz) || Source.class.equals(clazz); + return SUPPORTED_CLASSES.contains(clazz); } @Override @@ -108,7 +121,7 @@ public class SourceHttpMessageConverter extends AbstractHttpMe } else { throw new HttpMessageConversionException("Could not read class [" + clazz + - "]. Only DOMSource, SAXSource, and StreamSource are supported."); + "]. Only DOMSource, SAXSource, StAXSource, and StreamSource are supported."); } } @@ -116,7 +129,8 @@ public class SourceHttpMessageConverter extends AbstractHttpMe try { DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); documentBuilderFactory.setNamespaceAware(true); - documentBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities", processExternalEntities); + documentBuilderFactory.setFeature( + "http://xml.org/sax/features/external-general-entities", this.processExternalEntities); DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); Document document = documentBuilder.parse(body); return new DOMSource(document); @@ -132,7 +146,8 @@ public class SourceHttpMessageConverter extends AbstractHttpMe private SAXSource readSAXSource(InputStream body) throws IOException { try { XMLReader reader = XMLReaderFactory.createXMLReader(); - reader.setFeature("http://xml.org/sax/features/external-general-entities", processExternalEntities); + reader.setFeature( + "http://xml.org/sax/features/external-general-entities", this.processExternalEntities); byte[] bytes = StreamUtils.copyToByteArray(body); return new SAXSource(reader, new InputSource(new ByteArrayInputStream(bytes))); } @@ -144,7 +159,8 @@ public class SourceHttpMessageConverter extends AbstractHttpMe private Source readStAXSource(InputStream body) { try { XMLInputFactory inputFactory = XMLInputFactory.newFactory(); - inputFactory.setProperty("javax.xml.stream.isSupportingExternalEntities", processExternalEntities); + inputFactory.setProperty( + "javax.xml.stream.isSupportingExternalEntities", this.processExternalEntities); XMLStreamReader streamReader = inputFactory.createXMLStreamReader(body); return new StAXSource(streamReader); } @@ -192,21 +208,21 @@ public class SourceHttpMessageConverter extends AbstractHttpMe private static class CountingOutputStream extends OutputStream { - private long count = 0; + long count = 0; @Override public void write(int b) throws IOException { - count++; + this.count++; } @Override public void write(byte[] b) throws IOException { - count += b.length; + this.count += b.length; } @Override public void write(byte[] b, int off, int len) throws IOException { - count += len; + this.count += len; } }