Search in sources :

Example 1 with Message

use of org.apache.axis.Message in project tomee by apache.

the class AxisWsContainer method handleFault.

private Message handleFault(final AxisFault fault, final HttpResponse res, final MessageContext context) {
    Message responseMessage;
    final Element runtimeException = fault.lookupFaultDetail(Constants.QNAME_FAULTDETAIL_RUNTIMEEXCEPTION);
    logger.warning(Messages.getMessage("axisFault00"), fault);
    if (runtimeException != null) {
        //strip runtime details
        fault.removeFaultDetail(Constants.QNAME_FAULTDETAIL_RUNTIMEEXCEPTION);
    }
    final int status = fault.getFaultCode().getLocalPart().startsWith("Server.Unauth") ? HttpServletResponse.SC_UNAUTHORIZED : HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
    if (status == HttpServletResponse.SC_UNAUTHORIZED) {
        // unauth access results in authentication request
        // TODO: less generic realm choice?
        res.setHeader("WWW-Authenticate", "Basic realm=\"AXIS\"");
    }
    res.setStatus(status);
    responseMessage = context.getResponseMessage();
    if (responseMessage == null) {
        responseMessage = new Message(fault);
        final SOAPPart soapPart = (SOAPPart) responseMessage.getSOAPPart();
        soapPart.getMessage().setMessageContext(context);
    }
    return responseMessage;
}
Also used : Message(org.apache.axis.Message) SOAPMessage(javax.xml.soap.SOAPMessage) Element(org.w3c.dom.Element) SOAPPart(org.apache.axis.SOAPPart)

Example 2 with Message

use of org.apache.axis.Message in project tomee by apache.

the class AxisWsContainer method handleException.

private Message handleException(final MessageContext context, final HttpResponse res, final Exception e) {
    Message responseMessage;
    //other exceptions are internal trouble
    responseMessage = context.getResponseMessage();
    res.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
    Message responseMsg = responseMessage;
    logger.warning(Messages.getMessage("exception00"), e);
    if (responseMsg == null) {
        final AxisFault fault = AxisFault.makeFault(e);
        //log the fault
        final Element runtimeException = fault.lookupFaultDetail(Constants.QNAME_FAULTDETAIL_RUNTIMEEXCEPTION);
        if (runtimeException != null) {
            logger.debug(Messages.getMessage("axisFault00"), fault);
            //strip runtime details
            fault.removeFaultDetail(Constants.QNAME_FAULTDETAIL_RUNTIMEEXCEPTION);
        }
        responseMsg = new Message(fault);
    }
    responseMessage = responseMsg;
    final SOAPPart soapPart = (SOAPPart) responseMessage.getSOAPPart();
    soapPart.getMessage().setMessageContext(context);
    return responseMessage;
}
Also used : AxisFault(org.apache.axis.AxisFault) Message(org.apache.axis.Message) SOAPMessage(javax.xml.soap.SOAPMessage) Element(org.w3c.dom.Element) SOAPPart(org.apache.axis.SOAPPart)

Example 3 with Message

use of org.apache.axis.Message in project tomee by apache.

the class AxisWsContainer method doService.

