Newsletter sign-up
View all newsletters

Enterprise Java Newsletter
Stay up to date on the latest tutorials and Java community news posted on JavaWorld

JavaWorld Daily Brew

Saaj Through Servlet



I had written the following servlet that recives SOAPRequest and does some database manipulation ,then send attachments

package com.htc.wss;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletConfig;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.MimeHeader;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPPart;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.AttachmentPart;
import javax.xml.soap.SOAPBodyElement;
import javax.activation.DataHandler;
import java.util.Iterator;
import java.util.Enumeration;
import java.util.StringTokenizer;
import javax.servlet.ServletException;
import stockdb.StockDBBean;
import java.net.URL;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.logging.Logger;
import javax.xml.namespace.QName;

public class AttachmentsServlet extends HttpServlet
{
static final Logger logger =
Logger.getLogger("com.htc.wss");

static MessageFactory msgFactory = null;

private static StockDBBean dbBean;
static
{
try
{
msgFactory = MessageFactory.newInstance();
dbBean = new StockDBBean();
}
catch (Exception ex)
{
logger.severe("Exception: " + ex.toString());
}
}

public void init(ServletConfig servletConfig)
throws ServletException
{
super.init(servletConfig);
}

public void doPost(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException, IOException
{
try
{
resp.setContentType("application/xml");
MimeHeaders headers = getHeaders(req);

// Get the body of the HTTP request
InputStream is = req.getInputStream();

// Now internalize the contents of the HTTP request
// and create a SOAPMessage

SOAPMessage msg =
msgFactory.createMessage(headers, is);

SOAPMessage reply = null;
reply = onMessage(msg);

if (reply != null)
{
/*
* Need to call saveChanges because we’re
* going to use the MimeHeaders to set HTTP
* response information. These MimeHeaders
* are generated as part of the save.
*/
if (reply.saveRequired())
{
reply.saveChanges();
}
resp.setStatus(HttpServletResponse.SC_OK);
putHeaders(reply.getMimeHeaders(), resp);
// Write out the message on the response stream
logger.info("Reply message:");
OutputStream os = resp.getOutputStream();
reply.writeTo(os);
os.flush();
}
else
{
resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
}
}
catch (Exception ex)
{
throw new ServletException( "SAAJ POST failed: " + ex.getMessage());
}
}
static MimeHeaders getHeaders(HttpServletRequest req)
{
Enumeration headerNames = req.getHeaderNames();
MimeHeaders headers = new MimeHeaders();
while (headerNames.hasMoreElements())
{
String headerName = (String)headerNames.nextElement();
String headerValue = req.getHeader(headerName);
StringTokenizer values = new StringTokenizer(headerValue, ",");
while (values.hasMoreTokens())
{
headers.addHeader(headerName, values.nextToken().trim());
}
}
return headers;
}

static void putHeaders(MimeHeaders headers,
HttpServletResponse res)
{
Iterator it = headers.getAllHeaders();
while (it.hasNext())
{
MimeHeader header = (MimeHeader)it.next();
String[] values = headers.getHeader(header.getName());
if (values.length == 1)
{
res.setHeader(header.getName(), header.getValue());
}
else
{
StringBuffer concat = new StringBuffer();
int i = 0;
while (i < values.length)
{
if (i != 0)
{
concat.append(',');
}
concat.append(values[i++]);
}
res.setHeader(header.getName(), concat.toString());
}
}

}

public String getRequestValue(SOAPBody body,String elementName)
{
String nameVal = "";
try
{
Iterator bodyIter =
body.getChildElements();
SOAPBodyElement elem = null;
while(bodyIter.hasNext())
{
elem = (SOAPBodyElement)bodyIter.next();
Iterator children = elem.getChildElements();
while(children.hasNext())
{
SOAPElement sElem = (SOAPElement)children.next();
String str =
sElem.getElementName().getQualifiedName();
System.out.println(str);
if(str.equalsIgnoreCase(elementName))
{
nameVal = sElem.getValue();
}
}
}
}
catch(Exception e){}
System.out.println("**"+nameVal);
return nameVal;
}

public SOAPMessage onMessage(SOAPMessage msg)
{
SOAPMessage reply = null;
try
{
msg.writeTo(System.out);
SOAPEnvelope envelope =
msg.getSOAPPart().getEnvelope();
SOAPBody body = envelope.getBody();

String person = getRequestValue(body,"person");
String company = getRequestValue(body,"company");
String qtyStr = getRequestValue(body,"qty");
dbBean = new StockDBBean();
String res = dbBean.doPurchase(person,company,qtyStr);
dbBean.close();
System.out.println("***"+res);
if(res.equals("DONE"))
{
reply = msgFactory.createMessage();
envelope =
reply.getSOAPPart().getEnvelope();
body = envelope.getBody();
QName bodyName =
new QName("http://wss.htc.com",
"reply-message");
SOAPElement bdyElement = body.addBodyElement(bodyName);

QName rName = new QName("reply");

SOAPElement rpy = bdyElement.addChildElement(rName);

rpy.addTextNode("transaction done for "+person);

QName statName = new QName("status");

SOAPElement statElement = bdyElement.addChildElement(statName);

statElement.addTextNode("success");

// attachementPart
String main1 = "http://localhost:10080/sec";
String att1 = main1+"/attachments/htmls/rules.xml";
String att2 = main1+"/attachments/pics/grapes.gif";
URL url = new URL(att1);
DataHandler dHandler = new DataHandler(url);
AttachmentPart attachment1 =
reply.createAttachmentPart(dHandler);

attachment1.setContentId("rules");
reply.addAttachmentPart(attachment1);

url = new URL(att2);
DataHandler dHandler2 = new DataHandler(url);
AttachmentPart attachment2 =
reply.createAttachmentPart(dHandler2);

attachment2.setContentId("picture");

reply.addAttachmentPart(attachment2);
reply.saveChanges();
}
}
catch(Exception e)
{
System.out.println(e);
}
return reply;
}

}
Then i wrote a client

import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPHeader;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPPart;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.AttachmentPart;
import java.util.Iterator;
import java.net.URL;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import javax.xml.soap.Node;
import javax.activation.DataHandler;

public class AttachmentsSenderClient
{
SOAPConnection soapCon;

private String target =
"http://localhost:10080/sec/stock-order";

MessageFactory mFactory;

public AttachmentsSenderClient()
{
try
{
SOAPConnectionFactory sFactory =
SOAPConnectionFactory.newInstance();
soapCon = sFactory.createConnection();
mFactory = MessageFactory.newInstance();
}
catch(Exception e)
{
e.printStackTrace();
}
}

public void sendMessage(String person,
String company,
String qty)
{
DataHandler handler = null;
BufferedOutputStream out = null;
try
{
SOAPMessage request =
mFactory.createMessage();
SOAPEnvelope envelope =
request.getSOAPPart().getEnvelope();
SOAPHeader header = envelope.getHeader();
SOAPBody body = envelope.getBody();
header.detachNode();

javax.xml.namespace.QName bodyName =
new javax.xml.namespace.QName("placeOrders");
SOAPBodyElement bElem =
body.addBodyElement(bodyName);

SOAPElement sElem =
bElem.addChildElement(
envelope.createName("person"));
sElem.addTextNode(person);

sElem = bElem.addChildElement(
envelope.createName("company"));
sElem.addTextNode(company);

sElem = bElem.addChildElement(
envelope.createName("qty"));
sElem.addTextNode(qty);

URL targetUrl = new URL(target);
SOAPMessage reply = soapCon.call(request,targetUrl);

if(reply != null)
{
envelope =
reply.getSOAPPart().getEnvelope();
body = envelope.getBody();

System.out.println("\nRequest company is:"+ company);
System.out.println("Response is:"+ getResponseValue(body,"reply"));
System.out.println("Status is:"+ getResponseValue(body,"status"));
System.out.println("Attachements ");
Iterator iter = reply.getAttachments();

while(iter.hasNext())
{
AttachmentPart attach = (AttachmentPart)iter.next();
handler = attach.getDataHandler();
String str = attach.getContentId();
System.out.println(str);
if(str.equals("picture"))
{
out = new BufferedOutputStream(
new FileOutputStream("pic.gif"));
}
else if(str.equals("rules"))
{
out = new BufferedOutputStream(
new FileOutputStream("rules.xml"));
}
handler.writeTo(out);
out.close();
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}

public static void main(String[] args)throws Exception
{
AttachmentsSenderClient client = new AttachmentsSenderClient();
if(args.length<2)
{
System.out.println("to run >java "+
" AttachmentsSenderClient "+
" to be given");
}
client.sendMessage(args[0],args[1],args[2]);
}

public String getResponseValue(SOAPBody body,
String given)
{
String nameVal = "";
SOAPBodyElement elem = null;
try
{
Iterator iter = body.getChildElements();
while(iter.hasNext())
{
SOAPElement sElem = (SOAPElement)iter.next();
String name = sElem.getElementName().getQualifiedName();

if(name.equalsIgnoreCase(given))
{
nameVal = sElem.getValue();
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
return nameVal;
}

}
But when i ran client like

C:\WSPras>java AttachmentsSenderClient dtrprasad RELIANCE 35

SEVERE: SAAJ0537:Invalid Content-Type.could be an error message instead of SOAP message.Java.security.PrivilegedActionException........................
text/html invalid content-type