View Javadoc
1   package com.foxinmy.weixin4j.xml;
2   
3   import java.io.ByteArrayInputStream;
4   import java.io.IOException;
5   import java.util.HashSet;
6   import java.util.Set;
7   
8   import org.xml.sax.InputSource;
9   import org.xml.sax.SAXException;
10  import org.xml.sax.XMLReader;
11  import org.xml.sax.helpers.DefaultHandler;
12  import org.xml.sax.helpers.XMLReaderFactory;
13  
14  import com.foxinmy.weixin4j.request.WeixinRequest;
15  import com.foxinmy.weixin4j.socket.WeixinMessageTransfer;
16  import com.foxinmy.weixin4j.type.AccountType;
17  import com.foxinmy.weixin4j.util.ServerToolkits;
18  
19  /**
20   * 微信消息
21   *
22   * @className MessageTransferHandler
23   * @author jinyu(foxinmy@gmail.com)
24   * @date 2015年5月17日
25   * @since JDK 1.6
26   * @see
27   */
28  public class MessageTransferHandler extends DefaultHandler {
29  
30  	private String fromUserName;
31  	private String toUserName;
32  	private String msgType;
33  	private String eventType;
34  	private boolean isQY;
35  	private Set<String> nodeNames;
36  
37  	private String content;
38  
39  	@Override
40  	public void startDocument() throws SAXException {
41  		fromUserName = null;
42  		toUserName = null;
43  		msgType = null;
44  		eventType = null;
45  		isQY = false;
46  		nodeNames = new HashSet<String>();
47  	}
48  
49  	@Override
50  	public void endElement(String uri, String localName, String qName)
51  			throws SAXException {
52  		nodeNames.add(localName);
53  		localName = localName.toLowerCase();
54  		if (localName.equals("fromusername")) {
55  			fromUserName = content;
56  		} else if (localName.equals("tousername")) {
57  			toUserName = content;
58  		} else if (localName.equals("msgtype")) {
59  			msgType = content.toLowerCase();
60  		} else if (localName.equals("event")) {
61  			eventType = content.toLowerCase();
62  		} else if (localName.startsWith("agent") // 应用信息
63  				|| localName.startsWith("suite") // 套件信息
64  				|| localName.equals("batchjob")) { // 批量任务
65  			isQY = true;
66  		}
67  	}
68  
69  	@Override
70  	public void characters(char[] ch, int start, int length)
71  			throws SAXException {
72  		this.content = new String(ch, start, length);
73  	}
74  
75  	private AccountType getAccountType() {
76  		if (isQY) {
77  			return AccountType.QY;
78  		}
79  		if (ServerToolkits.isBlank(msgType)
80  				&& ServerToolkits.isBlank(eventType)) {
81  			return null;
82  		}
83  		return AccountType.MP;
84  	}
85  
86  	private static MessageTransferHandler global = new MessageTransferHandler();
87  
88  	public static WeixinMessageTransfer parser(WeixinRequest request)
89  			throws RuntimeException {
90  		try {
91  			XMLReader xmlReader = XMLReaderFactory.createXMLReader();
92  			xmlReader.setContentHandler(global);
93  			xmlReader.parse(new InputSource(new ByteArrayInputStream(request
94  					.getOriginalContent().getBytes(ServerToolkits.UTF_8))));
95  		} catch (IOException e) {
96  			throw new RuntimeException(e);
97  		} catch (SAXException e) {
98  			throw new RuntimeException(e);
99  		}
100 		return new WeixinMessageTransfer(request.getAesToken(),
101 				request.getEncryptType(), global.toUserName,
102 				global.fromUserName, global.getAccountType(), global.msgType,
103 				global.eventType, global.nodeNames);
104 	}
105 }