001: package org.objectweb.celtix.bus.bindings.xml;
002:
003: import java.io.*;
004: import java.net.*;
005: import java.util.*;
006: import javax.jws.WebResult;
007: import javax.xml.ws.WebFault;
008:
009: import org.w3c.dom.*;
010:
011: import junit.framework.TestCase;
012:
013: import org.objectweb.celtix.bindings.DataBindingCallback;
014: import org.objectweb.celtix.bus.bindings.TestInputStreamContext;
015: import org.objectweb.celtix.bus.jaxws.JAXBDataBindingCallback;
016: import org.objectweb.celtix.context.GenericMessageContext;
017: import org.objectweb.celtix.context.ObjectMessageContext;
018: import org.objectweb.celtix.context.ObjectMessageContextImpl;
019: import org.objectweb.celtix.helpers.XMLUtils;
020: import org.objectweb.hello_world_xml_http.wrapped.Greeter;
021: import org.objectweb.hello_world_xml_http.wrapped.PingMeFault;
022: import org.objectweb.hello_world_xml_http.wrapped.types.FaultDetail;
023:
024: public class XMLBindingImplTest extends TestCase {
025: private XMLBindingImpl binding;
026: private ObjectMessageContextImpl objContext;
027: private XMLMessageContextImpl xmlContext;
028: private XMLUtils xmlUtils;
029:
030: public XMLBindingImplTest(String arg0) {
031: super (arg0);
032: }
033:
034: public static void main(String[] args) {
035: junit.textui.TestRunner.run(XMLBindingImplTest.class);
036: }
037:
038: protected void setUp() throws Exception {
039: super .setUp();
040:
041: xmlUtils = new XMLUtils();
042: binding = new XMLBindingImpl(false);
043: objContext = new ObjectMessageContextImpl();
044: xmlContext = new XMLMessageContextImpl(
045: new GenericMessageContext());
046:
047: objContext.setMethod(ClassUtils.getMethod(Greeter.class,
048: "greetMe"));
049: }
050:
051: public void testCreateBindingMessageContext() throws Exception {
052: binding = new XMLBindingImpl(false);
053: byte[] bArray = new byte[0];
054: TestInputStreamContext inCtx = new TestInputStreamContext(
055: bArray);
056: assertNotNull(binding.createBindingMessageContext(inCtx));
057: }
058:
059: public void testOperationName() throws Exception {
060: JAXBDataBindingCallback callback = new JAXBDataBindingCallback(
061: objContext.getMethod(), DataBindingCallback.Mode.PARTS,
062: null);
063: String operationName = callback.getOperationName();
064: assertNotNull(operationName);
065: assertEquals("greetMe", operationName);
066: }
067:
068: //Test The InputMessage of GreetMe Operation -- wrapped style
069: public void testMarshalWrapInputMessage() throws Exception {
070: xmlContext.put(ObjectMessageContext.MESSAGE_INPUT, false);
071: String arg0 = new String("TestXMLInputMessage");
072: objContext.setMessageObjects(arg0);
073:
074: binding.marshal(objContext, xmlContext,
075: new JAXBDataBindingCallback(objContext.getMethod(),
076: DataBindingCallback.Mode.PARTS, null));
077: XMLMessage msg = xmlContext.getMessage();
078: assertNotNull(msg);
079:
080: InputStream is = getClass().getResourceAsStream(
081: "resources/GreetMeWrappedReq.xml");
082: Document expectDOM = xmlUtils.parse(is);
083: Document resultDOM = msg.getRoot();
084: is.close();
085: assertTrue(expectDOM.isEqualNode(resultDOM));
086: }
087:
088: // Test sayHi operation which don't have part in request message.
089: public void testMarshalWrapNoPart() throws Exception {
090: xmlContext.put(ObjectMessageContext.MESSAGE_INPUT, false);
091: objContext.setMethod(ClassUtils.getMethod(Greeter.class,
092: "sayHi"));
093: binding.marshal(objContext, xmlContext,
094: new JAXBDataBindingCallback(objContext.getMethod(),
095: DataBindingCallback.Mode.PARTS, null));
096: XMLMessage msg = xmlContext.getMessage();
097: assertNotNull(msg);
098:
099: InputStream is = getClass().getResourceAsStream(
100: "resources/SayHiWrappedReq.xml");
101: Document expectDOM = xmlUtils.parse(is);
102: Document resultDOM = msg.getRoot();
103: is.close();
104: assertTrue(expectDOM.isEqualNode(resultDOM));
105: }
106:
107: //Test the Output of GreetMe Operation
108: public void testMarshalWrapOutputMessage() throws Exception {
109: xmlContext.put(ObjectMessageContext.MESSAGE_INPUT, true);
110: objContext.setMessageObjects(new Object[0]);
111:
112: String arg0 = "TestXMLOutputMessage";
113: objContext.setReturn(arg0);
114:
115: binding.marshal(objContext, xmlContext,
116: new JAXBDataBindingCallback(objContext.getMethod(),
117: DataBindingCallback.Mode.PARTS, null));
118: XMLMessage msg = xmlContext.getMessage();
119: assertNotNull(msg);
120: assertTrue(msg.getRoot().hasChildNodes());
121: NodeList list = msg.getRoot().getChildNodes();
122: assertEquals(1, list.getLength());
123: Node wrappedNode = list.item(0).getFirstChild();
124: assertTrue(wrappedNode.hasChildNodes());
125: assertEquals(arg0, wrappedNode.getFirstChild().getNodeValue());
126: }
127:
128: // Test unmashall greetMe method
129: public void testUnmarshalWrapInputMessage() throws Exception {
130: String data = "TestXMLInputMessage";
131: InputStream in = getClass().getResourceAsStream(
132: "resources/GreetMeWrappedReq.xml");
133: assertNotNull(binding.getMessageFactory());
134: XMLMessage xmlMessage = binding.getMessageFactory()
135: .createMessage(in);
136: xmlContext.setMessage(xmlMessage);
137: xmlContext.put(ObjectMessageContext.MESSAGE_INPUT, false);
138:
139: //GreetMe method has a IN parameter
140: objContext.setMessageObjects(new Object[1]);
141: binding.unmarshal(xmlContext, objContext,
142: new JAXBDataBindingCallback(objContext.getMethod(),
143: DataBindingCallback.Mode.PARTS, null));
144:
145: Object[] params = objContext.getMessageObjects();
146: assertNotNull(params);
147: assertNull(objContext.getReturn());
148: assertEquals(1, params.length);
149: assertEquals(data, (String) params[0]);
150: }
151:
152: public void testUnmarshalWrapOutputMessage() throws Exception {
153: xmlContext.put(ObjectMessageContext.MESSAGE_INPUT, true);
154: String data = new String("TestXMLOutputMessage");
155:
156: InputStream in = getClass().getResourceAsStream(
157: "resources/GreetMeWrappedResp.xml");
158: assertNotNull(binding.getMessageFactory());
159: XMLMessage xmlMessage = binding.getMessageFactory()
160: .createMessage(in);
161: xmlContext.setMessage(xmlMessage);
162:
163: binding.unmarshal(xmlContext, objContext,
164: new JAXBDataBindingCallback(objContext.getMethod(),
165: DataBindingCallback.Mode.PARTS, null));
166:
167: assertNull(objContext.getMessageObjects());
168: assertNotNull(objContext.getReturn());
169: assertEquals(data, (String) objContext.getReturn());
170: }
171:
172: public void testMethodAnnotation() throws Exception {
173: JAXBDataBindingCallback callback = new JAXBDataBindingCallback(
174: objContext.getMethod(), DataBindingCallback.Mode.PARTS,
175: null);
176: WebResult resultAnnotation = callback.getWebResult();
177: assertEquals("responseType", resultAnnotation.name());
178: }
179:
180: public void testWrappedMarshalFault() throws Exception {
181:
182: xmlContext.put(ObjectMessageContext.MESSAGE_INPUT, false);
183:
184: String exMessage = new String("Test Exception");
185: FaultDetail ec = new FaultDetail();
186: ec.setMajor((short) 2);
187: ec.setMinor((short) 1);
188: PingMeFault ex = new PingMeFault(exMessage, ec);
189: objContext.setException(ex);
190:
191: binding.marshalFault(objContext, xmlContext,
192: new JAXBDataBindingCallback(objContext.getMethod(),
193: DataBindingCallback.Mode.PARTS, null));
194: XMLMessage msg = xmlContext.getMessage();
195:
196: assertNotNull(msg);
197: Node xmlNode = msg.getRoot();
198:
199: assertNotNull(xmlNode);
200: assertEquals(1, xmlNode.getChildNodes().getLength());
201: assertTrue(msg.hasFault());
202: XMLFault fault = msg.getFault();
203: assertNotNull(fault);
204: assertEquals(getExceptionString(ex, exMessage), fault
205: .getFaultString());
206:
207: assertTrue(fault.hasChildNodes());
208: Node detail = fault.getFaultDetail();
209: assertNotNull(detail);
210:
211: NodeList list = detail.getChildNodes();
212: assertEquals(1, list.getLength());
213:
214: WebFault wfAnnotation = ex.getClass().getAnnotation(
215: WebFault.class);
216: assertEquals(wfAnnotation.targetNamespace(), list.item(0)
217: .getNamespaceURI());
218: assertEquals(wfAnnotation.name(), list.item(0).getLocalName());
219: }
220:
221: public void testMarshalSystemFaults() throws Exception {
222: xmlContext.put(ObjectMessageContext.MESSAGE_INPUT, false);
223:
224: XMLBindingException se = new XMLBindingException(
225: "XML Binding Exception");
226: objContext.setException(se);
227:
228: binding.marshalFault(objContext, xmlContext,
229: new JAXBDataBindingCallback(objContext.getMethod(),
230: DataBindingCallback.Mode.PARTS, null));
231: XMLMessage msg = xmlContext.getMessage();
232:
233: assertNotNull(msg);
234: Node xmlNode = msg.getRoot();
235: assertNotNull(xmlNode);
236: assertEquals(1, xmlNode.getChildNodes().getLength());
237:
238: assertTrue(msg.hasFault());
239: XMLFault fault = msg.getFault();
240: assertNotNull(fault);
241: assertEquals(getExceptionString(se, se.getMessage()), fault
242: .getFaultString());
243: assertTrue(fault.hasChildNodes());
244: NodeList list = fault.getFaultRoot().getChildNodes();
245: assertEquals(1, list.getLength());
246: }
247:
248: public void testUnmarshalDocLiteralUserFaults() throws Exception {
249: xmlContext.put(ObjectMessageContext.MESSAGE_INPUT, true);
250: objContext.setMethod(ClassUtils.getMethod(Greeter.class,
251: "pingMe"));
252:
253: InputStream is = getClass().getResourceAsStream(
254: "resources/xmlfault.xml");
255: XMLMessage faultMsg = binding.getMessageFactory()
256: .createMessage(is);
257: xmlContext.setMessage(faultMsg);
258:
259: binding.unmarshalFault(xmlContext, objContext,
260: new JAXBDataBindingCallback(objContext.getMethod(),
261: DataBindingCallback.Mode.PARTS, null));
262: assertNotNull(objContext.getException());
263: Object faultEx = objContext.getException();
264:
265: assertTrue(PingMeFault.class.isAssignableFrom(faultEx
266: .getClass()));
267: PingMeFault nscf = (PingMeFault) faultEx;
268: assertNotNull(nscf.getFaultInfo());
269: FaultDetail faultInfo = nscf.getFaultInfo();
270:
271: assertEquals(faultInfo.getMajor(), (short) 2);
272: assertEquals(faultInfo.getMinor(), (short) 1);
273: assertEquals(
274: "org.objectweb.hello_world_xml_http.wrapped.PingMeFault: PingMeFault raised by server",
275: nscf.getMessage());
276: }
277:
278: private String getExceptionString(Exception ex, String faultString) {
279: StringBuffer str = new StringBuffer();
280: if (ex != null) {
281: str.append(ex.getClass().getName());
282: str.append(": ");
283: }
284: str.append(faultString);
285:
286: if (!ex.getClass().isAnnotationPresent(WebFault.class)) {
287: str.append("\n");
288: for (StackTraceElement s : ex.getStackTrace()) {
289: str.append(s.toString());
290: str.append("\n");
291: }
292: }
293: return str.toString();
294: }
295: }
|