protected void doService(final HttpRequest req, final HttpResponse res) throws Exception {
    final org.apache.axis.MessageContext messageContext = new org.apache.axis.MessageContext(null);
    req.setAttribute(WsConstants.MESSAGE_CONTEXT, messageContext);
    messageContext.setClassLoader(classLoader);
    Message responseMessage;
    String contentType = req.getHeader(HTTPConstants.HEADER_CONTENT_TYPE);
    final String contentLocation = req.getHeader(HTTPConstants.HEADER_CONTENT_LOCATION);
    final InputStream inputStream = req.getInputStream();
    final Message requestMessage = new Message(inputStream, false, contentType, contentLocation);
    messageContext.setRequestMessage(requestMessage);
    messageContext.setProperty(HTTPConstants.MC_HTTP_SERVLETPATHINFO, req.getURI().getPath());
    messageContext.setProperty(org.apache.axis.MessageContext.TRANS_URL, req.getURI().toString());
    messageContext.setService(service);
    messageContext.setProperty(REQUEST, req);
    messageContext.setProperty(RESPONSE, res);
    messageContext.setProperty(AxisEngine.PROP_DISABLE_PRETTY_XML, Boolean.TRUE);
    final ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
    try {
        try {
            final String characterEncoding = (String) requestMessage.getProperty(SOAPMessage.CHARACTER_SET_ENCODING);
            if (characterEncoding != null) {
                messageContext.setProperty(SOAPMessage.CHARACTER_SET_ENCODING, characterEncoding);
            } else {
                messageContext.setProperty(SOAPMessage.CHARACTER_SET_ENCODING, "UTF-8");
            }
            final String soapAction = req.getHeader(HTTPConstants.HEADER_SOAP_ACTION);
            if (soapAction != null) {
                messageContext.setUseSOAPAction(true);
                messageContext.setSOAPActionURI(soapAction);
            }
            final SOAPEnvelope env = requestMessage.getSOAPEnvelope();
            if (env != null && env.getSOAPConstants() != null) {
                messageContext.setSOAPConstants(env.getSOAPConstants());
            }
            final SOAPService service = messageContext.getService();
            Thread.currentThread().setContextClassLoader(classLoader);
            service.invoke(messageContext);
            responseMessage = messageContext.getResponseMessage();
        } catch (final AxisFault fault) {
            if (req.getMethod().equals(HttpRequest.Method.GET.name()) && req.getParameters().isEmpty()) {
                String serviceName = req.getURI().getRawPath();
                serviceName = serviceName.substring(serviceName.lastIndexOf("/") + 1);
                printServiceInfo(res, serviceName);
                return;
            } else {
                responseMessage = handleFault(fault, res, messageContext);
            }
        } catch (final Exception e) {
            responseMessage = handleException(messageContext, res, e);
        }
        //TODO investigate and fix operation == null!
        if (messageContext.getOperation() != null) {
            if (messageContext.getOperation().getMep() == OperationType.ONE_WAY) {
                // No content, so just indicate accepted
                res.setStatus(HttpServletResponse.SC_ACCEPTED);
                return;
            } else if (responseMessage == null) {
                responseMessage = handleException(messageContext, null, new ServerRuntimeException("No response for non-one-way operation"));
            }
        } else if (responseMessage == null) {
            res.setStatus(HttpServletResponse.SC_ACCEPTED);
            return;
        }
        try {
            final SOAPConstants soapConstants = messageContext.getSOAPConstants();
            final String contentType1 = responseMessage.getContentType(soapConstants);
            res.setContentType(contentType1);
            // Transfer MIME headers to HTTP headers for response message.
            final MimeHeaders responseMimeHeaders = responseMessage.getMimeHeaders();
            for (final Iterator i = responseMimeHeaders.getAllHeaders(); i.hasNext(); ) {
                final MimeHeader responseMimeHeader = (MimeHeader) i.next();
                res.setHeader(responseMimeHeader.getName(), responseMimeHeader.getValue());
            }
            //TODO discuss this with dims.
            //                // synchronize the character encoding of request and response
            //                String responseEncoding = (String) messageContext.getProperty(
            //                        SOAPMessage.CHARACTER_SET_ENCODING);
            //                if (responseEncoding != null) {
            //                    try {
            //                        responseMessage.setProperty(SOAPMessage.CHARACTER_SET_ENCODING,
            //                                               responseEncoding);
            //                    } catch (SOAPException e) {
            //                        log.info(Messages.getMessage("exception00"), e);
            //                    }
            //                }
            //determine content type from message response
            contentType = responseMessage.getContentType(messageContext.getSOAPConstants());
            responseMessage.writeTo(res.getOutputStream());
        } catch (final Exception e) {
            logger.warning(Messages.getMessage("exception00"), e);
        }
    } finally {
        Thread.currentThread().setContextClassLoader(oldClassLoader);
    }
}
Also used : SOAPService(org.apache.axis.handlers.soap.SOAPService) AxisFault(org.apache.axis.AxisFault) Message(org.apache.axis.Message) SOAPMessage(javax.xml.soap.SOAPMessage) InputStream(java.io.InputStream) SOAPEnvelope(org.apache.axis.message.SOAPEnvelope) ServerRuntimeException(org.apache.openejb.server.ServerRuntimeException) IOException(java.io.IOException) MimeHeaders(javax.xml.soap.MimeHeaders) MimeHeader(javax.xml.soap.MimeHeader) Iterator(java.util.Iterator) MessageContext(org.apache.axis.MessageContext) ServerRuntimeException(org.apache.openejb.server.ServerRuntimeException) SOAPConstants(org.apache.axis.soap.SOAPConstants) MessageContext(org.apache.axis.MessageContext)

Aggregations

SOAPMessage (javax.xml.soap.SOAPMessage)3 Message (org.apache.axis.Message)3 AxisFault (org.apache.axis.AxisFault)2 SOAPPart (org.apache.axis.SOAPPart)2 Element (org.w3c.dom.Element)2 IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 Iterator (java.util.Iterator)1 MimeHeader (javax.xml.soap.MimeHeader)1 MimeHeaders (javax.xml.soap.MimeHeaders)1 MessageContext (org.apache.axis.MessageContext)1 SOAPService (org.apache.axis.handlers.soap.SOAPService)1 SOAPEnvelope (org.apache.axis.message.SOAPEnvelope)1 SOAPConstants (org.apache.axis.soap.SOAPConstants)1 ServerRuntimeException (org.apache.openejb.server.ServerRuntimeException)1