From 89c722ae78f3b89af04e593f8f9da3b8bca67826 Mon Sep 17 00:00:00 2001 From: zhou-hao Date: Mon, 11 Feb 2019 18:51:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AE=9E=E4=BD=93=E7=B1=BB?= =?UTF-8?q?=E5=AF=B9=E6=AF=94=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hswebframework/web/bean/CompareUtils.java | 196 ++++++++++++++++++ .../hswebframework/web/bean/diff/Diff.java | 19 ++ .../web/bean/diff/DiffBean.java | 23 ++ .../web/bean/CompareUtilsTest.java | 75 +++++++ 4 files changed, 313 insertions(+) create mode 100644 hsweb-core/src/main/java/org/hswebframework/web/bean/CompareUtils.java create mode 100644 hsweb-core/src/main/java/org/hswebframework/web/bean/diff/Diff.java create mode 100644 hsweb-core/src/main/java/org/hswebframework/web/bean/diff/DiffBean.java create mode 100644 hsweb-core/src/test/java/org/hswebframework/web/bean/CompareUtilsTest.java diff --git a/hsweb-core/src/main/java/org/hswebframework/web/bean/CompareUtils.java b/hsweb-core/src/main/java/org/hswebframework/web/bean/CompareUtils.java new file mode 100644 index 000000000..f66718839 --- /dev/null +++ b/hsweb-core/src/main/java/org/hswebframework/web/bean/CompareUtils.java @@ -0,0 +1,196 @@ +package org.hswebframework.web.bean; + +import org.hswebframework.utils.StringUtils; +import org.hswebframework.utils.time.DateFormatter; +import org.hswebframework.web.dict.EnumDict; +import org.springframework.util.CollectionUtils; + +import java.math.BigDecimal; +import java.util.*; + +public abstract class CompareUtils { + + public static boolean compare(Object source, Object target) { + if (source == target) { + return true; + } + + if (source == null || target == null) { + return false; + } + + if (source.equals(target)) { + return true; + } + if (source instanceof Number) { + return compare(((Number) source), target); + } + if (target instanceof Number) { + return compare(((Number) target), source); + } + + if (source instanceof Date) { + return compare(((Date) source), target); + } + + if (target instanceof Date) { + return compare(((Date) target), source); + } + + if (source instanceof String) { + return compare(((String) source), target); + } + + if (target instanceof String) { + return compare(((String) target), source); + } + if (source instanceof Collection) { + return compare(((Collection) source), target); + } + + if (target instanceof Collection) { + return compare(((Collection) target), source); + } + + if (source instanceof Map) { + return compare(((Map) source), target); + } + + if (target instanceof Map) { + return compare(((Map) target), source); + } + + if (source.getClass().isEnum()) { + return compare(((Enum) source), target); + } + + if (target.getClass().isEnum()) { + return compare(((Enum) target), source); + } + + if (source.getClass().isArray()) { + return compare(((Object[]) source), target); + } + + if (target.getClass().isArray()) { + return compare(((Object[]) target), source); + } + + + return false; + + } + + public static boolean compare(Map collection, Object target) { + + + return false; + } + + public static boolean compare(Collection collection, Object target) { + + int size = collection.size(); + + Collection targetCollection = null; + if (target instanceof String) { + target = ((String) target).split("[, ;]"); + } + if (target instanceof Collection) { + targetCollection = ((Collection) target); + } else if (target.getClass().isArray()) { + targetCollection = Arrays.asList(((Object[]) target)); + } + if (targetCollection == null) { + return false; + } + if (size != targetCollection.size()) { + return false; + } + + + //[1,2,3] ,[3,3,3] + // return targetCollection.stream().allMatch(object -> {}); + + return false; + } + + public static boolean compare(Object[] number, Object target) { + + + return compare(Arrays.asList(number), target); + } + + public static boolean compare(Number number, Object target) { + if (target.equals(number)) { + return true; + } + if (target instanceof Number) { + return number.doubleValue() == ((Number) target).doubleValue(); + } + if (target instanceof Date) { + return number.longValue() == ((Date) target).getTime(); + } + if (target instanceof String) { + //日期格式的字符串? + String stringValue = String.valueOf(target); + if (DateFormatter.isSupport(stringValue)) { + //格式化为相同格式的字符串进行对比 + DateFormatter dateFormatter = DateFormatter.getFormatter(stringValue); + return (dateFormatter.toString(new Date(number.longValue())).equals(stringValue)); + } + if (StringUtils.isNumber(target)) { + return new BigDecimal(stringValue).doubleValue() == number.doubleValue(); + } + } + + return false; + } + + public static boolean compare(Enum e, Object target) { + String stringValue = String.valueOf(target); + if (e instanceof EnumDict) { + EnumDict dict = ((EnumDict) e); + return e.name().equalsIgnoreCase(stringValue) || dict.eq(target); + } + + return e.name().equalsIgnoreCase(stringValue); + } + + public static boolean compare(String string, Object target) { + + if (string.equals(String.valueOf(target))) { + return true; + } + + if (target instanceof Date) { + Date date = DateFormatter.fromString(string); + return (date != null && ((Date) target).getTime() == date.getTime()); + } + + return false; + } + + public static boolean compare(Date date, Object target) { + if (target instanceof Date) { + return date.getTime() == ((Date) target).getTime(); + } + + if (target instanceof String) { + //日期格式的字符串? + String stringValue = String.valueOf(target); + if (DateFormatter.isSupport(stringValue)) { + //格式化为相同格式的字符串进行对比 + DateFormatter dateFormatter = DateFormatter.getFormatter(stringValue); + return (dateFormatter.toString(date).equals(stringValue)); + } + } + + if (target instanceof Number) { + long longValue = ((Number) target).longValue(); + return date.getTime() == longValue; + } + + return false; + } + +} diff --git a/hsweb-core/src/main/java/org/hswebframework/web/bean/diff/Diff.java b/hsweb-core/src/main/java/org/hswebframework/web/bean/diff/Diff.java new file mode 100644 index 000000000..20d9eb3bf --- /dev/null +++ b/hsweb-core/src/main/java/org/hswebframework/web/bean/diff/Diff.java @@ -0,0 +1,19 @@ +package org.hswebframework.web.bean.diff; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class Diff { + + private String fieldName; + + private String fieldComment; + + private Object before; + + private Object after; + + +} diff --git a/hsweb-core/src/main/java/org/hswebframework/web/bean/diff/DiffBean.java b/hsweb-core/src/main/java/org/hswebframework/web/bean/diff/DiffBean.java new file mode 100644 index 000000000..aa6048e79 --- /dev/null +++ b/hsweb-core/src/main/java/org/hswebframework/web/bean/diff/DiffBean.java @@ -0,0 +1,23 @@ +package org.hswebframework.web.bean.diff; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +public class DiffBean { + + private Object before; + + private Object after; + + private List diffs; + + + + + + public List getDiffs() { + return diffs; + } +} diff --git a/hsweb-core/src/test/java/org/hswebframework/web/bean/CompareUtilsTest.java b/hsweb-core/src/test/java/org/hswebframework/web/bean/CompareUtilsTest.java new file mode 100644 index 000000000..873b0ea5d --- /dev/null +++ b/hsweb-core/src/test/java/org/hswebframework/web/bean/CompareUtilsTest.java @@ -0,0 +1,75 @@ +package org.hswebframework.web.bean; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.hswebframework.utils.time.DateFormatter; +import org.hswebframework.web.dict.EnumDict; +import org.junit.Assert; +import org.junit.Test; + +import java.math.BigDecimal; +import java.util.Date; + +import static org.junit.Assert.*; + +public class CompareUtilsTest { + + + @Test + public void compareTest() { + Assert.assertTrue(CompareUtils.compare(1, "1")); + Assert.assertTrue(CompareUtils.compare("1", 1)); + + Assert.assertFalse(CompareUtils.compare(1, "1a")); + + Assert.assertTrue(CompareUtils.compare(TestEnum.BLUE, "blue")); + + Assert.assertFalse(CompareUtils.compare(TestEnum.RED, "blue")); + + + Assert.assertTrue(CompareUtils.compare(TestEnumDic.BLUE, "blue")); + + Assert.assertFalse(CompareUtils.compare(TestEnumDic.RED, "blue")); + + + Assert.assertTrue(CompareUtils.compare(TestEnumDic.BLUE, "蓝色")); + + Assert.assertFalse(CompareUtils.compare(TestEnumDic.RED, "蓝色")); + + + Assert.assertTrue(CompareUtils.compare(DateFormatter.fromString("20180101"), "20180101")); + + Date date = new Date(); + + Assert.assertTrue(CompareUtils.compare(date, new Date(date.getTime()))); + Assert.assertTrue(CompareUtils.compare(date, DateFormatter.toString(date, "yyyy-MM-dd"))); + Assert.assertTrue(CompareUtils.compare(date, DateFormatter.toString(date, "yyyy-MM-dd HH:mm:ss"))); + + + Assert.assertTrue(CompareUtils.compare(date, date.getTime())); + Assert.assertTrue(CompareUtils.compare(date.getTime(), date)); + + + Assert.assertTrue(CompareUtils.compare(100,new BigDecimal("100"))); + + Assert.assertTrue(CompareUtils.compare(new BigDecimal("100"),100.0D)); + + + } + + + enum TestEnum { + RED, BLUE + } + + @Getter + @AllArgsConstructor + enum TestEnumDic implements EnumDict { + RED("RED", "红色"), BLUE("BLUE", "蓝色"); + + private String value; + private String text; + + } + +} \ No newline at end of file