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 gd...@apache.org on 2006/02/02 20:46:04 UTC

svn commit: r374476 - in /webservices/axis/trunk/java: src/org/apache/axis/ src/org/apache/axis/message/ src/org/apache/axis/providers/java/ src/org/apache/axis/transport/http/ test/functional/ test/soap/

Author: gdaniels
Date: Thu Feb  2 11:45:52 2006
New Revision: 374476

URL: http://svn.apache.org/viewcvs?rev=374476&view=rev
Log:
- Clean up mustUnderstand defaulting, only send if it's true

- Little bits of code cleanup

- Add ability to mark Handler option to receive onFault() calls for self-generated faults

- Accept 0 content length on 2XX codes

- Make sure SimpleAxisServer sends back the same HTTP version it receives

Modified:
    webservices/axis/trunk/java/src/org/apache/axis/Handler.java
    webservices/axis/trunk/java/src/org/apache/axis/SimpleChain.java
    webservices/axis/trunk/java/src/org/apache/axis/message/RPCElement.java
    webservices/axis/trunk/java/src/org/apache/axis/message/SOAPHeaderElement.java
    webservices/axis/trunk/java/src/org/apache/axis/providers/java/JavaProvider.java
    webservices/axis/trunk/java/src/org/apache/axis/providers/java/RPCProvider.java
    webservices/axis/trunk/java/src/org/apache/axis/transport/http/HTTPSender.java
    webservices/axis/trunk/java/src/org/apache/axis/transport/http/SimpleAxisWorker.java
    webservices/axis/trunk/java/test/functional/TestAutoTypes.java
    webservices/axis/trunk/java/test/soap/TestHeaderAttrs.java

Modified: webservices/axis/trunk/java/src/org/apache/axis/Handler.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/src/org/apache/axis/Handler.java?rev=374476&r1=374475&r2=374476&view=diff
==============================================================================
--- webservices/axis/trunk/java/src/org/apache/axis/Handler.java (original)
+++ webservices/axis/trunk/java/src/org/apache/axis/Handler.java Thu Feb  2 11:45:52 2006
@@ -31,6 +31,13 @@
  */
 public interface Handler extends Serializable {
     /**
+     * If this option is set, then we will receive an onFault() call after
+     * our own invoke() fails.  Otherwise we only get onFault() for later
+     * Handlers.
+     */
+    static final String OPT_CATCH_OWN_FAULTS = "handler.catchOwnFaults";
+
+    /**
      * Init is called when the chain containing this Handler object
      * is instantiated.
      */

Modified: webservices/axis/trunk/java/src/org/apache/axis/SimpleChain.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/src/org/apache/axis/SimpleChain.java?rev=374476&r1=374475&r2=374476&view=diff
==============================================================================
--- webservices/axis/trunk/java/src/org/apache/axis/SimpleChain.java (original)
+++ webservices/axis/trunk/java/src/org/apache/axis/SimpleChain.java Thu Feb  2 11:45:52 2006
@@ -131,8 +131,16 @@
                 msgContext.setResponseMessage(respMsg);
                 msgContext.setProperty(CAUGHTFAULT_PROPERTY, Boolean.TRUE);
             }
-            while( --i >= 0 )
-                ((Handler) handlers.elementAt( i )).onFault( msgContext );
+            // Unless this handler would like to catch its own fault, dec
+            // the index
+            Handler h = (Handler)handlers.elementAt(i);
+            Boolean catchOwn = (Boolean)h.getOption(OPT_CATCH_OWN_FAULTS);
+            if (catchOwn == null || !catchOwn.booleanValue()) {
+                i--;
+            }
+            while( i >= 0 ) {
+                ((Handler) handlers.elementAt( i-- )).onFault( msgContext );
+            }
             throw f;
         }
     }

Modified: webservices/axis/trunk/java/src/org/apache/axis/message/RPCElement.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/src/org/apache/axis/message/RPCElement.java?rev=374476&r1=374475&r2=374476&view=diff
==============================================================================
--- webservices/axis/trunk/java/src/org/apache/axis/message/RPCElement.java (original)
+++ webservices/axis/trunk/java/src/org/apache/axis/message/RPCElement.java Thu Feb  2 11:45:52 2006
@@ -233,7 +233,7 @@
                             context.setCurElement(this);
                         }
 
