From d017b8a8c3bec861f7f20f90418dd15fdd6cf31b Mon Sep 17 00:00:00 2001 From: yanghaiji Date: Wed, 12 Jun 2024 15:42:56 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=B9=E6=AF=94?= =?UTF-8?q?=E5=90=8E=E8=BF=94=E5=9B=9E=E5=AF=B9=E8=B1=A1=E7=9A=84=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E6=96=B9=E6=B3=95,=E5=B9=B6=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E6=B5=8B=E8=AF=95\=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CacheReflectionDiffBuilder.java | 6 ++- .../com/openquartz/javaobjdiff/DiffUtils.java | 44 +++++++++++++++++++ .../SimplePrefixToStringStyle.java | 3 ++ .../javaobjdiff/test/DiffUtilTest.java | 22 +++++++--- .../javaobjdiff/test/bean/Person.java | 21 ++++++++- 5 files changed, 86 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/openquartz/javaobjdiff/CacheReflectionDiffBuilder.java b/src/main/java/com/openquartz/javaobjdiff/CacheReflectionDiffBuilder.java index 80bd0a3..bf5f31d 100644 --- a/src/main/java/com/openquartz/javaobjdiff/CacheReflectionDiffBuilder.java +++ b/src/main/java/com/openquartz/javaobjdiff/CacheReflectionDiffBuilder.java @@ -53,11 +53,13 @@ public CacheReflectionDiffBuilder(final T lhs, final T rhs, final ToStringStyle this.diffBuilder = new DiffBuilder<>(lhs, rhs, style); } - public CacheReflectionDiffBuilder setExcludeFieldSet(Set excludeFieldSet) { + + public void setExcludeFieldSet(Set excludeFieldSet) { + // fix set后还是在当前对象,简化代码 this.excludeFieldSet = excludeFieldSet; - return this; } + @Override public DiffResult build() { if (left.equals(right)) { return diffBuilder.build(); diff --git a/src/main/java/com/openquartz/javaobjdiff/DiffUtils.java b/src/main/java/com/openquartz/javaobjdiff/DiffUtils.java index 06e2d67..f6f931f 100644 --- a/src/main/java/com/openquartz/javaobjdiff/DiffUtils.java +++ b/src/main/java/com/openquartz/javaobjdiff/DiffUtils.java @@ -33,4 +33,48 @@ public static String diff(T source, T target) { public static String diff(T source, T target, String... excludeField) { return diff(source, target, EMPTY, excludeField); } + + + /** + * 对比差异,并返回{@link DiffResult},可以更灵活的操作判断 + * + * @param source 源对象 + * @param target 目标对象 + * @param prefix 指定前缀,默认空字符串 + * @param excludeFiled 需要移除不对比的字段 + * @param + * @return 返回{@link DiffResult} + */ + public static DiffResult diffObj(T source, T target, String prefix, String... excludeFiled) { + CacheReflectionDiffBuilder diffBuilder = + new CacheReflectionDiffBuilder<>(source, target, new SimplePrefixToStringStyle(prefix)); + diffBuilder.setExcludeFieldSet(IteratorUtils.toSet(excludeFiled)); + return diffBuilder.build(); + } + + + /** + * 对比差异,并返回{@link DiffResult},可以更灵活的操作判断 + * + * @param source 源对象 + * @param target 目标对象 + * @param + * @return 返回{@link DiffResult} + */ + public static DiffResult diffObj(T source, T target) { + return diffObj(source, target, EMPTY, new String[]{}); + } + + /** + * 对比差异,并返回{@link DiffResult},可以更灵活的操作判断 + * + * @param source 源对象 + * @param target 目标对象 + * @param excludeField 需要移除不对比的字段 + * @param + * @return 返回{@link DiffResult} + */ + public static DiffResult diffObj(T source, T target, String... excludeField) { + return diffObj(source, target, EMPTY, excludeField); + } } diff --git a/src/main/java/com/openquartz/javaobjdiff/SimplePrefixToStringStyle.java b/src/main/java/com/openquartz/javaobjdiff/SimplePrefixToStringStyle.java index edca77c..8fe7353 100644 --- a/src/main/java/com/openquartz/javaobjdiff/SimplePrefixToStringStyle.java +++ b/src/main/java/com/openquartz/javaobjdiff/SimplePrefixToStringStyle.java @@ -24,6 +24,7 @@ public SimplePrefixToStringStyle(String prefix) { setUseIdentityHashCode(false); } + @Override protected void appendDetail(StringBuffer buffer, String fieldName, Object value) { buffer.append(value); } @@ -33,6 +34,7 @@ protected void appendDetail(StringBuffer buffer, String fieldName, Object value) * * @param useFieldNames the new useFieldNames flag */ + @Override protected void setUseFieldNames(final boolean useFieldNames) { this.useFieldNames = useFieldNames; super.setUseFieldNames(useFieldNames); @@ -43,6 +45,7 @@ protected void setUseFieldNames(final boolean useFieldNames) { * * @param fieldNameValueSeparator the new field name value separator text */ + @Override protected void setFieldNameValueSeparator(String fieldNameValueSeparator) { if (fieldNameValueSeparator == null) { fieldNameValueSeparator = StringUtils.EMPTY; diff --git a/src/test/java/com/openquartz/javaobjdiff/test/DiffUtilTest.java b/src/test/java/com/openquartz/javaobjdiff/test/DiffUtilTest.java index 00f27b2..6addd03 100644 --- a/src/test/java/com/openquartz/javaobjdiff/test/DiffUtilTest.java +++ b/src/test/java/com/openquartz/javaobjdiff/test/DiffUtilTest.java @@ -1,17 +1,19 @@ package com.openquartz.javaobjdiff.test; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import com.openquartz.javaobjdiff.DiffResult; import com.openquartz.javaobjdiff.DiffUtils; import com.openquartz.javaobjdiff.test.bean.Address; import com.openquartz.javaobjdiff.test.bean.Packet; import com.openquartz.javaobjdiff.test.bean.Person; import com.openquartz.javaobjdiff.test.bean.Sex; import com.openquartz.javaobjdiff.util.IteratorUtils; -import java.math.BigDecimal; -import java.time.LocalDateTime; public class DiffUtilTest { - public static void main(String[] args) { + public static void main(String[] args) { Address address1 = new Address(); address1.setCity("shanghai"); @@ -37,8 +39,8 @@ public static void main(String[] args) { person1.setIdCard("321556199301152110"); person1.setAddress(address1); person1.setBirthDate(LocalDateTime.now()); - person1.setFriendIdList(IteratorUtils.toList(1,2,3)); - person1.setPacketList(IteratorUtils.toList(packet1,packet2)); + person1.setFriendIdList(IteratorUtils.toList(1, 2, 3)); + person1.setPacketList(IteratorUtils.toList(packet1, packet2)); Packet packet3 = new Packet(); @@ -53,12 +55,20 @@ public static void main(String[] args) { person2.setIdCard("301556199301152110"); person2.setAddress(address2); person2.setBirthDate(LocalDateTime.now().plusDays(-10)); - person2.setFriendIdList(IteratorUtils.toList(2,3,4)); + person2.setFriendIdList(IteratorUtils.toList(2, 3, 4)); person2.setPacketList(IteratorUtils.toList(packet3)); String diff = DiffUtils.diff(person1, person2); System.out.println(diff); + // test diff obj ,根据需要返回object对象,方便后续操作流程 + DiffResult diffResult = DiffUtils.diffObj(person1, person2); + //根据是否存在差异决定使用的对象 + Person personDiff = null; + if (diffResult.isDiff()) { + personDiff = diffResult.getRight(); + } + System.out.println(personDiff.toString()); } } diff --git a/src/test/java/com/openquartz/javaobjdiff/test/bean/Person.java b/src/test/java/com/openquartz/javaobjdiff/test/bean/Person.java index 2b5b582..cfc2ac9 100644 --- a/src/test/java/com/openquartz/javaobjdiff/test/bean/Person.java +++ b/src/test/java/com/openquartz/javaobjdiff/test/bean/Person.java @@ -1,5 +1,8 @@ package com.openquartz.javaobjdiff.test.bean; +import java.time.LocalDateTime; +import java.util.List; + import com.openquartz.javaobjdiff.annotation.DiffBean; import com.openquartz.javaobjdiff.annotation.DiffCompare; import com.openquartz.javaobjdiff.annotation.DiffFormat; @@ -8,8 +11,6 @@ import com.openquartz.javaobjdiff.formatter.datamask.EmailDataMask; import com.openquartz.javaobjdiff.formatter.datamask.IdCardDataMask; import com.openquartz.javaobjdiff.formatter.datamask.MobileDataMask; -import java.time.LocalDateTime; -import java.util.List; public class Person { @@ -121,4 +122,20 @@ public String getIdCard() { public void setIdCard(String idCard) { this.idCard = idCard; } + + @Override + public String toString() { + return "{" + + "name:'" + name + '\'' + + ", sex:" + sex + + ", mobile:'" + mobile + '\'' + + ", email:'" + email + '\'' + + ", idCard:'" + idCard + '\'' + + ", age:" + age + + ", birthDate:" + birthDate + + ", address:" + address + + ", packetList:" + packetList + + ", friendIdList:" + friendIdList + + '}'; + } } From b82edf6838b49b11ba6cb9ad654f39adc65f648b Mon Sep 17 00:00:00 2001 From: yanghaiji Date: Thu, 13 Jun 2024 14:31:57 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/openquartz/javaobjdiff/DiffUtils.java | 68 +++++++++---------- 1 file changed, 33 insertions(+), 35 deletions(-) diff --git a/src/main/java/com/openquartz/javaobjdiff/DiffUtils.java b/src/main/java/com/openquartz/javaobjdiff/DiffUtils.java index f6f931f..5809c1d 100644 --- a/src/main/java/com/openquartz/javaobjdiff/DiffUtils.java +++ b/src/main/java/com/openquartz/javaobjdiff/DiffUtils.java @@ -1,7 +1,7 @@ package com.openquartz.javaobjdiff; -import com.openquartz.javaobjdiff.util.IteratorUtils; import org.apache.commons.lang3.builder.ToStringStyle; +import com.openquartz.javaobjdiff.util.IteratorUtils; /** * @author svnee @@ -13,17 +13,13 @@ public class DiffUtils { private DiffUtils() { } - public static String diff(T source, T target, ToStringStyle toStringStyle, String... excludeFiled) { - CacheReflectionDiffBuilder diffBuilder = new CacheReflectionDiffBuilder<>(source, target, toStringStyle); - diffBuilder.setExcludeFieldSet(IteratorUtils.toSet(excludeFiled)); - return diffBuilder.build().toString(); + public static String diff(T source, T target, ToStringStyle toStringStyle, String... excludeField) { + return buildDiff(source, target, toStringStyle, excludeField).toString(); } - public static String diff(T source, T target, String prefix, String... excludeFiled) { - CacheReflectionDiffBuilder diffBuilder = - new CacheReflectionDiffBuilder<>(source, target, new SimplePrefixToStringStyle(prefix)); - diffBuilder.setExcludeFieldSet(IteratorUtils.toSet(excludeFiled)); - return diffBuilder.build().toString(); + public static String diff(T source, T target, String prefix, String... excludeField) { + ToStringStyle toStringStyle = new SimplePrefixToStringStyle(prefix); + return buildDiff(source, target, toStringStyle, excludeField).toString(); } public static String diff(T source, T target) { @@ -34,47 +30,49 @@ public static String diff(T source, T target, String... excludeField) { return diff(source, target, EMPTY, excludeField); } - /** - * 对比差异,并返回{@link DiffResult},可以更灵活的操作判断 + * Compare differences and return {@link DiffResult} for more flexible operation and judgment. * - * @param source 源对象 - * @param target 目标对象 - * @param prefix 指定前缀,默认空字符串 - * @param excludeFiled 需要移除不对比的字段 - * @param - * @return 返回{@link DiffResult} + * @param source Source object + * @param target Target object + * @param prefix Specified prefix, default is empty string + * @param excludeField Fields to exclude from comparison + * @param Type of objects to compare + * @return {@link DiffResult} */ - public static DiffResult diffObj(T source, T target, String prefix, String... excludeFiled) { - CacheReflectionDiffBuilder diffBuilder = - new CacheReflectionDiffBuilder<>(source, target, new SimplePrefixToStringStyle(prefix)); - diffBuilder.setExcludeFieldSet(IteratorUtils.toSet(excludeFiled)); - return diffBuilder.build(); + public static DiffResult diffObj(T source, T target, String prefix, String... excludeField) { + ToStringStyle toStringStyle = new SimplePrefixToStringStyle(prefix); + return buildDiff(source, target, toStringStyle, excludeField); } - /** - * 对比差异,并返回{@link DiffResult},可以更灵活的操作判断 + * Compare differences and return {@link DiffResult} for more flexible operation and judgment. * - * @param source 源对象 - * @param target 目标对象 - * @param - * @return 返回{@link DiffResult} + * @param source Source object + * @param target Target object + * @param Type of objects to compare + * @return {@link DiffResult} */ public static DiffResult diffObj(T source, T target) { return diffObj(source, target, EMPTY, new String[]{}); } /** - * 对比差异,并返回{@link DiffResult},可以更灵活的操作判断 + * Compare differences and return {@link DiffResult} for more flexible operation and judgment. * - * @param source 源对象 - * @param target 目标对象 - * @param excludeField 需要移除不对比的字段 - * @param - * @return 返回{@link DiffResult} + * @param source Source object + * @param target Target object + * @param excludeField Fields to exclude from comparison + * @param Type of objects to compare + * @return {@link DiffResult} */ public static DiffResult diffObj(T source, T target, String... excludeField) { return diffObj(source, target, EMPTY, excludeField); } + + private static DiffResult buildDiff(T source, T target, ToStringStyle toStringStyle, String... excludeField) { + CacheReflectionDiffBuilder diffBuilder = new CacheReflectionDiffBuilder<>(source, target, toStringStyle); + diffBuilder.setExcludeFieldSet(IteratorUtils.toSet(excludeField)); + return diffBuilder.build(); + } }