重构优化XStreamTransformer代码

This commit is contained in:
Binary Wang 2016-11-09 18:55:53 +08:00
parent 109cab8c54
commit e4df6c8a30

View File

@ -1,25 +1,25 @@
package me.chanjar.weixin.mp.util.xml; package me.chanjar.weixin.mp.util.xml;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.XStream;
import me.chanjar.weixin.common.util.xml.XStreamInitializer; import me.chanjar.weixin.common.util.xml.XStreamInitializer;
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; import me.chanjar.weixin.mp.bean.message.*;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutImageMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; import java.io.InputStream;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMusicMessage; import java.util.*;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutNewsMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutTextMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutTransferKefuMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutVideoMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutVoiceMessage;
public class XStreamTransformer { public class XStreamTransformer {
private static final Map<Class<?>, XStream> CLASS_2_XSTREAM_INSTANCE = new HashMap<>();
protected static final Map<Class<?>, XStream> CLASS_2_XSTREAM_INSTANCE = configXStreamInstance(); static {
registerClass(WxMpXmlMessage.class);
registerClass(WxMpXmlOutMusicMessage.class);
registerClass(WxMpXmlOutNewsMessage.class);
registerClass(WxMpXmlOutTextMessage.class);
registerClass(WxMpXmlOutImageMessage.class);
registerClass(WxMpXmlOutVideoMessage.class);
registerClass(WxMpXmlOutVoiceMessage.class);
registerClass(WxMpXmlOutTransferKefuMessage.class);
}
/** /**
* xml -> pojo * xml -> pojo
@ -36,16 +36,6 @@ public class XStreamTransformer {
return object; return object;
} }
/**
* 注册扩展消息的解析器
* @param clz 类型
* @param xStream xml解析器
*/
public static void register(Class<?> clz, XStream xStream) {
CLASS_2_XSTREAM_INSTANCE.put(clz,xStream);
}
/** /**
* pojo -> xml * pojo -> xml
*/ */
@ -53,83 +43,40 @@ public class XStreamTransformer {
return CLASS_2_XSTREAM_INSTANCE.get(clazz).toXML(object); return CLASS_2_XSTREAM_INSTANCE.get(clazz).toXML(object);
} }
private static Map<Class<?>, XStream> configXStreamInstance() { /**
Map<Class<?>, XStream> map = new HashMap<>(); * 注册扩展消息的解析器
map.put(WxMpXmlMessage.class, config_WxMpXmlMessage()); *
map.put(WxMpXmlOutMusicMessage.class, config_WxMpXmlOutMusicMessage()); * @param clz 类型
map.put(WxMpXmlOutNewsMessage.class, config_WxMpXmlOutNewsMessage()); * @param xStream xml解析器
map.put(WxMpXmlOutTextMessage.class, config_WxMpXmlOutTextMessage()); */
map.put(WxMpXmlOutImageMessage.class, config_WxMpXmlOutImageMessage()); public static void register(Class<?> clz, XStream xStream) {
map.put(WxMpXmlOutVideoMessage.class, config_WxMpXmlOutVideoMessage()); CLASS_2_XSTREAM_INSTANCE.put(clz, xStream);
map.put(WxMpXmlOutVoiceMessage.class, config_WxMpXmlOutVoiceMessage());
map.put(WxMpXmlOutTransferKefuMessage.class, config_WxMpXmlOutTransferCustomerServiceMessage());
return map;
} }
private static XStream config_WxMpXmlMessage() { public static void registerClass(Class<?> clz) {
XStream xstream = XStreamInitializer.getInstance(); XStream xstream = XStreamInitializer.getInstance();
xstream.processAnnotations(WxMpXmlMessage.class); xstream.processAnnotations(clz);
xstream.processAnnotations(WxMpXmlMessage.ScanCodeInfo.class); xstream.processAnnotations(getInnerClasses(clz));
xstream.processAnnotations(WxMpXmlMessage.SendPicsInfo.class); register(clz, xstream);
xstream.processAnnotations(WxMpXmlMessage.SendPicsInfo.Item.class);
xstream.processAnnotations(WxMpXmlMessage.SendLocationInfo.class);
xstream.aliasField("MsgID", WxMpXmlMessage.class, "msgId");
return xstream;
} }
private static XStream config_WxMpXmlOutImageMessage() { private static Class<?>[] getInnerClasses(Class<?> clz) {
XStream xstream = XStreamInitializer.getInstance(); Class<?>[] innerClasses = clz.getClasses();
xstream.processAnnotations(WxMpXmlOutMessage.class); if (innerClasses == null) {
xstream.processAnnotations(WxMpXmlOutImageMessage.class); return null;
return xstream;
} }
private static XStream config_WxMpXmlOutNewsMessage() { List<Class<?>> result = new ArrayList<>();
XStream xstream = XStreamInitializer.getInstance(); result.addAll(Arrays.asList(innerClasses));
xstream.processAnnotations(WxMpXmlOutMessage.class); for (Class<?> inner : innerClasses) {
xstream.processAnnotations(WxMpXmlOutNewsMessage.class); Class<?>[] innerClz = getInnerClasses(inner);
xstream.processAnnotations(WxMpXmlOutNewsMessage.Item.class); if (innerClz == null) {
return xstream; continue;
} }
private static XStream config_WxMpXmlOutMusicMessage() { result.addAll(Arrays.asList(innerClz));
XStream xstream = XStreamInitializer.getInstance();
xstream.processAnnotations(WxMpXmlOutMessage.class);
xstream.processAnnotations(WxMpXmlOutMusicMessage.class);
xstream.processAnnotations(WxMpXmlOutMusicMessage.Music.class);
return xstream;
} }
private static XStream config_WxMpXmlOutTextMessage() { return result.toArray(new Class<?>[0]);
XStream xstream = XStreamInitializer.getInstance();
xstream.processAnnotations(WxMpXmlOutMessage.class);
xstream.processAnnotations(WxMpXmlOutTextMessage.class);
return xstream;
} }
private static XStream config_WxMpXmlOutVideoMessage() {
XStream xstream = XStreamInitializer.getInstance();
xstream.processAnnotations(WxMpXmlOutMessage.class);
xstream.processAnnotations(WxMpXmlOutVideoMessage.class);
xstream.processAnnotations(WxMpXmlOutVideoMessage.Video.class);
return xstream;
}
private static XStream config_WxMpXmlOutVoiceMessage() {
XStream xstream = XStreamInitializer.getInstance();
xstream.processAnnotations(WxMpXmlOutMessage.class);
xstream.processAnnotations(WxMpXmlOutVoiceMessage.class);
return xstream;
}
private static XStream config_WxMpXmlOutTransferCustomerServiceMessage() {
XStream xstream = XStreamInitializer.getInstance();
xstream.processAnnotations(WxMpXmlOutMessage.class);
xstream.processAnnotations(WxMpXmlOutTransferKefuMessage.class);
xstream.processAnnotations(WxMpXmlOutTransferKefuMessage.TransInfo.class);
return xstream;
}
} }