butek 02/04/05 09:51:30 Modified: java/samples/stock GetQuote1.java java/src/org/apache/axis/client ServiceFactory.java java/test/functional FunctionalTests.java Added: java/samples/jaxrpc GetQuote1.java java/test/functional TestJAXRPCSamples.java Log: I did three things wrt JAX-RPC - implemented a ServiceFactory.createService method - implemented the first of several JAX-RPC compliance samples (GetQuote1) - fixed the original samples.stock.GetQuote1 so it would work (and I tidied it up a bit). Revision Changes Path 1.1 xml-axis/java/samples/jaxrpc/GetQuote1.java Index: GetQuote1.java =================================================================== /* * The Apache Software License, Version 1.1 * * * Copyright (c) 2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Axis" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package samples.jaxrpc; import java.net.URL; import javax.xml.rpc.Call; import javax.xml.rpc.ParameterMode; import javax.xml.rpc.Service; import javax.xml.rpc.ServiceFactory; import javax.xml.rpc.namespace.QName; import org.apache.axis.encoding.XMLType; // This should probably be javax.xml.rpc.encoding.XMLType if we're told that class is approved (ie., it gets into the spec rather than just in the RI). import org.apache.axis.utils.Options; /** * This version of the ever so popular GetQuote is a near-duplicate of * the GetQuote1 method in samples/stock which shows how to use the AXIS * client APIs with and without WSDL. This version is strictly JAX-RPC * compliant. It uses no AXIS enhancements. * * This sample supports the use of the standard options too (-p ...) * * @author Russell Butek ([EMAIL PROTECTED]) */ public class GetQuote1 { public String symbol; /** * This will use the WSDL to prefill all of the info needed to make * the call. All that's left is filling in the args to invoke(). */ public float getQuote1(String args[]) throws Exception { Options opts = new Options(args); args = opts.getRemainingArgs(); if (args == null) { System.err.println("Usage: GetQuote <symbol>"); System.exit(1); } /* Define the service QName and port QName */ /*******************************************/ QName servQN = new QName("urn:xmltoday-delayed-quotes", "GetQuoteService"); QName portQN = new QName("urn:xmltoday-delayed-quotes", "GetQuote"); /* Now use those QNames as pointers into the WSDL doc */ /******************************************************/ Service service = ServiceFactory.newInstance().createService( new URL("file:samples/stock/GetQuote.wsdl"), servQN); Call call = service.createCall(portQN, "getQuote"); /* Strange - but allows the user to change just certain portions of */ /* the URL we're gonna use to invoke the service. Useful when you */ /* want to run it thru tcpmon (ie. put -p81 on the cmd line). */ /********************************************************************/ opts.setDefaultURL(call.getTargetEndpointAddress()); call.setTargetEndpointAddress(opts.getURL()); /* Define some service specific properties */ /*******************************************/ call.setProperty(Call.USERNAME_PROPERTY, opts.getUser()); call.setProperty(Call.PASSWORD_PROPERTY, opts.getPassword()); /* Get symbol and invoke the service */ /*************************************/ Object result = call.invoke(new Object[] {symbol = args[0]}); return ((Float) result).floatValue(); } // getQuote1 /** * This will do everything manually (ie. no WSDL). */ public float getQuote2(String args[]) throws Exception { Options opts = new Options(args); args = opts.getRemainingArgs(); if (args == null) { System.err.println("Usage: GetQuote <symbol>"); System.exit(1); } /* Create default/empty Service and Call object */ /************************************************/ Service service = ServiceFactory.newInstance().createService(null); Call call = service.createCall(); /* Strange - but allows the user to change just certain portions of */ /* the URL we're gonna use to invoke the service. Useful when you */ /* want to run it thru tcpmon (ie. put -p81 on the cmd line). */ /********************************************************************/ opts.setDefaultURL("http://localhost:8080/axis/servlet/AxisServlet"); /* Set all of the stuff that would normally come from WSDL */ /***********************************************************/ call.setTargetEndpointAddress(opts.getURL()); call.setProperty(Call.SOAPACTION_USE_PROPERTY, Boolean.TRUE); call.setProperty(Call.SOAPACTION_URI_PROPERTY, "getQuote"); call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY, "http://schemas.xmlsoap.org/soap/encoding/"); call.setOperationName(new QName("urn:xmltoday-delayed-quotes", "getQuote")); call.addParameter("symbol", XMLType.XSD_STRING, ParameterMode.IN); call.setReturnType(XMLType.XSD_FLOAT); /* Define some service specific properties */ /*******************************************/ call.setProperty(Call.USERNAME_PROPERTY, opts.getUser()); call.setProperty(Call.PASSWORD_PROPERTY, opts.getPassword()); /* Get symbol and invoke the service */ /*************************************/ Object result = call.invoke(new Object[] {symbol = args[0]}); return ((Float) result).floatValue(); } // getQuote2 /** * This method does the same thing that getQuote1 does, but in * addition it reuses the Call object to make another call. */ public float getQuote3(String args[]) throws Exception { Options opts = new Options(args); args = opts.getRemainingArgs(); if (args == null) { System.err.println("Usage: GetQuote <symbol>"); System.exit(1); } /* Define the service QName and port QName */ /*******************************************/ QName servQN = new QName("urn:xmltoday-delayed-quotes", "GetQuoteService"); QName portQN = new QName("urn:xmltoday-delayed-quotes", "GetQuote"); /* Now use those QNames as pointers into the WSDL doc */ /******************************************************/ Service service = ServiceFactory.newInstance().createService( new URL("file:GetQuote.wsdl"), servQN); Call call = service.createCall(portQN, "getQuote"); /* Strange - but allows the user to change just certain portions of */ /* the URL we're gonna use to invoke the service. Useful when you */ /* want to run it thru tcpmon (ie. put -p81 on the cmd line). */ /********************************************************************/ opts.setDefaultURL(call.getTargetEndpointAddress()); call.setTargetEndpointAddress(opts.getURL()); /* Define some service specific properties */ /*******************************************/ call.setProperty(Call.USERNAME_PROPERTY, opts.getUser()); call.setProperty(Call.PASSWORD_PROPERTY, opts.getPassword()); /* Get symbol and invoke the service */ /*************************************/ Object result = call.invoke(new Object[] {symbol = args[0]}); /* Reuse the Call object for a different call */ /**********************************************/ call.setOperationName(new QName("urn:xmltoday-delayed-quotes", "test")); call.setReturnType(XMLType.XSD_STRING); System.out.println(call.invoke(new Object[]{})); return ((Float) result).floatValue(); } // getQuote3 public static void main(String args[]) { try { String save_args[] = new String[args.length]; float val; GetQuote1 gq = new GetQuote1(); /* Call the getQuote() that uses the WDSL */ /******************************************/ System.out.println("Using WSDL"); System.arraycopy(args, 0, save_args, 0, args.length); val = gq.getQuote1(args); System.out.println(gq.symbol + ": " + val); /* Call the getQuote() that does it all manually */ /*************************************************/ System.out.println("Manually"); System.arraycopy(save_args, 0, args, 0, args.length); val = gq.getQuote2(args); System.out.println(gq.symbol + ": " + val); /* Call the getQuote() that uses Axis's generated WSDL */ /*******************************************************/ System.out.println("WSDL + Reuse Call"); System.arraycopy(save_args, 0, args, 0, args.length); val = gq.getQuote3(args); System.out.println(gq.symbol + ": " + val); } catch(Exception e) { e.printStackTrace(); } } // main } 1.22 +3 -3 xml-axis/java/samples/stock/GetQuote1.java Index: GetQuote1.java =================================================================== RCS file: /home/cvs/xml-axis/java/samples/stock/GetQuote1.java,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- GetQuote1.java 27 Mar 2002 16:46:56 -0000 1.21 +++ GetQuote1.java 5 Apr 2002 17:51:30 -0000 1.22 @@ -120,7 +120,6 @@ /* Get symbol and invoke the service */ /*************************************/ Object result = call.invoke( new Object[] { symbol = args[0] } ); - result = call.invoke( new Object[] { symbol = args[0] } ); return( ((Float) result).floatValue() ); } @@ -212,9 +211,10 @@ Object result = call.invoke( new Object[] { symbol = args[0] } ); result = call.invoke( new Object[] { symbol = args[0] } ); + /* Reuse the call object to call the test method */ + /*************************************************/ call.setOperation( portQN, "test" ); - opts.setDefaultURL( call.getTargetEndpointAddress() ); - call.setTargetEndpointAddress( new URL(opts.getURL()) ); + call.setReturnType( XMLType.XSD_STRING ); System.out.println( call.invoke(new Object[]{}) ); 1.9 +7 -2 xml-axis/java/src/org/apache/axis/client/ServiceFactory.java Index: ServiceFactory.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/client/ServiceFactory.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- ServiceFactory.java 4 Apr 2002 20:45:27 -0000 1.8 +++ ServiceFactory.java 5 Apr 2002 17:51:30 -0000 1.9 @@ -245,7 +245,12 @@ */ public javax.xml.rpc.Service createService(QName serviceName) throws ServiceException { - throw new ServiceException(JavaUtils.getMessage( - "notImplemented00", "ServiceFactory.createService")); + + // RJB - this isn't quite proper - I'm dropping the serviceName, + // but I don't rightly know what use the service name is without + // WSDL. So I'll just create a default (empty) Service with the + // assumption that callers of this method are going to do all + // the work themselves. + return new Service(); } // createService } 1.16 +3 -0 xml-axis/java/test/functional/FunctionalTests.java Index: FunctionalTests.java =================================================================== RCS file: /home/cvs/xml-axis/java/test/functional/FunctionalTests.java,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- FunctionalTests.java 17 Dec 2001 00:57:41 -0000 1.15 +++ FunctionalTests.java 5 Apr 2002 17:51:30 -0000 1.16 @@ -21,6 +21,9 @@ // Echo test - end to end serialization and deserialization / // interop tests. suite.addTestSuite(TestEchoSample.class); + + // Test the JAX-RPC compliance samples + suite.addTestSuite(TestJAXRPCSamples.class); // stock sample test // run this BEFORE ALL OTHER TESTS to minimize confusion; 1.1 xml-axis/java/test/functional/TestJAXRPCSamples.java Index: TestJAXRPCSamples.java =================================================================== /* * The Apache Software License, Version 1.1 * * * Copyright (c) 2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Axis" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package test.functional; import junit.framework.TestCase; import org.apache.axis.AxisFault; import org.apache.axis.client.AdminClient; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import samples.jaxrpc.GetQuote1; /** * Test the JAX-RPC compliance samples. */ public class TestJAXRPCSamples extends TestCase { static Log log = LogFactory.getLog(TestJAXRPCSamples.class.getName()); public TestJAXRPCSamples(String name) { super(name); } // ctor public void doTestDeploy() throws Exception { String[] args = {"samples/stock/deploy.wsdd"}; AdminClient.main(args); } // doTestDeploy public void doTestGetQuoteXXX() throws Exception { String[] args = {"-uuser1", "-wpass1", "XXX"}; float val = new GetQuote1().getQuote1(args); assertEquals("Stock price is not the expected 55.25 +/- 0.01", val, 55.25, 0.01); } // doTestGetQuoteXXX public void doTestGetQuoteMain() throws Exception { String[] args = {"-uuser1", "-wpass1", "IBM"}; GetQuote1.main(args); } // doTestGetQuoteMain public void doTestUndeploy() throws Exception { String[] args = {"samples/stock/undeploy.wsdd"}; AdminClient.main(args); } // doTestStockNoAction public static void main(String args[]) throws Exception { TestJAXRPCSamples tester = new TestJAXRPCSamples("tester"); tester.testGetQuote(); } // main public void testGetQuote() throws Exception { try { log.info("Testing JAX-RPC GetQuote sample."); log.info("Testing deployment..."); doTestDeploy(); log.info("Testing service..."); doTestGetQuoteXXX(); doTestGetQuoteMain(); log.info("Testing undeployment..."); doTestUndeploy(); log.info("Test complete."); } catch (Throwable t) { if (t instanceof AxisFault) ((AxisFault)t).dump(); t.printStackTrace(); throw new Exception("Fault returned from test: " + t); } } // testGetQuote }