You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by ro...@apache.org on 2001/05/31 11:25:26 UTC

cvs commit: xml-axis/java/test/functional/ant RunAxisFunctionalTestsTask.java

robj        01/05/31 02:25:26

  Modified:    java     build.xml
               java/samples/bidbuy TestClient.java v3.java vInterface.java
               java/samples/echo TestClient.java
               java/samples/misc TestClient.java
               java/samples/stock GetInfo.java GetQuote.java deploy.xml
                        testit.cmd testit.sh
               java/samples/transport FileTest.java
               java/src/org/apache/axis MessageContext.java
               java/src/org/apache/axis/client AxisClient.java
               java/src/org/apache/axis/deployment/v2dd
                        V2DDDeployableItem.java V2DDProvider.java
               java/src/org/apache/axis/deployment/v2dd/providers
                        V2DDComProvider.java V2DDJavaProvider.java
                        V2DDScriptProvider.java
               java/src/org/apache/axis/deployment/wsdd/providers
                        WSDDBsfProvider.java WSDDComProvider.java
                        WSDDJavaProvider.java
               java/src/org/apache/axis/handlers JWSProcessor.java
               java/src/org/apache/axis/registries
                        DefaultHandlerRegistry.java
               java/src/org/apache/axis/transport/http
                        SimpleAxisServer.java
               java/src/org/apache/axis/utils Admin.java
  Added:       java/src/org/apache/axis/handlers/tcp TCPActionHandler.java
               java/src/org/apache/axis/transport/tcp AxisListener.java
                        PseudoStockQuoteService.java
                        TCPDispatchHandler.java
               java/src/org/apache/axis/providers BasicProvider.java
                        BSFProvider.java ComProvider.java JWSProvider.java
               java/src/org/apache/axis/providers/java JavaProvider.java
                        MsgProvider.java RPCProvider.java
               java/test build_ant.xml build_functional_tests.xml
               java/test/functional FunctionalTests.java TestHTTPEcho.java
                        TestTCPEcho.java
               java/test/functional/ant RunAxisFunctionalTestsTask.java
  Removed:     java/src/org/apache/axis/client AdminClient.java
                        HTTPCall.java HTTPMessage.java
               java/src/org/apache/axis/handlers MsgDispatchHandler.java
                        RPCDispatchHandler.java
               java/src/org/apache/axis/handlers/providers BSFProvider.java
                        BasicProvider.java ComProvider.java
                        JWSProvider.java JavaProvider.java readme
  Log:
  I hope I will never have to make another checkin as large
  as this.  Changes include:
  - tcp transport (probably already deprecated)
  - generic ServiceClient replaces (HTTP-specific) HTTPCall
  - functional test suite exercises client-server HTTP and TCP
    (do "java org.apache.tools.ant.Main functional-tests")
  - providers moved to toplevel directory
  - MsgDispatchHandler, RPCDispatchHandler refactored
    into MsgProvider, RPCProvider
  - and more besides....
  There may well be problems.  I apologize in advance.
  Feel free to call me, 415 861 2606, to work them out
  absolutely ASAP tomorrow (today? :-).
  
  Revision  Changes    Path
  1.23      +44 -4     xml-axis/java/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/build.xml,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- build.xml	2001/05/22 23:32:41	1.22
  +++ build.xml	2001/05/31 09:22:20	1.23
  @@ -25,6 +25,7 @@
    - javadocs -> creates the javadocs in "./build/javadocs"
    - dist     -> creates the complete binary distribution
    - srcdist  -> creates the complete src distribution
  + - functional-tests -> attempts to build Ant task and then run client-server functional test
   
   Custom post-compilation work:
   
  @@ -99,7 +100,7 @@
         classname="javax.servlet.Servlet"
         classpathref="classpath"/>
   
  -    <available property="junit.present" 
  +    <available property="junit.present"
         classname="junit.framework.TestCase"
         classpathref="classpath"/>
   
  @@ -154,7 +155,7 @@
     <!-- Compiles the samples                                                -->
     <!-- =================================================================== -->
     <target name="samples" depends="compile">
  -    <javac srcdir="." destdir="${build.dest}" 
  +    <javac srcdir="." destdir="${build.dest}"
              classpath="${build.lib}/${name}.jar" debug="${debug}">
         <include name="samples/**/*.java" />
         <exclude name="samples/**/*SMTP*.java" unless="smtp.present" />
  @@ -190,7 +191,7 @@
   
   
     <!-- =================================================================== -->
  -  <!-- Runs the JUnit testcases -->
  +  <!-- Runs the JUnit package testcases -->
     <!-- =================================================================== -->
     <target name="junit" if="junit.present" depends="buildTest">
       <mkdir dir="${basedir}/test-reports" />
  @@ -206,11 +207,50 @@
         </batchtest>
       </junit>
     </target>
  +  
  +  <!-- =================================================================== -->
  +  <!-- Functional tests, no dependencies (for no-build testing)            -->
  +  <!-- =================================================================== -->
  +  <target name="functional-tests-only" depends="setenv">
  +  
  +    <!-- The Axis Ant task must be built (into ANT_HOME/lib)... -->
  +    <ant antfile="test/build_ant.xml" />
  +    
  +    <!--
  +    ...and then the functional tests can be run.  If this step yields a
  +    "can't find class test.functional.ant.RunAxisFunctionalTestsTask",
  +    verify that your Ant classpath contains ANT_HOME/lib.
  +    -->
  +    <ant antfile="test/build_functional_tests.xml" />
  +    
  +  </target>
   
     <!-- =================================================================== -->
  -  <!-- Creates the API documentation                                       -->
  +  <!-- Functional tests, no server (for testing under debugger)            -->
  +  <!-- =================================================================== -->
  +  <target name="functional-tests-noserver" depends="setenv">
  +  
  +    <!-- The Axis Ant task must be built (into ANT_HOME/lib)... -->
  +    <ant antfile="test/build_ant.xml" />
  +    
  +    <!--
  +    ...and then the functional tests can be run.  If this step yields a
  +    "can't find class test.functional.ant.RunAxisFunctionalTestsTask",
  +    verify that your Ant classpath contains ANT_HOME/lib.
  +    -->
  +    <ant antfile="test/build_functional_tests.xml" target="junit-functional-noserver"/>
  +    
  +  </target>
  +
  +  <!-- =================================================================== -->
  +  <!-- After junit, functional tests, if explicitly invoked                -->
     <!-- =================================================================== -->
  +  <target name="functional-tests" depends="junit, samples, functional-tests-only">
  +  </target>
   
  +  <!-- =================================================================== -->
  +  <!-- Creates the API documentation                                       -->
  +  <!-- =================================================================== -->
     <target name="javadocs" depends="setenv" unless="javadoc.notrequired">
       <mkdir dir="${build.javadocs}"/>
       <javadoc packagenames="${packages}"
  
  
  
  1.2       +8 -5      xml-axis/java/samples/bidbuy/TestClient.java
  
  Index: TestClient.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/samples/bidbuy/TestClient.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- TestClient.java	2001/05/09 19:19:52	1.1
  +++ TestClient.java	2001/05/31 09:22:30	1.2
  @@ -60,7 +60,8 @@
   import java.util.Date;
   
   import org.apache.axis.AxisFault ;
  -import org.apache.axis.client.HTTPCall ;
  +import org.apache.axis.client.ServiceClient ;
  +import org.apache.axis.client.http.HTTPClient ;
   import org.apache.axis.encoding.BeanSerializer;
   import org.apache.axis.encoding.SOAPTypeMappingRegistry;
   import org.apache.axis.encoding.ServiceDescription;
  @@ -78,7 +79,7 @@
    */
   public class TestClient {
   
  -    private static HTTPCall call;
  +    private static ServiceClient call;
       private static TypeMappingRegistry map = new SOAPTypeMappingRegistry();
   
       /**
  @@ -102,10 +103,12 @@
           // set up the call object
           Options opts = new Options(args);
           Debug.setDebugLevel( opts.isFlagSet( 'd' ) );
  -        call = new HTTPCall(opts.getURL(), "http://www.soapinterop.org/Buy");
  +        call = new ServiceClient(new HTTPClient());
  +        call.set(HTTPClient.URL, opts.getURL());
  +        call.set(HTTPClient.ACTION, "http://www.soapinterop.org/Buy");
   
           // register the PurchaseOrder class
  -        QName poqn = new QName("http://www.soapinterop.org/Bid", 
  +        QName poqn = new QName("http://www.soapinterop.org/Bid",
                                  "PurchaseOrder");
           Class cls = PurchaseOrder.class;
           call.addSerializer(cls, poqn, new BeanSerializer(cls));
  @@ -144,7 +147,7 @@
   
               // issue the request
               String receipt = (String) call.invoke(
  -                "http://www.soapinterop.org/Bid", "Buy", 
  +                "http://www.soapinterop.org/Bid", "Buy",
                   new Object[] {new RPCParam("PO", po)} );
   
               System.out.println(receipt);
  
  
  
  1.4       +39 -31    xml-axis/java/samples/bidbuy/v3.java
  
  Index: v3.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/samples/bidbuy/v3.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- v3.java	2001/05/10 18:00:28	1.3
  +++ v3.java	2001/05/31 09:22:33	1.4
  @@ -1,6 +1,7 @@
   package samples.bidbuy ;
   
  -import org.apache.axis.client.HTTPCall ;
  +import org.apache.axis.client.ServiceClient ;
  +import org.apache.axis.client.http.HTTPClient ;
   import org.apache.axis.message.RPCElement ;
   import org.apache.axis.message.RPCParam ;
   import org.apache.axis.utils.* ;
  @@ -12,8 +13,9 @@
   public class v3 implements vInterface {
     public void register(String registryURL, Service s) throws Exception {
       try {
  -      HTTPCall call = new HTTPCall( registryURL, 
  -                                    "http://www.soapinterop.org/Register" );
  +      ServiceClient call = new ServiceClient(new HTTPClient());
  +      call.set(HTTPClient.URL, registryURL);
  +      call.set(HTTPClient.ACTION, "http://www.soapinterop.org/Register");
         RPCElement body = new RPCElement( "http://www.soapinterop.org/Registry",
                                           "Register",
                                           new RPCParam[] {
  @@ -35,8 +37,9 @@
   
     public void unregister(String registryURL, String name) throws Exception {
       try {
  -      HTTPCall call = new HTTPCall( registryURL, 
  -                                    "http://www.soapinterop.org/Unregister" );
  +      ServiceClient call = new ServiceClient(new HTTPClient());
  +      call.set(HTTPClient.URL, registryURL);
  +      call.set(HTTPClient.ACTION, "http://www.soapinterop.org/Unegister");
         RPCElement body = new RPCElement( "http://www.soapinterop.org/Registry",
                                           "Unregister",
                                           new RPCParam[] {
  @@ -52,8 +55,9 @@
   
     public Boolean ping(String serverURL) throws Exception {
       try {
  -      HTTPCall call = new HTTPCall( serverURL,
  -                                    "http://www.soapinterop.org/Ping" );
  +      ServiceClient call = new ServiceClient(new HTTPClient());
  +      call.set(HTTPClient.URL, serverURL);
  +      call.set(HTTPClient.ACTION, "http://www.soapinterop.org/Ping");
         call.invoke( "http://www.soapinterop.org/Bid", "Ping", null );
         return( new Boolean(true) );
       }
  @@ -63,19 +67,20 @@
       }
     }
   
  -  public Vector lookupAsString(String registryURL) throws Exception 
  +  public Vector lookupAsString(String registryURL) throws Exception
     {
       try {
         ServiceDescription sd = new ServiceDescription("lookup", true );
  -      sd.addOutputParam("RequestForQuoteResult", 
  +      sd.addOutputParam("RequestForQuoteResult",
                           SOAPTypeMappingRegistry.XSD_DOUBLE);
  -      HTTPCall call = new HTTPCall( registryURL,
  -                                  "http://www.soapinterop.org/LookupAsString" );
  +      ServiceClient call = new ServiceClient(new HTTPClient());
  +      call.set(HTTPClient.URL, registryURL);
  +      call.set(HTTPClient.ACTION, "http://www.soapinterop.org/LookupAsString");
         call.setServiceDescription(sd);
         RPCElement body = new RPCElement( "http://www.soapinterop.org/Registry",
                                           "LookupAsString",
                                           new RPCParam[] {
  -                                          new RPCParam("ServiceType", 
  +                                          new RPCParam("ServiceType",
                                                          "Bid") } );
         String res = (String) call.invoke( body );
         if ( res == null ) return( null );
  @@ -115,19 +120,20 @@
         ServiceDescription sd = new ServiceDescription("RequestForQuote", true );
         sd.addOutputParam("RequestForQuoteResult",
                           SOAPTypeMappingRegistry.XSD_DOUBLE);
  -      sd.addOutputParam("Result", 
  +      sd.addOutputParam("Result",
                           SOAPTypeMappingRegistry.XSD_DOUBLE);
  -      sd.addOutputParam("return", 
  +      sd.addOutputParam("return",
                           SOAPTypeMappingRegistry.XSD_DOUBLE);
  -      HTTPCall call = new HTTPCall( serverURL,
  -                                  "http://www.soapinterop.org/RequestForQuote");
  +      ServiceClient call = new ServiceClient(new HTTPClient());
  +      call.set(HTTPClient.URL, serverURL);
  +      call.set(HTTPClient.ACTION, "http://www.soapinterop.org/RequestForQuote");
         call.setServiceDescription( sd );
         RPCElement body = new RPCElement( "http://www.soapinterop.org/Bid",
                                           "RequestForQuote",
                                           new RPCParam[] {
                                             new RPCParam( "ProductName",
                                                           "widget"),
  -                                          new RPCParam( "Quantity", 
  +                                          new RPCParam( "Quantity",
                                                           new Integer(10) ) } );
         Object r = call.invoke( body );
         if ( r instanceof Float ) r = ((Float)r).toString();
  @@ -146,14 +152,15 @@
         ServiceDescription sd = new ServiceDescription("SimpleBuy", true );
         sd.addOutputParam("SimpleBuyResult",
                           SOAPTypeMappingRegistry.XSD_STRING);
  -      sd.addOutputParam("Result", 
  +      sd.addOutputParam("Result",
                           SOAPTypeMappingRegistry.XSD_STRING);
  -      sd.addOutputParam("return", 
  +      sd.addOutputParam("return",
                           SOAPTypeMappingRegistry.XSD_STRING);
  -      HTTPCall call = new HTTPCall( serverURL,
  -                                  "http://www.soapinterop.org/SimpleBuy" );
  +      ServiceClient call = new ServiceClient(new HTTPClient());
  +      call.set(HTTPClient.URL, serverURL);
  +      call.set(HTTPClient.ACTION, "http://www.soapinterop.org/SimpleBuy");
         RPCElement  body = new RPCElement( "http://www.soapinterop.org/Bid",
  -                                         "SimpleBuy", 
  +                                         "SimpleBuy",
                                            new RPCParam[] {
                                              new RPCParam("Address",
                                                           "123 Main St."),
  @@ -170,20 +177,21 @@
       }
     }
   
  -  public String buy(String serverURL, int quantity, int numItems, double price) 
  -      throws Exception 
  +  public String buy(String serverURL, int quantity, int numItems, double price)
  +      throws Exception
     {
       try {
  -      int      i ; 
  +      int      i ;
         ServiceDescription sd = new ServiceDescription("SimpleBuy", true );
         sd.addOutputParam("BuyResult",
                           SOAPTypeMappingRegistry.XSD_STRING);
  -      sd.addOutputParam("Result", 
  +      sd.addOutputParam("Result",
                           SOAPTypeMappingRegistry.XSD_STRING);
  -      sd.addOutputParam("return", 
  +      sd.addOutputParam("return",
                           SOAPTypeMappingRegistry.XSD_STRING);
  -      HTTPCall call = new HTTPCall( serverURL,
  -                                  "http://www.soapinterop.org/Buy" );
  +      ServiceClient call = new ServiceClient(new HTTPClient());
  +      call.set(HTTPClient.URL, serverURL);
  +      call.set(HTTPClient.ACTION, "http://www.soapinterop.org/Buy");
   
   
         // register the PurchaseOrder class
  @@ -211,7 +219,7 @@
         for ( i = 0 ; i < numItems ; i++ )
           lineItems[i] = new LineItem("Widget"+i,quantity,new BigDecimal(price));
   
  -      PurchaseOrder  po = new PurchaseOrder( "PO1", 
  +      PurchaseOrder  po = new PurchaseOrder( "PO1",
                                                new Date(),
                                                new Address("Mr Big",
                                                            "40 Wildwood Lane",
  @@ -226,7 +234,7 @@
                                                lineItems );
   
         RPCElement  body = new RPCElement( "http://www.soapinterop.org/Bid",
  -                                         "Buy", 
  +                                         "Buy",
                                            new RPCParam[]{
                                              new RPCParam("PO",
                                                           po)} );
  
  
  
  1.4       +0 -1      xml-axis/java/samples/bidbuy/vInterface.java
  
  Index: vInterface.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/samples/bidbuy/vInterface.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- vInterface.java	2001/05/10 18:00:30	1.3
  +++ vInterface.java	2001/05/31 09:22:35	1.4
  @@ -1,6 +1,5 @@
   package samples.bidbuy ;
   
  -import org.apache.axis.client.HTTPCall ;
   import org.apache.axis.message.RPCElement ;
   import org.apache.axis.message.RPCParam ;
   import org.apache.axis.utils.* ;
  
  
  
  1.5       +8 -5      xml-axis/java/samples/echo/TestClient.java
  
  Index: TestClient.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/samples/echo/TestClient.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- TestClient.java	2001/05/22 15:22:06	1.4
  +++ TestClient.java	2001/05/31 09:22:40	1.5
  @@ -59,7 +59,8 @@
   import java.util.Hashtable;
   
   import org.apache.axis.AxisFault ;
  -import org.apache.axis.client.HTTPCall ;
  +import org.apache.axis.client.ServiceClient ;
  +import org.apache.axis.client.http.HTTPClient ;
   import org.apache.axis.encoding.BeanSerializer;
   import org.apache.axis.encoding.SOAPTypeMappingRegistry;
   import org.apache.axis.encoding.ServiceDescription;
  @@ -76,13 +77,13 @@
    */
   public class TestClient {
   
  -    private static HTTPCall call;
  +    private static ServiceClient call;
       private static TypeMappingRegistry map = new SOAPTypeMappingRegistry();
       private static boolean addMethodToAction = false;
       private static String soapAction = "http://soapinterop.org/";
   
       /**
  -     * 
  +     *
        */
       private static boolean equals(Object obj1, Object obj2) {
          if (obj1 == null) return (obj2 == null);
  @@ -119,7 +120,7 @@
               if (addMethodToAction) {
                   action += method;
               }
  -            call.setAction(action);
  +            call.set(HTTPClient.ACTION, action);
   
               // issue the request
               Object gotBack = call.invoke(
  @@ -153,7 +154,9 @@
           if (action != null)
               soapAction = action;
           
  -        call = new HTTPCall(opts.getURL(), "http://soapinterop.org/");
  +        call = new ServiceClient(new HTTPClient());
  +        call.set(HTTPClient.URL, opts.getURL());
  +        call.set(HTTPClient.ACTION, "http://soapinterop.org/");
   
           // register the SOAPStruct class
           QName ssqn = new QName("http://soapinterop.org/xsd", "SOAPStruct");
  
  
  
  1.4       +9 -6      xml-axis/java/samples/misc/TestClient.java
  
  Index: TestClient.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/samples/misc/TestClient.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- TestClient.java	2001/03/08 01:15:09	1.3
  +++ TestClient.java	2001/05/31 09:22:45	1.4
  @@ -2,7 +2,7 @@
    * The Apache Software License, Version 1.1
    *
    *
  - * Copyright (c) 1999 The Apache Software Foundation.  All rights 
  + * Copyright (c) 1999 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -10,7 +10,7 @@
    * are met:
    *
    * 1. Redistributions of source code must retain the above copyright
  - *    notice, this list of conditions and the following disclaimer. 
  + *    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
  @@ -18,7 +18,7 @@
    *    distribution.
    *
    * 3. The end-user documentation included with the redistribution,
  - *    if any, must include the following acknowledgment:  
  + *    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,
  @@ -26,7 +26,7 @@
    *
    * 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 
  + *    software without prior written permission. For written
    *    permission, please contact apache@apache.org.
    *
    * 5. Products derived from this software may not be called "Apache",
  @@ -62,7 +62,8 @@
   import org.apache.axis.*;
   import org.apache.axis.utils.Debug ;
   import org.apache.axis.utils.Options ;
  -import org.apache.axis.client.HTTPMessage ;
  +import org.apache.axis.client.ServiceClient ;
  +import org.apache.axis.client.http.HTTPClient ;
   
   /**
    *
  @@ -81,7 +82,9 @@
         args = opts.getRemainingArgs();
         if ( args != null ) action = args[0];
   
  -      HTTPMessage  hMsg    = new HTTPMessage( url, action );
  +      ServiceClient hMsg = new ServiceClient(new HTTPClient());
  +      hMsg.set(HTTPClient.URL, url);
  +      hMsg.set(HTTPClient.ACTION, action);
   
         if ( opts.isFlagSet('t') > 0 ) hMsg.doLocal = true ;
   
  
  
  
  1.6       +17 -13    xml-axis/java/samples/stock/GetInfo.java
  
  Index: GetInfo.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/samples/stock/GetInfo.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- GetInfo.java	2001/04/27 01:10:19	1.5
  +++ GetInfo.java	2001/05/31 09:22:50	1.6
  @@ -2,7 +2,7 @@
    * The Apache Software License, Version 1.1
    *
    *
  - * Copyright (c) 1999 The Apache Software Foundation.  All rights 
  + * Copyright (c) 1999 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -10,7 +10,7 @@
    * are met:
    *
    * 1. Redistributions of source code must retain the above copyright
  - *    notice, this list of conditions and the following disclaimer. 
  + *    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
  @@ -18,7 +18,7 @@
    *    distribution.
    *
    * 3. The end-user documentation included with the redistribution,
  - *    if any, must include the following acknowledgment:  
  + *    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,
  @@ -26,7 +26,7 @@
    *
    * 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 
  + *    software without prior written permission. For written
    *    permission, please contact apache@apache.org.
    *
    * 5. Products derived from this software may not be called "Apache",
  @@ -62,9 +62,10 @@
   import org.apache.axis.AxisFault ;
   import org.apache.axis.utils.Debug ;
   import org.apache.axis.utils.Options ;
  -import org.apache.axis.client.HTTPCall ;
  +import org.apache.axis.client.ServiceClient ;
  +import org.apache.axis.client.http.HTTPClient ;
   
  -/** 
  +/**
    *
    * @author Doug Davis (dug@us.ibm.com.com)
    */
  @@ -84,14 +85,16 @@
         }
   
         String  symbol = args[0] ;
  -      HTTPCall call = new HTTPCall( opts.getURL(), "urn:cominfo" );
  +      ServiceClient call = new ServiceClient(new HTTPClient());
  +      call.set(HTTPClient.URL, opts.getURL());
  +      call.set(HTTPClient.ACTION, "urn:cominfo");
   
         if ( opts.isFlagSet('t') > 0 ) call.doLocal = true ;
   
  -      call.setUserID( opts.getUser() );
  -      call.setPassword( opts.getPassword() );
  -      String res = (String) call.invoke( 
  -        "http://schemas.xmlsoap.org/soap/envelope/", "getInfo",
  +      call.set( HTTPClient.USER, opts.getUser() );
  +      call.set( HTTPClient.PASSWORD, opts.getPassword() );
  +      String res = (String) call.invoke(
  +        "urn:cominfo", "getInfo",
           new Object[] { args[0], args[1] } );
         
         System.out.println( symbol + ": " + res );
  @@ -100,6 +103,7 @@
         if ( e instanceof AxisFault ) ((AxisFault)e).dump();
         else e.printStackTrace();
       }
  -  };
  +  }
   
  -};
  +}
  +
  
  
  
  1.18      +36 -18    xml-axis/java/samples/stock/GetQuote.java
  
  Index: GetQuote.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/samples/stock/GetQuote.java,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- GetQuote.java	2001/05/04 06:28:20	1.17
  +++ GetQuote.java	2001/05/31 09:22:52	1.18
  @@ -2,7 +2,7 @@
    * The Apache Software License, Version 1.1
    *
    *
  - * Copyright (c) 1999 The Apache Software Foundation.  All rights 
  + * Copyright (c) 1999 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -10,7 +10,7 @@
    * are met:
    *
    * 1. Redistributions of source code must retain the above copyright
  - *    notice, this list of conditions and the following disclaimer. 
  + *    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
  @@ -18,7 +18,7 @@
    *    distribution.
    *
    * 3. The end-user documentation included with the redistribution,
  - *    if any, must include the following acknowledgment:  
  + *    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,
  @@ -26,7 +26,7 @@
    *
    * 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 
  + *    software without prior written permission. For written
    *    permission, please contact apache@apache.org.
    *
    * 5. Products derived from this software may not be called "Apache",
  @@ -60,22 +60,22 @@
   import java.util.*;
   
   import org.apache.axis.AxisFault ;
  -import org.apache.axis.client.HTTPCall ;
  +import org.apache.axis.client.ServiceClient ;
  +import org.apache.axis.client.http.HTTPClient ;
   import org.apache.axis.utils.Debug ;
   import org.apache.axis.utils.Options ;
   import org.apache.axis.utils.QName ;
   import org.apache.axis.encoding.ServiceDescription;
   import org.apache.axis.encoding.SOAPTypeMappingRegistry;
   
  -/** 
  +/**
    *
    * @author Doug Davis (dug@us.ibm.com.com)
    */
   public class GetQuote {
  -
  -  public static void main(String args[]) {
  -
  -    try {
  +    
  +  // helper function; does all the real work
  +    public float getQuote (String args[]) throws Exception {
         Options opts = new Options( args );
   
         Debug.setDebugLevel( opts.isFlagSet( 'd' ) );
  @@ -87,17 +87,19 @@
           System.exit(1);
         }
   
  +      String action = "urn:xmltoday-delayed-quotes";
         String   symbol = args[0] ;
  -      HTTPCall call   = new HTTPCall( opts.getURL(), 
  -                                      "urn:xmltoday-delayed-quotes" );
  +      ServiceClient call = new ServiceClient(new HTTPClient());
  +      call.set(HTTPClient.URL, opts.getURL());
  +      call.set(HTTPClient.ACTION, action);
         ServiceDescription sd = new ServiceDescription("stockQuotes", true);
         sd.addOutputParam("return", SOAPTypeMappingRegistry.XSD_FLOAT);
         call.setServiceDescription(sd);
         
         if ( opts.isFlagSet('t') > 0 ) call.doLocal = true ;
   
  -      call.setUserID( opts.getUser() );
  -      call.setPassword( opts.getPassword() );
  +      call.set( HTTPClient.USER, opts.getUser() );
  +      call.set( HTTPClient.PASSWORD, opts.getPassword() );
   
         // useful option for profiling - perhaps we should remove before
         // shipping?
  @@ -110,17 +112,33 @@
   
         Float res = new Float(0.0F);
         for (int i=0; i<count; i++) {
  -        res = (Float) call.invoke( 
  -          "http://schemas.xmlsoap.org/soap/envelope/", "getQuote",
  -          new Object[] {symbol} );
  +        // the namespace of the call should be the service.
  +        // ...according to Glen... -- RobJ
  +          Object ret = call.invoke(
  +          action, "getQuote", new Object[] {symbol} );
  +          if (ret instanceof String) {
  +              System.out.println("Received problem response from server: "+ret);
  +              throw new AxisFault("", (String)ret, null, null);
  +          }
  +        res = (Float) ret;
         }
   
  -      System.out.println( symbol + ": " + res );
  +        return res.floatValue();
  +    }
  +
  +  public static void main(String args[]) {
  +    try {
  +        float val = new GetQuote().getQuote(args);
  +        // args array gets side-effected
  +        System.out.println(args[0] + ": " + val);
       }
       catch( Exception e ) {
         if ( e instanceof AxisFault ) ((AxisFault)e).dump();
         e.printStackTrace();
       }
  +  }
  +  
  +  public GetQuote () {
     };
   
   };
  
  
  
  1.8       +1 -1      xml-axis/java/samples/stock/deploy.xml
  
  Index: deploy.xml
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/samples/stock/deploy.xml,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- deploy.xml	2001/05/10 22:49:29	1.7
  +++ deploy.xml	2001/05/31 09:22:55	1.8
  @@ -3,7 +3,7 @@
   <!--   java org.apache.axis.utils.Admin deploy.xml              -->
   <!--      from the same dir that the Axis engine runs           -->
   <!-- or                                                         -->
  -<!--   java org.apache.axis.client.AdminClient deploy.xml       -->
  +<!--   java org.apache.axis.client.http.AdminClient deploy.xml  -->
   <!--      after the axis server is running                      -->
   <!-- This file will be replaced by WSDD once it's ready         -->
   
  
  
  
  1.6       +4 -2      xml-axis/java/samples/stock/testit.cmd
  
  Index: testit.cmd
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/samples/stock/testit.cmd,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- testit.cmd	2001/04/22 19:29:12	1.5
  +++ testit.cmd	2001/05/31 09:22:57	1.6
  @@ -1,10 +1,12 @@
   rem this assumes webserver is running on port 8080
   
  +set
  +
   echo First test the StockQuoteService.jws file
   java samples.stock.GetQuote -uuser1 -wpass1 XXX -s/axis/StockQuoteService.jws
   
   echo Deploy everything first
  -java org.apache.axis.client.AdminClient deploy.xml
  +java org.apache.axis.client.http.HTTPAdminClient deploy.xml
   
   echo These next 2 should work...
   java samples.stock.GetQuote -uuser1 -wpass1 XXX
  @@ -19,4 +21,4 @@
   java samples.stock.GetQuote -d -uuser1 -wpass1 XXX
   
   echo Now undeploy everything
  -java org.apache.axis.client.AdminClient undeploy.xml
  +java org.apache.axis.client.http.HTTPAdminClient undeploy.xml
  
  
  
  1.6       +2 -2      xml-axis/java/samples/stock/testit.sh
  
  Index: testit.sh
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/samples/stock/testit.sh,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- testit.sh	2001/04/22 19:29:12	1.5
  +++ testit.sh	2001/05/31 09:22:59	1.6
  @@ -2,7 +2,7 @@
   # this assumes webserver is running on port 8080
   
   echo "Deploy everything first"
  -java org.apache.axis.client.AdminClient deploy.xml
  +java org.apache.axis.client.http.HTTPAdminClient deploy.xml
   
   echo "These next 2 should work..."
   java samples.stock.GetQuote -uuser1 -wpass1 XXX
  @@ -17,4 +17,4 @@
   java samples.stock.GetQuote -d -uuser1 -wpass1 XXX
   
   # Now undeploy everything
  -java org.apache.axis.client.AdminClient undeploy.xml
  +java org.apache.axis.client.http.HTTPAdminClient undeploy.xml
  
  
  
  1.2       +10 -7     xml-axis/java/samples/transport/FileTest.java
  
  Index: FileTest.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/samples/transport/FileTest.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- FileTest.java	2001/05/30 14:20:42	1.1
  +++ FileTest.java	2001/05/31 09:23:10	1.2
  @@ -3,7 +3,9 @@
   import java.lang.Thread ;
   
   import org.apache.axis.AxisFault ;
  -import org.apache.axis.client.* ;
  +import org.apache.axis.client.AxisClient ;
  +import org.apache.axis.client.ServiceClient ;
  +import org.apache.axis.client.http.HTTPClient ;
   import org.apache.axis.utils.Debug ;
   import org.apache.axis.utils.Options ;
   import org.apache.axis.encoding.* ;
  @@ -33,27 +35,28 @@
         }
       
         String   symbol = args[0] ;
  -      HTTPCall call   = new HTTPCall( opts.getURL(),
  -                                      "urn:xmltoday-delayed-quotes" );
  +      ServiceClient call   = new ServiceClient(new HTTPClient());
  +      call.set(HTTPClient.URL, opts.getURL());
  +      call.set(HTTPClient.ACTION, "urn:xmltoday-delayed-quotes");
         ServiceDescription sd = new ServiceDescription("stockQuotes", true);
         sd.addOutputParam("return", SOAPTypeMappingRegistry.XSD_FLOAT);
         call.setServiceDescription(sd);
       
         if ( opts.isFlagSet('t') > 0 ) call.doLocal = true ;
       
  -      call.setUserID( opts.getUser() );
  -      call.setPassword( opts.getPassword() );
  +      call.set(AxisClient.USER, opts.getUser() );
  +      call.set(AxisClient.PASSWORD, opts.getPassword() );
         call.setTransportInput( "FileSender" );
       
         Float res = new Float(0.0F);
  -      res = (Float) call.invoke( "http://schemas.xmlsoap.org/soap/envelope/", 
  +      res = (Float) call.invoke( "http://schemas.xmlsoap.org/soap/envelope/",
                                    "getQuote",
                                    new Object[] {symbol} );
       
         System.out.println( symbol + ": " + res );
   
         // Once more just for fun...
  -      res = (Float) call.invoke( "http://schemas.xmlsoap.org/soap/envelope/", 
  +      res = (Float) call.invoke( "http://schemas.xmlsoap.org/soap/envelope/",
                                    "getQuote",
                                    new Object[] {symbol} );
       
  
  
  
  1.24      +7 -1      xml-axis/java/src/org/apache/axis/MessageContext.java
  
  Index: MessageContext.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/MessageContext.java,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- MessageContext.java	2001/05/30 20:00:03	1.23
  +++ MessageContext.java	2001/05/31 09:23:16	1.24
  @@ -215,7 +215,7 @@
         HandlerRegistry sr = (HandlerRegistry)
                               getProperty(Constants.SERVICE_REGISTRY);
         if (sr == null)
  -	    return;
  +        return;
         
         Handler service = sr.find(tServ);
         if (service == null)
  @@ -273,6 +273,12 @@
   
       /** The protocol specific handler (ie. SOAP) */
       public static String PROTOCOL_HANDLER    = "procotol.handler";
  +    
  +    /** Has a quit been requested? Hackish... but useful... -- RobJ */
  +    public static String QUIT_REQUESTED = "quit.requested";
  +  
  +  /** Property name for session context */
  +  public static String SESSION_CONTEXT = "session.context";
   
       /** A String with the user's ID (if available)
        */
  
  
  
  1.7       +112 -91   xml-axis/java/src/org/apache/axis/client/AxisClient.java
  
  Index: AxisClient.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/client/AxisClient.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- AxisClient.java	2001/05/30 14:18:18	1.6
  +++ AxisClient.java	2001/05/31 09:23:24	1.7
  @@ -62,15 +62,26 @@
   import org.apache.axis.registries.* ;
   
   /**
  + * Provides the equivalent of an "Axis engine" on the client side.
  + * Subclasses hardcode initialization & setup logic for particular
  + * client-side transports.
    *
  + * @author Rob Jellinghaus (robj@unrealities.com)
    * @author Doug Davis (dug@us.ibm.com)
    * @author Glen Daniels (gdaniels@allaire.com)
    */
  -public class AxisClient extends BasicHandler
  +public abstract class AxisClient extends BasicHandler
   {
       public AxisClient() {}
  -
  +    
       /**
  +     * Property names for user & password.
  +     * Soon to be moved elsewhere.
  +     */
  +    public static String USER = "user";
  +    public static String PASSWORD = "password";
  +    
  +    /**
        * Allows the Listener to specify which handler/service registry
        * implementation they want to use.
        */
  @@ -83,7 +94,7 @@
           addOption(Constants.SERVICE_REGISTRY, services);
           Debug.Print( 1, "Exit: AxisClient::Constructor");
       }
  -
  +    
       /**
        * Find/load the registries and save them so we don't need to do this
        * each time we're called.
  @@ -96,27 +107,37 @@
           hr.setOnServer( false );
           hr.init();
           addOption( Constants.HANDLER_REGISTRY, hr );
  -
  +        
           // Load the simple deployed services registry and init it
  -        DefaultServiceRegistry  sr = 
  -          new DefaultServiceRegistry(Constants.CLIENT_SERVICE_REGISTRY);
  +        DefaultServiceRegistry  sr =
  +            new DefaultServiceRegistry(Constants.CLIENT_SERVICE_REGISTRY);
           sr.setHandlerRegistry( hr ); // Needs to know about 'hr'
           sr.setOnServer( false );
           sr.init();
           addOption( Constants.SERVICE_REGISTRY, sr );
           Debug.Print( 1, "Exit: AxisClient::init" );
       }
  -
  +    
       /**
  +     * Set up the message context as appropriate for this transport.
  +     * @param context the context to set up (with transport chain info, etc.)
  +     * @param message the client service instance
  +     * @throws AxisFault if service cannot be found
  +     */
  +    public abstract void setupMessageContext
  +        (MessageContext context, ServiceClient message, boolean doLocal)
  +        throws AxisFault;
  +    
  +    /**
        * Main routine of the AXIS server.  In short we locate the appropriate
        * handler for the desired service and invoke() it.
        */
       public void invoke(MessageContext msgContext) throws AxisFault {
           Debug.Print( 1, "Enter: AxisClient::invoke" );
  -
  +        
           String  hName = null ;
           Handler h     = null ;
  -
  +        
           /* Do some prep-work.  Get the registries and put them in the */
           /* msgContext so they can be used by later handlers.          */
           /**************************************************************/
  @@ -124,92 +145,92 @@
               (HandlerRegistry) getOption(Constants.HANDLER_REGISTRY);
           HandlerRegistry sr = 
               (HandlerRegistry) getOption(Constants.SERVICE_REGISTRY);
  -
  +        
           if ( hr != null )
  -          msgContext.setProperty(Constants.HANDLER_REGISTRY, hr);
  +            msgContext.setProperty(Constants.HANDLER_REGISTRY, hr);
           if ( sr != null )
  -          msgContext.setProperty(Constants.SERVICE_REGISTRY, sr);
  -
  +            msgContext.setProperty(Constants.SERVICE_REGISTRY, sr);
  +        
           try {
  -          hName = msgContext.getStrProp( MessageContext.ENGINE_HANDLER );
  -          Debug.Print( 2, "EngineHandler: " + hName );
  -
  -          if ( hName != null ) {
  -            h = hr.find( hName );
  -            if ( h != null ) 
  -              h.invoke(msgContext);
  -            else
  -              throw new AxisFault( "Client.error",
  -                                   "Can't locate handler: " + hName,
  -                                   null, null );
  -          }
  -          else {
  -            // This really should be in a handler - but we need to discuss it
  -            // first - to make sure that's what we want.
  -  
  -            /* Now we do the 'real' work.  The flow is basically:         */
  -            /*                                                            */
  -            /*   Service Specific Request Chain                           */
  -            /*   Global Request Chain                                     */
  -            /*   Transport Request Chain - must have a send at the end    */
  -            /*   Transport Response Chain                                 */
  -            /*   Global Response Chain                                    */
  -            /*   Service Specific Response Chain                          */
  -            /*   Protocol Specific-Handler/Checker                        */
  -            /**************************************************************/
  -   
  -            // When do we call init/cleanup??
  -  
  -            SimpleTargetedChain service = null ;
  -  
  -            /* Process the Service Specific Request Chain */
  -            /**********************************************/
  -            hName =  msgContext.getTargetService();
  -            if ( hName != null && (h = sr.find( hName )) != null ) {
  -              if ( h instanceof SimpleTargetedChain ) {
  -                service = (SimpleTargetedChain) h ;
  -                h = service.getInputChain();
  -              }
  -              if ( h != null ) h.invoke( msgContext );
  +            hName = msgContext.getStrProp( MessageContext.ENGINE_HANDLER );
  +            Debug.Print( 2, "EngineHandler: " + hName );
  +            
  +            if ( hName != null ) {
  +                h = hr.find( hName );
  +                if ( h != null )
  +                    h.invoke(msgContext);
  +                else
  +                    throw new AxisFault( "Client.error",
  +                                        "Can't locate handler: " + hName,
  +                                        null, null );
               }
  -  
  -            /* Process the Global Input Chain */
  -            /**********************************/
  -            hName = Constants.GLOBAL_INPUT ;
  -            if ( hName != null  && (h = hr.find( hName )) != null )
  -                h.invoke(msgContext);
  -  
  -            /* Process the Transport Specific Input Chain */
  -            /**********************************************/
  -            hName = msgContext.getStrProp(MessageContext.TRANS_INPUT);
  -            if ( hName != null && (h = hr.find( hName )) != null )
  -              h.invoke(msgContext);
  -  
  -            /* Note: at the end of the transport specific input chain should */
  -            /* have been a handler that called the server.                   */
  -            /*****************************************************************/
  -    
  -            /* Process the Transport Specific Output Chain */
  -            /***********************************************/
  -            hName = msgContext.getStrProp(MessageContext.TRANS_OUTPUT);
  -            if ( hName != null  && (h = hr.find( hName )) != null )
  -              h.invoke(msgContext);
  -  
  -            /* Process the Global Output Chain */
  -            /***********************************/
  -            hName = Constants.GLOBAL_OUTPUT ;
  -            if ( hName != null && (h = hr.find( hName )) != null )
  -              h.invoke(msgContext);
  -  
  -            if ( service != null ) {
  -              h = service.getOutputChain();
  -              if ( h != null )
  -                h.invoke(msgContext);
  +            else {
  +                // This really should be in a handler - but we need to discuss it
  +                // first - to make sure that's what we want.
  +                
  +                /* Now we do the 'real' work.  The flow is basically:         */
  +                /*                                                            */
  +                /*   Service Specific Request Chain                           */
  +                /*   Global Request Chain                                     */
  +                /*   Transport Request Chain - must have a send at the end    */
  +                /*   Transport Response Chain                                 */
  +                /*   Global Response Chain                                    */
  +                /*   Service Specific Response Chain                          */
  +                /*   Protocol Specific-Handler/Checker                        */
  +                /**************************************************************/
  +                
  +                // When do we call init/cleanup??
  +                
  +                SimpleTargetedChain service = null ;
  +                
  +                /* Process the Service Specific Request Chain */
  +                /**********************************************/
  +                hName =  msgContext.getTargetService();
  +                if ( hName != null && (h = sr.find( hName )) != null ) {
  +                    if ( h instanceof SimpleTargetedChain ) {
  +                        service = (SimpleTargetedChain) h ;
  +                        h = service.getInputChain();
  +                    }
  +                    if ( h != null ) h.invoke( msgContext );
  +                }
  +                
  +                /* Process the Global Input Chain */
  +                /**********************************/
  +                hName = Constants.GLOBAL_INPUT ;
  +                if ( hName != null  && (h = hr.find( hName )) != null )
  +                    h.invoke(msgContext);
  +                
  +                /* Process the Transport Specific Input Chain */
  +                /**********************************************/
  +                hName = msgContext.getStrProp(MessageContext.TRANS_INPUT);
  +                if ( hName != null && (h = hr.find( hName )) != null )
  +                    h.invoke(msgContext);
  +                
  +                /* Note: at the end of the transport specific input chain should */
  +                /* have been a handler that called the server.                   */
  +                /*****************************************************************/
  +                
  +                /* Process the Transport Specific Output Chain */
  +                /***********************************************/
  +                hName = msgContext.getStrProp(MessageContext.TRANS_OUTPUT);
  +                if ( hName != null  && (h = hr.find( hName )) != null )
  +                    h.invoke(msgContext);
  +                
  +                /* Process the Global Output Chain */
  +                /***********************************/
  +                hName = Constants.GLOBAL_OUTPUT ;
  +                if ( hName != null && (h = hr.find( hName )) != null )
  +                    h.invoke(msgContext);
  +                
  +                if ( service != null ) {
  +                    h = service.getOutputChain();
  +                    if ( h != null )
  +                        h.invoke(msgContext);
  +                }
  +                
  +                // Do SOAP Semantics checks here - this needs to be a call to
  +                // a pluggable object/handler/something
               }
  -  
  -            // Do SOAP Semantics checks here - this needs to be a call to
  -            // a pluggable object/handler/something
  -          }
           }
           catch( Exception e ) {
               // Should we even bother catching it ?
  @@ -219,7 +240,7 @@
           }
           Debug.Print( 1, "Exit: AxisClient::invoke" );
       };
  -
  +    
       public void undo(MessageContext msgContext) {
           Debug.Print( 1, "Enter: AxisClient::undo" );
           Debug.Print( 1, "Exit: AxisClient::undo" );
  
  
  
  1.3       +37 -18    xml-axis/java/src/org/apache/axis/deployment/v2dd/V2DDDeployableItem.java
  
  Index: V2DDDeployableItem.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/deployment/v2dd/V2DDDeployableItem.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- V2DDDeployableItem.java	2001/05/06 04:09:43	1.2
  +++ V2DDDeployableItem.java	2001/05/31 09:23:37	1.3
  @@ -2,7 +2,7 @@
    * The Apache Software License, Version 1.1
    *
    *
  - * Copyright (c) 1999 The Apache Software Foundation.  All rights 
  + * Copyright (c) 1999 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -10,7 +10,7 @@
    * are met:
    *
    * 1. Redistributions of source code must retain the above copyright
  - *    notice, this list of conditions and the following disclaimer. 
  + *    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
  @@ -18,7 +18,7 @@
    *    distribution.
    *
    * 3. The end-user documentation included with the redistribution,
  - *    if any, must include the following acknowledgment:  
  + *    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,
  @@ -26,7 +26,7 @@
    *
    * 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 
  + *    software without prior written permission. For written
    *    permission, please contact apache@apache.org.
    *
    * 5. Products derived from this software may not be called "Apache",
  @@ -57,7 +57,8 @@
   import java.io.Serializable;
   import org.apache.axis.Handler;
   import org.apache.axis.SimpleTargetedChain;
  -import org.apache.axis.handlers.providers.*;
  +import org.apache.axis.providers.*;
  +import org.apache.axis.providers.java.*;
   import org.apache.axis.deployment.v2dd.providers.*;
   import org.apache.axis.deployment.DeployableItem;
   import org.apache.axis.deployment.DeploymentRegistry;
  @@ -66,20 +67,21 @@
   /**
    * This is the class that actually bridges the gap between
    * SOAP 2.x and Axis.  An instance of this class is stored
  - * within the registry and a new handler is created that 
  + * within the registry and a new handler is created that
    * represents the SOAP 2.x service when the newInstance
    * method is called.
    */
  -public class V2DDDeployableItem implements DeployableItem, Serializable { 
  +public class V2DDDeployableItem implements DeployableItem, Serializable {
   
       V2DDService service;
       QName qname;
       
  -    public V2DDDeployableItem(V2DDService service) {        
  +    public V2DDDeployableItem(V2DDService service) {
           this.service = service;
       }
       
  -    public QName getQName() {
        if (qname == null) {
  +    public QName getQName() {
  +        if (qname == null) {
               qname = new QName(null, service.getID());
           }
           return qname;
  @@ -87,19 +89,36 @@
   
       public Handler newInstance(DeploymentRegistry registry) {
           
  -        // we would create an instance of the SOAP v2.x
        // compatible handler here using the service
        // definition to configure the instance
  -        
        try {
  -            SimpleTargetedChain stc = new SimpleTargetedChain();
            
            V2DDProvider prov = service.getProvider();
  -            String[] methods = prov.getMethods();

            BasicProvider provider = null;
            
  -            if (prov instanceof V2DDComProvider) provider = new ComProvider();
            if (prov instanceof V2DDScriptProvider) provider = new BSFProvider();
            if (provider == null) provider = new JavaProvider();
  -               
            provider.setOptions(prov.getOptionsTable());
  +        // we would create an instance of the SOAP v2.x
  +        // compatible handler here using the service
  +        // definition to configure the instance
  +        
  +        try {
  +            SimpleTargetedChain stc = new SimpleTargetedChain();
  +            
  +            V2DDProvider prov = service.getProvider();
  +            String[] methods = prov.getMethods();
  +
  +            BasicProvider provider = null;
  +            
  +            if (prov instanceof V2DDComProvider) provider = new ComProvider();
  +            if (prov instanceof V2DDScriptProvider) provider = new BSFProvider();
  +            
  +            // ROBJ 911 -- this will need to be fixed now that JavaProvider really
  +            // exists!  But I am not sure of the intended semantics here.  Nor am
  +            // I sure whether any test code exists for this...?!?!
  +            if (provider == null) provider = new RPCProvider();
  +               
  +            provider.setOptions(prov.getOptionsTable());
               prov.newInstance(provider);
               
               for (int n = 0; n < methods.length; n++) {
                   provider.addOperation(methods[n],
  -                                      new QName(V2DDConstants.V2DD_NS, 
  -                                                methods[n]));
            }
  -            
            return provider;
  +                                      new QName(V2DDConstants.V2DD_NS,
  +                                                methods[n]));
  +            }
  +            
  +            return provider;
           } catch (Exception e) {
               return null;
           }
  
  
  
  1.3       +9 -9      xml-axis/java/src/org/apache/axis/deployment/v2dd/V2DDProvider.java
  
  Index: V2DDProvider.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/deployment/v2dd/V2DDProvider.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- V2DDProvider.java	2001/05/06 04:09:43	1.2
  +++ V2DDProvider.java	2001/05/31 09:23:40	1.3
  @@ -2,7 +2,7 @@
    * The Apache Software License, Version 1.1
    *
    *
  - * Copyright (c) 1999 The Apache Software Foundation.  All rights 
  + * Copyright (c) 1999 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -10,7 +10,7 @@
    * are met:
    *
    * 1. Redistributions of source code must retain the above copyright
  - *    notice, this list of conditions and the following disclaimer. 
  + *    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
  @@ -18,7 +18,7 @@
    *    distribution.
    *
    * 3. The end-user documentation included with the redistribution,
  - *    if any, must include the following acknowledgment:  
  + *    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,
  @@ -26,7 +26,7 @@
    *
    * 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 
  + *    software without prior written permission. For written
    *    permission, please contact apache@apache.org.
    *
    * 5. Products derived from this software may not be called "Apache",
  @@ -58,15 +58,15 @@
   import java.util.Hashtable;
   import org.w3c.dom.Element;
   import org.w3c.dom.NodeList;
  -import org.apache.axis.handlers.providers.BasicProvider;
  +import org.apache.axis.providers.BasicProvider;
   import org.apache.axis.utils.LockableHashtable;
   import org.apache.axis.deployment.v2dd.providers.*;
   
  -public class V2DDProvider extends V2DDElement { 
  +public class V2DDProvider extends V2DDElement {
   
       private static Hashtable providers;
       static {
  -        providers = new Hashtable();   
  +        providers = new Hashtable();
           providers.put("java", V2DDJavaProvider.class);
           providers.put("script", V2DDScriptProvider.class);
           providers.put("com", V2DDComProvider.class);
  @@ -83,7 +83,7 @@
           } catch (Exception ex) {
               return null;
           }
  -    }    
  +    }
       
       LockableHashtable options;
       
  @@ -132,7 +132,7 @@
               for (int n = 0; n < opts.length; n++) {
                   options.put(opts[n].getKey(), opts[n].getValue(), true);
               }
  -        } 
  +        }
           return options;
       }
       
  
  
  
  1.3       +7 -7      xml-axis/java/src/org/apache/axis/deployment/v2dd/providers/V2DDComProvider.java
  
  Index: V2DDComProvider.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/deployment/v2dd/providers/V2DDComProvider.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- V2DDComProvider.java	2001/05/06 04:09:43	1.2
  +++ V2DDComProvider.java	2001/05/31 09:23:44	1.3
  @@ -2,7 +2,7 @@
    * The Apache Software License, Version 1.1
    *
    *
  - * Copyright (c) 1999 The Apache Software Foundation.  All rights 
  + * Copyright (c) 1999 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -10,7 +10,7 @@
    * are met:
    *
    * 1. Redistributions of source code must retain the above copyright
  - *    notice, this list of conditions and the following disclaimer. 
  + *    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
  @@ -18,7 +18,7 @@
    *    distribution.
    *
    * 3. The end-user documentation included with the redistribution,
  - *    if any, must include the following acknowledgment:  
  + *    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,
  @@ -26,7 +26,7 @@
    *
    * 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 
  + *    software without prior written permission. For written
    *    permission, please contact apache@apache.org.
    *
    * 5. Products derived from this software may not be called "Apache",
  @@ -54,15 +54,15 @@
    */
   package org.apache.axis.deployment.v2dd.providers;
   
  -import org.apache.axis.handlers.providers.BasicProvider;
  +import org.apache.axis.providers.BasicProvider;
   import org.apache.axis.deployment.v2dd.V2DDProvider;
   import org.apache.axis.deployment.v2dd.V2DDOption;
   import org.apache.axis.deployment.v2dd.V2DDConstants;
  -import org.apache.axis.handlers.providers.ComProvider;
  +import org.apache.axis.providers.ComProvider;
   import org.w3c.dom.Element;
   import org.w3c.dom.NodeList;
   
  -public class V2DDComProvider extends V2DDProvider { 
  +public class V2DDComProvider extends V2DDProvider {
   
       public V2DDComProvider(Element e) {
           super(e);
  
  
  
  1.3       +8 -8      xml-axis/java/src/org/apache/axis/deployment/v2dd/providers/V2DDJavaProvider.java
  
  Index: V2DDJavaProvider.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/deployment/v2dd/providers/V2DDJavaProvider.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- V2DDJavaProvider.java	2001/05/06 04:09:43	1.2
  +++ V2DDJavaProvider.java	2001/05/31 09:23:46	1.3
  @@ -2,7 +2,7 @@
    * The Apache Software License, Version 1.1
    *
    *
  - * Copyright (c) 1999 The Apache Software Foundation.  All rights 
  + * Copyright (c) 1999 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -10,7 +10,7 @@
    * are met:
    *
    * 1. Redistributions of source code must retain the above copyright
  - *    notice, this list of conditions and the following disclaimer. 
  + *    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
  @@ -18,7 +18,7 @@
    *    distribution.
    *
    * 3. The end-user documentation included with the redistribution,
  - *    if any, must include the following acknowledgment:  
  + *    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,
  @@ -26,7 +26,7 @@
    *
    * 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 
  + *    software without prior written permission. For written
    *    permission, please contact apache@apache.org.
    *
    * 5. Products derived from this software may not be called "Apache",
  @@ -54,14 +54,14 @@
    */
   package org.apache.axis.deployment.v2dd.providers;
   
  -import org.apache.axis.handlers.providers.BasicProvider;
  +import org.apache.axis.providers.BasicProvider;
   import org.apache.axis.deployment.v2dd.V2DDProvider;
   import org.apache.axis.deployment.v2dd.V2DDConstants;
  -import org.apache.axis.handlers.providers.JavaProvider;
  +import org.apache.axis.providers.java.JavaProvider;
   import org.w3c.dom.Element;
   import org.w3c.dom.NodeList;
   
  -public class V2DDJavaProvider extends V2DDProvider { 
  +public class V2DDJavaProvider extends V2DDProvider {
   
       public V2DDJavaProvider(Element e) {
           super(e);
  @@ -71,7 +71,7 @@
           NodeList nl = getElement().getElementsByTagNameNS(V2DDConstants.V2DD_NS, "java");
           Element java = (Element)nl.item(0);
           provider.addOption(JavaProvider.OPTION_CLASSNAME, java.getAttribute("class"));
  -        provider.addOption(JavaProvider.OPTION_IS_STATIC, 
  +        provider.addOption(JavaProvider.OPTION_IS_STATIC,
                              new Boolean(java.getAttribute("isStatic")));
       }
       
  
  
  
  1.3       +7 -7      xml-axis/java/src/org/apache/axis/deployment/v2dd/providers/V2DDScriptProvider.java
  
  Index: V2DDScriptProvider.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/deployment/v2dd/providers/V2DDScriptProvider.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- V2DDScriptProvider.java	2001/05/06 04:09:43	1.2
  +++ V2DDScriptProvider.java	2001/05/31 09:23:47	1.3
  @@ -2,7 +2,7 @@
    * The Apache Software License, Version 1.1
    *
    *
  - * Copyright (c) 1999 The Apache Software Foundation.  All rights 
  + * Copyright (c) 1999 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -10,7 +10,7 @@
    * are met:
    *
    * 1. Redistributions of source code must retain the above copyright
  - *    notice, this list of conditions and the following disclaimer. 
  + *    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
  @@ -18,7 +18,7 @@
    *    distribution.
    *
    * 3. The end-user documentation included with the redistribution,
  - *    if any, must include the following acknowledgment:  
  + *    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,
  @@ -26,7 +26,7 @@
    *
    * 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 
  + *    software without prior written permission. For written
    *    permission, please contact apache@apache.org.
    *
    * 5. Products derived from this software may not be called "Apache",
  @@ -54,15 +54,15 @@
    */
   package org.apache.axis.deployment.v2dd.providers;
   
  -import org.apache.axis.handlers.providers.BasicProvider;
  +import org.apache.axis.providers.BasicProvider;
   import org.apache.axis.deployment.v2dd.V2DDProvider;
   import org.apache.axis.deployment.v2dd.V2DDConstants;
  -import org.apache.axis.handlers.providers.BSFProvider;
  +import org.apache.axis.providers.BSFProvider;
   import org.apache.axis.utils.XMLUtils;
   import org.w3c.dom.Element;
   import org.w3c.dom.NodeList;
   
  -public class V2DDScriptProvider extends V2DDProvider { 
  +public class V2DDScriptProvider extends V2DDProvider {
   
       public V2DDScriptProvider(Element e) {
           super(e);
  
  
  
  1.3       +8 -8      xml-axis/java/src/org/apache/axis/deployment/wsdd/providers/WSDDBsfProvider.java
  
  Index: WSDDBsfProvider.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/deployment/wsdd/providers/WSDDBsfProvider.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- WSDDBsfProvider.java	2001/05/06 04:09:44	1.2
  +++ WSDDBsfProvider.java	2001/05/31 09:23:54	1.3
  @@ -2,7 +2,7 @@
    * The Apache Software License, Version 1.1
    *
    *
  - * Copyright (c) 1999 The Apache Software Foundation.  All rights 
  + * Copyright (c) 1999 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -10,7 +10,7 @@
    * are met:
    *
    * 1. Redistributions of source code must retain the above copyright
  - *    notice, this list of conditions and the following disclaimer. 
  + *    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
  @@ -18,7 +18,7 @@
    *    distribution.
    *
    * 3. The end-user documentation included with the redistribution,
  - *    if any, must include the following acknowledgment:  
  + *    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,
  @@ -26,7 +26,7 @@
    *
    * 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 
  + *    software without prior written permission. For written
    *    permission, please contact apache@apache.org.
    *
    * 5. Products derived from this software may not be called "Apache",
  @@ -59,14 +59,14 @@
   import org.apache.axis.deployment.wsdd.WSDDException;
   import org.apache.axis.deployment.wsdd.WSDDConstants;
   import org.apache.axis.deployment.DeploymentRegistry;
  -import org.apache.axis.handlers.providers.BSFProvider;
  -import org.apache.axis.handlers.providers.BasicProvider;
  +import org.apache.axis.providers.BSFProvider;
  +import org.apache.axis.providers.BasicProvider;
   import org.apache.axis.utils.QName;
   import org.apache.axis.utils.XMLUtils;
  -import org.w3c.dom.Element; 
  +import org.w3c.dom.Element;
   import org.w3c.dom.NodeList;
   
  -public class WSDDBsfProvider extends WSDDProvider { 
  +public class WSDDBsfProvider extends WSDDProvider {
       
       public WSDDBsfProvider(Element e) throws WSDDException { super(e); }
       
  
  
  
  1.3       +8 -8      xml-axis/java/src/org/apache/axis/deployment/wsdd/providers/WSDDComProvider.java
  
  Index: WSDDComProvider.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/deployment/wsdd/providers/WSDDComProvider.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- WSDDComProvider.java	2001/05/06 04:09:44	1.2
  +++ WSDDComProvider.java	2001/05/31 09:23:56	1.3
  @@ -2,7 +2,7 @@
    * The Apache Software License, Version 1.1
    *
    *
  - * Copyright (c) 1999 The Apache Software Foundation.  All rights 
  + * Copyright (c) 1999 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -10,7 +10,7 @@
    * are met:
    *
    * 1. Redistributions of source code must retain the above copyright
  - *    notice, this list of conditions and the following disclaimer. 
  + *    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
  @@ -18,7 +18,7 @@
    *    distribution.
    *
    * 3. The end-user documentation included with the redistribution,
  - *    if any, must include the following acknowledgment:  
  + *    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,
  @@ -26,7 +26,7 @@
    *
    * 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 
  + *    software without prior written permission. For written
    *    permission, please contact apache@apache.org.
    *
    * 5. Products derived from this software may not be called "Apache",
  @@ -59,15 +59,15 @@
   import org.apache.axis.deployment.wsdd.WSDDException;
   import org.apache.axis.deployment.wsdd.WSDDConstants;
   import org.apache.axis.deployment.DeploymentRegistry;
  -import org.apache.axis.handlers.providers.ComProvider;
  -import org.apache.axis.handlers.providers.BasicProvider;
  +import org.apache.axis.providers.ComProvider;
  +import org.apache.axis.providers.BasicProvider;
   import org.apache.axis.utils.QName;
   import org.w3c.dom.Element;
   import org.w3c.dom.NodeList;
   
  -public class WSDDComProvider extends WSDDProvider { 
  +public class WSDDComProvider extends WSDDProvider {
       
  -    public WSDDComProvider(Element e) throws WSDDException { super(e); }    
  +    public WSDDComProvider(Element e) throws WSDDException { super(e); }
     
       public Handler newProviderInstance(DeploymentRegistry registry) throws Exception {
           String type;
  
  
  
  1.3       +7 -7      xml-axis/java/src/org/apache/axis/deployment/wsdd/providers/WSDDJavaProvider.java
  
  Index: WSDDJavaProvider.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/deployment/wsdd/providers/WSDDJavaProvider.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- WSDDJavaProvider.java	2001/05/06 04:09:44	1.2
  +++ WSDDJavaProvider.java	2001/05/31 09:23:57	1.3
  @@ -2,7 +2,7 @@
    * The Apache Software License, Version 1.1
    *
    *
  - * Copyright (c) 1999 The Apache Software Foundation.  All rights 
  + * Copyright (c) 1999 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -10,7 +10,7 @@
    * are met:
    *
    * 1. Redistributions of source code must retain the above copyright
  - *    notice, this list of conditions and the following disclaimer. 
  + *    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
  @@ -18,7 +18,7 @@
    *    distribution.
    *
    * 3. The end-user documentation included with the redistribution,
  - *    if any, must include the following acknowledgment:  
  + *    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,
  @@ -26,7 +26,7 @@
    *
    * 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 
  + *    software without prior written permission. For written
    *    permission, please contact apache@apache.org.
    *
    * 5. Products derived from this software may not be called "Apache",
  @@ -59,13 +59,13 @@
   import org.apache.axis.deployment.wsdd.WSDDException;
   import org.apache.axis.deployment.DeploymentRegistry;
   import org.apache.axis.deployment.wsdd.WSDDConstants;
  -import org.apache.axis.handlers.providers.JavaProvider;
  -import org.apache.axis.handlers.providers.BasicProvider;
  +import org.apache.axis.providers.java.JavaProvider;
  +import org.apache.axis.providers.BasicProvider;
   import org.apache.axis.utils.QName;
   import org.w3c.dom.Element;
   import org.w3c.dom.NodeList;
   
  -public class WSDDJavaProvider extends WSDDProvider { 
  +public class WSDDJavaProvider extends WSDDProvider {
       
       public WSDDJavaProvider(Element e) throws WSDDException { super(e); }
       
  
  
  
  1.9       +5 -3      xml-axis/java/src/org/apache/axis/handlers/JWSProcessor.java
  
  Index: JWSProcessor.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/handlers/JWSProcessor.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- JWSProcessor.java	2001/05/10 22:19:29	1.8
  +++ JWSProcessor.java	2001/05/31 09:24:10	1.9
  @@ -60,6 +60,8 @@
   import org.apache.axis.utils.Debug ;
   import org.apache.axis.utils.XMLUtils ;
   import org.apache.axis.utils.AxisClassLoader ;
  +import org.apache.axis.providers.java.RPCProvider;
  +
   import sun.tools.javac.Main;
   
   import org.w3c.dom.* ;
  @@ -131,7 +133,7 @@
           String            outdir   = f1.getParent();
           String[]          args     = null ;
           
  -        args = new String[] { "-d", outdir, 
  +        args = new String[] { "-d", outdir,
                                 "-classpath",
                                   System.getProperty("java.class.path" ),
                                 jFile };
  @@ -174,10 +176,10 @@
           cl.registerClass( clsName, cFile );
         msgContext.setClassLoader( cl );
   
  -      /* Create a new RPCDispatchHandler - this will be the "service"   */
  +      /* Create a new RPCProvider - this will be the "service"   */
         /* that we invoke.                                                */
         /******************************************************************/
  -      Handler rpc = new RPCDispatchHandler();
  +      Handler rpc = new RPCProvider();
         msgContext.setServiceHandler( rpc );
   
         rpc.addOption( "className", clsName );
  
  
  
  1.1                  xml-axis/java/src/org/apache/axis/handlers/tcp/TCPActionHandler.java
  
  Index: TCPActionHandler.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 apache@apache.org.
   *
   * 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 org.apache.axis.handlers.tcp;
  
  import java.net.URL;
  import java.util.*;
  
  import org.apache.axis.*;
  import org.apache.axis.handlers.BasicHandler;
  import org.apache.axis.message.*;
  import org.apache.axis.registries.*;
  import org.apache.axis.utils.*;
  
  /** A <code>TCPActionHandler</code> sets the context's TargetService
   * property from the first method name in the first RPCElement of the
   * Body.
   *
   * This is not at all the right thing, really, but it's not clear to me
   * how TargetService is *supposed* to be set in transports which have no
   * SOAPAction!
   *
   * Once Sam's changes go in, this probably goes away altogether.
   *
   * @author Rob Jellinghaus (robj@unrealities.com)
   * @author Glen Daniels (gdaniels@allaire.com)
   * @author Doug Davis (dug@us.ibm.com)
   */
  public class TCPActionHandler extends BasicHandler
  {
    public void invoke(MessageContext msgContext) throws AxisFault
    {
      Debug.Print( 1, "Enter: TCPActionHandler::invoke" );
      
      /** If there's already a targetService (ie. JWSProcessor) then
       *  just return.
       */
      if ( msgContext.getTargetService() == null ) {
        
        String targetServiceName = null;
  
        // There *IS* no URL for TCP transport!
        // (If there were, we might have the service name on the end of it....)
        /*
        String urlStr = msgContext.getStrProp(msgContext.TRANS_URL);
        try {
          URL url = new URL(urlStr);
          targetServiceName = url.getPath().substring(1);
        } catch (Exception ex) {
          throw new AxisFault("TCPActionHandler.invoke", "Can't parse service part of url "+urlStr, null, null);
        }
         */
        
        // This is icky (the full extraction of the SOAPEnvelope kills
        // performance), but doing it properly would require patching
        // RPCDispatchHandler to deal with a null TargetService at
        // RPCDispatch time.
        // For now, I'm trying to implement the TCP transport without
        // patching *any* existing files.  -- RobJ
        
        SOAPEnvelope    env    = (SOAPEnvelope) msgContext.getRequestMessage().getAs("SOAPEnvelope");
  
        Vector          bodies = env.getBodyElements();
        for ( int bNum = 0 ; bNum < bodies.size() ; bNum++ ) {
          if (!(bodies.get(bNum) instanceof RPCElement))
              continue;
          RPCElement   body  = (RPCElement) bodies.get( bNum );
          String       mName = body.getMethodName();
          
          // do we have a namespace URI?
          // if so, use it
          if (body.getNamespaceURI() != null) {
            targetServiceName = body.getNamespaceURI();
          } else {
            // Do linear search over the HandlerRegistry, looking for the first
            // service with mName as its method name.  This is definitely inefficient
            // and possibly wrong.
            // ROBJ 911 What *is* the right way to get to the HandlerRegistry from here?!
            // Is it in the MessageContext?  ... let's look ...
            Handler engine = (Handler)msgContext.getProperty(Constants.AXIS_ENGINE);
            HandlerRegistry hr = (HandlerRegistry)engine.getOption(Constants.HANDLER_REGISTRY);
            String[] list = hr.list();
            Handler handler = null;
            for (int i = 0; i < list.length; i++) {
              handler = hr.find(list[i]);
              // why would handler ever be null here?!?!
              if (handler != null) {
                String  methodName = (String) handler.getOption( "methodName" );
                if (methodName != null && methodName.equals(mName)) {
                  // we found it
                  targetServiceName = list[i];
                  break;
                }
              }
            }
          }
          
          if (targetServiceName == null) {
            // couldn't find service with that method name, fault
            throw new AxisFault("Server.NoServiceForMethod", "Could not find service with method name "+mName, null, null);
          }
          
          Debug.Print( 2, "  First method name: " + mName );
          
        }
        
        msgContext.setTargetService( targetServiceName );
      }
      
      // Just for kicks, try getting the message back as String, to cure
      // downstream handlers... don't really understand this bit
      // YOW, THIS WORKS!
      // ROBJ 911 remove this once I verify that getAs("SOAPEnvelope") twice in a row is a
      // Bad Thing.  (and once I figure out what else I should be doing!)
      String test = (String)msgContext.getRequestMessage().getAs("String");
      
      Debug.Print( 1, "Exit: TCPActionHandler::invoke" );
    }
    
    public void undo(MessageContext msgContext)
    {
      Debug.Print( 1, "Enter: HTTPActionHandler::undo" );
      Debug.Print( 1, "Exit: HTTPActionHandler::undo" );
    }
  }
  
  
  
  1.9       +11 -9     xml-axis/java/src/org/apache/axis/registries/DefaultHandlerRegistry.java
  
  Index: DefaultHandlerRegistry.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/registries/DefaultHandlerRegistry.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- DefaultHandlerRegistry.java	2001/05/05 22:17:00	1.8
  +++ DefaultHandlerRegistry.java	2001/05/31 09:24:40	1.9
  @@ -2,7 +2,7 @@
    * The Apache Software License, Version 1.1
    *
    *
  - * Copyright (c) 2001 The Apache Software Foundation.  All rights 
  + * Copyright (c) 2001 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -10,7 +10,7 @@
    * are met:
    *
    * 1. Redistributions of source code must retain the above copyright
  - *  notice, this list of conditions and the following disclaimer. 
  + *  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
  @@ -18,7 +18,7 @@
    *  distribution.
    *
    * 3. The end-user documentation included with the redistribution,
  - *  if any, must include the following acknowledgment:  
  + *  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,
  @@ -26,7 +26,7 @@
    *
    * 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 
  + *  software without prior written permission. For written
    *  permission, please contact apache@apache.org.
    *
    * 5. Products derived from this software may not be called "Apache",
  @@ -66,10 +66,12 @@
   import org.apache.axis.handlers.http.*;
   import org.apache.axis.suppliers.* ;
   import org.apache.axis.registries.* ;
  +import org.apache.axis.providers.java.RPCProvider;
  +import org.apache.axis.providers.java.MsgProvider;
   
   import org.apache.axis.transport.http.* ;
   
  -/** 
  +/**
    *
    * @author Doug Davis (dug@us.ibm.com)
    */
  @@ -89,9 +91,9 @@
       dontSave = b ;
     }
     
  -  protected void load() { 
  +  protected void load() {
       super.load();
  -    if ( suppliers != null && suppliers.size() != 0 ) 
  +    if ( suppliers != null && suppliers.size() != 0 )
         return ;
   
       /* If we got here then there was no registry on the filesystem */
  @@ -114,8 +116,8 @@
       if ( onServer ) {
         this.add( "debug"        , new DebugHandler() );
         //this.add( "SOAPServer"   , new SOAPServerHandler() );
  -      this.add( "MsgDispatcher", new MsgDispatchHandler() );
  -      this.add( "RPCDispatcher", new RPCDispatchHandler() );
  +      this.add( "MsgDispatcher", new MsgProvider() );
  +      this.add( "RPCDispatcher", new RPCProvider() );
         this.add( "HTTPSender"   , new HTTPDispatchHandler() );
         this.add( "HTTPAction"   , new HTTPActionHandler() );
         this.add( "HTTPAuth"     , new HTTPAuthHandler() );
  
  
  
  1.7       +96 -41    xml-axis/java/src/org/apache/axis/transport/http/SimpleAxisServer.java
  
  Index: SimpleAxisServer.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/transport/http/SimpleAxisServer.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- SimpleAxisServer.java	2001/05/26 19:27:07	1.6
  +++ SimpleAxisServer.java	2001/05/31 09:24:45	1.7
  @@ -2,7 +2,7 @@
    * The Apache Software License, Version 1.1
    *
    *
  - * Copyright (c) 2000 The Apache Software Foundation.  All rights 
  + * Copyright (c) 2000 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -10,7 +10,7 @@
    * are met:
    *
    * 1. Redistributions of source code must retain the above copyright
  - *    notice, this list of conditions and the following disclaimer. 
  + *    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
  @@ -18,7 +18,7 @@
    *    distribution.
    *
    * 3. The end-user documentation included with the redistribution,
  - *    if any, must include the following acknowledgment:  
  + *    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,
  @@ -26,7 +26,7 @@
    *
    * 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 
  + *    software without prior written permission. For written
    *    permission, please contact apache@apache.org.
    *
    * 5. Products derived from this software may not be called "Apache",
  @@ -90,17 +90,24 @@
       private static byte ISE[]    = "500 Internal Server Error".getBytes();
   
       // Standard MIME headers
  -    private static byte MIME_STUFF[] = 
  +    private static byte MIME_STUFF[] =
           ( "\nContent-Type: text/xml\n" +
             "Content-Length: ").getBytes();
   
       // Mime/Content separator
       private static byte SEPARATOR[] = "\n\n".getBytes();
  +    
  +    // Tiddly little response
  +    private static byte cannedResponse[] = "<empty/>".getBytes();
   
       // Axis specific constants
       private static String transportInName = "HTTPAction";
       private static String transportOutName = "HTTP.output";
       private static final String AXIS_ENGINE = "AxisEngine" ;
  +    
  +    // are we stopped?
  +    // latch to true if stop() is called
  +    private boolean stopped = false;
   
       /**
        * The main workhorse method.
  @@ -121,20 +128,21 @@
           msgContext.setProperty(MessageContext.TRANS_OUTPUT, transportOutName);
   
           // Reusuable, buffered, content length controlled, InputStream
  -        NonBlockingBufferedInputStream is = 
  +        NonBlockingBufferedInputStream is =
               new NonBlockingBufferedInputStream();
   
           // SoapAction
           StringBuffer soapAction = new StringBuffer();
  +        StringBuffer httpRequest = new StringBuffer();
   
           // And, just in case it is needed...
           Message faultMsg = new Message(null, "AxisFault");
   
           // Accept and process requests from the socket
  -	while (worker==null || !worker.isInterrupted()) {
  +    while (!stopped) {
               Socket socket = null;
   
  -            // prepare request (do as much as possible while waiting for the 
  +            // prepare request (do as much as possible while waiting for the
               // next connection).  Note the next two statements are commented
               // out.  Uncomment them if you experience any problems with not
               // resetting state between requests:
  @@ -146,9 +154,9 @@
               msgContext.clearProperties();
               msgContext.setProperty(MessageContext.TRANS_INPUT, transportInName);
               msgContext.setProperty(MessageContext.TRANS_OUTPUT, transportOutName);
  -	    try {
  +        try {
                   try {
  -	            socket = serverSocket.accept();
  +                socket = serverSocket.accept();
                   } catch (IOException ioe) {
                       break;
                   }
  @@ -159,14 +167,29 @@
                   try {
                       // read headers
                       is.setInputStream(socket.getInputStream());
  -		    int contentLength = parseHeaders(is, soapAction);
  +                    int contentLength = parseHeaders(is, soapAction, httpRequest);
                       is.setContentLength(contentLength);
   
  +                    // if get, then return simpleton document as response
  +                    if (httpRequest.toString().equals("GET")) {
  +                        OutputStream out = socket.getOutputStream();
  +                        out.write(HTTP);
  +                        out.write(status);
  +                        out.write(MIME_STUFF);
  +                        putInt(out, cannedResponse.length);
  +                        out.write(SEPARATOR);
  +                        out.write(cannedResponse);
  +                        out.flush();
  +                        continue;
  +                    }
  +                        
                       // set up request
  +                    
  +                    
                       String soapActionString = soapAction.toString();
                       requestMsg.setCurrentMessage(is, "InputStream");
                       msgContext.setTargetService(soapActionString);
  -                    msgContext.setProperty(HTTPConstants.MC_HTTP_SOAPACTION, 
  +                    msgContext.setProperty(HTTPConstants.MC_HTTP_SOAPACTION,
                                              soapActionString);
   
                       // invoke the Axis engine
  @@ -174,16 +197,16 @@
   
                   } catch( AxisFault af ) {
                       if ("Server.Unauthorized".equals(af.getFaultCode())) {
  -                        status = ISE; // SC_INTERNAL_SERVER_ERROR 
  +                        status = ISE; // SC_INTERNAL_SERVER_ERROR
                       } else {
  -                        status = UNAUTH; // SC_UNAUTHORIZED 
  +                        status = UNAUTH; // SC_UNAUTHORIZED
                       }
   
                       faultMsg.setCurrentMessage(af, "AxisFault");
                       msgContext.setResponseMessage(faultMsg);
   
                   } catch( Exception e ) {
  -                    status = ISE; // SC_INTERNAL_SERVER_ERROR 
  +                    status = ISE; // SC_INTERNAL_SERVER_ERROR
                       faultMsg.setCurrentMessage(new AxisFault(e), "AxisFault");
                       msgContext.setResponseMessage(faultMsg);
                   }
  @@ -194,27 +217,33 @@
                   byte[] response = (byte[]) responseMsg.getAs("Bytes");
   
                   // Send it on its way...
  -		OutputStream out = socket.getOutputStream();
  -		out.write(HTTP);
  -		out.write(status);
  -		out.write(MIME_STUFF);
  -	        putInt(out, response.length);
  -		out.write(SEPARATOR);
  +        OutputStream out = socket.getOutputStream();
  +        out.write(HTTP);
  +        out.write(status);
  +        out.write(MIME_STUFF);
  +            putInt(out, response.length);
  +        out.write(SEPARATOR);
                   out.write(response);
                   out.flush();
  +            
  +            if (msgContext.getProperty(msgContext.QUIT_REQUESTED) != null) {
  +                // why then, quit!
  +                this.stop();
  +            }
   
  -	    } catch (InterruptedIOException iie) {
  -		break;
  -	    } catch (Exception e) {
  -		e.printStackTrace();
  -	    } finally {
  -		try {
  -		    if (socket!=null) socket.close();
  -		} catch (Exception e) {
  -		}
  -	    }
  -	}
  +        } catch (InterruptedIOException iie) {
  +        break;
  +        } catch (Exception e) {
  +        e.printStackTrace();
  +        } finally {
  +        try {
  +            if (socket!=null) socket.close();
  +        } catch (Exception e) {
  +        }
  +        }
       }
  +        System.out.println("SimpleAxisServer quitting.");
  +    }
   
       // ASCII character mapping to lower case
       private static final byte[] toLower = new byte[256];
  @@ -236,7 +265,13 @@
       // mime header for soap action
       private static final byte actionHeader[] = "soapaction: \"".getBytes();
       private static final int actionLen = actionHeader.length;
  +    
  +    // mime header for GET
  +    private static final byte getHeader[] = "GET".getBytes();
   
  +    // mime header for POST
  +    private static final byte postHeader[] = "POST".getBytes();
  +
       // buffer for IO
       private static final int BUFSIZ = 4096;
       private byte buf[] = new byte[BUFSIZ];
  @@ -248,8 +283,8 @@
        * @param off       starting offset into the byte array
        * @param len       maximum number of bytes to read
        */
  -    private int readLine(InputStream is, byte[] b, int off, int len) 
  -        throws IOException 
  +    private int readLine(InputStream is, byte[] b, int off, int len)
  +        throws IOException
       {
           int count = 0, c;
   
  @@ -266,17 +301,39 @@
        * SOAPAction.
        * @param is         InputStream to read from
        * @param soapAction StringBuffer to return the soapAction into
  +     * @param httpRequest StringBuffer for GET / POST
        * @return Content-Length
        */
  -    private int parseHeaders(InputStream is, StringBuffer soapAction)
  -      throws IOException 
  +    private int parseHeaders(InputStream is, StringBuffer soapAction, StringBuffer httpRequest)
  +      throws IOException
       {
           int n;
           int len = 0;
  +        
  +        // parse first line as GET or POST
  +        n=this.readLine(is, buf, 0, buf.length);
  +        if (n < 0) {
  +            // nothing!
  +            throw new IOException("Unexpected end of stream");
  +        }
  +        
  +        // which does it begin with?
  +        httpRequest.delete(0, httpRequest.length());
  +        if (buf[0] == getHeader[0]) {
  +            httpRequest.append("GET");
  +            // return immediately, don't look for more headers
  +            return 0;
  +        } else if (buf[0] == postHeader[0]) {
  +            httpRequest.append("POST");
  +        } else {
  +            throw new IOException("Cannot handle non-GET, non-POST request");
  +        }
  +        
           while ((n=readLine(is,buf,0,buf.length)) > 0) {
           
               int lenMatch = 0;
               int actionMatch = 0;
  +            int getMatch = 0;
               for (int i=0; i<n; i++) {
                   byte c = toLower[buf[i]];
   
  @@ -379,10 +436,10 @@
       }
   
       /**
  -     * Start this server as a daemon.
  +     * Start this server as a NON-daemon.
        */
       public void start() throws Exception {
  -        start(true);
  +        start(false);
       }
   
       /**
  @@ -391,9 +448,7 @@
        * This will interrupt any pending accept().
        */
       public void stop() throws Exception {
  -        /// Calling Thread.stop() is deprecated. See docs for
  -        ///  better patterns using interrupt()
  -        ////////////
  +        stopped = true;
           if (worker != null) worker.interrupt();
       }
   
  
  
  
  1.1                  xml-axis/java/src/org/apache/axis/transport/tcp/AxisListener.java
  
  Index: AxisListener.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 1999 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 apache@apache.org.
   *
   * 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 org.apache.axis.transport.tcp;
  
  import java.io.*;
  import java.util.*;
  import org.apache.axis.* ;
  import org.apache.axis.server.* ;
  import org.apache.axis.utils.* ;
  import org.apache.axis.registries.HandlerRegistry;
  import org.apache.axis.handlers.tcp.TCPActionHandler;
  import org.apache.axis.transport.http.NonBlockingBufferedInputStream;
  import org.apache.axis.handlers.soap.SOAPService;
  
  import java.net.*;
  
  /**
   * Listen for incoming socket connections on the specified socket.  Take
   * incoming messages and dispatch them.
   *
   * @author Rob Jellinghaus (robj@unrealities.com)
   * @author Doug Davis (dug@us.ibm.com)
   */
  public class AxisListener implements Runnable {
      // These have default values.
      private String transportInName = "TCP.input";
      private String transportOutName = "TCP.output";
      
      private static final String AXIS_ENGINE = "AxisEngine" ;
      
      private int port;
      private ServerSocket srvSocket;
      
      private Handler engine = null ;
      
      // becomes true when we want to quit
      private boolean done = false;
      
      public static void main (String args[]) {
          new AxisListener(args).run();
      }
      
      public AxisListener (String[] args) {
          // look for -p, -d arguments
          try {
              Options options = new Options(args);
              port = new URL(options.getURL()).getPort();
              String tmp;
              if ((tmp = options.isValueSet('d')) != null) {
                  Debug.setDebugLevel(Integer.parseInt(tmp));
              }
          } catch (MalformedURLException ex) {
              System.err.println("Hosed URL: "+ex);
              System.exit(1);
          }
          
          try {
              srvSocket = new ServerSocket(port);
          } catch (IOException ex) {
              System.err.println("Can't create server socket on port "+port);
              System.exit(1);
          }
          
          System.out.println("AxisListener is listening on port "+port+".");
      }
      
      public void run () {
          if (srvSocket == null) {
              return;
          }
          
          Socket sock;
          while (!done) {
              try {
                  sock = srvSocket.accept();
                  new Thread(new SocketHandler(sock)).start();
              } catch (IOException ex) {
                  /** stop complaining about this! it seems to happen on quit,
                      and is not worth mentioning.  unless I am confused. -- RobJ
                   System.err.println("Got IOException on srvSocket.accept: "+ex);
                   ex.printStackTrace();
                   */
              }
          }
      }
      
      
      public class SocketHandler implements Runnable {
          private Socket socket;
          public SocketHandler (Socket socket) {
              this.socket = socket;
          }
          public void run () {
              // get the input stream
              if ( engine == null ) {
                  engine = new AxisServer();
                  engine.init();
                  
                  HandlerRegistry hr = (HandlerRegistry)engine.getOption(Constants.HANDLER_REGISTRY);
                  // add the TCPDispatchHandler
                  hr.add("TCPSender", new TCPDispatchHandler());
                  hr.add("TCPAction", new TCPActionHandler());
                  
                  SimpleChain c = new SimpleChain();
                  c.addHandler( hr.find( "TCPAction" ) );
                  hr.add( transportInName, c );
                  
                  // self-register the PseudoStockQuoteService, for testing purposes
                  SOAPService service = new SOAPService();
                  service.setPivotHandler( hr.find( "RPCDispatcher" ) );
                  service.addOption(SOAPService.OPTION_PIVOT, "RPCDispatcher");
                  service.addOption( "className", "org.apache.axis.transport.tcp.PseudoStockQuoteService" );
                  service.addOption( "methodName", "getQuote" );
                  hr.add( "urn:xmltoday-delayed-quotes", service ); // ???
              }
              
              /* Place the Request message in the MessagContext object - notice */
              /* that we just leave it as a 'ServletRequest' object and let the  */
              /* Message processing routine convert it - we don't do it since we */
              /* don't know how it's going to be used - perhaps it might not     */
              /* even need to be parsed.                                         */
              /*******************************************************************/
              MessageContext    msgContext = new MessageContext();
              
              InputStream inp;
              try {
                  inp = socket.getInputStream();
              } catch (IOException ex) {
                  System.err.println("Couldn't get input stream from "+socket);
                  return;
              }
              
              // ROBJ 911
              // the plain ol' inputstream seems to hang in the SAX parse..... WHY?????
              // because there is no content length!
              //Message           msg        = new Message( nbbinp, "InputStream" );
              Message msg = null;
              try {
                  StringBuffer line = new StringBuffer();
                  int b = 0;
                  while ((b = inp.read()) != '\r') {
                      line.append((char)b);
                  }
                  // got to '\r', skip it and '\n'
                  if (inp.read() != '\n') {
                      System.err.println("Length line "+line+" was not terminated with \r\n");
                      return;
                  }
                  
                  // TEST SUPPORT ONLY
                  // If the line says "ping", then respond "\n".
                  // If the line says "quit", then respond "\n" and exit.
                  if (line.toString().equals("ping")) {
                      socket.getOutputStream().write(new String("\n").getBytes());
                      return;
                  } else if (line.toString().equals("quit")) {
                      // peacefully die
                      socket.getOutputStream().write(new String("\n").getBytes());
                      socket.close();
                      srvSocket.close();
                      System.err.println("AxisListener quitting.");
                      System.exit(0);
                  }
                  
                  
                  // OK, assume it is content length
                  int len = Integer.parseInt(line.toString());
                  // read that many bytes into ByteArrayInputStream...
                  
                  // experiment, doesn't work:
                  //        NonBlockingBufferedInputStream nbbinp = new NonBlockingBufferedInputStream();
                  //        nbbinp.setContentLength(len);
                  //        nbbinp.setInputStream(inp);
                  //        msg = new Message(nbbinp, "InputStream");
                  
                  byte[] mBytes = new byte[len];
                  inp.read(mBytes);
                  msg = new Message(new ByteArrayInputStream(mBytes), "InputStream");
              } catch (IOException ex) {
                  System.err.println("Couldn't read from socket input stream: "+ex);
                  return;
              }
              
              
              /* Set the request(incoming) message field in the context */
              /**********************************************************/
              msgContext.setRequestMessage( msg );
              
              /* Set the Transport Specific Input/Output chains IDs */
              /******************************************************/
              msgContext.setProperty(MessageContext.TRANS_INPUT , transportInName );
              msgContext.setProperty(MessageContext.TRANS_OUTPUT, transportOutName );
              
              try {
                  /* Invoke the Axis engine... */
                  /*****************************/
                  engine.invoke( msgContext );
              }
              catch( Exception e ) {
                  if ( !(e instanceof AxisFault) )
                      e = new AxisFault( e );
                  msgContext.setResponseMessage( new Message(e, "AxisFault") );
              }
              
              /* Send it back along the wire...  */
              /***********************************/
              msg = msgContext.getResponseMessage();
              String response = (String) msg.getAs("String");
              if (msg == null) response="No data";
              try {
                  OutputStream buf = new BufferedOutputStream(socket.getOutputStream());
                  // this should probably specify UTF-8, but for now, for Java interop,
                  // use default encoding
                  buf.write(response.getBytes());
                  buf.close();
              } catch (IOException ex) {
                  System.err.println("Can't write response to socket "+port+", response is: "+response);
              }
          }
      }
  }
  
  
  
  
  
  1.1                  xml-axis/java/src/org/apache/axis/transport/tcp/PseudoStockQuoteService.java
  
  Index: PseudoStockQuoteService.java
  ===================================================================
  package org.apache.axis.transport.tcp;
  
  public class PseudoStockQuoteService {
    public float getQuote (String symbol) throws Exception {
      // get a real (delayed by 20min) stockquote from
      // http://www.xmltoday.com/examples/stockquote/. The IP addr
      // below came from the host that the above form posts to ..
  
      if ( symbol.equals("XXX") ) return( (float) 55.25 );
      throw new IllegalArgumentException("Symbol not known");
    }
  }
    
    
  
  
  
  
  1.1                  xml-axis/java/src/org/apache/axis/transport/tcp/TCPDispatchHandler.java
  
  Index: TCPDispatchHandler.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 1999 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 apache@apache.org.
   *
   * 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 org.apache.axis.transport.tcp;
  
  import java.io.* ;
  import java.net.* ;
  import java.util.* ;
  import java.lang.reflect.*;
  
  import org.apache.axis.* ;
  import org.apache.axis.utils.* ;
  import org.apache.axis.message.SOAPEnvelope;
  import org.apache.axis.message.SOAPHeader;
  import org.apache.axis.handlers.BasicHandler;
  import org.apache.axis.transport.http.NonBlockingBufferedInputStream;
  import org.apache.axis.encoding.Base64 ;
  
  import org.w3c.dom.* ;
  
  /**
   * This is meant to be used on a SOAP Client to call a SOAP server.
   *
   * @author Doug Davis (dug@us.ibm.com)
   */
  public class TCPDispatchHandler extends BasicHandler {
    public void invoke(MessageContext msgContext) throws AxisFault {
      Debug.Print( 1, "Enter: TCPDispatchHandler::invoke" );
      /* Find the service we're invoking so we can grab it's options */
      /***************************************************************/
      String   targetURL = null ;
      Message  outMsg    = null ;
      String   reqEnv    = null ;
  
      targetURL = msgContext.getStrProp( MessageContext.TRANS_URL);
  System.out.println(targetURL);
      try {
        // This is a totally random, temporary URL specification:
        // http://host:port/service-name ??????? hmmmmmm
        URL      tmpURL = new URL( targetURL );
        String   host   = tmpURL.getHost();
        int      port   = tmpURL.getPort();
        byte[]   buf    = new byte[4097];
        int      rc     = 0 ;
  
        Socket             sock = null ;
  
        /* comment out SSL stuff for now
        
        if (tmpURL.getProtocol().equalsIgnoreCase("https")) {
          if ( (port = tmpURL.getPort()) == -1 ) port = 443;
          String tunnelHost = System.getProperty("https.proxyHost");
          String tunnelPortString = System.getProperty("https.proxyPort");
          String tunnelUsername = System.getProperty("https.proxyUsername");
          String tunnelPassword = System.getProperty("https.proxyPassword");
          try {
            Class SSLSocketFactoryClass =
              Class.forName("javax.net.ssl.SSLSocketFactory");
            Class SSLSocketClass = Class.forName("javax.net.ssl.SSLSocket");
            Method createSocketMethod =
              SSLSocketFactoryClass.getMethod("createSocket",
                                              new Class[] {String.class, Integer.TYPE});
            Method getDefaultMethod =
              SSLSocketFactoryClass.getMethod("getDefault", new Class[] {});
            Method startHandshakeMethod =
              SSLSocketClass.getMethod("startHandshake", new Class[] {});
            Object factory = getDefaultMethod.invoke(null, new Object[] {});
            Object sslSocket = null;
            if (tunnelHost == null || tunnelHost.equals("")) {
              // direct SSL connection
              sslSocket = createSocketMethod .invoke(factory,
                                   new Object[] {host, new Integer(port)});
            } else {
              // SSL tunnelling through proxy server
              Method createSocketMethod2 =
                SSLSocketFactoryClass.getMethod("createSocket",
                                                new Class[] {Socket.class, String.class, Integer.TYPE, Boolean.TYPE});
              int tunnelPort = (tunnelPortString != null? (Integer.parseInt(tunnelPortString) < 0? 443: Integer.parseInt(tunnelPortString)): 443);
              Object tunnel = createSocketMethod .invoke(factory,
                                   new Object[] {tunnelHost, new Integer(tunnelPort)});
              // The tunnel handshake method (condensed and made reflexive)
              OutputStream tunnelOutputStream = (OutputStream)SSLSocketClass.getMethod("getOutputStream", new Class[] {}).invoke(tunnel, new Object[] {});
              PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(tunnelOutputStream)));
              out.print("CONNECT " + host + ":" + port + " HTTP/1.0\n\r\n\r");
              out.flush();
              InputStream tunnelInputStream = (InputStream)SSLSocketClass.getMethod("getInputStream", new Class[] {}).invoke(tunnel, new Object[] {});
              //BufferedReader in = new BufferedReader(new InputStreamReader(tunnelInputStream));
              //DataInputStream in = new DataInputStream(tunnelInputStream);
              Debug.Print(1, "Is tunnelInputStream null? " + String.valueOf(tunnelInputStream == null));
              String replyStr = ""; int i;
              while ((i = tunnelInputStream.read()) != '\n' && i != '\r' && i != -1) { replyStr += String.valueOf((char)i); Debug.Print(1, "got a character in reply, so far: " + replyStr); }
              if (!replyStr.startsWith("HTTP/1.0 200") && !replyStr.startsWith("HTTP/1.1 200")) {
                throw new IOException("Unable to tunnel through " + tunnelHost + ":" + tunnelPort + ".  Proxy returns \"" + replyStr + "\"");
              }
              // End of condensed reflective tunnel handshake method
              sslSocket = createSocketMethod2.invoke(factory,
                                   new Object[] {tunnel, host, new Integer(port), new Boolean(true)});
              Debug.Print( 1, "Set up SSL tunnelling through " + tunnelHost + ":" +tunnelPort);
            }
            // must shake out hidden errors!
            startHandshakeMethod.invoke(sslSocket, new Object[] {});
            sock = (Socket)sslSocket;
          } catch (ClassNotFoundException cnfe) {
            Debug.Print( 1, "SSL feature disallowed: JSSE files not installed or present in classpath");
            throw new AxisFault(cnfe);
          } catch (NumberFormatException nfe) {
            Debug.Print( 1, "Proxy port number, \"" + tunnelPortString + "\", incorrectly formatted");
            throw new AxisFault(nfe);
          }
          Debug.Print( 1, "Created an SSL connection");
        } else {
         */
        
          sock    = new Socket( host, port );
          Debug.Print( 1, "Created an insecure HTTP connection");
        
        /*
        }
         */
  
        reqEnv  = (String) msgContext.getRequestMessage().getAs("String");
        
        //System.out.println("Msg: " + reqEnv);
  
        BufferedInputStream inp = new BufferedInputStream(sock.getInputStream());
        OutputStream  out  = sock.getOutputStream();
        
        /*
        StringBuffer  otherHeaders = new StringBuffer();
        String        userID = null ;
        String        passwd = null ;
  
        userID = msgContext.getStrProp( MessageContext.USERID );
        passwd = msgContext.getStrProp( MessageContext.PASSWORD );
  
        if ( userID != null ) {
          StringBuffer tmpBuf = new StringBuffer();
          tmpBuf.append( userID )
                .append( ":" )
                .append( (passwd == null) ? "" : passwd) ;
          otherHeaders.append( HTTPConstants.HEADER_AUTHORIZATION )
                      .append( ": Basic " )
                      .append( Base64.encode( tmpBuf.toString().getBytes() ) )
                      .append("\n" );
        }
       
        StringBuffer header = new StringBuffer();
  
        header.append( HTTPConstants.HEADER_POST )
              .append(" " )
              .append( ((tmpURL.getFile() == null ||
                         tmpURL.getFile().equals(""))? "/": tmpURL.getFile()) )
              .append( " HTTP/1.0\r\n" )
              .append( HTTPConstants.HEADER_CONTENT_LENGTH )
              .append( ": " )
              .append(reqEnv.length() )
              .append( "\r\n" )
              .append( HTTPConstants.HEADER_CONTENT_TYPE )
              .append( ": text/xml\r\n" )
              .append( (otherHeaders == null ? "" : otherHeaders.toString()) )
              .append( HTTPConstants.HEADER_SOAP_ACTION )
              .append( ": \"" )
              .append( action )
              .append( "\"\r\n\r\n" );
  
        out.write( header.toString().getBytes() );
        
         */
        
        byte[] bytes = reqEnv.getBytes();
        String length = "" + bytes.length + "\r\n";
        out.write(length.getBytes());
        out.write( bytes );
        out.flush();
  
        Debug.Print( 1, "XML sent:" );
        Debug.Print( 1, "---------------------------------------------------");
        Debug.Print( 1, reqEnv );
  
        /*
        byte       lastB=0, b ;
        int        len = 0 ;
        int        colonIndex = -1 ;
        Hashtable  headers = new Hashtable();
        String     name, value ;
  
        // Need to add logic for getting the version # and the return code
        // but that's for tomorrow!
  
        for ( ;; ) {
          if ( (b = (byte) inp.read()) == -1 ) break ;
          if ( b != '\r' && b != '\n' ) {
            if ( b == ':' ) colonIndex = len ;
            lastB = (buf[len++] = b);
          }
          else if ( b == '\r' )
            continue ;
          else {
            if ( len == 0 ) break ;
            if ( colonIndex != -1 ) {
              name = new String( buf, 0, colonIndex );
              value = new String( buf, colonIndex+1, len-1-colonIndex );
            }
            else {
              name = new String( buf, 0, len );
              value = "" ;
            }
            Debug.Print( 1, name + value );
            if ( msgContext.getProperty(HTTPConstants.MC_HTTP_STATUS_CODE)==null){
              // Reader status code
              int start = name.indexOf( ' ' ) + 1 ;
              String tmp = name.substring(start).trim();
              int end   = tmp.indexOf( ' ' );
              if ( end != -1 ) tmp = tmp.substring( 0, end );
              rc = Integer.parseInt( tmp );
              msgContext.setProperty( HTTPConstants.MC_HTTP_STATUS_CODE,
                                      new Integer(rc) );
              msgContext.setProperty( HTTPConstants.MC_HTTP_STATUS_MESSAGE,
                                      name.substring(end+1));
            }
            else
              headers.put( name.toLowerCase(), value );
            len = 0 ;
          }
        }
         */
        if ( Debug.getDebugLevel() > 8 ) {
          // Special case - if the debug level is this high then something
          // really bad must be going on - so just dump the input stream
          // to stdout.
          byte b;
          while ( (b = (byte) inp.read()) != -1 )
            System.err.print((char)b);
          System.err.println("");
        }
  
        outMsg = new Message( inp, "InputStream" );
        if (Debug.getDebugLevel() > 0) {
          Debug.Print( 1, "\nNo Content-Length" );
          Debug.Print( 1, "\nXML received:" );
          Debug.Print( 1, "-----------------------------------------------");
          Debug.Print( 1, (String) outMsg.getAs("String") );
        }
        
        msgContext.setResponseMessage( outMsg );
      }
      catch( Exception e ) {
        Debug.Print( 1, e );
        e.printStackTrace();
        if ( !(e instanceof AxisFault) ) e = new AxisFault(e);
        throw (AxisFault) e ;
      }
      Debug.Print( 1, "Exit: TCPDispatchHandler::invoke" );
    }
  
    public void undo(MessageContext msgContext) {
      Debug.Print( 1, "Enter: TCPDispatchHandler::undo" );
      Debug.Print( 1, "Exit: TCPDispatchHandler::undo" );
    }
  };
  
  
  
  1.33      +45 -32    xml-axis/java/src/org/apache/axis/utils/Admin.java
  
  Index: Admin.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/utils/Admin.java,v
  retrieving revision 1.32
  retrieving revision 1.33
  diff -u -r1.32 -r1.33
  --- Admin.java	2001/05/30 20:00:09	1.32
  +++ Admin.java	2001/05/31 09:24:54	1.33
  @@ -2,7 +2,7 @@
    * The Apache Software License, Version 1.1
    *
    *
  - * Copyright (c) 1999 The Apache Software Foundation.  All rights 
  + * Copyright (c) 1999 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -10,7 +10,7 @@
    * are met:
    *
    * 1. Redistributions of source code must retain the above copyright
  - *    notice, this list of conditions and the following disclaimer. 
  + *    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
  @@ -18,7 +18,7 @@
    *    distribution.
    *
    * 3. The end-user documentation included with the redistribution,
  - *    if any, must include the following acknowledgment:  
  + *    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,
  @@ -26,7 +26,7 @@
    *
    * 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 
  + *    software without prior written permission. For written
    *    permission, please contact apache@apache.org.
    *
    * 5. Products derived from this software may not be called "Apache",
  @@ -118,23 +118,23 @@
       }
     }
   
  -  public Document AdminService(MessageContext msgContext, Document xml) 
  +  public Document AdminService(MessageContext msgContext, Document xml)
                     throws AxisFault
     {
       Debug.Print( 1, "Enter: Admin:AdminService" );
       hr = (DefaultHandlerRegistry)msgContext.getProperty(Constants.HANDLER_REGISTRY);
       sr = (DefaultServiceRegistry)msgContext.getProperty(Constants.SERVICE_REGISTRY);
       tmr = msgContext.getTypeMappingRegistry();
  -    Document doc = process( xml );
  +    Document doc = process( msgContext, xml );
       Debug.Print( 1, "Exit: Admin:AdminService" );
       return( doc );
     }
   
  -  public Document process(Document doc) throws AxisFault {
  -    return( process( doc.getDocumentElement() ) );
  +  public Document process(MessageContext msgContext, Document doc) throws AxisFault {
  +    return( process( msgContext, doc.getDocumentElement() ) );
     }
   
  -  public Document process(Element root) throws AxisFault {
  +  public Document process(MessageContext msgContext, Element root) throws AxisFault {
       Document doc = null ;
       try {
         init();
  @@ -142,12 +142,25 @@
         String            action = root.getLocalName();
   
         if ( !action.equals("deploy") && !action.equals("undeploy") &&
  -           !action.equals("list") )
  -        throw new AxisFault( "Admin.error", 
  +           !action.equals("list") && !action.equals("quit") )
  +        throw new AxisFault( "Admin.error",
                                "Root element must be 'deploy', 'undeploy' " +
                                "or 'list'",
                                null, null );
   
  +        if (action.equals("quit")) {
  +            System.err.println("Admin service requested to quit, quitting.");
  +            if (msgContext != null) {
  +                // put a flag into message context so listener will exit after
  +                // sending response
  +                msgContext.setProperty(msgContext.QUIT_REQUESTED, "true");
  +            }
  +              doc = XMLUtils.newDocument();
  +              doc.appendChild( root = doc.createElement( "Admin" ) );
  +              root.appendChild( doc.createTextNode( "Quitting" ) );
  +            return doc;
  +        }
  +        
         if ( action.equals("list") ) {
           String[]   names ;
           Handler    h ;
  @@ -226,8 +239,8 @@
               hr.remove( name );
             }
             else
  -            throw new AxisFault( "Admin.error", 
  -                                 "Unknown type; " + type, 
  +            throw new AxisFault( "Admin.error",
  +                                 "Unknown type; " + type,
                                    null, null );
             continue ;
           }
  @@ -289,7 +302,7 @@
                 hName = st.nextToken();
                 tmpH = hr.find( hName );
                 if ( tmpH == null )
  -                throw new AxisFault( "Admin.error", 
  +                throw new AxisFault( "Admin.error",
                                        "Unknown handler: " + hName,
                                        null, null );
                 c.addHandler( tmpH );
  @@ -310,12 +323,12 @@
     
               st = new StringTokenizer( input, " \t\n\r\f," );
               while ( st.hasMoreElements() ) {
  -              if ( c == null ) 
  +              if ( c == null )
                   cc.setInputChain( c = new SimpleChain() );
                 hName = st.nextToken();
                 tmpH = hr.find( hName );
                 if ( tmpH == null )
  -                throw new AxisFault( "Admin.error", 
  +                throw new AxisFault( "Admin.error",
                                        "Unknown handler: " + hName,
                                        null, null );
                 c.addHandler( tmpH );
  @@ -326,12 +339,12 @@
               st = new StringTokenizer( output, " \t\n\r\f," );
               c  = null ;
               while ( st.hasMoreElements() ) {
  -              if ( c == null ) 
  +              if ( c == null )
                   cc.setOutputChain( c = new SimpleChain() );
                 hName = st.nextToken();
                 tmpH = hr.find( hName );
                 if ( tmpH == null )
  -                throw new AxisFault( "Admin.error", 
  +                throw new AxisFault( "Admin.error",
                                        "Unknown handler: " + hName,
                                        null, null );
                 c.addHandler( tmpH );
  @@ -347,8 +360,8 @@
             Chain                c  = null ;
   
             if ( pivot == null && input == null && output == null )
  -            throw new AxisFault( "Admin.error", 
  -                                 "Services must use targeted chains", 
  +            throw new AxisFault( "Admin.error",
  +                                 "Services must use targeted chains",
                                    null, null );
   
             service = (SOAPService) hr.find( name );
  @@ -365,7 +378,7 @@
                 hName = st.nextToken();
                 tmpH = hr.find( hName );
                 if ( tmpH == null )
  -                throw new AxisFault( "Admin.error", 
  +                throw new AxisFault( "Admin.error",
                                        "Unknown handler: " + hName,
                                        null, null );
                 c.addHandler( tmpH );
  @@ -387,7 +400,7 @@
                 hName = st.nextToken();
                 tmpH = hr.find( hName );
                 if ( tmpH == null )
  -                throw new AxisFault( "Admin.error", 
  +                throw new AxisFault( "Admin.error",
                                        "Unknown handler: " + hName,
                                        null, null );
                 c.addHandler( tmpH );
  @@ -405,8 +418,8 @@
           else if ( type.equals( "bean" ) ) {
             Debug.Print( 2, "Deploying bean: " + name );
             registerTypeMapping(elem, tmr.getParent());
  -        } else 
  -          throw new AxisFault( "Admin.error", 
  +        } else
  +          throw new AxisFault( "Admin.error",
                                  "Unknown type to " + action + ": " + type,
                                  null, null );
         }
  @@ -444,21 +457,21 @@
   
       String qname = elem.getAttribute( "qname" );
       if (qname == null)
  -      throw new AxisFault( "Admin.error", 
  +      throw new AxisFault( "Admin.error",
           "Missing qname in bean " + name, null, null);
   
  -    int pos = qname.indexOf(':'); 
  +    int pos = qname.indexOf(':');
       if (pos < 0)
  -      throw new AxisFault( "Admin.error", 
  -        "Missing namespace in qname " + qname, 
  +      throw new AxisFault( "Admin.error",
  +        "Missing namespace in qname " + qname,
           null, null);
   
       String prefix = qname.substring(0, pos);
       String localPart = qname.substring(pos+1);
  -    String namespace = XMLUtils.getNamespace(prefix, elem); 
  +    String namespace = XMLUtils.getNamespace(prefix, elem);
       if (namespace == null)
  -      throw new AxisFault( "Admin.error", 
  -        "Unknown namespace in qname " + qname, 
  +      throw new AxisFault( "Admin.error",
  +        "Unknown namespace in qname " + qname,
           null, null);
   
       QName qn = new QName(namespace, localPart);
  @@ -501,7 +514,7 @@
       try {
         for ( i = 1 ; i < args.length ; i++ ) {
           System.out.println( "Processing '" + args[i] + "'" );
  -        admin.process(XMLUtils.newDocument( new FileInputStream( args[i] ) ));
  +        admin.process(null, XMLUtils.newDocument( new FileInputStream( args[i] ) ));
         }
       }
       catch( AxisFault e ) {
  
  
  
  1.1                  xml-axis/java/src/org/apache/axis/providers/BasicProvider.java
  
  Index: BasicProvider.java
  ===================================================================
  package org.apache.axis.providers;
  
  import java.util.Hashtable;
  import org.apache.axis.handlers.BasicHandler;
  import org.apache.axis.utils.QName;
  
  /**
   * This class has one way of keeping track of the
   * operations declared for a particular service
   * provider.  I'm not exactly married to this though.
   */
  public abstract class BasicProvider extends BasicHandler {
      
      public void addOperation(String name, QName qname) {
          Hashtable operations = (Hashtable)getOption("Operations");
          if (operations == null) {
              operations = new Hashtable();
              addOption("Operations", operations);
          }
          operations.put(qname, name);
      }
      
      public String getOperationName(QName qname) {
          Hashtable operations = (Hashtable)getOption("Operations");
          if (operations == null) return null;
          return (String)operations.get(qname);
      }
      
      public QName[] getOperationQNames() {
          Hashtable operations = (Hashtable)getOption("Operations");
          if (operations == null) return null;
          Object[] keys = operations.keySet().toArray();
          QName[] qnames = new QName[keys.length];
          System.arraycopy(keys,0,qnames,0,keys.length);
          return qnames;
      }
      
      public String[] getOperationNames() {
          Hashtable operations = (Hashtable)getOption("Operations");
          if (operations == null) return null;
          Object[] values = operations.values().toArray();
          String[] names = new String[values.length];
          System.arraycopy(values,0,names,0,values.length);
          return names;
      }
      
  }
  
  
  
  1.1                  xml-axis/java/src/org/apache/axis/providers/BSFProvider.java
  
  Index: BSFProvider.java
  ===================================================================
  package org.apache.axis.providers;
  
  import org.apache.axis.MessageContext;
  
  public class BSFProvider extends BasicProvider {
  
      public static final String OPTION_LANGUAGE = "Language";
      public static final String OPTION_SRC = "Src";
      public static final String OPTION_SCRIPT = "Script";
      
      public void invoke(MessageContext msgContext) {
          System.out.println(getOption("Script"));
      }
  
      public void undo(MessageContext msgContext) {
      }
  }
  
  
  
  1.1                  xml-axis/java/src/org/apache/axis/providers/ComProvider.java
  
  Index: ComProvider.java
  ===================================================================
  package org.apache.axis.providers;
  
  import org.apache.axis.MessageContext;
  
  public class ComProvider extends BasicProvider {
      
      public static final String OPTION_PROGID = "ProgID";
      public static final String OPTION_CLSID = "CLSID";
      public static final String OPTION_THREADING_MODEL = "threadingModel";
      
      public void invoke(MessageContext msgContext) {
      }
  
      public void undo(MessageContext msgContext) {
      }
      
  }
  
  
  
  1.1                  xml-axis/java/src/org/apache/axis/providers/JWSProvider.java
  
  Index: JWSProvider.java
  ===================================================================
  package org.apache.axis.providers;
  
  import org.apache.axis.MessageContext;
  
  public class JWSProvider extends BasicProvider {
      
      public void invoke(MessageContext msgContext) {
      }
  
      public void undo(MessageContext msgContext) {
      }
  }
  
  
  
  1.1                  xml-axis/java/src/org/apache/axis/providers/java/JavaProvider.java
  
  Index: JavaProvider.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 1999 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 apache@apache.org.
   *
   * 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 org.apache.axis.providers.java;
  
  import java.util.* ;
  import java.lang.reflect.* ;
  import org.apache.axis.* ;
  import org.apache.axis.utils.* ;
  import org.apache.axis.utils.cache.* ;
  import org.apache.axis.message.* ;
  import org.apache.axis.providers.BasicProvider;
  
  /**
   * Base class for Java dispatching.  Fetches various fields out of envelope,
   * looks up service object (possibly using session state), and delegates
   * envelope body processing to subclass via abstract processMessage method.
   *
   * @author Doug Davis (dug@us.ibm.com)
   */
  public abstract class JavaProvider extends BasicProvider {
      
      // from the original stubbed-out JavaProvider...
      // not quite sure what these are for but it is to do with WSDD... -- RobJ
      public static final String OPTION_CLASSNAME = "className";
      public static final String OPTION_IS_STATIC = "isStatic";
      public static final String OPTION_CLASSPATH = "classPath";
      
      private static final boolean DEBUG_LOG = false;
      
      /**
       * Get the service object whose method actually provides the service.
       * May look up in session table.
       */
      public Object getServiceObject (MessageContext msgContext, String clsName, String methodName, JavaClass jc)
          throws Exception
      {
          // default is just to get new instance, for now
          // soon, session support here
          return jc.getJavaClass().newInstance();
      }
      
      
      /**
       * Process the current message.  Side-effect resEnv to create return value.
       *
       * @param msgContext self-explanatory
       * @param clsName the class name of the ServiceHandler
       * @param methodName the method name of ditto
       * @param reqEnv the request envelope
       * @param resEnv the response envelope
       * @param jc the JavaClass of the service object
       * @param obj the service object itself
       */
      public abstract void processMessage (MessageContext msgContext,
                                           String clsName,
                                           String methodName,
                                           SOAPEnvelope reqEnv,
                                           SOAPEnvelope resEnv,
                                           JavaClass jc,
                                           Object obj)
          throws Exception;
      
      
      /**
       * Invoke the message by obtaining various common fields, looking up
       * the service object (via getServiceObject), and actually processing
       * the message (via processMessage).
       */
      public void invoke(MessageContext msgContext) throws AxisFault {
          Debug.Print( 1, "Enter: JavaProvider::invoke (for provider "+this+")" );
          
          /* Find the service we're invoking so we can grab it's options */
          /***************************************************************/
          String serviceName = msgContext.getTargetService();
          Handler service = msgContext.getServiceHandler();
          
          /* Now get the service (RPC) specific info  */
          /********************************************/
          String  clsName    = (String) service.getOption( "className" );
          String  methodName = (String) service.getOption( "methodName" );
          
          try {
              /* We know we're doing a Java/RPC call so we can ask for the */
              /* SOAPBody as an RPCBody and process it accordingly.        */
              /*************************************************************/
              int             i ;
              AxisClassLoader cl     = msgContext.getClassLoader();
              JavaClass       jc     = cl.lookup(clsName);
              Class           cls    = jc.getJavaClass();
              Object          obj    = getServiceObject(msgContext, clsName, methodName, jc);
              
              Message         reqMsg  = msgContext.getRequestMessage();
              SOAPEnvelope    reqEnv  = (SOAPEnvelope) reqMsg.getAs("SOAPEnvelope");
              Message         resMsg  = msgContext.getResponseMessage();
              SOAPEnvelope    resEnv  = (resMsg == null) ?
                  new SOAPEnvelope() :
                  (SOAPEnvelope)resMsg.getAs("SOAPEnvelope");
              
              processMessage(msgContext, serviceName, methodName, reqEnv, resEnv, jc, obj);
              
              if (resMsg == null) {
                  resMsg = new Message(resEnv, "SOAPEnvelope");
                  msgContext.setResponseMessage( resMsg );
              }
          }
          catch( Exception exp ) {
              Debug.Print( 1, exp );
              if ( !(exp instanceof AxisFault) ) exp = new AxisFault(exp);
              throw (AxisFault) exp ;
          }
          Debug.Print( 1, "Exit: JavaProvider::invoke (for provider "+this+")" );
      }
      
      
      public void undo(MessageContext msgContext) {
          Debug.Print( 1, "Enter: RPCDispatchHandler::undo" );
          Debug.Print( 1, "Exit: RPCDispatchHandler::undo" );
      }
      
  };
  
  
  
  1.1                  xml-axis/java/src/org/apache/axis/providers/java/MsgProvider.java
  
  Index: MsgProvider.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 1999 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 apache@apache.org.
   *
   * 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 org.apache.axis.providers.java;
  
  import java.io.* ;
  import java.util.* ;
  import java.lang.reflect.* ;
  import org.apache.axis.* ;
  import org.apache.axis.utils.* ;
  import org.apache.axis.utils.cache.JavaClass;
  import org.apache.axis.encoding.SerializationContext;
  import org.apache.axis.encoding.ServiceDescription;
  import org.apache.axis.message.DOMBody;
  import org.apache.axis.message.SOAPBodyElement;
  import org.apache.axis.message.SOAPEnvelope;
  import org.apache.axis.message.SOAPHeader;
  import org.apache.axis.handlers.* ;
  
  import org.w3c.dom.* ;
  import org.xml.sax.*;
  
  /**
   *
   * @author Doug Davis (dug@us.ibm.com)
   */
  public class MsgProvider extends JavaProvider {
      /**
       * This is pretty much a pass-thru to the util.Admin tool.  This will just
       * take the Request xml file and call the Admin processing.
       */
      public void processMessage (MessageContext msgContext,
                                  String clsName,
                                  String methodName,
                                  SOAPEnvelope reqEnv,
                                  SOAPEnvelope resEnv,
                                  JavaClass jc,
                                  Object obj)
          throws Exception
      {
          Class[]         argClasses = new Class[2];
          Object[]        argObjects = new Object[2];
          
          /** !!! KLUDGE WARNING
           * We need some way of associating ServiceDescriptions with actual
           * services... and then at the point when we figure out which service
           * we'll be calling (which might be right away (static dispatch), after
           * looking at the URL (transport-level dispatch), or even after looking
           * into the SOAP message itself...)
           */
          if (clsName.equals("org.apache.axis.utils.Admin")) {
              ServiceDescription sd = new ServiceDescription("Admin", false);
              msgContext.setServiceDescription(sd);
          }
          
          SOAPBodyElement reqBody = reqEnv.getFirstBody();
          
          StringWriter writer = new StringWriter();
          reqBody.output(new SerializationContext(writer, msgContext));
          
          Reader reader = new StringReader(writer.getBuffer().toString());
          Document doc = XMLUtils.newDocument(new InputSource(reader));
          
          // !!! WANT TO MAKE THIS SAX-CAPABLE AS WELL.  Some people will
          //     want DOM, but our examples should mostly lean towards the
          //     SAX side of things....
          
          /* If no methodName was specified during deployment then get it */
          /* from the root of the Body element                            */
          /* Hmmm, should we do this????                                  */
          /****************************************************************/
          if ( methodName == null || methodName.equals("") ) {
              Element root = doc.getDocumentElement();
              if ( root != null ) methodName = root.getLocalName();
          }
          
          argClasses[0] = msgContext.getClassLoader().loadClass("org.apache.axis.MessageContext");
          argClasses[1] = msgContext.getClassLoader().loadClass("org.w3c.dom.Document");
          argObjects[0] = msgContext ;
          argObjects[1] = doc ;
          
          Method       method = jc.getJavaClass().getMethod( methodName, argClasses );
          
          Document retDoc = (Document) method.invoke( obj, argObjects );
          
          if ( retDoc != null ) {
              SOAPBodyElement el = new DOMBody(retDoc.getDocumentElement());
              resEnv.addBodyElement(el);
          }
      }
      
      
      public void undo(MessageContext msgContext) {
          Debug.Print( 1, "Enter: MsgDispatcherHandler::undo" );
          Debug.Print( 1, "Exit: MsgDispatcherHandler::undo" );
      }
  };
  
  
  
  1.1                  xml-axis/java/src/org/apache/axis/providers/java/RPCProvider.java
  
  Index: RPCProvider.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 1999 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 apache@apache.org.
   *
   * 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 org.apache.axis.providers.java ;
  
  import java.util.* ;
  import java.lang.reflect.* ;
  import org.apache.axis.* ;
  import org.apache.axis.utils.* ;
  import org.apache.axis.utils.cache.* ;
  import org.apache.axis.message.* ;
  
  /**
   * Implement message processing by walking over RPCElements of the
   * envelope body, invoking the appropriate methods on the service object.
   *
   * @author Doug Davis (dug@us.ibm.com)
   */
  public class RPCProvider extends JavaProvider {
      private static final boolean DEBUG_LOG = false;
      
      public void processMessage (MessageContext msgContext,
                                  String clsName,
                                  String methodName,
                                  SOAPEnvelope reqEnv,
                                  SOAPEnvelope resEnv,
                                  JavaClass jc,
                                  Object obj)
          throws Exception
      {
          Vector          bodies = reqEnv.getBodyElements();
          
          /* Loop over each entry in the SOAPBody - each one is a different */
          /* RPC call.                                                      */
          /******************************************************************/
          for ( int bNum = 0 ; bNum < bodies.size() ; bNum++ ) {
              if (!(bodies.get(bNum) instanceof RPCElement))
                  continue;
              
              RPCElement   body  = (RPCElement) bodies.get( bNum );
  
              /* This breaks JWS.  With JWS, the service name is JWSProcessor,
                 but the URN is the actual service name.  hmmmmm.
              
              // validate that the incoming targetService is the same as the
              // namespace URI of the body... if not, someone spoofed the
              // SOAPAction header (or equivalent)
              if (body.getNamespaceURI() != null
                  && !body.getNamespaceURI().equals(msgContext.getTargetService()))
              {
                  throw new AxisFault( "AxisServer.error",
                                      "Incoming target service name doesn't match body namespace URI\n" +
                                          "Target service name=" + msgContext.getTargetService() + "\n" +
                                          "Body URI=" + body.getNamespaceURI(),
                                      null, null );  // should they??
              }
               */
              
              
              String       mName = body.getMethodName();
              Vector       args  = body.getParams();
              
              if ( methodName != null && !methodName.equals(mName) )
                  throw new AxisFault( "AxisServer.error",
                                      "Method names don't match\n" +
                                          "Body name=" + mName + "\n" +
                                          "Service name=" + methodName,
                                      null, null );  // should they??
              
              Debug.Print( 2, "mName: " + mName );
              Debug.Print( 2, "MethodName: " + methodName );
              Method       method = jc.getMethod(mName, args.size());
              if ( method == null )
                  throw new AxisFault( "AxisServer.error",
                                      "Method not found\n" +
                                          "Method name=" + methodName + "\n" +
                                          "Service name=" + msgContext.getTargetService(),
                                      null, null );
              
              Object[] argValues  =  null ;
              
              if ( args != null && args.size() > 0 ) {
                  argValues = new Object[ args.size()];
                  for ( int i = 0 ; i < args.size() ; i++ ) {
                      argValues[i]  = ((RPCParam)args.get(i)).getValue() ;
                      
                      if (DEBUG_LOG) {
                          System.out.println("  value: " + argValues[i] );
                      }
                  }
              }
              
              Object objRes = method.invoke( obj, argValues );
              
              /* Now put the result in the result SOAPEnvelope */
              /*************************************************/
              RPCElement resBody = new RPCElement(mName + "Response");
              resBody.setPrefix( body.getPrefix() );
              resBody.setNamespaceURI( body.getNamespaceURI() );
              if ( objRes != null ) {
                  RPCParam param = new RPCParam("return", objRes);
                  resBody.addParam(param);
              }
              resEnv.addBodyElement( resBody );
          }
      }
  }
  
  
  
  1.1                  xml-axis/java/test/build_ant.xml
  
  Index: build_ant.xml
  ===================================================================
  <?xml version="1.0"?>
  
  <!-- ===================================================================
  
     Build file for Axis functional test Ant task
  
  Notes:
     This is a build file for use with the Jakarta Ant build tool.
     This build file builds an Ant task used to perform Axis functional tests.
  
  Prerequisites:
  
     a successful Axis build configuration
     
  Author:
    Rob Jellinghaus <ro...@unrealities.com>
  
  Copyright:
    Copyright (c) 2001 Apache Software Foundation.
  
  ==================================================================== -->
  
  <project default="buildAntTask" basedir=".">
  
    <path id="test-classpath">
      <!-- build.dir for test classes and build.dest for classes to test -->
      <pathelement location="${build.dir}" />
      <pathelement location="${build.dest}" />
      <pathelement path="${java.class.path}" />
    </path>
  
    <!--
    I am not sure how else to get this optional-ant-task class onto
    the Ant classpath.  I know that environment is system-dependent, though it
    should work on both Unix and Windows.
    Any thoughts?
    -->
    <property name="myenv" environment="myenv" />
    <property name="ant.dir" value="${myenv.ANT_HOME}/lib" />
  
    <!-- =================================================================== -->
    <!-- Build the Ant task for Axis functional testing.  Put the resulting  -->
    <!-- Ant task class into the Ant lib directory (where extension tasks    -->
    <!-- ought to go).                                                       -->
    <!-- Hope that the user has ANT_HOME/lib on their Ant path.              -->
    <!-- =================================================================== -->
    <target name="buildAntTask" if="junit.present">
      <echo message="ant.dir is ${ant.dir}" />
      <!-- Tests are packaged as test.*, so source dir is main dir -->
      <javac srcdir="${basedir}"
        destdir="${ant.dir}">
        <include name="test/functional/ant/*.java" />
        <classpath refid="test-classpath" />
      </javac>
    </target>
  
  </project>
  
  
  
  
  1.1                  xml-axis/java/test/build_functional_tests.xml
  
  Index: build_functional_tests.xml
  ===================================================================
  <?xml version="1.0"?>
  
  <!-- ===================================================================
  
     Build file for Axis functional test Ant task
  
  Notes:
     This is a build file for use with the Jakarta Ant build tool.
     This build file builds an Ant task used to perform Axis functional tests.
  
  Prerequisites:
  
     a successful Axis build configuration
     
  Author:
    Rob Jellinghaus <ro...@unrealities.com>
  
  Copyright:
    Copyright (c) 2001 Apache Software Foundation.
  
  ==================================================================== -->
  
  <project default="functional-tests" basedir=".">
  
    <path id="test-classpath">
      <!-- build.dir for test classes and build.dest for classes to test -->
      <pathelement location="${build.dir}" />
      <pathelement location="${build.dest}" />
      <pathelement path="${java.class.path}" />
    </path>
  
    <taskdef name="runaxisfunctionaltests" classname="test.functional.ant.RunAxisFunctionalTestsTask" />
  
    <!-- =================================================================== -->
    <!-- Launches the functional test TCP server -->
    <!-- =================================================================== -->
    <target name="start-functional-test-tcp-server" if="junit.present">
      <echo message="Starting test tcp server."/>
      <java classname="org.apache.axis.transport.tcp.AxisListener" fork="yes" dir="./build">
        <arg line="-p 8088" /> <!-- arbitrary port -->
        <classpath refid="test-classpath" />
      </java>
    </target>
  
    <!-- =================================================================== -->
    <!-- Launches the functional test HTTP server -->
    <!-- =================================================================== -->
    <target name="start-functional-test-http-server" if="junit.present">
      <echo message="Starting test http server."/>
      <java classname="org.apache.axis.transport.http.SimpleAxisServer" fork="yes" dir="./build">
        <classpath refid="test-classpath" />
      </java>
    </target>
    
    <!-- =================================================================== -->
    <!-- Runs the JUnit functional test -->
    <!-- =================================================================== -->
    <target name="junit-functional" if="junit.present">
      <junit printsummary="yes" haltonfailure="yes" fork="yes">
        <classpath refid="test-classpath" />
        <formatter type="plain" />
        <batchtest>
          <fileset dir="${build.dir}">
            <!-- Convention: each package that's being tested
                  has its own test class collecting all the tests -->
            <include name="**/FunctionalTests.class" />
          </fileset>
        </batchtest>
      </junit>
    </target>
    
    <!-- =================================================================== -->
    <!-- Stops the functional test HTTP server -->
    <!-- =================================================================== -->
    <target name="stop-functional-test-http-server" if="junit.present">
      <echo message="Stopping test http server."/>
      <java classname="org.apache.axis.client.http.HTTPAdminClient" fork="yes">
        <classpath refid="test-classpath" />
        <arg line="quit"/>
      </java>
    </target>
    
    <!-- =================================================================== -->
    <!-- Run functional tests                                                -->
    <!-- =================================================================== -->
    <target name="functional-tests" if="junit.present">
      <!-- This uses a custom Ant task.  See test/functional/ant/RunAxisFunctionalTests.java -->
      <!-- This pattern taken from Cactus, http://jakarta.apache.org/commons/cactus -->
      <runaxisfunctionaltests
        url="http://localhost:8088"
        startTarget1="start-functional-test-tcp-server"
        startTarget2="start-functional-test-http-server"
        testTarget="junit-functional"
        stopTarget="stop-functional-test-http-server" />
    </target>
    
    <!-- =================================================================== -->
    <!-- Runs the JUnit functional test, with special class parameter.       -->
    <!-- This is because RobJ's IDE can't build into multiple directories;   -->
    <!-- it builds all the tests & samples into build/classes.               -->
    <!-- If he wants to build & run the server under the debugger while      -->
    <!-- firing the client tests at it, he has to use this target so junit   -->
    <!-- will find the classes in the IDE's build location.                  -->
    <!-- =================================================================== -->
    <target name="junit-functional-noserver" if="junit.present">
      <junit printsummary="yes" haltonfailure="yes" fork="yes">
        <classpath refid="test-classpath" />
        <formatter type="plain" />
        <batchtest>
          <fileset dir="${build.dir}/classes">
            <!-- Convention: each package that's being tested
                  has its own test class collecting all the tests -->
            <include name="**/FunctionalTests.class" />
          </fileset>
        </batchtest>
      </junit>
    </target>
  
  
  </project>
  
  
  
  
  
  1.1                  xml-axis/java/test/functional/FunctionalTests.java
  
  Index: FunctionalTests.java
  ===================================================================
  package test.functional;
  
  import junit.framework.TestCase;
  import junit.framework.Test;
  import junit.framework.TestSuite;
  
  /**
   * soapenc's FunctionalTests test client/server interactions.
   */
  public class FunctionalTests extends TestCase
  {
      public FunctionalTests(String name)
      {
          super(name);
  System.out.println("Creating FunctionalTests(name)");
      }
  
      public static Test suite() throws Exception
      {
  System.out.println("Creating FunctionalTests suite.");
          TestSuite suite = new TestSuite();
  
          //suite.addTestSuite(TestTCPEcho.class);
          suite.addTestSuite(TestHTTPEcho.class);
  
          return suite;
      }
  }
  
  
  
  1.1                  xml-axis/java/test/functional/TestHTTPEcho.java
  
  Index: TestHTTPEcho.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 1999 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 apache@apache.org.
   *
   * 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 java.net.*;
  import java.io.*;
  import java.util.*;
  
  import org.apache.axis.AxisFault ;
  import org.apache.axis.client.http.HTTPAdminClient;
  import org.apache.axis.utils.Debug ;
  import org.apache.axis.utils.Options ;
  import org.apache.axis.utils.QName ;
  import org.apache.axis.encoding.ServiceDescription;
  import org.apache.axis.encoding.SOAPTypeMappingRegistry;
  
  import junit.framework.TestCase;
  
  import samples.stock.GetQuote;
  
  /** Little serialization test with a struct.
   */
  public class TestHTTPEcho extends TestCase {
      
      public TestHTTPEcho(String name) {
          super(name);
  System.out.println("TestHTTPEcho() "+new File(".").getAbsolutePath()+" "+new File(".").getPath());
      }
      
      public void doTestDeploy () throws Exception {
          try {
              String[] args = { "samples/stock/deploy.xml" };
              new HTTPAdminClient().doAdmin(args);
          }
          catch( Exception e ) {
              if ( e instanceof AxisFault ) ((AxisFault)e).dump();
              e.printStackTrace();
              throw new Exception("TestHTTPEcho.doTestDeploy: Fault returned from echo test: "+e);
          }
      }
      
      public void doTestStock () throws Exception {
          try {
              String[] args = { "-d3", "-uuser1", "-wpass1", "XXX" };
              float val = new GetQuote().getQuote(args);
              assertEquals("TestHTTPEcho: stock price is 55.25", val, 55.25, 0.01);
          }
          catch( Exception e ) {
              if ( e instanceof AxisFault ) ((AxisFault)e).dump();
              e.printStackTrace();
              throw new Exception("TestHTTPEcho.doTestStock: Fault returned from echo test: "+e);
          }
      }
      
      public void doTestUndeploy () throws Exception {
          try {
              String[] args = { "samples/stock/undeploy.xml" };
              new HTTPAdminClient().doAdmin(args);
          }
          catch( Exception e ) {
              if ( e instanceof AxisFault ) ((AxisFault)e).dump();
              e.printStackTrace();
              throw new Exception("TestHTTPEcho.doTestUndeploy: Fault returned from echo test: "+e);
          }
      }
      
      
      public void testStockService () throws Exception {
          System.out.println("Testing stock service.");
          System.out.println("Testing deployment...");
          doTestDeploy();
          System.out.println("Testing service...");
          doTestStock();
          System.out.println("Testing undeployment...");
          doTestUndeploy();
          System.out.println("Test complete.");
          
          
          
              // second, and more involvedly, stop the http server
              // Try connecting in case the server is already stopped.
              URL url = new URL("http://localhost:8080");
              try {
                  HttpURLConnection connection = (HttpURLConnection)url.openConnection();
                  connection.connect();
                  this.readFully(connection);
                  connection.disconnect();
              } catch (IOException e) {
                  // Server is not running. Make this task a no-op.
                  return;
              }
              
          
      }
      /**
       * Read all the contents that are to be read
       */
      static void readFully(HttpURLConnection connection) throws IOException
      {
          // finish reading it to prevent (harmless) server-side exceptions
          BufferedInputStream is = new BufferedInputStream(connection.getInputStream());
          byte[] buffer = new byte[256];
          while((is.read(buffer)) > 0) {}
          is.close();
      }
  
  }
  
  
  
  
  1.1                  xml-axis/java/test/functional/TestTCPEcho.java
  
  Index: TestTCPEcho.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 1999 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 apache@apache.org.
   *
   * 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 java.net.*;
  import java.io.*;
  import java.util.*;
  
  import org.apache.axis.AxisFault ;
  import org.apache.axis.client.ServiceClient ;
  import org.apache.axis.client.tcp.TCPClient;
  import org.apache.axis.utils.Debug ;
  import org.apache.axis.utils.Options ;
  import org.apache.axis.utils.QName ;
  import org.apache.axis.encoding.ServiceDescription;
  import org.apache.axis.encoding.SOAPTypeMappingRegistry;
  
  import junit.framework.TestCase;
  
  /** Little serialization test with a struct.
   */
  public class TestTCPEcho extends TestCase {
    
    public TestTCPEcho(String name) {
      super(name);
    }
    
    public void testData() throws Exception {
      try {
        /*
         Options opts = new Options( args );
        
        Debug.setDebugLevel( opts.isFlagSet( 'd' ) );
        
        args = opts.getRemainingArgs();
         
        if ( args == null ) {
          System.err.println( "Usage: GetQuoteTCP -h <host> -p <port> <symbol>" );
          System.exit(1);
        }
         */
        String   symbol = "XXX"; // args[0] ;
        URL url = null;
        // parse host, port out of URL by hand
        // what to do about that URL format issue.....
        try {
          url = new URL("http://localhost:8088"); // (opts.getURL());
        } catch (IOException ex) {
          System.err.println("URL "+url+" hosed: "+ex);
          System.exit(1);
        }
        
        ServiceClient call   = new ServiceClient( new TCPClient() );
        call.set(TCPClient.HOST, url.getHost());
        call.set(TCPClient.PORT, ""+url.getPort());
        
        // reconstruct URL
        ServiceDescription sd = new ServiceDescription("stockQuotes", true);
        sd.addOutputParam("return", SOAPTypeMappingRegistry.XSD_FLOAT);
        call.setServiceDescription(sd);
        
        // if ( opts.isFlagSet('t') > 0 ) call.doLocal = true ;
        
        /*
         call.setUserID( opts.getUser() );
         call.setPassword( opts.getPassword() );
         */
        
        // useful option for profiling - perhaps we should remove before
        // shipping?
        /*
         String countOption = opts.isValueSet('c');
        int count=1;
        if ( countOption != null) {
          count=Integer.valueOf(countOption).intValue();
          System.out.println("Iterating " + count + " times");
         }
         */
        
        Float res = new Float(0.0F);
  //      for (int i=0; i<count; i++) {
          Object ret = call.invoke(
            "urn:xmltoday-delayed-quotes", "getQuote",
            new Object[] {symbol} );
          if (ret instanceof Float) {
            res = (Float) ret;
            // System.out.println( symbol + ": " + res );
            assertEquals("TestTCPEcho: stock price is 55.25", res.floatValue(), 55.25, 0.000001);
          } else {
            throw new Exception("Bad return value from echo test: "+ret);
          }
        }
        
  //    }
      catch( Exception e ) {
        if ( e instanceof AxisFault ) ((AxisFault)e).dump();
        e.printStackTrace();
        throw new Exception("Fault returned from echo test: "+e);
      }
    }
  }
  
  
  
  
  1.1                  xml-axis/java/test/functional/ant/RunAxisFunctionalTestsTask.java
  
  Index: RunAxisFunctionalTestsTask.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999 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 acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Ant", 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 apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * 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.ant;
  
  import java.net.*;
  import java.io.*;
  
  import org.apache.tools.ant.*;
  import org.apache.tools.ant.taskdefs.*;
  
  /**
   * Ant task for starting / stopping servers and running junit in the middle.
   * Based on the Cactus org.apache.commons.cactus.ant package, heavily munged
   * and cruftily dumped into one file.
   *
   * @author Rob Jellinghaus (robj@unrealities.com)
   */
  public class RunAxisFunctionalTestsTask extends Task
  {
      private String startTarget1;
      private String startTarget2;
      private String testTarget;
      private String stopTarget;
      private URL url;
      
      /**
       * Executes the task.
       */
      public void execute() throws BuildException
      {
          try {
              callStart(startTarget1);
              callStart(startTarget2);
              callTests();
          } finally {
              // Make sure we stop the server
              callStop();
          }
      }
      
      /**
       * Call the start server task
       */
      private void callStart(String startTarget)
      {
          new Thread(new TaskRunnable(startTarget)).start();
          // try a ping
          while (true) {
              try {
                  Thread.currentThread().sleep(500);
              } catch (InterruptedException ex) {
              }
              try {
                  sendOnSocket("ping\r\n");
                  // if no exception, return
                  System.out.println("RunAxisFunctionalTestsTask.callStart successfully pinged server.");
                  return;
              } catch (Exception ex) {
                  // loop & try again
              }
          }
          
          // NOTREACHED since the while loop returns if it successfully pings
      }
      
      /**
       * Call the run tests target
       */
      private void callTests()
      {
          antcall(testTarget);
      }
      
      /**
       * Call the stop server task
       */
      private void callStop()
      {
          try {
              // first, stop the tcp server
              sendOnSocket("quit\r\n");
              
              // second, and more involvedly, stop the http server
              // Try connecting in case the server is already stopped.
              URL url = new URL("http://localhost:8080");
              try {
                  HttpURLConnection connection = (HttpURLConnection)url.openConnection();
                  connection.connect();
                  this.readFully(connection);
                  connection.disconnect();
              } catch (IOException e) {
                  // Server is not running. Make this task a no-op.
                  return;
              }
              
              // Call the target that stops the server
              antcall(stopTarget);
              
              // Wait a few ms more (just to make sure)
              try {
                  Thread.sleep(500);
              } catch (InterruptedException e) {
                  throw new BuildException("Interruption during sleep", e);
              }
              
              /*
               // Continuously try calling the test URL until it fails
              while (true) {
  System.out.println("Trying localhost:8080...");
                  try {
                      HttpURLConnection connection = (HttpURLConnection)url.openConnection();
                      connection.connect();
                      this.readFully(connection);
                      connection.disconnect();
                  } catch (IOException e) {
                      break;
                  }
                  
                  try {
                      Thread.sleep(500);
                  } catch (InterruptedException ee) {
                      throw new BuildException("Interruption during sleep", ee);
                  }
                  
              }
              
              // Wait a few ms more (just to be sure !)
              try {
                  Thread.sleep(500);
              } catch (InterruptedException e) {
                  throw new BuildException("Interruption during sleep", e);
              }
               */
              System.out.println("RunAxisFunctionalTestsTask.callStop successfully sent quit message.");
          } catch (Exception ex) {
              // ignore; if socket not there, presume dead already
          }
      }
      
      
      /**
       * Call the selected ant task.
       */
      private void antcall (String taskName) {
          CallTarget callee;
          callee = (CallTarget)project.createTask("antcall");
          callee.setOwningTarget(target);
          callee.setTaskName(getTaskName());
          callee.setLocation(location);
          callee.init();
          callee.setTarget(taskName);
          callee.execute();
      }
      
      /**
       * Make a socket to the url, and send the given string
       */
      private void sendOnSocket (String str) throws Exception {
          Socket sock = null;
          try {
              sock = new Socket(url.getHost(), url.getPort());
              sock.getOutputStream().write(new String(str).getBytes());
              // get a single byte response
              int i = sock.getInputStream().read();
          } catch (Exception ex) {
              throw ex;
          }/* finally {
              if (sock != null) {
                  try {
                      sock.close();
                  } catch (IOException ex) {
                      // ignore
                  }
              }
           }*/
      }
      
      
      /**
       * Read all the contents that are to be read
       */
      static void readFully(HttpURLConnection connection) throws IOException
      {
          // finish reading it to prevent (harmless) server-side exceptions
          BufferedInputStream is = new BufferedInputStream(connection.getInputStream());
          byte[] buffer = new byte[256];
          while((is.read(buffer)) > 0) {}
          is.close();
      }
  
      /**
       * Sets the target to call to start server 1.
       *
       * @param theStartTarget the Ant target to call
       */
      public void setStartTarget1(String theStartTarget)
      {
          startTarget1 = theStartTarget;
      }
      
      /**
       * Sets the target to call to start server 2.
       *
       * @param theStartTarget the Ant target to call
       */
      public void setStartTarget2(String theStartTarget)
      {
          startTarget2 = theStartTarget;
      }
      
      /**
       * Sets the target to call to run the tests.
       *
       * @param theTerstTarget the Ant target to call
       */
      public void setTestTarget(String theTestTarget)
      {
          testTarget = theTestTarget;
      }
      
      /**
       * Sets the stop target.  This is the target which does
       * a HTTP admin shutdown on the simple server.
       */
      public void setStopTarget (String theStopTarget)
      {
          stopTarget = theStopTarget;
      }
      
      /**
       * Sets the target URL (just http://host:port)
       */
      public void setUrl (String theUrl) {
          try {
              url = new URL(theUrl);
          } catch (MalformedURLException ex) {
              System.err.println("Can't make URL from "+theUrl);
          }
      }
      
      
      /**
       * Helper class to execute a task in a thread.
       */
      public class TaskRunnable implements Runnable
      {
          String taskName;
          public TaskRunnable (String taskName) {
              this.taskName = taskName;
          }
          public void run () {
              antcall(taskName);
          }
      }
  }