MessageTransferHandler.java
package com.foxinmy.weixin4j.xml;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;
import com.foxinmy.weixin4j.request.WeixinRequest;
import com.foxinmy.weixin4j.socket.WeixinMessageTransfer;
import com.foxinmy.weixin4j.type.AccountType;
import com.foxinmy.weixin4j.util.ServerToolkits;
/**
* 微信消息
*
* @className MessageTransferHandler
* @author jinyu(foxinmy@gmail.com)
* @date 2015年5月17日
* @since JDK 1.6
* @see
*/
public class MessageTransferHandler extends DefaultHandler {
private String fromUserName;
private String toUserName;
private String msgType;
private String eventType;
private boolean isQY;
private Set<String> nodeNames;
private String content;
@Override
public void startDocument() throws SAXException {
fromUserName = null;
toUserName = null;
msgType = null;
eventType = null;
isQY = false;
nodeNames = new HashSet<String>();
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
nodeNames.add(localName);
localName = localName.toLowerCase();
if (localName.equals("fromusername")) {
fromUserName = content;
} else if (localName.equals("tousername")) {
toUserName = content;
} else if (localName.equals("msgtype")) {
msgType = content.toLowerCase();
} else if (localName.equals("event")) {
eventType = content.toLowerCase();
} else if (localName.startsWith("agent") // 应用信息
|| localName.startsWith("suite") // 套件信息
|| localName.equals("batchjob")) { // 批量任务
isQY = true;
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
this.content = new String(ch, start, length);
}
private AccountType getAccountType() {
if (isQY) {
return AccountType.QY;
}
if (ServerToolkits.isBlank(msgType)
&& ServerToolkits.isBlank(eventType)) {
return null;
}
return AccountType.MP;
}
private static MessageTransferHandler global = new MessageTransferHandler();
public static WeixinMessageTransfer parser(WeixinRequest request)
throws RuntimeException {
try {
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
xmlReader.setContentHandler(global);
xmlReader.parse(new InputSource(new ByteArrayInputStream(request
.getOriginalContent().getBytes(ServerToolkits.UTF_8))));
} catch (IOException e) {
throw new RuntimeException(e);
} catch (SAXException e) {
throw new RuntimeException(e);
}
return new WeixinMessageTransfer(request.getAesToken(),
request.getEncryptType(), global.toUserName,
global.fromUserName, global.getAccountType(), global.msgType,
global.eventType, global.nodeNames);
}
}