|
|
@@ -1,25 +1,25 @@ |
|
|
|
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 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 |
|
|
@@ -36,16 +36,6 @@ public class XStreamTransformer { |
|
|
|
return object; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 注册扩展消息的解析器 |
|
|
|
* @param clz 类型 |
|
|
|
* @param xStream xml解析器 |
|
|
|
*/ |
|
|
|
public static void register(Class<?> clz, XStream xStream) { |
|
|
|
CLASS_2_XSTREAM_INSTANCE.put(clz,xStream); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* pojo -> xml |
|
|
|
*/ |
|
|
@@ -53,83 +43,40 @@ public class XStreamTransformer { |
|
|
|
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.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]); |
|
|
|
} |
|
|
|
|
|
|
|
} |