Jeff, was this idea discussed/proposed on the list? If so apologies for missing it.

IMO this is a departure from the principle that headers are handled by handlers.

Sanjiva.

[EMAIL PROTECTED] wrote:
Author: barrettj
Date: Fri Jun 22 11:33:38 2007
New Revision: 549924

URL: http://svn.apache.org/viewvc?view=rev&rev=549924
Log:
Add ability for other components (such as message recievers) to indicate they 
will handle certain mustUnderstand headers.
Add registration of JAXWS header paramaters as headers that will be understood 
by the JAXWS Message Receiver; add associated test.

Added:
    
webservices/axis2/trunk/java/modules/metadata/test/org/apache/axis2/jaxws/description/MustUnderstandTests.java
Modified:
    
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/AxisOperation.java
    
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisEngine.java
    
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/OperationDescriptionImpl.java

Modified: 
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/AxisOperation.java
URL: 
http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/AxisOperation.java?view=diff&rev=549924&r1=549923&r2=549924
==============================================================================
--- 
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/AxisOperation.java
 (original)
+++ 
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/AxisOperation.java
 Fri Jun 22 11:33:38 2007
@@ -59,6 +59,20 @@
// to store mepURL
     private String mepURI;
+    // List of Header QNames that have been registered as understood, for 
example by message receivers.
+    // This list DOES NOT contain QNames for headers understood by handlers 
(e.g. security or sandesha)
+ // This list is used in the Axis2 Engine checkMustUnderstand processing to identify headers + // marked as mustUnderstand which have not yet been processed (via dispatch handlers), + // but which will be processed by the message receiver. + // REVIEW: (1) This only supports a single list of understood headers; should there be + // different lists for INPUT messages and OUTPUT messages?
+    // (2) This probably needs to support SOAP actors/roles
+    // (3) Strictly speaking, per the SOAP spec, all mustUnderstand checks 
should be performed
+    // before processing begins on the message.  So, ideally, even the QoSes 
should register
+    // the headers (and roles) they understand and the mustUnderstand checks 
should be done before
+    // they are invoked.  There are issues with that, however, in terms of 
targeting the operation, and
+    // the possible encryption of headers.
+    private ArrayList understoodHeaderQNames = new ArrayList();
private MessageReceiver messageReceiver; @@ -555,4 +569,29 @@
         return getChildren();
     }
+ /**
+     * Return the list of SOAP header QNames that have been registered as 
understood by
+     * message receivers, for example.  Note that this list DOES NOT contain 
the QNames that are
+ * understood by handlers run prior to the message receiver. This is used in the Axis2 + * Engine checkMustUnderstand processing to identify headers marked as mustUnderstand which
+     * have not yet been processed (via dispatch handlers), but which will be 
processed by
+     * the message receiver.
+ * + * @return ArrayList of handler QNAames registered as understood by the message receiver.
+     */
+    public ArrayList getUnderstoodHeaderQNames() {
+        return understoodHeaderQNames;
+    }
+
+    /**
+     * Add a SOAP header QName to the list of headers understood by this 
operation.  This is used
+     * by other (non dispatch handler) components such as a message receiver 
to register that it
+     * will process a header.
+     * @param understoodHeader
+     */
+    public void registerUnderstoodHeaderQName(QName understoodHeader) {
+        if (understoodHeader != null) {
+            understoodHeaderQNames.add(understoodHeader);
+        }
+    }
  }

Modified: 
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisEngine.java
URL: 
http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisEngine.java?view=diff&rev=549924&r1=549923&r2=549924
==============================================================================
--- 
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisEngine.java
 (original)
+++ 
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisEngine.java
 Fri Jun 22 11:33:38 2007
