⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmreceiveservlet.java

📁 彩信发送源代码,实现mm7接口
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/**
 * <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 + -