package it.bigatti.soap; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; import javax.xml.messaging.*; import javax.xml.soap.*; public class MathServlet extends JAXMServlet implements ReqRespListener { public void init(ServletConfig sc) throws ServletException { super.init(sc); } public SOAPMessage onMessage(SOAPMessage message) { SOAPMessage response = null; String values = null; try { message.writeTo( System.out ); SOAPPart sp = message.getSOAPPart(); SOAPEnvelope env = sp.getEnvelope(); SOAPHeader hdr = env.getHeader(); SOAPBody bdy = env.getBody(); Iterator ii = bdy.getChildElements(); while( ii.hasNext() ) { SOAPElement e = (SOAPElement)ii.next(); Iterator kk = e.getChildElements(); while( kk.hasNext() ) { SOAPElement ee = (SOAPElement)kk.next(); String name = ee.getElementName().getLocalName(); if( name != null && name.equals("values") ) { values = ee.getValue(); System.out.println("values = " + values); break; } } } if( values != null ) { response = createResponse( new MathSupport( values ) ); response.writeTo( System.out ); } } catch(Exception e) { e.printStackTrace(); } return response; } protected SOAPMessage createResponse( MathSupport ms ) throws SOAPException { MessageFactory mf = MessageFactory.newInstance(); SOAPMessage msg = mf.createMessage(); SOAPPart sp = msg.getSOAPPart(); SOAPEnvelope env = sp.getEnvelope(); SOAPHeader hdr = env.getHeader(); SOAPBody bdy = env.getBody(); String xsi = "http://www.w3.org/2001/XMLSchema-instance"; env.addNamespaceDeclaration("xsi", xsi); env.addNamespaceDeclaration("xsd", "http://www.w3.org/2001/XMLSchema"); env.addNamespaceDeclaration("soapenc", "http://schemas.xmlsoap.org/soap/encoding/"); env.setEncodingStyle("http://schemas.xmlsoap.org/soap/encoding/"); Name xsiTypeString = env.createName("type", "xsi", xsi); SOAPBodyElement gltp = bdy.addBodyElement( env.createName("CalculateResponse", "ns1", "http://namespaces.bigatti.it") ); SOAPElement e1 = gltp.addChildElement( env.createName("Summary") ); SOAPElement e2 = e1.addChildElement( env.createName("Mean") ).addTextNode("" + ms.getMean() ); e2.addAttribute( xsiTypeString, "xsd:float" ); e2 = e1.addChildElement( env.createName("StandardDeviation") ).addTextNode("" + ms.getStandardDeviation() ); e2.addAttribute( xsiTypeString, "xsd:float" ); e2 = e1.addChildElement( env.createName("CoefficientOfVariation") ).addTextNode("" + ms.getCoefficientOfVariation() ); e2.addAttribute( xsiTypeString, "xsd:float" ); e2 = e1.addChildElement( env.createName("Sum") ).addTextNode("" + ms.getSum() ); e2.addAttribute( xsiTypeString, "xsd:double" ); e2 = e1.addChildElement( env.createName("Min") ).addTextNode("" + ms.getMin() ); e2.addAttribute( xsiTypeString, "xsd:float" ); e2 = e1.addChildElement( env.createName("Max") ).addTextNode("" + ms.getMax() ); e2.addAttribute( xsiTypeString, "xsd:float" ); e1 = gltp.addChildElement( env.createName("Values") ); int counter = 0; Iterator valuesList = ms.getRecognizedValues(); while( valuesList.hasNext() ) { String value = (String)valuesList.next(); e2 = e1.addChildElement( env.createName("Value") ).addTextNode("" + value ); e2.addAttribute( env.createName("id"), "" + counter ); e2.addAttribute( xsiTypeString, "xsd:float" ); counter++; } return msg; } class MathSupport { List values = new LinkedList(); double sum = 0; double squaredSum = 0; int counter = 0; float min; float max; public MathSupport( String valueString ) { StringTokenizer valueTokenizer = new StringTokenizer( valueString ); while( valueTokenizer.hasMoreTokens() ) { try { String stringValue = valueTokenizer.nextToken(); float value = Float.parseFloat( stringValue ); values.add( stringValue ); sum += value; squaredSum += value * value; min = ( value < min || counter == 0 ) ? value : min; max = ( value > max) ? value : max; counter++; } catch( NumberFormatException ex ) { //ignore errors } } } public float getCoefficientOfVariation() { return getStandardDeviation() / getMean(); } public float getStandardDeviation() { float mean = getMean(); return (float)( Math.sqrt( squaredSum - ( mean * mean ) / (counter-1) ) ); } public float getMean() { return (float)(sum / counter); } public double getSum() { return sum; } public float getMin() { return min; } public float getMax() { return max; } public Iterator getRecognizedValues() { return values.iterator(); } } }