SPR-7034 - XmlBeans UnMarshalling - does not work with RequestBody annotation

This commit is contained in:
Arjen Poutsma 2010-03-25 11:52:32 +00:00
parent fbda55f141
commit f836601e0f
1 changed files with 165 additions and 2 deletions

View File

@ -21,8 +21,11 @@ import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.io.FilterInputStream;
import java.util.ArrayList;
import java.util.List;
import java.lang.ref.WeakReference;
import java.nio.CharBuffer;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLStreamReader;
@ -35,6 +38,8 @@ import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlOptions;
import org.apache.xmlbeans.XmlSaxHandler;
import org.apache.xmlbeans.XmlValidationError;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
@ -181,7 +186,8 @@ public class XmlBeansMarshaller extends AbstractMarshaller {
@Override
protected final Object unmarshalInputStream(InputStream inputStream) throws XmlMappingException, IOException {
try {
XmlObject object = XmlObject.Factory.parse(inputStream, getXmlOptions());
InputStream nonClosingInputStream = new NonClosingInputStream(inputStream);
XmlObject object = XmlObject.Factory.parse(nonClosingInputStream, getXmlOptions());
validate(object);
return object;
}
@ -193,7 +199,8 @@ public class XmlBeansMarshaller extends AbstractMarshaller {
@Override
protected final Object unmarshalReader(Reader reader) throws XmlMappingException, IOException {
try {
XmlObject object = XmlObject.Factory.parse(reader, getXmlOptions());
Reader nonClosingReader = new NonClosingReader(reader);
XmlObject object = XmlObject.Factory.parse(nonClosingReader, getXmlOptions());
validate(object);
return object;
}
@ -307,4 +314,160 @@ public class XmlBeansMarshaller extends AbstractMarshaller {
}
}
/**
* See SPR-7034
*/
private static class NonClosingInputStream extends InputStream {
private final WeakReference<InputStream> in;
private NonClosingInputStream(InputStream in) {
this.in = new WeakReference<InputStream>(in);
}
private InputStream getInputStream() {
return this.in.get();
}
@Override
public int read() throws IOException {
InputStream in = getInputStream();
return in != null ? in.read() : -1;
}
@Override
public int read(byte[] b) throws IOException {
InputStream in = getInputStream();
return in != null ? in.read(b) : -1;
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
InputStream in = getInputStream();
return in != null ? in.read(b, off, len) : -1;
}
@Override
public long skip(long n) throws IOException {
InputStream in = getInputStream();
return in != null ? in.skip(n) : 0;
}
@Override
public boolean markSupported() {
InputStream in = getInputStream();
return in != null && in.markSupported();
}
@Override
public void mark(int readlimit) {
InputStream in = getInputStream();
if (in != null) {
in.mark(readlimit);
}
}
@Override
public void reset() throws IOException {
InputStream in = getInputStream();
if (in != null) {
in.reset();
}
}
@Override
public int available() throws IOException {
InputStream in = getInputStream();
return in != null ? in.available() : 0;
}
@Override
public void close() throws IOException {
InputStream in = getInputStream();
if(in != null) {
this.in.clear();
}
}
}
private static class NonClosingReader extends Reader {
private final WeakReference<Reader> reader;
private NonClosingReader(Reader reader) {
this.reader = new WeakReference<Reader>(reader);
}
private Reader getReader() {
return this.reader.get();
}
@Override
public int read(CharBuffer target) throws IOException {
Reader rdr = getReader();
return rdr != null ? rdr.read(target) : -1;
}
@Override
public int read() throws IOException {
Reader rdr = getReader();
return rdr != null ? rdr.read() : -1;
}
@Override
public int read(char[] cbuf) throws IOException {
Reader rdr = getReader();
return rdr != null ? rdr.read(cbuf) : -1;
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
Reader rdr = getReader();
return rdr != null ? rdr.read(cbuf, off, len) : -1;
}
@Override
public long skip(long n) throws IOException {
Reader rdr = getReader();
return rdr != null ? rdr.skip(n) : 0;
}
@Override
public boolean ready() throws IOException {
Reader rdr = getReader();
return rdr != null && rdr.ready();
}
@Override
public boolean markSupported() {
Reader rdr = getReader();
return rdr != null && rdr.markSupported();
}
@Override
public void mark(int readAheadLimit) throws IOException {
Reader rdr = getReader();
if (rdr != null) {
rdr.mark(readAheadLimit);
}
}
@Override
public void reset() throws IOException {
Reader rdr = getReader();
if (rdr != null) {
rdr.reset();
}
}
@Override
public void close() throws IOException {
Reader rdr = getReader();
if (rdr != null) {
this.reader.clear();
}
}
}
}