@@ -70,11 +70,29 @@
while (headerBlocks.hasNext()) {
             SOAPHeaderBlock headerBlock = (SOAPHeaderBlock) 
headerBlocks.next();
+            QName headerQName = headerBlock.getQName();
// if this header block has been processed or mustUnderstand isn't
             // turned on then its cool
             if (headerBlock.isProcessed() || !headerBlock.getMustUnderstand()) 
{
                 continue;
+            }
+ // Check if another component, such as the message receiver, has registered that + // they will process this header
+            AxisOperation axisOperation = msgContext.getAxisOperation();
+            if (axisOperation != null) {
+                ArrayList understoodHeaderList = (ArrayList) 
axisOperation.getUnderstoodHeaderQNames();
+                if (understoodHeaderList != null && 
!understoodHeaderList.isEmpty()) {
+                    if (understoodHeaderList.contains(headerQName)) {
+                        if (LoggingControl.debugLoggingAllowed && 
log.isDebugEnabled()) {
+                            log.debug("MustUnderstand header registered as 
understood on AxisOperation: " + headerQName);
+ } + continue;
+                    }
+                }
+            }
+            if (LoggingControl.debugLoggingAllowed && log.isDebugEnabled()) {
+                log.debug("MustUnderstand header not processed or registered as 
understood " + headerQName);
             }
// Oops, throw an appropriate MustUnderstand fault!!

Modified: 
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/OperationDescriptionImpl.java
URL: 
http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/OperationDescriptionImpl.java?view=diff&rev=549924&r1=549923&r2=549924
==============================================================================
--- 
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/OperationDescriptionImpl.java
 (original)
+++ 
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/OperationDescriptionImpl.java
 Fri Jun 22 11:33:38 2007
@@ -18,10 +18,12 @@
package org.apache.axis2.jaxws.description.impl; +import org.apache.axis2.AxisFault;
 import org.apache.axis2.description.AxisMessage;
 import org.apache.axis2.description.AxisOperation;
 import org.apache.axis2.description.AxisOperationFactory;
 import org.apache.axis2.description.AxisService;
+import org.apache.axis2.description.Parameter;
 import org.apache.axis2.description.WSDL2Constants;
 import org.apache.axis2.jaxws.ExceptionFactory;
 import org.apache.axis2.jaxws.description.EndpointDescriptionJava;
@@ -205,7 +207,9 @@
         } else {
             this.axisOperation = createAxisOperation();
         }
-    }
+        // Register understood headers on axisOperation
+        registerMustUnderstandHeaders();
+}
/**
      * Create an AxisOperation for this Operation.  Note that the 
ParameterDescriptions must be
@@ -346,6 +350,8 @@
             parameterDescriptions = createParameterDescriptions();
             faultDescriptions = createFaultDescriptions();
         }
+        // Register understood headers on axisOperation
+        registerMustUnderstandHeaders();
     }
public EndpointInterfaceDescription getEndpointInterfaceDescription() {
@@ -1617,5 +1623,48 @@
             return string.toString();
         }
         return string.toString();
+    }
+ + /** + * Adds a list of SOAP header QNames that are understood by JAXWS for this operation to the
+     * AxisOperation.  This will be used by Axis2 to verify that all headers 
marked as
+     * mustUnderstand have been or will be processed.
+ * + * Server side headers considered understood [JAXWS 2.0 Sec 10.2.1 page 117] + * - SEI method params that are in headers + * - Headers processed by application handlers (TBD) + * + * Client side headers considered understood: None
+     *
+     */
+    private void registerMustUnderstandHeaders() {
+ + // REVIEW: If client side (return value, OUT or INOUT params) needs to be supported then
+        // this needs to process client and server differently.
+
+ AxisOperation theAxisOperation = getAxisOperation(); + if (theAxisOperation == null) {
+            if (log.isDebugEnabled()) {
+                log.debug("The axis operation is null, so header QNames could not 
be registered.  OpDesc = " + this);
+            }
+            return;
+        }
+
+        // If any IN or INOUT parameters are in the header, then add their 
QNames to the list
+        ParameterDescription paramDescs[] = getParameterDescriptions();
+        if (paramDescs != null && paramDescs.length > 0) {
+            for (ParameterDescription paramDesc : paramDescs) {
+ if (paramDesc.isHeader() + && (paramDesc.getMode() == WebParam.Mode.IN + || paramDesc.getMode() == WebParam.Mode.INOUT)) { + QName headerQN = new QName(paramDesc.getTargetNamespace(), + paramDesc.getParameterName());
+                    theAxisOperation.registerUnderstoodHeaderQName(headerQN);
+                    if (log.isDebugEnabled()) {
+                        log.debug("OpDesc: understoodQName added to AxisOperation 
(if not null) " + headerQN);
+                    }
+                }
+            }
+        }
     }
 }

Added: 
webservices/axis2/trunk/java/modules/metadata/test/org/apache/axis2/jaxws/description/MustUnderstandTests.java
URL: 
http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/test/org/apache/axis2/jaxws/description/MustUnderstandTests.java?view=auto&rev=549924
==============================================================================
--- 
webservices/axis2/trunk/java/modules/metadata/test/org/apache/axis2/jaxws/description/MustUnderstandTests.java
 (added)
+++ 
webservices/axis2/trunk/java/modules/metadata/test/org/apache/axis2/jaxws/description/MustUnderstandTests.java
 Fri Jun 22 11:33:38 2007
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axis2.jaxws.description;
+
+import org.apache.axis2.description.AxisOperation;
+
+import javax.jws.WebParam;
+import javax.jws.WebService;
+import javax.xml.namespace.QName;
+import javax.xml.ws.Holder;
+
+import java.util.ArrayList;
+
+import junit.framework.TestCase;
+
+/**
+ * + */
+public class MustUnderstandTests extends TestCase {
+ + public void testHeaderParameters() {
+        // Test IN and INOUT header paramaters in SEI
+        ServiceDescription svcDesc = 
DescriptionFactory.createServiceDescription(HeaderParameters.class);
+        assertNotNull(svcDesc);
+        EndpointDescription epDescs[] = svcDesc.getEndpointDescriptions();
+        assertNotNull(epDescs);
+        assertEquals(1, epDescs.length);
+        EndpointInterfaceDescription epiDesc = 
epDescs[0].getEndpointInterfaceDescription();
+        assertNotNull(epiDesc);
+ + OperationDescription opDescs[] = epiDesc.getOperations();
+        assertNotNull(opDescs);
+        assertEquals(1, opDescs.length);
+        OperationDescription opDesc = opDescs[0];
+        assertEquals("echoString", opDesc.getOperationName());
+ + AxisOperation axisOperation = opDesc.getAxisOperation();
+        assertNotNull(axisOperation);
+        ArrayList understoodQNames = axisOperation.getUnderstoodHeaderQNames();
+        assertNotNull(understoodQNames);
+        assertEquals(4, understoodQNames.size());
+ + assertTrue(understoodQNames.contains(new QName("webservice.namespace", "renamedParam1")));
+        assertTrue(understoodQNames.contains(new QName("webservice.namespace", 
"arg1")));
+        assertTrue(understoodQNames.contains(new QName("webparam.namespace", 
"arg2")));
+        assertFalse(understoodQNames.contains(new QName("webservice.namespace", 
"outOnly")));
+        assertFalse(understoodQNames.contains(new QName("webservice.namespace", 
"arg3")));
+        assertTrue(understoodQNames.contains(new QName("webservice.namespace", 
"inOut")));
+        assertFalse(understoodQNames.contains(new QName("webservice.namespace", 
"arg4")));
+        assertFalse(understoodQNames.contains(new QName("webservice.namespace", 
"notInHeader")));
+        assertFalse(understoodQNames.contains(new QName("webservice.namespace", 
"arg5")));
+    }
+}
+
[EMAIL PROTECTED](targetNamespace="webservice.namespace")
+class HeaderParameters {
+    public String echoString(
+            @WebParam(name="renamedParam1", header=true) String param1,
+            @WebParam(header=true) String param2,
+            @WebParam(targetNamespace="webparam.namespace", header=true) 
String param3,
+            @WebParam(mode=WebParam.Mode.OUT, header=true) Holder<String> 
outOnly,
+            @WebParam(name="inOut", mode=WebParam.Mode.INOUT, header=true) 
Holder<String> inOut,
+            String notInHeader) {
+                return null;
+            }
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



--
Sanjiva Weerawarana, Ph.D.
Founder & Director; Lanka Software Foundation; http://www.opensource.lk/
Founder, Chairman & CEO; WSO2, Inc.; http://www.wso2.com/
Director; Open Source Initiative; http://www.opensource.org/
Member; Apache Software Foundation; http://www.apache.org/
Visiting Lecturer; University of Moratuwa; http://www.cse.mrt.ac.lk/

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to