private void processFault(MessageExchange exchange, HttpServletRequest request, HttpServletResponse response) throws Exception { SoapFault fault = new SoapFault( (QName) exchange.getFault().getProperty(JBIMarshaler.SOAP_FAULT_CODE), (QName) exchange.getFault().getProperty(JBIMarshaler.SOAP_FAULT_SUBCODE), (String) exchange.getFault().getProperty(JBIMarshaler.SOAP_FAULT_REASON), (URI) exchange.getFault().getProperty(JBIMarshaler.SOAP_FAULT_NODE), (URI) exchange.getFault().getProperty(JBIMarshaler.SOAP_FAULT_ROLE), exchange.getFault().getContent()); sendFault(fault, request, response); }
public void sendFault(MessageExchange exchange, Fault fault, HttpServletRequest request, HttpServletResponse response) throws Exception { addResponseHeaders(exchange, request, response); // the content type is specific to this marshaler, depending of the used SOAP version if (soapVersion.equals("1.1")) { response.setContentType("text/xml"); } else { response.setContentType("application/soap+xml"); } response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); Message in = (Message) request.getAttribute(Message.class.getName()); Message msg = binding.createMessage(in); OutputStream encodingStream = getResponseEncodingStream(request.getHeader(HttpHeaders.CONTENT_ENCODING), response.getOutputStream()); msg.setContent(OutputStream.class, encodingStream); msg.setContent(MessageExchange.class, exchange); msg.setContent(NormalizedMessage.class, fault); msg.put(SoapVersion.class, in.get(SoapVersion.class)); msg.put(JbiConstants.USE_JBI_WRAPPER, useJbiWrapper); InterceptorChain phase = getChain(Phase.ServerOutFault); QName code = (QName) fault.getProperty("org.apache.servicemix.soap.fault.code"); String reason = (String) fault.getProperty("org.apache.servicemix.soap.fault.reason"); SoapFault soapFault = new SoapFault(code, reason, null, null, fault.getContent()); msg.setContent(Exception.class, soapFault); phase.doIntercept(msg); encodingStream.close(); }
public Message createFault(MessageExchange exchange, Fault fault, Session session, JmsContext context) throws Exception { org.apache.servicemix.soap.api.Message in = ((Context) context).msg; org.apache.servicemix.soap.api.Message msg = binding.createMessage(in); ByteArrayOutputStream baos = new ByteArrayOutputStream(); msg.setContent(OutputStream.class, baos); msg.setContent(MessageExchange.class, exchange); msg.setContent(NormalizedMessage.class, fault); msg.put(SoapVersion.class, in.get(SoapVersion.class)); msg.put(JbiConstants.USE_JBI_WRAPPER, useJbiWrapper); InterceptorChain phase = getChain(Phase.ServerOutFault); QName code = (QName) fault.getProperty("org.apache.servicemix.soap.fault.code"); String reason = (String) fault.getProperty("org.apache.servicemix.soap.fault.reason"); SoapFault soapFault = new SoapFault(code, reason, null, null, fault.getContent()); msg.setContent(Exception.class, soapFault); phase.doIntercept(msg); return session.createTextMessage(baos.toString()); }
protected Message fromNMSResponse(MessageExchange exchange, Context ctx, Session session) throws Exception { Message response = null; if (exchange.getStatus() == ExchangeStatus.ERROR) { // marshal error Exception e = exchange.getError(); if (e == null) { e = new Exception("Unkown error"); } response = endpoint.getMarshaler().toJMS(e, session); } else if (exchange.getStatus() == ExchangeStatus.ACTIVE) { // check for fault Fault jbiFault = exchange.getFault(); if (jbiFault != null) { // convert fault to SOAP message SoapFault fault = new SoapFault(SoapFault.RECEIVER, null, null, null, jbiFault.getContent()); SoapMessage soapFault = soapHelper.onFault(ctx, fault); Map headers = (Map) jbiFault.getProperty(JbiConstants.PROTOCOL_HEADERS); response = endpoint.getMarshaler().toJMS(soapFault, headers, session); } else { NormalizedMessage outMsg = exchange.getMessage("out"); if (outMsg != null) { SoapMessage out = soapHelper.onReply(ctx, outMsg); Map headers = (Map) outMsg.getProperty(JbiConstants.PROTOCOL_HEADERS); response = endpoint.getMarshaler().toJMS(out, headers, session); } } } return response; }