From c4db15db9b64ad5d248dc45460661d67fe81832e Mon Sep 17 00:00:00 2001
From: "wei.peng" <123456>
Date: Wed, 24 Jul 2019 20:30:20 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20XStream=20=E6=8F=92?=
=?UTF-8?q?=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
modules/i3plus-pojo-base/pom.xml | 4 +
.../i3plus/pojo/base/annotation/XStreamCDATA.java | 18 ++
.../i3plus/pojo/base/common/XStreamFactory.java | 236 +++++++++++++++++++++
pom.xml | 5 +
4 files changed, 263 insertions(+)
create mode 100644 modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/annotation/XStreamCDATA.java
create mode 100644 modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/common/XStreamFactory.java
diff --git a/modules/i3plus-pojo-base/pom.xml b/modules/i3plus-pojo-base/pom.xml
index 888e1bd..e97c0bb 100644
--- a/modules/i3plus-pojo-base/pom.xml
+++ b/modules/i3plus-pojo-base/pom.xml
@@ -35,6 +35,10 @@
com.alibaba
fastjson
+
+ com.thoughtworks.xstream
+ xstream
+
diff --git a/modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/annotation/XStreamCDATA.java b/modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/annotation/XStreamCDATA.java
new file mode 100644
index 0000000..9ade29e
--- /dev/null
+++ b/modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/annotation/XStreamCDATA.java
@@ -0,0 +1,18 @@
+package cn.estsh.i3plus.pojo.base.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @Description : XStream 数据转换的CDATA
+ * @Reference :
+ * @Author : wei.peng
+ * @CreateDate : 2019-07-23 下午5:52
+ * @Modify:
+ **/
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface XStreamCDATA {
+}
diff --git a/modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/common/XStreamFactory.java b/modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/common/XStreamFactory.java
new file mode 100644
index 0000000..6787a28
--- /dev/null
+++ b/modules/i3plus-pojo-base/src/main/java/cn/estsh/i3plus/pojo/base/common/XStreamFactory.java
@@ -0,0 +1,236 @@
+package cn.estsh.i3plus.pojo.base.common;
+
+import cn.estsh.i3plus.pojo.base.annotation.XStreamCDATA;
+import com.alibaba.fastjson.JSON;
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
+import com.thoughtworks.xstream.core.util.QuickWriter;
+import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
+import com.thoughtworks.xstream.io.naming.NameCoder;
+import com.thoughtworks.xstream.io.naming.NoNameCoder;
+import com.thoughtworks.xstream.io.xml.DomDriver;
+import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
+import com.thoughtworks.xstream.io.xml.XppDomDriver;
+import lombok.Data;
+import sun.plugin2.util.SystemUtil;
+
+import java.io.Serializable;
+import java.io.Writer;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * @Description : Xml 工厂
+ * @Reference :
+ * @Author : wei.peng
+ * @CreateDate : 19-7-23 下午5:58
+ * @Modify:
+ **/
+public class XStreamFactory {
+
+ private static final XStream xStream = XStreamFactory.getXStream();
+
+ public static final String CDATA_PREFIX = "";
+
+ public static XStream getXStream() {
+ final NameCoder nameCoder = new NoNameCoder();
+ XStream xStream = new XStream(new XppDomDriver(nameCoder) {
+ @Override
+ public HierarchicalStreamWriter createWriter(Writer out) {
+ return new PrettyPrintWriter(out, nameCoder) {
+ boolean cdataFlag = false;
+ Class> targetClass = null;
+
+ @Override
+ public void startNode(String name, Class clazz) {
+ super.startNode(name, clazz);
+ if (targetClass == null) {
+ targetClass = clazz;
+ }
+ cdataFlag = isCDATA(targetClass, name);
+ }
+
+ @Override
+ public void writeText(QuickWriter writer, String text) {
+ if (cdataFlag) {
+ writer.write(CDATA_PREFIX);
+ writer.write(text);
+ writer.write(CDATA_SUFFIX);
+ } else {
+ writer.write(text);
+ }
+ }
+ };
+ }
+ });
+ return xStream;
+ }
+
+
+ private static boolean isCDATA(Class> clazz, String fieldAlias) {
+ //检查类本身
+ boolean cdataFlag = isExistCDATA(clazz, fieldAlias);
+ if (cdataFlag) {
+ return cdataFlag;
+ }
+ //继续检查父类
+ Class> superClazz = clazz.getSuperclass();
+ while (!superClazz.equals(Object.class)) {
+ cdataFlag = isExistCDATA(superClazz, fieldAlias);
+ if (cdataFlag) {
+ return cdataFlag;
+ }
+ superClazz = superClazz.getClass().getSuperclass();
+ }
+ return false;
+ }
+
+ /**
+ * 检查是否有 @XStreamCDATA 注解
+ *
+ * @param clazz clazz
+ * @param fieldAlias fieldAlias
+ * @return
+ */
+ private static boolean isExistCDATA(Class> clazz, String fieldAlias) {
+ Field[] fields = clazz.getDeclaredFields();
+ for (Field field : fields) {
+ if (field.getAnnotation(XStreamCDATA.class) != null) {
+ XStreamAlias xStreamAlias = field.getAnnotation(XStreamAlias.class);
+ if (xStreamAlias != null && fieldAlias.equals(xStreamAlias.value())) {
+ return true;
+ } else {
+ if (fieldAlias.equals(field.getName())) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+
+
+ /**
+ * Javabean 转XML
+ * @param
+ * @return xml字符串
+ */
+ public static String toXml(T t) {
+ xStream.processAnnotations(t.getClass());
+ String headLine = "\n";
+ return headLine + xStream.toXML(t);
+ }
+
+ /**
+ * XML字符串转javabean
+ *
+ * @param xmlStr xml字符串
+ * @param
+ * @return Java对象
+ */
+ public static T toJavaBean(String xmlStr) {
+ return (T) xStream.fromXML(xmlStr);
+ }
+//
+// public static void main(String[] args) {
+// User u = new User(0, "zhangsan0", "zhangsanpwd0");
+// User u1 = new User(1, "zhangsan1", "zhangsanpwd");
+// User u2 = new User(2, "zhangsan2", "zhangsanpwd");
+// User u3 = new User(3, "zhangsan3", "zhangsanpwd");
+//
+// Role r1 = new Role(1, "Admin", "Admin1");
+// Role r2 = new Role(2, "Admin", "Admin2");
+// Role r3 = new Role(3, "Admin", "Admin3");
+//
+// DataAdapter ad = new DataAdapter(10086L,UUID.randomUUID().toString(),"sssfwef",u1);
+// u1.setRole(r1);
+//
+// u2.getRoleList().add(r1);
+// u2.getRoleList().add(r2);
+// u2.getRoleList().add(r3);
+//
+// u3.setRole(r1);
+// u3.getRoleList().add(r2);
+// u3.getRoleList().add(r3);
+//
+// System.out.println(toXml(u) + "\n\n ");
+// System.out.println(toXml(u1) + "\n\n ");
+// System.out.println(toXml(u2) + "\n\n ");
+// System.out.println(toXml(u3) + "\n\n ");
+// System.out.println(toXml(ad) + "\n\n ");
+//
+// System.out.println(JSON.toJSONString(toJavaBean(toXml(ad))));
+//
+// }
+}
+//
+//@Data
+//@XStreamAlias("DataAdapter")
+////对应carInfos元素
+//class DataAdapter implements Serializable {
+//
+// @XStreamAsAttribute
+// private Long scId;
+// private String key;
+// @XStreamCDATA
+// private String resultData;
+//
+// private Object auth;
+//
+// public DataAdapter(Long scId, String key, String resultData, Object auth) {
+// this.scId = scId;
+// this.key = key;
+// this.resultData = resultData;
+// this.auth = auth;
+// }
+//}
+//
+//@Data
+//@XStreamAlias("user")
+////对应carInfos元素
+//class User implements Serializable {
+// private static final long serialVersionUID = -7554548655397869156L;
+//
+// @XStreamAsAttribute
+// private Integer id;
+// private String loginName;
+// private String loginPwd;
+//
+// private Role role;
+// private List roleList = new ArrayList();
+// private List roleArray;
+//
+// public User() {
+// }
+//
+// public User(Integer id, String loginName, String loginPwd) {
+// this.id = id;
+// this.loginName = loginName;
+// this.loginPwd = loginPwd;
+// }
+//}
+//
+//@Data
+//@XStreamAlias("role")
+////对应carInfos元素
+//class Role implements Serializable {
+// private static final long serialVersionUID = -3134157833696958743L;
+// @XStreamAsAttribute
+// private Integer id;
+// private String roleName;
+// private String roleCode;
+//
+// public Role() {
+// }
+//
+// public Role(Integer id, String roleName, String roleCode) {
+// this.id = id;
+// this.roleName = roleName;
+// this.roleCode = roleCode;
+// }
+//}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 8975679..6c327d0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -150,6 +150,11 @@
fastjson
1.2.49
+
+ com.thoughtworks.xstream
+ xstream
+ 1.4.11.1
+