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