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
23
24
25
26
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 }