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(); } }