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 */