/* * $Id: ReceivingServlet.java */ package soapfault.receiver; import java.io.*; import java.util.*; import javax.xml.messaging.*; import javax.xml.soap.*; import javax.servlet.*; import javax.servlet.http.*; public class ReceivingServlet extends JAXMServlet implements ReqRespListener{ public void init(ServletConfig servletConfig) throws ServletException{ super.init(servletConfig); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ try { MimeHeaders mimeHeaders = getHeaders(request); ServletInputStream sInputStream = request.getInputStream(); //Create the SOAPMessage from the reply //msgFactory is a protected field of JAXMServlet SOAPMessage soapMessage = msgFactory.createMessage(mimeHeaders,sInputStream); SOAPMessage soapMessageReply = null; soapMessageReply = this.onMessage(soapMessage); if(soapMessageReply != null){ if(soapMessageReply.saveRequired()) soapMessageReply.saveChanges(); //Check to see if presence of SOAPFault if(containsFault(soapMessageReply)){ System.out.println("It has a fault"); response.setStatus(500); }else response.setStatus(200); //Send the response back to the sender //by placing the mime headers into the response, and externalizing //the soapmessage onto the response object. putHeaders(soapMessageReply.getMimeHeaders(), response); ServletOutputStream sOutputStream = response.getOutputStream(); soapMessageReply.writeTo(sOutputStream); sOutputStream.flush(); }//End of if. }catch(Exception exception){ throw new ServletException ("JAXMServlet POST Failed" + exception.getMessage()); } } /** containsFault is a utiltiy method to see if msg contains a soapfault **/ public boolean containsFault(SOAPMessage msg){ try{ SOAPPart sp = msg.getSOAPPart(); SOAPEnvelope se = sp.getEnvelope(); SOAPBody sb = se.getBody(); return (sb.hasFault()); }catch(Exception e){ System.out.println("ERROR"+ e.getMessage()); return false; } } public SOAPMessage onMessage(SOAPMessage msg){ try{ System.out.println("OnMessage()"); //Create a reply mesage from the msgFactory of JAXMServlet SOAPMessage replymsg = msgFactory.createMessage(); SOAPPart sp = replymsg.getSOAPPart(); SOAPEnvelope se = sp.getEnvelope(); SOAPBody sb = se.getBody(); //Create the SoapFault element. SOAPFault sf = sb.addFault(); sf.setFaultCode("SOAP-ENV:Client"); sf.setFaultString("Invalid input"); Detail dt = sf.addDetail(); DetailEntry invalidElem = dt.addDetailEntry(se.createName("invalidInputDetails", "INVALID_INPUT", "http://myfaultcodes.com/faults")); SOAPElement messageElement = invalidElem.addChildElement(se.createName("Message")); messageElement.addTextNode("Invalid category number used"); //Extract the ComputerPart element from request message and add to reply SOAP message. SOAPPart reqsp = msg.getSOAPPart(); SOAPEnvelope reqse = reqsp.getEnvelope(); SOAPBody reqsb = reqse.getBody(); SOAPElement errorComputerPart; //Retrieve all a SOAPBody element with the name ComputerPart Iterator it = reqsb.getChildElements(reqse.createName("ComputerPart")); if(it.hasNext() & (errorComputerPart = (SOAPElement)it.next()) != null){ System.out.println("retrieved ComputerPart"); invalidElem.addChildElement(errorComputerPart); } return replymsg; }catch(Exception e){ System.out.println("ERROR:"+ e.getMessage()); return null; } } }