1
16
17 package org.springframework.ws.server.endpoint.adapter.method;
18
19 import java.io.ByteArrayInputStream;
20 import java.io.ByteArrayOutputStream;
21 import javax.xml.stream.XMLEventReader;
22 import javax.xml.stream.XMLInputFactory;
23 import javax.xml.stream.XMLStreamException;
24 import javax.xml.stream.XMLStreamReader;
25 import javax.xml.transform.Source;
26 import javax.xml.transform.TransformerException;
27 import javax.xml.transform.stream.StreamResult;
28
29 import org.springframework.core.MethodParameter;
30 import org.springframework.util.xml.StaxUtils;
31 import org.springframework.ws.context.MessageContext;
32 import org.springframework.ws.server.endpoint.annotation.RequestPayload;
33 import org.springframework.xml.XMLInputFactoryUtils;
34 import org.springframework.xml.transform.TransformerObjectSupport;
35
36
43 public class StaxPayloadMethodArgumentResolver extends TransformerObjectSupport implements MethodArgumentResolver {
44
45 private final XMLInputFactory inputFactory = createXmlInputFactory();
46
47 @Override
48 public boolean supportsParameter(MethodParameter parameter) {
49 if (parameter.getParameterAnnotation(RequestPayload.class) == null) {
50 return false;
51 }
52 else {
53 Class<?> parameterType = parameter.getParameterType();
54 return XMLStreamReader.class.equals(parameterType) || XMLEventReader.class.equals(parameterType);
55 }
56 }
57
58 @Override
59 public Object resolveArgument(MessageContext messageContext, MethodParameter parameter)
60 throws TransformerException, XMLStreamException {
61 Source source = messageContext.getRequest().getPayloadSource();
62 if (source == null) {
63 return null;
64 }
65 Class<?> parameterType = parameter.getParameterType();
66 if (XMLStreamReader.class.equals(parameterType)) {
67 return resolveStreamReader(source);
68 }
69 else if (XMLEventReader.class.equals(parameterType)) {
70 return resolveEventReader(source);
71 }
72 throw new UnsupportedOperationException();
73 }
74
75 private XMLStreamReader resolveStreamReader(Source requestSource) throws TransformerException, XMLStreamException {
76 XMLStreamReader streamReader = null;
77 if (StaxUtils.isStaxSource(requestSource)) {
78 streamReader = StaxUtils.getXMLStreamReader(requestSource);
79 if (streamReader == null) {
80 XMLEventReader eventReader = StaxUtils.getXMLEventReader(requestSource);
81 if (eventReader != null) {
82 try {
83 streamReader = StaxUtils.createEventStreamReader(eventReader);
84 }
85 catch (XMLStreamException ex) {
86 streamReader = null;
87 }
88 }
89 }
90 }
91 if (streamReader == null) {
92 try {
93 streamReader = inputFactory.createXMLStreamReader(requestSource);
94 }
95 catch (XMLStreamException ex) {
96 streamReader = null;
97 }
98 catch (UnsupportedOperationException ex) {
99 streamReader = null;
100 }
101 }
102 if (streamReader == null) {
103
104 ByteArrayInputStream bis = convertToByteArrayInputStream(requestSource);
105 streamReader = inputFactory.createXMLStreamReader(bis);
106 }
107 return streamReader;
108 }
109
110 private XMLEventReader resolveEventReader(Source requestSource) throws TransformerException, XMLStreamException {
111 XMLEventReader eventReader = null;
112 if (StaxUtils.isStaxSource(requestSource)) {
113 eventReader = StaxUtils.getXMLEventReader(requestSource);
114 if (eventReader == null) {
115 XMLStreamReader streamReader = StaxUtils.getXMLStreamReader(requestSource);
116 if (streamReader != null) {
117 try {
118 eventReader = inputFactory.createXMLEventReader(streamReader);
119 }
120 catch (XMLStreamException ex) {
121 eventReader = null;
122 }
123 }
124
125 }
126 }
127 if (eventReader == null) {
128 try {
129 eventReader = inputFactory.createXMLEventReader(requestSource);
130 }
131 catch (XMLStreamException ex) {
132 eventReader = null;
133 }
134 catch (UnsupportedOperationException ex) {
135 eventReader = null;
136 }
137 }
138 if (eventReader == null) {
139
140 ByteArrayInputStream bis = convertToByteArrayInputStream(requestSource);
141 eventReader = inputFactory.createXMLEventReader(bis);
142 }
143 return eventReader;
144 }
145
146
155 protected XMLInputFactory createXmlInputFactory() {
156 return XMLInputFactoryUtils.newInstance();
157 }
158
159 private ByteArrayInputStream convertToByteArrayInputStream(Source source) throws TransformerException {
160 ByteArrayOutputStream bos = new ByteArrayOutputStream();
161 transform(source, new StreamResult(bos));
162 return new ByteArrayInputStream(bos.toByteArray());
163 }
164
165
166
167 }
168