📄 mmreceiveservlet.java
字号:
/**
* <pre>
* 这里说明修改记录,包括修改人,修改时间和修改目的和内容
* ---修改时间---修改人---修改目的和内容----------------------
* 2006/2/26 刘华锋 修改后缀名为大写时,和contenttype的配套问题,行数为214行
* </pre>
*/
package com.sxit.mms.receive;
import java.io.File;
import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.log4j.Logger;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.cmcc.mm7.vasp.common.MMConstants;
import com.cmcc.mm7.vasp.common.MMContent;
import com.cmcc.mm7.vasp.conf.MM7Config;
import com.cmcc.mm7.vasp.conf.MM7ConfigManager;
import com.cmcc.mm7.vasp.message.MM7DeliverReq;
import com.cmcc.mm7.vasp.message.MM7DeliverRes;
import com.cmcc.mm7.vasp.message.MM7DeliveryReportReq;
import com.cmcc.mm7.vasp.message.MM7DeliveryReportRes;
import com.cmcc.mm7.vasp.message.MM7ReadReplyReq;
import com.cmcc.mm7.vasp.message.MM7ReadReplyRes;
import com.cmcc.mm7.vasp.message.MM7VASPRes;
import com.cmcc.mm7.vasp.service.MM7ReceiveServlet;
/**
*
* 接收mo消息,状态报告,读后回复报告的处理消息
*
* @author HuaFeng
* @version 1.0 (2006-1-20 11:52:39)
*
*/
public class MMReceiveServlet extends MM7ReceiveServlet {
private final static Logger log = Logger.getLogger(MMReceiveServlet.class);
/**
* 资源文件类型的subtype和后缀名之间的对应关系 键为subtype,值为后缀名
*/
private final static HashMap fileMapEndfix;
static {
fileMapEndfix = new HashMap();
fileMapEndfix.put("amr", "amr");
fileMapEndfix.put("midi", "midi;mid");
fileMapEndfix.put("mid", "mid;midi");
fileMapEndfix.put("gif", "gif");
fileMapEndfix.put("jpg", "jpg;jpeg");
fileMapEndfix.put("jpeg", "jpeg;jpg");
fileMapEndfix.put("png", "png");
fileMapEndfix.put("plain", "txt");
fileMapEndfix.put("i-melody", "imy");
fileMapEndfix.put("e-melody", "ime");
// E_MELODY可能为下面的emy后缀的
// fileMapEndfix.put("emy",MMConstants.ContentType.E_MELODY);
// 要看看mmf格式的是啥子样子的了
fileMapEndfix.put("vnd.smaf", "mmf");
fileMapEndfix.put("html", "html");
fileMapEndfix.put("htm", "htm");
fileMapEndfix.put("shtml", "shtml");
fileMapEndfix.put("vnd.wap.wbmp", "wbmp");
fileMapEndfix.put("vnd.wap.wml", "wml");
fileMapEndfix.put("tiff", "tif");
//
fileMapEndfix.put("x-wav", "wav");
fileMapEndfix.put("smil", "smil");
}
private String mmSavePath = "";// mm的统一存储目的地,具体存储为mmdir/year/month/day/msgid
DocumentBuilder db = null;
private static final ConnPoolHandler pool;
static {
/**
* 仅仅初始化一次连接池的对象
*/
pool = ConnPoolHandler.getInstance();
}
/**
* 应先初始化父类的Config对象,主要是获得日志的存取地 配置文件放置在和MMReceiveServlet同样的目录处
*/
public MMReceiveServlet() {
try {
File file = new File(this.getClass().getResource("MMReceiveServlet.class").getFile());
String path = file.getParent();
Config = new MM7Config();
MM7ConfigManager mm7c = new MM7ConfigManager();
mm7c.load(path + "/mm7Config.xml");
// 得到参数里面配置的上传mo存储地,必须以"/"结尾
mmSavePath = mm7c.hashmap.get("MMSavePath").toString();
if (!mmSavePath.endsWith("/"))
mmSavePath += "/";
log.info("彩信接收参数初始化配置成功!!!");
log.info("上行彩信存储目的地为:" + mmSavePath);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
db = dbf.newDocumentBuilder();
// log.info("pool.getConnection()======" + pool.getConnection());
}
catch (Exception e) {
log.error("初始化错误:" + e);
}
}
/**
* mo上行消息的处理
*/
public MM7VASPRes doDeliver(MM7DeliverReq request) {
List srclist = null;// 存储资源文件,smil文件中的src属性值
List contentList = new ArrayList();// 存储除了那个smil格式的外的subcontent
String fileName = "";// 彩信mo后,保存下来的文件名
FileOutputStream fos = null;// 保存文件的输出对象
String contentid = "";
MMContent subcontent = null;// 资源文件
String subtype = "";// 资源文件的子类型
try {
MMContent content = request.getContent();
if (log.isDebugEnabled()) {
log.debug("content.getCharset()=" + content.getCharset());
log.debug("request.getSubject()=" + request.getSubject());
log.debug("request.getTo()=" + request.getTo());
log.debug("request.getMMSRelayServerID()=" + request.getMMSRelayServerID());
log.debug("request.getPriority()=" + request.getPriority());
log.debug("request.getReplyChargingID()=" + request.getReplyChargingID());
log.debug("request.getSender()=" + request.getSender());
log.debug("request.getTransactionID()=" + request.getTransactionID());
log.debug("content.getContentType())=" + content.getContentType().getPrimaryType() + ","
+ content.getContentType().getSubType());
}
String transactionid = request.getTransactionID();
// 此处的mmdir为上传后的彩信的存储地,按年月日的顺序排列
String mmdir = mmSavePath + getMMDir() + transactionid;
File file = new File(mmdir);
// 如果目录不存在的话,则建立起相应的目录
if (!file.exists())
file.mkdirs();
List list = content.getSubContents();
if (log.isDebugEnabled()) {
log.debug("MO彩信文件个数:" + list.size());
}
for (int i = 0; i < list.size(); i++) {
subcontent = (MMContent) list.get(i);
subtype = subcontent.getContentType().getSubType();
if (log.isDebugEnabled()) {
log.debug("父类型:" + subcontent.getContentType().getPrimaryType() + ",子类型:" + subtype);
log.debug("contentLocation=" + subcontent.getContentLocation());
log.debug("contentID=" + subcontent.getContentID());
}
if (subtype.equals("smil")) { // 轮询队列,如果是smil文件的话,则先保存这个东西,然后再解析这个文件,保存其他的文件
byte[] binary = subcontent.getContent();
String contentID = subcontent.getContentID();
fileName = content2name(contentID, request);
// if (log.isDebugEnabled())
log.info("解析保存后的SMIL文件名:" + fileName);
fos = new FileOutputStream(mmdir + "/" + fileName);
// 解析这个文件,在当前目录下.
fos.write(binary);
fos.flush();
// 解析得到smil文件里的各元素属性
srclist = parse(mmdir + "/" + fileName);
}
else
contentList.add(subcontent);
}
// if (log.isDebugEnabled())
log.info("此彩信资源文件列表:" + srclist);
// 来比较contentList以及srcList,并存储这些个东西的
for (int i = 0; i < contentList.size(); i++) {
subcontent = (MMContent) contentList.get(i);
contentid = subcontent.getContentID();
subtype = subcontent.getContentType().getSubType();
if (log.isDebugEnabled())
log.debug("现在的文件列表:" + srclist);
// String name = content2name(subcontent.getContentID());
if (srclist == null || srclist.size() == 0) {// 上传的彩信是mixed形式的,没有smil文件
if (contentid == null)
fileName = subcontent.getSize() + String.valueOf(i) + fileMapEndfix.get(subtype);
else if (!contentid.endsWith(fileMapEndfix.get(subtype).toString()))
fileName = contentid + fileMapEndfix.get(subtype);
else
fileName=contentid;
}
else {// 如果是smil形式的,则从smil里面获取文件名保存,和subtype对应下来
String endfix = fileMapEndfix.get(subtype).toString(); //subtype为jpeg的话,可以对应jpeg和jpg的后缀名,jpeg;jpg
// 轮循srclist,把是endfix结尾的文件名弄下来
int size = srclist.size();
for (int ii = 0; ii < size; ii++) {
String name = srclist.get(ii).toString();
//后缀名为大写时,强制小写形式.2006/2/26号修改
String nameendfix = name.substring(name.lastIndexOf(".")+1).toLowerCase();
// String nameendfix = name.substring(name.lastIndexOf(".")+1);//取得的后缀名可能是jpg,jpeg等等
if (endfix.indexOf(nameendfix)!=-1) {
fileName = name;
srclist.remove(name);// 同时把这个从这里面清除掉,防止有2个,比如txt形式的文件,最后保存的结构是一样的
break;
}
}
}
if (log.isDebugEnabled())
log.debug("资源文件保存文件名:" + fileName);
fos = new FileOutputStream(mmdir + "/" + fileName);
// 解析这个文件,在当前目录下.
fos.write(subcontent.getContent());
fos.flush();
}
insertMOMM(request, mmdir);
log.info("收到手机" + request.getSender() + "提交的消息,标题为:" + request.getSubject());
// SP需要进行一些处理,例如构建MM7DeliverRes消息,设置ServiceCode或StatusCode
// 如果这个mm需要进行转发,比如发个某个用户的话,在这里进行处理了
MM7DeliverRes mm7DeliverRes = new MM7DeliverRes();
mm7DeliverRes.setStatusCode(MMConstants.RequestStatus.SUCCESS);
mm7DeliverRes.setStatusText("MO接收处理成功");
return (MM7VASPRes) mm7DeliverRes;
}
catch (Exception e) {
log.error(e);
return null;
}
}
public MM7VASPRes doDeliveryReport(MM7DeliveryReportReq request) {
log.info("状态报告,接收手机:" + request.getRecipient()+",状态:"+request.getMMStatus());
updateReportStatus(request);
MM7DeliveryReportRes res = new MM7DeliveryReportRes();
res.setStatusCode(MMConstants.RequestStatus.SUCCESS);
res.setStatusText("返回成功");
return res;
}
public MM7VASPRes doReadReply(MM7ReadReplyReq request) {
log.info("读后回复消息,接收手机:" + request.getRecipient());
updateReadReplyStatus(request);
MM7ReadReplyRes res = new MM7ReadReplyRes();
res.setStatusCode(MMConstants.RequestStatus.SUCCESS);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -