/** * */ package org.hamster.weixinmp.service; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.hamster.weixinmp.constant.WxMsgRespType; import org.hamster.weixinmp.constant.WxMsgRespTypeEnum; import org.hamster.weixinmp.constant.WxMsgTypeEnum; import org.hamster.weixinmp.controller.util.WxXmlUtil; import org.hamster.weixinmp.dao.entity.base.WxBaseMsgEntity; import org.hamster.weixinmp.dao.entity.base.WxBaseRespEntity; import org.hamster.weixinmp.dao.entity.resp.WxRespImageEntity; import org.hamster.weixinmp.dao.entity.resp.WxRespMusicEntity; import org.hamster.weixinmp.dao.entity.resp.WxRespPicDescEntity; import org.hamster.weixinmp.dao.entity.resp.WxRespTextEntity; import org.hamster.weixinmp.dao.entity.resp.WxRespVideoEntity; import org.hamster.weixinmp.dao.entity.resp.WxRespVoiceEntity; import org.hamster.weixinmp.exception.WxException; import org.hamster.weixinmp.service.handler.WxMessageHandlerIfc; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @author grossopaforever@gmail.com * @version Dec 30, 2013 * */ @Service public class WxMessageService { @Autowired(required=false) List<WxMessageHandlerIfc> handlers; public WxBaseMsgEntity parseXML(String xml) throws DocumentException, WxException { Element ele = DocumentHelper.parseText(xml).getRootElement(); String msgType = null; if ((msgType = ele.elementText("MsgType")) == null) { throw new WxException("cannot find MsgType Node!\n" + xml); } WxMsgTypeEnum msgTypeEnum = WxMsgTypeEnum.inst(msgType); switch (msgTypeEnum) { case EVENT: return WxXmlUtil.getMsgEvent(ele); case IMAGE: return WxXmlUtil.getMsgImage(ele); case LINK: return WxXmlUtil.getMsgLink(ele); case LOCATION: return WxXmlUtil.getMsgLoc(ele); case TEXT: return WxXmlUtil.getMsgText(ele); case VIDEO: return WxXmlUtil.getMsgVideo(ele); case VOICE: return WxXmlUtil.getMsgVoice(ele); default: // never happens break; } return null; } public WxBaseRespEntity handleMessage(WxBaseMsgEntity msg) { List<WxMessageHandlerIfc> handlerList = new ArrayList<WxMessageHandlerIfc>(); handlerList.addAll(handlers); Collections.sort(handlerList, new WxMessageHandlerComparator()); Map<String, Object> context = new HashMap<String, Object>(); WxBaseRespEntity result = null; for (WxMessageHandlerIfc handler : handlerList) { result = handler.handle(msg, context); } if (result == null) { result = defaultResult(msg.getToUserName(), msg.getFromUserName()); } return result; } public Element parseRespXML(WxBaseRespEntity resp) throws DocumentException { WxMsgRespTypeEnum type = WxMsgRespTypeEnum.inst(resp.getMsgType()); switch (type) { case IMAGE: return WxXmlUtil.getRespImage((WxRespImageEntity) resp); case MUSIC: return WxXmlUtil.getRespMusic((WxRespMusicEntity) resp, ((WxRespMusicEntity) resp).getThumb()); case NEWS: return WxXmlUtil.getRespPicDesc((WxRespPicDescEntity) resp); case TEXT: return WxXmlUtil.getRespTextXML((WxRespTextEntity) resp); case VIDEO: return WxXmlUtil.getRespVideo((WxRespVideoEntity) resp); case VOICE: return WxXmlUtil.getRespVoice((WxRespVoiceEntity) resp); default: break; } return null; } protected WxRespTextEntity defaultResult(String fromUserName, String toUserName) { WxRespTextEntity result = new WxRespTextEntity(); result.setContent("您好,您的消息已收到."); result.setCreatedDate(new Date()); result.setCreateTime(new Date().getTime() / 1000); result.setFromUserName(fromUserName); result.setMsgType(WxMsgRespType.TEXT); result.setToUserName(toUserName); return result; } } class WxMessageHandlerComparator implements Comparator<WxMessageHandlerIfc> { /* (non-Javadoc) * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ public int compare(WxMessageHandlerIfc o1, WxMessageHandlerIfc o2) { if (o1.priority() > o2.priority()) { return -1; } else if (o1.priority() < o2.priority()) { return 1; } else { return 0; } } }