Can you post the initial exception that is thrown by ((OMNode)
envelope.getParent()).build() ?

Andreas

On Wed, Jan 7, 2009 at 16:18, Frode Ruud Laukus <lau...@gmail.com> wrote:
> I'm having a problem with an Axis2 webservice secured with Rampart.
> The service works if Rampart is disengaged, but when engaging Rampart,
> It no longer returns SOAPFaults to the caller. The caller gets an
> empty HTTP 500 response only.
>
> I'm not if this is a bug in Rampart, or something peculiar with my
> environment.. or simply me not understanding how Rampart or
> AXIOM/Axis2 works.
>
> The error message initially was:
>
> org.apache.axis2.AxisFault: Error in extracting message properties
>
> Stacktrace:
> org.apache.rampart.handler.RampartSender.invoke(Lorg/apache/axis2/context/MessageContext;)Lorg/apache/axis2/engine/Handler$InvocationResponse;(RampartSender.java:90)
> (ExecuteThread: '24' for queue:
> 'weblogic.kernel.Default',AxisServlet.java:402)
> org.apache.rampart.handler.RampartSender.invoke(Lorg/apache/axis2/context/MessageContext;)Lorg/apache/axis2/engine/Handler$InvocationResponse;(RampartSender.java:90)
> (ExecuteThread: '24' for queue:
> 'weblogic.kernel.Default',AxisServlet.java:402)
> org.apache.axis2.engine.Phase.invoke(Lorg/apache/axis2/context/MessageContext;)Lorg/apache/axis2/engine/Handler$InvocationResponse;(Phase.java:317)
> (ExecuteThread: '24' for queue:
> 'weblogic.kernel.Default',AxisServlet.java:402)
> org.apache.axis2.engine.Phase.invoke(Lorg/apache/axis2/context/MessageContext;)Lorg/apache/axis2/engine/Handler$InvocationResponse;(Phase.java:317)
> (ExecuteThread: '24' for queue:
> 'weblogic.kernel.Default',AxisServlet.java:402)
> org.apache.axis2.engine.AxisEngine.invoke(Lorg/apache/axis2/context/MessageContext;Z)Lorg/apache/axis2/engine/Handler$InvocationResponse;(AxisEngine.java:273)
> (ExecuteThread: '24' for queue:
> 'weblogic.kernel.Default',AxisServlet.java:402)
> org.apache.axis2.engine.AxisEngine.invoke(Lorg/apache/axis2/context/MessageContext;Z)Lorg/apache/axis2/engine/Handler$InvocationResponse;(AxisEngine.java:273)
> (ExecuteThread: '24' for queue:
> 'weblogic.kernel.Default',AxisServlet.java:402)
> org.apache.axis2.engine.AxisEngine.sendFault(Lorg/apache/axis2/context/MessageContext;)V(AxisEngine.java:546)
> (ExecuteThread: '24' for queue:
> 'weblogic.kernel.Default',AxisServlet.java:402)
> org.apache.axis2.engine.AxisEngine.sendFault(Lorg/apache/axis2/context/MessageContext;)V(AxisEngine.java:546)
> (ExecuteThread: '24' for queue:
> 'weblogic.kernel.Default',AxisServlet.java:402)
> org.apache.axis2.transport.http.AxisServlet.handleFault(Lorg/apache/axis2/context/MessageContext;Ljava/io/OutputStream;Lorg/apache/axis2/AxisFault;)V(AxisServlet.java:447)
> (ExecuteThread: '24' for queue:
> 'weblogic.kernel.Default',AxisServlet.java:402)
> org.apache.axis2.transport.http.AxisServlet.handleFault(Lorg/apache/axis2/context/MessageContext;Ljava/io/OutputStream;Lorg/apache/axis2/AxisFault;)V(AxisServlet.java:447)
> (ExecuteThread: '24' for queue:
> 'weblogic.kernel.Default',AxisServlet.java:402)
> org.apache.axis2.transport.http.AxisServlet.processAxisFault(Lorg/apache/axis2/context/MessageContext;Ljavax/servlet/http/HttpServletResponse;Ljava/io/OutputStream;Lorg/apache/axis2/AxisFault;)V(AxisServlet.java:392)
> (ExecuteThread: '24' for queue:
> 'weblogic.kernel.Default',AxisServlet.java:402)
> org.apache.axis2.transport.http.AxisServlet.processAxisFault(Lorg/apache/axis2/context/MessageContext;Ljavax/servlet/http/HttpServletResponse;Ljava/io/OutputStream;Lorg/apache/axis2/AxisFault;)V(AxisServlet.java:392)
> (ExecuteThread: '24' for queue:
> 'weblogic.kernel.Default',AxisServlet.java:402)
> org.apache.axis2.transport.http.AxisServlet.doPost(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V(AxisServlet.java:167)
> (ExecuteThread: '24' for queue:
> 'weblogic.kernel.Default',AxisServlet.java:402)
> org.apache.axis2.transport.http.AxisServlet.doPost(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V(AxisServlet.java:167)
> (ExecuteThread: '24' for queue:
> 'weblogic.kernel.Default',AxisServlet.java:402)
> javax.servlet.http.HttpServlet.service(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V(HttpServlet.java:760)
> (ExecuteThread: '24' for queue:
> 'weblogic.kernel.Default',AxisServlet.java:402)
> .
> .
> .
>
>
> I have been digging through and debugging the source code for a while,
> and I've managed drill down to an exception thrown in the Axis2Util
> class in the org.apache.rampart.util package, in rampart-core-1.4.jar.
> The AxisFault caught in the RampartSender.invoke method above wraps an
> exception, which wraps another exception.. and so on, until I drilled
> down to this class and this method.
>
> I do however fail to understand exactly why it fails, even though I
> also have managed to add a couple of lines of code that make the
> problem go away. I have a hunch it has something to do with the way
> AXIOM works, but I don't know.
>
>
> The code in question is the getDocumentFromSOAPEnvelope method
> (Rampart 1.4). I've added my own comments explaining my findings so
> far in the code below (///// comments):
>
>        /**
>         * Creates a DOM Document using the SOAP Envelope.
>         * @param env An org.apache.axiom.soap.SOAPEnvelope instance
>         * @return Returns the DOM Document of the given SOAP Envelope.
>         * @throws Exception
>         */
>        public static Document getDocumentFromSOAPEnvelope(SOAPEnvelope env,
> boolean useDoom)
>                        throws WSSecurityException {
>                try {
>            if(env instanceof Element) {
>                return ((Element)env).getOwnerDocument();
>            }
>
>            if (useDoom) {
>                env.build();
>
>                // Workaround to prevent a bug in AXIOM where
>                // there can be an incomplete OMElement as the first child body
>                OMElement firstElement = env.getBody().getFirstElement();
>                if (firstElement != null) {
>                    firstElement.build();
>                }
>
>                //Get processed headers
>                SOAPHeader soapHeader = env.getHeader();
>                ArrayList processedHeaderQNames = new ArrayList();
>
>                if(soapHeader != null) {
>                    Iterator headerBlocs = soapHeader.getChildElements();
>                    while (headerBlocs.hasNext()) {
>                        SOAPHeaderBlock element = (SOAPHeaderBlock)
> headerBlocs.next();
>                        if(element.isProcessed()) {
>                            processedHeaderQNames.add(element.getQName());
>                        }
>                    }
>
>                }
>
>                // Check the namespace and find SOAP version and factory
>                String nsURI = null;
>                SOAPFactory factory;
>
>
>                if (env.getNamespace().getNamespaceURI().equals(
>                        SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI)) {
>                    nsURI = SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI;
>                    factory = DOOMAbstractFactory.getSOAP11Factory();
>                } else {
>                    nsURI = SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI;
>                    factory = DOOMAbstractFactory.getSOAP12Factory();
>                }
>
>
>                ///// I add my own hack here or earlier to make the problem go 
> away.
> See below.
>
>
>                StAXSOAPModelBuilder stAXSOAPModelBuilder = new
> StAXSOAPModelBuilder(env.getXMLStreamReader(), factory, nsURI);
>                SOAPEnvelope envelope = stAXSOAPModelBuilder.getSOAPEnvelope();
>
>
>                /////Adding a toString on the newly built SOAPEnvelope
> object fails with: "Can not serialize OM Element Envelope"
>                /////System.out.println("envelope: " + envelope.toString());
>
>
>                /////This line throws the initial exception
>                ((OMNode) envelope.getParent()).build();
>
>
>
>                //Set the processed flag of the processed headers
>                SOAPHeader header = envelope.getHeader();
>                for (Iterator iter = processedHeaderQNames.iterator(); iter
>                        .hasNext();) {
>                    QName name = (QName) iter.next();
>                    Iterator omKids = header.getChildrenWithName(name);
>                    if(omKids.hasNext()) {
>                        ((SOAPHeaderBlock)omKids.next()).setProcessed();
>                    }
>                }
>
>                Element envElem = (Element) envelope;
>                return envElem.getOwnerDocument();
>            } else {
>                ByteArrayOutputStream baos = new ByteArrayOutputStream();
>                env.build();
>                env.serialize(baos);
>                ByteArrayInputStream bais = new ByteArrayInputStream(baos
>                        .toByteArray());
>                DocumentBuilderFactory factory = DocumentBuilderFactory
>                        .newInstance();
>                factory.setNamespaceAware(true);
>                return factory.newDocumentBuilder().parse(bais);
>            }
>                } catch (Exception e) {
>                        throw new WSSecurityException(
>                                        "Error in converting SOAP Envelope to 
> Document", e);
>                }
>        }
>
>
> Finally, this piece of code added before the StAXSOAPModelBuilder is
> in use makes the problem go away. Why?
>
>                        StringReader rd = new StringReader(env.toString());
>                        XMLStreamReader parser =
> XMLInputFactory.newInstance().createXMLStreamReader(rd);
>                        StAXSOAPModelBuilder builder = new 
> StAXSOAPModelBuilder(parser, null);
>                        SOAPEnvelope env2 = (SOAPEnvelope) 
> builder.getDocumentElement();
>                        env = env2;
>
>
> Any insights would be appreciated!
>
> Best Regards,
> Frode Laukus
>

Reply via email to