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