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