/**
*
*/
package org.hamster.weixinmp.controller.util;
import java.util.Date;
import org.apache.commons.lang3.StringUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.hamster.weixinmp.constant.WxMsgTypeEnum;
import org.hamster.weixinmp.dao.entity.auth.WxAuthReq;
import org.hamster.weixinmp.dao.entity.base.WxBaseMsgEntity;
import org.hamster.weixinmp.dao.entity.base.WxBaseRespEntity;
import org.hamster.weixinmp.dao.entity.item.WxItemImageEntity;
import org.hamster.weixinmp.dao.entity.item.WxItemPicDescEntity;
import org.hamster.weixinmp.dao.entity.item.WxItemThumbEntity;
import org.hamster.weixinmp.dao.entity.item.WxItemVideoEntity;
import org.hamster.weixinmp.dao.entity.item.WxItemVoiceEntity;
import org.hamster.weixinmp.dao.entity.msg.WxMsgEventEntity;
import org.hamster.weixinmp.dao.entity.msg.WxMsgImageEntity;
import org.hamster.weixinmp.dao.entity.msg.WxMsgLinkEntity;
import org.hamster.weixinmp.dao.entity.msg.WxMsgLocEntity;
import org.hamster.weixinmp.dao.entity.msg.WxMsgTextEntity;
import org.hamster.weixinmp.dao.entity.msg.WxMsgVideoEntity;
import org.hamster.weixinmp.dao.entity.msg.WxMsgVoiceEntity;
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.util.WxUtil;
/**
* @author grossopaforever@gmail.com
* @version Jul 28, 2013
*
*/
public class WxXmlUtil {
private WxXmlUtil() {
}
public static WxAuthReq getAuthReq(String signature, String timestamp,
String nonce, String echostr) {
WxAuthReq result = new WxAuthReq();
result.setSignature(signature);
result.setTimestamp(timestamp);
result.setNonce(nonce);
result.setEchostr(echostr);
return result;
}
/**
* <code>
* <xml><br />
* <ToUserName><![CDATA[toUser]]></ToUserName><br />
* <FromUserName><![CDATA[fromUser]]></
* FromUserName> <br />
* <CreateTime>1348831860</CreateTime><br />
* <MsgType><![CDATA[text]]></MsgType><br />
* <Content><![CDATA[this is a
* test]]></Content><br />
* <MsgId>1234567890123456</MsgId><br />
* </xml><br />
* </code>
*
* @param xmlstr
* @return
* @throws DocumentException
*/
public static WxMsgTextEntity getMsgText(Element ele) throws DocumentException {
WxMsgTextEntity result = msgEntityFactory(WxMsgTextEntity.class, ele);
result.setMsgId(longVal(ele, "MsgId"));
result.setContent(strVal(ele, "Content"));
return result;
}
/**
* <code>
* <xml>
* <ToUserName><![CDATA[toUser]]></ToUserName>
* <FromUserName><![CDATA[fromUser]]></FromUserName>
* <CreateTime>1348831860</CreateTime>
* <MsgType><![CDATA[image]]></MsgType>
* <PicUrl><![CDATA[this is a url]]></PicUrl>
* <MediaId><![CDATA[media_id]]></MediaId>
* <MsgId>1234567890123456</MsgId>
* </xml>
* </code>
*
* @param xmlstr
* @return
* @throws DocumentException
*/
public static WxMsgImageEntity getMsgImage(Element ele) throws DocumentException {
WxMsgImageEntity result = msgEntityFactory(WxMsgImageEntity.class, ele);
WxItemImageEntity image = new WxItemImageEntity();
image.setMediaId(strVal(ele, "MediaId"));
image.setPicUrl(strVal(ele, "PicUrl"));
result.setImage(image);
return result;
}
/**
* <code>
* <xml><br />
* <ToUserName><![CDATA[toUser]]></ToUserName><br />
* <FromUserName><![CDATA[fromUser]]></FromUserName><br />
* <CreateTime>1357290913</CreateTime><br />
* <MsgType><![CDATA[voice]]></MsgType><br />
* <MediaId><![CDATA[media_id]]></MediaId><br />
* <Format><![CDATA[Format]]></Format><br />
* <MsgId>1234567890123456</MsgId><br />
* </xml>
* </code>
*
* @param ele
* @return
* @throws DocumentException
*/
public static WxMsgVoiceEntity getMsgVoice(Element ele) throws DocumentException {
WxMsgVoiceEntity result = msgEntityFactory(WxMsgVideoEntity.class, ele);
WxItemVoiceEntity voice = new WxItemVoiceEntity();
voice.setMediaId(strVal(ele, "MediaId"));
voice.setFormat(strVal(ele, "Format"));
if (!StringUtils.isEmpty(ele.elementText("Recognition"))) {
voice.setRecognition(strVal(ele, "Recognition"));
}
result.setVoice(voice);
return result;
}
/**
* <code>
* <xml><br />
* <ToUserName><![CDATA[toUser]]></ToUserName><br />
* <FromUserName><![CDATA[fromUser]]></FromUserName><br />
* <CreateTime>1357290913</CreateTime><br />
* <MsgType><![CDATA[video]]></MsgType><br />
* <MediaId><![CDATA[media_id]]></MediaId><br />
* <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId><br />
* <MsgId>1234567890123456</MsgId><br />
* </xml>
* </code>
* @param ele
* @return
* @throws DocumentException
*/
public static WxMsgVideoEntity getMsgVideo(Element ele) throws DocumentException {
WxMsgVideoEntity result = msgEntityFactory(WxMsgVideoEntity.class, ele);
WxItemVideoEntity video = new WxItemVideoEntity();
video.setMediaId(strVal(ele, "MediaId"));
WxItemThumbEntity thumb = new WxItemThumbEntity();
thumb.setMediaId(strVal(ele, "ThumbMediaId"));
video.setThumb(thumb);
result.setVideo(video);
return result;
}
/**
* <code>
* <xml><br />
* <ToUserName><![CDATA[toUser]]></ToUserName><br />
* <FromUserName><![CDATA[fromUser]]></FromUserName><br />
* <CreateTime>1351776360</CreateTime><br />
* <MsgType><![CDATA[location]]></MsgType><br />
* <Location_X>23.134521</Location_X><br />
* <Location_Y>113.358803</Location_Y><br />
* <Scale>20</Scale><br />
* <Label><![CDATA[Location Information]]></Label><br />
* <MsgId>1234567890123456</MsgId><br />
* </xml>
* </code>
*
*
* @param xmlstr
* @return
* @throws DocumentException
*/
public static WxMsgLocEntity getMsgLoc(Element ele) throws DocumentException {
WxMsgLocEntity result = msgEntityFactory(WxMsgLocEntity.class, ele);
result.setLabel(strVal(ele, "Label"));
result.setLocationX(doubleVal(ele, "Location_X"));
result.setLocationY(doubleVal(ele, "Location_Y"));
result.setScale(doubleVal(ele, "Scale"));
return result;
}
/**
* <code>
* <xml><br />
* <ToUserName><![CDATA[toUser]]></ToUserName><br />
* <FromUserName><![CDATA[fromUser]]></FromUserName><br />
* <CreateTime>1351776360</CreateTime><br />
* <MsgType><![CDATA[link]]></MsgType><br />
* <Title><![CDATA[公众平台官网链接]]></Title><br />
* <Description><![CDATA[公众平台官网链接]]></Description><br />
* <Url><![CDATA[url]]></Url><br />
* <MsgId>1234567890123456</MsgId><br />
* </xml>
* </code>
*
* @param xmlstr
* @return
* @throws DocumentException
*/
public static WxMsgLinkEntity getMsgLink(Element ele) throws DocumentException {
WxMsgLinkEntity result = msgEntityFactory(WxMsgLinkEntity.class, ele);
result.setTitle(strVal(ele, "Title"));
result.setDescription(strVal(ele, "Description"));
result.setUrl(strVal(ele, "Url"));
return result;
}
/**
* <code>
* <xml><br />
* <ToUserName><![CDATA[toUser]]></ToUserName><br />
* <FromUserName><![CDATA[FromUser]]></FromUserName><br />
* <CreateTime>123456789</CreateTime><br />
* <MsgType><![CDATA[event]]></MsgType><br />
* <Event><![CDATA[EVENT]]></Event><br />
* <EventKey><![CDATA[EVENTKEY]]></EventKey><br />
* </xml>
* </code>
*
* @param xmlstr
* @return
* @throws DocumentException
*/
public static WxMsgEventEntity getMsgEvent(Element ele) throws DocumentException {
WxMsgEventEntity result = msgEntityFactory(WxMsgEventEntity.class, ele);
result.setEvent(strVal(ele, "Event"));
if (ele.elementText("EventKey") != null) {
result.setEventKey(strVal(ele, "EventKey"));
}
if (ele.elementText("Ticket") != null) {
result.setEventKey(strVal(ele, "Ticket"));
}
return result;
}
/**
* <code>
* <xml><br />
* <ToUserName><![CDATA[toUser]]></ToUserName><br />
* <FromUserName><![CDATA[fromUser]]></FromUserName><br />
* <CreateTime>12345678</CreateTime><br />
* <MsgType><![CDATA[text]]></MsgType><br />
* <Content><![CDATA[content]]></Content><br />
* <FuncFlag>0</FuncFlag><br />
* </xml>
* </code>
*
* @param respText
* @return
* @throws DocumentException
*/
public static Element getRespTextXML(WxRespTextEntity respText) throws DocumentException {
Element ele = respEntityFactory(respText);
ele.addElement("Content").addCDATA(respText.getContent());
return ele;
}
/**
* <code>
* <xml><br />
* <ToUserName><![CDATA[toUser]]></ToUserName><br />
* <FromUserName><![CDATA[fromUser]]></FromUserName><br />
* <CreateTime>12345678</CreateTime><br />
* <MsgType><![CDATA[image]]></MsgType><br />
* <Image><br />
* <MediaId><![CDATA[media_id]]></MediaId><br />
* </Image><br />
* </xml><br />
* </code>
*
* @param respImage
* @return
* @throws DocumentException
*/
public static Element getRespImage(WxRespImageEntity respImage) throws DocumentException {
Element ele = respEntityFactory(respImage);
Element imageEle = ele.addElement("Image");
imageEle.addElement("MediaId").addCDATA(respImage.getImage().getMediaId());
return ele;
}
/**
* <code>
* <xml><br />
* <ToUserName><![CDATA[toUser]]></ToUserName><br />
* <FromUserName><![CDATA[fromUser]]></FromUserName><br />
* <CreateTime>12345678</CreateTime><br />
* <MsgType><![CDATA[voice]]></MsgType><br />
* <Voice><br />
* <MediaId><![CDATA[media_id]]></MediaId><br />
* </Voice><br />
* </xml><br />
* </code>
*
* @param respVoice
* @return
* @throws DocumentException
*/
public static Element getRespVoice(WxRespVoiceEntity respVoice) throws DocumentException {
Element ele = respEntityFactory(respVoice);
Element voiceEle = ele.addElement("Voice");
voiceEle.addElement("MediaId").addCDATA(respVoice.getVoice().getMediaId());
return ele;
}
/**
* <code>
* <xml><br />
* <ToUserName><![CDATA[toUser]]></ToUserName><br />
* <FromUserName><![CDATA[fromUser]]></FromUserName><br />
* <CreateTime>12345678</CreateTime><br />
* <MsgType><![CDATA[video]]></MsgType><br />
* <Video><br />
* <MediaId><![CDATA[media_id]]></MediaId><br />
* <Title><![CDATA[title]]></Title><br />
* <Description><![CDATA[description]]></Description><br />
* </Video><br />
* </xml><br />
* </code>
*
* @param respVideo
* @return
* @throws DocumentException
*/
public static Element getRespVideo(WxRespVideoEntity respVideo) throws DocumentException {
Element ele = respEntityFactory(respVideo);
Element videoEle = ele.addElement("Video");
videoEle.addElement("MediaId").addCDATA(respVideo.getVideo().getMediaId());
videoEle.addElement("Title").addCDATA(StringUtils.defaultString(respVideo.getVideo().getTitle()));
videoEle.addElement("Description").addCDATA(StringUtils.defaultString(respVideo.getVideo().getDescription()));
return ele;
}
/**
* <code>
* <xml><br />
* <ToUserName><![CDATA[toUser]]></ToUserName><br />
* <FromUserName><![CDATA[fromUser]]></FromUserName><br />
* <CreateTime>12345678</CreateTime><br />
* <MsgType><![CDATA[music]]></MsgType><br />
* <Music><br />
* <Title><![CDATA[TITLE]]></Title><br />
* <Description><![CDATA[DESCRIPTION]]></Description><br />
* <MusicUrl><![CDATA[MUSIC_Url]]></MusicUrl><br />
* <HQMusicUrl><![CDATA[HQ_MUSIC_Url]]></HQMusicUrl><br />
* <ThumbMediaId><![CDATA[media_id]]></ThumbMediaId><br />
* </Music><br />
* <FuncFlag>0</FuncFlag><br />
* </xml>
* </code>
*
* @param respMusic
* @return
* @throws DocumentException
*/
public static Element getRespMusic(WxRespMusicEntity respMusic, WxItemThumbEntity thumb) throws DocumentException {
Element ele = respEntityFactory(respMusic);
Element musicEle = ele.addElement("Music");
musicEle.addElement("Title").addCDATA(StringUtils.defaultString(respMusic.getMusic().getTitle()));
musicEle.addElement("Description").addCDATA(StringUtils.defaultString(respMusic.getMusic().getDescription()));
musicEle.addElement("MusicUrl").addCDATA(StringUtils.defaultString(respMusic.getMusic().getMusicUrl()));
musicEle.addElement("HQMusicUrl").addCDATA(StringUtils.defaultString(respMusic.getMusic().getHqMusicUrl()));
musicEle.addElement("ThumbMediaId").addCDATA(thumb.getMediaId());
return ele;
}
/**
* <code>
* <xml><br />
* <ToUserName><![CDATA[toUser]]></ToUserName><br />
* <FromUserName><![CDATA[fromUser]]></FromUserName><br />
* <CreateTime>12345678</CreateTime><br />
* <MsgType><![CDATA[news]]></MsgType><br />
* <ArticleCount>2</ArticleCount><br />
* <Articles><br />
* <item><br />
* <Title><![CDATA[title1]]></Title><br />
* <Description><![CDATA[description1]]></Description><br />
* <PicUrl><![CDATA[picurl]]></PicUrl><br />
* <Url><![CDATA[url]]></Url><br />
* </item><br />
* <item><br />
* <Title><![CDATA[title]]></Title><br />
* <Description><![CDATA[description]]></Description><br />
* <PicUrl><![CDATA[picurl]]></PicUrl><br />
* <Url><![CDATA[url]]></Url><br />
* </item><br />
* </Articles><br />
* <FuncFlag>1</FuncFlag><br />
* </xml>
* </code>
*
* @param respPicDesc
* @return
* @throws DocumentException
*/
public static Element getRespPicDesc(WxRespPicDescEntity respPicDesc) throws DocumentException {
Element ele = respEntityFactory(respPicDesc);
ele.addElement("ArticleCount").addText(String.valueOf(respPicDesc.getArticles().size()));
Element articlesEle = ele.addElement("Articles");
for (WxItemPicDescEntity item : respPicDesc.getArticles()) {
Element itemEle = articlesEle.addElement("item");
itemEle.addElement("Title").addCDATA(item.getTitle());
itemEle.addElement("Description").addCDATA(item.getDescription());
itemEle.addElement("PicUrl").addCDATA(item.getPicUrl());
itemEle.addElement("HQMusicUrl").addCDATA(item.getUrl());
}
return ele;
}
public static Element toXML(String xmlstr) throws DocumentException {
Document doc = DocumentHelper.parseText(xmlstr);
return doc.getRootElement();
}
public static WxMsgTypeEnum getReqType(Element ele) {
String type = ele.element("MsgType").getTextTrim();
return WxMsgTypeEnum.inst(type);
}
//////////////////////////////////////////////////
// Private Methods //
//////////////////////////////////////////////////
@SuppressWarnings("unchecked")
private static <T> T msgEntityFactory(
Class<? extends WxBaseMsgEntity> clazz, Element ele) {
WxBaseMsgEntity result;
try {
result = clazz.newInstance();
result.setToUserName(strVal(ele, "ToUserName"));
result.setFromUserName(strVal(ele, "FromUserName"));
result.setCreateTime(longVal(ele, "CreateTime"));
result.setCreatedDate(new Date());
result.setMsgType(strVal(ele, "MsgType"));
if (ele.element("MsgId") != null) {
result.setMsgId(longVal(ele, "MsgId"));
}
return (T) result;
} catch (Exception e) {
// never occurs
return null;
}
}
private static Element respEntityFactory(WxBaseRespEntity entity) {
Element ele = DocumentHelper.createElement("xml");
ele.addElement("ToUserName").addCDATA(entity.getToUserName());
ele.addElement("FromUserName").addCDATA(entity.getFromUserName());
String createTime = String.valueOf(entity.getCreateTime());
if (StringUtils.isBlank(createTime)) {
Long currentTime = WxUtil.currentTimeInSec();
entity.setCreateTime(currentTime);
createTime = String.valueOf(currentTime);
}
ele.addElement("CreateTime").setText(createTime);
ele.addElement("MsgType").addCDATA(entity.getMsgType());
ele.addElement("FuncFlag").setText(String.valueOf(entity.getFuncFlag()));
return ele;
}
private static String strVal(Element ele, String name) {
return ele.element(name).getStringValue();
}
private static Long longVal(Element ele, String name) {
return Long.valueOf(ele.element(name).getStringValue());
}
private static Double doubleVal(Element ele, String name) {
return Double.valueOf(ele.element(name).getStringValue());
}
}