| package test.encoding; |
| |
| import junit.framework.TestCase; |
| import org.apache.axis.AxisEngine; |
| import org.apache.axis.MessageContext; |
| import org.apache.axis.client.Call; |
| import org.apache.axis.client.Service; |
| import org.apache.axis.configuration.SimpleProvider; |
| import org.apache.axis.encoding.SerializationContext; |
| import org.apache.axis.encoding.SerializationContext; |
| import org.apache.axis.encoding.XMLType; |
| import org.apache.axis.handlers.soap.SOAPService; |
| import org.apache.axis.message.RPCElement; |
| import org.apache.axis.message.RPCParam; |
| import org.apache.axis.message.SOAPEnvelope; |
| import org.apache.axis.providers.java.RPCProvider; |
| import org.apache.axis.server.AxisServer; |
| import org.apache.axis.transport.local.LocalTransport; |
| |
| import java.io.StringWriter; |
| import java.io.Writer; |
| |
| /** |
| * Verify that shutting off xsi:types in the Message Context works |
| * as expected. |
| */ |
| public class TestXsiType extends TestCase { |
| private SimpleProvider provider = new SimpleProvider(); |
| private AxisServer server = new AxisServer(provider); |
| |
| public TestXsiType() |
| { |
| super("testing"); |
| } |
| |
| public TestXsiType(String name) { |
| super(name); |
| } |
| |
| /** |
| * Trivial test just to make sure there aren't xsi:type attributes |
| */ |
| public void testNoXsiTypes() |
| throws Exception |
| { |
| MessageContext msgContext = new MessageContext(server); |
| |
| // Don't serialize xsi:type attributes |
| msgContext.setProperty(Call.SEND_TYPE_ATTR, "false" ); |
| |
| SOAPEnvelope msg = new SOAPEnvelope(); |
| RPCParam arg1 = new RPCParam("urn:myNamespace", |
| "testParam", |
| "this is a string"); |
| RPCElement body = new RPCElement("urn:myNamespace", |
| "method1", |
| new Object[]{ arg1 }); |
| msg.addBodyElement(body); |
| |
| Writer stringWriter = new StringWriter(); |
| SerializationContext context = new SerializationContext(stringWriter, |
| msgContext); |
| |
| msg.output(context); |
| |
| String msgString = stringWriter.toString(); |
| assertTrue("Found unexpected xsi:type!", |
| msgString.indexOf("xsi:type") == -1); |
| } |
| |
| /** |
| * More complex test which checks to confirm that we can still |
| * in fact deserialize if we know the type via the Call object. |
| */ |
| public void testTypelessDeserialization() throws Exception |
| { |
| server.setOption(AxisEngine.PROP_SEND_XSI, Boolean.FALSE); |
| |
| SOAPService service = new SOAPService(new RPCProvider()); |
| service.setOption("className", "test.encoding.TestXsiType"); |
| service.setOption("allowedMethods", "*"); |
| provider.deployService("TestService", service); |
| |
| // Call that same server, accessing a method we know returns |
| // a double. We should figure this out and deserialize it |
| // correctly, even without the xsi:type attribute, because |
| // we set the return type manually. |
| |
| Service S_service = new Service(); |
| Call call = (Call) S_service.createCall(); |
| call.setTransport(new LocalTransport(server)); |
| call.setReturnType(XMLType.XSD_DOUBLE); |
| |
| Object result = call.invoke("TestService", |
| "serviceMethod", |
| new Object [] {}); |
| |
| assertTrue("Return value (" + result.getClass().getName() + |
| ") was not the expected type (Double)!", |
| (result instanceof Double)); |
| } |
| |
| /** |
| * A method for our service, returning a double. |
| */ |
| public double serviceMethod() |
| { |
| return 3.14159; |
| } |
| |
| public static void main(String [] args) throws Exception |
| { |
| TestXsiType tester = new TestXsiType("test"); |
| tester.testNoXsiTypes(); |
| tester.testTypelessDeserialization(); |
| } |
| } |