-                        publishToHandler((org.xml.sax.ContentHandler) context);
+                        publishToHandler(context);
 
                         // If parameter values are located in headers,
                         // get the information and publish the header

Modified: webservices/axis/trunk/java/src/org/apache/axis/message/SOAPHeaderElement.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/src/org/apache/axis/message/SOAPHeaderElement.java?rev=374476&r1=374475&r2=374476&view=diff
==============================================================================
--- webservices/axis/trunk/java/src/org/apache/axis/message/SOAPHeaderElement.java (original)
+++ webservices/axis/trunk/java/src/org/apache/axis/message/SOAPHeaderElement.java Thu Feb  2 11:45:52 2006
@@ -43,7 +43,7 @@
 
     protected boolean   processed = false;
 
-    protected String    actor = "http://schemas.xmlsoap.org/soap/actor/next";
+    protected String    actor;
     protected boolean   mustUnderstand = false;
     protected boolean   relay = false;
 
@@ -240,10 +240,12 @@
             else
                 val = mustUnderstand ? "1" : "0";
 
-            setAttribute(soapVer.getEnvelopeURI(),
+            if (mustUnderstand) {
+                setAttribute(soapVer.getEnvelopeURI(),
                          Constants.ATTR_MUST_UNDERSTAND,
                          val);
-            
+            }
+
             if (soapVer == SOAPConstants.SOAP12_CONSTANTS && relay) {
                 setAttribute(soapVer.getEnvelopeURI(), Constants.ATTR_RELAY,
                              "true");

Modified: webservices/axis/trunk/java/src/org/apache/axis/providers/java/JavaProvider.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/src/org/apache/axis/providers/java/JavaProvider.java?rev=374476&r1=374475&r2=374476&view=diff
==============================================================================
--- webservices/axis/trunk/java/src/org/apache/axis/providers/java/JavaProvider.java (original)
+++ webservices/axis/trunk/java/src/org/apache/axis/providers/java/JavaProvider.java Thu Feb  2 11:45:52 2006
@@ -167,7 +167,7 @@
                                            String serviceName,
                                            MessageContext msgContext,
                                            String clsName) throws Exception {
-        Object obj = null;
+        Object obj;
         boolean makeNewObject = false;
 
         // This is a little tricky.
@@ -276,7 +276,9 @@
 
         if ((clsName == null) || clsName.equals("")) {
             throw new AxisFault("Server.NoClassForService",
-                Messages.getMessage("noOption00", getServiceClassNameOptionName(), serviceName),
+                Messages.getMessage("noOption00",
+                                    getServiceClassNameOptionName(),
+                                    serviceName),
                 null, null);
         }
 
@@ -284,7 +286,10 @@
         Object serviceObject = null;
 
         try {
-            serviceObject = getServiceObject(msgContext, service, clsName, scope);
+            serviceObject = getServiceObject(msgContext,
+                                             service,
+                                             clsName,
+                                             scope);
 
             SOAPEnvelope   resEnv = null;
 
@@ -429,8 +434,8 @@
                                     SOAPService service,
                                     MessageContext msgContext)
             throws AxisFault {
-        ClassLoader cl = null;
-        Class serviceClass = null;
+        ClassLoader cl;
+        Class serviceClass;
         AxisEngine engine = service.getEngine();
 
         // If we have a message context, use that to get classloader

Modified: webservices/axis/trunk/java/src/org/apache/axis/providers/java/RPCProvider.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/src/org/apache/axis/providers/java/RPCProvider.java?rev=374476&r1=374475&r2=374476&view=diff
==============================================================================
--- webservices/axis/trunk/java/src/org/apache/axis/providers/java/RPCProvider.java (original)
+++ webservices/axis/trunk/java/src/org/apache/axis/providers/java/RPCProvider.java Thu Feb  2 11:45:52 2006
@@ -76,7 +76,7 @@
         ServiceDesc serviceDesc = service.getServiceDescription();
         RPCElement body = getBody(reqEnv, msgContext);
 
-        Vector args = null;
+        Vector args;
         try {
             args = body.getParams();
         } catch (SAXException e) {
@@ -181,7 +181,7 @@
         }
 
         // OK!  Now we can invoke the method
-        Object objRes = null;
+        Object objRes;
         try {
             objRes = invokeMethod(msgContext,
                                   operation.getMethod(),
@@ -212,7 +212,9 @@
         if (OperationType.ONE_WAY.equals(operation.getMep()))
             return;
 
-        RPCElement resBody = createResponseBody(body, msgContext, operation, serviceDesc, objRes, resEnv, outs);
+        RPCElement resBody = createResponseBody(body, msgContext, operation,
+                                                serviceDesc, objRes, resEnv,
+                                                outs);
         resEnv.addBodyElement(resBody);
     }
 
@@ -283,7 +285,9 @@
         return body;
     }
 
-    protected OperationDesc getOperationDesc(MessageContext msgContext, RPCElement body) throws SAXException, AxisFault {
+    protected OperationDesc getOperationDesc(MessageContext msgContext,
+                                             RPCElement body)
+            throws SAXException, AxisFault {
         SOAPService service = msgContext.getService();
         ServiceDesc serviceDesc = service.getServiceDescription();
         String methodName = body.getMethodName();
@@ -292,34 +296,43 @@
         OperationDesc operation = msgContext.getOperation();
         if (operation == null) {
             QName qname = new QName(body.getNamespaceURI(),
-                    body.getName());
+                                    body.getName());
             operation = serviceDesc.getOperationByElementQName(qname);
 
-        if (operation == null) {
-            SOAPConstants soapConstants = msgContext == null ?
-                    SOAPConstants.SOAP11_CONSTANTS :
-                    msgContext.getSOAPConstants();
-            if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) {
-                AxisFault fault =
-                        new AxisFault(Constants.FAULT_SOAP12_SENDER,
-                                      Messages.getMessage("noSuchOperation",
-                                                          methodName),
-                                      null,
-                                      null);
-                fault.addFaultSubCode(Constants.FAULT_SUBCODE_PROC_NOT_PRESENT);
-                throw new SAXException(fault);
-            } else {
-                throw new AxisFault(Constants.FAULT_CLIENT, Messages.getMessage("noSuchOperation", methodName),
-                        null, null);
-            }
+            if (operation == null) {
+                SOAPConstants soapConstants = msgContext == null ?
+                        SOAPConstants.SOAP11_CONSTANTS :
+                        msgContext.getSOAPConstants();
+                if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) {
+                    AxisFault fault =
+                            new AxisFault(Constants.FAULT_SOAP12_SENDER,
+                                          Messages.getMessage("noSuchOperation",
+                                                              methodName),
+                                          null,
+                                          null);
+                    fault.addFaultSubCode(
+                            Constants.FAULT_SUBCODE_PROC_NOT_PRESENT);
+                    throw new SAXException(fault);
+                } else {
+                    throw new AxisFault(Constants.FAULT_CLIENT,
+                                        Messages.getMessage(
+                                                "noSuchOperation", methodName),
+                                        null, null);
+                }
             } else {
-                 msgContext.setOperation(operation);
+                msgContext.setOperation(operation);
             }
         }
         return operation;
     }
 
-    protected RPCElement createResponseBody(RPCElement body, MessageContext msgContext, OperationDesc operation, ServiceDesc serviceDesc, Object objRes, SOAPEnvelope resEnv, ArrayList outs) throws Exception
+    protected RPCElement createResponseBody(RPCElement body,
+                                            MessageContext msgContext,
+                                            OperationDesc operation,
+                                            ServiceDesc serviceDesc,
+                                            Object objRes,
+                                            SOAPEnvelope resEnv,
+                                            ArrayList outs) throws Exception
     {
         String methodName = body.getMethodName();
         /* Now put the result in the result SOAPEnvelope */

Modified: webservices/axis/trunk/java/src/org/apache/axis/transport/http/HTTPSender.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/src/org/apache/axis/transport/http/HTTPSender.java?rev=374476&r1=374475&r2=374476&view=diff
==============================================================================
--- webservices/axis/trunk/java/src/org/apache/axis/transport/http/HTTPSender.java (original)
+++ webservices/axis/trunk/java/src/org/apache/axis/transport/http/HTTPSender.java Thu Feb  2 11:45:52 2006
@@ -701,9 +701,20 @@
         location = (null == location)
                 ? null
                 : location.trim();
-                
+
+        String contentLength =
+            (String) headers.get(HEADER_CONTENT_LENGTH_LC);
+
+        contentLength = (null == contentLength)
+                ? null
+                : contentLength.trim();
+        int length = -1;
+        if (contentLength != null) {
+            length = Integer.parseInt(contentLength);
+        }
+
         if ((returnCode > 199) && (returnCode < 300)) {
-            if (returnCode == 202) {
+            if (returnCode == 202 || length == 0) {
                 return inp;
             }
             // SOAP return is OK - so fall through
@@ -757,13 +768,6 @@
         contentLocation = (null == contentLocation)
                 ? null
                 : contentLocation.trim();
-
-        String contentLength = 
-            (String) headers.get(HEADER_CONTENT_LENGTH_LC);
-
-        contentLength = (null == contentLength)
-                ? null
-                : contentLength.trim();
 
         String transferEncoding =
             (String) headers.get(HEADER_TRANSFER_ENCODING_LC);

Modified: webservices/axis/trunk/java/src/org/apache/axis/transport/http/SimpleAxisWorker.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/src/org/apache/axis/transport/http/SimpleAxisWorker.java?rev=374476&r1=374475&r2=374476&view=diff
==============================================================================
--- webservices/axis/trunk/java/src/org/apache/axis/transport/http/SimpleAxisWorker.java (original)
+++ webservices/axis/trunk/java/src/org/apache/axis/transport/http/SimpleAxisWorker.java Thu Feb  2 11:45:52 2006
@@ -37,6 +37,7 @@
 import javax.xml.soap.MimeHeader;
 import javax.xml.soap.MimeHeaders;
 import javax.xml.soap.SOAPMessage;
+import javax.xml.rpc.holders.StringHolder;
 
 import java.io.OutputStream;
 import java.io.ByteArrayInputStream;
@@ -63,7 +64,7 @@
     private static byte ISE[] = ("500 " + Messages.getMessage("internalError01")).getBytes();
 
     // HTTP prefix
-    private static byte HTTP[] = "HTTP/1.0 ".getBytes();
+    private static byte HTTP[] = "HTTP/".getBytes();
 
     // Standard MIME headers for XML payload
     private static byte XML_MIME_STUFF[] =
@@ -177,6 +178,7 @@
         // buffers for the headers we care about
         StringBuffer soapAction = new StringBuffer();
         StringBuffer httpRequest = new StringBuffer();
+        String httpVersion = "1.0";
         StringBuffer fileName = new StringBuffer();
         StringBuffer cookie = new StringBuffer();
         StringBuffer cookie2 = new StringBuffer();
@@ -221,10 +223,15 @@
                 is.setInputStream(socket.getInputStream());
                 // parse all headers into hashtable
                 MimeHeaders requestHeaders = new MimeHeaders();
+                StringHolder httpVersionHolder = new StringHolder();
                 int contentLength = parseHeaders(is, buf, contentType,
                         contentLocation, soapAction,
                         httpRequest, fileName,
-                        cookie, cookie2, authInfo, requestHeaders);
+                        cookie, cookie2, authInfo, requestHeaders,
+                        httpVersionHolder);
+                if (httpVersionHolder.value != null) {
+                    httpVersion = httpVersionHolder.value;
+                }
                 is.setContentLength(contentLength);
 
                 int paramIdx = fileName.toString().indexOf('?');
@@ -303,6 +310,8 @@
                     
                     OutputStream out = socket.getOutputStream();
                     out.write(HTTP);
+                    out.write(httpVersion.getBytes());
+                    out.write(' ');
                     if(fileName.length()==0) {
                         out.write("301 Redirect\nLocation: /axis/\n\n".getBytes());
                         out.flush();
@@ -357,7 +366,7 @@
                                 sb.append("<ul>\n");
                                 for (Iterator it = operations.iterator(); it.hasNext();) {
                                     OperationDesc desc = (OperationDesc) it.next();
-                                    sb.append("<li>" + desc.getName());
+                                    sb.append("<li>").append(desc.getName());
                                 }
                                 sb.append("</ul>\n");
                             }
@@ -477,6 +486,8 @@
             // Send it on its way...
             OutputStream out = socket.getOutputStream();
             out.write(HTTP);
+            out.write(httpVersion.getBytes());
+            out.write(' ');            
             out.write(status);
 
             if (responseMsg != null) {
@@ -561,7 +572,8 @@
                              StringBuffer cookie,
                              StringBuffer cookie2,
                              StringBuffer authInfo,
-                             MimeHeaders headers)
+                             MimeHeaders headers,
+                             StringHolder httpVersion)
             throws java.io.IOException {
         int n;
         int len = 0;
@@ -591,11 +603,16 @@
             return 0;
         } else if (buf[0] == postHeader[0]) {
             httpRequest.append("POST");
-            for (int i = 0; i < n - 6; i++) {
+            int i = 0;
+            for (; i < n - 6; i++) {
                 char c = (char) (buf[i + 6] & 0x7f);
                 if (c == ' ')
                     break;
                 fileName.append(c);
+            }
+            // Might have HTTP version here!
+            if (i + 14 < n) {
+                httpVersion.value = new String(buf, i + 12, 3);
             }
             log.debug(Messages.getMessage("filename01", "SimpleAxisServer", fileName.toString()));
         } else {

Modified: webservices/axis/trunk/java/test/functional/TestAutoTypes.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/test/functional/TestAutoTypes.java?rev=374476&r1=374475&r2=374476&view=diff
==============================================================================
--- webservices/axis/trunk/java/test/functional/TestAutoTypes.java (original)
+++ webservices/axis/trunk/java/test/functional/TestAutoTypes.java Thu Feb  2 11:45:52 2006
@@ -90,7 +90,8 @@
     }
 
     public void testEchoBeanArray() throws Exception {
-        SimpleBean[] beans = (SimpleBean[]) getSimpleProxy().echoBeanArray(new SimpleBean[]{
+        IAutoTypes simpleProxy = getSimpleProxy();
+        SimpleBean[] beans = (SimpleBean[]) simpleProxy.echoBeanArray(new SimpleBean[]{
             new SimpleBean(), new SimpleBean(),
             new SimpleBean(), new SimpleBean(), new SimpleBean(),
             new SimpleBean()});

Modified: webservices/axis/trunk/java/test/soap/TestHeaderAttrs.java
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/java/test/soap/TestHeaderAttrs.java?rev=374476&r1=374475&r2=374476&view=diff
==============================================================================
--- webservices/axis/trunk/java/test/soap/TestHeaderAttrs.java (original)
+++ webservices/axis/trunk/java/test/soap/TestHeaderAttrs.java Thu Feb  2 11:45:52 2006
@@ -49,12 +49,9 @@
     
     static final String ACTOR = "http://some.actor/";
     
-    static SOAPHeaderElement goodHeader = 
-                                       new SOAPHeaderElement(GOOD_HEADER_NS, 
-                                                             GOOD_HEADER_NAME);
-    static SOAPHeaderElement badHeader = 
-                                       new SOAPHeaderElement(BAD_HEADER_NS, 
-                                                             BAD_HEADER_NAME);
+    SOAPHeaderElement goodHeader;
+    SOAPHeaderElement badHeader; 
+
 
     private SimpleProvider provider = new SimpleProvider();
     private AxisServer engine = new AxisServer(provider);
@@ -76,7 +73,9 @@
     public void setUp() throws Exception {
         engine.init();
         localTransport.setUrl(localURL);
-        
+        goodHeader = new SOAPHeaderElement(GOOD_HEADER_NS, GOOD_HEADER_NAME);
+        badHeader = new SOAPHeaderElement(BAD_HEADER_NS, BAD_HEADER_NAME);
+
         SOAPService service = new SOAPService(new TestHandler(),
                                               new RPCProvider(),
                                               null);