package org.gsm.oneapi.server.mms;
import java.io.IOException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.log4j.Logger;
import org.codehaus.jackson.map.ObjectMapper;
import org.gsm.oneapi.responsebean.ResourceReference;
import org.gsm.oneapi.server.OneAPIServlet;
import org.gsm.oneapi.server.ValidationRule;
/**
* Servlet implementing the OneAPI function for sending an MMS message
*/
public class SendMMSServlet extends OneAPIServlet {
private static final long serialVersionUID = -626608869216499030L;
static Logger logger=Logger.getLogger(SendMMSServlet.class);
public void init() throws ServletException {
logger.debug("SendMMSServlet initialised");
}
private final String[] validationRules={"1", "messaging", "outbound", "*", "requests"};
@SuppressWarnings("unchecked")
public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException{
/*
* The initial processing of the content is performed using the Apache Commons FileUpload package
*/
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(10*1024*1024); // Set factory constraints - 10 meg individual attachment
ServletFileUpload upload = new ServletFileUpload(factory); // Create a new file upload handler
upload.setSizeMax(50*1024*1024); // Set overall request size constraint
/*
* The form parameter block and attachments are saved when encountered
*/
ArrayList<byte[]> attachments=new ArrayList<byte[]>();
ArrayList<String> contentTypes=new ArrayList<String>();
ArrayList<String> fileNames=new ArrayList<String>();
String parameterBlock=null;
// Use Apache Commons FileUpload to parse the HTTP request
try {
List<FileItem> items = (List<FileItem>) upload.parseRequest(request);
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) {
FileItem item = iter.next();
if (item.isFormField()) {
String name = item.getFieldName();
String value = item.getString();
String type = item.getContentType();
logger.debug("PARAMETER...Field Name="+name+" type="+type);
if (name.equals("root-fields") && type.equals("application/x-www-form-urlencoded")) {
parameterBlock=value;
} else {
attachments.add(item.get());
contentTypes.add(type);
fileNames.add(name);
}
} else {
String fieldName = item.getFieldName();
String fileName = item.getName();
String fileType = item.getContentType();
logger.debug("FILE...Field Name="+fieldName+" fileName="+fileName+" fileType="+fileType);
attachments.add(item.get());
contentTypes.add(fileType);
fileNames.add(fileName);
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
logger.debug("Parameter block contains:\n"+parameterBlock);
dumpRequestDetails(request, logger);
String[] requestParts=getRequestParts(request);
if (validateRequest(request, response, requestParts, validationRules)) {
String contentType=request.getContentType();
logger.debug("Request content type="+contentType);
ArrayList<String> addresses=new ArrayList<String> ();
String senderAddress=null;
String message=null;
String clientCorrelator=null;
String notifyURL=null;
String callbackData=null;
String senderName=null;
if (parameterBlock!=null) {
String[] split=parameterBlock.split("\\&");
logger.debug("ParameterBlock split into "+split.length+" elements");
for (int i=0; i<split.length; i++) {
String line=split[i].trim();
logger.debug("Line ["+i+"] = "+line);
if (line.indexOf("=")!=-1) {
String[] kvp=line.split("\\=",2);
if (kvp!=null && kvp.length==2 && kvp[0]!=null && kvp[1]!=null) {
// Have key=value
String key=URLDecoder.decode(kvp[0].trim(), "UTF-8");
String value=URLDecoder.decode(kvp[1].trim(), "UTF-8");
logger.debug("Key = ["+key+"] Value = ["+value+"]");
if (key!=null) {
if (key.equals("senderAddress")) {
senderAddress=value;
} else if (key.equals("message")) {
message=value;
} else if (key.equals("clientCorrelator")) {
clientCorrelator=value;
} else if (key.equals("notifyURL")) {
notifyURL=value;
} else if (key.equals("callbackData")) {
callbackData=value;
} else if (key.equals("senderName")) {
senderName=value;
} else if (key.equals("address")) {
addresses.add(value);
}
}
}
}
}
}
logger.debug("SendMMS - url appears correctly formatted");
/*
* Decode the service parameters - in this case it is an HTTP POST request
*/
logger.debug("senderAddress = "+senderAddress);
logger.debug("message = "+message);
logger.debug("clientCorrelator = "+clientCorrelator);
logger.debug("notifyURL = "+notifyURL);
logger.debug("senderName = "+senderName);
logger.debug("callbackData = "+callbackData);
if (addresses!=null) for (String add:addresses) logger.debug("address = "+add);
if (attachments.size()>0) {
for (int i=0; i<attachments.size(); i++) {
logger.debug("Attachment ["+i+"] name="+fileNames.get(i)+" has size="+(attachments.get(i)!=null?attachments.get(i).length:0)+" type="+contentTypes.get(i));
}
}
ValidationRule[] rules={
new ValidationRule(ValidationRule.VALIDATION_TYPE_MANDATORY_TEL, "senderAddress", senderAddress),
new ValidationRule(ValidationRule.VALIDATION_TYPE_MANDATORY_TEL, "address", addresses),
new ValidationRule(ValidationRule.VALIDATION_TYPE_MANDATORY, "message", message),
new ValidationRule(ValidationRule.VALIDATION_TYPE_MANDATORY, "senderName", senderName),
new ValidationRule(ValidationRule.VALIDATION_TYPE_OPTIONAL, "clientCorrelator", clientCorrelator),
new ValidationRule(ValidationRule.VALIDATION_TYPE_OPTIONAL_URL, "notifyURL", notifyURL),
new ValidationRule(ValidationRule.VALIDATION_TYPE_OPTIONAL, "callbackData", callbackData),
};
if (checkRequestParameters(response, rules)) {
String resourceURL=getRequestHostnameAndContext(request)+request.getServletPath()+"/1/messaging/outbound/"+urlEncode(senderAddress)+"/requests/"+urlEncode(clientCorrelator);
ResourceReference resourceReference=new ResourceReference();
resourceReference.setResourceURL(resourceURL);
ObjectMapper mapper=new ObjectMapper();
String jsonResponse="{\"resourceReference\":"+mapper.writeValueAsString(resourceReference)+"}";
logger.debug("Sending response. ResourceURL="+resourceURL);
sendJSONResponse(response, jsonResponse, CREATED, resourceURL);
}
}
}
}