Skip to content

Commit e4df6c8

Browse files
committed
重构优化XStreamTransformer代码
1 parent 109cab8 commit e4df6c8

File tree

1 file changed

+43
-96
lines changed

1 file changed

+43
-96
lines changed
Lines changed: 43 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
package me.chanjar.weixin.mp.util.xml;
22

3-
import java.io.InputStream;
4-
import java.util.HashMap;
5-
import java.util.Map;
6-
73
import com.thoughtworks.xstream.XStream;
8-
94
import me.chanjar.weixin.common.util.xml.XStreamInitializer;
10-
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
11-
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutImageMessage;
12-
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
13-
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMusicMessage;
14-
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutNewsMessage;
15-
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutTextMessage;
16-
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutTransferKefuMessage;
17-
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutVideoMessage;
18-
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutVoiceMessage;
5+
import me.chanjar.weixin.mp.bean.message.*;
196

20-
public class XStreamTransformer {
7+
import java.io.InputStream;
8+
import java.util.*;
219

22-
protected static final Map<Class<?>, XStream> CLASS_2_XSTREAM_INSTANCE = configXStreamInstance();
10+
public class XStreamTransformer {
11+
private static final Map<Class<?>, XStream> CLASS_2_XSTREAM_INSTANCE = new HashMap<>();
12+
13+
static {
14+
registerClass(WxMpXmlMessage.class);
15+
registerClass(WxMpXmlOutMusicMessage.class);
16+
registerClass(WxMpXmlOutNewsMessage.class);
17+
registerClass(WxMpXmlOutTextMessage.class);
18+
registerClass(WxMpXmlOutImageMessage.class);
19+
registerClass(WxMpXmlOutVideoMessage.class);
20+
registerClass(WxMpXmlOutVoiceMessage.class);
21+
registerClass(WxMpXmlOutTransferKefuMessage.class);
22+
}
2323

2424
/**
2525
* xml -> pojo
@@ -36,100 +36,47 @@ public static <T> T fromXml(Class<T> clazz, InputStream is) {
3636
return object;
3737
}
3838

39-
/**
40-
* 注册扩展消息的解析器
41-
* @param clz 类型
42-
* @param xStream xml解析器
43-
*/
44-
public static void register(Class<?> clz, XStream xStream) {
45-
CLASS_2_XSTREAM_INSTANCE.put(clz,xStream);
46-
}
47-
48-
4939
/**
5040
* pojo -> xml
5141
*/
5242
public static <T> String toXml(Class<T> clazz, T object) {
5343
return CLASS_2_XSTREAM_INSTANCE.get(clazz).toXML(object);
5444
}
5545

56-
private static Map<Class<?>, XStream> configXStreamInstance() {
57-
Map<Class<?>, XStream> map = new HashMap<>();
58-
map.put(WxMpXmlMessage.class, config_WxMpXmlMessage());
59-
map.put(WxMpXmlOutMusicMessage.class, config_WxMpXmlOutMusicMessage());
60-
map.put(WxMpXmlOutNewsMessage.class, config_WxMpXmlOutNewsMessage());
61-
map.put(WxMpXmlOutTextMessage.class, config_WxMpXmlOutTextMessage());
62-
map.put(WxMpXmlOutImageMessage.class, config_WxMpXmlOutImageMessage());
63-
map.put(WxMpXmlOutVideoMessage.class, config_WxMpXmlOutVideoMessage());
64-
map.put(WxMpXmlOutVoiceMessage.class, config_WxMpXmlOutVoiceMessage());
65-
map.put(WxMpXmlOutTransferKefuMessage.class, config_WxMpXmlOutTransferCustomerServiceMessage());
66-
67-
return map;
68-
}
69-
70-
private static XStream config_WxMpXmlMessage() {
71-
XStream xstream = XStreamInitializer.getInstance();
72-
xstream.processAnnotations(WxMpXmlMessage.class);
73-
xstream.processAnnotations(WxMpXmlMessage.ScanCodeInfo.class);
74-
xstream.processAnnotations(WxMpXmlMessage.SendPicsInfo.class);
75-
xstream.processAnnotations(WxMpXmlMessage.SendPicsInfo.Item.class);
76-
xstream.processAnnotations(WxMpXmlMessage.SendLocationInfo.class);
77-
78-
xstream.aliasField("MsgID", WxMpXmlMessage.class, "msgId");
79-
return xstream;
80-
}
81-
82-
private static XStream config_WxMpXmlOutImageMessage() {
83-
XStream xstream = XStreamInitializer.getInstance();
84-
xstream.processAnnotations(WxMpXmlOutMessage.class);
85-
xstream.processAnnotations(WxMpXmlOutImageMessage.class);
86-
return xstream;
87-
}
88-
89-
private static XStream config_WxMpXmlOutNewsMessage() {
90-
XStream xstream = XStreamInitializer.getInstance();
91-
xstream.processAnnotations(WxMpXmlOutMessage.class);
92-
xstream.processAnnotations(WxMpXmlOutNewsMessage.class);
93-
xstream.processAnnotations(WxMpXmlOutNewsMessage.Item.class);
94-
return xstream;
46+
/**
47+
* 注册扩展消息的解析器
48+
*
49+
* @param clz 类型
50+
* @param xStream xml解析器
51+
*/
52+
public static void register(Class<?> clz, XStream xStream) {
53+
CLASS_2_XSTREAM_INSTANCE.put(clz, xStream);
9554
}
9655

97-
private static XStream config_WxMpXmlOutMusicMessage() {
56+
public static void registerClass(Class<?> clz) {
9857
XStream xstream = XStreamInitializer.getInstance();
99-
xstream.processAnnotations(WxMpXmlOutMessage.class);
100-
xstream.processAnnotations(WxMpXmlOutMusicMessage.class);
101-
xstream.processAnnotations(WxMpXmlOutMusicMessage.Music.class);
102-
return xstream;
58+
xstream.processAnnotations(clz);
59+
xstream.processAnnotations(getInnerClasses(clz));
60+
register(clz, xstream);
10361
}
10462

105-
private static XStream config_WxMpXmlOutTextMessage() {
106-
XStream xstream = XStreamInitializer.getInstance();
107-
xstream.processAnnotations(WxMpXmlOutMessage.class);
108-
xstream.processAnnotations(WxMpXmlOutTextMessage.class);
109-
return xstream;
110-
}
63+
private static Class<?>[] getInnerClasses(Class<?> clz) {
64+
Class<?>[] innerClasses = clz.getClasses();
65+
if (innerClasses == null) {
66+
return null;
67+
}
11168

112-
private static XStream config_WxMpXmlOutVideoMessage() {
113-
XStream xstream = XStreamInitializer.getInstance();
114-
xstream.processAnnotations(WxMpXmlOutMessage.class);
115-
xstream.processAnnotations(WxMpXmlOutVideoMessage.class);
116-
xstream.processAnnotations(WxMpXmlOutVideoMessage.Video.class);
117-
return xstream;
118-
}
69+
List<Class<?>> result = new ArrayList<>();
70+
result.addAll(Arrays.asList(innerClasses));
71+
for (Class<?> inner : innerClasses) {
72+
Class<?>[] innerClz = getInnerClasses(inner);
73+
if (innerClz == null) {
74+
continue;
75+
}
11976

120-
private static XStream config_WxMpXmlOutVoiceMessage() {
121-
XStream xstream = XStreamInitializer.getInstance();
122-
xstream.processAnnotations(WxMpXmlOutMessage.class);
123-
xstream.processAnnotations(WxMpXmlOutVoiceMessage.class);
124-
return xstream;
125-
}
77+
result.addAll(Arrays.asList(innerClz));
78+
}
12679

127-
private static XStream config_WxMpXmlOutTransferCustomerServiceMessage() {
128-
XStream xstream = XStreamInitializer.getInstance();
129-
xstream.processAnnotations(WxMpXmlOutMessage.class);
130-
xstream.processAnnotations(WxMpXmlOutTransferKefuMessage.class);
131-
xstream.processAnnotations(WxMpXmlOutTransferKefuMessage.TransInfo.class);
132-
return xstream;
80+
return result.toArray(new Class<?>[0]);
13381
}
134-
13582
}

0 commit comments

Comments
 (0)