dug 01/06/28 07:06:47 Added: java/samples/calculator Calc.java input testit1.cmd testit1.sh Log: Add a new calculator demo. This one doesn't use a gui and similates a reverse polish notation calculator. See the help panel ("?") for more details. Also, created a new "testit1" and some sample input for "testit1". Revision Changes Path 1.1 xml-soap/java/samples/calculator/Calc.java Index: Calc.java =================================================================== /* * The Apache Software License, Version 1.1 * * * Copyright (c) 2000 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 "SOAP" 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 and was * originally based on software copyright (c) 2000, International * Business Machines, Inc., http://www.apache.org. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package samples.calculator; import java.io.*; import java.net.*; import java.util.*; import org.apache.soap.util.xml.*; import org.apache.soap.*; import org.apache.soap.rpc.*; /** * A reverse polish notation calc that uses BSF on the server. * (some code stolen from the 'gui' calculator example) */ public class Calc { static int stackSize = 100 ; double[] stack = new double[stackSize]; String encodingStyleURI; URL url; private void doOp (String op) { try { // Build the call. Call call = new Call (); call.setTargetObjectURI ("urn:xml-soap-demo-calculator"); call.setMethodName (op); call.setEncodingStyleURI(encodingStyleURI); Vector params = new Vector (); double arg2 = pull(); double arg1 = pull(); params.addElement (new Parameter("arg1", double.class, new Double (arg1), null)); params.addElement (new Parameter("arg2", double.class, new Double (arg2), null)); call.setParams (params); // make the call: note that the action URI is empty because the // XML-SOAP rpc router does not need this. This may change in the // future. Response resp = call.invoke (/* router URL */ url, /* actionURI */ "" ); // Check the response. if (resp.generatedFault ()) { Fault fault = resp.getFault (); System.out.println ("Ouch, the call failed: "); System.out.println (" Fault Code = " + fault.getFaultCode ()); System.out.println (" Fault String = " + fault.getFaultString ()); push( 0 ); } else { Parameter result = resp.getReturnValue (); push( ((Double)result.getValue()).doubleValue()) ; } } catch( Exception e ) { e.printStackTrace(); push( 0 ); } } private double stringToDouble (String s) { // try as a double, float or by appending a ".0" to it try { return Double.valueOf (s).doubleValue (); } catch (NumberFormatException e1) { try { return Float.valueOf (s).floatValue () * 1.0; } catch (NumberFormatException e2) { if (s.indexOf (".") == -1) { return stringToDouble (s + '.' + '0'); } else { return Double.NaN; } } } } public void push(double val) { while ( Double.isNaN(stack[0]) ) pull(); for ( int i = 99 ; i > 0 ; i-- ) stack[i] = stack[i-1] ; stack[0] = val ; } public double pull() { double result = stack[0] ; for ( int i = 0 ; i < 99 ; i++ ) stack[i] = stack[i+1]; stack[99] = 0 ; return( result ); } public void printStack() { int i ; for ( i = 99 ; i > 0 ; i-- ) if ( stack[i] != 0 ) break ; System.out.println( " Stack:" ); for( ; i >= 0 ; i-- ) System.out.println( " " + stack[i] ); System.out.println( "" ); } static String line = null ; static int pos = 0 ; public void setLine(String str) { line = str ; pos = 0 ; } public String nextToken() { // StringTokenizer doesn't handle "2*" nicely, it wants "2 *" String res = null ; char ch ; if ( line == null || line.length() == 0 ) return( null ); for( ; pos < line.length() ; pos++ ) { ch = line.charAt( pos ); if ( Character.isWhitespace(ch) && res == null ) continue ; if ( Character.isWhitespace(ch) && res != null ) break ; if ( res == null ) res = "" + ch ; else { if ( Character.isDigit(ch) || ch == '.' ) { if ( Character.isDigit(res.charAt(0)) || res.charAt(0) == '-' || res.charAt(0) == '.' ) res += ch ; else break ; } else break ; } } return( res ); } public void help() { System.out.println( "" ); System.out.println( "A very simple reverse polish notation calculator" ); System.out.println( "Operations allowed:" ); System.out.println( " +-/*" ); System.out.println( "Other commands:" ); System.out.println( " p (print stack)" ); System.out.println( " q (quit)" ); System.out.println( " ? (print this help message)" ); System.out.println( "" ); } public void go() { InputStreamReader reader = new InputStreamReader( System.in ); BufferedReader bReader = new BufferedReader( reader ); String nextWord ; for ( int i = 0 ;i < stackSize ; i++ ) stack[i] = 0 ; for ( ;; ) { while ( (nextWord = nextToken()) == null ) { System.out.println( ">> " + stack[0] ); try { setLine( bReader.readLine() ); } catch( Exception e ) {} } if ( nextWord.equals("q") ) break ; else if ( nextWord.equals("p") ) printStack(); else if ( nextWord.equals("h") ) help(); else if ( nextWord.equals("?") ) help(); else if ( nextWord.equals("+") ) doOp( "plus" ); else if ( nextWord.equals("-") ) doOp( "minus" ); else if ( nextWord.equals("*") ) doOp( "times" ); else if ( nextWord.equals("/") ) doOp( "divide" ); else push( stringToDouble(nextWord) ); } } public static void main (String[] args) throws Exception { int maxargs = 2; if (args.length != (maxargs-1) && (args.length != maxargs || !args[0].startsWith ("-"))) { System.err.println ("Usage: java " + Calc.class.getName () + " [-encodingStyleURI] SOAP-router-URL"); System.exit (1); } Calc c = new Calc(); int offset = maxargs - args.length; c.encodingStyleURI = (args.length == maxargs) ? args[0].substring(1) : Constants.NS_URI_SOAP_ENC; c.url = new URL (args[1 - offset]); c.go(); } } 1.1 xml-soap/java/samples/calculator/input Index: input =================================================================== 1 2 3 4 5 + + + + 3/ 2*10+p -5.5* 1 2 -6.0 p * - + q 1.1 xml-soap/java/samples/calculator/testit1.cmd Index: testit1.cmd =================================================================== @echo off echo This test assumes a server URL of http://localhost:8080/soap/servlet/rpcrouter echo Deploying the calculator service... java org.apache.soap.server.ServiceManagerClient http://localhost:8080/soap/servlet/rpcrouter deploy DeploymentDescriptor.xml echo . echo Verify that it's there java org.apache.soap.server.ServiceManagerClient http://localhost:8080/soap/servlet/rpcrouter list echo . echo Running the calculator echo Input: type input java samples.calculator.Calc http://localhost:8080/soap/servlet/rpcrouter < input echo . echo Undeploy it now java org.apache.soap.server.ServiceManagerClient http://localhost:8080/soap/servlet/rpcrouter undeploy urn:xml-soap-demo-calculator echo . echo Verify that it's gone java org.apache.soap.server.ServiceManagerClient http://localhost:8080/soap/servlet/rpcrouter list 1.1 xml-soap/java/samples/calculator/testit1.sh Index: testit1.sh =================================================================== echo This test assumes a server URL of http://localhost:8080/soap/servlet/rpcrouter echo Deploying the calculator service... java org.apache.soap.server.ServiceManagerClient http://localhost:8080/soap/servlet/rpcrouter deploy DeploymentDescriptor.xml echo echo Verify that it\'s there java org.apache.soap.server.ServiceManagerClient http://localhost:8080/soap/servlet/rpcrouter list echo echo Running the calculator echo Input: cat input java samples.calculator.Calc http://localhost:8080/soap/servlet/rpcrouter < input echo echo Undeploy it now java org.apache.soap.server.ServiceManagerClient http://localhost:8080/soap/servlet/rpcrouter undeploy urn:xml-soap-demo-calculator echo echo Verify that it\'s gone java org.apache.soap.server.ServiceManagerClient http://localhost:8080/soap/servlet/rpcrouter list