Author: scheu
Date: Thu Sep  9 19:24:21 2010
New Revision: 995548

URL: http://svn.apache.org/viewvc?rev=995548&view=rev
Log:
AXIS2-4815
Contributor:Rich Scheuerle
Summary:
Add a property to allow access to the envelope as a String within a JAX-WS 
handler

Added:
    axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/api/
    
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/api/MessageAccessor.java
    
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/api/MessageAccessorFactory.java
    
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/api/MessageAccessorFactoryImpl.java
Modified:
    
axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/headershandler/HeadersClientProtocolHandler.java
    
axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/headershandler/HeadersClientProtocolHandler2.java
    
axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/headershandler/HeadersServerProtocolHandler.java
    
axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/headershandler/TestHeaders.java
    
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/Constants.java
    
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/core/MessageContext.java
    
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/registry/FactoryRegistry.java

Modified: 
axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/headershandler/HeadersClientProtocolHandler.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/headershandler/HeadersClientProtocolHandler.java?rev=995548&r1=995547&r2=995548&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/headershandler/HeadersClientProtocolHandler.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/headershandler/HeadersClientProtocolHandler.java
 Thu Sep  9 19:24:21 2010
@@ -62,6 +62,7 @@ public class HeadersClientProtocolHandle
     public boolean handleMessage(SOAPMessageContext messagecontext) {
         Boolean outbound = (Boolean) 
messagecontext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
         tracker.handleMessage(outbound);
+        headerUtil.confirmMessageAsString(messagecontext);
         if (outbound) {
 
                // this is the second client outbound handler hit

Modified: 
axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/headershandler/HeadersClientProtocolHandler2.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/headershandler/HeadersClientProtocolHandler2.java?rev=995548&r1=995547&r2=995548&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/headershandler/HeadersClientProtocolHandler2.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/headershandler/HeadersClientProtocolHandler2.java
 Thu Sep  9 19:24:21 2010
@@ -74,6 +74,7 @@ public class HeadersClientProtocolHandle
     public boolean handleMessage(SOAPMessageContext messagecontext) {
         Boolean outbound = (Boolean) 
messagecontext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
         tracker.handleMessage(outbound);
+        headerUtil.confirmMessageAsString(messagecontext);
         if (outbound) {
 
                // this is the third client outbound handler hit

Modified: 
axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/headershandler/HeadersServerProtocolHandler.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/headershandler/HeadersServerProtocolHandler.java?rev=995548&r1=995547&r2=995548&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/headershandler/HeadersServerProtocolHandler.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/headershandler/HeadersServerProtocolHandler.java
 Thu Sep  9 19:24:21 2010
@@ -47,6 +47,7 @@ public class HeadersServerProtocolHandle
     public boolean handleFault(SOAPMessageContext messagecontext) {
        Boolean outbound = (Boolean) 
messagecontext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        tracker.handleFault(outbound);
+       headerUtil.confirmMessageAsString(messagecontext);
        if (outbound) {
            
            Map<QName, List<String>> requestHeaders = (Map<QName, 
List<String>>)messagecontext.get(Constants.JAXWS_OUTBOUND_SOAP_HEADERS);

Modified: 
axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/headershandler/TestHeaders.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/headershandler/TestHeaders.java?rev=995548&r1=995547&r2=995548&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/headershandler/TestHeaders.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/headershandler/TestHeaders.java
 Thu Sep  9 19:24:21 2010
@@ -27,6 +27,10 @@ import javax.xml.soap.SOAPElement;
 import javax.xml.soap.SOAPException;
 import javax.xml.soap.SOAPFactory;
 import javax.xml.ws.WebServiceException;
+import javax.xml.ws.handler.MessageContext;
+
+import org.apache.axis2.jaxws.Constants;
+import org.apache.axis2.jaxws.api.MessageAccessor;
 
 public class TestHeaders {
        
@@ -167,4 +171,27 @@ public class TestHeaders {
        }
     }
     
+    /**
+     * Throw an exception if the jaxws.message.as.string property fails.
+     * @param mc
+     */
+    public void confirmMessageAsString(MessageContext mc) {
+        String text = null;
+        if (mc != null) {
+            Object accessor =  mc.get(Constants.JAXWS_MESSAGE_ACCESSOR);
+            if (accessor != null) {
+                Boolean preMessageAccessed = (Boolean) 
mc.get("jaxws.isMessageAccessed");
+                text = accessor.toString();
+                Boolean postMessageAccessed = (Boolean) 
mc.get("jaxws.isMessageAccessed");
+                if (preMessageAccessed != postMessageAccessed) {
+                    throw new WebServiceException("The message was accessed 
when toString was called.");
+                }
+                if (!text.contains("Envelope") || !text.contains("Body")) {
+                    throw new WebServiceException("The message appears to be 
invalid: " + text);
+                }
+                return;
+            }
+        }
+        throw new WebServiceException("Could not access the MessageAccessor: " 
+ mc);   
+    }
 }

Modified: 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/Constants.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/Constants.java?rev=995548&r1=995547&r2=995548&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/Constants.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/Constants.java
 Thu Sep  9 19:24:21 2010
@@ -190,6 +190,20 @@ public interface Constants {
     public static final String JAXWS_JAXB_WRITE_REMOVE_ILLEGAL_CHARS = 
         "jaxws.jaxb.write.remove.illegal.chars";
     
+    /**
+     * javax.xml.ws.handler.MessageContext  Property:
+     * Name: jaxws.message.as.string
+     * Value: null or MessageAccessor
+     * 
+     * Description:
+     * A handler or resource injection @WebServiceContext may use
+     * this property to get access to a MessageAccessor object.
+     * The MessageAccessor contains methods to allow a user to 
+     * get additional attributes from the message (for example 
getMessageAsString)
+     */
+    public static final String JAXWS_MESSAGE_ACCESSOR = 
+        "jaxws.message.accessor";
+
     /** 
      * Context Property:
      * Name: jaxws.dispatch.outbound.operation.resolution.enable

Added: 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/api/MessageAccessor.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/api/MessageAccessor.java?rev=995548&view=auto
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/api/MessageAccessor.java
 (added)
+++ 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/api/MessageAccessor.java
 Thu Sep  9 19:24:21 2010
@@ -0,0 +1,94 @@
+/*
+ * 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.api;
+
+import java.io.ByteArrayOutputStream;
+import java.io.UnsupportedEncodingException;
+
+import javax.xml.stream.FactoryConfigurationError;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.ws.WebServiceException;
+
+import org.apache.axiom.om.OMOutputFormat;
+import org.apache.axiom.om.impl.MTOMXMLStreamWriter;
+import org.apache.axis2.Constants;
+import org.apache.axis2.jaxws.core.MessageContext;
+import org.apache.axis2.jaxws.message.Message;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Value of the Constants.JAXWS_MESSAGE_ACCESSOR property 
+ * Allows a user to gain access to certain Message information
+ * that are not exposed by the Message on the
+ * javax.xml.ws.handler.MessageContext
+ * 
+ * The MessageAccessor is created with MessageAccessorFactory.
+ * This allows embedding software to extend the MessageAccessor
+ */
+public class MessageAccessor {
+    private static final Log log = LogFactory.getLog(MessageAccessor.class);
+    private MessageContext mc;
+    
+    MessageAccessor(MessageContext mc) {
+        super();
+        this.mc = mc;
+    }
+
+    /**
+     * @return message as String
+     */
+    public String getMessageAsString() {
+        if (log.isDebugEnabled()) {
+            log.debug("Enter MessageAccessor");
+        }
+        Message msg = mc.getMessage();
+        String text = null;
+        
+        if (msg != null) {
+            try {
+                ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                OMOutputFormat format = new OMOutputFormat();
+                String charSetEncoding = (String) 
mc.getProperty(Constants.Configuration.CHARACTER_SET_ENCODING);
+                charSetEncoding = (charSetEncoding == null) ? "UTF-8" : 
charSetEncoding;
+                format.setCharSetEncoding(charSetEncoding);
+                MTOMXMLStreamWriter writer  = new MTOMXMLStreamWriter(baos, 
format);
+                msg.outputTo(writer, false);
+                writer.flush();
+                text =  baos.toString(charSetEncoding);
+            } catch (Throwable t) {
+                if (log.isDebugEnabled()) {
+                    log.debug("Cannot access message as string", t);
+                }
+                text = null;
+            }
+        }
+        if (log.isDebugEnabled()) {
+            log.debug("Exit MessageAccessor");
+        }
+        return text;
+    }
+  
+    /* (non-Javadoc)
+     * @see java.lang.Object#toString()
+     */
+    public String toString() {
+        return getMessageAsString();
+    }
+}

Added: 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/api/MessageAccessorFactory.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/api/MessageAccessorFactory.java?rev=995548&view=auto
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/api/MessageAccessorFactory.java
 (added)
+++ 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/api/MessageAccessorFactory.java
 Thu Sep  9 19:24:21 2010
@@ -0,0 +1,30 @@
+/*
+ * 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.api;
+
+import org.apache.axis2.jaxws.core.MessageContext;
+
+/**
+ * Create an MessageAccessor object.  
+ * Embedding software may want to extend the MessageAccessor capability with
+ * a derived class
+ */
+public interface MessageAccessorFactory {
+    public MessageAccessor createMessageAccessor(MessageContext mc);
+}

Added: 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/api/MessageAccessorFactoryImpl.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/api/MessageAccessorFactoryImpl.java?rev=995548&view=auto
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/api/MessageAccessorFactoryImpl.java
 (added)
+++ 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/api/MessageAccessorFactoryImpl.java
 Thu Sep  9 19:24:21 2010
@@ -0,0 +1,41 @@
+/*
+ * 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.api;
+
+import org.apache.axis2.jaxws.core.MessageContext;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Create an MessageAccessor object.  
+ * Embedding software may want to use a different factory.
+ * @see org.apache.axis2.jaxws.registry.FactoryRegistry
+ */
+public class MessageAccessorFactoryImpl implements MessageAccessorFactory {
+
+    private static final Log log = 
LogFactory.getLog(MessageAccessorFactory.class);
+    
+    public MessageAccessor createMessageAccessor(MessageContext mc) {
+        if (log.isDebugEnabled()) {
+            log.debug("createMessageAccessor");
+        }
+        return new MessageAccessor(mc);
+    }
+
+}

Modified: 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/core/MessageContext.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/core/MessageContext.java?rev=995548&r1=995547&r2=995548&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/core/MessageContext.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/core/MessageContext.java
 Thu Sep  9 19:24:21 2010
@@ -23,11 +23,14 @@ import org.apache.axiom.om.util.Detachab
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.Constants;
 import org.apache.axis2.description.AxisService;
+import org.apache.axis2.jaxws.api.MessageAccessor;
+import org.apache.axis2.jaxws.api.MessageAccessorFactory;
 import org.apache.axis2.jaxws.description.EndpointDescription;
 import org.apache.axis2.jaxws.description.OperationDescription;
 import org.apache.axis2.jaxws.handler.MEPContext;
 import org.apache.axis2.jaxws.message.Message;
 import org.apache.axis2.jaxws.message.util.MessageUtils;
+import org.apache.axis2.jaxws.registry.FactoryRegistry;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -86,6 +89,14 @@ public class MessageContext {
     public MessageContext() {
         axisMsgCtx = new org.apache.axis2.context.MessageContext();
         isOutbound = true;
+        
+        // Set the MessageAccessor object on the MessageContext so that it can 
be accessed
+        MessageAccessorFactory factory = (MessageAccessorFactory)
+                FactoryRegistry.getFactory(MessageAccessorFactory.class);
+        if (factory != null) {
+            
this.setProperty(org.apache.axis2.jaxws.Constants.JAXWS_MESSAGE_ACCESSOR, 
+                    factory.createMessageAccessor(this));
+        }
     }
     
     /**
@@ -113,6 +124,14 @@ public class MessageContext {
         } else {
             axisMsgCtx = new org.apache.axis2.context.MessageContext();
         }
+        
+        // Set the MessageAccessor object on the MessageContext so that it can 
be accessed
+        MessageAccessorFactory factory = (MessageAccessorFactory)
+                FactoryRegistry.getFactory(MessageAccessorFactory.class);
+        if (factory != null) {
+            
this.setProperty(org.apache.axis2.jaxws.Constants.JAXWS_MESSAGE_ACCESSOR, 
+                    factory.createMessageAccessor(this));
+        }
     }
 
     public InvocationContext getInvocationContext() {

Modified: 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/registry/FactoryRegistry.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/registry/FactoryRegistry.java?rev=995548&r1=995547&r2=995548&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/registry/FactoryRegistry.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/registry/FactoryRegistry.java
 Thu Sep  9 19:24:21 2010
@@ -23,6 +23,8 @@ import org.apache.axis2.jaxws.addressing
 import org.apache.axis2.jaxws.addressing.factory.JAXWSEndpointReferenceFactory;
 import 
org.apache.axis2.jaxws.addressing.factory.impl.Axis2EndpointReferenceFactoryImpl;
 import 
org.apache.axis2.jaxws.addressing.factory.impl.JAXWSEndpointReferenceFactoryImpl;
+import org.apache.axis2.jaxws.api.MessageAccessorFactory;
+import org.apache.axis2.jaxws.api.MessageAccessorFactoryImpl;
 import org.apache.axis2.jaxws.core.controller.InvocationControllerFactory;
 import 
org.apache.axis2.jaxws.core.controller.impl.InvocationControllerFactoryImpl;
 import org.apache.axis2.jaxws.handler.factory.HandlerInvokerFactory;
@@ -135,6 +137,7 @@ public class FactoryRegistry {
         table.put(WebServiceContextInjector.class, wsciImpl);
         table.put(HandlerInvokerFactory.class, new 
HandlerInvokerFactoryImpl());
         table.put(AsyncHandlerProxyFactory.class, new 
AsyncHandlerProxyFactoryImpl());
+        table.put(MessageAccessorFactory.class, new 
MessageAccessorFactoryImpl());
     }
 
     /** FactoryRegistry is currently a static singleton */


Reply via email to