From cc35b46f4eae32e660fb6d55bd3dd170f4f46e68 Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 27 Apr 2022 16:02:28 +0800 Subject: [PATCH 0001/1737] 5.8.0.M4 --- CHANGELOG.md | 0 README-EN.md | 0 README.md | 0 docs/js/version.js | 0 hutool-all/pom.xml | 0 hutool-aop/pom.xml | 0 hutool-bloomFilter/pom.xml | 0 hutool-bom/pom.xml | 0 hutool-cache/pom.xml | 0 hutool-cache/src/main/java/cn/hutool/cache/impl/WeakCache.java | 0 hutool-cache/src/test/java/cn/hutool/cache/WeakCacheTest.java | 0 hutool-captcha/pom.xml | 0 hutool-core/pom.xml | 0 .../src/main/java/cn/hutool/core/annotation/AnnotationUtil.java | 0 .../cn/hutool/core/annotation/CombinationAnnotationElement.java | 0 hutool-core/src/main/java/cn/hutool/core/bean/BeanDescCache.java | 0 hutool-core/src/main/java/cn/hutool/core/bean/BeanInfoCache.java | 0 hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java | 0 .../src/main/java/cn/hutool/core/collection/UniqueKeySet.java | 0 .../src/main/java/cn/hutool/core/convert/impl/EnumConverter.java | 0 hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/date/Week.java | 0 hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/io/file/Tailer.java | 0 hutool-core/src/main/java/cn/hutool/core/lang/PatternPool.java | 0 hutool-core/src/main/java/cn/hutool/core/lang/SimpleCache.java | 0 hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java | 0 .../src/main/java/cn/hutool/core/lang/caller/CallerUtil.java | 0 .../src/main/java/cn/hutool/core/lang/func/LambdaUtil.java | 0 .../src/main/java/cn/hutool/core/lang/intern/WeakInterner.java | 0 .../java/cn/hutool/core/lang/reflect/ActualTypeMapperPool.java | 0 hutool-core/src/main/java/cn/hutool/core/map/CustomKeyMap.java | 0 hutool-core/src/main/java/cn/hutool/core/map/FuncKeyMap.java | 0 hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java | 0 hutool-core/src/main/java/cn/hutool/core/map/TableMap.java | 0 .../src/main/java/cn/hutool/core/map/multi/RowKeyTable.java | 0 hutool-core/src/main/java/cn/hutool/core/map/multi/Table.java | 0 hutool-core/src/main/java/cn/hutool/core/net/RFC3986.java | 0 .../src/main/java/cn/hutool/core/text/CharSequenceUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/text/StrMatcher.java | 0 hutool-core/src/main/java/cn/hutool/core/thread/lock/NoLock.java | 0 hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java | 0 .../src/main/java/cn/hutool/core/util/ClassLoaderUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/util/ClassUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java | 0 .../test/java/cn/hutool/core/annotation/AnnotationForTest.java | 0 .../test/java/cn/hutool/core/annotation/AnnotationUtilTest.java | 0 hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java | 0 .../src/test/java/cn/hutool/core/collection/CollUtilTest.java | 0 hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java | 0 hutool-core/src/test/java/cn/hutool/core/io/FileTypeUtilTest.java | 0 hutool-core/src/test/java/cn/hutool/core/lang/ConsoleTest.java | 0 .../src/test/java/cn/hutool/core/lang/SimpleCacheTest.java | 0 .../src/test/java/cn/hutool/core/text/CharSequenceUtilTest.java | 0 hutool-core/src/test/java/cn/hutool/core/text/StrMatcherTest.java | 0 .../src/test/java/cn/hutool/core/text/csv/CsvWriterTest.java | 0 hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java | 0 .../src/test/java/cn/hutool/core/util/ReflectUtilTest.java | 0 hutool-cron/pom.xml | 0 hutool-cron/src/main/java/cn/hutool/cron/pattern/CronPattern.java | 0 .../main/java/cn/hutool/cron/pattern/matcher/PatternMatcher.java | 0 hutool-crypto/pom.xml | 0 hutool-db/pom.xml | 0 hutool-dfa/pom.xml | 0 hutool-extra/pom.xml | 0 .../src/main/java/cn/hutool/extra/cglib/BeanCopierCache.java | 0 hutool-extra/src/main/java/cn/hutool/extra/ftp/Ftp.java | 0 hutool-extra/src/main/java/cn/hutool/extra/mail/MailAccount.java | 0 .../src/main/java/cn/hutool/extra/servlet/ServletUtil.java | 0 hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java | 0 .../src/test/java/cn/hutool/extra/servlet/ServletUtilTest.java | 0 hutool-http/pom.xml | 0 hutool-http/src/main/java/cn/hutool/http/GlobalInterceptor.java | 0 hutool-http/src/main/java/cn/hutool/http/HttpRequest.java | 0 hutool-json/pom.xml | 0 hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java | 0 hutool-json/src/main/java/cn/hutool/json/JSONArray.java | 0 hutool-json/src/main/java/cn/hutool/json/JSONObject.java | 0 hutool-json/src/main/java/cn/hutool/json/JSONTokener.java | 0 hutool-json/src/main/java/cn/hutool/json/JSONUtil.java | 0 hutool-json/src/test/java/cn/hutool/json/JSONArrayTest.java | 0 hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java | 0 hutool-jwt/pom.xml | 0 hutool-log/pom.xml | 0 .../src/main/java/cn/hutool/log/dialect/console/ConsoleLog.java | 0 .../src/main/java/cn/hutool/log/dialect/tinylog/TinyLog2.java | 0 hutool-log/src/test/java/cn/hutool/log/test/StaticLogTest.java | 0 hutool-poi/pom.xml | 0 hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java | 0 hutool-poi/src/test/java/cn/hutool/poi/excel/Issue2221Test.java | 0 hutool-script/pom.xml | 0 hutool-script/src/main/java/cn/hutool/script/ScriptUtil.java | 0 hutool-setting/pom.xml | 0 hutool-socket/pom.xml | 0 hutool-system/pom.xml | 0 pom.xml | 0 99 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 CHANGELOG.md mode change 100644 => 100755 README-EN.md mode change 100644 => 100755 README.md mode change 100644 => 100755 docs/js/version.js mode change 100644 => 100755 hutool-all/pom.xml mode change 100644 => 100755 hutool-aop/pom.xml mode change 100644 => 100755 hutool-bloomFilter/pom.xml mode change 100644 => 100755 hutool-bom/pom.xml mode change 100644 => 100755 hutool-cache/pom.xml mode change 100644 => 100755 hutool-cache/src/main/java/cn/hutool/cache/impl/WeakCache.java mode change 100644 => 100755 hutool-cache/src/test/java/cn/hutool/cache/WeakCacheTest.java mode change 100644 => 100755 hutool-captcha/pom.xml mode change 100644 => 100755 hutool-core/pom.xml mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/annotation/CombinationAnnotationElement.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/bean/BeanDescCache.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/bean/BeanInfoCache.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/collection/UniqueKeySet.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/convert/impl/EnumConverter.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/date/Week.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/io/file/Tailer.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/PatternPool.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/SimpleCache.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/caller/CallerUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/intern/WeakInterner.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/reflect/ActualTypeMapperPool.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/map/CustomKeyMap.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/map/FuncKeyMap.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/map/TableMap.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/map/multi/RowKeyTable.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/map/multi/Table.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/net/RFC3986.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/text/StrMatcher.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/thread/lock/NoLock.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/util/ClassLoaderUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/util/ClassUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationForTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationUtilTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/io/FileTypeUtilTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/lang/ConsoleTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/lang/SimpleCacheTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/text/CharSequenceUtilTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/text/StrMatcherTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/text/csv/CsvWriterTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/util/ReflectUtilTest.java mode change 100644 => 100755 hutool-cron/pom.xml mode change 100644 => 100755 hutool-cron/src/main/java/cn/hutool/cron/pattern/CronPattern.java mode change 100644 => 100755 hutool-cron/src/main/java/cn/hutool/cron/pattern/matcher/PatternMatcher.java mode change 100644 => 100755 hutool-crypto/pom.xml mode change 100644 => 100755 hutool-db/pom.xml mode change 100644 => 100755 hutool-dfa/pom.xml mode change 100644 => 100755 hutool-extra/pom.xml mode change 100644 => 100755 hutool-extra/src/main/java/cn/hutool/extra/cglib/BeanCopierCache.java mode change 100644 => 100755 hutool-extra/src/main/java/cn/hutool/extra/ftp/Ftp.java mode change 100644 => 100755 hutool-extra/src/main/java/cn/hutool/extra/mail/MailAccount.java mode change 100644 => 100755 hutool-extra/src/main/java/cn/hutool/extra/servlet/ServletUtil.java mode change 100644 => 100755 hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java mode change 100644 => 100755 hutool-extra/src/test/java/cn/hutool/extra/servlet/ServletUtilTest.java mode change 100644 => 100755 hutool-http/pom.xml mode change 100644 => 100755 hutool-http/src/main/java/cn/hutool/http/GlobalInterceptor.java mode change 100644 => 100755 hutool-http/src/main/java/cn/hutool/http/HttpRequest.java mode change 100644 => 100755 hutool-json/pom.xml mode change 100644 => 100755 hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java mode change 100644 => 100755 hutool-json/src/main/java/cn/hutool/json/JSONArray.java mode change 100644 => 100755 hutool-json/src/main/java/cn/hutool/json/JSONObject.java mode change 100644 => 100755 hutool-json/src/main/java/cn/hutool/json/JSONTokener.java mode change 100644 => 100755 hutool-json/src/main/java/cn/hutool/json/JSONUtil.java mode change 100644 => 100755 hutool-json/src/test/java/cn/hutool/json/JSONArrayTest.java mode change 100644 => 100755 hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java mode change 100644 => 100755 hutool-jwt/pom.xml mode change 100644 => 100755 hutool-log/pom.xml mode change 100644 => 100755 hutool-log/src/main/java/cn/hutool/log/dialect/console/ConsoleLog.java mode change 100644 => 100755 hutool-log/src/main/java/cn/hutool/log/dialect/tinylog/TinyLog2.java mode change 100644 => 100755 hutool-log/src/test/java/cn/hutool/log/test/StaticLogTest.java mode change 100644 => 100755 hutool-poi/pom.xml mode change 100644 => 100755 hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java mode change 100644 => 100755 hutool-poi/src/test/java/cn/hutool/poi/excel/Issue2221Test.java mode change 100644 => 100755 hutool-script/pom.xml mode change 100644 => 100755 hutool-script/src/main/java/cn/hutool/script/ScriptUtil.java mode change 100644 => 100755 hutool-setting/pom.xml mode change 100644 => 100755 hutool-socket/pom.xml mode change 100644 => 100755 hutool-system/pom.xml mode change 100644 => 100755 pom.xml diff --git a/CHANGELOG.md b/CHANGELOG.md old mode 100644 new mode 100755 diff --git a/README-EN.md b/README-EN.md old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/docs/js/version.js b/docs/js/version.js old mode 100644 new mode 100755 diff --git a/hutool-all/pom.xml b/hutool-all/pom.xml old mode 100644 new mode 100755 diff --git a/hutool-aop/pom.xml b/hutool-aop/pom.xml old mode 100644 new mode 100755 diff --git a/hutool-bloomFilter/pom.xml b/hutool-bloomFilter/pom.xml old mode 100644 new mode 100755 diff --git a/hutool-bom/pom.xml b/hutool-bom/pom.xml old mode 100644 new mode 100755 diff --git a/hutool-cache/pom.xml b/hutool-cache/pom.xml old mode 100644 new mode 100755 diff --git a/hutool-cache/src/main/java/cn/hutool/cache/impl/WeakCache.java b/hutool-cache/src/main/java/cn/hutool/cache/impl/WeakCache.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/test/java/cn/hutool/cache/WeakCacheTest.java b/hutool-cache/src/test/java/cn/hutool/cache/WeakCacheTest.java old mode 100644 new mode 100755 diff --git a/hutool-captcha/pom.xml b/hutool-captcha/pom.xml old mode 100644 new mode 100755 diff --git a/hutool-core/pom.xml b/hutool-core/pom.xml old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java b/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/CombinationAnnotationElement.java b/hutool-core/src/main/java/cn/hutool/core/annotation/CombinationAnnotationElement.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanDescCache.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanDescCache.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanInfoCache.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanInfoCache.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/UniqueKeySet.java b/hutool-core/src/main/java/cn/hutool/core/collection/UniqueKeySet.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/EnumConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/EnumConverter.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/date/Week.java b/hutool-core/src/main/java/cn/hutool/core/date/Week.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/Tailer.java b/hutool-core/src/main/java/cn/hutool/core/io/file/Tailer.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/PatternPool.java b/hutool-core/src/main/java/cn/hutool/core/lang/PatternPool.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/SimpleCache.java b/hutool-core/src/main/java/cn/hutool/core/lang/SimpleCache.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java b/hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/caller/CallerUtil.java b/hutool-core/src/main/java/cn/hutool/core/lang/caller/CallerUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaUtil.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/intern/WeakInterner.java b/hutool-core/src/main/java/cn/hutool/core/lang/intern/WeakInterner.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/reflect/ActualTypeMapperPool.java b/hutool-core/src/main/java/cn/hutool/core/lang/reflect/ActualTypeMapperPool.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/map/CustomKeyMap.java b/hutool-core/src/main/java/cn/hutool/core/map/CustomKeyMap.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/map/FuncKeyMap.java b/hutool-core/src/main/java/cn/hutool/core/map/FuncKeyMap.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java b/hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/map/TableMap.java b/hutool-core/src/main/java/cn/hutool/core/map/TableMap.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/map/multi/RowKeyTable.java b/hutool-core/src/main/java/cn/hutool/core/map/multi/RowKeyTable.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/map/multi/Table.java b/hutool-core/src/main/java/cn/hutool/core/map/multi/Table.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/net/RFC3986.java b/hutool-core/src/main/java/cn/hutool/core/net/RFC3986.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/text/StrMatcher.java b/hutool-core/src/main/java/cn/hutool/core/text/StrMatcher.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/lock/NoLock.java b/hutool-core/src/main/java/cn/hutool/core/thread/lock/NoLock.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ClassLoaderUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ClassLoaderUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ClassUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ClassUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationForTest.java b/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationForTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/annotation/AnnotationUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/io/FileTypeUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/io/FileTypeUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/ConsoleTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/ConsoleTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/SimpleCacheTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/SimpleCacheTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/text/CharSequenceUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/text/CharSequenceUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/text/StrMatcherTest.java b/hutool-core/src/test/java/cn/hutool/core/text/StrMatcherTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvWriterTest.java b/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvWriterTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ReflectUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ReflectUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-cron/pom.xml b/hutool-cron/pom.xml old mode 100644 new mode 100755 diff --git a/hutool-cron/src/main/java/cn/hutool/cron/pattern/CronPattern.java b/hutool-cron/src/main/java/cn/hutool/cron/pattern/CronPattern.java old mode 100644 new mode 100755 diff --git a/hutool-cron/src/main/java/cn/hutool/cron/pattern/matcher/PatternMatcher.java b/hutool-cron/src/main/java/cn/hutool/cron/pattern/matcher/PatternMatcher.java old mode 100644 new mode 100755 diff --git a/hutool-crypto/pom.xml b/hutool-crypto/pom.xml old mode 100644 new mode 100755 diff --git a/hutool-db/pom.xml b/hutool-db/pom.xml old mode 100644 new mode 100755 diff --git a/hutool-dfa/pom.xml b/hutool-dfa/pom.xml old mode 100644 new mode 100755 diff --git a/hutool-extra/pom.xml b/hutool-extra/pom.xml old mode 100644 new mode 100755 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/cglib/BeanCopierCache.java b/hutool-extra/src/main/java/cn/hutool/extra/cglib/BeanCopierCache.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ftp/Ftp.java b/hutool-extra/src/main/java/cn/hutool/extra/ftp/Ftp.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/mail/MailAccount.java b/hutool-extra/src/main/java/cn/hutool/extra/mail/MailAccount.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/servlet/ServletUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/servlet/ServletUtil.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java b/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/test/java/cn/hutool/extra/servlet/ServletUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/servlet/ServletUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-http/pom.xml b/hutool-http/pom.xml old mode 100644 new mode 100755 diff --git a/hutool-http/src/main/java/cn/hutool/http/GlobalInterceptor.java b/hutool-http/src/main/java/cn/hutool/http/GlobalInterceptor.java old mode 100644 new mode 100755 diff --git a/hutool-http/src/main/java/cn/hutool/http/HttpRequest.java b/hutool-http/src/main/java/cn/hutool/http/HttpRequest.java old mode 100644 new mode 100755 diff --git a/hutool-json/pom.xml b/hutool-json/pom.xml old mode 100644 new mode 100755 diff --git a/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java b/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java old mode 100644 new mode 100755 diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONArray.java b/hutool-json/src/main/java/cn/hutool/json/JSONArray.java old mode 100644 new mode 100755 diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONObject.java b/hutool-json/src/main/java/cn/hutool/json/JSONObject.java old mode 100644 new mode 100755 diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONTokener.java b/hutool-json/src/main/java/cn/hutool/json/JSONTokener.java old mode 100644 new mode 100755 diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java b/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java old mode 100644 new mode 100755 diff --git a/hutool-json/src/test/java/cn/hutool/json/JSONArrayTest.java b/hutool-json/src/test/java/cn/hutool/json/JSONArrayTest.java old mode 100644 new mode 100755 diff --git a/hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java b/hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java old mode 100644 new mode 100755 diff --git a/hutool-jwt/pom.xml b/hutool-jwt/pom.xml old mode 100644 new mode 100755 diff --git a/hutool-log/pom.xml b/hutool-log/pom.xml old mode 100644 new mode 100755 diff --git a/hutool-log/src/main/java/cn/hutool/log/dialect/console/ConsoleLog.java b/hutool-log/src/main/java/cn/hutool/log/dialect/console/ConsoleLog.java old mode 100644 new mode 100755 diff --git a/hutool-log/src/main/java/cn/hutool/log/dialect/tinylog/TinyLog2.java b/hutool-log/src/main/java/cn/hutool/log/dialect/tinylog/TinyLog2.java old mode 100644 new mode 100755 diff --git a/hutool-log/src/test/java/cn/hutool/log/test/StaticLogTest.java b/hutool-log/src/test/java/cn/hutool/log/test/StaticLogTest.java old mode 100644 new mode 100755 diff --git a/hutool-poi/pom.xml b/hutool-poi/pom.xml old mode 100644 new mode 100755 diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java old mode 100644 new mode 100755 diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/Issue2221Test.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/Issue2221Test.java old mode 100644 new mode 100755 diff --git a/hutool-script/pom.xml b/hutool-script/pom.xml old mode 100644 new mode 100755 diff --git a/hutool-script/src/main/java/cn/hutool/script/ScriptUtil.java b/hutool-script/src/main/java/cn/hutool/script/ScriptUtil.java old mode 100644 new mode 100755 diff --git a/hutool-setting/pom.xml b/hutool-setting/pom.xml old mode 100644 new mode 100755 diff --git a/hutool-socket/pom.xml b/hutool-socket/pom.xml old mode 100644 new mode 100755 diff --git a/hutool-system/pom.xml b/hutool-system/pom.xml old mode 100644 new mode 100755 diff --git a/pom.xml b/pom.xml old mode 100644 new mode 100755 -- Gitee From 2917cb79342a9d2750363151fcbae05c9bbaca15 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 28 Apr 2022 11:42:25 +0800 Subject: [PATCH 0002/1737] fix code --- hutool-core/src/main/java/cn/hutool/core/lang/tree/TreeUtil.java | 0 .../src/test/java/cn/hutool/core/lang/tree/Issue2279Test.java | 0 hutool-db/src/main/java/cn/hutool/db/nosql/redis/RedisDS.java | 0 .../src/main/java/cn/hutool/extra/validation/ValidationUtil.java | 0 .../java/cn/hutool/extra/validation/BeanValidatorUtilTest.java | 0 5 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/tree/TreeUtil.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/lang/tree/Issue2279Test.java mode change 100644 => 100755 hutool-db/src/main/java/cn/hutool/db/nosql/redis/RedisDS.java mode change 100644 => 100755 hutool-extra/src/main/java/cn/hutool/extra/validation/ValidationUtil.java mode change 100644 => 100755 hutool-extra/src/test/java/cn/hutool/extra/validation/BeanValidatorUtilTest.java diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/tree/TreeUtil.java b/hutool-core/src/main/java/cn/hutool/core/lang/tree/TreeUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/tree/Issue2279Test.java b/hutool-core/src/test/java/cn/hutool/core/lang/tree/Issue2279Test.java old mode 100644 new mode 100755 diff --git a/hutool-db/src/main/java/cn/hutool/db/nosql/redis/RedisDS.java b/hutool-db/src/main/java/cn/hutool/db/nosql/redis/RedisDS.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/validation/ValidationUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/validation/ValidationUtil.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/test/java/cn/hutool/extra/validation/BeanValidatorUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/validation/BeanValidatorUtilTest.java old mode 100644 new mode 100755 -- Gitee From 89d481da523eaf8553fde9cf67b61713adc3322e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B8=BF=E8=BE=BE?= Date: Thu, 28 Apr 2022 15:58:02 +0800 Subject: [PATCH 0003/1737] =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E5=8D=95=E4=BE=8B?= =?UTF-8?q?=E6=B1=A0=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=96=B0=E5=A2=9E=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E7=B1=BB=E6=98=AF=E5=90=A6=E5=AD=98=E5=9C=A8=E5=92=8C?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=89=80=E6=9C=89=E5=AD=98=E5=9C=A8=E7=9A=84?= =?UTF-8?q?=E7=B1=BB=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/lang/Singleton.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java b/hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java index a4f2101003..ba49e1e99a 100755 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java @@ -6,7 +6,11 @@ import cn.hutool.core.util.ClassUtil; import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; /** * 单例类
@@ -90,6 +94,30 @@ public final class Singleton { POOL.put(key, obj); } + /** + * 判断某个类的对象是否存在 + * + * @param clazz 类 + * @param params 构造参数 + * @return 是否存在 + */ + public static boolean exists(Class clazz, Object... params){ + if (null != clazz){ + final String key = buildKey(clazz.getName(), params); + return POOL.containsKey(key); + } + return false; + } + + /** + * 获取单例池中存在的所有类 + * + * @return 非重复的类集合 + */ + public static Set> getExistClass(){ + return POOL.values().stream().map(Object::getClass).collect(Collectors.toSet()); + } + /** * 移除指定Singleton对象 * -- Gitee From e02114312679392ce16c26c5ba221d5a1db482cf Mon Sep 17 00:00:00 2001 From: zhongzixiang Date: Thu, 28 Apr 2022 16:21:16 +0800 Subject: [PATCH 0004/1737] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=B0=86bean?= =?UTF-8?q?=E7=9A=84=E9=83=A8=E5=88=86=E5=B1=9E=E6=80=A7=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E6=88=90map=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/bean/BeanUtil.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java index eabce8de0a..7c0d7cb4f9 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java @@ -24,11 +24,14 @@ import java.beans.PropertyEditorManager; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.Collection; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.function.Consumer; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -616,6 +619,29 @@ public class BeanUtil { return beanToMap(bean, false, false); } + + /** + * 将bean的部分属性转换成map + * + * @param bean bean + * @param properties 属性值 + * @return Map + */ + public static Map beanToMap(Object bean, String... properties) { + if (ArrayUtil.isEmpty(properties)) { + return Collections.emptyMap(); + } + Set propertiesSet = Arrays.stream(properties).collect(Collectors.toSet()); + // 指明了要复制的属性 所以不忽略null值 + return beanToMap(bean, new HashMap<>(properties.length), false, + property -> { + if (!propertiesSet.contains(property)) { + return null; + } + return property; + }); + } + /** * 对象转Map * -- Gitee From bea723c11b86fbd246de32ab0f83b6e7eb994d57 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 28 Apr 2022 17:00:49 +0800 Subject: [PATCH 0005/1737] add methods --- CHANGELOG.md | 3 ++- hutool-aop/src/main/java/cn/hutool/aop/ProxyUtil.java | 0 hutool-aop/src/main/java/cn/hutool/aop/aspects/Aspect.java | 0 .../src/main/java/cn/hutool/aop/aspects/SimpleAspect.java | 0 .../main/java/cn/hutool/aop/aspects/TimeIntervalAspect.java | 0 .../src/main/java/cn/hutool/aop/aspects/package-info.java | 0 .../main/java/cn/hutool/aop/interceptor/CglibInterceptor.java | 0 .../main/java/cn/hutool/aop/interceptor/JdkInterceptor.java | 0 .../java/cn/hutool/aop/interceptor/SpringCglibInterceptor.java | 0 .../src/main/java/cn/hutool/aop/interceptor/package-info.java | 0 hutool-aop/src/main/java/cn/hutool/aop/package-info.java | 0 .../src/main/java/cn/hutool/aop/proxy/CglibProxyFactory.java | 0 .../src/main/java/cn/hutool/aop/proxy/JdkProxyFactory.java | 0 hutool-aop/src/main/java/cn/hutool/aop/proxy/ProxyFactory.java | 0 .../main/java/cn/hutool/aop/proxy/SpringCglibProxyFactory.java | 0 hutool-aop/src/main/java/cn/hutool/aop/proxy/package-info.java | 0 .../META-INF/services/cn.hutool.aop.proxy.ProxyFactory | 0 hutool-aop/src/test/java/cn/hutool/aop/test/AopTest.java | 0 .../src/main/java/cn/hutool/bloomfilter/BitMapBloomFilter.java | 0 .../src/main/java/cn/hutool/bloomfilter/BitSetBloomFilter.java | 0 .../src/main/java/cn/hutool/bloomfilter/BloomFilter.java | 0 .../src/main/java/cn/hutool/bloomfilter/BloomFilterUtil.java | 0 .../src/main/java/cn/hutool/bloomfilter/bitMap/BitMap.java | 0 .../src/main/java/cn/hutool/bloomfilter/bitMap/IntMap.java | 0 .../src/main/java/cn/hutool/bloomfilter/bitMap/LongMap.java | 0 .../main/java/cn/hutool/bloomfilter/bitMap/package-info.java | 0 .../main/java/cn/hutool/bloomfilter/filter/AbstractFilter.java | 0 .../main/java/cn/hutool/bloomfilter/filter/DefaultFilter.java | 0 .../src/main/java/cn/hutool/bloomfilter/filter/ELFFilter.java | 0 .../src/main/java/cn/hutool/bloomfilter/filter/FNVFilter.java | 0 .../src/main/java/cn/hutool/bloomfilter/filter/FuncFilter.java | 0 .../src/main/java/cn/hutool/bloomfilter/filter/HfFilter.java | 0 .../src/main/java/cn/hutool/bloomfilter/filter/HfIpFilter.java | 0 .../src/main/java/cn/hutool/bloomfilter/filter/JSFilter.java | 0 .../src/main/java/cn/hutool/bloomfilter/filter/PJWFilter.java | 0 .../src/main/java/cn/hutool/bloomfilter/filter/RSFilter.java | 0 .../src/main/java/cn/hutool/bloomfilter/filter/SDBMFilter.java | 0 .../main/java/cn/hutool/bloomfilter/filter/TianlFilter.java | 0 .../main/java/cn/hutool/bloomfilter/filter/package-info.java | 0 .../src/main/java/cn/hutool/bloomfilter/package-info.java | 0 .../test/java/cn/hutool/bloomfilter/BitMapBloomFilterTest.java | 0 hutool-cache/src/main/java/cn/hutool/cache/Cache.java | 0 hutool-cache/src/main/java/cn/hutool/cache/CacheListener.java | 0 hutool-cache/src/main/java/cn/hutool/cache/CacheUtil.java | 0 .../src/main/java/cn/hutool/cache/GlobalPruneTimer.java | 0 .../src/main/java/cn/hutool/cache/file/AbstractFileCache.java | 0 .../src/main/java/cn/hutool/cache/file/LFUFileCache.java | 0 .../src/main/java/cn/hutool/cache/file/LRUFileCache.java | 0 .../src/main/java/cn/hutool/cache/file/package-info.java | 0 .../src/main/java/cn/hutool/cache/impl/AbstractCache.java | 0 hutool-cache/src/main/java/cn/hutool/cache/impl/CacheObj.java | 0 .../src/main/java/cn/hutool/cache/impl/CacheObjIterator.java | 0 .../main/java/cn/hutool/cache/impl/CacheValuesIterator.java | 0 hutool-cache/src/main/java/cn/hutool/cache/impl/FIFOCache.java | 0 hutool-cache/src/main/java/cn/hutool/cache/impl/LFUCache.java | 0 hutool-cache/src/main/java/cn/hutool/cache/impl/LRUCache.java | 0 hutool-cache/src/main/java/cn/hutool/cache/impl/NoCache.java | 0 .../src/main/java/cn/hutool/cache/impl/ReentrantCache.java | 0 .../src/main/java/cn/hutool/cache/impl/StampedCache.java | 0 .../src/main/java/cn/hutool/cache/impl/TimedCache.java | 0 .../src/main/java/cn/hutool/cache/impl/package-info.java | 0 hutool-cache/src/main/java/cn/hutool/cache/package-info.java | 0 .../src/test/java/cn/hutool/cache/CacheConcurrentTest.java | 0 hutool-cache/src/test/java/cn/hutool/cache/CacheTest.java | 0 hutool-cache/src/test/java/cn/hutool/cache/FileCacheTest.java | 0 hutool-cache/src/test/java/cn/hutool/cache/LRUCacheTest.java | 0 .../src/main/java/cn/hutool/captcha/AbstractCaptcha.java | 0 .../src/main/java/cn/hutool/captcha/CaptchaUtil.java | 0 .../src/main/java/cn/hutool/captcha/CircleCaptcha.java | 0 hutool-captcha/src/main/java/cn/hutool/captcha/GifCaptcha.java | 0 hutool-captcha/src/main/java/cn/hutool/captcha/ICaptcha.java | 0 .../src/main/java/cn/hutool/captcha/LineCaptcha.java | 0 .../src/main/java/cn/hutool/captcha/ShearCaptcha.java | 0 .../java/cn/hutool/captcha/generator/AbstractGenerator.java | 0 .../main/java/cn/hutool/captcha/generator/CodeGenerator.java | 0 .../main/java/cn/hutool/captcha/generator/MathGenerator.java | 0 .../main/java/cn/hutool/captcha/generator/RandomGenerator.java | 0 .../main/java/cn/hutool/captcha/generator/package-info.java | 0 .../src/main/java/cn/hutool/captcha/package-info.java | 0 .../src/test/java/cn/hutool/captcha/CaptchaTest.java | 0 .../src/test/java/cn/hutool/captcha/CaptchaUtilTest.java | 0 .../src/test/java/cn/hutool/captcha/GeneratorTest.java | 0 .../src/main/java/cn/hutool/core/bean/copier/BeanCopier.java | 0 .../src/main/java/cn/hutool/core/bean/copier/CopyOptions.java | 0 hutool-core/src/main/java/cn/hutool/core/codec/Base64.java | 0 .../src/main/java/cn/hutool/core/codec/PercentCodec.java | 0 .../src/main/java/cn/hutool/core/collection/FilterIter.java | 0 .../src/main/java/cn/hutool/core/collection/IterUtil.java | 0 .../src/main/java/cn/hutool/core/collection/ListUtil.java | 0 .../main/java/cn/hutool/core/collection/TransCollection.java | 0 .../java/cn/hutool/core/comparator/BaseFieldComparator.java | 0 hutool-core/src/main/java/cn/hutool/core/convert/Convert.java | 0 .../main/java/cn/hutool/core/convert/ConverterRegistry.java | 0 .../src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java | 0 .../src/main/java/cn/hutool/core/exceptions/CheckedUtil.java | 0 .../src/main/java/cn/hutool/core/img/BackgroundRemoval.java | 0 hutool-core/src/main/java/cn/hutool/core/img/FontUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/img/GraphicsUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/img/Img.java | 0 hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/img/ScaleType.java | 0 .../main/java/cn/hutool/core/img/gif/AnimatedGifEncoder.java | 0 .../src/main/java/cn/hutool/core/img/gif/GifDecoder.java | 0 .../src/main/java/cn/hutool/core/img/gif/LZWEncoder.java | 0 hutool-core/src/main/java/cn/hutool/core/img/gif/NeuQuant.java | 0 .../src/main/java/cn/hutool/core/img/gif/package-info.java | 0 hutool-core/src/main/java/cn/hutool/core/img/package-info.java | 0 hutool-core/src/main/java/cn/hutool/core/io/IoUtil.java | 0 .../java/cn/hutool/core/io/checksum/crc16/CRC16Checksum.java | 0 .../src/main/java/cn/hutool/core/io/file/FileCopier.java | 0 .../src/main/java/cn/hutool/core/io/file/FileNameUtil.java | 0 .../src/main/java/cn/hutool/core/io/resource/ResourceUtil.java | 0 .../src/main/java/cn/hutool/core/io/resource/UrlResource.java | 0 .../src/main/java/cn/hutool/core/io/watch/WatchServer.java | 0 .../src/main/java/cn/hutool/core/lang/ClassScanner.java | 0 .../src/main/java/cn/hutool/core/lang/ConsistentHash.java | 0 hutool-core/src/main/java/cn/hutool/core/lang/Dict.java | 0 hutool-core/src/main/java/cn/hutool/core/lang/Editor.java | 0 hutool-core/src/main/java/cn/hutool/core/lang/Filter.java | 0 hutool-core/src/main/java/cn/hutool/core/lang/Matcher.java | 0 hutool-core/src/main/java/cn/hutool/core/lang/ObjectId.java | 0 .../main/java/cn/hutool/core/lang/ParameterizedTypeImpl.java | 0 hutool-core/src/main/java/cn/hutool/core/lang/Replacer.java | 0 hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java | 2 -- hutool-core/src/main/java/cn/hutool/core/lang/Snowflake.java | 0 .../src/main/java/cn/hutool/core/lang/TypeReference.java | 0 hutool-core/src/main/java/cn/hutool/core/lang/UUID.java | 0 hutool-core/src/main/java/cn/hutool/core/lang/Validator.java | 0 .../src/main/java/cn/hutool/core/lang/WeightRandom.java | 0 .../src/main/java/cn/hutool/core/lang/caller/package-info.java | 0 .../main/java/cn/hutool/core/lang/copier/SrcToDestCopier.java | 0 .../src/main/java/cn/hutool/core/lang/copier/package-info.java | 0 .../src/main/java/cn/hutool/core/lang/func/package-info.java | 0 .../java/cn/hutool/core/lang/generator/ObjectIdGenerator.java | 0 .../java/cn/hutool/core/lang/generator/SnowflakeGenerator.java | 0 .../main/java/cn/hutool/core/lang/generator/UUIDGenerator.java | 0 .../main/java/cn/hutool/core/lang/generator/package-info.java | 0 .../src/main/java/cn/hutool/core/lang/hash/package-info.java | 0 hutool-core/src/main/java/cn/hutool/core/lang/id/NanoId.java | 0 .../src/main/java/cn/hutool/core/lang/intern/Interner.java | 0 .../src/main/java/cn/hutool/core/lang/intern/package-info.java | 0 .../main/java/cn/hutool/core/lang/loader/LazyFunLoader.java | 0 .../src/main/java/cn/hutool/core/lang/loader/package-info.java | 0 .../src/main/java/cn/hutool/core/lang/mutable/Mutable.java | 0 .../main/java/cn/hutool/core/lang/mutable/package-info.java | 0 .../src/main/java/cn/hutool/core/lang/package-info.java | 0 .../main/java/cn/hutool/core/lang/reflect/package-info.java | 0 hutool-core/src/main/java/cn/hutool/core/lang/tree/Node.java | 0 hutool-core/src/main/java/cn/hutool/core/lang/tree/Tree.java | 0 .../src/main/java/cn/hutool/core/lang/tree/TreeBuilder.java | 0 .../src/main/java/cn/hutool/core/lang/tree/TreeNode.java | 0 .../src/main/java/cn/hutool/core/lang/tree/TreeNodeConfig.java | 0 .../src/main/java/cn/hutool/core/lang/tree/package-info.java | 0 .../cn/hutool/core/lang/tree/parser/DefaultNodeParser.java | 0 .../main/java/cn/hutool/core/lang/tree/parser/NodeParser.java | 0 hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/net/Ipv4Util.java | 0 hutool-core/src/main/java/cn/hutool/core/net/NetUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/net/URLEncoder.java | 0 .../src/main/java/cn/hutool/core/net/url/UrlBuilder.java | 0 .../src/main/java/cn/hutool/core/swing/DesktopUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/swing/RobotUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/swing/ScreenUtil.java | 0 .../java/cn/hutool/core/swing/clipboard/ClipboardListener.java | 0 .../java/cn/hutool/core/swing/clipboard/ClipboardMonitor.java | 0 .../java/cn/hutool/core/swing/clipboard/ClipboardUtil.java | 0 .../java/cn/hutool/core/swing/clipboard/ImageSelection.java | 0 .../cn/hutool/core/swing/clipboard/StrClipboardListener.java | 0 .../main/java/cn/hutool/core/swing/clipboard/package-info.java | 0 .../src/main/java/cn/hutool/core/swing/package-info.java | 0 hutool-core/src/main/java/cn/hutool/core/text/StrSplitter.java | 0 hutool-core/src/main/java/cn/hutool/core/text/UnicodeUtil.java | 0 .../src/main/java/cn/hutool/core/text/csv/CsvBaseReader.java | 0 .../src/main/java/cn/hutool/core/text/csv/CsvConfig.java | 0 hutool-core/src/main/java/cn/hutool/core/text/csv/CsvData.java | 0 .../src/main/java/cn/hutool/core/text/csv/CsvParser.java | 0 .../src/main/java/cn/hutool/core/text/csv/CsvReadConfig.java | 0 .../src/main/java/cn/hutool/core/text/csv/CsvReader.java | 0 hutool-core/src/main/java/cn/hutool/core/text/csv/CsvRow.java | 0 .../src/main/java/cn/hutool/core/text/csv/CsvRowHandler.java | 0 hutool-core/src/main/java/cn/hutool/core/text/csv/CsvUtil.java | 0 .../src/main/java/cn/hutool/core/text/csv/CsvWriteConfig.java | 0 .../src/main/java/cn/hutool/core/text/csv/CsvWriter.java | 0 .../src/main/java/cn/hutool/core/text/csv/package-info.java | 0 .../java/cn/hutool/core/text/finder/CharMatcherFinder.java | 0 .../main/java/cn/hutool/core/text/replacer/StrReplacer.java | 0 .../src/main/java/cn/hutool/core/util/CreditCodeUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/util/EscapeUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/util/HashUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/util/HexUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/util/IdUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/util/PhoneUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/util/RandomUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/util/ReUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/util/RuntimeUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/util/TypeUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java | 0 hutool-core/src/main/java/cn/hutool/core/util/ZipUtil.java | 0 .../src/test/java/cn/hutool/core/convert/ConvertTest.java | 0 .../test/java/cn/hutool/core/convert/ConvertToBeanTest.java | 0 .../java/cn/hutool/core/convert/ConvertToCollectionTest.java | 0 .../test/java/cn/hutool/core/date/LocalDateTimeUtilTest.java | 0 hutool-core/src/test/java/cn/hutool/core/img/FontUtilTest.java | 0 hutool-core/src/test/java/cn/hutool/core/img/ImgTest.java | 0 hutool-core/src/test/java/cn/hutool/core/img/ImgUtilTest.java | 0 .../src/test/java/cn/hutool/core/io/WatchMonitorTest.java | 0 .../src/test/java/cn/hutool/core/io/checksum/CrcTest.java | 0 hutool-core/src/test/java/cn/hutool/core/lang/AssertTest.java | 0 hutool-core/src/test/java/cn/hutool/core/lang/DictTest.java | 0 .../src/test/java/cn/hutool/core/lang/ObjectIdTest.java | 0 .../src/test/java/cn/hutool/core/lang/SnowflakeTest.java | 0 hutool-core/src/test/java/cn/hutool/core/lang/UUIDTest.java | 0 .../src/test/java/cn/hutool/core/lang/ValidatorTest.java | 0 .../src/test/java/cn/hutool/core/lang/caller/CallerTest.java | 0 .../test/java/cn/hutool/core/lang/caller/CallerUtilTest.java | 0 .../src/test/java/cn/hutool/core/lang/hash/MetroHashTest.java | 0 .../test/java/cn/hutool/core/lang/tree/TreeBuilderTest.java | 0 .../src/test/java/cn/hutool/core/lang/tree/TreeSearchTest.java | 0 .../src/test/java/cn/hutool/core/lang/tree/TreeTest.java | 0 .../src/test/java/cn/hutool/core/math/ArrangementTest.java | 0 hutool-core/src/test/java/cn/hutool/core/net/NetUtilTest.java | 0 .../test/java/cn/hutool/core/swing/ClipboardMonitorTest.java | 0 .../src/test/java/cn/hutool/core/swing/ClipboardUtilTest.java | 0 .../src/test/java/cn/hutool/core/swing/DesktopUtilTest.java | 0 .../src/test/java/cn/hutool/core/swing/RobotUtilTest.java | 0 .../src/test/java/cn/hutool/core/text/NamingCaseTest.java | 0 .../src/test/java/cn/hutool/core/text/csv/CsvParserTest.java | 0 .../src/test/java/cn/hutool/core/text/csv/CsvReaderTest.java | 0 .../src/test/java/cn/hutool/core/text/csv/CsvUtilTest.java | 0 .../test/java/cn/hutool/core/thread/ConcurrencyTesterTest.java | 0 .../src/test/java/cn/hutool/core/util/EscapeUtilTest.java | 0 .../src/test/java/cn/hutool/core/util/HashUtilTest.java | 0 hutool-core/src/test/java/cn/hutool/core/util/HexUtilTest.java | 0 hutool-core/src/test/java/cn/hutool/core/util/IdUtilTest.java | 0 hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java | 0 hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java | 0 hutool-core/src/test/resources/test-compile/a/A.java | 0 hutool-core/src/test/resources/test_bean.csv | 0 hutool-cron/src/main/java/cn/hutool/cron/Scheduler.java | 0 .../src/main/java/cn/hutool/cron/pattern/CronPatternUtil.java | 0 .../main/java/cn/hutool/cron/pattern/matcher/PartMatcher.java | 0 hutool-cron/src/test/java/cn/hutool/cron/TaskTableTest.java | 0 .../test/java/cn/hutool/cron/demo/AddAndRemoveMainTest.java | 0 hutool-cron/src/test/java/cn/hutool/cron/demo/TestJob.java | 0 hutool-cron/src/test/java/cn/hutool/cron/demo/TestJob2.java | 0 .../src/test/java/cn/hutool/cron/pattern/CronPatternTest.java | 0 hutool-crypto/src/main/java/cn/hutool/crypto/SecureUtil.java | 0 .../java/cn/hutool/crypto/asymmetric/AsymmetricEncryptor.java | 0 .../src/main/java/cn/hutool/crypto/asymmetric/SM2.java | 0 .../src/main/java/cn/hutool/crypto/asymmetric/Sign.java | 0 .../src/main/java/cn/hutool/crypto/digest/Digester.java | 0 .../src/main/java/cn/hutool/crypto/digest/mac/Mac.java | 0 .../src/main/java/cn/hutool/crypto/symmetric/PBKDF2.java | 0 .../src/main/java/cn/hutool/crypto/symmetric/RC4.java | 0 .../main/java/cn/hutool/crypto/symmetric/SymmetricCrypto.java | 0 .../java/cn/hutool/crypto/symmetric/SymmetricEncryptor.java | 0 .../test/java/cn/hutool/crypto/test/asymmetric/RSATest.java | 0 .../test/java/cn/hutool/crypto/test/asymmetric/SM2Test.java | 0 .../src/test/java/cn/hutool/crypto/test/symmetric/AESTest.java | 0 hutool-db/src/main/java/cn/hutool/db/AbstractDb.java | 0 hutool-db/src/main/java/cn/hutool/db/ActiveEntity.java | 0 hutool-db/src/main/java/cn/hutool/db/Entity.java | 0 .../src/main/java/cn/hutool/db/ThreadLocalConnection.java | 0 .../src/main/java/cn/hutool/db/dialect/DialectFactory.java | 0 hutool-db/src/main/java/cn/hutool/db/meta/Column.java | 0 hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java | 0 hutool-db/src/main/java/cn/hutool/db/sql/SqlExecutor.java | 0 hutool-db/src/test/java/cn/hutool/db/ConcurentTest.java | 0 hutool-db/src/test/java/cn/hutool/db/MySQLTest.java | 0 hutool-db/src/test/java/cn/hutool/db/OracleTest.java | 0 hutool-db/src/test/java/cn/hutool/db/SqlServerTest.java | 0 hutool-dfa/src/main/java/cn/hutool/dfa/FoundWord.java | 0 hutool-dfa/src/main/java/cn/hutool/dfa/SensitiveProcessor.java | 0 hutool-dfa/src/main/java/cn/hutool/dfa/SensitiveUtil.java | 0 hutool-dfa/src/main/java/cn/hutool/dfa/StopChar.java | 0 hutool-dfa/src/main/java/cn/hutool/dfa/WordTree.java | 0 hutool-dfa/src/main/java/cn/hutool/dfa/package-info.java | 0 hutool-dfa/src/test/java/cn/hutool/dfa/DfaTest.java | 0 hutool-dfa/src/test/java/cn/hutool/dfa/SensitiveUtilTest.java | 0 .../main/java/cn/hutool/extra/compress/archiver/Archiver.java | 0 .../java/cn/hutool/extra/compress/archiver/SevenZArchiver.java | 0 .../java/cn/hutool/extra/compress/archiver/StreamArchiver.java | 0 .../java/cn/hutool/extra/compress/extractor/Extractor.java | 0 .../cn/hutool/extra/compress/extractor/SevenZExtractor.java | 0 .../cn/hutool/extra/compress/extractor/StreamExtractor.java | 0 .../src/main/java/cn/hutool/extra/qrcode/QrCodeUtil.java | 0 .../src/main/java/cn/hutool/extra/qrcode/QrConfig.java | 0 .../src/main/java/cn/hutool/extra/spring/SpringUtil.java | 0 .../src/main/java/cn/hutool/extra/ssh/JschSessionPool.java | 0 .../cn/hutool/extra/template/engine/enjoy/EnjoyEngine.java | 0 .../cn/hutool/extra/template/engine/rythm/RythmTemplate.java | 0 .../extra/template/engine/thymeleaf/ThymeleafTemplate.java | 0 .../extra/template/engine/velocity/VelocityTemplate.java | 0 .../java/cn/hutool/extra/template/engine/wit/WitEngine.java | 0 .../java/cn/hutool/extra/template/engine/wit/WitTemplate.java | 0 .../cn/hutool/extra/tokenizer/engine/TokenizerFactory.java | 0 .../src/test/java/cn/hutool/extra/expression/AviatorTest.java | 0 .../java/cn/hutool/extra/expression/ExpressionUtilTest.java | 0 .../src/test/java/cn/hutool/extra/qrcode/QrCodeUtilTest.java | 0 .../src/test/java/cn/hutool/extra/spring/SpringUtilTest.java | 0 .../cn/hutool/extra/spring/SpringUtilWithAutoConfigTest.java | 0 .../src/test/java/cn/hutool/extra/ssh/JschUtilTest.java | 0 .../test/java/cn/hutool/extra/template/TemplateUtilTest.java | 0 .../src/test/java/cn/hutool/extra/template/ThymeleafTest.java | 0 .../src/test/java/cn/hutool/extra/template/VelocityTest.java | 0 hutool-http/src/main/java/cn/hutool/http/HtmlUtil.java | 0 hutool-http/src/main/java/cn/hutool/http/HttpResponse.java | 0 hutool-http/src/main/java/cn/hutool/http/HttpUtil.java | 0 .../main/java/cn/hutool/http/ssl/SSLSocketFactoryBuilder.java | 0 .../src/main/java/cn/hutool/http/useragent/Browser.java | 0 hutool-http/src/main/java/cn/hutool/http/useragent/Engine.java | 0 hutool-http/src/main/java/cn/hutool/http/useragent/OS.java | 0 .../src/main/java/cn/hutool/http/useragent/UserAgentInfo.java | 0 hutool-http/src/test/java/cn/hutool/http/HttpUtilTest.java | 0 .../src/test/java/cn/hutool/http/server/BlankServerTest.java | 0 .../src/test/java/cn/hutool/http/server/DocServerTest.java | 0 hutool-json/src/main/java/cn/hutool/json/JSON.java | 0 hutool-json/src/main/java/cn/hutool/json/JSONConfig.java | 0 .../src/main/java/cn/hutool/json/xml/JSONXMLSerializer.java | 0 hutool-json/src/test/java/cn/hutool/json/Issue1101Test.java | 0 hutool-json/src/test/java/cn/hutool/json/Issue488Test.java | 0 .../test/java/cn/hutool/json/issueIVMD5/IssueIVMD5Test.java | 0 hutool-jwt/src/main/java/cn/hutool/jwt/Claims.java | 0 hutool-jwt/src/main/java/cn/hutool/jwt/JWT.java | 0 hutool-jwt/src/main/java/cn/hutool/jwt/JWTException.java | 0 hutool-jwt/src/main/java/cn/hutool/jwt/JWTHeader.java | 0 hutool-jwt/src/main/java/cn/hutool/jwt/JWTPayload.java | 0 hutool-jwt/src/main/java/cn/hutool/jwt/JWTUtil.java | 0 hutool-jwt/src/main/java/cn/hutool/jwt/JWTValidator.java | 0 hutool-jwt/src/main/java/cn/hutool/jwt/RegisteredPayload.java | 0 hutool-jwt/src/main/java/cn/hutool/jwt/package-info.java | 0 .../src/main/java/cn/hutool/jwt/signers/AlgorithmUtil.java | 0 .../main/java/cn/hutool/jwt/signers/AsymmetricJWTSigner.java | 0 .../src/main/java/cn/hutool/jwt/signers/HMacJWTSigner.java | 0 hutool-jwt/src/main/java/cn/hutool/jwt/signers/JWTSigner.java | 0 .../src/main/java/cn/hutool/jwt/signers/JWTSignerUtil.java | 0 .../src/main/java/cn/hutool/jwt/signers/NoneJWTSigner.java | 0 .../src/main/java/cn/hutool/jwt/signers/package-info.java | 0 hutool-jwt/src/test/java/cn/hutool/jwt/JWTSignerTest.java | 0 hutool-jwt/src/test/java/cn/hutool/jwt/JWTTest.java | 0 hutool-jwt/src/test/java/cn/hutool/jwt/JWTUtilTest.java | 0 hutool-jwt/src/test/java/cn/hutool/jwt/JWTValidatorTest.java | 0 hutool-log/src/main/java/cn/hutool/log/Log.java | 0 hutool-log/src/main/java/cn/hutool/log/StaticLog.java | 0 .../src/main/java/cn/hutool/log/dialect/jdk/JdkLogFactory.java | 0 hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelUtil.java | 0 .../cn/hutool/poi/excel/cell/setters/EscapeStrCellSetter.java | 0 hutool-poi/src/main/java/cn/hutool/poi/word/TableUtil.java | 0 hutool-poi/src/test/java/cn/hutool/poi/excel/CellUtilTest.java | 0 .../src/test/java/cn/hutool/poi/excel/ExcelWriteTest.java | 0 .../main/java/cn/hutool/script/FullSupportScriptEngine.java | 0 .../src/main/java/cn/hutool/script/JavaScriptEngine.java | 0 .../src/main/java/cn/hutool/script/ScriptRuntimeException.java | 0 hutool-script/src/main/java/cn/hutool/script/package-info.java | 0 .../src/test/java/cn/hutool/script/test/NashornDeepTest.java | 0 .../src/test/java/cn/hutool/script/test/ScriptUtilTest.java | 0 hutool-script/src/test/resources/filter1.js | 0 .../src/main/java/cn/hutool/setting/SettingLoader.java | 0 .../src/main/java/cn/hutool/setting/profile/GlobalProfile.java | 0 .../src/main/java/cn/hutool/setting/profile/Profile.java | 0 .../src/main/java/cn/hutool/setting/yaml/YamlUtil.java | 0 .../src/test/java/cn/hutool/setting/yaml/YamlUtilTest.java | 0 .../src/test/java/cn/hutool/socket/aio/AioClientTest.java | 0 .../src/test/java/cn/hutool/socket/aio/AioServerTest.java | 0 .../src/test/java/cn/hutool/socket/nio/NioClientTest.java | 0 .../src/test/java/cn/hutool/socket/nio/NioServerTest.java | 0 hutool-system/src/main/java/cn/hutool/system/HostInfo.java | 0 hutool-system/src/main/java/cn/hutool/system/JavaInfo.java | 0 .../src/main/java/cn/hutool/system/JavaRuntimeInfo.java | 0 hutool-system/src/main/java/cn/hutool/system/JavaSpecInfo.java | 0 hutool-system/src/main/java/cn/hutool/system/JvmInfo.java | 0 hutool-system/src/main/java/cn/hutool/system/JvmSpecInfo.java | 0 hutool-system/src/main/java/cn/hutool/system/OsInfo.java | 0 hutool-system/src/main/java/cn/hutool/system/RuntimeInfo.java | 0 .../src/main/java/cn/hutool/system/SystemPropsKeys.java | 0 hutool-system/src/main/java/cn/hutool/system/SystemUtil.java | 0 hutool-system/src/main/java/cn/hutool/system/UserInfo.java | 0 hutool-system/src/main/java/cn/hutool/system/oshi/CpuInfo.java | 0 .../src/main/java/cn/hutool/system/oshi/CpuTicks.java | 0 .../src/main/java/cn/hutool/system/oshi/OshiUtil.java | 0 .../src/main/java/cn/hutool/system/oshi/package-info.java | 0 hutool-system/src/main/java/cn/hutool/system/package-info.java | 0 .../src/test/java/cn/hutool/system/OshiPrintTest.java | 0 hutool-system/src/test/java/cn/hutool/system/OshiTest.java | 0 .../src/test/java/cn/hutool/system/SystemUtilTest.java | 0 386 files changed, 2 insertions(+), 3 deletions(-) mode change 100644 => 100755 hutool-aop/src/main/java/cn/hutool/aop/ProxyUtil.java mode change 100644 => 100755 hutool-aop/src/main/java/cn/hutool/aop/aspects/Aspect.java mode change 100644 => 100755 hutool-aop/src/main/java/cn/hutool/aop/aspects/SimpleAspect.java mode change 100644 => 100755 hutool-aop/src/main/java/cn/hutool/aop/aspects/TimeIntervalAspect.java mode change 100644 => 100755 hutool-aop/src/main/java/cn/hutool/aop/aspects/package-info.java mode change 100644 => 100755 hutool-aop/src/main/java/cn/hutool/aop/interceptor/CglibInterceptor.java mode change 100644 => 100755 hutool-aop/src/main/java/cn/hutool/aop/interceptor/JdkInterceptor.java mode change 100644 => 100755 hutool-aop/src/main/java/cn/hutool/aop/interceptor/SpringCglibInterceptor.java mode change 100644 => 100755 hutool-aop/src/main/java/cn/hutool/aop/interceptor/package-info.java mode change 100644 => 100755 hutool-aop/src/main/java/cn/hutool/aop/package-info.java mode change 100644 => 100755 hutool-aop/src/main/java/cn/hutool/aop/proxy/CglibProxyFactory.java mode change 100644 => 100755 hutool-aop/src/main/java/cn/hutool/aop/proxy/JdkProxyFactory.java mode change 100644 => 100755 hutool-aop/src/main/java/cn/hutool/aop/proxy/ProxyFactory.java mode change 100644 => 100755 hutool-aop/src/main/java/cn/hutool/aop/proxy/SpringCglibProxyFactory.java mode change 100644 => 100755 hutool-aop/src/main/java/cn/hutool/aop/proxy/package-info.java mode change 100644 => 100755 hutool-aop/src/main/resources/META-INF/services/cn.hutool.aop.proxy.ProxyFactory mode change 100644 => 100755 hutool-aop/src/test/java/cn/hutool/aop/test/AopTest.java mode change 100644 => 100755 hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/BitMapBloomFilter.java mode change 100644 => 100755 hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/BitSetBloomFilter.java mode change 100644 => 100755 hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/BloomFilter.java mode change 100644 => 100755 hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/BloomFilterUtil.java mode change 100644 => 100755 hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/BitMap.java mode change 100644 => 100755 hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/IntMap.java mode change 100644 => 100755 hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/LongMap.java mode change 100644 => 100755 hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/package-info.java mode change 100644 => 100755 hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/AbstractFilter.java mode change 100644 => 100755 hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/DefaultFilter.java mode change 100644 => 100755 hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/ELFFilter.java mode change 100644 => 100755 hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/FNVFilter.java mode change 100644 => 100755 hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/FuncFilter.java mode change 100644 => 100755 hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/HfFilter.java mode change 100644 => 100755 hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/HfIpFilter.java mode change 100644 => 100755 hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/JSFilter.java mode change 100644 => 100755 hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/PJWFilter.java mode change 100644 => 100755 hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/RSFilter.java mode change 100644 => 100755 hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/SDBMFilter.java mode change 100644 => 100755 hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/TianlFilter.java mode change 100644 => 100755 hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/package-info.java mode change 100644 => 100755 hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/package-info.java mode change 100644 => 100755 hutool-bloomFilter/src/test/java/cn/hutool/bloomfilter/BitMapBloomFilterTest.java mode change 100644 => 100755 hutool-cache/src/main/java/cn/hutool/cache/Cache.java mode change 100644 => 100755 hutool-cache/src/main/java/cn/hutool/cache/CacheListener.java mode change 100644 => 100755 hutool-cache/src/main/java/cn/hutool/cache/CacheUtil.java mode change 100644 => 100755 hutool-cache/src/main/java/cn/hutool/cache/GlobalPruneTimer.java mode change 100644 => 100755 hutool-cache/src/main/java/cn/hutool/cache/file/AbstractFileCache.java mode change 100644 => 100755 hutool-cache/src/main/java/cn/hutool/cache/file/LFUFileCache.java mode change 100644 => 100755 hutool-cache/src/main/java/cn/hutool/cache/file/LRUFileCache.java mode change 100644 => 100755 hutool-cache/src/main/java/cn/hutool/cache/file/package-info.java mode change 100644 => 100755 hutool-cache/src/main/java/cn/hutool/cache/impl/AbstractCache.java mode change 100644 => 100755 hutool-cache/src/main/java/cn/hutool/cache/impl/CacheObj.java mode change 100644 => 100755 hutool-cache/src/main/java/cn/hutool/cache/impl/CacheObjIterator.java mode change 100644 => 100755 hutool-cache/src/main/java/cn/hutool/cache/impl/CacheValuesIterator.java mode change 100644 => 100755 hutool-cache/src/main/java/cn/hutool/cache/impl/FIFOCache.java mode change 100644 => 100755 hutool-cache/src/main/java/cn/hutool/cache/impl/LFUCache.java mode change 100644 => 100755 hutool-cache/src/main/java/cn/hutool/cache/impl/LRUCache.java mode change 100644 => 100755 hutool-cache/src/main/java/cn/hutool/cache/impl/NoCache.java mode change 100644 => 100755 hutool-cache/src/main/java/cn/hutool/cache/impl/ReentrantCache.java mode change 100644 => 100755 hutool-cache/src/main/java/cn/hutool/cache/impl/StampedCache.java mode change 100644 => 100755 hutool-cache/src/main/java/cn/hutool/cache/impl/TimedCache.java mode change 100644 => 100755 hutool-cache/src/main/java/cn/hutool/cache/impl/package-info.java mode change 100644 => 100755 hutool-cache/src/main/java/cn/hutool/cache/package-info.java mode change 100644 => 100755 hutool-cache/src/test/java/cn/hutool/cache/CacheConcurrentTest.java mode change 100644 => 100755 hutool-cache/src/test/java/cn/hutool/cache/CacheTest.java mode change 100644 => 100755 hutool-cache/src/test/java/cn/hutool/cache/FileCacheTest.java mode change 100644 => 100755 hutool-cache/src/test/java/cn/hutool/cache/LRUCacheTest.java mode change 100644 => 100755 hutool-captcha/src/main/java/cn/hutool/captcha/AbstractCaptcha.java mode change 100644 => 100755 hutool-captcha/src/main/java/cn/hutool/captcha/CaptchaUtil.java mode change 100644 => 100755 hutool-captcha/src/main/java/cn/hutool/captcha/CircleCaptcha.java mode change 100644 => 100755 hutool-captcha/src/main/java/cn/hutool/captcha/GifCaptcha.java mode change 100644 => 100755 hutool-captcha/src/main/java/cn/hutool/captcha/ICaptcha.java mode change 100644 => 100755 hutool-captcha/src/main/java/cn/hutool/captcha/LineCaptcha.java mode change 100644 => 100755 hutool-captcha/src/main/java/cn/hutool/captcha/ShearCaptcha.java mode change 100644 => 100755 hutool-captcha/src/main/java/cn/hutool/captcha/generator/AbstractGenerator.java mode change 100644 => 100755 hutool-captcha/src/main/java/cn/hutool/captcha/generator/CodeGenerator.java mode change 100644 => 100755 hutool-captcha/src/main/java/cn/hutool/captcha/generator/MathGenerator.java mode change 100644 => 100755 hutool-captcha/src/main/java/cn/hutool/captcha/generator/RandomGenerator.java mode change 100644 => 100755 hutool-captcha/src/main/java/cn/hutool/captcha/generator/package-info.java mode change 100644 => 100755 hutool-captcha/src/main/java/cn/hutool/captcha/package-info.java mode change 100644 => 100755 hutool-captcha/src/test/java/cn/hutool/captcha/CaptchaTest.java mode change 100644 => 100755 hutool-captcha/src/test/java/cn/hutool/captcha/CaptchaUtilTest.java mode change 100644 => 100755 hutool-captcha/src/test/java/cn/hutool/captcha/GeneratorTest.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanCopier.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/codec/Base64.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/codec/PercentCodec.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/collection/FilterIter.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/collection/TransCollection.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/comparator/BaseFieldComparator.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/convert/Convert.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/exceptions/CheckedUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/img/BackgroundRemoval.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/img/FontUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/img/GraphicsUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/img/Img.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/img/ScaleType.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/img/gif/AnimatedGifEncoder.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/img/gif/GifDecoder.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/img/gif/LZWEncoder.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/img/gif/NeuQuant.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/img/gif/package-info.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/img/package-info.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/io/IoUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/io/checksum/crc16/CRC16Checksum.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/io/file/FileCopier.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/io/file/FileNameUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/io/resource/ResourceUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/io/resource/UrlResource.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/io/watch/WatchServer.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/ClassScanner.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/ConsistentHash.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/Dict.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/Editor.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/Filter.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/Matcher.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/ObjectId.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/ParameterizedTypeImpl.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/Replacer.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/Snowflake.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/TypeReference.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/UUID.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/Validator.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/WeightRandom.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/caller/package-info.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/copier/SrcToDestCopier.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/copier/package-info.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/func/package-info.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/generator/ObjectIdGenerator.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/generator/SnowflakeGenerator.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/generator/UUIDGenerator.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/generator/package-info.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/hash/package-info.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/id/NanoId.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/intern/Interner.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/intern/package-info.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/loader/LazyFunLoader.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/loader/package-info.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/mutable/Mutable.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/mutable/package-info.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/package-info.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/reflect/package-info.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/tree/Node.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/tree/Tree.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/tree/TreeBuilder.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/tree/TreeNode.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/tree/TreeNodeConfig.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/tree/package-info.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/tree/parser/DefaultNodeParser.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/lang/tree/parser/NodeParser.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/net/Ipv4Util.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/net/NetUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/net/URLEncoder.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/net/url/UrlBuilder.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/swing/DesktopUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/swing/RobotUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/swing/ScreenUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardListener.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardMonitor.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ImageSelection.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/swing/clipboard/StrClipboardListener.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/swing/clipboard/package-info.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/swing/package-info.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/text/StrSplitter.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/text/UnicodeUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/text/csv/CsvBaseReader.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/text/csv/CsvConfig.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/text/csv/CsvData.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/text/csv/CsvParser.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/text/csv/CsvReadConfig.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/text/csv/CsvReader.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/text/csv/CsvRow.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/text/csv/CsvRowHandler.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/text/csv/CsvUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/text/csv/CsvWriteConfig.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/text/csv/CsvWriter.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/text/csv/package-info.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/text/finder/CharMatcherFinder.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/text/replacer/StrReplacer.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/util/CreditCodeUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/util/EscapeUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/util/HashUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/util/HexUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/util/IdUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/util/PhoneUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/util/RandomUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/util/ReUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/util/RuntimeUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/util/TypeUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java mode change 100644 => 100755 hutool-core/src/main/java/cn/hutool/core/util/ZipUtil.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/convert/ConvertToBeanTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/convert/ConvertToCollectionTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/date/LocalDateTimeUtilTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/img/FontUtilTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/img/ImgTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/img/ImgUtilTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/io/WatchMonitorTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/io/checksum/CrcTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/lang/AssertTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/lang/DictTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/lang/ObjectIdTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/lang/SnowflakeTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/lang/UUIDTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/lang/ValidatorTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/lang/caller/CallerTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/lang/caller/CallerUtilTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/lang/hash/MetroHashTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/lang/tree/TreeBuilderTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/lang/tree/TreeSearchTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/lang/tree/TreeTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/math/ArrangementTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/net/NetUtilTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/swing/ClipboardMonitorTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/swing/ClipboardUtilTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/swing/DesktopUtilTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/swing/RobotUtilTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/text/NamingCaseTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/text/csv/CsvParserTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/text/csv/CsvReaderTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/text/csv/CsvUtilTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/thread/ConcurrencyTesterTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/util/EscapeUtilTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/util/HashUtilTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/util/HexUtilTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/util/IdUtilTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java mode change 100644 => 100755 hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java mode change 100644 => 100755 hutool-core/src/test/resources/test-compile/a/A.java mode change 100644 => 100755 hutool-core/src/test/resources/test_bean.csv mode change 100644 => 100755 hutool-cron/src/main/java/cn/hutool/cron/Scheduler.java mode change 100644 => 100755 hutool-cron/src/main/java/cn/hutool/cron/pattern/CronPatternUtil.java mode change 100644 => 100755 hutool-cron/src/main/java/cn/hutool/cron/pattern/matcher/PartMatcher.java mode change 100644 => 100755 hutool-cron/src/test/java/cn/hutool/cron/TaskTableTest.java mode change 100644 => 100755 hutool-cron/src/test/java/cn/hutool/cron/demo/AddAndRemoveMainTest.java mode change 100644 => 100755 hutool-cron/src/test/java/cn/hutool/cron/demo/TestJob.java mode change 100644 => 100755 hutool-cron/src/test/java/cn/hutool/cron/demo/TestJob2.java mode change 100644 => 100755 hutool-cron/src/test/java/cn/hutool/cron/pattern/CronPatternTest.java mode change 100644 => 100755 hutool-crypto/src/main/java/cn/hutool/crypto/SecureUtil.java mode change 100644 => 100755 hutool-crypto/src/main/java/cn/hutool/crypto/asymmetric/AsymmetricEncryptor.java mode change 100644 => 100755 hutool-crypto/src/main/java/cn/hutool/crypto/asymmetric/SM2.java mode change 100644 => 100755 hutool-crypto/src/main/java/cn/hutool/crypto/asymmetric/Sign.java mode change 100644 => 100755 hutool-crypto/src/main/java/cn/hutool/crypto/digest/Digester.java mode change 100644 => 100755 hutool-crypto/src/main/java/cn/hutool/crypto/digest/mac/Mac.java mode change 100644 => 100755 hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/PBKDF2.java mode change 100644 => 100755 hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/RC4.java mode change 100644 => 100755 hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricCrypto.java mode change 100644 => 100755 hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricEncryptor.java mode change 100644 => 100755 hutool-crypto/src/test/java/cn/hutool/crypto/test/asymmetric/RSATest.java mode change 100644 => 100755 hutool-crypto/src/test/java/cn/hutool/crypto/test/asymmetric/SM2Test.java mode change 100644 => 100755 hutool-crypto/src/test/java/cn/hutool/crypto/test/symmetric/AESTest.java mode change 100644 => 100755 hutool-db/src/main/java/cn/hutool/db/AbstractDb.java mode change 100644 => 100755 hutool-db/src/main/java/cn/hutool/db/ActiveEntity.java mode change 100644 => 100755 hutool-db/src/main/java/cn/hutool/db/Entity.java mode change 100644 => 100755 hutool-db/src/main/java/cn/hutool/db/ThreadLocalConnection.java mode change 100644 => 100755 hutool-db/src/main/java/cn/hutool/db/dialect/DialectFactory.java mode change 100644 => 100755 hutool-db/src/main/java/cn/hutool/db/meta/Column.java mode change 100644 => 100755 hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java mode change 100644 => 100755 hutool-db/src/main/java/cn/hutool/db/sql/SqlExecutor.java mode change 100644 => 100755 hutool-db/src/test/java/cn/hutool/db/ConcurentTest.java mode change 100644 => 100755 hutool-db/src/test/java/cn/hutool/db/MySQLTest.java mode change 100644 => 100755 hutool-db/src/test/java/cn/hutool/db/OracleTest.java mode change 100644 => 100755 hutool-db/src/test/java/cn/hutool/db/SqlServerTest.java mode change 100644 => 100755 hutool-dfa/src/main/java/cn/hutool/dfa/FoundWord.java mode change 100644 => 100755 hutool-dfa/src/main/java/cn/hutool/dfa/SensitiveProcessor.java mode change 100644 => 100755 hutool-dfa/src/main/java/cn/hutool/dfa/SensitiveUtil.java mode change 100644 => 100755 hutool-dfa/src/main/java/cn/hutool/dfa/StopChar.java mode change 100644 => 100755 hutool-dfa/src/main/java/cn/hutool/dfa/WordTree.java mode change 100644 => 100755 hutool-dfa/src/main/java/cn/hutool/dfa/package-info.java mode change 100644 => 100755 hutool-dfa/src/test/java/cn/hutool/dfa/DfaTest.java mode change 100644 => 100755 hutool-dfa/src/test/java/cn/hutool/dfa/SensitiveUtilTest.java mode change 100644 => 100755 hutool-extra/src/main/java/cn/hutool/extra/compress/archiver/Archiver.java mode change 100644 => 100755 hutool-extra/src/main/java/cn/hutool/extra/compress/archiver/SevenZArchiver.java mode change 100644 => 100755 hutool-extra/src/main/java/cn/hutool/extra/compress/archiver/StreamArchiver.java mode change 100644 => 100755 hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/Extractor.java mode change 100644 => 100755 hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/SevenZExtractor.java mode change 100644 => 100755 hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/StreamExtractor.java mode change 100644 => 100755 hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrCodeUtil.java mode change 100644 => 100755 hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrConfig.java mode change 100644 => 100755 hutool-extra/src/main/java/cn/hutool/extra/spring/SpringUtil.java mode change 100644 => 100755 hutool-extra/src/main/java/cn/hutool/extra/ssh/JschSessionPool.java mode change 100644 => 100755 hutool-extra/src/main/java/cn/hutool/extra/template/engine/enjoy/EnjoyEngine.java mode change 100644 => 100755 hutool-extra/src/main/java/cn/hutool/extra/template/engine/rythm/RythmTemplate.java mode change 100644 => 100755 hutool-extra/src/main/java/cn/hutool/extra/template/engine/thymeleaf/ThymeleafTemplate.java mode change 100644 => 100755 hutool-extra/src/main/java/cn/hutool/extra/template/engine/velocity/VelocityTemplate.java mode change 100644 => 100755 hutool-extra/src/main/java/cn/hutool/extra/template/engine/wit/WitEngine.java mode change 100644 => 100755 hutool-extra/src/main/java/cn/hutool/extra/template/engine/wit/WitTemplate.java mode change 100644 => 100755 hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/TokenizerFactory.java mode change 100644 => 100755 hutool-extra/src/test/java/cn/hutool/extra/expression/AviatorTest.java mode change 100644 => 100755 hutool-extra/src/test/java/cn/hutool/extra/expression/ExpressionUtilTest.java mode change 100644 => 100755 hutool-extra/src/test/java/cn/hutool/extra/qrcode/QrCodeUtilTest.java mode change 100644 => 100755 hutool-extra/src/test/java/cn/hutool/extra/spring/SpringUtilTest.java mode change 100644 => 100755 hutool-extra/src/test/java/cn/hutool/extra/spring/SpringUtilWithAutoConfigTest.java mode change 100644 => 100755 hutool-extra/src/test/java/cn/hutool/extra/ssh/JschUtilTest.java mode change 100644 => 100755 hutool-extra/src/test/java/cn/hutool/extra/template/TemplateUtilTest.java mode change 100644 => 100755 hutool-extra/src/test/java/cn/hutool/extra/template/ThymeleafTest.java mode change 100644 => 100755 hutool-extra/src/test/java/cn/hutool/extra/template/VelocityTest.java mode change 100644 => 100755 hutool-http/src/main/java/cn/hutool/http/HtmlUtil.java mode change 100644 => 100755 hutool-http/src/main/java/cn/hutool/http/HttpResponse.java mode change 100644 => 100755 hutool-http/src/main/java/cn/hutool/http/HttpUtil.java mode change 100644 => 100755 hutool-http/src/main/java/cn/hutool/http/ssl/SSLSocketFactoryBuilder.java mode change 100644 => 100755 hutool-http/src/main/java/cn/hutool/http/useragent/Browser.java mode change 100644 => 100755 hutool-http/src/main/java/cn/hutool/http/useragent/Engine.java mode change 100644 => 100755 hutool-http/src/main/java/cn/hutool/http/useragent/OS.java mode change 100644 => 100755 hutool-http/src/main/java/cn/hutool/http/useragent/UserAgentInfo.java mode change 100644 => 100755 hutool-http/src/test/java/cn/hutool/http/HttpUtilTest.java mode change 100644 => 100755 hutool-http/src/test/java/cn/hutool/http/server/BlankServerTest.java mode change 100644 => 100755 hutool-http/src/test/java/cn/hutool/http/server/DocServerTest.java mode change 100644 => 100755 hutool-json/src/main/java/cn/hutool/json/JSON.java mode change 100644 => 100755 hutool-json/src/main/java/cn/hutool/json/JSONConfig.java mode change 100644 => 100755 hutool-json/src/main/java/cn/hutool/json/xml/JSONXMLSerializer.java mode change 100644 => 100755 hutool-json/src/test/java/cn/hutool/json/Issue1101Test.java mode change 100644 => 100755 hutool-json/src/test/java/cn/hutool/json/Issue488Test.java mode change 100644 => 100755 hutool-json/src/test/java/cn/hutool/json/issueIVMD5/IssueIVMD5Test.java mode change 100644 => 100755 hutool-jwt/src/main/java/cn/hutool/jwt/Claims.java mode change 100644 => 100755 hutool-jwt/src/main/java/cn/hutool/jwt/JWT.java mode change 100644 => 100755 hutool-jwt/src/main/java/cn/hutool/jwt/JWTException.java mode change 100644 => 100755 hutool-jwt/src/main/java/cn/hutool/jwt/JWTHeader.java mode change 100644 => 100755 hutool-jwt/src/main/java/cn/hutool/jwt/JWTPayload.java mode change 100644 => 100755 hutool-jwt/src/main/java/cn/hutool/jwt/JWTUtil.java mode change 100644 => 100755 hutool-jwt/src/main/java/cn/hutool/jwt/JWTValidator.java mode change 100644 => 100755 hutool-jwt/src/main/java/cn/hutool/jwt/RegisteredPayload.java mode change 100644 => 100755 hutool-jwt/src/main/java/cn/hutool/jwt/package-info.java mode change 100644 => 100755 hutool-jwt/src/main/java/cn/hutool/jwt/signers/AlgorithmUtil.java mode change 100644 => 100755 hutool-jwt/src/main/java/cn/hutool/jwt/signers/AsymmetricJWTSigner.java mode change 100644 => 100755 hutool-jwt/src/main/java/cn/hutool/jwt/signers/HMacJWTSigner.java mode change 100644 => 100755 hutool-jwt/src/main/java/cn/hutool/jwt/signers/JWTSigner.java mode change 100644 => 100755 hutool-jwt/src/main/java/cn/hutool/jwt/signers/JWTSignerUtil.java mode change 100644 => 100755 hutool-jwt/src/main/java/cn/hutool/jwt/signers/NoneJWTSigner.java mode change 100644 => 100755 hutool-jwt/src/main/java/cn/hutool/jwt/signers/package-info.java mode change 100644 => 100755 hutool-jwt/src/test/java/cn/hutool/jwt/JWTSignerTest.java mode change 100644 => 100755 hutool-jwt/src/test/java/cn/hutool/jwt/JWTTest.java mode change 100644 => 100755 hutool-jwt/src/test/java/cn/hutool/jwt/JWTUtilTest.java mode change 100644 => 100755 hutool-jwt/src/test/java/cn/hutool/jwt/JWTValidatorTest.java mode change 100644 => 100755 hutool-log/src/main/java/cn/hutool/log/Log.java mode change 100644 => 100755 hutool-log/src/main/java/cn/hutool/log/StaticLog.java mode change 100644 => 100755 hutool-log/src/main/java/cn/hutool/log/dialect/jdk/JdkLogFactory.java mode change 100644 => 100755 hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelUtil.java mode change 100644 => 100755 hutool-poi/src/main/java/cn/hutool/poi/excel/cell/setters/EscapeStrCellSetter.java mode change 100644 => 100755 hutool-poi/src/main/java/cn/hutool/poi/word/TableUtil.java mode change 100644 => 100755 hutool-poi/src/test/java/cn/hutool/poi/excel/CellUtilTest.java mode change 100644 => 100755 hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelWriteTest.java mode change 100644 => 100755 hutool-script/src/main/java/cn/hutool/script/FullSupportScriptEngine.java mode change 100644 => 100755 hutool-script/src/main/java/cn/hutool/script/JavaScriptEngine.java mode change 100644 => 100755 hutool-script/src/main/java/cn/hutool/script/ScriptRuntimeException.java mode change 100644 => 100755 hutool-script/src/main/java/cn/hutool/script/package-info.java mode change 100644 => 100755 hutool-script/src/test/java/cn/hutool/script/test/NashornDeepTest.java mode change 100644 => 100755 hutool-script/src/test/java/cn/hutool/script/test/ScriptUtilTest.java mode change 100644 => 100755 hutool-script/src/test/resources/filter1.js mode change 100644 => 100755 hutool-setting/src/main/java/cn/hutool/setting/SettingLoader.java mode change 100644 => 100755 hutool-setting/src/main/java/cn/hutool/setting/profile/GlobalProfile.java mode change 100644 => 100755 hutool-setting/src/main/java/cn/hutool/setting/profile/Profile.java mode change 100644 => 100755 hutool-setting/src/main/java/cn/hutool/setting/yaml/YamlUtil.java mode change 100644 => 100755 hutool-setting/src/test/java/cn/hutool/setting/yaml/YamlUtilTest.java mode change 100644 => 100755 hutool-socket/src/test/java/cn/hutool/socket/aio/AioClientTest.java mode change 100644 => 100755 hutool-socket/src/test/java/cn/hutool/socket/aio/AioServerTest.java mode change 100644 => 100755 hutool-socket/src/test/java/cn/hutool/socket/nio/NioClientTest.java mode change 100644 => 100755 hutool-socket/src/test/java/cn/hutool/socket/nio/NioServerTest.java mode change 100644 => 100755 hutool-system/src/main/java/cn/hutool/system/HostInfo.java mode change 100644 => 100755 hutool-system/src/main/java/cn/hutool/system/JavaInfo.java mode change 100644 => 100755 hutool-system/src/main/java/cn/hutool/system/JavaRuntimeInfo.java mode change 100644 => 100755 hutool-system/src/main/java/cn/hutool/system/JavaSpecInfo.java mode change 100644 => 100755 hutool-system/src/main/java/cn/hutool/system/JvmInfo.java mode change 100644 => 100755 hutool-system/src/main/java/cn/hutool/system/JvmSpecInfo.java mode change 100644 => 100755 hutool-system/src/main/java/cn/hutool/system/OsInfo.java mode change 100644 => 100755 hutool-system/src/main/java/cn/hutool/system/RuntimeInfo.java mode change 100644 => 100755 hutool-system/src/main/java/cn/hutool/system/SystemPropsKeys.java mode change 100644 => 100755 hutool-system/src/main/java/cn/hutool/system/SystemUtil.java mode change 100644 => 100755 hutool-system/src/main/java/cn/hutool/system/UserInfo.java mode change 100644 => 100755 hutool-system/src/main/java/cn/hutool/system/oshi/CpuInfo.java mode change 100644 => 100755 hutool-system/src/main/java/cn/hutool/system/oshi/CpuTicks.java mode change 100644 => 100755 hutool-system/src/main/java/cn/hutool/system/oshi/OshiUtil.java mode change 100644 => 100755 hutool-system/src/main/java/cn/hutool/system/oshi/package-info.java mode change 100644 => 100755 hutool-system/src/main/java/cn/hutool/system/package-info.java mode change 100644 => 100755 hutool-system/src/test/java/cn/hutool/system/OshiPrintTest.java mode change 100644 => 100755 hutool-system/src/test/java/cn/hutool/system/OshiTest.java mode change 100644 => 100755 hutool-system/src/test/java/cn/hutool/system/SystemUtilTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 14c1f65d87..03c12e4f15 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,12 +3,13 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.0.M5 (2022-04-27) +# 5.8.0.M5 (2022-04-28) ### ❌不兼容特性 * 【extra 】 升级jakarta.validation-api到3.x,包名变更导致不能向下兼容 ### 🐣新特性 +* 【core 】 Singleton增加部分方法(pr#609@Gitee) ### 🐞Bug修复 * 【db 】 修复RedisDS无法设置maxWaitMillis问题(issue#I54TZ9@Gitee) diff --git a/hutool-aop/src/main/java/cn/hutool/aop/ProxyUtil.java b/hutool-aop/src/main/java/cn/hutool/aop/ProxyUtil.java old mode 100644 new mode 100755 diff --git a/hutool-aop/src/main/java/cn/hutool/aop/aspects/Aspect.java b/hutool-aop/src/main/java/cn/hutool/aop/aspects/Aspect.java old mode 100644 new mode 100755 diff --git a/hutool-aop/src/main/java/cn/hutool/aop/aspects/SimpleAspect.java b/hutool-aop/src/main/java/cn/hutool/aop/aspects/SimpleAspect.java old mode 100644 new mode 100755 diff --git a/hutool-aop/src/main/java/cn/hutool/aop/aspects/TimeIntervalAspect.java b/hutool-aop/src/main/java/cn/hutool/aop/aspects/TimeIntervalAspect.java old mode 100644 new mode 100755 diff --git a/hutool-aop/src/main/java/cn/hutool/aop/aspects/package-info.java b/hutool-aop/src/main/java/cn/hutool/aop/aspects/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-aop/src/main/java/cn/hutool/aop/interceptor/CglibInterceptor.java b/hutool-aop/src/main/java/cn/hutool/aop/interceptor/CglibInterceptor.java old mode 100644 new mode 100755 diff --git a/hutool-aop/src/main/java/cn/hutool/aop/interceptor/JdkInterceptor.java b/hutool-aop/src/main/java/cn/hutool/aop/interceptor/JdkInterceptor.java old mode 100644 new mode 100755 diff --git a/hutool-aop/src/main/java/cn/hutool/aop/interceptor/SpringCglibInterceptor.java b/hutool-aop/src/main/java/cn/hutool/aop/interceptor/SpringCglibInterceptor.java old mode 100644 new mode 100755 diff --git a/hutool-aop/src/main/java/cn/hutool/aop/interceptor/package-info.java b/hutool-aop/src/main/java/cn/hutool/aop/interceptor/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-aop/src/main/java/cn/hutool/aop/package-info.java b/hutool-aop/src/main/java/cn/hutool/aop/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-aop/src/main/java/cn/hutool/aop/proxy/CglibProxyFactory.java b/hutool-aop/src/main/java/cn/hutool/aop/proxy/CglibProxyFactory.java old mode 100644 new mode 100755 diff --git a/hutool-aop/src/main/java/cn/hutool/aop/proxy/JdkProxyFactory.java b/hutool-aop/src/main/java/cn/hutool/aop/proxy/JdkProxyFactory.java old mode 100644 new mode 100755 diff --git a/hutool-aop/src/main/java/cn/hutool/aop/proxy/ProxyFactory.java b/hutool-aop/src/main/java/cn/hutool/aop/proxy/ProxyFactory.java old mode 100644 new mode 100755 diff --git a/hutool-aop/src/main/java/cn/hutool/aop/proxy/SpringCglibProxyFactory.java b/hutool-aop/src/main/java/cn/hutool/aop/proxy/SpringCglibProxyFactory.java old mode 100644 new mode 100755 diff --git a/hutool-aop/src/main/java/cn/hutool/aop/proxy/package-info.java b/hutool-aop/src/main/java/cn/hutool/aop/proxy/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-aop/src/main/resources/META-INF/services/cn.hutool.aop.proxy.ProxyFactory b/hutool-aop/src/main/resources/META-INF/services/cn.hutool.aop.proxy.ProxyFactory old mode 100644 new mode 100755 diff --git a/hutool-aop/src/test/java/cn/hutool/aop/test/AopTest.java b/hutool-aop/src/test/java/cn/hutool/aop/test/AopTest.java old mode 100644 new mode 100755 diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/BitMapBloomFilter.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/BitMapBloomFilter.java old mode 100644 new mode 100755 diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/BitSetBloomFilter.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/BitSetBloomFilter.java old mode 100644 new mode 100755 diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/BloomFilter.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/BloomFilter.java old mode 100644 new mode 100755 diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/BloomFilterUtil.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/BloomFilterUtil.java old mode 100644 new mode 100755 diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/BitMap.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/BitMap.java old mode 100644 new mode 100755 diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/IntMap.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/IntMap.java old mode 100644 new mode 100755 diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/LongMap.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/LongMap.java old mode 100644 new mode 100755 diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/package-info.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/AbstractFilter.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/AbstractFilter.java old mode 100644 new mode 100755 diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/DefaultFilter.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/DefaultFilter.java old mode 100644 new mode 100755 diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/ELFFilter.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/ELFFilter.java old mode 100644 new mode 100755 diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/FNVFilter.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/FNVFilter.java old mode 100644 new mode 100755 diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/FuncFilter.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/FuncFilter.java old mode 100644 new mode 100755 diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/HfFilter.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/HfFilter.java old mode 100644 new mode 100755 diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/HfIpFilter.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/HfIpFilter.java old mode 100644 new mode 100755 diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/JSFilter.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/JSFilter.java old mode 100644 new mode 100755 diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/PJWFilter.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/PJWFilter.java old mode 100644 new mode 100755 diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/RSFilter.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/RSFilter.java old mode 100644 new mode 100755 diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/SDBMFilter.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/SDBMFilter.java old mode 100644 new mode 100755 diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/TianlFilter.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/TianlFilter.java old mode 100644 new mode 100755 diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/package-info.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/package-info.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-bloomFilter/src/test/java/cn/hutool/bloomfilter/BitMapBloomFilterTest.java b/hutool-bloomFilter/src/test/java/cn/hutool/bloomfilter/BitMapBloomFilterTest.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/main/java/cn/hutool/cache/Cache.java b/hutool-cache/src/main/java/cn/hutool/cache/Cache.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/main/java/cn/hutool/cache/CacheListener.java b/hutool-cache/src/main/java/cn/hutool/cache/CacheListener.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/main/java/cn/hutool/cache/CacheUtil.java b/hutool-cache/src/main/java/cn/hutool/cache/CacheUtil.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/main/java/cn/hutool/cache/GlobalPruneTimer.java b/hutool-cache/src/main/java/cn/hutool/cache/GlobalPruneTimer.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/main/java/cn/hutool/cache/file/AbstractFileCache.java b/hutool-cache/src/main/java/cn/hutool/cache/file/AbstractFileCache.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/main/java/cn/hutool/cache/file/LFUFileCache.java b/hutool-cache/src/main/java/cn/hutool/cache/file/LFUFileCache.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/main/java/cn/hutool/cache/file/LRUFileCache.java b/hutool-cache/src/main/java/cn/hutool/cache/file/LRUFileCache.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/main/java/cn/hutool/cache/file/package-info.java b/hutool-cache/src/main/java/cn/hutool/cache/file/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/main/java/cn/hutool/cache/impl/AbstractCache.java b/hutool-cache/src/main/java/cn/hutool/cache/impl/AbstractCache.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/main/java/cn/hutool/cache/impl/CacheObj.java b/hutool-cache/src/main/java/cn/hutool/cache/impl/CacheObj.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/main/java/cn/hutool/cache/impl/CacheObjIterator.java b/hutool-cache/src/main/java/cn/hutool/cache/impl/CacheObjIterator.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/main/java/cn/hutool/cache/impl/CacheValuesIterator.java b/hutool-cache/src/main/java/cn/hutool/cache/impl/CacheValuesIterator.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/main/java/cn/hutool/cache/impl/FIFOCache.java b/hutool-cache/src/main/java/cn/hutool/cache/impl/FIFOCache.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/main/java/cn/hutool/cache/impl/LFUCache.java b/hutool-cache/src/main/java/cn/hutool/cache/impl/LFUCache.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/main/java/cn/hutool/cache/impl/LRUCache.java b/hutool-cache/src/main/java/cn/hutool/cache/impl/LRUCache.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/main/java/cn/hutool/cache/impl/NoCache.java b/hutool-cache/src/main/java/cn/hutool/cache/impl/NoCache.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/main/java/cn/hutool/cache/impl/ReentrantCache.java b/hutool-cache/src/main/java/cn/hutool/cache/impl/ReentrantCache.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/main/java/cn/hutool/cache/impl/StampedCache.java b/hutool-cache/src/main/java/cn/hutool/cache/impl/StampedCache.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/main/java/cn/hutool/cache/impl/TimedCache.java b/hutool-cache/src/main/java/cn/hutool/cache/impl/TimedCache.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/main/java/cn/hutool/cache/impl/package-info.java b/hutool-cache/src/main/java/cn/hutool/cache/impl/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/main/java/cn/hutool/cache/package-info.java b/hutool-cache/src/main/java/cn/hutool/cache/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/test/java/cn/hutool/cache/CacheConcurrentTest.java b/hutool-cache/src/test/java/cn/hutool/cache/CacheConcurrentTest.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/test/java/cn/hutool/cache/CacheTest.java b/hutool-cache/src/test/java/cn/hutool/cache/CacheTest.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/test/java/cn/hutool/cache/FileCacheTest.java b/hutool-cache/src/test/java/cn/hutool/cache/FileCacheTest.java old mode 100644 new mode 100755 diff --git a/hutool-cache/src/test/java/cn/hutool/cache/LRUCacheTest.java b/hutool-cache/src/test/java/cn/hutool/cache/LRUCacheTest.java old mode 100644 new mode 100755 diff --git a/hutool-captcha/src/main/java/cn/hutool/captcha/AbstractCaptcha.java b/hutool-captcha/src/main/java/cn/hutool/captcha/AbstractCaptcha.java old mode 100644 new mode 100755 diff --git a/hutool-captcha/src/main/java/cn/hutool/captcha/CaptchaUtil.java b/hutool-captcha/src/main/java/cn/hutool/captcha/CaptchaUtil.java old mode 100644 new mode 100755 diff --git a/hutool-captcha/src/main/java/cn/hutool/captcha/CircleCaptcha.java b/hutool-captcha/src/main/java/cn/hutool/captcha/CircleCaptcha.java old mode 100644 new mode 100755 diff --git a/hutool-captcha/src/main/java/cn/hutool/captcha/GifCaptcha.java b/hutool-captcha/src/main/java/cn/hutool/captcha/GifCaptcha.java old mode 100644 new mode 100755 diff --git a/hutool-captcha/src/main/java/cn/hutool/captcha/ICaptcha.java b/hutool-captcha/src/main/java/cn/hutool/captcha/ICaptcha.java old mode 100644 new mode 100755 diff --git a/hutool-captcha/src/main/java/cn/hutool/captcha/LineCaptcha.java b/hutool-captcha/src/main/java/cn/hutool/captcha/LineCaptcha.java old mode 100644 new mode 100755 diff --git a/hutool-captcha/src/main/java/cn/hutool/captcha/ShearCaptcha.java b/hutool-captcha/src/main/java/cn/hutool/captcha/ShearCaptcha.java old mode 100644 new mode 100755 diff --git a/hutool-captcha/src/main/java/cn/hutool/captcha/generator/AbstractGenerator.java b/hutool-captcha/src/main/java/cn/hutool/captcha/generator/AbstractGenerator.java old mode 100644 new mode 100755 diff --git a/hutool-captcha/src/main/java/cn/hutool/captcha/generator/CodeGenerator.java b/hutool-captcha/src/main/java/cn/hutool/captcha/generator/CodeGenerator.java old mode 100644 new mode 100755 diff --git a/hutool-captcha/src/main/java/cn/hutool/captcha/generator/MathGenerator.java b/hutool-captcha/src/main/java/cn/hutool/captcha/generator/MathGenerator.java old mode 100644 new mode 100755 diff --git a/hutool-captcha/src/main/java/cn/hutool/captcha/generator/RandomGenerator.java b/hutool-captcha/src/main/java/cn/hutool/captcha/generator/RandomGenerator.java old mode 100644 new mode 100755 diff --git a/hutool-captcha/src/main/java/cn/hutool/captcha/generator/package-info.java b/hutool-captcha/src/main/java/cn/hutool/captcha/generator/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-captcha/src/main/java/cn/hutool/captcha/package-info.java b/hutool-captcha/src/main/java/cn/hutool/captcha/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-captcha/src/test/java/cn/hutool/captcha/CaptchaTest.java b/hutool-captcha/src/test/java/cn/hutool/captcha/CaptchaTest.java old mode 100644 new mode 100755 diff --git a/hutool-captcha/src/test/java/cn/hutool/captcha/CaptchaUtilTest.java b/hutool-captcha/src/test/java/cn/hutool/captcha/CaptchaUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-captcha/src/test/java/cn/hutool/captcha/GeneratorTest.java b/hutool-captcha/src/test/java/cn/hutool/captcha/GeneratorTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanCopier.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanCopier.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/codec/Base64.java b/hutool-core/src/main/java/cn/hutool/core/codec/Base64.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/codec/PercentCodec.java b/hutool-core/src/main/java/cn/hutool/core/codec/PercentCodec.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/FilterIter.java b/hutool-core/src/main/java/cn/hutool/core/collection/FilterIter.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/TransCollection.java b/hutool-core/src/main/java/cn/hutool/core/collection/TransCollection.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/comparator/BaseFieldComparator.java b/hutool-core/src/main/java/cn/hutool/core/comparator/BaseFieldComparator.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/Convert.java b/hutool-core/src/main/java/cn/hutool/core/convert/Convert.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java b/hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/exceptions/CheckedUtil.java b/hutool-core/src/main/java/cn/hutool/core/exceptions/CheckedUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/img/BackgroundRemoval.java b/hutool-core/src/main/java/cn/hutool/core/img/BackgroundRemoval.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/img/FontUtil.java b/hutool-core/src/main/java/cn/hutool/core/img/FontUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/img/GraphicsUtil.java b/hutool-core/src/main/java/cn/hutool/core/img/GraphicsUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/img/Img.java b/hutool-core/src/main/java/cn/hutool/core/img/Img.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java b/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/img/ScaleType.java b/hutool-core/src/main/java/cn/hutool/core/img/ScaleType.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/img/gif/AnimatedGifEncoder.java b/hutool-core/src/main/java/cn/hutool/core/img/gif/AnimatedGifEncoder.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/img/gif/GifDecoder.java b/hutool-core/src/main/java/cn/hutool/core/img/gif/GifDecoder.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/img/gif/LZWEncoder.java b/hutool-core/src/main/java/cn/hutool/core/img/gif/LZWEncoder.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/img/gif/NeuQuant.java b/hutool-core/src/main/java/cn/hutool/core/img/gif/NeuQuant.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/img/gif/package-info.java b/hutool-core/src/main/java/cn/hutool/core/img/gif/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/img/package-info.java b/hutool-core/src/main/java/cn/hutool/core/img/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/io/IoUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/IoUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/io/checksum/crc16/CRC16Checksum.java b/hutool-core/src/main/java/cn/hutool/core/io/checksum/crc16/CRC16Checksum.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/FileCopier.java b/hutool-core/src/main/java/cn/hutool/core/io/file/FileCopier.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/FileNameUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/file/FileNameUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/io/resource/ResourceUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/resource/ResourceUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/io/resource/UrlResource.java b/hutool-core/src/main/java/cn/hutool/core/io/resource/UrlResource.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchServer.java b/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchServer.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/ClassScanner.java b/hutool-core/src/main/java/cn/hutool/core/lang/ClassScanner.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/ConsistentHash.java b/hutool-core/src/main/java/cn/hutool/core/lang/ConsistentHash.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Dict.java b/hutool-core/src/main/java/cn/hutool/core/lang/Dict.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Editor.java b/hutool-core/src/main/java/cn/hutool/core/lang/Editor.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Filter.java b/hutool-core/src/main/java/cn/hutool/core/lang/Filter.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Matcher.java b/hutool-core/src/main/java/cn/hutool/core/lang/Matcher.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/ObjectId.java b/hutool-core/src/main/java/cn/hutool/core/lang/ObjectId.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/ParameterizedTypeImpl.java b/hutool-core/src/main/java/cn/hutool/core/lang/ParameterizedTypeImpl.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Replacer.java b/hutool-core/src/main/java/cn/hutool/core/lang/Replacer.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java b/hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java index ba49e1e99a..4a60648adc 100755 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java @@ -6,8 +6,6 @@ import cn.hutool.core.util.ClassUtil; import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; -import java.util.Collection; -import java.util.HashSet; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Snowflake.java b/hutool-core/src/main/java/cn/hutool/core/lang/Snowflake.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/TypeReference.java b/hutool-core/src/main/java/cn/hutool/core/lang/TypeReference.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/UUID.java b/hutool-core/src/main/java/cn/hutool/core/lang/UUID.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Validator.java b/hutool-core/src/main/java/cn/hutool/core/lang/Validator.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/WeightRandom.java b/hutool-core/src/main/java/cn/hutool/core/lang/WeightRandom.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/caller/package-info.java b/hutool-core/src/main/java/cn/hutool/core/lang/caller/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/copier/SrcToDestCopier.java b/hutool-core/src/main/java/cn/hutool/core/lang/copier/SrcToDestCopier.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/copier/package-info.java b/hutool-core/src/main/java/cn/hutool/core/lang/copier/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/package-info.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/generator/ObjectIdGenerator.java b/hutool-core/src/main/java/cn/hutool/core/lang/generator/ObjectIdGenerator.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/generator/SnowflakeGenerator.java b/hutool-core/src/main/java/cn/hutool/core/lang/generator/SnowflakeGenerator.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/generator/UUIDGenerator.java b/hutool-core/src/main/java/cn/hutool/core/lang/generator/UUIDGenerator.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/generator/package-info.java b/hutool-core/src/main/java/cn/hutool/core/lang/generator/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/hash/package-info.java b/hutool-core/src/main/java/cn/hutool/core/lang/hash/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/id/NanoId.java b/hutool-core/src/main/java/cn/hutool/core/lang/id/NanoId.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/intern/Interner.java b/hutool-core/src/main/java/cn/hutool/core/lang/intern/Interner.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/intern/package-info.java b/hutool-core/src/main/java/cn/hutool/core/lang/intern/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/loader/LazyFunLoader.java b/hutool-core/src/main/java/cn/hutool/core/lang/loader/LazyFunLoader.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/loader/package-info.java b/hutool-core/src/main/java/cn/hutool/core/lang/loader/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/Mutable.java b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/Mutable.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/package-info.java b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/package-info.java b/hutool-core/src/main/java/cn/hutool/core/lang/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/reflect/package-info.java b/hutool-core/src/main/java/cn/hutool/core/lang/reflect/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/tree/Node.java b/hutool-core/src/main/java/cn/hutool/core/lang/tree/Node.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/tree/Tree.java b/hutool-core/src/main/java/cn/hutool/core/lang/tree/Tree.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/tree/TreeBuilder.java b/hutool-core/src/main/java/cn/hutool/core/lang/tree/TreeBuilder.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/tree/TreeNode.java b/hutool-core/src/main/java/cn/hutool/core/lang/tree/TreeNode.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/tree/TreeNodeConfig.java b/hutool-core/src/main/java/cn/hutool/core/lang/tree/TreeNodeConfig.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/tree/package-info.java b/hutool-core/src/main/java/cn/hutool/core/lang/tree/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/tree/parser/DefaultNodeParser.java b/hutool-core/src/main/java/cn/hutool/core/lang/tree/parser/DefaultNodeParser.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/tree/parser/NodeParser.java b/hutool-core/src/main/java/cn/hutool/core/lang/tree/parser/NodeParser.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java b/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Util.java b/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Util.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/net/NetUtil.java b/hutool-core/src/main/java/cn/hutool/core/net/NetUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/net/URLEncoder.java b/hutool-core/src/main/java/cn/hutool/core/net/URLEncoder.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/net/url/UrlBuilder.java b/hutool-core/src/main/java/cn/hutool/core/net/url/UrlBuilder.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/swing/DesktopUtil.java b/hutool-core/src/main/java/cn/hutool/core/swing/DesktopUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/swing/RobotUtil.java b/hutool-core/src/main/java/cn/hutool/core/swing/RobotUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/swing/ScreenUtil.java b/hutool-core/src/main/java/cn/hutool/core/swing/ScreenUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardListener.java b/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardListener.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardMonitor.java b/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardMonitor.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardUtil.java b/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ImageSelection.java b/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ImageSelection.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/StrClipboardListener.java b/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/StrClipboardListener.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/package-info.java b/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/swing/package-info.java b/hutool-core/src/main/java/cn/hutool/core/swing/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/text/StrSplitter.java b/hutool-core/src/main/java/cn/hutool/core/text/StrSplitter.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/text/UnicodeUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/UnicodeUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvBaseReader.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvBaseReader.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvConfig.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvConfig.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvData.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvData.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvParser.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvParser.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvReadConfig.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvReadConfig.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvReader.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvReader.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvRow.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvRow.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvRowHandler.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvRowHandler.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvWriteConfig.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvWriteConfig.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvWriter.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvWriter.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/package-info.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/text/finder/CharMatcherFinder.java b/hutool-core/src/main/java/cn/hutool/core/text/finder/CharMatcherFinder.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/text/replacer/StrReplacer.java b/hutool-core/src/main/java/cn/hutool/core/text/replacer/StrReplacer.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/CreditCodeUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/CreditCodeUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/EscapeUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/EscapeUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/HashUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/HashUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/HexUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/HexUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/IdUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/IdUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/PhoneUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/PhoneUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/RandomUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/RandomUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ReUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ReUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/RuntimeUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/RuntimeUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/TypeUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/TypeUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ZipUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ZipUtil.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToBeanTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToBeanTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToCollectionTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToCollectionTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/date/LocalDateTimeUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/date/LocalDateTimeUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/img/FontUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/img/FontUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/img/ImgTest.java b/hutool-core/src/test/java/cn/hutool/core/img/ImgTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/img/ImgUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/img/ImgUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/io/WatchMonitorTest.java b/hutool-core/src/test/java/cn/hutool/core/io/WatchMonitorTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/io/checksum/CrcTest.java b/hutool-core/src/test/java/cn/hutool/core/io/checksum/CrcTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/AssertTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/AssertTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/DictTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/DictTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/ObjectIdTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/ObjectIdTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/SnowflakeTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/SnowflakeTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/UUIDTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/UUIDTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/ValidatorTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/ValidatorTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/caller/CallerTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/caller/CallerTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/caller/CallerUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/caller/CallerUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/hash/MetroHashTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/hash/MetroHashTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/tree/TreeBuilderTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/tree/TreeBuilderTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/tree/TreeSearchTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/tree/TreeSearchTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/tree/TreeTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/tree/TreeTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/math/ArrangementTest.java b/hutool-core/src/test/java/cn/hutool/core/math/ArrangementTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/net/NetUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/net/NetUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/swing/ClipboardMonitorTest.java b/hutool-core/src/test/java/cn/hutool/core/swing/ClipboardMonitorTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/swing/ClipboardUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/swing/ClipboardUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/swing/DesktopUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/swing/DesktopUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/swing/RobotUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/swing/RobotUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/text/NamingCaseTest.java b/hutool-core/src/test/java/cn/hutool/core/text/NamingCaseTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvParserTest.java b/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvParserTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvReaderTest.java b/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvReaderTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/thread/ConcurrencyTesterTest.java b/hutool-core/src/test/java/cn/hutool/core/thread/ConcurrencyTesterTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/util/EscapeUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/EscapeUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/util/HashUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/HashUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/util/HexUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/HexUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/util/IdUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/IdUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/resources/test-compile/a/A.java b/hutool-core/src/test/resources/test-compile/a/A.java old mode 100644 new mode 100755 diff --git a/hutool-core/src/test/resources/test_bean.csv b/hutool-core/src/test/resources/test_bean.csv old mode 100644 new mode 100755 diff --git a/hutool-cron/src/main/java/cn/hutool/cron/Scheduler.java b/hutool-cron/src/main/java/cn/hutool/cron/Scheduler.java old mode 100644 new mode 100755 diff --git a/hutool-cron/src/main/java/cn/hutool/cron/pattern/CronPatternUtil.java b/hutool-cron/src/main/java/cn/hutool/cron/pattern/CronPatternUtil.java old mode 100644 new mode 100755 diff --git a/hutool-cron/src/main/java/cn/hutool/cron/pattern/matcher/PartMatcher.java b/hutool-cron/src/main/java/cn/hutool/cron/pattern/matcher/PartMatcher.java old mode 100644 new mode 100755 diff --git a/hutool-cron/src/test/java/cn/hutool/cron/TaskTableTest.java b/hutool-cron/src/test/java/cn/hutool/cron/TaskTableTest.java old mode 100644 new mode 100755 diff --git a/hutool-cron/src/test/java/cn/hutool/cron/demo/AddAndRemoveMainTest.java b/hutool-cron/src/test/java/cn/hutool/cron/demo/AddAndRemoveMainTest.java old mode 100644 new mode 100755 diff --git a/hutool-cron/src/test/java/cn/hutool/cron/demo/TestJob.java b/hutool-cron/src/test/java/cn/hutool/cron/demo/TestJob.java old mode 100644 new mode 100755 diff --git a/hutool-cron/src/test/java/cn/hutool/cron/demo/TestJob2.java b/hutool-cron/src/test/java/cn/hutool/cron/demo/TestJob2.java old mode 100644 new mode 100755 diff --git a/hutool-cron/src/test/java/cn/hutool/cron/pattern/CronPatternTest.java b/hutool-cron/src/test/java/cn/hutool/cron/pattern/CronPatternTest.java old mode 100644 new mode 100755 diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/SecureUtil.java b/hutool-crypto/src/main/java/cn/hutool/crypto/SecureUtil.java old mode 100644 new mode 100755 diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/asymmetric/AsymmetricEncryptor.java b/hutool-crypto/src/main/java/cn/hutool/crypto/asymmetric/AsymmetricEncryptor.java old mode 100644 new mode 100755 diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/asymmetric/SM2.java b/hutool-crypto/src/main/java/cn/hutool/crypto/asymmetric/SM2.java old mode 100644 new mode 100755 diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/asymmetric/Sign.java b/hutool-crypto/src/main/java/cn/hutool/crypto/asymmetric/Sign.java old mode 100644 new mode 100755 diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/digest/Digester.java b/hutool-crypto/src/main/java/cn/hutool/crypto/digest/Digester.java old mode 100644 new mode 100755 diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/digest/mac/Mac.java b/hutool-crypto/src/main/java/cn/hutool/crypto/digest/mac/Mac.java old mode 100644 new mode 100755 diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/PBKDF2.java b/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/PBKDF2.java old mode 100644 new mode 100755 diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/RC4.java b/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/RC4.java old mode 100644 new mode 100755 diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricCrypto.java b/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricCrypto.java old mode 100644 new mode 100755 diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricEncryptor.java b/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricEncryptor.java old mode 100644 new mode 100755 diff --git a/hutool-crypto/src/test/java/cn/hutool/crypto/test/asymmetric/RSATest.java b/hutool-crypto/src/test/java/cn/hutool/crypto/test/asymmetric/RSATest.java old mode 100644 new mode 100755 diff --git a/hutool-crypto/src/test/java/cn/hutool/crypto/test/asymmetric/SM2Test.java b/hutool-crypto/src/test/java/cn/hutool/crypto/test/asymmetric/SM2Test.java old mode 100644 new mode 100755 diff --git a/hutool-crypto/src/test/java/cn/hutool/crypto/test/symmetric/AESTest.java b/hutool-crypto/src/test/java/cn/hutool/crypto/test/symmetric/AESTest.java old mode 100644 new mode 100755 diff --git a/hutool-db/src/main/java/cn/hutool/db/AbstractDb.java b/hutool-db/src/main/java/cn/hutool/db/AbstractDb.java old mode 100644 new mode 100755 diff --git a/hutool-db/src/main/java/cn/hutool/db/ActiveEntity.java b/hutool-db/src/main/java/cn/hutool/db/ActiveEntity.java old mode 100644 new mode 100755 diff --git a/hutool-db/src/main/java/cn/hutool/db/Entity.java b/hutool-db/src/main/java/cn/hutool/db/Entity.java old mode 100644 new mode 100755 diff --git a/hutool-db/src/main/java/cn/hutool/db/ThreadLocalConnection.java b/hutool-db/src/main/java/cn/hutool/db/ThreadLocalConnection.java old mode 100644 new mode 100755 diff --git a/hutool-db/src/main/java/cn/hutool/db/dialect/DialectFactory.java b/hutool-db/src/main/java/cn/hutool/db/dialect/DialectFactory.java old mode 100644 new mode 100755 diff --git a/hutool-db/src/main/java/cn/hutool/db/meta/Column.java b/hutool-db/src/main/java/cn/hutool/db/meta/Column.java old mode 100644 new mode 100755 diff --git a/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java b/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java old mode 100644 new mode 100755 diff --git a/hutool-db/src/main/java/cn/hutool/db/sql/SqlExecutor.java b/hutool-db/src/main/java/cn/hutool/db/sql/SqlExecutor.java old mode 100644 new mode 100755 diff --git a/hutool-db/src/test/java/cn/hutool/db/ConcurentTest.java b/hutool-db/src/test/java/cn/hutool/db/ConcurentTest.java old mode 100644 new mode 100755 diff --git a/hutool-db/src/test/java/cn/hutool/db/MySQLTest.java b/hutool-db/src/test/java/cn/hutool/db/MySQLTest.java old mode 100644 new mode 100755 diff --git a/hutool-db/src/test/java/cn/hutool/db/OracleTest.java b/hutool-db/src/test/java/cn/hutool/db/OracleTest.java old mode 100644 new mode 100755 diff --git a/hutool-db/src/test/java/cn/hutool/db/SqlServerTest.java b/hutool-db/src/test/java/cn/hutool/db/SqlServerTest.java old mode 100644 new mode 100755 diff --git a/hutool-dfa/src/main/java/cn/hutool/dfa/FoundWord.java b/hutool-dfa/src/main/java/cn/hutool/dfa/FoundWord.java old mode 100644 new mode 100755 diff --git a/hutool-dfa/src/main/java/cn/hutool/dfa/SensitiveProcessor.java b/hutool-dfa/src/main/java/cn/hutool/dfa/SensitiveProcessor.java old mode 100644 new mode 100755 diff --git a/hutool-dfa/src/main/java/cn/hutool/dfa/SensitiveUtil.java b/hutool-dfa/src/main/java/cn/hutool/dfa/SensitiveUtil.java old mode 100644 new mode 100755 diff --git a/hutool-dfa/src/main/java/cn/hutool/dfa/StopChar.java b/hutool-dfa/src/main/java/cn/hutool/dfa/StopChar.java old mode 100644 new mode 100755 diff --git a/hutool-dfa/src/main/java/cn/hutool/dfa/WordTree.java b/hutool-dfa/src/main/java/cn/hutool/dfa/WordTree.java old mode 100644 new mode 100755 diff --git a/hutool-dfa/src/main/java/cn/hutool/dfa/package-info.java b/hutool-dfa/src/main/java/cn/hutool/dfa/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-dfa/src/test/java/cn/hutool/dfa/DfaTest.java b/hutool-dfa/src/test/java/cn/hutool/dfa/DfaTest.java old mode 100644 new mode 100755 diff --git a/hutool-dfa/src/test/java/cn/hutool/dfa/SensitiveUtilTest.java b/hutool-dfa/src/test/java/cn/hutool/dfa/SensitiveUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/compress/archiver/Archiver.java b/hutool-extra/src/main/java/cn/hutool/extra/compress/archiver/Archiver.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/compress/archiver/SevenZArchiver.java b/hutool-extra/src/main/java/cn/hutool/extra/compress/archiver/SevenZArchiver.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/compress/archiver/StreamArchiver.java b/hutool-extra/src/main/java/cn/hutool/extra/compress/archiver/StreamArchiver.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/Extractor.java b/hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/Extractor.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/SevenZExtractor.java b/hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/SevenZExtractor.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/StreamExtractor.java b/hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/StreamExtractor.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrCodeUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrCodeUtil.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrConfig.java b/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrConfig.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/spring/SpringUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/spring/SpringUtil.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschSessionPool.java b/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschSessionPool.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/enjoy/EnjoyEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/enjoy/EnjoyEngine.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/rythm/RythmTemplate.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/rythm/RythmTemplate.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/thymeleaf/ThymeleafTemplate.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/thymeleaf/ThymeleafTemplate.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/velocity/VelocityTemplate.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/velocity/VelocityTemplate.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/wit/WitEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/wit/WitEngine.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/wit/WitTemplate.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/wit/WitTemplate.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/TokenizerFactory.java b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/TokenizerFactory.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/test/java/cn/hutool/extra/expression/AviatorTest.java b/hutool-extra/src/test/java/cn/hutool/extra/expression/AviatorTest.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/test/java/cn/hutool/extra/expression/ExpressionUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/expression/ExpressionUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/test/java/cn/hutool/extra/qrcode/QrCodeUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/qrcode/QrCodeUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/test/java/cn/hutool/extra/spring/SpringUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/spring/SpringUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/test/java/cn/hutool/extra/spring/SpringUtilWithAutoConfigTest.java b/hutool-extra/src/test/java/cn/hutool/extra/spring/SpringUtilWithAutoConfigTest.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/test/java/cn/hutool/extra/ssh/JschUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/ssh/JschUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/test/java/cn/hutool/extra/template/TemplateUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/template/TemplateUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/test/java/cn/hutool/extra/template/ThymeleafTest.java b/hutool-extra/src/test/java/cn/hutool/extra/template/ThymeleafTest.java old mode 100644 new mode 100755 diff --git a/hutool-extra/src/test/java/cn/hutool/extra/template/VelocityTest.java b/hutool-extra/src/test/java/cn/hutool/extra/template/VelocityTest.java old mode 100644 new mode 100755 diff --git a/hutool-http/src/main/java/cn/hutool/http/HtmlUtil.java b/hutool-http/src/main/java/cn/hutool/http/HtmlUtil.java old mode 100644 new mode 100755 diff --git a/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java b/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java old mode 100644 new mode 100755 diff --git a/hutool-http/src/main/java/cn/hutool/http/HttpUtil.java b/hutool-http/src/main/java/cn/hutool/http/HttpUtil.java old mode 100644 new mode 100755 diff --git a/hutool-http/src/main/java/cn/hutool/http/ssl/SSLSocketFactoryBuilder.java b/hutool-http/src/main/java/cn/hutool/http/ssl/SSLSocketFactoryBuilder.java old mode 100644 new mode 100755 diff --git a/hutool-http/src/main/java/cn/hutool/http/useragent/Browser.java b/hutool-http/src/main/java/cn/hutool/http/useragent/Browser.java old mode 100644 new mode 100755 diff --git a/hutool-http/src/main/java/cn/hutool/http/useragent/Engine.java b/hutool-http/src/main/java/cn/hutool/http/useragent/Engine.java old mode 100644 new mode 100755 diff --git a/hutool-http/src/main/java/cn/hutool/http/useragent/OS.java b/hutool-http/src/main/java/cn/hutool/http/useragent/OS.java old mode 100644 new mode 100755 diff --git a/hutool-http/src/main/java/cn/hutool/http/useragent/UserAgentInfo.java b/hutool-http/src/main/java/cn/hutool/http/useragent/UserAgentInfo.java old mode 100644 new mode 100755 diff --git a/hutool-http/src/test/java/cn/hutool/http/HttpUtilTest.java b/hutool-http/src/test/java/cn/hutool/http/HttpUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-http/src/test/java/cn/hutool/http/server/BlankServerTest.java b/hutool-http/src/test/java/cn/hutool/http/server/BlankServerTest.java old mode 100644 new mode 100755 diff --git a/hutool-http/src/test/java/cn/hutool/http/server/DocServerTest.java b/hutool-http/src/test/java/cn/hutool/http/server/DocServerTest.java old mode 100644 new mode 100755 diff --git a/hutool-json/src/main/java/cn/hutool/json/JSON.java b/hutool-json/src/main/java/cn/hutool/json/JSON.java old mode 100644 new mode 100755 diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONConfig.java b/hutool-json/src/main/java/cn/hutool/json/JSONConfig.java old mode 100644 new mode 100755 diff --git a/hutool-json/src/main/java/cn/hutool/json/xml/JSONXMLSerializer.java b/hutool-json/src/main/java/cn/hutool/json/xml/JSONXMLSerializer.java old mode 100644 new mode 100755 diff --git a/hutool-json/src/test/java/cn/hutool/json/Issue1101Test.java b/hutool-json/src/test/java/cn/hutool/json/Issue1101Test.java old mode 100644 new mode 100755 diff --git a/hutool-json/src/test/java/cn/hutool/json/Issue488Test.java b/hutool-json/src/test/java/cn/hutool/json/Issue488Test.java old mode 100644 new mode 100755 diff --git a/hutool-json/src/test/java/cn/hutool/json/issueIVMD5/IssueIVMD5Test.java b/hutool-json/src/test/java/cn/hutool/json/issueIVMD5/IssueIVMD5Test.java old mode 100644 new mode 100755 diff --git a/hutool-jwt/src/main/java/cn/hutool/jwt/Claims.java b/hutool-jwt/src/main/java/cn/hutool/jwt/Claims.java old mode 100644 new mode 100755 diff --git a/hutool-jwt/src/main/java/cn/hutool/jwt/JWT.java b/hutool-jwt/src/main/java/cn/hutool/jwt/JWT.java old mode 100644 new mode 100755 diff --git a/hutool-jwt/src/main/java/cn/hutool/jwt/JWTException.java b/hutool-jwt/src/main/java/cn/hutool/jwt/JWTException.java old mode 100644 new mode 100755 diff --git a/hutool-jwt/src/main/java/cn/hutool/jwt/JWTHeader.java b/hutool-jwt/src/main/java/cn/hutool/jwt/JWTHeader.java old mode 100644 new mode 100755 diff --git a/hutool-jwt/src/main/java/cn/hutool/jwt/JWTPayload.java b/hutool-jwt/src/main/java/cn/hutool/jwt/JWTPayload.java old mode 100644 new mode 100755 diff --git a/hutool-jwt/src/main/java/cn/hutool/jwt/JWTUtil.java b/hutool-jwt/src/main/java/cn/hutool/jwt/JWTUtil.java old mode 100644 new mode 100755 diff --git a/hutool-jwt/src/main/java/cn/hutool/jwt/JWTValidator.java b/hutool-jwt/src/main/java/cn/hutool/jwt/JWTValidator.java old mode 100644 new mode 100755 diff --git a/hutool-jwt/src/main/java/cn/hutool/jwt/RegisteredPayload.java b/hutool-jwt/src/main/java/cn/hutool/jwt/RegisteredPayload.java old mode 100644 new mode 100755 diff --git a/hutool-jwt/src/main/java/cn/hutool/jwt/package-info.java b/hutool-jwt/src/main/java/cn/hutool/jwt/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-jwt/src/main/java/cn/hutool/jwt/signers/AlgorithmUtil.java b/hutool-jwt/src/main/java/cn/hutool/jwt/signers/AlgorithmUtil.java old mode 100644 new mode 100755 diff --git a/hutool-jwt/src/main/java/cn/hutool/jwt/signers/AsymmetricJWTSigner.java b/hutool-jwt/src/main/java/cn/hutool/jwt/signers/AsymmetricJWTSigner.java old mode 100644 new mode 100755 diff --git a/hutool-jwt/src/main/java/cn/hutool/jwt/signers/HMacJWTSigner.java b/hutool-jwt/src/main/java/cn/hutool/jwt/signers/HMacJWTSigner.java old mode 100644 new mode 100755 diff --git a/hutool-jwt/src/main/java/cn/hutool/jwt/signers/JWTSigner.java b/hutool-jwt/src/main/java/cn/hutool/jwt/signers/JWTSigner.java old mode 100644 new mode 100755 diff --git a/hutool-jwt/src/main/java/cn/hutool/jwt/signers/JWTSignerUtil.java b/hutool-jwt/src/main/java/cn/hutool/jwt/signers/JWTSignerUtil.java old mode 100644 new mode 100755 diff --git a/hutool-jwt/src/main/java/cn/hutool/jwt/signers/NoneJWTSigner.java b/hutool-jwt/src/main/java/cn/hutool/jwt/signers/NoneJWTSigner.java old mode 100644 new mode 100755 diff --git a/hutool-jwt/src/main/java/cn/hutool/jwt/signers/package-info.java b/hutool-jwt/src/main/java/cn/hutool/jwt/signers/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-jwt/src/test/java/cn/hutool/jwt/JWTSignerTest.java b/hutool-jwt/src/test/java/cn/hutool/jwt/JWTSignerTest.java old mode 100644 new mode 100755 diff --git a/hutool-jwt/src/test/java/cn/hutool/jwt/JWTTest.java b/hutool-jwt/src/test/java/cn/hutool/jwt/JWTTest.java old mode 100644 new mode 100755 diff --git a/hutool-jwt/src/test/java/cn/hutool/jwt/JWTUtilTest.java b/hutool-jwt/src/test/java/cn/hutool/jwt/JWTUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-jwt/src/test/java/cn/hutool/jwt/JWTValidatorTest.java b/hutool-jwt/src/test/java/cn/hutool/jwt/JWTValidatorTest.java old mode 100644 new mode 100755 diff --git a/hutool-log/src/main/java/cn/hutool/log/Log.java b/hutool-log/src/main/java/cn/hutool/log/Log.java old mode 100644 new mode 100755 diff --git a/hutool-log/src/main/java/cn/hutool/log/StaticLog.java b/hutool-log/src/main/java/cn/hutool/log/StaticLog.java old mode 100644 new mode 100755 diff --git a/hutool-log/src/main/java/cn/hutool/log/dialect/jdk/JdkLogFactory.java b/hutool-log/src/main/java/cn/hutool/log/dialect/jdk/JdkLogFactory.java old mode 100644 new mode 100755 diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelUtil.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelUtil.java old mode 100644 new mode 100755 diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/setters/EscapeStrCellSetter.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/setters/EscapeStrCellSetter.java old mode 100644 new mode 100755 diff --git a/hutool-poi/src/main/java/cn/hutool/poi/word/TableUtil.java b/hutool-poi/src/main/java/cn/hutool/poi/word/TableUtil.java old mode 100644 new mode 100755 diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/CellUtilTest.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/CellUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelWriteTest.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelWriteTest.java old mode 100644 new mode 100755 diff --git a/hutool-script/src/main/java/cn/hutool/script/FullSupportScriptEngine.java b/hutool-script/src/main/java/cn/hutool/script/FullSupportScriptEngine.java old mode 100644 new mode 100755 diff --git a/hutool-script/src/main/java/cn/hutool/script/JavaScriptEngine.java b/hutool-script/src/main/java/cn/hutool/script/JavaScriptEngine.java old mode 100644 new mode 100755 diff --git a/hutool-script/src/main/java/cn/hutool/script/ScriptRuntimeException.java b/hutool-script/src/main/java/cn/hutool/script/ScriptRuntimeException.java old mode 100644 new mode 100755 diff --git a/hutool-script/src/main/java/cn/hutool/script/package-info.java b/hutool-script/src/main/java/cn/hutool/script/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-script/src/test/java/cn/hutool/script/test/NashornDeepTest.java b/hutool-script/src/test/java/cn/hutool/script/test/NashornDeepTest.java old mode 100644 new mode 100755 diff --git a/hutool-script/src/test/java/cn/hutool/script/test/ScriptUtilTest.java b/hutool-script/src/test/java/cn/hutool/script/test/ScriptUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-script/src/test/resources/filter1.js b/hutool-script/src/test/resources/filter1.js old mode 100644 new mode 100755 diff --git a/hutool-setting/src/main/java/cn/hutool/setting/SettingLoader.java b/hutool-setting/src/main/java/cn/hutool/setting/SettingLoader.java old mode 100644 new mode 100755 diff --git a/hutool-setting/src/main/java/cn/hutool/setting/profile/GlobalProfile.java b/hutool-setting/src/main/java/cn/hutool/setting/profile/GlobalProfile.java old mode 100644 new mode 100755 diff --git a/hutool-setting/src/main/java/cn/hutool/setting/profile/Profile.java b/hutool-setting/src/main/java/cn/hutool/setting/profile/Profile.java old mode 100644 new mode 100755 diff --git a/hutool-setting/src/main/java/cn/hutool/setting/yaml/YamlUtil.java b/hutool-setting/src/main/java/cn/hutool/setting/yaml/YamlUtil.java old mode 100644 new mode 100755 diff --git a/hutool-setting/src/test/java/cn/hutool/setting/yaml/YamlUtilTest.java b/hutool-setting/src/test/java/cn/hutool/setting/yaml/YamlUtilTest.java old mode 100644 new mode 100755 diff --git a/hutool-socket/src/test/java/cn/hutool/socket/aio/AioClientTest.java b/hutool-socket/src/test/java/cn/hutool/socket/aio/AioClientTest.java old mode 100644 new mode 100755 diff --git a/hutool-socket/src/test/java/cn/hutool/socket/aio/AioServerTest.java b/hutool-socket/src/test/java/cn/hutool/socket/aio/AioServerTest.java old mode 100644 new mode 100755 diff --git a/hutool-socket/src/test/java/cn/hutool/socket/nio/NioClientTest.java b/hutool-socket/src/test/java/cn/hutool/socket/nio/NioClientTest.java old mode 100644 new mode 100755 diff --git a/hutool-socket/src/test/java/cn/hutool/socket/nio/NioServerTest.java b/hutool-socket/src/test/java/cn/hutool/socket/nio/NioServerTest.java old mode 100644 new mode 100755 diff --git a/hutool-system/src/main/java/cn/hutool/system/HostInfo.java b/hutool-system/src/main/java/cn/hutool/system/HostInfo.java old mode 100644 new mode 100755 diff --git a/hutool-system/src/main/java/cn/hutool/system/JavaInfo.java b/hutool-system/src/main/java/cn/hutool/system/JavaInfo.java old mode 100644 new mode 100755 diff --git a/hutool-system/src/main/java/cn/hutool/system/JavaRuntimeInfo.java b/hutool-system/src/main/java/cn/hutool/system/JavaRuntimeInfo.java old mode 100644 new mode 100755 diff --git a/hutool-system/src/main/java/cn/hutool/system/JavaSpecInfo.java b/hutool-system/src/main/java/cn/hutool/system/JavaSpecInfo.java old mode 100644 new mode 100755 diff --git a/hutool-system/src/main/java/cn/hutool/system/JvmInfo.java b/hutool-system/src/main/java/cn/hutool/system/JvmInfo.java old mode 100644 new mode 100755 diff --git a/hutool-system/src/main/java/cn/hutool/system/JvmSpecInfo.java b/hutool-system/src/main/java/cn/hutool/system/JvmSpecInfo.java old mode 100644 new mode 100755 diff --git a/hutool-system/src/main/java/cn/hutool/system/OsInfo.java b/hutool-system/src/main/java/cn/hutool/system/OsInfo.java old mode 100644 new mode 100755 diff --git a/hutool-system/src/main/java/cn/hutool/system/RuntimeInfo.java b/hutool-system/src/main/java/cn/hutool/system/RuntimeInfo.java old mode 100644 new mode 100755 diff --git a/hutool-system/src/main/java/cn/hutool/system/SystemPropsKeys.java b/hutool-system/src/main/java/cn/hutool/system/SystemPropsKeys.java old mode 100644 new mode 100755 diff --git a/hutool-system/src/main/java/cn/hutool/system/SystemUtil.java b/hutool-system/src/main/java/cn/hutool/system/SystemUtil.java old mode 100644 new mode 100755 diff --git a/hutool-system/src/main/java/cn/hutool/system/UserInfo.java b/hutool-system/src/main/java/cn/hutool/system/UserInfo.java old mode 100644 new mode 100755 diff --git a/hutool-system/src/main/java/cn/hutool/system/oshi/CpuInfo.java b/hutool-system/src/main/java/cn/hutool/system/oshi/CpuInfo.java old mode 100644 new mode 100755 diff --git a/hutool-system/src/main/java/cn/hutool/system/oshi/CpuTicks.java b/hutool-system/src/main/java/cn/hutool/system/oshi/CpuTicks.java old mode 100644 new mode 100755 diff --git a/hutool-system/src/main/java/cn/hutool/system/oshi/OshiUtil.java b/hutool-system/src/main/java/cn/hutool/system/oshi/OshiUtil.java old mode 100644 new mode 100755 diff --git a/hutool-system/src/main/java/cn/hutool/system/oshi/package-info.java b/hutool-system/src/main/java/cn/hutool/system/oshi/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-system/src/main/java/cn/hutool/system/package-info.java b/hutool-system/src/main/java/cn/hutool/system/package-info.java old mode 100644 new mode 100755 diff --git a/hutool-system/src/test/java/cn/hutool/system/OshiPrintTest.java b/hutool-system/src/test/java/cn/hutool/system/OshiPrintTest.java old mode 100644 new mode 100755 diff --git a/hutool-system/src/test/java/cn/hutool/system/OshiTest.java b/hutool-system/src/test/java/cn/hutool/system/OshiTest.java old mode 100644 new mode 100755 diff --git a/hutool-system/src/test/java/cn/hutool/system/SystemUtilTest.java b/hutool-system/src/test/java/cn/hutool/system/SystemUtilTest.java old mode 100644 new mode 100755 -- Gitee From 2881062f3382f93a9fe6b47e1e732a5589429855 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 28 Apr 2022 17:30:55 +0800 Subject: [PATCH 0006/1737] add methods --- CHANGELOG.md | 2 ++ .../java/cn/hutool/core/bean/BeanUtil.java | 36 ++++++------------- 2 files changed, 12 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03c12e4f15..a7917c07f8 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,9 +7,11 @@ ### ❌不兼容特性 * 【extra 】 升级jakarta.validation-api到3.x,包名变更导致不能向下兼容 +* 【core 】 BeanUtil删除了beanToMap(Object)方法,因为有可变参数的方法,这个删除可能导致直接升级找不到方法,重新编译项目即可。 ### 🐣新特性 * 【core 】 Singleton增加部分方法(pr#609@Gitee) +* 【core 】 BeanUtil增加beanToMap重载(pr#2292@Github) ### 🐞Bug修复 * 【db 】 修复RedisDS无法设置maxWaitMillis问题(issue#I54TZ9@Gitee) diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java index 7c0d7cb4f9..5b8e517c39 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java @@ -24,8 +24,6 @@ import java.beans.PropertyEditorManager; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; import java.util.Collection; import java.util.HashMap; import java.util.LinkedHashMap; @@ -608,38 +606,24 @@ public class BeanUtil { } // --------------------------------------------------------------------------------------------- beanToMap - /** - * 对象转Map,不进行驼峰转下划线,不忽略值为空的字段 - * - * @param bean bean对象 - * @return Map - */ - public static Map beanToMap(Object bean) { - return beanToMap(bean, false, false); - } - - - /** - * 将bean的部分属性转换成map + * 将bean的部分属性转换成map
+ * 可选拷贝哪些属性值,默认是不忽略值为{@code null}的值的。 * * @param bean bean - * @param properties 属性值 + * @param properties 需要拷贝的属性值,{@code null}或空表示拷贝所有值 * @return Map + * @since 5.8.0 */ public static Map beanToMap(Object bean, String... properties) { - if (ArrayUtil.isEmpty(properties)) { - return Collections.emptyMap(); + Editor keyEditor = null; + if(ArrayUtil.isNotEmpty(properties)){ + final Set propertiesSet = CollUtil.set(false, properties); + keyEditor = property -> propertiesSet.contains(property) ? property : null; } - Set propertiesSet = Arrays.stream(properties).collect(Collectors.toSet()); + // 指明了要复制的属性 所以不忽略null值 - return beanToMap(bean, new HashMap<>(properties.length), false, - property -> { - if (!propertiesSet.contains(property)) { - return null; - } - return property; - }); + return beanToMap(bean, new LinkedHashMap<>(properties.length, 1), false, keyEditor); } /** -- Gitee From c9064c2334fd50bbea907b76333e214d44fb3d3d Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 30 Apr 2022 10:46:17 +0800 Subject: [PATCH 0007/1737] ad test --- .../test/java/cn/hutool/core/date/DateUtilTest.java | 11 +++++++++++ .../hutool/poi/excel/cell/setters/package-info.java | 6 ++++++ 2 files changed, 17 insertions(+) create mode 100644 hutool-poi/src/main/java/cn/hutool/poi/excel/cell/setters/package-info.java diff --git a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java index bdabd60d8b..3984bf599c 100755 --- a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java @@ -1064,6 +1064,17 @@ public class DateUtilTest { Assert.assertFalse(DateUtil.isOverlap(startTime,endTime,realStartTime1,realEndTime1)); } + @Test + public void isOverlapTest2() { + DateTime oneStartTime = DateUtil.parseDate("2021-02-01"); + DateTime oneEndTime = DateUtil.parseDate("2022-06-30"); + + DateTime oneStartTime2 = DateUtil.parseDate("2019-04-05"); + DateTime oneEndTime2 = DateUtil.parseDate("2021-04-05"); + + Assert.assertTrue(DateUtil.isOverlap(oneStartTime, oneEndTime, oneStartTime2, oneEndTime2)); + } + @Test public void isInTest(){ String sourceStr = "2022-04-19 00:00:00"; diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/setters/package-info.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/setters/package-info.java new file mode 100644 index 0000000000..b0d905b77f --- /dev/null +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/setters/package-info.java @@ -0,0 +1,6 @@ +/** + * Excel中单元格设置相关类,一些{@link cn.hutool.poi.excel.cell.CellSetter}的实现类 + * + * @author looly + */ +package cn.hutool.poi.excel.cell.setters; -- Gitee From 8b98cb3e90ae7d5b5ef57ea0ce555466e0c66bda Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 30 Apr 2022 11:40:20 +0800 Subject: [PATCH 0008/1737] add test --- .../test/java/cn/hutool/core/net/RFC3986Test.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/hutool-core/src/test/java/cn/hutool/core/net/RFC3986Test.java b/hutool-core/src/test/java/cn/hutool/core/net/RFC3986Test.java index 781b78001e..e549e9a9f8 100644 --- a/hutool-core/src/test/java/cn/hutool/core/net/RFC3986Test.java +++ b/hutool-core/src/test/java/cn/hutool/core/net/RFC3986Test.java @@ -1,9 +1,13 @@ package cn.hutool.core.net; +import cn.hutool.core.codec.PercentCodec; import cn.hutool.core.util.CharsetUtil; import org.junit.Assert; import org.junit.Test; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + public class RFC3986Test { @Test @@ -26,4 +30,12 @@ public class RFC3986Test { String encode = RFC3986.QUERY_PARAM_VALUE.encode("a=%25", CharsetUtil.CHARSET_UTF_8, '%'); Assert.assertEquals("a=%25", encode); } + + @Test + public void encodeAllTest() throws UnsupportedEncodingException { + String toVerifyText = "行吧行吧 cargo:1.0,\"Deta-ils:[{"; + final String encode = PercentCodec.of(RFC3986.UNRESERVED).setEncodeSpaceAsPlus(true).encode(toVerifyText, CharsetUtil.CHARSET_UTF_8); + final String encodeJdk = URLEncoder.encode(toVerifyText, "UTF-8"); + Assert.assertEquals(encode, encodeJdk); + } } -- Gitee From 68c9153eeb3ebe96a1e94dcb8b64c4622dfcb09b Mon Sep 17 00:00:00 2001 From: VampireAchao Date: Sat, 30 Apr 2022 14:24:41 +0800 Subject: [PATCH 0009/1737] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E8=A1=A8=E6=98=AF=E5=90=A6=E5=AD=98=E5=9C=A8=E4=BA=8E=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E7=8A=B6=E6=80=81=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/hutool/db/meta/MetaUtil.java | 1 + .../main/java/cn/hutool/db/meta/Table.java | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java b/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java index bb151db763..69846b1919 100755 --- a/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java +++ b/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java @@ -229,6 +229,7 @@ public class MetaUtil { if (null != rs) { if (rs.next()) { table.setComment(rs.getString("REMARKS")); + table.setExists(true); } } } diff --git a/hutool-db/src/main/java/cn/hutool/db/meta/Table.java b/hutool-db/src/main/java/cn/hutool/db/meta/Table.java index 7046b1284b..80ce1ba205 100644 --- a/hutool-db/src/main/java/cn/hutool/db/meta/Table.java +++ b/hutool-db/src/main/java/cn/hutool/db/meta/Table.java @@ -45,6 +45,11 @@ public class Table implements Serializable, Cloneable { */ private final Map columns = new LinkedHashMap<>(); + /** + * 表是否存在 + */ + private Boolean exists; + public static Table create(String tableName) { return new Table(tableName); } @@ -58,6 +63,7 @@ public class Table implements Serializable, Cloneable { */ public Table(String tableName) { this.setTableName(tableName); + this.setExists(false); } // ----------------------------------------------------- Constructor end @@ -173,6 +179,27 @@ public class Table implements Serializable, Cloneable { public void setPkNames(Set pkNames) { this.pkNames = pkNames; } + + /** + * 获取表是否存在 + * + * @return 表是否存在 + */ + public Boolean isExists() { + return exists; + } + + /** + * 设置表是否存在 + * + * @param exists 表是否存在 + * @return this + */ + public Table setExists(Boolean exists) { + this.exists = exists; + return this; + } + // ----------------------------------------------------- Getters and Setters end /** -- Gitee From 2c00b09ce8e02ddd697b2ff39add13691f2ff048 Mon Sep 17 00:00:00 2001 From: Husky <2466896229@qq.com> Date: Sat, 30 Apr 2022 18:32:00 +0800 Subject: [PATCH 0010/1737] =?UTF-8?q?1=E3=80=81=E4=BF=AE=E6=94=B9=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E6=B3=A8=E9=87=8A=202=E3=80=81=E5=A2=9E=E5=8A=A0isMer?= =?UTF-8?q?gedRegion=E7=A9=BA=E6=8C=87=E9=92=88=E5=88=A4=E6=96=AD=203?= =?UTF-8?q?=E3=80=81=E5=A2=9E=E5=8A=A0=E8=8E=B7=E5=8F=96CellRangeAddress?= =?UTF-8?q?=E6=96=B9=E6=B3=95=204=E3=80=81=E5=A2=9E=E5=8A=A0=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E5=90=88=E5=B9=B6=E5=8D=95=E5=85=83=E6=A0=BC=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E6=96=B9=E6=B3=95(=E7=9B=AE=E5=89=8D=E9=9C=80?= =?UTF-8?q?=E8=A6=81=E5=85=88=E5=90=88=E5=B9=B6=E5=86=8D=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F,=E4=BD=86=E6=98=AF=E6=9C=89=E7=A7=8D?= =?UTF-8?q?=E6=83=85=E5=86=B5=E4=B8=BA=E8=AF=A5=E5=8D=95=E5=85=83=E6=A0=BC?= =?UTF-8?q?=E6=9C=AC=E6=9D=A5=E5=B0=B1=E6=98=AF=E5=90=88=E5=B9=B6=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=A0=BC,=E5=8F=AA=E9=9C=80=E8=A6=81=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E6=A0=B7=E5=BC=8F)=205=E3=80=81=E6=8F=90=E5=8F=96?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E6=A0=B9=E6=8D=AEcellStyle=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=A0=BC=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hutool/poi/excel/cell/CellUtil.java | 109 +++++++++++++++--- 1 file changed, 90 insertions(+), 19 deletions(-) diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/CellUtil.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/CellUtil.java index f4747bae32..1c7b59405f 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/CellUtil.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/CellUtil.java @@ -199,7 +199,7 @@ public class CellUtil { * * @param row Excel表的行 * @param cellIndex 列号 - * @return {@link Row} + * @return {@link Cell} * @since 5.5.0 */ public static Cell getCell(Row row, int cellIndex) { @@ -218,7 +218,7 @@ public class CellUtil { * * @param row Excel表的行 * @param cellIndex 列号 - * @return {@link Row} + * @return {@link Cell} * @since 4.0.2 */ public static Cell getOrCreateCell(Row row, int cellIndex) { @@ -265,18 +265,78 @@ public class CellUtil { * @return 是否是合并单元格 */ public static boolean isMergedRegion(Sheet sheet, int x, int y) { - final int sheetMergeCount = sheet.getNumMergedRegions(); - CellRangeAddress ca; - for (int i = 0; i < sheetMergeCount; i++) { - ca = sheet.getMergedRegion(i); - if (y >= ca.getFirstRow() && y <= ca.getLastRow() - && x >= ca.getFirstColumn() && x <= ca.getLastColumn()) { - return true; + if (sheet != null) { + final int sheetMergeCount = sheet.getNumMergedRegions(); + CellRangeAddress ca; + for (int i = 0; i < sheetMergeCount; i++) { + ca = sheet.getMergedRegion(i); + if (y >= ca.getFirstRow() && y <= ca.getLastRow() + && x >= ca.getFirstColumn() && x <= ca.getLastColumn()) { + return true; + } } } return false; } + /** + * 获取合并单元格{@link CellRangeAddress},如果不是返回null + * + * @param sheet {@link Sheet} + * @param locationRef 单元格地址标识符,例如A11,B5 + * @return {@link CellRangeAddress} + */ + public static CellRangeAddress getCellRangeAddress(Sheet sheet, String locationRef) { + final CellLocation cellLocation = ExcelUtil.toLocation(locationRef); + return getCellRangeAddress(sheet, cellLocation.getX(), cellLocation.getY()); + } + + /** + * 获取合并单元格{@link CellRangeAddress},如果不是返回null + * + * @param cell {@link Cell} + * @return {@link CellRangeAddress} + */ + public static CellRangeAddress getCellRangeAddress(Cell cell) { + return getCellRangeAddress(cell.getSheet(), cell.getColumnIndex(), cell.getRowIndex()); + } + + /** + * 获取合并单元格{@link CellRangeAddress},如果不是返回null + * + * @param sheet {@link Sheet} + * @param x 列号,从0开始 + * @param y 行号,从0开始 + * @return {@link CellRangeAddress} + */ + public static CellRangeAddress getCellRangeAddress(Sheet sheet, int x, int y) { + if (sheet != null) { + final int sheetMergeCount = sheet.getNumMergedRegions(); + CellRangeAddress ca; + for (int i = 0; i < sheetMergeCount; i++) { + ca = sheet.getMergedRegion(i); + if (y >= ca.getFirstRow() && y <= ca.getLastRow() + && x >= ca.getFirstColumn() && x <= ca.getLastColumn()) { + return ca; + } + } + } + return null; + } + + /** + * 设置合并单元格样式,如果不是则不设置 + * + * @param cell {@link Cell} + * @param cellStyle {@link CellStyle} + */ + public static void setMergedRegionStyle(Cell cell, CellStyle cellStyle) { + CellRangeAddress cellRangeAddress = getCellRangeAddress(cell); + if (cellRangeAddress != null) { + setMergeCellStyle(cellStyle, cellRangeAddress, cell.getSheet()); + } + } + /** * 合并单元格,可以根据设置的值来合并行和列 * @@ -310,16 +370,7 @@ public class CellUtil { lastColumn // last column (0-based) ); - if (null != cellStyle) { - RegionUtil.setBorderTop(cellStyle.getBorderTop(), cellRangeAddress, sheet); - RegionUtil.setBorderRight(cellStyle.getBorderRight(), cellRangeAddress, sheet); - RegionUtil.setBorderBottom(cellStyle.getBorderBottom(), cellRangeAddress, sheet); - RegionUtil.setBorderLeft(cellStyle.getBorderLeft(), cellRangeAddress, sheet); - RegionUtil.setTopBorderColor(cellStyle.getTopBorderColor(),cellRangeAddress,sheet); - RegionUtil.setRightBorderColor(cellStyle.getRightBorderColor(),cellRangeAddress,sheet); - RegionUtil.setLeftBorderColor(cellStyle.getLeftBorderColor(),cellRangeAddress,sheet); - RegionUtil.setBottomBorderColor(cellStyle.getBottomBorderColor(),cellRangeAddress,sheet); - } + setMergeCellStyle(cellStyle, cellRangeAddress, sheet); return sheet.addMergedRegion(cellRangeAddress); } @@ -435,5 +486,25 @@ public class CellUtil { } return null; } + + /** + * 根据{@link CellStyle}设置合并单元格边框样式 + * + * @param cellStyle {@link CellStyle} + * @param cellRangeAddress {@link CellRangeAddress} + * @param sheet {@link Sheet} + */ + private static void setMergeCellStyle(CellStyle cellStyle, CellRangeAddress cellRangeAddress, Sheet sheet) { + if (null != cellStyle) { + RegionUtil.setBorderTop(cellStyle.getBorderTop(), cellRangeAddress, sheet); + RegionUtil.setBorderRight(cellStyle.getBorderRight(), cellRangeAddress, sheet); + RegionUtil.setBorderBottom(cellStyle.getBorderBottom(), cellRangeAddress, sheet); + RegionUtil.setBorderLeft(cellStyle.getBorderLeft(), cellRangeAddress, sheet); + RegionUtil.setTopBorderColor(cellStyle.getTopBorderColor(), cellRangeAddress, sheet); + RegionUtil.setRightBorderColor(cellStyle.getRightBorderColor(), cellRangeAddress, sheet); + RegionUtil.setLeftBorderColor(cellStyle.getLeftBorderColor(), cellRangeAddress, sheet); + RegionUtil.setBottomBorderColor(cellStyle.getBottomBorderColor(), cellRangeAddress, sheet); + } + } // -------------------------------------------------------------------------------------------------------------- Private method end } -- Gitee From c3c4c87bea33229e3c6dcce9cbfa8a2322637580 Mon Sep 17 00:00:00 2001 From: mo_chou_555 <7496450+mo_chou_555@user.noreply.gitee.com> Date: Tue, 3 May 2022 12:24:41 +0800 Subject: [PATCH 0011/1737] test --- Test.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Test.txt diff --git a/Test.txt b/Test.txt new file mode 100644 index 0000000000..e69de29bb2 -- Gitee From 50d77194c80a20d0d22c7a6d4510cbca1b08326d Mon Sep 17 00:00:00 2001 From: mo_chou_555 <7496450+mo_chou_555@user.noreply.gitee.com> Date: Tue, 3 May 2022 12:25:58 +0800 Subject: [PATCH 0012/1737] remove test --- Test.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Test.txt diff --git a/Test.txt b/Test.txt deleted file mode 100644 index e69de29bb2..0000000000 -- Gitee From 2a9eaa6a7fcd9b304eaea4763843c89d072189b2 Mon Sep 17 00:00:00 2001 From: mo_chou_555 <7496450+mo_chou_555@user.noreply.gitee.com> Date: Tue, 3 May 2022 12:31:55 +0800 Subject: [PATCH 0013/1737] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Assert=E7=9A=84equa?= =?UTF-8?q?ls=E5=8F=8AnotEquals?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/hutool/core/lang/Assert.java | 94 +++++++++++++++++++ .../java/cn/hutool/core/lang/AssertTest.java | 29 +++++- 2 files changed, 121 insertions(+), 2 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Assert.java b/hutool-core/src/main/java/cn/hutool/core/lang/Assert.java index a33b2a4ede..b0b347c02d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Assert.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/Assert.java @@ -3,6 +3,7 @@ package cn.hutool.core.lang; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import java.util.Map; @@ -1003,6 +1004,99 @@ public class Assert { return value; } + /** + * 断言两个对象是否不相等,如果两个对象相等 抛出IllegalArgumentException 异常 + *
+	 *   Assert.notEquals(obj1,obj2);
+	 * 
+ * + * @param obj1 对象1 + * @param obj2 对象2 + * @throws IllegalArgumentException obj1 must be not equals obj2 + */ + public static void notEquals(Object obj1, Object obj2) { + notEquals(obj1, obj2, "({}) must be not equals ({})", obj1, obj2); + } + + /** + * 断言两个对象是否不相等,如果两个对象相等 抛出IllegalArgumentException 异常 + *
+	 *   Assert.notEquals(obj1,obj2,"obj1 must be not equals obj2");
+	 * 
+ * + * @param obj1 对象1 + * @param obj2 对象2 + * @param errorMsgTemplate 异常信息模板,类似于"aa{}bb{}cc" + * @param params 异常信息参数,用于替换"{}"占位符 + * @throws IllegalArgumentException obj1 must be not equals obj2 + */ + public static void notEquals(Object obj1, Object obj2, String errorMsgTemplate, Object... params) throws IllegalArgumentException { + notEquals(obj1, obj2, () -> new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params))); + } + + /** + * 断言两个对象是否不相等,如果两个对象相等,抛出指定类型异常,并使用指定的函数获取错误信息返回 + * + * @param obj1 对象1 + * @param obj2 对象2 + * @param errorSupplier 错误抛出异常附带的消息生产接口 + * @param 异常类型 + * @throws X obj1 must be not equals obj2 + */ + public static void notEquals(Object obj1, Object obj2, Supplier errorSupplier) throws X { + if (ObjectUtil.equals(obj1, obj2)) { + throw errorSupplier.get(); + } + } + // ----------------------------------------------------------------------------------------------------------- Check not equals + + /** + * 断言两个对象是否相等,如果两个对象不相等 抛出IllegalArgumentException 异常 + *
+	 *   Assert.isEquals(obj1,obj2);
+	 * 
+ * + * @param obj1 对象1 + * @param obj2 对象2 + * @throws IllegalArgumentException obj1 must be equals obj2 + */ + public static void isEquals(Object obj1, Object obj2) { + isEquals(obj1, obj2, "({}) must be equals ({})", obj1, obj2); + } + + /** + * 断言两个对象是否相等,如果两个对象不相等 抛出IllegalArgumentException 异常 + *
+	 *   Assert.isEquals(obj1,obj2,"obj1 must be equals obj2");
+	 * 
+ * + * @param obj1 对象1 + * @param obj2 对象2 + * @param errorMsgTemplate 异常信息模板,类似于"aa{}bb{}cc" + * @param params 异常信息参数,用于替换"{}"占位符 + * @throws IllegalArgumentException obj1 must be equals obj2 + */ + public static void isEquals(Object obj1, Object obj2, String errorMsgTemplate, Object... params) throws IllegalArgumentException { + isEquals(obj1, obj2, () -> new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params))); + } + + /** + * 断言两个对象是否相等,如果两个对象不相等,抛出指定类型异常,并使用指定的函数获取错误信息返回 + * + * @param obj1 对象1 + * @param obj2 对象2 + * @param errorSupplier 错误抛出异常附带的消息生产接口 + * @param 异常类型 + * @throws X obj1 must be equals obj2 + */ + public static void isEquals(Object obj1, Object obj2, Supplier errorSupplier) throws X { + if (ObjectUtil.notEqual(obj1, obj2)) { + throw errorSupplier.get(); + } + } + + // ----------------------------------------------------------------------------------------------------------- Check is equals + // -------------------------------------------------------------------------------------------------------------------------------------------- Private method start /** diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/AssertTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/AssertTest.java index e20ef6e963..be095d835e 100755 --- a/hutool-core/src/test/java/cn/hutool/core/lang/AssertTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/AssertTest.java @@ -1,9 +1,10 @@ package cn.hutool.core.lang; +import cn.hutool.core.util.StrUtil; import org.junit.Test; public class AssertTest { - + @Test public void isNullTest(){ String a = null; @@ -33,6 +34,30 @@ public class AssertTest { public void isTrueTest3() { int i = -1; //noinspection ConstantConditions - Assert.isTrue(i > 0, ()-> new IndexOutOfBoundsException("relation message to return")); + Assert.isTrue(i > 0, () -> new IndexOutOfBoundsException("relation message to return")); + } + + @Test + public void isEqualsTest() { + //String a="ab"; + //final String b = new String("abc"); + String a = null; + final String b = null; + Assert.isEquals(a, b); + Assert.isEquals(a, b, "{}不等于{}", a, b); + Assert.isEquals(a, b, () -> new RuntimeException(StrUtil.format("{}和{}不相等", a, b))); } + + @Test + public void notEqualsTest() { + //String c="19"; + //final String d = new String("19"); + String c = null; + final String d = null; + //Assert.notEquals(c,d); + //Assert.notEquals(c,d,"{}等于{}",c,d); + Assert.notEquals(c, d, () -> new RuntimeException(StrUtil.format("{}和{}相等", c, d))); + + } + } -- Gitee From 56b0c907e92a0a54c2318045226a50b5a71644e9 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 5 May 2022 09:20:02 +0800 Subject: [PATCH 0014/1737] add methods --- CHANGELOG.md | 3 ++- .../src/main/java/cn/hutool/core/lang/Assert.java | 10 +++++----- .../src/test/java/cn/hutool/core/lang/AssertTest.java | 10 +++++----- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7917c07f8..0e0fd1c545 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.0.M5 (2022-04-28) +# 5.8.0.M5 (2022-05-05) ### ❌不兼容特性 * 【extra 】 升级jakarta.validation-api到3.x,包名变更导致不能向下兼容 @@ -12,6 +12,7 @@ ### 🐣新特性 * 【core 】 Singleton增加部分方法(pr#609@Gitee) * 【core 】 BeanUtil增加beanToMap重载(pr#2292@Github) +* 【core 】 Assert增加对应的equals及notEquals方法(pr#612@Gitee) ### 🐞Bug修复 * 【db 】 修复RedisDS无法设置maxWaitMillis问题(issue#I54TZ9@Gitee) diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Assert.java b/hutool-core/src/main/java/cn/hutool/core/lang/Assert.java index b0b347c02d..ec0b69b27f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Assert.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/Assert.java @@ -1060,8 +1060,8 @@ public class Assert { * @param obj2 对象2 * @throws IllegalArgumentException obj1 must be equals obj2 */ - public static void isEquals(Object obj1, Object obj2) { - isEquals(obj1, obj2, "({}) must be equals ({})", obj1, obj2); + public static void equals(Object obj1, Object obj2) { + equals(obj1, obj2, "({}) must be equals ({})", obj1, obj2); } /** @@ -1076,8 +1076,8 @@ public class Assert { * @param params 异常信息参数,用于替换"{}"占位符 * @throws IllegalArgumentException obj1 must be equals obj2 */ - public static void isEquals(Object obj1, Object obj2, String errorMsgTemplate, Object... params) throws IllegalArgumentException { - isEquals(obj1, obj2, () -> new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params))); + public static void equals(Object obj1, Object obj2, String errorMsgTemplate, Object... params) throws IllegalArgumentException { + equals(obj1, obj2, () -> new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params))); } /** @@ -1089,7 +1089,7 @@ public class Assert { * @param 异常类型 * @throws X obj1 must be equals obj2 */ - public static void isEquals(Object obj1, Object obj2, Supplier errorSupplier) throws X { + public static void equals(Object obj1, Object obj2, Supplier errorSupplier) throws X { if (ObjectUtil.notEqual(obj1, obj2)) { throw errorSupplier.get(); } diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/AssertTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/AssertTest.java index be095d835e..7ddde8d475 100755 --- a/hutool-core/src/test/java/cn/hutool/core/lang/AssertTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/AssertTest.java @@ -38,14 +38,14 @@ public class AssertTest { } @Test - public void isEqualsTest() { + public void equalsTest() { //String a="ab"; //final String b = new String("abc"); String a = null; final String b = null; - Assert.isEquals(a, b); - Assert.isEquals(a, b, "{}不等于{}", a, b); - Assert.isEquals(a, b, () -> new RuntimeException(StrUtil.format("{}和{}不相等", a, b))); + Assert.equals(a, b); + Assert.equals(a, b, "{}不等于{}", a, b); + Assert.equals(a, b, () -> new RuntimeException(StrUtil.format("{}和{}不相等", a, b))); } @Test @@ -53,7 +53,7 @@ public class AssertTest { //String c="19"; //final String d = new String("19"); String c = null; - final String d = null; + final String d = "null"; //Assert.notEquals(c,d); //Assert.notEquals(c,d,"{}等于{}",c,d); Assert.notEquals(c, d, () -> new RuntimeException(StrUtil.format("{}和{}相等", c, d))); -- Gitee From e05a3b19e0faa3f048eaf217948a8b7be2dd0586 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 5 May 2022 11:16:39 +0800 Subject: [PATCH 0015/1737] add methods --- CHANGELOG.md | 1 + .../java/cn/hutool/core/util/ObjectUtil.java | 16 ++++++++-------- .../java/cn/hutool/poi/excel/cell/CellUtil.java | 13 ++++++++----- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e0fd1c545..61c13f66df 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ * 【core 】 Singleton增加部分方法(pr#609@Gitee) * 【core 】 BeanUtil增加beanToMap重载(pr#2292@Github) * 【core 】 Assert增加对应的equals及notEquals方法(pr#612@Gitee) +* 【core 】 Assert增加对应的equals及notEquals方法(pr#612@Gitee) ### 🐞Bug修复 * 【db 】 修复RedisDS无法设置maxWaitMillis问题(issue#I54TZ9@Gitee) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java index 8fe082b437..00c3454de6 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java @@ -104,7 +104,7 @@ public class ObjectUtil { int count; if (obj instanceof Iterator) { - Iterator iter = (Iterator) obj; + final Iterator iter = (Iterator) obj; count = 0; while (iter.hasNext()) { count++; @@ -113,7 +113,7 @@ public class ObjectUtil { return count; } if (obj instanceof Enumeration) { - Enumeration enumeration = (Enumeration) obj; + final Enumeration enumeration = (Enumeration) obj; count = 0; while (enumeration.hasMoreElements()) { count++; @@ -161,9 +161,9 @@ public class ObjectUtil { } if (obj instanceof Iterator) { - Iterator iter = (Iterator) obj; + final Iterator iter = (Iterator) obj; while (iter.hasNext()) { - Object o = iter.next(); + final Object o = iter.next(); if (equal(o, element)) { return true; } @@ -171,9 +171,9 @@ public class ObjectUtil { return false; } if (obj instanceof Enumeration) { - Enumeration enumeration = (Enumeration) obj; + final Enumeration enumeration = (Enumeration) obj; while (enumeration.hasMoreElements()) { - Object o = enumeration.nextElement(); + final Object o = enumeration.nextElement(); if (equal(o, element)) { return true; } @@ -181,9 +181,9 @@ public class ObjectUtil { return false; } if (obj.getClass().isArray() == true) { - int len = Array.getLength(obj); + final int len = Array.getLength(obj); for (int i = 0; i < len; i++) { - Object o = Array.get(obj, i); + final Object o = Array.get(obj, i); if (equal(o, element)) { return true; } diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/CellUtil.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/CellUtil.java index 1c7b59405f..8c4f4d4cfb 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/CellUtil.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/CellUtil.java @@ -105,7 +105,7 @@ public class CellUtil { cellType = cell.getCellType(); } - Object value; + final Object value; switch (cellType) { case NUMERIC: value = new NumericCellValue(cell).getValue(); @@ -206,7 +206,7 @@ public class CellUtil { if (null == row) { return null; } - Cell cell = row.getCell(cellIndex); + final Cell cell = row.getCell(cellIndex); if (null == cell) { return new NullCell(row, cellIndex); } @@ -262,7 +262,7 @@ public class CellUtil { * @param sheet {@link Sheet} * @param x 列号,从0开始 * @param y 行号,从0开始 - * @return 是否是合并单元格 + * @return 是否是合并单元格,如果提供的sheet为{@code null},返回{@code false} */ public static boolean isMergedRegion(Sheet sheet, int x, int y) { if (sheet != null) { @@ -285,6 +285,7 @@ public class CellUtil { * @param sheet {@link Sheet} * @param locationRef 单元格地址标识符,例如A11,B5 * @return {@link CellRangeAddress} + * @since 5.8.0 */ public static CellRangeAddress getCellRangeAddress(Sheet sheet, String locationRef) { final CellLocation cellLocation = ExcelUtil.toLocation(locationRef); @@ -296,6 +297,7 @@ public class CellUtil { * * @param cell {@link Cell} * @return {@link CellRangeAddress} + * @since 5.8.0 */ public static CellRangeAddress getCellRangeAddress(Cell cell) { return getCellRangeAddress(cell.getSheet(), cell.getColumnIndex(), cell.getRowIndex()); @@ -308,6 +310,7 @@ public class CellUtil { * @param x 列号,从0开始 * @param y 行号,从0开始 * @return {@link CellRangeAddress} + * @since 5.8.0 */ public static CellRangeAddress getCellRangeAddress(Sheet sheet, int x, int y) { if (sheet != null) { @@ -331,7 +334,7 @@ public class CellUtil { * @param cellStyle {@link CellStyle} */ public static void setMergedRegionStyle(Cell cell, CellStyle cellStyle) { - CellRangeAddress cellRangeAddress = getCellRangeAddress(cell); + final CellRangeAddress cellRangeAddress = getCellRangeAddress(cell); if (cellRangeAddress != null) { setMergeCellStyle(cellStyle, cellRangeAddress, cell.getSheet()); } @@ -457,7 +460,7 @@ public class CellUtil { anchor.setRow1(cell.getRowIndex()); anchor.setRow2(cell.getRowIndex() + 2); } - Comment comment = drawing.createCellComment(anchor); + final Comment comment = drawing.createCellComment(anchor); comment.setString(factory.createRichTextString(commentText)); comment.setAuthor(StrUtil.nullToEmpty(commentAuthor)); cell.setCellComment(comment); -- Gitee From 34704bd3267e9d3bc10e7e2ed4a5721299726530 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 5 May 2022 11:32:54 +0800 Subject: [PATCH 0016/1737] add test --- .../main/java/cn/hutool/db/meta/MetaUtil.java | 26 +++++++++---------- .../java/cn/hutool/db/meta/MetaUtilTest.java | 18 ++++++++++--- .../java/cn/hutool/dfa/SensitiveUtil.java | 10 +++---- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java b/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java index bb151db763..f1ecafa830 100755 --- a/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java +++ b/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java @@ -82,13 +82,13 @@ public class MetaUtil { conn = ds.getConnection(); // catalog和schema获取失败默认使用null代替 - String catalog = getCatalog(conn); + final String catalog = getCatalog(conn); if (null == schema) { schema = getSchema(conn); } final DatabaseMetaData metaData = conn.getMetaData(); - try (ResultSet rs = metaData.getTables(catalog, schema, tableName, Convert.toStrArray(types))) { + try (final ResultSet rs = metaData.getTables(catalog, schema, tableName, Convert.toStrArray(types))) { if (null != rs) { String table; while (rs.next()) { @@ -116,9 +116,9 @@ public class MetaUtil { */ public static String[] getColumnNames(ResultSet rs) throws DbRuntimeException { try { - ResultSetMetaData rsmd = rs.getMetaData(); - int columnCount = rsmd.getColumnCount(); - String[] labelNames = new String[columnCount]; + final ResultSetMetaData rsmd = rs.getMetaData(); + final int columnCount = rsmd.getColumnCount(); + final String[] labelNames = new String[columnCount]; for (int i = 0; i < labelNames.length; i++) { labelNames[i] = rsmd.getColumnLabel(i + 1); } @@ -137,17 +137,17 @@ public class MetaUtil { * @throws DbRuntimeException SQL执行异常 */ public static String[] getColumnNames(DataSource ds, String tableName) { - List columnNames = new ArrayList<>(); + final List columnNames = new ArrayList<>(); Connection conn = null; try { conn = ds.getConnection(); // catalog和schema获取失败默认使用null代替 - String catalog = getCatalog(conn); - String schema = getSchema(conn); + final String catalog = getCatalog(conn); + final String schema = getSchema(conn); final DatabaseMetaData metaData = conn.getMetaData(); - try (ResultSet rs = metaData.getColumns(catalog, schema, tableName, null)) { + try (final ResultSet rs = metaData.getColumns(catalog, schema, tableName, null)) { if (null != rs) { while (rs.next()) { columnNames.add(rs.getString("COLUMN_NAME")); @@ -225,7 +225,7 @@ public class MetaUtil { final DatabaseMetaData metaData = conn.getMetaData(); // 获得表元数据(表注释) - try (ResultSet rs = metaData.getTables(catalog, schema, tableName, new String[]{TableType.TABLE.value()})) { + try (final ResultSet rs = metaData.getTables(catalog, schema, tableName, new String[]{TableType.TABLE.value()})) { if (null != rs) { if (rs.next()) { table.setComment(rs.getString("REMARKS")); @@ -234,7 +234,7 @@ public class MetaUtil { } // 获得主键 - try (ResultSet rs = metaData.getPrimaryKeys(catalog, schema, tableName)) { + try (final ResultSet rs = metaData.getPrimaryKeys(catalog, schema, tableName)) { if (null != rs) { while (rs.next()) { table.addPk(rs.getString("COLUMN_NAME")); @@ -243,7 +243,7 @@ public class MetaUtil { } // 获得列 - try (ResultSet rs = metaData.getColumns(catalog, schema, tableName, null)) { + try (final ResultSet rs = metaData.getColumns(catalog, schema, tableName, null)) { if (null != rs) { while (rs.next()) { table.setColumn(Column.create(table, rs)); @@ -252,7 +252,7 @@ public class MetaUtil { } // 获得索引信息(since 5.7.23) - try (ResultSet rs = metaData.getIndexInfo(catalog, schema, tableName, false, false)) { + try (final ResultSet rs = metaData.getIndexInfo(catalog, schema, tableName, false, false)) { final Map indexInfoMap = new LinkedHashMap<>(); if (null != rs) { while (rs.next()) { diff --git a/hutool-db/src/test/java/cn/hutool/db/meta/MetaUtilTest.java b/hutool-db/src/test/java/cn/hutool/db/meta/MetaUtilTest.java index 0abd886760..d9ece6a584 100644 --- a/hutool-db/src/test/java/cn/hutool/db/meta/MetaUtilTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/meta/MetaUtilTest.java @@ -2,6 +2,7 @@ package cn.hutool.db.meta; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.db.DbRuntimeException; import cn.hutool.db.ds.DSFactory; import org.junit.Assert; import org.junit.Test; @@ -20,25 +21,34 @@ public class MetaUtilTest { @Test public void getTablesTest() { - List tables = MetaUtil.getTables(ds); + final List tables = MetaUtil.getTables(ds); Assert.assertEquals("user", tables.get(0)); } @Test public void getTableMetaTest() { - Table table = MetaUtil.getTableMeta(ds, "user"); + final Table table = MetaUtil.getTableMeta(ds, "user"); Assert.assertEquals(CollectionUtil.newHashSet("id"), table.getPkNames()); } @Test public void getColumnNamesTest() { - String[] names = MetaUtil.getColumnNames(ds, "user"); + final String[] names = MetaUtil.getColumnNames(ds, "user"); Assert.assertArrayEquals(StrUtil.splitToArray("id,name,age,birthday,gender", ','), names); } @Test public void getTableIndexInfoTest() { - Table table = MetaUtil.getTableMeta(ds, "user_1"); + final Table table = MetaUtil.getTableMeta(ds, "user_1"); + Assert.assertEquals(table.getIndexInfoList().size(), 2); + } + + /** + * 表不存在抛出异常。 + */ + @Test(expected = DbRuntimeException.class) + public void getTableNotExistTest() { + final Table table = MetaUtil.getTableMeta(ds, "user_not_exist"); Assert.assertEquals(table.getIndexInfoList().size(), 2); } } diff --git a/hutool-dfa/src/main/java/cn/hutool/dfa/SensitiveUtil.java b/hutool-dfa/src/main/java/cn/hutool/dfa/SensitiveUtil.java index bcf81a7847..ba8507cfff 100755 --- a/hutool-dfa/src/main/java/cn/hutool/dfa/SensitiveUtil.java +++ b/hutool-dfa/src/main/java/cn/hutool/dfa/SensitiveUtil.java @@ -194,7 +194,7 @@ public final class SensitiveUtil { * @return 敏感词过滤处理后的bean对象 */ public static T sensitiveFilter(T bean, boolean isGreedMatch, SensitiveProcessor sensitiveProcessor) { - String jsonText = JSONUtil.toJsonStr(bean); + final String jsonText = JSONUtil.toJsonStr(bean); @SuppressWarnings("unchecked") final Class c = (Class) bean.getClass(); return JSONUtil.toBean(sensitiveFilter(jsonText, isGreedMatch, sensitiveProcessor), c); } @@ -224,7 +224,7 @@ public final class SensitiveUtil { } //敏感词过滤场景下,不需要密集匹配 - List foundWordList = getFoundAllSensitive(text, true, isGreedMatch); + final List foundWordList = getFoundAllSensitive(text, true, isGreedMatch); if (CollUtil.isEmpty(foundWordList)) { return text; } @@ -233,10 +233,10 @@ public final class SensitiveUtil { final Map foundWordMap = new HashMap<>(foundWordList.size(), 1); foundWordList.forEach(foundWord -> foundWordMap.put(foundWord.getStartIndex(), foundWord)); - int length = text.length(); - StringBuilder textStringBuilder = new StringBuilder(); + final int length = text.length(); + final StringBuilder textStringBuilder = new StringBuilder(); for (int i = 0; i < length; i++) { - FoundWord fw = foundWordMap.get(i); + final FoundWord fw = foundWordMap.get(i); if (fw != null) { textStringBuilder.append(sensitiveProcessor.process(fw)); i = fw.getEndIndex(); -- Gitee From fc51570e0350de4fd41b345d621bfdf4e345eb7c Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 5 May 2022 11:33:31 +0800 Subject: [PATCH 0017/1737] fix code --- .../src/main/java/cn/hutool/core/lang/Opt.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Opt.java b/hutool-core/src/main/java/cn/hutool/core/lang/Opt.java index 139741a3e2..eddc1476f0 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Opt.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/Opt.java @@ -41,7 +41,7 @@ import java.util.stream.Stream; /** * 复制jdk16中的Optional,以及自己进行了一点调整和新增,比jdk8中的Optional多了几个实用的函数
- * 详细见:https://gitee.com/dromara/hutool/pulls/426 + * 详细见:https://gitee.com/dromara/hutool/pulls/426 * * @param 包裹里元素的类型 * @author VampireAchao @@ -60,8 +60,7 @@ public class Opt { * @return Opt */ public static Opt empty() { - @SuppressWarnings("unchecked") - Opt t = (Opt) EMPTY; + @SuppressWarnings("unchecked") final Opt t = (Opt) EMPTY; return t; } @@ -322,7 +321,7 @@ public class Opt { return empty(); } else { @SuppressWarnings("unchecked") - Opt r = (Opt) mapper.apply(value); + final Opt r = (Opt) mapper.apply(value); return Objects.requireNonNull(r); } } @@ -400,8 +399,7 @@ public class Opt { if (isPresent()) { return this; } else { - @SuppressWarnings("unchecked") - Opt r = (Opt) supplier.get(); + @SuppressWarnings("unchecked") final Opt r = (Opt) supplier.get(); return Objects.requireNonNull(r); } } @@ -544,7 +542,7 @@ public class Opt { return false; } - Opt other = (Opt) obj; + final Opt other = (Opt) obj; return Objects.equals(value, other.value); } -- Gitee From 81ef04875bb5d59343cfb772128d79c4e2954416 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 5 May 2022 14:01:09 +0800 Subject: [PATCH 0018/1737] add methods --- CHANGELOG.md | 1 + .../cn/hutool/crypto/digest/DigestUtil.java | 106 ++++++++++++++++++ 2 files changed, 107 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61c13f66df..9275986f49 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ * 【core 】 BeanUtil增加beanToMap重载(pr#2292@Github) * 【core 】 Assert增加对应的equals及notEquals方法(pr#612@Gitee) * 【core 】 Assert增加对应的equals及notEquals方法(pr#612@Gitee) +* 【core 】 DigestUtil增加sha512方法(issue#2298@Github) ### 🐞Bug修复 * 【db 】 修复RedisDS无法设置maxWaitMillis问题(issue#I54TZ9@Gitee) diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/digest/DigestUtil.java b/hutool-crypto/src/main/java/cn/hutool/crypto/digest/DigestUtil.java index fc6fd61ce0..e6c04e3051 100644 --- a/hutool-crypto/src/main/java/cn/hutool/crypto/digest/DigestUtil.java +++ b/hutool-crypto/src/main/java/cn/hutool/crypto/digest/DigestUtil.java @@ -487,4 +487,110 @@ public class DigestUtil { public static boolean bcryptCheck(String password, String hashed) { return BCrypt.checkpw(password, hashed); } + + // ------------------------------------------------------------------------------------------- SHA-512 + + /** + * 计算SHA-512摘要值 + * + * @param data 被摘要数据 + * @return SHA-512摘要 + */ + public static byte[] sha512(final byte[] data) { + return new Digester(DigestAlgorithm.SHA512).digest(data); + } + + /** + * 计算SHA-512摘要值 + * + * @param data 被摘要数据 + * @param charset 编码 + * @return SHA-512摘要 + * @since 3.0.8 + */ + public static byte[] sha512(final String data, final String charset) { + return new Digester(DigestAlgorithm.SHA512).digest(data, charset); + } + + /** + * 计算sha512摘要值,使用UTF-8编码 + * + * @param data 被摘要数据 + * @return MD5摘要 + */ + public static byte[] sha512(final String data) { + return sha512(data, CharsetUtil.UTF_8); + } + + /** + * 计算SHA-512摘要值 + * + * @param data 被摘要数据 + * @return SHA-512摘要 + */ + public static byte[] sha512(final InputStream data) { + return new Digester(DigestAlgorithm.SHA512).digest(data); + } + + /** + * 计算SHA-512摘要值 + * + * @param file 被摘要文件 + * @return SHA-512摘要 + */ + public static byte[] sha512(final File file) { + return new Digester(DigestAlgorithm.SHA512).digest(file); + } + + /** + * 计算SHA-1摘要值,并转为16进制字符串 + * + * @param data 被摘要数据 + * @return SHA-512摘要的16进制表示 + */ + public static String sha512Hex(final byte[] data) { + return new Digester(DigestAlgorithm.SHA512).digestHex(data); + } + + /** + * 计算SHA-512摘要值,并转为16进制字符串 + * + * @param data 被摘要数据 + * @param charset 编码 + * @return SHA-512摘要的16进制表示 + */ + public static String sha512Hex(final String data, final String charset) { + return new Digester(DigestAlgorithm.SHA512).digestHex(data, charset); + } + + /** + * 计算SHA-512摘要值,并转为16进制字符串 + * + * @param data 被摘要数据 + * @return SHA-512摘要的16进制表示 + */ + public static String sha512Hex(final String data) { + return sha512Hex(data, CharsetUtil.UTF_8); + } + + /** + * 计算SHA-512摘要值,并转为16进制字符串 + * + * @param data 被摘要数据 + * @return SHA-512摘要的16进制表示 + */ + public static String sha512Hex(final InputStream data) { + return new Digester(DigestAlgorithm.SHA512).digestHex(data); + } + + /** + * 计算SHA-512摘要值,并转为16进制字符串 + * + * @param file 被摘要文件 + * @return SHA-512摘要的16进制表示 + */ + public static String sha512Hex(final File file) { + return new Digester(DigestAlgorithm.SHA512).digestHex(file); + } + } -- Gitee From df235cf6e6768107b65cc09eb1e5a027b8343c38 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 6 May 2022 13:48:15 +0800 Subject: [PATCH 0019/1737] =?UTF-8?q?=F0=9F=A7=A8Release=205.8.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 +- README-EN.md | 6 +++--- README.md | 6 +++--- bin/version.txt | 2 +- docs/js/version.js | 2 +- hutool-all/pom.xml | 2 +- hutool-aop/pom.xml | 2 +- hutool-bloomFilter/pom.xml | 2 +- hutool-bom/pom.xml | 2 +- hutool-cache/pom.xml | 2 +- hutool-captcha/pom.xml | 2 +- hutool-core/pom.xml | 2 +- hutool-cron/pom.xml | 2 +- hutool-crypto/pom.xml | 2 +- hutool-db/pom.xml | 2 +- hutool-dfa/pom.xml | 2 +- hutool-extra/pom.xml | 2 +- hutool-http/pom.xml | 2 +- hutool-json/pom.xml | 2 +- hutool-jwt/pom.xml | 2 +- hutool-log/pom.xml | 2 +- hutool-poi/pom.xml | 2 +- hutool-script/pom.xml | 2 +- hutool-setting/pom.xml | 2 +- hutool-socket/pom.xml | 2 +- hutool-system/pom.xml | 2 +- pom.xml | 2 +- 27 files changed, 31 insertions(+), 31 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9275986f49..101e9ebe10 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.0.M5 (2022-05-05) +# 5.8.0 (2022-05-06) ### ❌不兼容特性 * 【extra 】 升级jakarta.validation-api到3.x,包名变更导致不能向下兼容 diff --git a/README-EN.md b/README-EN.md index 1f79bbb656..a9fb501547 100755 --- a/README-EN.md +++ b/README-EN.md @@ -144,18 +144,18 @@ We provide the T-Shirt and Sweater with Hutool Logo, please visit the shop: cn.hutool hutool-all - 5.8.0.M5 + 5.8.0 ``` ### 🍐Gradle ``` -implementation 'cn.hutool:hutool-all:5.8.0.M5' +implementation 'cn.hutool:hutool-all:5.8.0' ``` ## 📥Download -- [Maven Repo](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.0.M5/) +- [Maven Repo](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.0/) > 🔔️note: > Hutool 5.x supports JDK8+ and is not tested on Android platforms, and cannot guarantee that all tool classes or tool methods are available. diff --git a/README.md b/README.md index 601bf892d6..f709e87d1f 100755 --- a/README.md +++ b/README.md @@ -144,20 +144,20 @@ Hutool的存在就是为了减少代码搜索成本,避免网络上参差不 cn.hutool hutool-all - 5.8.0.M5 + 5.8.0 ``` ### 🍐Gradle ``` -implementation 'cn.hutool:hutool-all:5.8.0.M5' +implementation 'cn.hutool:hutool-all:5.8.0' ``` ### 📥下载jar 点击以下链接,下载`hutool-all-X.X.X.jar`即可: -- [Maven中央库](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.0.M5/) +- [Maven中央库](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.0/) > 🔔️注意 > Hutool 5.x支持JDK8+,对Android平台没有测试,不能保证所有工具类或工具方法可用。 diff --git a/bin/version.txt b/bin/version.txt index 0185a6be92..11d9efa3d5 100755 --- a/bin/version.txt +++ b/bin/version.txt @@ -1 +1 @@ -5.8.0.M5 +5.8.0 diff --git a/docs/js/version.js b/docs/js/version.js index 2ce39747be..d7dea17095 100755 --- a/docs/js/version.js +++ b/docs/js/version.js @@ -1 +1 @@ -var version = '5.8.0.M5' \ No newline at end of file +var version = '5.8.0' \ No newline at end of file diff --git a/hutool-all/pom.xml b/hutool-all/pom.xml index c18a06212e..764f458523 100755 --- a/hutool-all/pom.xml +++ b/hutool-all/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0.M5 + 5.8.0 hutool-all diff --git a/hutool-aop/pom.xml b/hutool-aop/pom.xml index b365e396c4..e8241a598d 100755 --- a/hutool-aop/pom.xml +++ b/hutool-aop/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0.M5 + 5.8.0 hutool-aop diff --git a/hutool-bloomFilter/pom.xml b/hutool-bloomFilter/pom.xml index d38e38057c..9d097a6302 100755 --- a/hutool-bloomFilter/pom.xml +++ b/hutool-bloomFilter/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0.M5 + 5.8.0 hutool-bloomFilter diff --git a/hutool-bom/pom.xml b/hutool-bom/pom.xml index f332b3d891..2f52f535c6 100755 --- a/hutool-bom/pom.xml +++ b/hutool-bom/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0.M5 + 5.8.0 hutool-bom diff --git a/hutool-cache/pom.xml b/hutool-cache/pom.xml index 15f9986f7c..676db09e3a 100755 --- a/hutool-cache/pom.xml +++ b/hutool-cache/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0.M5 + 5.8.0 hutool-cache diff --git a/hutool-captcha/pom.xml b/hutool-captcha/pom.xml index 157efcfb40..4bb1c27b44 100755 --- a/hutool-captcha/pom.xml +++ b/hutool-captcha/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0.M5 + 5.8.0 hutool-captcha diff --git a/hutool-core/pom.xml b/hutool-core/pom.xml index bc6a64195d..7a23f3e9f5 100755 --- a/hutool-core/pom.xml +++ b/hutool-core/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0.M5 + 5.8.0 hutool-core diff --git a/hutool-cron/pom.xml b/hutool-cron/pom.xml index 946cda8039..b2139d0e65 100755 --- a/hutool-cron/pom.xml +++ b/hutool-cron/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0.M5 + 5.8.0 hutool-cron diff --git a/hutool-crypto/pom.xml b/hutool-crypto/pom.xml index 85466e6afb..8c967bffb5 100755 --- a/hutool-crypto/pom.xml +++ b/hutool-crypto/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0.M5 + 5.8.0 hutool-crypto diff --git a/hutool-db/pom.xml b/hutool-db/pom.xml index 19a80bed47..6b3188371e 100755 --- a/hutool-db/pom.xml +++ b/hutool-db/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0.M5 + 5.8.0 hutool-db diff --git a/hutool-dfa/pom.xml b/hutool-dfa/pom.xml index 05e50a60e7..bb5c1b43ca 100755 --- a/hutool-dfa/pom.xml +++ b/hutool-dfa/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0.M5 + 5.8.0 hutool-dfa diff --git a/hutool-extra/pom.xml b/hutool-extra/pom.xml index 4b13a50dbd..fe6e30d38b 100755 --- a/hutool-extra/pom.xml +++ b/hutool-extra/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0.M5 + 5.8.0 hutool-extra diff --git a/hutool-http/pom.xml b/hutool-http/pom.xml index 8ddc534f70..da31f1d787 100755 --- a/hutool-http/pom.xml +++ b/hutool-http/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0.M5 + 5.8.0 hutool-http diff --git a/hutool-json/pom.xml b/hutool-json/pom.xml index 0c3b525259..0d0d1152cd 100755 --- a/hutool-json/pom.xml +++ b/hutool-json/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0.M5 + 5.8.0 hutool-json diff --git a/hutool-jwt/pom.xml b/hutool-jwt/pom.xml index 3a4ef4229b..5b80df24c9 100755 --- a/hutool-jwt/pom.xml +++ b/hutool-jwt/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0.M5 + 5.8.0 hutool-jwt diff --git a/hutool-log/pom.xml b/hutool-log/pom.xml index fc5eee676d..36a5fc35df 100755 --- a/hutool-log/pom.xml +++ b/hutool-log/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0.M5 + 5.8.0 hutool-log diff --git a/hutool-poi/pom.xml b/hutool-poi/pom.xml index e45c87948a..43bcd8e7c5 100755 --- a/hutool-poi/pom.xml +++ b/hutool-poi/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0.M5 + 5.8.0 hutool-poi diff --git a/hutool-script/pom.xml b/hutool-script/pom.xml index 5dceb2244b..ada7ffeaa5 100755 --- a/hutool-script/pom.xml +++ b/hutool-script/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0.M5 + 5.8.0 hutool-script diff --git a/hutool-setting/pom.xml b/hutool-setting/pom.xml index 1a8a2e7fe9..2a366d0b6c 100755 --- a/hutool-setting/pom.xml +++ b/hutool-setting/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0.M5 + 5.8.0 hutool-setting diff --git a/hutool-socket/pom.xml b/hutool-socket/pom.xml index 9e0a00aa28..8b74e2c32e 100755 --- a/hutool-socket/pom.xml +++ b/hutool-socket/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0.M5 + 5.8.0 hutool-socket diff --git a/hutool-system/pom.xml b/hutool-system/pom.xml index 2f557d049d..2a8c2e1646 100755 --- a/hutool-system/pom.xml +++ b/hutool-system/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0.M5 + 5.8.0 hutool-system diff --git a/pom.xml b/pom.xml index 0899822389..d874dbd2e0 100755 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ cn.hutool hutool-parent - 5.8.0.M5 + 5.8.0 hutool Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。 https://github.com/dromara/hutool -- Gitee From bcd6549bd04fb3f89eb35f8bfcdc612a941f28a4 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 6 May 2022 14:02:34 +0800 Subject: [PATCH 0020/1737] prepare 5.8.1 --- CHANGELOG.md | 7 +++++++ README-EN.md | 6 +++--- README.md | 6 +++--- bin/version.txt | 2 +- docs/js/version.js | 2 +- hutool-all/pom.xml | 2 +- hutool-aop/pom.xml | 2 +- hutool-bloomFilter/pom.xml | 2 +- hutool-bom/pom.xml | 2 +- hutool-cache/pom.xml | 2 +- hutool-captcha/pom.xml | 2 +- hutool-core/pom.xml | 2 +- hutool-cron/pom.xml | 2 +- hutool-crypto/pom.xml | 2 +- hutool-db/pom.xml | 2 +- hutool-dfa/pom.xml | 2 +- hutool-extra/pom.xml | 2 +- hutool-http/pom.xml | 2 +- hutool-json/pom.xml | 2 +- hutool-jwt/pom.xml | 2 +- hutool-log/pom.xml | 2 +- hutool-poi/pom.xml | 2 +- hutool-script/pom.xml | 2 +- hutool-setting/pom.xml | 2 +- hutool-socket/pom.xml | 2 +- hutool-system/pom.xml | 2 +- pom.xml | 2 +- 27 files changed, 37 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 101e9ebe10..f2ae08751a 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,13 @@ ------------------------------------------------------------------------------------------------------------- +# 5.8.1.M1 (2022-05-06) + +### 🐣新特性 +### 🐞Bug修复 + +------------------------------------------------------------------------------------------------------------- + # 5.8.0 (2022-05-06) ### ❌不兼容特性 diff --git a/README-EN.md b/README-EN.md index a9fb501547..5c2a862d37 100755 --- a/README-EN.md +++ b/README-EN.md @@ -144,18 +144,18 @@ We provide the T-Shirt and Sweater with Hutool Logo, please visit the shop: cn.hutool hutool-all - 5.8.0 + 5.8.1.M1 ``` ### 🍐Gradle ``` -implementation 'cn.hutool:hutool-all:5.8.0' +implementation 'cn.hutool:hutool-all:5.8.1.M1' ``` ## 📥Download -- [Maven Repo](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.0/) +- [Maven Repo](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.1.M1/) > 🔔️note: > Hutool 5.x supports JDK8+ and is not tested on Android platforms, and cannot guarantee that all tool classes or tool methods are available. diff --git a/README.md b/README.md index f709e87d1f..ed040204af 100755 --- a/README.md +++ b/README.md @@ -144,20 +144,20 @@ Hutool的存在就是为了减少代码搜索成本,避免网络上参差不 cn.hutool hutool-all - 5.8.0 + 5.8.1.M1 ``` ### 🍐Gradle ``` -implementation 'cn.hutool:hutool-all:5.8.0' +implementation 'cn.hutool:hutool-all:5.8.1.M1' ``` ### 📥下载jar 点击以下链接,下载`hutool-all-X.X.X.jar`即可: -- [Maven中央库](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.0/) +- [Maven中央库](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.1.M1/) > 🔔️注意 > Hutool 5.x支持JDK8+,对Android平台没有测试,不能保证所有工具类或工具方法可用。 diff --git a/bin/version.txt b/bin/version.txt index 11d9efa3d5..38b773a107 100755 --- a/bin/version.txt +++ b/bin/version.txt @@ -1 +1 @@ -5.8.0 +5.8.1.M1 diff --git a/docs/js/version.js b/docs/js/version.js index d7dea17095..723b860227 100755 --- a/docs/js/version.js +++ b/docs/js/version.js @@ -1 +1 @@ -var version = '5.8.0' \ No newline at end of file +var version = '5.8.1.M1' \ No newline at end of file diff --git a/hutool-all/pom.xml b/hutool-all/pom.xml index 764f458523..744eeb0b24 100755 --- a/hutool-all/pom.xml +++ b/hutool-all/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0 + 5.8.1.M1 hutool-all diff --git a/hutool-aop/pom.xml b/hutool-aop/pom.xml index e8241a598d..4c244eec2e 100755 --- a/hutool-aop/pom.xml +++ b/hutool-aop/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0 + 5.8.1.M1 hutool-aop diff --git a/hutool-bloomFilter/pom.xml b/hutool-bloomFilter/pom.xml index 9d097a6302..0d0f25a295 100755 --- a/hutool-bloomFilter/pom.xml +++ b/hutool-bloomFilter/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0 + 5.8.1.M1 hutool-bloomFilter diff --git a/hutool-bom/pom.xml b/hutool-bom/pom.xml index 2f52f535c6..8f825bbec5 100755 --- a/hutool-bom/pom.xml +++ b/hutool-bom/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0 + 5.8.1.M1 hutool-bom diff --git a/hutool-cache/pom.xml b/hutool-cache/pom.xml index 676db09e3a..7c9806b566 100755 --- a/hutool-cache/pom.xml +++ b/hutool-cache/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0 + 5.8.1.M1 hutool-cache diff --git a/hutool-captcha/pom.xml b/hutool-captcha/pom.xml index 4bb1c27b44..3ebfa21ad0 100755 --- a/hutool-captcha/pom.xml +++ b/hutool-captcha/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0 + 5.8.1.M1 hutool-captcha diff --git a/hutool-core/pom.xml b/hutool-core/pom.xml index 7a23f3e9f5..51178aa0e7 100755 --- a/hutool-core/pom.xml +++ b/hutool-core/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0 + 5.8.1.M1 hutool-core diff --git a/hutool-cron/pom.xml b/hutool-cron/pom.xml index b2139d0e65..47653c0035 100755 --- a/hutool-cron/pom.xml +++ b/hutool-cron/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0 + 5.8.1.M1 hutool-cron diff --git a/hutool-crypto/pom.xml b/hutool-crypto/pom.xml index 8c967bffb5..64ac5fec10 100755 --- a/hutool-crypto/pom.xml +++ b/hutool-crypto/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0 + 5.8.1.M1 hutool-crypto diff --git a/hutool-db/pom.xml b/hutool-db/pom.xml index 6b3188371e..268ca07855 100755 --- a/hutool-db/pom.xml +++ b/hutool-db/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0 + 5.8.1.M1 hutool-db diff --git a/hutool-dfa/pom.xml b/hutool-dfa/pom.xml index bb5c1b43ca..cb52e6f693 100755 --- a/hutool-dfa/pom.xml +++ b/hutool-dfa/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0 + 5.8.1.M1 hutool-dfa diff --git a/hutool-extra/pom.xml b/hutool-extra/pom.xml index fe6e30d38b..ce4eafc7cd 100755 --- a/hutool-extra/pom.xml +++ b/hutool-extra/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0 + 5.8.1.M1 hutool-extra diff --git a/hutool-http/pom.xml b/hutool-http/pom.xml index da31f1d787..435235ccb2 100755 --- a/hutool-http/pom.xml +++ b/hutool-http/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0 + 5.8.1.M1 hutool-http diff --git a/hutool-json/pom.xml b/hutool-json/pom.xml index 0d0d1152cd..311bcd5fc3 100755 --- a/hutool-json/pom.xml +++ b/hutool-json/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0 + 5.8.1.M1 hutool-json diff --git a/hutool-jwt/pom.xml b/hutool-jwt/pom.xml index 5b80df24c9..09c2f78f15 100755 --- a/hutool-jwt/pom.xml +++ b/hutool-jwt/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0 + 5.8.1.M1 hutool-jwt diff --git a/hutool-log/pom.xml b/hutool-log/pom.xml index 36a5fc35df..b9deb7f2ec 100755 --- a/hutool-log/pom.xml +++ b/hutool-log/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0 + 5.8.1.M1 hutool-log diff --git a/hutool-poi/pom.xml b/hutool-poi/pom.xml index 43bcd8e7c5..d0d9a1cf60 100755 --- a/hutool-poi/pom.xml +++ b/hutool-poi/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0 + 5.8.1.M1 hutool-poi diff --git a/hutool-script/pom.xml b/hutool-script/pom.xml index ada7ffeaa5..aff0777aeb 100755 --- a/hutool-script/pom.xml +++ b/hutool-script/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0 + 5.8.1.M1 hutool-script diff --git a/hutool-setting/pom.xml b/hutool-setting/pom.xml index 2a366d0b6c..3489996bdf 100755 --- a/hutool-setting/pom.xml +++ b/hutool-setting/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0 + 5.8.1.M1 hutool-setting diff --git a/hutool-socket/pom.xml b/hutool-socket/pom.xml index 8b74e2c32e..8a028706ad 100755 --- a/hutool-socket/pom.xml +++ b/hutool-socket/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0 + 5.8.1.M1 hutool-socket diff --git a/hutool-system/pom.xml b/hutool-system/pom.xml index 2a8c2e1646..3c8cd92ad8 100755 --- a/hutool-system/pom.xml +++ b/hutool-system/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.0 + 5.8.1.M1 hutool-system diff --git a/pom.xml b/pom.xml index d874dbd2e0..a5fb0ed4f6 100755 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ cn.hutool hutool-parent - 5.8.0 + 5.8.1.M1 hutool Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。 https://github.com/dromara/hutool -- Gitee From b86147c4ae1c66824225889181339b8881b2dec7 Mon Sep 17 00:00:00 2001 From: VampireAchao Date: Sat, 7 May 2022 13:01:30 +0800 Subject: [PATCH 0021/1737] =?UTF-8?q?MapUtil.map=E5=AF=B9null=E5=8F=8B?= =?UTF-8?q?=E5=A5=BD=EF=BC=8C=E4=B8=94=E4=BF=AE=E5=A4=8D=E4=BA=86=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=94=A8=E4=BE=8B=E4=B8=AD=E5=88=86=E7=BB=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java | 3 ++- .../src/test/java/cn/hutool/core/map/MapUtilTest.java | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java b/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java index 23fb8e6046..6dff51f573 100755 --- a/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java @@ -6,6 +6,7 @@ import cn.hutool.core.lang.Editor; import cn.hutool.core.lang.Filter; import cn.hutool.core.lang.Pair; import cn.hutool.core.lang.TypeReference; +import cn.hutool.core.stream.CollectorUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; @@ -708,7 +709,7 @@ public class MapUtil { if (null == map || null == biFunction) { return MapUtil.newHashMap(); } - return map.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, m -> biFunction.apply(m.getKey(), m.getValue()))); + return map.entrySet().stream().collect(CollectorUtil.toMap(Map.Entry::getKey, m -> biFunction.apply(m.getKey(), m.getValue()),(l,r)->l)); } /** diff --git a/hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java index 876e31446c..ef7540d0e9 100644 --- a/hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java @@ -82,7 +82,7 @@ public class MapUtilTest { // 如你所见,它是一个map,key由用户id,value由用户组成 Map idUserMap = Stream.iterate(0L, i -> ++i).limit(4).map(i -> User.builder().id(i).name(customers.poll()).build()).collect(Collectors.toMap(User::getId, Function.identity())); // 如你所见,它是一个map,key由分组id,value由用户ids组成,典型的多对多关系 - Map> groupIdUserIdsMap = groups.stream().flatMap(group -> idUserMap.keySet().stream().map(userId -> UserGroup.builder().groupId(group.getId()).userId(userId).build())).collect(Collectors.groupingBy(UserGroup::getUserId, Collectors.mapping(UserGroup::getGroupId, Collectors.toList()))); + Map> groupIdUserIdsMap = groups.stream().flatMap(group -> idUserMap.keySet().stream().map(userId -> UserGroup.builder().groupId(group.getId()).userId(userId).build())).collect(Collectors.groupingBy(UserGroup::getGroupId, Collectors.mapping(UserGroup::getUserId, Collectors.toList()))); // 神奇的魔法发生了, 分组id和用户ids组成的map,竟然变成了订单编号和用户实体集合组成的map Map> groupIdUserMap = MapUtil.map(groupIdUserIdsMap, (groupId, userIds) -> userIds.stream().map(idUserMap::get).collect(Collectors.toList())); @@ -98,7 +98,8 @@ public class MapUtilTest { Assert.assertEquals("竹鼠发烧找华农", users.get(2).getName()); Assert.assertEquals("朴实无华朱一旦", users.get(3).getName()); }); - // 能写代码真开心 + // 对null友好 + MapUtil.map(MapUtil.of(0, 0), (k, v) -> null).forEach((k, v) -> Assert.assertNull(v)); } @Test -- Gitee From ec6eb82a62f97cffda120f2c29b718b62a51496f Mon Sep 17 00:00:00 2001 From: VampireAchao Date: Sat, 7 May 2022 13:01:33 +0800 Subject: [PATCH 0022/1737] =?UTF-8?q?Revert=20"=E6=96=B0=E5=A2=9E=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E8=A1=A8=E6=98=AF=E5=90=A6=E5=AD=98=E5=9C=A8=E4=BA=8E?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E7=8A=B6=E6=80=81=E6=A0=87=E8=AF=86?= =?UTF-8?q?"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 68c9153eeb3ebe96a1e94dcb8b64c4622dfcb09b. --- .../main/java/cn/hutool/db/meta/MetaUtil.java | 1 - .../main/java/cn/hutool/db/meta/Table.java | 27 ------------------- 2 files changed, 28 deletions(-) diff --git a/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java b/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java index deb34e8787..f1ecafa830 100755 --- a/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java +++ b/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java @@ -229,7 +229,6 @@ public class MetaUtil { if (null != rs) { if (rs.next()) { table.setComment(rs.getString("REMARKS")); - table.setExists(true); } } } diff --git a/hutool-db/src/main/java/cn/hutool/db/meta/Table.java b/hutool-db/src/main/java/cn/hutool/db/meta/Table.java index 80ce1ba205..7046b1284b 100644 --- a/hutool-db/src/main/java/cn/hutool/db/meta/Table.java +++ b/hutool-db/src/main/java/cn/hutool/db/meta/Table.java @@ -45,11 +45,6 @@ public class Table implements Serializable, Cloneable { */ private final Map columns = new LinkedHashMap<>(); - /** - * 表是否存在 - */ - private Boolean exists; - public static Table create(String tableName) { return new Table(tableName); } @@ -63,7 +58,6 @@ public class Table implements Serializable, Cloneable { */ public Table(String tableName) { this.setTableName(tableName); - this.setExists(false); } // ----------------------------------------------------- Constructor end @@ -179,27 +173,6 @@ public class Table implements Serializable, Cloneable { public void setPkNames(Set pkNames) { this.pkNames = pkNames; } - - /** - * 获取表是否存在 - * - * @return 表是否存在 - */ - public Boolean isExists() { - return exists; - } - - /** - * 设置表是否存在 - * - * @param exists 表是否存在 - * @return this - */ - public Table setExists(Boolean exists) { - this.exists = exists; - return this; - } - // ----------------------------------------------------- Getters and Setters end /** -- Gitee From 62f851142b55c7e96aa869dae7b38d0c64d92719 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 9 May 2022 10:10:43 +0800 Subject: [PATCH 0023/1737] fix bug --- CHANGELOG.md | 3 ++- hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2ae08751a..c99e4cc11c 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,11 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.1.M1 (2022-05-06) +# 5.8.1.M1 (2022-05-09) ### 🐣新特性 ### 🐞Bug修复 +* 【core 】 MapUtil.map对null友好,且修复了测试用例中分组问题(pr#614@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java index ef7540d0e9..aa667dc450 100644 --- a/hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java @@ -82,7 +82,8 @@ public class MapUtilTest { // 如你所见,它是一个map,key由用户id,value由用户组成 Map idUserMap = Stream.iterate(0L, i -> ++i).limit(4).map(i -> User.builder().id(i).name(customers.poll()).build()).collect(Collectors.toMap(User::getId, Function.identity())); // 如你所见,它是一个map,key由分组id,value由用户ids组成,典型的多对多关系 - Map> groupIdUserIdsMap = groups.stream().flatMap(group -> idUserMap.keySet().stream().map(userId -> UserGroup.builder().groupId(group.getId()).userId(userId).build())).collect(Collectors.groupingBy(UserGroup::getGroupId, Collectors.mapping(UserGroup::getUserId, Collectors.toList()))); + Map> groupIdUserIdsMap = groups.stream().flatMap(group -> idUserMap.keySet().stream().map(userId -> UserGroup.builder().groupId(group.getId()).userId(userId).build())) + .collect(Collectors.groupingBy(UserGroup::getGroupId, Collectors.mapping(UserGroup::getUserId, Collectors.toList()))); // 神奇的魔法发生了, 分组id和用户ids组成的map,竟然变成了订单编号和用户实体集合组成的map Map> groupIdUserMap = MapUtil.map(groupIdUserIdsMap, (groupId, userIds) -> userIds.stream().map(idUserMap::get).collect(Collectors.toList())); -- Gitee From cf9d2f62c16984365d172c70e0b014476b81b62d Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 9 May 2022 11:33:48 +0800 Subject: [PATCH 0024/1737] add methods --- CHANGELOG.md | 1 + .../java/cn/hutool/core/util/BooleanUtil.java | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c99e4cc11c..bebec13431 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ # 5.8.1.M1 (2022-05-09) ### 🐣新特性 +* 【core 】 BooleanUtil增加toBooleanObject方法(issue#I56AG3@Gitee) ### 🐞Bug修复 * 【core 】 MapUtil.map对null友好,且修复了测试用例中分组问题(pr#614@Gitee) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/BooleanUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/BooleanUtil.java index 542f89096f..2d215e82b2 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/BooleanUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/BooleanUtil.java @@ -15,6 +15,8 @@ public class BooleanUtil { /** 表示为真的字符串 */ private static final Set TRUE_SET = CollUtil.newHashSet("true", "yes", "y", "t", "ok", "1", "on", "是", "对", "真", "對", "√"); + /** 表示为假的字符串 */ + private static final Set FALSE_SET = CollUtil.newHashSet("false", "no", "n", "f", "0", "off", "否", "错", "假", "錯", "×"); /** * 取相反值 @@ -85,6 +87,28 @@ public class BooleanUtil { return false; } + /** + * 转换字符串为boolean值
+ * 如果为["true", "yes", "y", "t", "ok", "1", "on", "是", "对", "真", "對", "√"],返回{@code true}
+ * 如果为["false", "no", "n", "f", "0", "off", "否", "错", "假", "錯", "×"],返回{@code false}
+ * 其他情况返回{@code null} + * + * @param valueStr 字符串 + * @return boolean值 + * @since 5.8.1 + */ + public static Boolean toBooleanObject(String valueStr) { + if (StrUtil.isNotBlank(valueStr)) { + valueStr = valueStr.trim().toLowerCase(); + if(TRUE_SET.contains(valueStr)){ + return true; + } else if(FALSE_SET.contains(valueStr)){ + return false; + } + } + return null; + } + /** * boolean值转为int * -- Gitee From 3df525409b295ed24d3d2fbc953241df97cc3543 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 9 May 2022 11:41:36 +0800 Subject: [PATCH 0025/1737] fix bug --- CHANGELOG.md | 1 + .../main/java/cn/hutool/core/bean/BeanUtil.java | 4 +++- .../java/cn/hutool/core/bean/BeanUtilTest.java | 17 +++++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bebec13431..3180b3fa4b 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ * 【core 】 BooleanUtil增加toBooleanObject方法(issue#I56AG3@Gitee) ### 🐞Bug修复 * 【core 】 MapUtil.map对null友好,且修复了测试用例中分组问题(pr#614@Gitee) +* 【core 】 修复BeanUtil.beanToMap中properties为null的空指针问题(issue#2303@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java index 5b8e517c39..84dee2e015 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java @@ -616,14 +616,16 @@ public class BeanUtil { * @since 5.8.0 */ public static Map beanToMap(Object bean, String... properties) { + int mapSize = 16; Editor keyEditor = null; if(ArrayUtil.isNotEmpty(properties)){ + mapSize = properties.length; final Set propertiesSet = CollUtil.set(false, properties); keyEditor = property -> propertiesSet.contains(property) ? property : null; } // 指明了要复制的属性 所以不忽略null值 - return beanToMap(bean, new LinkedHashMap<>(properties.length, 1), false, keyEditor); + return beanToMap(bean, new LinkedHashMap<>(mapSize, 1), false, keyEditor); } /** diff --git a/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java index 89de82f857..60f602fe0f 100755 --- a/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java @@ -191,6 +191,23 @@ public class BeanUtilTest { Assert.assertFalse(map.containsKey("SUBNAME")); } + @Test + public void beanToMapNullPropertiesTest() { + SubPerson person = new SubPerson(); + person.setAge(14); + person.setOpenid("11213232"); + person.setName("测试A11"); + person.setSubName("sub名字"); + + Map map = BeanUtil.beanToMap(person, null); + + Assert.assertEquals("测试A11", map.get("name")); + Assert.assertEquals(14, map.get("age")); + Assert.assertEquals("11213232", map.get("openid")); + // static属性应被忽略 + Assert.assertFalse(map.containsKey("SUBNAME")); + } + @Test public void beanToMapTest2() { SubPerson person = new SubPerson(); -- Gitee From 52783c072d34364f82ecb41a4f18fb846096970b Mon Sep 17 00:00:00 2001 From: youlinlong Date: Mon, 9 May 2022 15:57:29 +0800 Subject: [PATCH 0026/1737] feat: add some new versions of Java --- .../main/java/cn/hutool/system/JavaInfo.java | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/hutool-system/src/main/java/cn/hutool/system/JavaInfo.java b/hutool-system/src/main/java/cn/hutool/system/JavaInfo.java index 256cfdee24..397598febb 100755 --- a/hutool-system/src/main/java/cn/hutool/system/JavaInfo.java +++ b/hutool-system/src/main/java/cn/hutool/system/JavaInfo.java @@ -30,6 +30,13 @@ public class JavaInfo implements Serializable { private final boolean IS_JAVA_10 = getJavaVersionMatches("10"); private final boolean IS_JAVA_11 = getJavaVersionMatches("11"); private final boolean IS_JAVA_12 = getJavaVersionMatches("12"); + private final boolean IS_JAVA_13 = getJavaVersionMatches("13"); + private final boolean IS_JAVA_14 = getJavaVersionMatches("14"); + private final boolean IS_JAVA_15 = getJavaVersionMatches("15"); + private final boolean IS_JAVA_16 = getJavaVersionMatches("16"); + private final boolean IS_JAVA_17 = getJavaVersionMatches("17"); + private final boolean IS_JAVA_18 = getJavaVersionMatches("18"); + /** * 取得当前Java impl.的版本(取自系统属性:java.version)。 @@ -290,6 +297,79 @@ public class JavaInfo implements Serializable { return IS_JAVA_12; } + /** + * 判断当前Java的版本。 + * + *

+ * 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false + * + * @return 如果当前Java版本为13,则返回true + */ + public final boolean isJava13() { + return IS_JAVA_13; + } + + + /** + * 判断当前Java的版本。 + * + *

+ * 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false + * + * @return 如果当前Java版本为14,则返回true + */ + public final boolean isJava14() { + return IS_JAVA_14; + } + + /** + * 判断当前Java的版本。 + * + *

+ * 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false + * + * @return 如果当前Java版本为15,则返回true + */ + public final boolean isJava15() { + return IS_JAVA_15; + } + + /** + * 判断当前Java的版本。 + * + *

+ * 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false + * + * @return 如果当前Java版本为16,则返回true + */ + public final boolean isJava16() { + return IS_JAVA_16; + } + + /** + * 判断当前Java的版本。 + * + *

+ * 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false + * + * @return 如果当前Java版本为17,则返回true + */ + public final boolean isJava17() { + return IS_JAVA_17; + } + + /** + * 判断当前Java的版本。 + * + *

+ * 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false + * + * @return 如果当前Java版本为18,则返回true + */ + public final boolean isJava18() { + return IS_JAVA_18; + } + /** * 匹配当前Java的版本。 * -- Gitee From fb79f437ab269f8506a5c5577e69f6119407b25e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AB=A0=E7=A6=8F=E6=9D=A5?= Date: Tue, 10 May 2022 09:47:08 +0800 Subject: [PATCH 0027/1737] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B3=9B=E5=9E=8B?= =?UTF-8?q?=E9=9B=86=E5=90=88=E5=90=91=E4=B8=8A=E3=80=81=E5=90=91=E4=B8=8B?= =?UTF-8?q?=E8=BD=AC=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hutool/core/collection/CollUtil.java | 90 +++++++++++++++++++ .../hutool/core/collection/CollUtilTest.java | 31 +++++++ 2 files changed, 121 insertions(+) diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java index cae324ed4c..3a80610da7 100755 --- a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java @@ -3056,4 +3056,94 @@ public class CollUtil { return IterUtil.isEqualList(list1, list2); } + + /** + * 泛型集合向上转型。例如将Collection<Integer>转换为Collection<Number> + * @param collection 集合 + * @param 泛型 + * @return 泛化集合 + */ + @SuppressWarnings("unchecked") + public static Collection castup(Collection collection){ + return (Collection) collection; + } + + /** + * 泛型集合向下转型。例如将Collection<Number>转换为Collection<Integer> + * @param collection + * @param + * @return + */ + @SuppressWarnings("unchecked") + public static Collection castdown(Collection collection){ + return (Collection) collection; + } + + /** + * 泛型集合向上转型。例如将Set<Integer>转换为Set<Number> + * @param set 集合 + * @param 泛型 + * @return 泛化集合 + */ + @SuppressWarnings("unchecked") + public static Set castup(Set set){ + return (Set) set; + } + + /** + * 泛型集合向下转型。例如将Set<Number>转换为Set<Integer> + * @param set 集合 + * @param 泛型子类 + * @return 泛化集合 + */ + @SuppressWarnings("unchecked") + public static Set castdown(Set set){ + return (Set) set; + } + + /** + * 泛型集合向下转型。例如将Map<Integer, Integer>转换为Map<Number,Number> + * @param map 集合 + * @param 泛型父类 + * @param 泛型父类 + * @return 泛化集合 + */ + @SuppressWarnings("unchecked") + public static Map castup(Map map){ + return (Map) map; + } + + /** + * 泛型集合向下转型。例如将Map<Number,Number>转换为Map<Integer, Integer> + * @param map 集合 + * @param 泛型子类 + * @param 泛型子类 + * @return 泛化集合 + */ + @SuppressWarnings("unchecked") + public static Map castdown(Map map){ + return (Map) map; + } + + /** + * 泛型接口向上转型。例如将List<Integer>转换为List<Number> + * @param list 集合 + * @param 泛型的父类 + * @return 泛化集合 + */ + @SuppressWarnings("unchecked") + public static List castup(List list){ + return (List) list; + } + + /** + * 泛型集合向下转型。例如将List<Number>转换为List<Integer> + * @param list 集合 + * @param 泛型的子类 + * @return 泛化集合 + */ + @SuppressWarnings("unchecked") + public static List castdown(List list){ + return (List) list; + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java index 512b13e2d2..50d32c86a0 100755 --- a/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java @@ -10,6 +10,7 @@ import lombok.Data; import org.junit.Assert; import org.junit.Test; +import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -908,6 +909,36 @@ public class CollUtilTest { Assert.assertEquals("bb", distinct.get(1).getName()); } + @Test + public void testCastToSuper() { + Collection collection=CollUtil.newLinkedList(1,2,3); + List list = CollUtil.newArrayList(1, 2, 3); + Set set = CollUtil.newHashSet(1, 2, 3); + Map map = new HashMap<>(); + map.put(1, 1); + + Collection collection2 = CollUtil.castup(collection); + Assert.assertSame(collection, collection2); + + Collection collection3 = CollUtil.castdown(collection2); + Assert.assertSame(collection2, collection3); + + List list2 = CollUtil.castup(list); + Assert.assertSame(list, list2); + List list3 = CollUtil.castdown(list2); + Assert.assertSame(list2, list3); + + Set set2 = CollUtil.castup(set); + Assert.assertSame(set, set2); + Set set3 = CollUtil.castdown(set2); + Assert.assertSame(set2, set3); + + Map map2 = CollUtil.castup(map); + Assert.assertSame(map, map2); + Map map3 = CollUtil.castdown(map2); + Assert.assertSame(map2, map3); + } + @Data @AllArgsConstructor static class Person { -- Gitee From 15d4f786b2d2136f928cfcfd8584f527b4a3010f Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 10 May 2022 18:13:50 +0800 Subject: [PATCH 0028/1737] fix code --- CHANGELOG.md | 4 +++- .../cn/hutool/core/text/CharSequenceUtil.java | 24 ++++++++++++++++++- .../cn/hutool/db/dialect/DialectName.java | 2 +- .../db/dialect/impl/PostgresqlDialect.java | 2 +- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3180b3fa4b..63cc56ce83 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,13 +3,15 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.1.M1 (2022-05-09) +# 5.8.1.M1 (2022-05-10) ### 🐣新特性 * 【core 】 BooleanUtil增加toBooleanObject方法(issue#I56AG3@Gitee) +* 【core 】 CharSequenceUtil增加startWithAnyIgnoreCase方法(issue#2312@Github) ### 🐞Bug修复 * 【core 】 MapUtil.map对null友好,且修复了测试用例中分组问题(pr#614@Gitee) * 【core 】 修复BeanUtil.beanToMap中properties为null的空指针问题(issue#2303@Github) +* 【db 】 DialectName中修正为POSTGRESQL(issue#2308@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java index 6c7c453821..d38e31ee0c 100755 --- a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java @@ -780,6 +780,28 @@ public class CharSequenceUtil { return false; } + /** + * 给定字符串是否以任何一个字符串结尾(忽略大小写)
+ * 给定字符串和数组为空都返回false + * + * @param str 给定字符串 + * @param suffixes 需要检测的结尾字符串 + * @return 给定字符串是否以任何一个字符串结尾 + * @since 5.8.1 + */ + public static boolean startWithAnyIgnoreCase(final CharSequence str, final CharSequence... suffixes) { + if (isEmpty(str) || ArrayUtil.isEmpty(suffixes)) { + return false; + } + + for (final CharSequence suffix : suffixes) { + if (startWith(str, suffix, true)) { + return true; + } + } + return false; + } + // ------------------------------------------------------------------------ endWith /** @@ -2707,7 +2729,7 @@ public class CharSequenceUtil { * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
* 例:
* 通常使用:format("this is {} for {}", "a", "b") =》 this is a for b
- * 转义{}: format("this is \\{} for {}", "a", "b") =》 this is \{} for a
+ * 转义{}: format("this is \\{} for {}", "a", "b") =》 this is {} for a
* 转义\: format("this is \\\\{} for {}", "a", "b") =》 this is \a for b
* * @param template 文本模板,被替换的部分用 {} 表示,如果模板为null,返回"null" diff --git a/hutool-db/src/main/java/cn/hutool/db/dialect/DialectName.java b/hutool-db/src/main/java/cn/hutool/db/dialect/DialectName.java index 8e3d978b95..eeeb1c7da6 100644 --- a/hutool-db/src/main/java/cn/hutool/db/dialect/DialectName.java +++ b/hutool-db/src/main/java/cn/hutool/db/dialect/DialectName.java @@ -9,7 +9,7 @@ import cn.hutool.core.util.StrUtil; * @author Looly */ public enum DialectName { - ANSI, MYSQL, ORACLE, POSTGREESQL, SQLITE3, H2, SQLSERVER, SQLSERVER2012, PHOENIX; + ANSI, MYSQL, ORACLE, POSTGRESQL, SQLITE3, H2, SQLSERVER, SQLSERVER2012, PHOENIX; /** * 是否为指定数据库方言,检查时不分区大小写 diff --git a/hutool-db/src/main/java/cn/hutool/db/dialect/impl/PostgresqlDialect.java b/hutool-db/src/main/java/cn/hutool/db/dialect/impl/PostgresqlDialect.java index 1f5a90122e..0a5e0fc7df 100644 --- a/hutool-db/src/main/java/cn/hutool/db/dialect/impl/PostgresqlDialect.java +++ b/hutool-db/src/main/java/cn/hutool/db/dialect/impl/PostgresqlDialect.java @@ -28,7 +28,7 @@ public class PostgresqlDialect extends AnsiSqlDialect{ @Override public String dialectName() { - return DialectName.POSTGREESQL.name(); + return DialectName.POSTGRESQL.name(); } @Override -- Gitee From 1fa3450b276c59614506abe20e138cc2ef8284de Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 10 May 2022 18:17:41 +0800 Subject: [PATCH 0029/1737] add methods --- CHANGELOG.md | 1 + .../main/java/cn/hutool/system/JavaInfo.java | 142 +++++++++--------- 2 files changed, 72 insertions(+), 71 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63cc56ce83..d0a4e93623 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ ### 🐣新特性 * 【core 】 BooleanUtil增加toBooleanObject方法(issue#I56AG3@Gitee) * 【core 】 CharSequenceUtil增加startWithAnyIgnoreCase方法(issue#2312@Github) +* 【system 】 JavaInfo增加版本(issue#2310@Github) ### 🐞Bug修复 * 【core 】 MapUtil.map对null友好,且修复了测试用例中分组问题(pr#614@Gitee) * 【core 】 修复BeanUtil.beanToMap中properties为null的空指针问题(issue#2303@Github) diff --git a/hutool-system/src/main/java/cn/hutool/system/JavaInfo.java b/hutool-system/src/main/java/cn/hutool/system/JavaInfo.java index 397598febb..34a91e38ac 100755 --- a/hutool-system/src/main/java/cn/hutool/system/JavaInfo.java +++ b/hutool-system/src/main/java/cn/hutool/system/JavaInfo.java @@ -39,12 +39,12 @@ public class JavaInfo implements Serializable { /** - * 取得当前Java impl.的版本(取自系统属性:java.version)。 + * 取得当前Java impl.的版本(取自系统属性:{@code java.version})。 * *

- * 例如Sun JDK 1.4.2:"1.4.2" + * 例如Sun JDK 1.4.2:{@code "1.4.2"} * - * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回null。 + * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回{@code null}。 * @since Java 1.1 */ public final String getVersion() { @@ -52,35 +52,35 @@ public class JavaInfo implements Serializable { } /** - * 取得当前Java impl.的版本(取自系统属性:java.version)。 + * 取得当前Java impl.的版本(取自系统属性:{@code java.version})。 * *

* 例如: * *

    - *
  • JDK 1.2:1.2f
  • - *
  • JDK 1.3.1:1.31f
  • + *
  • JDK 1.2:{@code 1.2f}。
  • + *
  • JDK 1.3.1:{@code 1.31f}
  • *
* - * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回0。 + * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回{@code 0}。 */ public final float getVersionFloat() { return JAVA_VERSION_FLOAT; } /** - * 取得当前Java impl.的版本(取自系统属性:java.version),java10及其之后的版本返回值为4位。 + * 取得当前Java impl.的版本(取自系统属性:{@code java.version}),java10及其之后的版本返回值为4位。 * *

* 例如: * *

    - *
  • JDK 1.2:120
  • - *
  • JDK 1.3.1:131
  • - *
  • JDK 11.0.2:1102
  • + *
  • JDK 1.2:{@code 120}。
  • + *
  • JDK 1.3.1:{@code 131}
  • + *
  • JDK 11.0.2:{@code 1102}
  • *
* - * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回0。 + * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回{@code 0}。 * @since Java 1.1 */ public final int getVersionInt() { @@ -88,9 +88,9 @@ public class JavaInfo implements Serializable { } /** - * 取得当前Java impl.的版本的float值。 + * 取得当前Java impl.的版本的{@code float}值。 * - * @return Java版本的float值或0 + * @return Java版本的float值或{@code 0} */ private float getJavaVersionAsFloat() { if (JAVA_VERSION == null) { @@ -105,18 +105,18 @@ public class JavaInfo implements Serializable { } /** - * 取得当前Java impl.的版本的int值。 + * 取得当前Java impl.的版本的{@code int}值。 * - * @return Java版本的int值或0 + * @return Java版本的int值或{@code 0} */ private int getJavaVersionAsInt() { if (JAVA_VERSION == null) { return 0; } - String javaVersion = ReUtil.get("^[0-9]{1,2}(\\.[0-9]{1,2}){0,2}", JAVA_VERSION, 0); + final String javaVersion = ReUtil.get("^[0-9]{1,2}(\\.[0-9]{1,2}){0,2}", JAVA_VERSION, 0); - String[] split = javaVersion.split("\\."); + final String[] split = javaVersion.split("\\."); String result = ArrayUtil.join(split, ""); //保证java10及其之后的版本返回的值为4位 @@ -128,12 +128,12 @@ public class JavaInfo implements Serializable { } /** - * 取得当前Java impl.的厂商(取自系统属性:java.vendor)。 + * 取得当前Java impl.的厂商(取自系统属性:{@code java.vendor})。 * *

- * 例如Sun JDK 1.4.2:"Sun Microsystems Inc." + * 例如Sun JDK 1.4.2:{@code "Sun Microsystems Inc."} * - * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回null。 + * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回{@code null}。 * @since Java 1.1 */ public final String getVendor() { @@ -141,12 +141,12 @@ public class JavaInfo implements Serializable { } /** - * 取得当前Java impl.的厂商网站的URL(取自系统属性:java.vendor.url)。 + * 取得当前Java impl.的厂商网站的URL(取自系统属性:{@code java.vendor.url})。 * *

- * 例如Sun JDK 1.4.2:"http://java.sun.com/" + * 例如Sun JDK 1.4.2:{@code "http://java.sun.com/"} * - * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回null。 + * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回{@code null}。 * @since Java 1.1 */ public final String getVendorURL() { @@ -157,9 +157,9 @@ public class JavaInfo implements Serializable { * 判断当前Java的版本。 * *

- * 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false + * 如果不能取得系统属性{@code java.version}(因为Java安全限制),则总是返回 {@code false} * - * @return 如果当前Java版本为1.1,则返回true + * @return 如果当前Java版本为1.1,则返回{@code true} */ public final boolean isJava1_1() { return IS_JAVA_1_1; @@ -169,9 +169,9 @@ public class JavaInfo implements Serializable { * 判断当前Java的版本。 * *

- * 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false + * 如果不能取得系统属性{@code java.version}(因为Java安全限制),则总是返回 {@code false} * - * @return 如果当前Java版本为1.2,则返回true + * @return 如果当前Java版本为1.2,则返回{@code true} */ public final boolean isJava1_2() { return IS_JAVA_1_2; @@ -181,9 +181,9 @@ public class JavaInfo implements Serializable { * 判断当前Java的版本。 * *

- * 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false + * 如果不能取得系统属性{@code java.version}(因为Java安全限制),则总是返回 {@code false} * - * @return 如果当前Java版本为1.3,则返回true + * @return 如果当前Java版本为1.3,则返回{@code true} */ public final boolean isJava1_3() { return IS_JAVA_1_3; @@ -193,9 +193,9 @@ public class JavaInfo implements Serializable { * 判断当前Java的版本。 * *

- * 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false + * 如果不能取得系统属性{@code java.version}(因为Java安全限制),则总是返回 {@code false} * - * @return 如果当前Java版本为1.4,则返回true + * @return 如果当前Java版本为1.4,则返回{@code true} */ public final boolean isJava1_4() { return IS_JAVA_1_4; @@ -205,9 +205,9 @@ public class JavaInfo implements Serializable { * 判断当前Java的版本。 * *

- * 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false + * 如果不能取得系统属性{@code java.version}(因为Java安全限制),则总是返回 {@code false} * - * @return 如果当前Java版本为1.5,则返回true + * @return 如果当前Java版本为1.5,则返回{@code true} */ public final boolean isJava1_5() { return IS_JAVA_1_5; @@ -217,9 +217,9 @@ public class JavaInfo implements Serializable { * 判断当前Java的版本。 * *

- * 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false + * 如果不能取得系统属性{@code java.version}(因为Java安全限制),则总是返回 {@code false} * - * @return 如果当前Java版本为1.6,则返回true + * @return 如果当前Java版本为1.6,则返回{@code true} */ public final boolean isJava1_6() { return IS_JAVA_1_6; @@ -229,9 +229,9 @@ public class JavaInfo implements Serializable { * 判断当前Java的版本。 * *

- * 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false + * 如果不能取得系统属性{@code java.version}(因为Java安全限制),则总是返回 {@code false} * - * @return 如果当前Java版本为1.7,则返回true + * @return 如果当前Java版本为1.7,则返回{@code true} */ public final boolean isJava1_7() { return IS_JAVA_1_7; @@ -241,9 +241,9 @@ public class JavaInfo implements Serializable { * 判断当前Java的版本。 * *

- * 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false + * 如果不能取得系统属性{@code java.version}(因为Java安全限制),则总是返回 {@code false} * - * @return 如果当前Java版本为1.8,则返回true + * @return 如果当前Java版本为1.8,则返回{@code true} */ public final boolean isJava1_8() { return IS_JAVA_1_8; @@ -253,9 +253,9 @@ public class JavaInfo implements Serializable { * 判断当前Java的版本。 * *

- * 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false + * 如果不能取得系统属性{@code java.version}(因为Java安全限制),则总是返回 {@code false} * - * @return 如果当前Java版本为9,则返回true + * @return 如果当前Java版本为9,则返回{@code true} */ public final boolean isJava9() { return IS_JAVA_9; @@ -265,9 +265,9 @@ public class JavaInfo implements Serializable { * 判断当前Java的版本。 * *

- * 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false + * 如果不能取得系统属性{@code java.version}(因为Java安全限制),则总是返回 {@code false} * - * @return 如果当前Java版本为10,则返回true + * @return 如果当前Java版本为10,则返回{@code true} */ public final boolean isJava10() { return IS_JAVA_10; @@ -277,9 +277,9 @@ public class JavaInfo implements Serializable { * 判断当前Java的版本。 * *

- * 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false + * 如果不能取得系统属性{@code java.version}(因为Java安全限制),则总是返回 {@code false} * - * @return 如果当前Java版本为11,则返回true + * @return 如果当前Java版本为11,则返回{@code true} */ public final boolean isJava11() { return IS_JAVA_11; @@ -289,9 +289,9 @@ public class JavaInfo implements Serializable { * 判断当前Java的版本。 * *

- * 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false + * 如果不能取得系统属性{@code java.version}(因为Java安全限制),则总是返回 {@code false} * - * @return 如果当前Java版本为12,则返回true + * @return 如果当前Java版本为12,则返回{@code true} */ public final boolean isJava12() { return IS_JAVA_12; @@ -301,9 +301,9 @@ public class JavaInfo implements Serializable { * 判断当前Java的版本。 * *

- * 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false + * 如果不能取得系统属性{@code java.version}(因为Java安全限制),则总是返回 {@code false} * - * @return 如果当前Java版本为13,则返回true + * @return 如果当前Java版本为13,则返回{@code true} */ public final boolean isJava13() { return IS_JAVA_13; @@ -314,9 +314,9 @@ public class JavaInfo implements Serializable { * 判断当前Java的版本。 * *

- * 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false + * 如果不能取得系统属性{@code java.version}(因为Java安全限制),则总是返回 {@code false} * - * @return 如果当前Java版本为14,则返回true + * @return 如果当前Java版本为14,则返回{@code true} */ public final boolean isJava14() { return IS_JAVA_14; @@ -326,9 +326,9 @@ public class JavaInfo implements Serializable { * 判断当前Java的版本。 * *

- * 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false + * 如果不能取得系统属性{@code java.version}(因为Java安全限制),则总是返回 {@code false} * - * @return 如果当前Java版本为15,则返回true + * @return 如果当前Java版本为15,则返回{@code true} */ public final boolean isJava15() { return IS_JAVA_15; @@ -338,9 +338,9 @@ public class JavaInfo implements Serializable { * 判断当前Java的版本。 * *

- * 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false + * 如果不能取得系统属性{@code java.version}(因为Java安全限制),则总是返回 {@code false} * - * @return 如果当前Java版本为16,则返回true + * @return 如果当前Java版本为16,则返回{@code true} */ public final boolean isJava16() { return IS_JAVA_16; @@ -350,9 +350,9 @@ public class JavaInfo implements Serializable { * 判断当前Java的版本。 * *

- * 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false + * 如果不能取得系统属性{@code java.version}(因为Java安全限制),则总是返回 {@code false} * - * @return 如果当前Java版本为17,则返回true + * @return 如果当前Java版本为17,则返回{@code true} */ public final boolean isJava17() { return IS_JAVA_17; @@ -362,9 +362,9 @@ public class JavaInfo implements Serializable { * 判断当前Java的版本。 * *

- * 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false + * 如果不能取得系统属性{@code java.version}(因为Java安全限制),则总是返回 {@code false} * - * @return 如果当前Java版本为18,则返回true + * @return 如果当前Java版本为18,则返回{@code true} */ public final boolean isJava18() { return IS_JAVA_18; @@ -374,9 +374,9 @@ public class JavaInfo implements Serializable { * 匹配当前Java的版本。 * * @param versionPrefix Java版本前缀 - * @return 如果版本匹配,则返回true + * @return 如果版本匹配,则返回{@code true} */ - private boolean getJavaVersionMatches(String versionPrefix) { + private boolean getJavaVersionMatches(final String versionPrefix) { if (JAVA_VERSION == null) { return false; } @@ -392,14 +392,14 @@ public class JavaInfo implements Serializable { * * *

    - *
  • 测试JDK 1.2:isJavaVersionAtLeast(1.2f)
  • - *
  • 测试JDK 1.2.1:isJavaVersionAtLeast(1.31f)
  • + *
  • 测试JDK 1.2:{@code isJavaVersionAtLeast(1.2f)}
  • + *
  • 测试JDK 1.2.1:{@code isJavaVersionAtLeast(1.31f)}
  • *
* * @param requiredVersion 需要的版本 - * @return 如果当前Java版本大于或等于指定的版本,则返回true + * @return 如果当前Java版本大于或等于指定的版本,则返回{@code true} */ - public final boolean isJavaVersionAtLeast(float requiredVersion) { + public final boolean isJavaVersionAtLeast(final float requiredVersion) { return getVersionFloat() >= requiredVersion; } @@ -411,14 +411,14 @@ public class JavaInfo implements Serializable { * * *
    - *
  • 测试JDK 1.2:isJavaVersionAtLeast(120)
  • - *
  • 测试JDK 1.2.1:isJavaVersionAtLeast(131)
  • + *
  • 测试JDK 1.2:{@code isJavaVersionAtLeast(120)}
  • + *
  • 测试JDK 1.2.1:{@code isJavaVersionAtLeast(131)}
  • *
* * @param requiredVersion 需要的版本 - * @return 如果当前Java版本大于或等于指定的版本,则返回true + * @return 如果当前Java版本大于或等于指定的版本,则返回{@code true} */ - public final boolean isJavaVersionAtLeast(int requiredVersion) { + public final boolean isJavaVersionAtLeast(final int requiredVersion) { return getVersionInt() >= requiredVersion; } @@ -429,7 +429,7 @@ public class JavaInfo implements Serializable { */ @Override public final String toString() { - StringBuilder builder = new StringBuilder(); + final StringBuilder builder = new StringBuilder(); SystemUtil.append(builder, "Java Version: ", getVersion()); SystemUtil.append(builder, "Java Vendor: ", getVendor()); -- Gitee From 2841c1f4840252064ef20ce4c3b70934df2334d6 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 12 May 2022 00:58:38 +0800 Subject: [PATCH 0030/1737] fix bug --- CHANGELOG.md | 10 ++- .../java/cn/hutool/core/bean/BeanPath.java | 77 ++++++++++--------- .../main/java/cn/hutool/core/map/MapUtil.java | 5 +- 3 files changed, 52 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0a4e93623..9ded6245ae 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,16 +3,19 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.1.M1 (2022-05-10) +# 5.8.1.M1 (2022-05-12) ### 🐣新特性 * 【core 】 BooleanUtil增加toBooleanObject方法(issue#I56AG3@Gitee) * 【core 】 CharSequenceUtil增加startWithAnyIgnoreCase方法(issue#2312@Github) * 【system 】 JavaInfo增加版本(issue#2310@Github) +* ### 🐞Bug修复 * 【core 】 MapUtil.map对null友好,且修复了测试用例中分组问题(pr#614@Gitee) * 【core 】 修复BeanUtil.beanToMap中properties为null的空指针问题(issue#2303@Github) * 【db 】 DialectName中修正为POSTGRESQL(issue#2308@Github) +* 【core 】 修复BeanPath无法识别引号内的内容问题(issue#I56DE0@Gitee) +* 【core 】 修复Map.entry方法返回可变不可变相反问题 ------------------------------------------------------------------------------------------------------------- @@ -187,4 +190,7 @@ * 【core 】 FileUtil.getMimeType增加rar、7z支持(issue#I4ZBN0@Gitee) * 【json 】 JSON修复transient设置无效问题(issue#2212@Github) * 【core 】 修复IterUtil.getElementType获取结果为null的问题(issue#2222@Github) -* 【core 】 修复农历转公历在闰月时错误(issue#I4ZSGJ@Gitee) \ No newline at end of file +* 【core 】 修复农历转公历在闰月时错误(issue#I4ZSGJ@Gitee) + +# 5.7.x 或更早版本 +* [https://gitee.com/dromara/hutool/blob/v5-master/CHANGELOG_5.0-5.7.md](https://gitee.com/dromara/hutool/blob/v5-master/CHANGELOG_5.0-5.7.md) \ No newline at end of file diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java index ce92e39512..d9e67c99ac 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java @@ -1,9 +1,9 @@ package cn.hutool.core.bean; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.map.MapUtil; -import cn.hutool.core.text.StrBuilder; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.StrUtil; @@ -11,7 +11,6 @@ import cn.hutool.core.util.StrUtil; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -68,7 +67,7 @@ public class BeanPath implements Serializable{ * @param expression 表达式 * @return BeanPath */ - public static BeanPath create(String expression) { + public static BeanPath create(final String expression) { return new BeanPath(expression); } @@ -77,17 +76,26 @@ public class BeanPath implements Serializable{ * * @param expression 表达式 */ - public BeanPath(String expression) { + public BeanPath(final String expression) { init(expression); } + /** + * 获取表达式解析后的分段列表 + * + * @return 表达式分段列表 + */ + public List getPatternParts(){ + return this.patternParts; + } + /** * 获取Bean中对应表达式的值 * * @param bean Bean对象或Map或List等 * @return 值,如果对应值不存在,则返回null */ - public Object get(Object bean) { + public Object get(final Object bean) { return get(this.patternParts, bean, false); } @@ -104,10 +112,16 @@ public class BeanPath implements Serializable{ * @param bean Bean、Map或List * @param value 值 */ - public void set(Object bean, Object value) { + public void set(final Object bean, final Object value) { set(bean, this.patternParts, value); } + @Override + public String toString() { + return this.patternParts.toString(); + } + + //region Private Methods /** * 设置表达式指定位置(或filed对应)的值
* 若表达式指向一个List则设置其坐标对应位置的值,若指向Map则put对应key的值,Bean则设置字段的值
@@ -122,7 +136,7 @@ public class BeanPath implements Serializable{ * @param patternParts 表达式块列表 * @param value 值 */ - private void set(Object bean, List patternParts, Object value) { + private void set(final Object bean, final List patternParts, final Object value) { Object subBean = get(patternParts, bean, true); if(null == subBean) { set(bean, patternParts.subList(0, patternParts.size() - 1), new HashMap<>()); @@ -132,7 +146,6 @@ public class BeanPath implements Serializable{ BeanUtil.setFieldValue(subBean, patternParts.get(patternParts.size() - 1), value); } - // ------------------------------------------------------------------------------------------------------------------------------------- Private method start /** * 获取Bean中对应表达式的值 * @@ -141,7 +154,7 @@ public class BeanPath implements Serializable{ * @param ignoreLast 是否忽略最后一个值,忽略最后一个值则用于set,否则用于read * @return 值,如果对应值不存在,则返回null */ - private Object get(List patternParts, Object bean, boolean ignoreLast) { + private Object get(final List patternParts, final Object bean, final boolean ignoreLast) { int length = patternParts.size(); if (ignoreLast) { length--; @@ -166,7 +179,7 @@ public class BeanPath implements Serializable{ } @SuppressWarnings("unchecked") - private static Object getFieldValue(Object bean, String expression) { + private static Object getFieldValue(final Object bean, final String expression) { if (StrUtil.isBlank(expression)) { return null; } @@ -174,8 +187,8 @@ public class BeanPath implements Serializable{ if (StrUtil.contains(expression, ':')) { // [start:end:step] 模式 final List parts = StrUtil.splitTrim(expression, ':'); - int start = Integer.parseInt(parts.get(0)); - int end = Integer.parseInt(parts.get(1)); + final int start = Integer.parseInt(parts.get(0)); + final int end = Integer.parseInt(parts.get(1)); int step = 1; if (3 == parts.size()) { step = Integer.parseInt(parts.get(2)); @@ -218,13 +231,14 @@ public class BeanPath implements Serializable{ * * @param expression 表达式 */ - private void init(String expression) { - List localPatternParts = new ArrayList<>(); - int length = expression.length(); + private void init(final String expression) { + final List localPatternParts = new ArrayList<>(); + final int length = expression.length(); - final StrBuilder builder = StrUtil.strBuilder(); + final StringBuilder builder = new StringBuilder(); char c; boolean isNumStart = false;// 下标标识符开始 + boolean isInWrap = false; //标识是否在引号内 for (int i = 0; i < length; i++) { c = expression.charAt(i); if (0 == i && '$' == c) { @@ -233,7 +247,13 @@ public class BeanPath implements Serializable{ continue; } - if (ArrayUtil.contains(EXP_CHARS, c)) { + if('\'' == c){ + // 结束 + isInWrap = (false == isInWrap); + continue; + } + + if (false == isInWrap && ArrayUtil.contains(EXP_CHARS, c)) { // 处理边界符号 if (CharUtil.BRACKET_END == c) { // 中括号(数字下标)结束 @@ -253,9 +273,9 @@ public class BeanPath implements Serializable{ // 每一个边界符之前的表达式是一个完整的KEY,开始处理KEY } if (builder.length() > 0) { - localPatternParts.add(unWrapIfPossible(builder)); + localPatternParts.add(builder.toString()); } - builder.reset(); + builder.setLength(0); } else { // 非边界符号,追加字符 builder.append(c); @@ -267,25 +287,12 @@ public class BeanPath implements Serializable{ throw new IllegalArgumentException(StrUtil.format("Bad expression '{}':{}, we find '[' but no ']' !", expression, length - 1)); } else { if (builder.length() > 0) { - localPatternParts.add(unWrapIfPossible(builder)); + localPatternParts.add(builder.toString()); } } // 不可变List - this.patternParts = Collections.unmodifiableList(localPatternParts); - } - - /** - * 对于非表达式去除单引号 - * - * @param expression 表达式 - * @return 表达式 - */ - private static String unWrapIfPossible(CharSequence expression) { - if (StrUtil.containsAny(expression, " = ", " > ", " < ", " like ", ",")) { - return expression.toString(); - } - return StrUtil.unWrap(expression, '\''); + this.patternParts = ListUtil.unmodifiable(localPatternParts); } - // ------------------------------------------------------------------------------------------------------------------------------------- Private method end + //endregion } diff --git a/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java b/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java index 6dff51f573..cc90881436 100755 --- a/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java @@ -28,7 +28,6 @@ import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; import java.util.function.BiFunction; /** @@ -1433,7 +1432,7 @@ public class MapUtil { */ public static Map.Entry entry(K key, V value, boolean isImmutable) { return isImmutable ? - new AbstractMap.SimpleEntry<>(key, value) : - new AbstractMap.SimpleImmutableEntry<>(key, value); + new AbstractMap.SimpleImmutableEntry<>(key, value) : + new AbstractMap.SimpleEntry<>(key, value); } } -- Gitee From 541ab9ed5535d2b36daed8f57aefd6a72285016d Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 12 May 2022 01:21:44 +0800 Subject: [PATCH 0031/1737] add CastUtil --- CHANGELOG.md | 1 + .../cn/hutool/core/collection/CollUtil.java | 92 +------------- .../java/cn/hutool/core/convert/CastUtil.java | 118 ++++++++++++++++++ .../hutool/core/collection/CollUtilTest.java | 31 ----- .../cn/hutool/core/convert/CastUtilTest.java | 45 +++++++ 5 files changed, 165 insertions(+), 122 deletions(-) create mode 100644 hutool-core/src/main/java/cn/hutool/core/convert/CastUtil.java create mode 100644 hutool-core/src/test/java/cn/hutool/core/convert/CastUtilTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ded6245ae..42bf8f9639 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ * 【core 】 BooleanUtil增加toBooleanObject方法(issue#I56AG3@Gitee) * 【core 】 CharSequenceUtil增加startWithAnyIgnoreCase方法(issue#2312@Github) * 【system 】 JavaInfo增加版本(issue#2310@Github) +* 【core 】 新增CastUtil(pr#2313@Github) * ### 🐞Bug修复 * 【core 】 MapUtil.map对null友好,且修复了测试用例中分组问题(pr#614@Gitee) diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java index 3a80610da7..a764a6c4e0 100755 --- a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java @@ -1058,7 +1058,7 @@ public class CollUtil { * @param 集合元素类型 * @param 唯一键类型 * @param collection 集合 - * @param override 是否覆盖模式,如果为{@code true},加入的新值会覆盖相同key的旧值,否则会忽略新加值 + * @param override 是否覆盖模式,如果为{@code true},加入的新值会覆盖相同key的旧值,否则会忽略新加值 * @return {@link ArrayList} * @since 5.8.0 */ @@ -3056,94 +3056,4 @@ public class CollUtil { return IterUtil.isEqualList(list1, list2); } - - /** - * 泛型集合向上转型。例如将Collection<Integer>转换为Collection<Number> - * @param collection 集合 - * @param 泛型 - * @return 泛化集合 - */ - @SuppressWarnings("unchecked") - public static Collection castup(Collection collection){ - return (Collection) collection; - } - - /** - * 泛型集合向下转型。例如将Collection<Number>转换为Collection<Integer> - * @param collection - * @param - * @return - */ - @SuppressWarnings("unchecked") - public static Collection castdown(Collection collection){ - return (Collection) collection; - } - - /** - * 泛型集合向上转型。例如将Set<Integer>转换为Set<Number> - * @param set 集合 - * @param 泛型 - * @return 泛化集合 - */ - @SuppressWarnings("unchecked") - public static Set castup(Set set){ - return (Set) set; - } - - /** - * 泛型集合向下转型。例如将Set<Number>转换为Set<Integer> - * @param set 集合 - * @param 泛型子类 - * @return 泛化集合 - */ - @SuppressWarnings("unchecked") - public static Set castdown(Set set){ - return (Set) set; - } - - /** - * 泛型集合向下转型。例如将Map<Integer, Integer>转换为Map<Number,Number> - * @param map 集合 - * @param 泛型父类 - * @param 泛型父类 - * @return 泛化集合 - */ - @SuppressWarnings("unchecked") - public static Map castup(Map map){ - return (Map) map; - } - - /** - * 泛型集合向下转型。例如将Map<Number,Number>转换为Map<Integer, Integer> - * @param map 集合 - * @param 泛型子类 - * @param 泛型子类 - * @return 泛化集合 - */ - @SuppressWarnings("unchecked") - public static Map castdown(Map map){ - return (Map) map; - } - - /** - * 泛型接口向上转型。例如将List<Integer>转换为List<Number> - * @param list 集合 - * @param 泛型的父类 - * @return 泛化集合 - */ - @SuppressWarnings("unchecked") - public static List castup(List list){ - return (List) list; - } - - /** - * 泛型集合向下转型。例如将List<Number>转换为List<Integer> - * @param list 集合 - * @param 泛型的子类 - * @return 泛化集合 - */ - @SuppressWarnings("unchecked") - public static List castdown(List list){ - return (List) list; - } } diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/CastUtil.java b/hutool-core/src/main/java/cn/hutool/core/convert/CastUtil.java new file mode 100644 index 0000000000..5279bb7e55 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/convert/CastUtil.java @@ -0,0 +1,118 @@ +package cn.hutool.core.convert; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * 转换工具类,提供集合、Map等向上向下转换工具 + * + * @author looly + * @since 5.8.1 + */ +public class CastUtil { + /** + * 泛型集合向上转型。例如将Collection<Integer>转换为Collection<Number> + * + * @param collection 集合 + * @param 元素类型 + * @return 转换后的集合 + * @since 5.8.1 + */ + @SuppressWarnings("unchecked") + public static Collection castUp(Collection collection) { + return (Collection) collection; + } + + /** + * 泛型集合向下转型。例如将Collection<Number>转换为Collection<Integer> + * + * @param collection 集合 + * @param 元素类型 + * @return 转换后的集合 + * @since 5.8.1 + */ + @SuppressWarnings("unchecked") + public static Collection castDown(Collection collection) { + return (Collection) collection; + } + + /** + * 泛型集合向上转型。例如将Set<Integer>转换为Set<Number> + * + * @param set 集合 + * @param 泛型 + * @return 泛化集合 + * @since 5.8.1 + */ + @SuppressWarnings("unchecked") + public static Set castUp(Set set) { + return (Set) set; + } + + /** + * 泛型集合向下转型。例如将Set<Number>转换为Set<Integer> + * + * @param set 集合 + * @param 泛型子类 + * @return 泛化集合 + * @since 5.8.1 + */ + @SuppressWarnings("unchecked") + public static Set castDown(Set set) { + return (Set) set; + } + + /** + * 泛型接口向上转型。例如将List<Integer>转换为List<Number> + * + * @param list 集合 + * @param 泛型的父类 + * @return 泛化集合 + */ + @SuppressWarnings("unchecked") + public static List castUp(List list) { + return (List) list; + } + + /** + * 泛型集合向下转型。例如将List<Number>转换为List<Integer> + * + * @param list 集合 + * @param 泛型的子类 + * @return 泛化集合 + */ + @SuppressWarnings("unchecked") + public static List castDown(List list) { + return (List) list; + } + + /** + * 泛型集合向下转型。例如将Map<Integer, Integer>转换为Map<Number,Number> + * + * @param map 集合 + * @param 泛型父类 + * @param 泛型父类 + * @return 泛化集合 + * @since 5.8.1 + */ + @SuppressWarnings("unchecked") + public static Map castUp(Map map) { + return (Map) map; + } + + /** + * 泛型集合向下转型。例如将Map<Number,Number>转换为Map<Integer, Integer> + * + * @param map 集合 + * @param 泛型子类 + * @param 泛型子类 + * @return 泛化集合 + * @since 5.8.1 + */ + @SuppressWarnings("unchecked") + public static Map castDown(Map map) { + return (Map) map; + } +} diff --git a/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java index 50d32c86a0..512b13e2d2 100755 --- a/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java @@ -10,7 +10,6 @@ import lombok.Data; import org.junit.Assert; import org.junit.Test; -import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -909,36 +908,6 @@ public class CollUtilTest { Assert.assertEquals("bb", distinct.get(1).getName()); } - @Test - public void testCastToSuper() { - Collection collection=CollUtil.newLinkedList(1,2,3); - List list = CollUtil.newArrayList(1, 2, 3); - Set set = CollUtil.newHashSet(1, 2, 3); - Map map = new HashMap<>(); - map.put(1, 1); - - Collection collection2 = CollUtil.castup(collection); - Assert.assertSame(collection, collection2); - - Collection collection3 = CollUtil.castdown(collection2); - Assert.assertSame(collection2, collection3); - - List list2 = CollUtil.castup(list); - Assert.assertSame(list, list2); - List list3 = CollUtil.castdown(list2); - Assert.assertSame(list2, list3); - - Set set2 = CollUtil.castup(set); - Assert.assertSame(set, set2); - Set set3 = CollUtil.castdown(set2); - Assert.assertSame(set2, set3); - - Map map2 = CollUtil.castup(map); - Assert.assertSame(map, map2); - Map map3 = CollUtil.castdown(map2); - Assert.assertSame(map2, map3); - } - @Data @AllArgsConstructor static class Person { diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/CastUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/CastUtilTest.java new file mode 100644 index 0000000000..16e9e01ee4 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/convert/CastUtilTest.java @@ -0,0 +1,45 @@ +package cn.hutool.core.convert; + +import cn.hutool.core.collection.CollUtil; +import org.junit.Assert; +import org.junit.Test; + +import java.io.Serializable; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class CastUtilTest { + + @Test + public void testCastToSuper() { + Collection collection= CollUtil.newLinkedList(1,2,3); + List list = CollUtil.newArrayList(1, 2, 3); + Set set = CollUtil.newHashSet(1, 2, 3); + Map map = new HashMap<>(); + map.put(1, 1); + + Collection collection2 = CastUtil.castUp(collection); + Assert.assertSame(collection, collection2); + + Collection collection3 = CastUtil.castDown(collection2); + Assert.assertSame(collection2, collection3); + + List list2 = CastUtil.castUp(list); + Assert.assertSame(list, list2); + List list3 = CastUtil.castDown(list2); + Assert.assertSame(list2, list3); + + Set set2 = CastUtil.castUp(set); + Assert.assertSame(set, set2); + Set set3 = CastUtil.castDown(set2); + Assert.assertSame(set2, set3); + + Map map2 = CastUtil.castUp(map); + Assert.assertSame(map, map2); + Map map3 = CastUtil.castDown(map2); + Assert.assertSame(map2, map3); + } +} -- Gitee From 5d4e18a63b14515b445d01b4730a6805eb520d61 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 16 May 2022 10:03:16 +0800 Subject: [PATCH 0032/1737] add methods --- CHANGELOG.md | 3 ++- .../java/cn/hutool/core/util/ByteUtil.java | 19 ++++++++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42bf8f9639..367f3f2369 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,13 +3,14 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.1.M1 (2022-05-12) +# 5.8.1.M1 (2022-05-16) ### 🐣新特性 * 【core 】 BooleanUtil增加toBooleanObject方法(issue#I56AG3@Gitee) * 【core 】 CharSequenceUtil增加startWithAnyIgnoreCase方法(issue#2312@Github) * 【system 】 JavaInfo增加版本(issue#2310@Github) * 【core 】 新增CastUtil(pr#2313@Github) +* 【core 】 ByteUtil新增bytesToShort重载(issue#I57FA7@Gitee) * ### 🐞Bug修复 * 【core 】 MapUtil.map对null友好,且修复了测试用例中分组问题(pr#614@Gitee) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ByteUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ByteUtil.java index bd1053995e..47c50199f7 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ByteUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ByteUtil.java @@ -74,12 +74,25 @@ public class ByteUtil { * @param byteOrder 端序 * @return short值 */ - public static short bytesToShort(byte[] bytes, ByteOrder byteOrder) { + public static short bytesToShort(final byte[] bytes, final ByteOrder byteOrder) { + return bytesToShort(bytes, 0, byteOrder); + } + + /** + * byte数组转short
+ * 自定义端序 + * + * @param bytes byte数组,长度必须大于2 + * @param start 开始位置 + * @param byteOrder 端序 + * @return short值 + */ + public static short bytesToShort(final byte[] bytes, final int start, final ByteOrder byteOrder) { if (ByteOrder.LITTLE_ENDIAN == byteOrder) { //小端模式,数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中 - return (short) (bytes[0] & 0xff | (bytes[1] & 0xff) << Byte.SIZE); + return (short) (bytes[start] & 0xff | (bytes[start + 1] & 0xff) << Byte.SIZE); } else { - return (short) (bytes[1] & 0xff | (bytes[0] & 0xff) << Byte.SIZE); + return (short) (bytes[start + 1] & 0xff | (bytes[start] & 0xff) << Byte.SIZE); } } -- Gitee From 7ceab0dc3cd0d91874c050d0f8211bdf1fa1e69f Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 16 May 2022 10:21:33 +0800 Subject: [PATCH 0033/1737] add InvocationTargetRuntimeException --- CHANGELOG.md | 1 + .../InvocationTargetRuntimeException.java | 34 +++++++++++++ .../java/cn/hutool/core/util/ReflectUtil.java | 50 +++++++++++++++---- 3 files changed, 75 insertions(+), 10 deletions(-) create mode 100644 hutool-core/src/main/java/cn/hutool/core/exceptions/InvocationTargetRuntimeException.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 367f3f2369..d3f82a83d5 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ * 【system 】 JavaInfo增加版本(issue#2310@Github) * 【core 】 新增CastUtil(pr#2313@Github) * 【core 】 ByteUtil新增bytesToShort重载(issue#I57FA7@Gitee) +* 【core 】 ReflectUtil.invoke方法抛出运行时异常增加InvocationTargetRuntimeException(issue#I57GI2@Gitee) * ### 🐞Bug修复 * 【core 】 MapUtil.map对null友好,且修复了测试用例中分组问题(pr#614@Gitee) diff --git a/hutool-core/src/main/java/cn/hutool/core/exceptions/InvocationTargetRuntimeException.java b/hutool-core/src/main/java/cn/hutool/core/exceptions/InvocationTargetRuntimeException.java new file mode 100644 index 0000000000..b6444bd54d --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/exceptions/InvocationTargetRuntimeException.java @@ -0,0 +1,34 @@ +package cn.hutool.core.exceptions; + +/** + * InvocationTargetException的运行时异常 + * + * @author looly + * @since 5.8.1 + */ +public class InvocationTargetRuntimeException extends UtilException { + + public InvocationTargetRuntimeException(Throwable e) { + super(e); + } + + public InvocationTargetRuntimeException(String message) { + super(message); + } + + public InvocationTargetRuntimeException(String messageTemplate, Object... params) { + super(messageTemplate, params); + } + + public InvocationTargetRuntimeException(String message, Throwable throwable) { + super(message, throwable); + } + + public InvocationTargetRuntimeException(String message, Throwable throwable, boolean enableSuppression, boolean writableStackTrace) { + super(message, throwable, enableSuppression, writableStackTrace); + } + + public InvocationTargetRuntimeException(Throwable throwable, String messageTemplate, Object... params) { + super(throwable, messageTemplate, params); + } +} diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java index 39d94196e8..7a4c741d4d 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java @@ -5,6 +5,7 @@ import cn.hutool.core.bean.NullWrapperBean; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.UniqueKeySet; import cn.hutool.core.convert.Convert; +import cn.hutool.core.exceptions.InvocationTargetRuntimeException; import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Filter; @@ -16,6 +17,7 @@ import java.lang.reflect.AccessibleObject; import java.lang.reflect.Array; import java.lang.reflect.Constructor; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.AbstractMap; import java.util.ArrayList; @@ -864,7 +866,7 @@ public class ReflectUtil { * Set -》 HashSet * * - * @param 对象类型 + * @param 对象类型 * @param type 被构造的类 * @return 构造后的对象,构造失败返回{@code null} */ @@ -873,7 +875,7 @@ public class ReflectUtil { Assert.notNull(type); // 原始类型 - if(type.isPrimitive()){ + if (type.isPrimitive()) { return (T) ClassUtil.getPrimitiveDefaultValue(type); } @@ -985,10 +987,42 @@ public class ReflectUtil { * @param method 方法(对象方法或static方法都可) * @param args 参数对象 * @return 结果 - * @throws UtilException 一些列异常的包装 + * @throws InvocationTargetRuntimeException 目标方法执行异常 + * @throws UtilException {@link IllegalAccessException}异常的包装 + */ + public static T invoke(Object obj, Method method, Object... args) throws InvocationTargetRuntimeException, UtilException { + try { + return invokeRaw(obj, method, args); + } catch (InvocationTargetException e) { + throw new InvocationTargetRuntimeException(e); + } catch (IllegalAccessException e) { + throw new UtilException(e); + } + } + + /** + * 执行方法 + * + *

+ * 对于用户传入参数会做必要检查,包括: + * + *

+	 *     1、忽略多余的参数
+	 *     2、参数不够补齐默认值
+	 *     3、传入参数为null,但是目标参数类型为原始类型,做转换
+	 * 
+ * + * @param 返回对象类型 + * @param obj 对象,如果执行静态方法,此值为{@code null} + * @param method 方法(对象方法或static方法都可) + * @param args 参数对象 + * @return 结果 + * @throws InvocationTargetRuntimeException 目标方法执行异常 + * @throws UtilException {@link IllegalAccessException}异常的包装 + * @since 5.8.1 */ @SuppressWarnings("unchecked") - public static T invoke(Object obj, Method method, Object... args) throws UtilException { + public static T invokeRaw(Object obj, Method method, Object... args) throws InvocationTargetException, IllegalAccessException { setAccessible(method); // 检查用户传入参数: @@ -1025,11 +1059,7 @@ public class ReflectUtil { return MethodHandleUtil.invokeSpecial(obj, method, args); } - try { - return (T) method.invoke(ClassUtil.isStatic(method) ? null : obj, actualArgs); - } catch (Exception e) { - throw new UtilException(e); - } + return (T) method.invoke(ClassUtil.isStatic(method) ? null : obj, actualArgs); } /** @@ -1041,7 +1071,7 @@ public class ReflectUtil { * @param methodName 方法名 * @param args 参数列表 * @return 执行结果 - * @throws UtilException IllegalAccessException包装 + * @throws UtilException IllegalAccessException等异常包装 * @see NullWrapperBean * @since 3.1.2 */ -- Gitee From 844113c583543511885f2da2c488fc7e1a1f38af Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 16 May 2022 10:23:37 +0800 Subject: [PATCH 0034/1737] fix comment --- hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java index 90114dc825..5b9b9f3d22 100755 --- a/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java @@ -1097,7 +1097,7 @@ public class FileUtil extends PathUtil { * 情况如下: * *
-	 * 1、src和dest都为目录,则讲src下所有文件目录拷贝到dest下
+	 * 1、src和dest都为目录,则将src下所有文件目录拷贝到dest下
 	 * 2、src和dest都为文件,直接复制,名字为dest
 	 * 3、src为文件,dest为目录,将src拷贝到dest目录下
 	 * 
@@ -1117,7 +1117,7 @@ public class FileUtil extends PathUtil { * 情况如下: * *
-	 * 1、src和dest都为目录,则讲src下所有文件(包括子目录)拷贝到dest下
+	 * 1、src和dest都为目录,则将src下所有文件(包括子目录)拷贝到dest下
 	 * 2、src和dest都为文件,直接复制,名字为dest
 	 * 3、src为文件,dest为目录,将src拷贝到dest目录下
 	 * 
-- Gitee From 3115f0dad84ef8ffde1116af8524557aa273431b Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 16 May 2022 18:43:48 +0800 Subject: [PATCH 0035/1737] fix jwt bug --- CHANGELOG.md | 1 + .../main/java/cn/hutool/jwt/JWTValidator.java | 8 ++++++-- .../java/cn/hutool/jwt/JWTValidatorTest.java | 18 ++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d3f82a83d5..d4f70dee85 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ * 【db 】 DialectName中修正为POSTGRESQL(issue#2308@Github) * 【core 】 修复BeanPath无法识别引号内的内容问题(issue#I56DE0@Gitee) * 【core 】 修复Map.entry方法返回可变不可变相反问题 +* 【jwt 】 修复jwt的过期容忍时间问题(issue#2329@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-jwt/src/main/java/cn/hutool/jwt/JWTValidator.java b/hutool-jwt/src/main/java/cn/hutool/jwt/JWTValidator.java index 77f7c25918..fc5d97210d 100755 --- a/hutool-jwt/src/main/java/cn/hutool/jwt/JWTValidator.java +++ b/hutool-jwt/src/main/java/cn/hutool/jwt/JWTValidator.java @@ -222,7 +222,9 @@ public class JWTValidator { if (null == dateToCheck) { return; } - now.setTime(now.getTime() + leeway * 1000); + if(leeway > 0){ + now = DateUtil.date(now.getTime() + leeway * 1000); + } if (dateToCheck.after(now)) { throw new ValidateException("'{}':[{}] is after now:[{}]", fieldName, DateUtil.date(dateToCheck), DateUtil.date(now)); @@ -244,7 +246,9 @@ public class JWTValidator { if (null == dateToCheck) { return; } - now.setTime(now.getTime() - leeway * 1000); + if(leeway > 0){ + now = DateUtil.date(now.getTime() - leeway * 1000); + } if (dateToCheck.before(now)) { throw new ValidateException("'{}':[{}] is before now:[{}]", fieldName, DateUtil.date(dateToCheck), DateUtil.date(now)); diff --git a/hutool-jwt/src/test/java/cn/hutool/jwt/JWTValidatorTest.java b/hutool-jwt/src/test/java/cn/hutool/jwt/JWTValidatorTest.java index b3df4faff6..15365eeafc 100755 --- a/hutool-jwt/src/test/java/cn/hutool/jwt/JWTValidatorTest.java +++ b/hutool-jwt/src/test/java/cn/hutool/jwt/JWTValidatorTest.java @@ -6,6 +6,8 @@ import cn.hutool.jwt.signers.JWTSignerUtil; import org.junit.Assert; import org.junit.Test; +import java.util.Date; + public class JWTValidatorTest { @Test(expected = ValidateException.class) @@ -79,4 +81,20 @@ public class JWTValidatorTest { JWTValidator.of(jwt).validateDate(DateUtil.date()); } + + @Test + public void issue2329Test(){ + final long NOW = System.currentTimeMillis(); + final Date NOW_TIME = new Date(NOW); + final long EXPIRED = 3 * 1000L; + final Date EXPIRED_TIME = new Date(NOW + EXPIRED); + + // 使用这种方式生成token + final String token = JWT.create().setPayload("sub", "blue-light").setIssuedAt(NOW_TIME).setNotBefore(EXPIRED_TIME) + .setExpiresAt(EXPIRED_TIME).setKey("123456".getBytes()).sign(); + + // 使用这种方式验证token + JWTValidator.of(JWT.of(token)).validateDate(DateUtil.date(NOW - 4000), 10); + JWTValidator.of(JWT.of(token)).validateDate(DateUtil.date(NOW + 4000), 10); + } } -- Gitee From 0eb5c84ba808840acfdbdca7a87aa1a44fea15b9 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 16 May 2022 19:00:13 +0800 Subject: [PATCH 0036/1737] add hex support --- CHANGELOG.md | 3 ++- .../src/main/java/cn/hutool/core/util/NumberUtil.java | 5 +++++ .../src/test/java/cn/hutool/core/util/NumberUtilTest.java | 7 +++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d4f70dee85..82628bad38 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.1.M1 (2022-05-16) +# 5.8.1 (2022-05-16) ### 🐣新特性 * 【core 】 BooleanUtil增加toBooleanObject方法(issue#I56AG3@Gitee) @@ -12,6 +12,7 @@ * 【core 】 新增CastUtil(pr#2313@Github) * 【core 】 ByteUtil新增bytesToShort重载(issue#I57FA7@Gitee) * 【core 】 ReflectUtil.invoke方法抛出运行时异常增加InvocationTargetRuntimeException(issue#I57GI2@Gitee) +* 【core 】 NumberUtil.parseNumber支持16进制(issue#2328@Github) * ### 🐞Bug修复 * 【core 】 MapUtil.map对null友好,且修复了测试用例中分组问题(pr#614@Gitee) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java index 3deccb27a8..5b40c361ff 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java @@ -2524,6 +2524,11 @@ public class NumberUtil { * @since 4.1.15 */ public static Number parseNumber(String numberStr) throws NumberFormatException { + if(StrUtil.startWithIgnoreCase(numberStr, "0x")){ + // 0x04表示16进制数 + return Long.parseLong(numberStr.substring(2), 16); + } + try { final NumberFormat format = NumberFormat.getInstance(); if (format instanceof DecimalFormat) { diff --git a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java index 489a3faf83..f3a8e4859d 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java @@ -292,6 +292,13 @@ public class NumberUtilTest { Assert.assertEquals(1482L, v2.longValue()); } + @Test + public void parseHexNumberTest() { + // 千位分隔符去掉 + final int v1 = NumberUtil.parseNumber("0xff").intValue(); + Assert.assertEquals(255, v1); + } + @Test public void parseLongTest() { long number = NumberUtil.parseLong("0xFF"); -- Gitee From 38bc1b1f0e971db805679d8fbb978313310c6d8a Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 16 May 2022 19:04:36 +0800 Subject: [PATCH 0037/1737] release 5.8.1 --- README-EN.md | 6 +++--- README.md | 6 +++--- bin/version.txt | 2 +- docs/js/version.js | 2 +- hutool-all/pom.xml | 2 +- hutool-aop/pom.xml | 4 ++-- hutool-bloomFilter/pom.xml | 2 +- hutool-bom/pom.xml | 2 +- hutool-cache/pom.xml | 2 +- hutool-captcha/pom.xml | 2 +- hutool-core/pom.xml | 2 +- hutool-cron/pom.xml | 2 +- hutool-crypto/pom.xml | 2 +- hutool-db/pom.xml | 4 ++-- hutool-dfa/pom.xml | 2 +- hutool-extra/pom.xml | 2 +- hutool-http/pom.xml | 2 +- hutool-json/pom.xml | 2 +- hutool-jwt/pom.xml | 2 +- hutool-log/pom.xml | 3 ++- hutool-poi/pom.xml | 4 ++-- hutool-script/pom.xml | 2 +- hutool-setting/pom.xml | 2 +- hutool-socket/pom.xml | 2 +- hutool-system/pom.xml | 2 +- pom.xml | 2 +- 26 files changed, 34 insertions(+), 33 deletions(-) diff --git a/README-EN.md b/README-EN.md index 5c2a862d37..8759c4f230 100755 --- a/README-EN.md +++ b/README-EN.md @@ -144,18 +144,18 @@ We provide the T-Shirt and Sweater with Hutool Logo, please visit the shop: cn.hutool hutool-all - 5.8.1.M1 + 5.8.1 ``` ### 🍐Gradle ``` -implementation 'cn.hutool:hutool-all:5.8.1.M1' +implementation 'cn.hutool:hutool-all:5.8.1' ``` ## 📥Download -- [Maven Repo](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.1.M1/) +- [Maven Repo](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.1/) > 🔔️note: > Hutool 5.x supports JDK8+ and is not tested on Android platforms, and cannot guarantee that all tool classes or tool methods are available. diff --git a/README.md b/README.md index ed040204af..278a93ea99 100755 --- a/README.md +++ b/README.md @@ -144,20 +144,20 @@ Hutool的存在就是为了减少代码搜索成本,避免网络上参差不 cn.hutool hutool-all - 5.8.1.M1 + 5.8.1 ``` ### 🍐Gradle ``` -implementation 'cn.hutool:hutool-all:5.8.1.M1' +implementation 'cn.hutool:hutool-all:5.8.1' ``` ### 📥下载jar 点击以下链接,下载`hutool-all-X.X.X.jar`即可: -- [Maven中央库](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.1.M1/) +- [Maven中央库](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.1/) > 🔔️注意 > Hutool 5.x支持JDK8+,对Android平台没有测试,不能保证所有工具类或工具方法可用。 diff --git a/bin/version.txt b/bin/version.txt index 38b773a107..1802e771b4 100755 --- a/bin/version.txt +++ b/bin/version.txt @@ -1 +1 @@ -5.8.1.M1 +5.8.1 diff --git a/docs/js/version.js b/docs/js/version.js index 723b860227..5b86fe85e7 100755 --- a/docs/js/version.js +++ b/docs/js/version.js @@ -1 +1 @@ -var version = '5.8.1.M1' \ No newline at end of file +var version = '5.8.1' \ No newline at end of file diff --git a/hutool-all/pom.xml b/hutool-all/pom.xml index 744eeb0b24..26270b92e1 100755 --- a/hutool-all/pom.xml +++ b/hutool-all/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1.M1 + 5.8.1 hutool-all diff --git a/hutool-aop/pom.xml b/hutool-aop/pom.xml index 4c244eec2e..9cd1c6eae2 100755 --- a/hutool-aop/pom.xml +++ b/hutool-aop/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1.M1 + 5.8.1 hutool-aop @@ -19,7 +19,7 @@ 3.3.0 - 5.3.19 + 5.3.20 diff --git a/hutool-bloomFilter/pom.xml b/hutool-bloomFilter/pom.xml index 0d0f25a295..943172ef9a 100755 --- a/hutool-bloomFilter/pom.xml +++ b/hutool-bloomFilter/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1.M1 + 5.8.1 hutool-bloomFilter diff --git a/hutool-bom/pom.xml b/hutool-bom/pom.xml index 8f825bbec5..c74f0be10c 100755 --- a/hutool-bom/pom.xml +++ b/hutool-bom/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1.M1 + 5.8.1 hutool-bom diff --git a/hutool-cache/pom.xml b/hutool-cache/pom.xml index 7c9806b566..ab99b74047 100755 --- a/hutool-cache/pom.xml +++ b/hutool-cache/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1.M1 + 5.8.1 hutool-cache diff --git a/hutool-captcha/pom.xml b/hutool-captcha/pom.xml index 3ebfa21ad0..c3d6548dd5 100755 --- a/hutool-captcha/pom.xml +++ b/hutool-captcha/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1.M1 + 5.8.1 hutool-captcha diff --git a/hutool-core/pom.xml b/hutool-core/pom.xml index 51178aa0e7..5e08bcce00 100755 --- a/hutool-core/pom.xml +++ b/hutool-core/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1.M1 + 5.8.1 hutool-core diff --git a/hutool-cron/pom.xml b/hutool-cron/pom.xml index 47653c0035..02d3d1493c 100755 --- a/hutool-cron/pom.xml +++ b/hutool-cron/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1.M1 + 5.8.1 hutool-cron diff --git a/hutool-crypto/pom.xml b/hutool-crypto/pom.xml index 64ac5fec10..5723a93b57 100755 --- a/hutool-crypto/pom.xml +++ b/hutool-crypto/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1.M1 + 5.8.1 hutool-crypto diff --git a/hutool-db/pom.xml b/hutool-db/pom.xml index 268ca07855..44776cba6d 100755 --- a/hutool-db/pom.xml +++ b/hutool-db/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1.M1 + 5.8.1 hutool-db @@ -81,7 +81,7 @@ com.github.chris2018998 beecp - 3.3.5 + 3.3.6 slf4j-api diff --git a/hutool-dfa/pom.xml b/hutool-dfa/pom.xml index cb52e6f693..7fb33051d0 100755 --- a/hutool-dfa/pom.xml +++ b/hutool-dfa/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1.M1 + 5.8.1 hutool-dfa diff --git a/hutool-extra/pom.xml b/hutool-extra/pom.xml index ce4eafc7cd..f8f9315ecc 100755 --- a/hutool-extra/pom.xml +++ b/hutool-extra/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1.M1 + 5.8.1 hutool-extra diff --git a/hutool-http/pom.xml b/hutool-http/pom.xml index 435235ccb2..6a9c1b0459 100755 --- a/hutool-http/pom.xml +++ b/hutool-http/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1.M1 + 5.8.1 hutool-http diff --git a/hutool-json/pom.xml b/hutool-json/pom.xml index 311bcd5fc3..a87d5ac09c 100755 --- a/hutool-json/pom.xml +++ b/hutool-json/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1.M1 + 5.8.1 hutool-json diff --git a/hutool-jwt/pom.xml b/hutool-jwt/pom.xml index 09c2f78f15..dbf7ca3f91 100755 --- a/hutool-jwt/pom.xml +++ b/hutool-jwt/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1.M1 + 5.8.1 hutool-jwt diff --git a/hutool-log/pom.xml b/hutool-log/pom.xml index b9deb7f2ec..48dbfc3449 100755 --- a/hutool-log/pom.xml +++ b/hutool-log/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1.M1 + 5.8.1 hutool-log @@ -24,6 +24,7 @@ 2.17.2 1.2 1.3.6 + 3.4.3.Final 0.43.2 diff --git a/hutool-poi/pom.xml b/hutool-poi/pom.xml index d0d9a1cf60..2940278bb2 100755 --- a/hutool-poi/pom.xml +++ b/hutool-poi/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1.M1 + 5.8.1 hutool-poi @@ -45,7 +45,7 @@ org.ofdrw ofdrw-full - 1.17.14 + 1.17.15 compile true diff --git a/hutool-script/pom.xml b/hutool-script/pom.xml index aff0777aeb..d01af54208 100755 --- a/hutool-script/pom.xml +++ b/hutool-script/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1.M1 + 5.8.1 hutool-script diff --git a/hutool-setting/pom.xml b/hutool-setting/pom.xml index 3489996bdf..655a3a1e8c 100755 --- a/hutool-setting/pom.xml +++ b/hutool-setting/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1.M1 + 5.8.1 hutool-setting diff --git a/hutool-socket/pom.xml b/hutool-socket/pom.xml index 8a028706ad..b700c75a48 100755 --- a/hutool-socket/pom.xml +++ b/hutool-socket/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1.M1 + 5.8.1 hutool-socket diff --git a/hutool-system/pom.xml b/hutool-system/pom.xml index 3c8cd92ad8..cea4cd544a 100755 --- a/hutool-system/pom.xml +++ b/hutool-system/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1.M1 + 5.8.1 hutool-system diff --git a/pom.xml b/pom.xml index a5fb0ed4f6..ba4a3b4323 100755 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ cn.hutool hutool-parent - 5.8.1.M1 + 5.8.1 hutool Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。 https://github.com/dromara/hutool -- Gitee From 4ed32622cb071e155661df1f339fc34f186ab214 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 16 May 2022 19:20:58 +0800 Subject: [PATCH 0038/1737] prepare 5.8.2 --- CHANGELOG.md | 7 +++++++ README-EN.md | 6 +++--- README.md | 6 +++--- bin/version.txt | 2 +- docs/js/version.js | 2 +- hutool-all/pom.xml | 2 +- hutool-aop/pom.xml | 2 +- hutool-bloomFilter/pom.xml | 2 +- hutool-bom/pom.xml | 2 +- hutool-cache/pom.xml | 2 +- hutool-captcha/pom.xml | 2 +- hutool-core/pom.xml | 2 +- hutool-cron/pom.xml | 2 +- hutool-crypto/pom.xml | 2 +- hutool-db/pom.xml | 2 +- hutool-dfa/pom.xml | 2 +- hutool-extra/pom.xml | 2 +- hutool-http/pom.xml | 2 +- hutool-json/pom.xml | 2 +- hutool-jwt/pom.xml | 2 +- hutool-log/pom.xml | 2 +- hutool-poi/pom.xml | 2 +- hutool-script/pom.xml | 2 +- hutool-setting/pom.xml | 2 +- hutool-socket/pom.xml | 2 +- hutool-system/pom.xml | 2 +- pom.xml | 2 +- 27 files changed, 37 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 82628bad38..d4452585de 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,13 @@ ------------------------------------------------------------------------------------------------------------- +# 5.8.2.M1 (2022-05-16) + +### 🐣新特性 +### 🐞Bug修复 + +------------------------------------------------------------------------------------------------------------- + # 5.8.1 (2022-05-16) ### 🐣新特性 diff --git a/README-EN.md b/README-EN.md index 8759c4f230..1132488cef 100755 --- a/README-EN.md +++ b/README-EN.md @@ -144,18 +144,18 @@ We provide the T-Shirt and Sweater with Hutool Logo, please visit the shop: cn.hutool hutool-all - 5.8.1 + 5.8.2.M1 ``` ### 🍐Gradle ``` -implementation 'cn.hutool:hutool-all:5.8.1' +implementation 'cn.hutool:hutool-all:5.8.2.M1' ``` ## 📥Download -- [Maven Repo](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.1/) +- [Maven Repo](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.2.M1/) > 🔔️note: > Hutool 5.x supports JDK8+ and is not tested on Android platforms, and cannot guarantee that all tool classes or tool methods are available. diff --git a/README.md b/README.md index 278a93ea99..26a08fe3f2 100755 --- a/README.md +++ b/README.md @@ -144,20 +144,20 @@ Hutool的存在就是为了减少代码搜索成本,避免网络上参差不 cn.hutool hutool-all - 5.8.1 + 5.8.2.M1 ``` ### 🍐Gradle ``` -implementation 'cn.hutool:hutool-all:5.8.1' +implementation 'cn.hutool:hutool-all:5.8.2.M1' ``` ### 📥下载jar 点击以下链接,下载`hutool-all-X.X.X.jar`即可: -- [Maven中央库](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.1/) +- [Maven中央库](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.2.M1/) > 🔔️注意 > Hutool 5.x支持JDK8+,对Android平台没有测试,不能保证所有工具类或工具方法可用。 diff --git a/bin/version.txt b/bin/version.txt index 1802e771b4..1c570b5912 100755 --- a/bin/version.txt +++ b/bin/version.txt @@ -1 +1 @@ -5.8.1 +5.8.2.M1 diff --git a/docs/js/version.js b/docs/js/version.js index 5b86fe85e7..00fc859f33 100755 --- a/docs/js/version.js +++ b/docs/js/version.js @@ -1 +1 @@ -var version = '5.8.1' \ No newline at end of file +var version = '5.8.2.M1' \ No newline at end of file diff --git a/hutool-all/pom.xml b/hutool-all/pom.xml index 26270b92e1..1b4c289369 100755 --- a/hutool-all/pom.xml +++ b/hutool-all/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1 + 5.8.2.M1 hutool-all diff --git a/hutool-aop/pom.xml b/hutool-aop/pom.xml index 9cd1c6eae2..c9707f65a5 100755 --- a/hutool-aop/pom.xml +++ b/hutool-aop/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1 + 5.8.2.M1 hutool-aop diff --git a/hutool-bloomFilter/pom.xml b/hutool-bloomFilter/pom.xml index 943172ef9a..1d75d8c089 100755 --- a/hutool-bloomFilter/pom.xml +++ b/hutool-bloomFilter/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1 + 5.8.2.M1 hutool-bloomFilter diff --git a/hutool-bom/pom.xml b/hutool-bom/pom.xml index c74f0be10c..523a9c5ef1 100755 --- a/hutool-bom/pom.xml +++ b/hutool-bom/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1 + 5.8.2.M1 hutool-bom diff --git a/hutool-cache/pom.xml b/hutool-cache/pom.xml index ab99b74047..b2a9a5993a 100755 --- a/hutool-cache/pom.xml +++ b/hutool-cache/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1 + 5.8.2.M1 hutool-cache diff --git a/hutool-captcha/pom.xml b/hutool-captcha/pom.xml index c3d6548dd5..da06ccb3dd 100755 --- a/hutool-captcha/pom.xml +++ b/hutool-captcha/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1 + 5.8.2.M1 hutool-captcha diff --git a/hutool-core/pom.xml b/hutool-core/pom.xml index 5e08bcce00..455dc2f1b7 100755 --- a/hutool-core/pom.xml +++ b/hutool-core/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1 + 5.8.2.M1 hutool-core diff --git a/hutool-cron/pom.xml b/hutool-cron/pom.xml index 02d3d1493c..9db2a9c8ab 100755 --- a/hutool-cron/pom.xml +++ b/hutool-cron/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1 + 5.8.2.M1 hutool-cron diff --git a/hutool-crypto/pom.xml b/hutool-crypto/pom.xml index 5723a93b57..2bd6f35c02 100755 --- a/hutool-crypto/pom.xml +++ b/hutool-crypto/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1 + 5.8.2.M1 hutool-crypto diff --git a/hutool-db/pom.xml b/hutool-db/pom.xml index 44776cba6d..b8f5947ed1 100755 --- a/hutool-db/pom.xml +++ b/hutool-db/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1 + 5.8.2.M1 hutool-db diff --git a/hutool-dfa/pom.xml b/hutool-dfa/pom.xml index 7fb33051d0..b607f025c1 100755 --- a/hutool-dfa/pom.xml +++ b/hutool-dfa/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1 + 5.8.2.M1 hutool-dfa diff --git a/hutool-extra/pom.xml b/hutool-extra/pom.xml index f8f9315ecc..2703c19be7 100755 --- a/hutool-extra/pom.xml +++ b/hutool-extra/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1 + 5.8.2.M1 hutool-extra diff --git a/hutool-http/pom.xml b/hutool-http/pom.xml index 6a9c1b0459..98c302ad3e 100755 --- a/hutool-http/pom.xml +++ b/hutool-http/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1 + 5.8.2.M1 hutool-http diff --git a/hutool-json/pom.xml b/hutool-json/pom.xml index a87d5ac09c..c92c80e158 100755 --- a/hutool-json/pom.xml +++ b/hutool-json/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1 + 5.8.2.M1 hutool-json diff --git a/hutool-jwt/pom.xml b/hutool-jwt/pom.xml index dbf7ca3f91..680fb62255 100755 --- a/hutool-jwt/pom.xml +++ b/hutool-jwt/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1 + 5.8.2.M1 hutool-jwt diff --git a/hutool-log/pom.xml b/hutool-log/pom.xml index 48dbfc3449..c71e248166 100755 --- a/hutool-log/pom.xml +++ b/hutool-log/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1 + 5.8.2.M1 hutool-log diff --git a/hutool-poi/pom.xml b/hutool-poi/pom.xml index 2940278bb2..e114db71e1 100755 --- a/hutool-poi/pom.xml +++ b/hutool-poi/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1 + 5.8.2.M1 hutool-poi diff --git a/hutool-script/pom.xml b/hutool-script/pom.xml index d01af54208..17d58f2f34 100755 --- a/hutool-script/pom.xml +++ b/hutool-script/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1 + 5.8.2.M1 hutool-script diff --git a/hutool-setting/pom.xml b/hutool-setting/pom.xml index 655a3a1e8c..924da45a02 100755 --- a/hutool-setting/pom.xml +++ b/hutool-setting/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1 + 5.8.2.M1 hutool-setting diff --git a/hutool-socket/pom.xml b/hutool-socket/pom.xml index b700c75a48..e47ea5bb4d 100755 --- a/hutool-socket/pom.xml +++ b/hutool-socket/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1 + 5.8.2.M1 hutool-socket diff --git a/hutool-system/pom.xml b/hutool-system/pom.xml index cea4cd544a..262f8f146f 100755 --- a/hutool-system/pom.xml +++ b/hutool-system/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.1 + 5.8.2.M1 hutool-system diff --git a/pom.xml b/pom.xml index ba4a3b4323..cdc6699017 100755 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ cn.hutool hutool-parent - 5.8.1 + 5.8.2.M1 hutool Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。 https://github.com/dromara/hutool -- Gitee From 9d563648b759b71b404567cfdf6d271ddc8fa6b4 Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 18 May 2022 10:24:00 +0800 Subject: [PATCH 0039/1737] fix bug --- CHANGELOG.md | 3 ++- hutool-extra/src/main/java/cn/hutool/extra/ssh/SshjSftp.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d4452585de..230c2ddc55 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,11 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.2.M1 (2022-05-16) +# 5.8.2.M1 (2022-05-18) ### 🐣新特性 ### 🐞Bug修复 +* 【extra 】 修复SshjSftp初始化未能代入端口配置问题(issue#2333@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ssh/SshjSftp.java b/hutool-extra/src/main/java/cn/hutool/extra/ssh/SshjSftp.java index d458420c16..7e59d90770 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/ssh/SshjSftp.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/ssh/SshjSftp.java @@ -102,7 +102,7 @@ public class SshjSftp extends AbstractFtp { this.ssh = new SSHClient(); ssh.addHostKeyVerifier(new PromiscuousVerifier()); try { - ssh.connect(ftpConfig.getHost()); + ssh.connect(ftpConfig.getHost(), ftpConfig.getPort()); ssh.authPassword(ftpConfig.getUser(), ftpConfig.getPassword()); ssh.setRemoteCharset(ftpConfig.getCharset()); this.sftp = ssh.newSFTPClient(); -- Gitee From 3f8699f7e940ba1689054966e0a7c09de9d079a7 Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 18 May 2022 10:33:21 +0800 Subject: [PATCH 0040/1737] fix bug --- CHANGELOG.md | 1 + .../java/cn/hutool/core/convert/NumberWordFormatter.java | 2 +- .../java/cn/hutool/core/convert/NumberWordFormatTest.java | 6 ++++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 230c2ddc55..8122799e0b 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ ### 🐣新特性 ### 🐞Bug修复 * 【extra 】 修复SshjSftp初始化未能代入端口配置问题(issue#2333@Github) +* 【core 】 修复Convert.numberToSimple转换问题(issue#2334@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/NumberWordFormatter.java b/hutool-core/src/main/java/cn/hutool/core/convert/NumberWordFormatter.java index 22c0d057b0..e835593e44 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/NumberWordFormatter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/NumberWordFormatter.java @@ -63,7 +63,7 @@ public class NumberWordFormatter { int index = -1; double res = value; while (res > 10 && (false == isTwo || index < 1)) { - if (res > 1000) { + if (res >= 1000) { res = res / 1000; index++; } diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/NumberWordFormatTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/NumberWordFormatTest.java index 629205404a..802d621c4f 100644 --- a/hutool-core/src/test/java/cn/hutool/core/convert/NumberWordFormatTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/convert/NumberWordFormatTest.java @@ -31,4 +31,10 @@ public class NumberWordFormatTest { String format5 = NumberWordFormatter.formatSimple(438); Assert.assertEquals("438", format5); } + + @Test + public void formatSimpleTest2(){ + final String s = NumberWordFormatter.formatSimple(1000); + Assert.assertEquals("1k", s); + } } -- Gitee From 3ebd7d9ce03bf10d3cdac02b0a7dcbd9795984c2 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 20 May 2022 12:07:27 +0800 Subject: [PATCH 0041/1737] fix bugs --- CHANGELOG.md | 5 ++++- .../src/main/java/cn/hutool/core/bean/BeanUtil.java | 6 ++++++ .../main/java/cn/hutool/core/bean/copier/BeanCopier.java | 3 +++ .../core/convert/impl/TemporalAccessorConverter.java | 6 ++++++ .../src/test/java/cn/hutool/core/bean/BeanUtilTest.java | 5 +++++ .../test/java/cn/hutool/core/convert/ConvertTest.java | 9 +++++++++ .../test/java/cn/hutool/core/util/NumberUtilTest.java | 5 ++++- 7 files changed, 37 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8122799e0b..f9b4ca8ed6 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,12 +3,15 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.2.M1 (2022-05-18) +# 5.8.2.M1 (2022-05-20) ### 🐣新特性 +* 【core 】 BeanUtil拷贝对象增加空检查(issue#I58CJ3@Gitee) ### 🐞Bug修复 * 【extra 】 修复SshjSftp初始化未能代入端口配置问题(issue#2333@Github) * 【core 】 修复Convert.numberToSimple转换问题(issue#2334@Github) +* 【core 】 修复TemporalAccessorConverter导致的转换问题(issue#2341@Github) +* 【core 】 修复TemporalAccessorConverter导致的转换问题(issue#2341@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java index 84dee2e015..401f1ee3e7 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java @@ -728,6 +728,9 @@ public class BeanUtil { * @return 目标对象 */ public static T copyProperties(Object source, Class tClass, String... ignoreProperties) { + if(null == source){ + return null; + } T target = ReflectUtil.newInstanceIfPossible(tClass); copyProperties(source, target, CopyOptions.create().setIgnoreProperties(ignoreProperties)); return target; @@ -765,6 +768,9 @@ public class BeanUtil { * @param copyOptions 拷贝选项,见 {@link CopyOptions} */ public static void copyProperties(Object source, Object target, CopyOptions copyOptions) { + if(null == source){ + return; + } BeanCopier.create(source, target, ObjectUtil.defaultIfNull(copyOptions, CopyOptions::create)).copy(); } diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanCopier.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanCopier.java index 8d3fd418f2..e7a5b47fe6 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanCopier.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanCopier.java @@ -1,5 +1,6 @@ package cn.hutool.core.bean.copier; +import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.copier.Copier; import java.io.Serializable; @@ -62,6 +63,8 @@ public class BeanCopier implements Copier, Serializable { * @param copyOptions 拷贝属性选项 */ public BeanCopier(Object source, T target, Type targetType, CopyOptions copyOptions) { + Assert.notNull(source, "Source bean must be not null!"); + Assert.notNull(target, "Target bean must be not null!"); Copier copier; if (source instanceof Map) { if (target instanceof Map) { diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/TemporalAccessorConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/TemporalAccessorConverter.java index 46c5384e81..367d679163 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/TemporalAccessorConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/TemporalAccessorConverter.java @@ -84,6 +84,12 @@ public class TemporalAccessorConverter extends AbstractConverter getTargetType() { + return (Class) this.targetType; + } + @Override protected TemporalAccessor convertInternal(Object value) { if (value instanceof Long) { diff --git a/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java index 60f602fe0f..06526b7f5e 100755 --- a/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java @@ -567,6 +567,11 @@ public class BeanUtilTest { Assert.assertNull(newFood.getCode()); } + @Test + public void copyNullTest() { + Assert.assertNull(BeanUtil.copyProperties(null, Food.class)); + } + @Test public void copyBeanPropertiesFilterTest() { Food info = new Food(); diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java index 18cd78b144..89ab9421f2 100755 --- a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java @@ -15,6 +15,8 @@ import org.junit.Test; import java.io.Serializable; import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; @@ -383,4 +385,11 @@ public class ConvertTest { float b = Convert.toFloat(a); Assert.assertEquals(a, b, 5); } + + @Test + public void localDateTimeToLocalDateTest(){ + final LocalDateTime localDateTime = LocalDateTime.now(); + final LocalDate convert = Convert.convert(LocalDate.class, localDateTime); + Assert.assertEquals(localDateTime.toLocalDate(), convert); + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java index f3a8e4859d..72551904f5 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java @@ -439,6 +439,9 @@ public class NumberUtilTest { Assert.assertFalse(NumberUtil.isEven(a[4])); } - + @Test + public void divIntegerTest(){ + Assert.assertEquals(1001013, NumberUtil.div(100101300, (Number) 100).intValue()); + } } -- Gitee From ca6514e0a3974c91aa8ca104035733fb0f88b696 Mon Sep 17 00:00:00 2001 From: hope-xu Date: Fri, 20 May 2022 17:15:24 +0800 Subject: [PATCH 0042/1737] =?UTF-8?q?=E6=B7=BB=E5=8A=A0bigdecimal=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/hutool/core/util/NumberUtil.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java index 5b40c361ff..6c989c4c41 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java @@ -2766,4 +2766,15 @@ public class NumberUtil { } } // ------------------------------------------------------------------------------------------- Private method end + + /** + * null转换为BigDecimal
+ * + * @param bigDecimal 被转换的值 + * @return BigDecimal + * @since 5.8.1 + */ + public static BigDecimal nullToZero(BigDecimal bigDecimal) { + return bigDecimal == null ? BigDecimal.ZERO : bigDecimal; + } } -- Gitee From a3559811b33b9a43a584811069fe38b1b8fd3103 Mon Sep 17 00:00:00 2001 From: hope-xu Date: Fri, 20 May 2022 17:16:40 +0800 Subject: [PATCH 0043/1737] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java index 6c989c4c41..31f7019a1d 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java @@ -2772,7 +2772,7 @@ public class NumberUtil { * * @param bigDecimal 被转换的值 * @return BigDecimal - * @since 5.8.1 + * @since 5.8.2 */ public static BigDecimal nullToZero(BigDecimal bigDecimal) { return bigDecimal == null ? BigDecimal.ZERO : bigDecimal; -- Gitee From f71311b6d375e005ea01217d8643f26bff56d685 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 20 May 2022 17:51:37 +0800 Subject: [PATCH 0044/1737] fix size --- CHANGELOG.md | 2 ++ hutool-db/src/main/java/cn/hutool/db/meta/Column.java | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9b4ca8ed6..900e1ab041 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ ### 🐣新特性 * 【core 】 BeanUtil拷贝对象增加空检查(issue#I58CJ3@Gitee) +* 【db 】 Column#size改为long +* ### 🐞Bug修复 * 【extra 】 修复SshjSftp初始化未能代入端口配置问题(issue#2333@Github) * 【core 】 修复Convert.numberToSimple转换问题(issue#2334@Github) diff --git a/hutool-db/src/main/java/cn/hutool/db/meta/Column.java b/hutool-db/src/main/java/cn/hutool/db/meta/Column.java index 362d20ee88..6a13bec352 100755 --- a/hutool-db/src/main/java/cn/hutool/db/meta/Column.java +++ b/hutool-db/src/main/java/cn/hutool/db/meta/Column.java @@ -37,7 +37,7 @@ public class Column implements Serializable, Cloneable { /** * 大小或数据长度 */ - private int size; + private long size; private Integer digit; /** * 是否为可空 @@ -118,7 +118,7 @@ public class Column implements Serializable, Cloneable { typeName = ReUtil.delLast("\\(\\d+\\)", typeName); this.typeName = typeName; - this.size = columnMetaRs.getInt("COLUMN_SIZE"); + this.size = columnMetaRs.getLong("COLUMN_SIZE"); this.isNullable = columnMetaRs.getBoolean("NULLABLE"); this.comment = columnMetaRs.getString("REMARKS"); this.columnDef = columnMetaRs.getString("COLUMN_DEF"); @@ -238,7 +238,7 @@ public class Column implements Serializable, Cloneable { * * @return 大小或数据长度 */ - public int getSize() { + public long getSize() { return size; } -- Gitee From 1689ea4260e67712fec3e5b9249f6cbb47b91740 Mon Sep 17 00:00:00 2001 From: hope-xu Date: Sun, 22 May 2022 11:30:55 +0800 Subject: [PATCH 0045/1737] =?UTF-8?q?ClassUtil=E5=A2=9E=E5=8A=A0=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E6=98=AF=E5=90=A6=E6=98=AF=E6=8E=A5=E5=8F=A3=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/util/ClassUtil.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ClassUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ClassUtil.java index e697fed49a..d20d481d44 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/ClassUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ClassUtil.java @@ -1110,4 +1110,24 @@ public class ClassUtil { } return location.getPath(); } + + /** + * 是否为抽象类或接口 + * + * @param clazz 类 + * @return 是否为抽象类或接口 + */ + public static boolean isAbstractOrInterface(Class clazz) { + return isAbstract(clazz) || isInterface(clazz); + } + + /** + * 是否为接口 + * + * @param clazz 类 + * @return 是否为接口 + */ + public static boolean isInterface(Class clazz) { + return clazz.isInterface(); + } } -- Gitee From 2953b27dbc7d7f3825bf0ca843569c3ec5532014 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 23 May 2022 10:43:28 +0800 Subject: [PATCH 0046/1737] add methods --- CHANGELOG.md | 3 ++- .../src/main/java/cn/hutool/core/util/ClassUtil.java | 2 ++ .../src/main/java/cn/hutool/core/util/NumberUtil.java | 11 ----------- 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 900e1ab041..1ad2352c1d 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,11 +3,12 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.2.M1 (2022-05-20) +# 5.8.2.M1 (2022-05-23) ### 🐣新特性 * 【core 】 BeanUtil拷贝对象增加空检查(issue#I58CJ3@Gitee) * 【db 】 Column#size改为long +* 【core 】 ClassUtil增加isInterface等方法(pr#623@Gitee) * ### 🐞Bug修复 * 【extra 】 修复SshjSftp初始化未能代入端口配置问题(issue#2333@Github) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ClassUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ClassUtil.java index d20d481d44..0d7479b5e8 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/ClassUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ClassUtil.java @@ -1116,6 +1116,7 @@ public class ClassUtil { * * @param clazz 类 * @return 是否为抽象类或接口 + * @since 5.8.2 */ public static boolean isAbstractOrInterface(Class clazz) { return isAbstract(clazz) || isInterface(clazz); @@ -1126,6 +1127,7 @@ public class ClassUtil { * * @param clazz 类 * @return 是否为接口 + * @since 5.8.2 */ public static boolean isInterface(Class clazz) { return clazz.isInterface(); diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java index 31f7019a1d..5b40c361ff 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java @@ -2766,15 +2766,4 @@ public class NumberUtil { } } // ------------------------------------------------------------------------------------------- Private method end - - /** - * null转换为BigDecimal
- * - * @param bigDecimal 被转换的值 - * @return BigDecimal - * @since 5.8.2 - */ - public static BigDecimal nullToZero(BigDecimal bigDecimal) { - return bigDecimal == null ? BigDecimal.ZERO : bigDecimal; - } } -- Gitee From 5698f1ecd412a974dc92710c9c420f750025ba56 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 23 May 2022 11:32:50 +0800 Subject: [PATCH 0047/1737] add ChannelUtil --- CHANGELOG.md | 1 + .../java/cn/hutool/socket/ChannelUtil.java | 62 +++++++++++++++++++ .../java/cn/hutool/socket/aio/AioClient.java | 27 +------- .../cn/hutool/socket/aio/AioClientTest.java | 16 +++-- 4 files changed, 77 insertions(+), 29 deletions(-) create mode 100644 hutool-socket/src/main/java/cn/hutool/socket/ChannelUtil.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ad2352c1d..640c82e128 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ * 【core 】 BeanUtil拷贝对象增加空检查(issue#I58CJ3@Gitee) * 【db 】 Column#size改为long * 【core 】 ClassUtil增加isInterface等方法(pr#623@Gitee) +* 【socket 】 增加ChannelUtil * ### 🐞Bug修复 * 【extra 】 修复SshjSftp初始化未能代入端口配置问题(issue#2333@Github) diff --git a/hutool-socket/src/main/java/cn/hutool/socket/ChannelUtil.java b/hutool-socket/src/main/java/cn/hutool/socket/ChannelUtil.java new file mode 100644 index 0000000000..cf105a629f --- /dev/null +++ b/hutool-socket/src/main/java/cn/hutool/socket/ChannelUtil.java @@ -0,0 +1,62 @@ +package cn.hutool.socket; + +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.thread.ThreadFactoryBuilder; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.channels.AsynchronousChannelGroup; +import java.nio.channels.AsynchronousSocketChannel; +import java.util.concurrent.ExecutionException; + +/** + * Channel相关封装 + * + * @author looly + * @since 5.8.2 + */ +public class ChannelUtil { + + /** + * 创建{@link AsynchronousChannelGroup} + * + * @param poolSize 线程池大小 + * @return {@link AsynchronousChannelGroup} + */ + public static AsynchronousChannelGroup createFixedGroup(int poolSize) { + + try { + return AsynchronousChannelGroup.withFixedThreadPool(// + poolSize, // 默认线程池大小 + ThreadFactoryBuilder.create().setNamePrefix("Huool-socket-").build()// + ); + } catch (IOException e) { + throw new IORuntimeException(e); + } + } + + /** + * 连接到指定地址 + * + * @param group {@link AsynchronousChannelGroup} + * @param address 地址信息,包括地址和端口 + * @return {@link AsynchronousSocketChannel} + */ + public static AsynchronousSocketChannel connect(AsynchronousChannelGroup group, InetSocketAddress address) { + AsynchronousSocketChannel channel; + try { + channel = AsynchronousSocketChannel.open(group); + } catch (IOException e) { + throw new IORuntimeException(e); + } + + try { + channel.connect(address).get(); + } catch (InterruptedException | ExecutionException e) { + IoUtil.close(channel); + throw new SocketRuntimeException(e); + } + return channel; + } +} diff --git a/hutool-socket/src/main/java/cn/hutool/socket/aio/AioClient.java b/hutool-socket/src/main/java/cn/hutool/socket/aio/AioClient.java index 2fb37713d0..9e15f30e59 100644 --- a/hutool-socket/src/main/java/cn/hutool/socket/aio/AioClient.java +++ b/hutool-socket/src/main/java/cn/hutool/socket/aio/AioClient.java @@ -1,19 +1,14 @@ package cn.hutool.socket.aio; -import cn.hutool.core.io.IORuntimeException; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.thread.ThreadFactoryBuilder; +import cn.hutool.socket.ChannelUtil; import cn.hutool.socket.SocketConfig; -import cn.hutool.socket.SocketRuntimeException; import java.io.Closeable; import java.io.IOException; import java.net.InetSocketAddress; import java.net.SocketOption; import java.nio.ByteBuffer; -import java.nio.channels.AsynchronousChannelGroup; import java.nio.channels.AsynchronousSocketChannel; -import java.util.concurrent.ExecutionException; /** * Aio Socket客户端 @@ -120,25 +115,7 @@ public class AioClient implements Closeable{ * @return this */ private static AsynchronousSocketChannel createChannel(InetSocketAddress address, int poolSize) { - - AsynchronousSocketChannel channel; - try { - AsynchronousChannelGroup group = AsynchronousChannelGroup.withFixedThreadPool(// - poolSize, // 默认线程池大小 - ThreadFactoryBuilder.create().setNamePrefix("Huool-socket-").build()// - ); - channel = AsynchronousSocketChannel.open(group); - } catch (IOException e) { - throw new IORuntimeException(e); - } - - try { - channel.connect(address).get(); - } catch (InterruptedException | ExecutionException e) { - IoUtil.close(channel); - throw new SocketRuntimeException(e); - } - return channel; + return ChannelUtil.connect(ChannelUtil.createFixedGroup(poolSize), address); } // ------------------------------------------------------------------------------------- Private method end } diff --git a/hutool-socket/src/test/java/cn/hutool/socket/aio/AioClientTest.java b/hutool-socket/src/test/java/cn/hutool/socket/aio/AioClientTest.java index f0694a0800..1a53476d88 100755 --- a/hutool-socket/src/test/java/cn/hutool/socket/aio/AioClientTest.java +++ b/hutool-socket/src/test/java/cn/hutool/socket/aio/AioClientTest.java @@ -1,15 +1,23 @@ package cn.hutool.socket.aio; import cn.hutool.core.lang.Console; +import cn.hutool.core.thread.ThreadFactoryBuilder; import cn.hutool.core.util.StrUtil; +import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; +import java.nio.channels.AsynchronousChannelGroup; public class AioClientTest { - public static void main(String[] args) { + public static void main(String[] args) throws IOException { + final AsynchronousChannelGroup GROUP = AsynchronousChannelGroup.withFixedThreadPool(// + Runtime.getRuntime().availableProcessors(), // 默认线程池大小 + ThreadFactoryBuilder.create().setNamePrefix("Huool-socket-").build()// + ); + AioClient client = new AioClient(new InetSocketAddress("localhost", 8899), new SimpleIoAction() { - + @Override public void doAction(AioSession session, ByteBuffer data) { if(data.hasRemaining()) { @@ -19,10 +27,10 @@ public class AioClientTest { Console.log("OK"); } }); - + client.write(ByteBuffer.wrap("Hello".getBytes())); client.read(); - + client.close(); } } -- Gitee From 337edc57fa78f14eb7d1f7718c119e87f66e700f Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 24 May 2022 11:01:22 +0800 Subject: [PATCH 0048/1737] fix bug --- CHANGELOG.md | 4 ++-- hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 640c82e128..d5838f7b21 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.2.M1 (2022-05-23) +# 5.8.2.M1 (2022-05-24) ### 🐣新特性 * 【core 】 BeanUtil拷贝对象增加空检查(issue#I58CJ3@Gitee) @@ -15,7 +15,7 @@ * 【extra 】 修复SshjSftp初始化未能代入端口配置问题(issue#2333@Github) * 【core 】 修复Convert.numberToSimple转换问题(issue#2334@Github) * 【core 】 修复TemporalAccessorConverter导致的转换问题(issue#2341@Github) -* 【core 】 修复TemporalAccessorConverter导致的转换问题(issue#2341@Github) +* 【core 】 修复NumberUtil除法空指针问题(issue#I58XKE@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java index 5b40c361ff..1fcd27e71b 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java @@ -719,7 +719,7 @@ public class NumberUtil { if (v1 instanceof BigDecimal && v2 instanceof BigDecimal) { return div((BigDecimal) v1, (BigDecimal) v2, scale, roundingMode); } - return div(v1.toString(), v2.toString(), scale, roundingMode); + return div(StrUtil.toStringOrNull(v1), StrUtil.toStringOrNull(v2), scale, roundingMode); } /** -- Gitee From 64fe41a171fe29be31ff5513afc72d6f5fcc48d4 Mon Sep 17 00:00:00 2001 From: yubo Date: Tue, 24 May 2022 15:36:03 +0800 Subject: [PATCH 0049/1737] car vin not include I O Q --- hutool-core/src/main/java/cn/hutool/core/lang/RegexPool.java | 2 +- .../src/test/java/cn/hutool/core/lang/ValidatorTest.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/RegexPool.java b/hutool-core/src/main/java/cn/hutool/core/lang/RegexPool.java index 7258c79dd7..9a7c67ac8a 100755 --- a/hutool-core/src/main/java/cn/hutool/core/lang/RegexPool.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/RegexPool.java @@ -168,7 +168,7 @@ public interface RegexPool { * 十七位码、车架号 * 车辆的唯一标示 */ - String CAR_VIN = "^[A-Za-z0-9]{17}$"; + String CAR_VIN = "^[A-HJ-NPR-Z0-9]{17}$"; /** * 驾驶证 别名:驾驶证档案编号、行驶证编号 * eg:430101758218 diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/ValidatorTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/ValidatorTest.java index bfd6c7ddb0..11da7f5fd3 100755 --- a/hutool-core/src/test/java/cn/hutool/core/lang/ValidatorTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/ValidatorTest.java @@ -221,6 +221,7 @@ public class ValidatorTest { public void isCarVinTest(){ Assert.assertTrue(Validator.isCarVin("LSJA24U62JG269225")); Assert.assertTrue(Validator.isCarVin("LDC613P23A1305189")); + Assert.assertFalse(Validator.isCarVin("LOC613P23A1305189")); } @Test -- Gitee From 268f258537c07b41d6fc2063ab3bba358232766f Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 24 May 2022 17:24:26 +0800 Subject: [PATCH 0050/1737] fix regex --- CHANGELOG.md | 1 + hutool-core/src/main/java/cn/hutool/core/lang/RegexPool.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d5838f7b21..61c4e7e303 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ * 【core 】 修复Convert.numberToSimple转换问题(issue#2334@Github) * 【core 】 修复TemporalAccessorConverter导致的转换问题(issue#2341@Github) * 【core 】 修复NumberUtil除法空指针问题(issue#I58XKE@Gitee) +* 【core 】 修复CAR_VIN正则(pr#624@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/RegexPool.java b/hutool-core/src/main/java/cn/hutool/core/lang/RegexPool.java index 9a7c67ac8a..a859fddd6a 100755 --- a/hutool-core/src/main/java/cn/hutool/core/lang/RegexPool.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/RegexPool.java @@ -168,7 +168,7 @@ public interface RegexPool { * 十七位码、车架号 * 车辆的唯一标示 */ - String CAR_VIN = "^[A-HJ-NPR-Z0-9]{17}$"; + String CAR_VIN = "^[A-HJ-NPR-Z0-9]{8}[0-9X][A-HJ-NPR-Z0-9]{2}\\d{6}$"; /** * 驾驶证 别名:驾驶证档案编号、行驶证编号 * eg:430101758218 -- Gitee From 969a017f0201a7bc4316041f54469b28a7013f59 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 26 May 2022 12:12:05 +0800 Subject: [PATCH 0051/1737] fix bug --- CHANGELOG.md | 7 ++++--- hutool-db/pom.xml | 8 ++++---- hutool-db/src/main/java/cn/hutool/db/dialect/Dialect.java | 4 +--- hutool-db/src/test/java/cn/hutool/db/DbTest.java | 6 ++++++ 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61c4e7e303..427d9eff43 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,20 +3,21 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.2.M1 (2022-05-24) +# 5.8.2.M1 (2022-05-26) ### 🐣新特性 * 【core 】 BeanUtil拷贝对象增加空检查(issue#I58CJ3@Gitee) * 【db 】 Column#size改为long * 【core 】 ClassUtil增加isInterface等方法(pr#623@Gitee) * 【socket 】 增加ChannelUtil -* + ### 🐞Bug修复 * 【extra 】 修复SshjSftp初始化未能代入端口配置问题(issue#2333@Github) * 【core 】 修复Convert.numberToSimple转换问题(issue#2334@Github) * 【core 】 修复TemporalAccessorConverter导致的转换问题(issue#2341@Github) * 【core 】 修复NumberUtil除法空指针问题(issue#I58XKE@Gitee) * 【core 】 修复CAR_VIN正则(pr#624@Gitee) +* 【db 】 修复count查询别名问题(issue#I590YB@Gitee) ------------------------------------------------------------------------------------------------------------- @@ -30,7 +31,7 @@ * 【core 】 ByteUtil新增bytesToShort重载(issue#I57FA7@Gitee) * 【core 】 ReflectUtil.invoke方法抛出运行时异常增加InvocationTargetRuntimeException(issue#I57GI2@Gitee) * 【core 】 NumberUtil.parseNumber支持16进制(issue#2328@Github) -* + ### 🐞Bug修复 * 【core 】 MapUtil.map对null友好,且修复了测试用例中分组问题(pr#614@Gitee) * 【core 】 修复BeanUtil.beanToMap中properties为null的空指针问题(issue#2303@Github) diff --git a/hutool-db/pom.xml b/hutool-db/pom.xml index b8f5947ed1..f28ddc47ae 100755 --- a/hutool-db/pom.xml +++ b/hutool-db/pom.xml @@ -22,12 +22,12 @@ 2.9.0 10.0.20 1.2.9 - 2.4.13 + 4.0.3 4.6.0 3.36.0.3 2.5.2 - 4.2.2 + 4.2.3 @@ -62,7 +62,7 @@
com.zaxxer - HikariCP-java7 + HikariCP ${hikariCP.version} @@ -156,7 +156,7 @@ com.microsoft.sqlserver mssql-jdbc - 10.2.0.jre8 + 10.2.1.jre8 test diff --git a/hutool-db/src/main/java/cn/hutool/db/dialect/Dialect.java b/hutool-db/src/main/java/cn/hutool/db/dialect/Dialect.java index 6ad5922bdc..7f0ca07a58 100644 --- a/hutool-db/src/main/java/cn/hutool/db/dialect/Dialect.java +++ b/hutool-db/src/main/java/cn/hutool/db/dialect/Dialect.java @@ -1,6 +1,5 @@ package cn.hutool.db.dialect; -import cn.hutool.core.collection.ListUtil; import cn.hutool.db.Entity; import cn.hutool.db.Page; import cn.hutool.db.sql.Order; @@ -134,8 +133,7 @@ public interface Dialect extends Serializable { * @throws SQLException SQL执行异常 */ default PreparedStatement psForCount(Connection conn, Query query) throws SQLException { - query.setFields(ListUtil.toList("count(1)")); - return psForFind(conn, query); + return psForCount(conn, SqlBuilder.create().query(query)); } /** diff --git a/hutool-db/src/test/java/cn/hutool/db/DbTest.java b/hutool-db/src/test/java/cn/hutool/db/DbTest.java index 1002b602e1..5419097a28 100644 --- a/hutool-db/src/test/java/cn/hutool/db/DbTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/DbTest.java @@ -70,6 +70,12 @@ public class DbTest { Assert.assertEquals(4, count); } + @Test + public void countByQueryTest() throws SQLException { + final long count = Db.use().count(Entity.create("user")); + Assert.assertEquals(4, count); + } + @Test public void countTest2() throws SQLException { final long count = Db.use().count("select * from user order by name DESC"); -- Gitee From bfa130b5648f860f95fee77faac6fab2f8ea7627 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 27 May 2022 17:42:02 +0800 Subject: [PATCH 0052/1737] fix json bug --- CHANGELOG.md | 3 ++- .../java/cn/hutool/json/JSONConverter.java | 4 +++ .../main/java/cn/hutool/json/JSONGetter.java | 11 ++++++++ .../main/java/cn/hutool/json/JSONUtil.java | 7 ++++++ .../java/cn/hutool/json/ObjectMapper.java | 1 + .../cn/hutool/json/serialize/JSONWriter.java | 10 ++++++-- .../java/cn/hutool/json/IssueI59LW4Test.java | 25 +++++++++++++++++++ 7 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 hutool-json/src/test/java/cn/hutool/json/IssueI59LW4Test.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 427d9eff43..c27490c5b7 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.2.M1 (2022-05-26) +# 5.8.2.M1 (2022-05-27) ### 🐣新特性 * 【core 】 BeanUtil拷贝对象增加空检查(issue#I58CJ3@Gitee) @@ -18,6 +18,7 @@ * 【core 】 修复NumberUtil除法空指针问题(issue#I58XKE@Gitee) * 【core 】 修复CAR_VIN正则(pr#624@Gitee) * 【db 】 修复count查询别名问题(issue#I590YB@Gitee) +* 【json 】 修复json中byte[]无法转换问题(issue#I59LW4@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java b/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java index 674ee98d14..4e91df9bd0 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java @@ -1,6 +1,7 @@ package cn.hutool.json; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.codec.Base64; import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.ConvertException; import cn.hutool.core.convert.Converter; @@ -85,6 +86,9 @@ public class JSONConverter implements Converter { } target.parse(value); return (T) target; + } else if(targetType == byte[].class && value instanceof CharSequence){ + // issue#I59LW4 + return (T) Base64.decode((CharSequence) value); } } diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONGetter.java b/hutool-json/src/main/java/cn/hutool/json/JSONGetter.java index 00e2aa5070..b2eb31764c 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONGetter.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONGetter.java @@ -190,6 +190,17 @@ public interface JSONGetter extends OptNullBasicTypeFromObjectGetter { return Convert.toLocalDateTime(obj, defaultValue); } + /** + * 获取byte[]数据 + * + * @param key 键 + * @return 值 + * @since 5.8.2 + */ + default byte[] getBytes(K key) { + return get(key, byte[].class); + } + /** * 获取指定类型的对象
* 转换失败或抛出异常 diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java b/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java index 7938ed3c6d..97715c113a 100755 --- a/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java @@ -1,5 +1,6 @@ package cn.hutool.json; +import cn.hutool.core.codec.Base64; import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.file.FileReader; import cn.hutool.core.lang.TypeReference; @@ -784,6 +785,12 @@ public class JSONUtil { // JSONArray if (object instanceof Iterable || ArrayUtil.isArray(object)) { + if(object instanceof byte[]){ + // issue#I59LW4 + // json内容中的bytes默认转为Base64 + return Base64.encode((byte[]) object); + } + return new JSONArray(object, jsonConfig); } // JSONObject diff --git a/hutool-json/src/main/java/cn/hutool/json/ObjectMapper.java b/hutool-json/src/main/java/cn/hutool/json/ObjectMapper.java index 6d7f9761e8..c8eeea2a15 100755 --- a/hutool-json/src/main/java/cn/hutool/json/ObjectMapper.java +++ b/hutool-json/src/main/java/cn/hutool/json/ObjectMapper.java @@ -144,6 +144,7 @@ public class ObjectMapper { } else if (source instanceof InputStream) { mapFromTokener(new JSONTokener((InputStream) source, jsonArray.getConfig()), jsonArray, filter); } else if (source instanceof byte[]) { + // bytes按照JSON的二进制流对待 mapFromTokener(new JSONTokener(IoUtil.toStream((byte[]) source), jsonArray.getConfig()), jsonArray, filter); } else if (source instanceof JSONTokener) { mapFromTokener((JSONTokener) source, jsonArray, filter); diff --git a/hutool-json/src/main/java/cn/hutool/json/serialize/JSONWriter.java b/hutool-json/src/main/java/cn/hutool/json/serialize/JSONWriter.java index b38a5c7a9b..38cce600d6 100755 --- a/hutool-json/src/main/java/cn/hutool/json/serialize/JSONWriter.java +++ b/hutool-json/src/main/java/cn/hutool/json/serialize/JSONWriter.java @@ -1,5 +1,6 @@ package cn.hutool.json.serialize; +import cn.hutool.core.codec.Base64; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.TemporalAccessorUtil; @@ -167,7 +168,6 @@ public class JSONWriter extends Writer { if(JSONUtil.isNull(value) && config.isIgnoreNullValue()){ return this; } - return writeKey(key).writeValueDirect(value); } @@ -226,7 +226,13 @@ public class JSONWriter extends Writer { } else if (value instanceof Map || value instanceof Map.Entry) { new JSONObject(value).write(writer, indentFactor, indent); } else if (value instanceof Iterable || value instanceof Iterator || ArrayUtil.isArray(value)) { - new JSONArray(value).write(writer, indentFactor, indent); + if(value instanceof byte[]){ + // issue#I59LW4 + // json内容中的bytes默认转为Base64 + writeStrValue(Base64.encode((byte[]) value)); + }else{ + new JSONArray(value).write(writer, indentFactor, indent); + } } else if (value instanceof Number) { writeNumberValue((Number) value); } else if (value instanceof Date || value instanceof Calendar || value instanceof TemporalAccessor) { diff --git a/hutool-json/src/test/java/cn/hutool/json/IssueI59LW4Test.java b/hutool-json/src/test/java/cn/hutool/json/IssueI59LW4Test.java new file mode 100644 index 0000000000..7425821fd9 --- /dev/null +++ b/hutool-json/src/test/java/cn/hutool/json/IssueI59LW4Test.java @@ -0,0 +1,25 @@ +package cn.hutool.json; + +import org.junit.Assert; +import org.junit.Test; + +public class IssueI59LW4Test { + + @Test + public void bytesTest(){ + final JSONObject jsonObject = JSONUtil.createObj().set("bytes", new byte[]{1}); + Assert.assertEquals("{\"bytes\":\"AQ==\"}", jsonObject.toString()); + + final byte[] bytes = jsonObject.getBytes("bytes"); + Assert.assertArrayEquals(new byte[]{1}, bytes); + } + + @Test + public void bytesInJSONArrayTest(){ + final JSONArray jsonArray = JSONUtil.createArray().set(new byte[]{1}); + Assert.assertEquals("[\"AQ==\"]", jsonArray.toString()); + + final byte[] bytes = jsonArray.getBytes(0); + Assert.assertArrayEquals(new byte[]{1}, bytes); + } +} -- Gitee From c72ff2c29297217425a99b2e35a7bbad52b717e8 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 27 May 2022 18:06:54 +0800 Subject: [PATCH 0053/1737] fix bug --- CHANGELOG.md | 1 + .../java/cn/hutool/core/util/NumberUtil.java | 32 +++++++++++-------- .../cn/hutool/core/util/NumberUtilTest.java | 7 ++++ 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c27490c5b7..2176a3bf0e 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ * 【core 】 修复CAR_VIN正则(pr#624@Gitee) * 【db 】 修复count查询别名问题(issue#I590YB@Gitee) * 【json 】 修复json中byte[]无法转换问题(issue#I59LW4@Gitee) +* 【core 】 修复NumberUtil.isXXX未判空问题(issue#2350@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java index 1fcd27e71b..953131578c 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java @@ -1238,10 +1238,12 @@ public class NumberUtil { * @return 是否为整数 */ public static boolean isInteger(String s) { - try { - Integer.parseInt(s); - } catch (NumberFormatException e) { - return false; + if(StrUtil.isNotBlank(s)) { + try { + Integer.parseInt(s); + } catch (NumberFormatException e) { + return false; + } } return true; } @@ -1255,10 +1257,12 @@ public class NumberUtil { * @since 4.0.0 */ public static boolean isLong(String s) { - try { - Long.parseLong(s); - } catch (NumberFormatException e) { - return false; + if(StrUtil.isNotBlank(s)) { + try { + Long.parseLong(s); + } catch (NumberFormatException e) { + return false; + } } return true; } @@ -1270,11 +1274,13 @@ public class NumberUtil { * @return 是否为{@link Double}类型 */ public static boolean isDouble(String s) { - try { - Double.parseDouble(s); - return s.contains("."); - } catch (NumberFormatException ignore) { - // ignore + if(StrUtil.isNotBlank(s)) { + try { + Double.parseDouble(s); + return s.contains("."); + } catch (NumberFormatException ignore) { + // ignore + } } return false; } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java index 72551904f5..1dd645aa99 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java @@ -444,4 +444,11 @@ public class NumberUtilTest { Assert.assertEquals(1001013, NumberUtil.div(100101300, (Number) 100).intValue()); } + @Test + public void isDoubleTest(){ + Assert.assertFalse(NumberUtil.isDouble(null)); + Assert.assertFalse(NumberUtil.isDouble("")); + Assert.assertFalse(NumberUtil.isDouble(" ")); + } + } -- Gitee From 29a561fbcfedfca59c3ec45a9c45ffac203bebd4 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 27 May 2022 20:17:41 +0800 Subject: [PATCH 0054/1737] fix bug --- CHANGELOG.md | 1 + .../src/main/java/cn/hutool/core/lang/Singleton.java | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2176a3bf0e..0404638e47 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ * 【db 】 修复count查询别名问题(issue#I590YB@Gitee) * 【json 】 修复json中byte[]无法转换问题(issue#I59LW4@Gitee) * 【core 】 修复NumberUtil.isXXX未判空问题(issue#2350@Github) +* 【core 】 修复Singleton中ConcurrentHashMap在JDK8下的bug引起的可能的死循环问题(issue#2349@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java b/hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java index 4a60648adc..ab26a662b8 100755 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java @@ -52,7 +52,15 @@ public final class Singleton { */ @SuppressWarnings("unchecked") public static T get(String key, Func0 supplier) { - return (T) POOL.computeIfAbsent(key, (k)-> supplier.callWithRuntimeException()); + //return (T) POOL.computeIfAbsent(key, (k)-> supplier.callWithRuntimeException()); + // issues#2349 + // ConcurrentHashMap.computeIfAbsent在某些情况下会导致死循环问题,此处采用Dubbo的解决方案 + Object value = POOL.get(key); + if(null == value){ + POOL.putIfAbsent(key, supplier.callWithRuntimeException()); + value = POOL.get(key); + } + return (T) value; } /** -- Gitee From 493da883a3c0fb662765adc608d20716520c5c2e Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 27 May 2022 21:37:08 +0800 Subject: [PATCH 0055/1737] =?UTF-8?q?=F0=9F=8D=A2release=205.8.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 +- README-EN.md | 6 +++--- README.md | 6 +++--- bin/version.txt | 2 +- docs/js/version.js | 2 +- hutool-all/pom.xml | 2 +- hutool-aop/pom.xml | 2 +- hutool-bloomFilter/pom.xml | 2 +- hutool-bom/pom.xml | 2 +- hutool-cache/pom.xml | 2 +- hutool-captcha/pom.xml | 2 +- hutool-core/pom.xml | 2 +- hutool-cron/pom.xml | 2 +- hutool-crypto/pom.xml | 2 +- hutool-db/pom.xml | 2 +- hutool-dfa/pom.xml | 2 +- hutool-extra/pom.xml | 2 +- hutool-http/pom.xml | 2 +- hutool-json/pom.xml | 2 +- hutool-jwt/pom.xml | 2 +- hutool-log/pom.xml | 2 +- hutool-poi/pom.xml | 2 +- hutool-script/pom.xml | 2 +- hutool-setting/pom.xml | 2 +- hutool-socket/pom.xml | 2 +- hutool-system/pom.xml | 2 +- pom.xml | 2 +- 27 files changed, 31 insertions(+), 31 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0404638e47..506c61ac74 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.2.M1 (2022-05-27) +# 5.8.2 (2022-05-27) ### 🐣新特性 * 【core 】 BeanUtil拷贝对象增加空检查(issue#I58CJ3@Gitee) diff --git a/README-EN.md b/README-EN.md index 1132488cef..ba12a55b5d 100755 --- a/README-EN.md +++ b/README-EN.md @@ -144,18 +144,18 @@ We provide the T-Shirt and Sweater with Hutool Logo, please visit the shop: cn.hutool hutool-all - 5.8.2.M1 + 5.8.2 ``` ### 🍐Gradle ``` -implementation 'cn.hutool:hutool-all:5.8.2.M1' +implementation 'cn.hutool:hutool-all:5.8.2' ``` ## 📥Download -- [Maven Repo](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.2.M1/) +- [Maven Repo](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.2/) > 🔔️note: > Hutool 5.x supports JDK8+ and is not tested on Android platforms, and cannot guarantee that all tool classes or tool methods are available. diff --git a/README.md b/README.md index 26a08fe3f2..007cc2d029 100755 --- a/README.md +++ b/README.md @@ -144,20 +144,20 @@ Hutool的存在就是为了减少代码搜索成本,避免网络上参差不 cn.hutool hutool-all - 5.8.2.M1 + 5.8.2 ``` ### 🍐Gradle ``` -implementation 'cn.hutool:hutool-all:5.8.2.M1' +implementation 'cn.hutool:hutool-all:5.8.2' ``` ### 📥下载jar 点击以下链接,下载`hutool-all-X.X.X.jar`即可: -- [Maven中央库](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.2.M1/) +- [Maven中央库](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.2/) > 🔔️注意 > Hutool 5.x支持JDK8+,对Android平台没有测试,不能保证所有工具类或工具方法可用。 diff --git a/bin/version.txt b/bin/version.txt index 1c570b5912..5e21ca5a89 100755 --- a/bin/version.txt +++ b/bin/version.txt @@ -1 +1 @@ -5.8.2.M1 +5.8.2 diff --git a/docs/js/version.js b/docs/js/version.js index 00fc859f33..f4f3726e44 100755 --- a/docs/js/version.js +++ b/docs/js/version.js @@ -1 +1 @@ -var version = '5.8.2.M1' \ No newline at end of file +var version = '5.8.2' \ No newline at end of file diff --git a/hutool-all/pom.xml b/hutool-all/pom.xml index 1b4c289369..08fef51703 100755 --- a/hutool-all/pom.xml +++ b/hutool-all/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2.M1 + 5.8.2 hutool-all diff --git a/hutool-aop/pom.xml b/hutool-aop/pom.xml index c9707f65a5..fd82049032 100755 --- a/hutool-aop/pom.xml +++ b/hutool-aop/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2.M1 + 5.8.2 hutool-aop diff --git a/hutool-bloomFilter/pom.xml b/hutool-bloomFilter/pom.xml index 1d75d8c089..8673937c29 100755 --- a/hutool-bloomFilter/pom.xml +++ b/hutool-bloomFilter/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2.M1 + 5.8.2 hutool-bloomFilter diff --git a/hutool-bom/pom.xml b/hutool-bom/pom.xml index 523a9c5ef1..4ddc45827f 100755 --- a/hutool-bom/pom.xml +++ b/hutool-bom/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2.M1 + 5.8.2 hutool-bom diff --git a/hutool-cache/pom.xml b/hutool-cache/pom.xml index b2a9a5993a..263c43fbd5 100755 --- a/hutool-cache/pom.xml +++ b/hutool-cache/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2.M1 + 5.8.2 hutool-cache diff --git a/hutool-captcha/pom.xml b/hutool-captcha/pom.xml index da06ccb3dd..b86c3181bc 100755 --- a/hutool-captcha/pom.xml +++ b/hutool-captcha/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2.M1 + 5.8.2 hutool-captcha diff --git a/hutool-core/pom.xml b/hutool-core/pom.xml index 455dc2f1b7..a77075c941 100755 --- a/hutool-core/pom.xml +++ b/hutool-core/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2.M1 + 5.8.2 hutool-core diff --git a/hutool-cron/pom.xml b/hutool-cron/pom.xml index 9db2a9c8ab..a8aeec0a47 100755 --- a/hutool-cron/pom.xml +++ b/hutool-cron/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2.M1 + 5.8.2 hutool-cron diff --git a/hutool-crypto/pom.xml b/hutool-crypto/pom.xml index 2bd6f35c02..e95c5f7ba9 100755 --- a/hutool-crypto/pom.xml +++ b/hutool-crypto/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2.M1 + 5.8.2 hutool-crypto diff --git a/hutool-db/pom.xml b/hutool-db/pom.xml index f28ddc47ae..980de2c189 100755 --- a/hutool-db/pom.xml +++ b/hutool-db/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2.M1 + 5.8.2 hutool-db diff --git a/hutool-dfa/pom.xml b/hutool-dfa/pom.xml index b607f025c1..1e58ac7501 100755 --- a/hutool-dfa/pom.xml +++ b/hutool-dfa/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2.M1 + 5.8.2 hutool-dfa diff --git a/hutool-extra/pom.xml b/hutool-extra/pom.xml index 2703c19be7..c454355e75 100755 --- a/hutool-extra/pom.xml +++ b/hutool-extra/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2.M1 + 5.8.2 hutool-extra diff --git a/hutool-http/pom.xml b/hutool-http/pom.xml index 98c302ad3e..7513e02a62 100755 --- a/hutool-http/pom.xml +++ b/hutool-http/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2.M1 + 5.8.2 hutool-http diff --git a/hutool-json/pom.xml b/hutool-json/pom.xml index c92c80e158..884310ec17 100755 --- a/hutool-json/pom.xml +++ b/hutool-json/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2.M1 + 5.8.2 hutool-json diff --git a/hutool-jwt/pom.xml b/hutool-jwt/pom.xml index 680fb62255..91cc4cd97a 100755 --- a/hutool-jwt/pom.xml +++ b/hutool-jwt/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2.M1 + 5.8.2 hutool-jwt diff --git a/hutool-log/pom.xml b/hutool-log/pom.xml index c71e248166..ac384e5803 100755 --- a/hutool-log/pom.xml +++ b/hutool-log/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2.M1 + 5.8.2 hutool-log diff --git a/hutool-poi/pom.xml b/hutool-poi/pom.xml index e114db71e1..93378c39d7 100755 --- a/hutool-poi/pom.xml +++ b/hutool-poi/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2.M1 + 5.8.2 hutool-poi diff --git a/hutool-script/pom.xml b/hutool-script/pom.xml index 17d58f2f34..2d43092fc2 100755 --- a/hutool-script/pom.xml +++ b/hutool-script/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2.M1 + 5.8.2 hutool-script diff --git a/hutool-setting/pom.xml b/hutool-setting/pom.xml index 924da45a02..46f89eaa92 100755 --- a/hutool-setting/pom.xml +++ b/hutool-setting/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2.M1 + 5.8.2 hutool-setting diff --git a/hutool-socket/pom.xml b/hutool-socket/pom.xml index e47ea5bb4d..575a2040bb 100755 --- a/hutool-socket/pom.xml +++ b/hutool-socket/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2.M1 + 5.8.2 hutool-socket diff --git a/hutool-system/pom.xml b/hutool-system/pom.xml index 262f8f146f..010c18d99e 100755 --- a/hutool-system/pom.xml +++ b/hutool-system/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2.M1 + 5.8.2 hutool-system diff --git a/pom.xml b/pom.xml index cdc6699017..e5c7eb3930 100755 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ cn.hutool hutool-parent - 5.8.2.M1 + 5.8.2 hutool Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。 https://github.com/dromara/hutool -- Gitee From 30692987ff55775b692bf2b6367adc35a875e976 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 27 May 2022 21:50:04 +0800 Subject: [PATCH 0056/1737] prepare 5.8.3 --- CHANGELOG.md | 7 +++++++ README-EN.md | 6 +++--- README.md | 6 +++--- bin/version.txt | 2 +- docs/js/version.js | 2 +- hutool-all/pom.xml | 2 +- hutool-aop/pom.xml | 2 +- hutool-bloomFilter/pom.xml | 2 +- hutool-bom/pom.xml | 2 +- hutool-cache/pom.xml | 2 +- hutool-captcha/pom.xml | 2 +- hutool-core/pom.xml | 2 +- hutool-cron/pom.xml | 2 +- hutool-crypto/pom.xml | 2 +- hutool-db/pom.xml | 2 +- hutool-dfa/pom.xml | 2 +- hutool-extra/pom.xml | 2 +- hutool-http/pom.xml | 2 +- hutool-json/pom.xml | 2 +- hutool-jwt/pom.xml | 2 +- hutool-log/pom.xml | 2 +- hutool-poi/pom.xml | 2 +- hutool-script/pom.xml | 2 +- hutool-setting/pom.xml | 2 +- hutool-socket/pom.xml | 2 +- hutool-system/pom.xml | 2 +- pom.xml | 2 +- 27 files changed, 37 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 506c61ac74..9405eabd84 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,13 @@ ------------------------------------------------------------------------------------------------------------- +# 5.8.3.M1 (2022-05-27) + +### 🐣新特性 +### 🐞Bug修复 + +------------------------------------------------------------------------------------------------------------- + # 5.8.2 (2022-05-27) ### 🐣新特性 diff --git a/README-EN.md b/README-EN.md index ba12a55b5d..8878b78cb9 100755 --- a/README-EN.md +++ b/README-EN.md @@ -144,18 +144,18 @@ We provide the T-Shirt and Sweater with Hutool Logo, please visit the shop: cn.hutool hutool-all - 5.8.2 + 5.8.3.M1 ``` ### 🍐Gradle ``` -implementation 'cn.hutool:hutool-all:5.8.2' +implementation 'cn.hutool:hutool-all:5.8.3.M1' ``` ## 📥Download -- [Maven Repo](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.2/) +- [Maven Repo](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.3.M1/) > 🔔️note: > Hutool 5.x supports JDK8+ and is not tested on Android platforms, and cannot guarantee that all tool classes or tool methods are available. diff --git a/README.md b/README.md index 007cc2d029..41c902b3a6 100755 --- a/README.md +++ b/README.md @@ -144,20 +144,20 @@ Hutool的存在就是为了减少代码搜索成本,避免网络上参差不 cn.hutool hutool-all - 5.8.2 + 5.8.3.M1 ``` ### 🍐Gradle ``` -implementation 'cn.hutool:hutool-all:5.8.2' +implementation 'cn.hutool:hutool-all:5.8.3.M1' ``` ### 📥下载jar 点击以下链接,下载`hutool-all-X.X.X.jar`即可: -- [Maven中央库](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.2/) +- [Maven中央库](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.3.M1/) > 🔔️注意 > Hutool 5.x支持JDK8+,对Android平台没有测试,不能保证所有工具类或工具方法可用。 diff --git a/bin/version.txt b/bin/version.txt index 5e21ca5a89..e528d0bdc0 100755 --- a/bin/version.txt +++ b/bin/version.txt @@ -1 +1 @@ -5.8.2 +5.8.3.M1 diff --git a/docs/js/version.js b/docs/js/version.js index f4f3726e44..429f076b64 100755 --- a/docs/js/version.js +++ b/docs/js/version.js @@ -1 +1 @@ -var version = '5.8.2' \ No newline at end of file +var version = '5.8.3.M1' \ No newline at end of file diff --git a/hutool-all/pom.xml b/hutool-all/pom.xml index 08fef51703..6d03c292fe 100755 --- a/hutool-all/pom.xml +++ b/hutool-all/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2 + 5.8.3.M1 hutool-all diff --git a/hutool-aop/pom.xml b/hutool-aop/pom.xml index fd82049032..b76ece5235 100755 --- a/hutool-aop/pom.xml +++ b/hutool-aop/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2 + 5.8.3.M1 hutool-aop diff --git a/hutool-bloomFilter/pom.xml b/hutool-bloomFilter/pom.xml index 8673937c29..46dc0ee504 100755 --- a/hutool-bloomFilter/pom.xml +++ b/hutool-bloomFilter/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2 + 5.8.3.M1 hutool-bloomFilter diff --git a/hutool-bom/pom.xml b/hutool-bom/pom.xml index 4ddc45827f..25a412faf4 100755 --- a/hutool-bom/pom.xml +++ b/hutool-bom/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2 + 5.8.3.M1 hutool-bom diff --git a/hutool-cache/pom.xml b/hutool-cache/pom.xml index 263c43fbd5..8c3d3b1367 100755 --- a/hutool-cache/pom.xml +++ b/hutool-cache/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2 + 5.8.3.M1 hutool-cache diff --git a/hutool-captcha/pom.xml b/hutool-captcha/pom.xml index b86c3181bc..12ac2607fd 100755 --- a/hutool-captcha/pom.xml +++ b/hutool-captcha/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2 + 5.8.3.M1 hutool-captcha diff --git a/hutool-core/pom.xml b/hutool-core/pom.xml index a77075c941..a77a9d1661 100755 --- a/hutool-core/pom.xml +++ b/hutool-core/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2 + 5.8.3.M1 hutool-core diff --git a/hutool-cron/pom.xml b/hutool-cron/pom.xml index a8aeec0a47..e344329309 100755 --- a/hutool-cron/pom.xml +++ b/hutool-cron/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2 + 5.8.3.M1 hutool-cron diff --git a/hutool-crypto/pom.xml b/hutool-crypto/pom.xml index e95c5f7ba9..646739f852 100755 --- a/hutool-crypto/pom.xml +++ b/hutool-crypto/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2 + 5.8.3.M1 hutool-crypto diff --git a/hutool-db/pom.xml b/hutool-db/pom.xml index 980de2c189..3375d7b322 100755 --- a/hutool-db/pom.xml +++ b/hutool-db/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2 + 5.8.3.M1 hutool-db diff --git a/hutool-dfa/pom.xml b/hutool-dfa/pom.xml index 1e58ac7501..901587426a 100755 --- a/hutool-dfa/pom.xml +++ b/hutool-dfa/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2 + 5.8.3.M1 hutool-dfa diff --git a/hutool-extra/pom.xml b/hutool-extra/pom.xml index c454355e75..330fb556b0 100755 --- a/hutool-extra/pom.xml +++ b/hutool-extra/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2 + 5.8.3.M1 hutool-extra diff --git a/hutool-http/pom.xml b/hutool-http/pom.xml index 7513e02a62..7038558d3b 100755 --- a/hutool-http/pom.xml +++ b/hutool-http/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2 + 5.8.3.M1 hutool-http diff --git a/hutool-json/pom.xml b/hutool-json/pom.xml index 884310ec17..c302902538 100755 --- a/hutool-json/pom.xml +++ b/hutool-json/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2 + 5.8.3.M1 hutool-json diff --git a/hutool-jwt/pom.xml b/hutool-jwt/pom.xml index 91cc4cd97a..90cebf8036 100755 --- a/hutool-jwt/pom.xml +++ b/hutool-jwt/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2 + 5.8.3.M1 hutool-jwt diff --git a/hutool-log/pom.xml b/hutool-log/pom.xml index ac384e5803..0d2eab9af7 100755 --- a/hutool-log/pom.xml +++ b/hutool-log/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2 + 5.8.3.M1 hutool-log diff --git a/hutool-poi/pom.xml b/hutool-poi/pom.xml index 93378c39d7..325461194a 100755 --- a/hutool-poi/pom.xml +++ b/hutool-poi/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2 + 5.8.3.M1 hutool-poi diff --git a/hutool-script/pom.xml b/hutool-script/pom.xml index 2d43092fc2..1def508772 100755 --- a/hutool-script/pom.xml +++ b/hutool-script/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2 + 5.8.3.M1 hutool-script diff --git a/hutool-setting/pom.xml b/hutool-setting/pom.xml index 46f89eaa92..9bc5768cfd 100755 --- a/hutool-setting/pom.xml +++ b/hutool-setting/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2 + 5.8.3.M1 hutool-setting diff --git a/hutool-socket/pom.xml b/hutool-socket/pom.xml index 575a2040bb..8cda91689b 100755 --- a/hutool-socket/pom.xml +++ b/hutool-socket/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2 + 5.8.3.M1 hutool-socket diff --git a/hutool-system/pom.xml b/hutool-system/pom.xml index 010c18d99e..1740d4f655 100755 --- a/hutool-system/pom.xml +++ b/hutool-system/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.2 + 5.8.3.M1 hutool-system diff --git a/pom.xml b/pom.xml index e5c7eb3930..5ab7db7f81 100755 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ cn.hutool hutool-parent - 5.8.2 + 5.8.3.M1 hutool Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。 https://github.com/dromara/hutool -- Gitee From 60a068db3f890b9c0b60e949d133f6a88c67db68 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 30 May 2022 07:44:45 +0800 Subject: [PATCH 0057/1737] fix bug and add timeout --- CHANGELOG.md | 4 +- .../java/cn/hutool/core/util/NumberUtil.java | 43 ++++++++++--------- .../cn/hutool/core/util/NumberUtilTest.java | 6 +++ .../cn/hutool/extra/mail/MailAccount.java | 23 +++++++++- .../resources/example/mail-example.setting | 4 +- 5 files changed, 57 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9405eabd84..69bd4aa57a 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,12 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.3.M1 (2022-05-27) +# 5.8.3.M1 (2022-05-30) ### 🐣新特性 +* 【extra 】 mail增加writeTimeout参数支持(issue#2355@Github) ### 🐞Bug修复 +* 【core 】 修复NumberUtil.isXXX空判断错误(issue#2356@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java index 953131578c..1f113681dd 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java @@ -1238,12 +1238,13 @@ public class NumberUtil { * @return 是否为整数 */ public static boolean isInteger(String s) { - if(StrUtil.isNotBlank(s)) { - try { - Integer.parseInt(s); - } catch (NumberFormatException e) { - return false; - } + if(StrUtil.isBlank(s)) { + return false; + } + try { + Integer.parseInt(s); + } catch (NumberFormatException e) { + return false; } return true; } @@ -1257,12 +1258,13 @@ public class NumberUtil { * @since 4.0.0 */ public static boolean isLong(String s) { - if(StrUtil.isNotBlank(s)) { - try { - Long.parseLong(s); - } catch (NumberFormatException e) { - return false; - } + if(StrUtil.isBlank(s)) { + return false; + } + try { + Long.parseLong(s); + } catch (NumberFormatException e) { + return false; } return true; } @@ -1274,15 +1276,16 @@ public class NumberUtil { * @return 是否为{@link Double}类型 */ public static boolean isDouble(String s) { - if(StrUtil.isNotBlank(s)) { - try { - Double.parseDouble(s); - return s.contains("."); - } catch (NumberFormatException ignore) { - // ignore - } + if(StrUtil.isBlank(s)) { + return false; + } + try { + Double.parseDouble(s); + return s.contains("."); + } catch (NumberFormatException ignore) { + // ignore } - return false; + return true; } /** diff --git a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java index 1dd645aa99..4368ada2f4 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java @@ -61,6 +61,9 @@ public class NumberUtilTest { Assert.assertTrue(NumberUtil.isInteger("0256")); Assert.assertTrue(NumberUtil.isInteger("0")); Assert.assertFalse(NumberUtil.isInteger("23.4")); + Assert.assertFalse(NumberUtil.isInteger(null)); + Assert.assertFalse(NumberUtil.isInteger("")); + Assert.assertFalse(NumberUtil.isInteger(" ")); } @Test @@ -70,6 +73,9 @@ public class NumberUtilTest { Assert.assertTrue(NumberUtil.isLong("0256")); Assert.assertTrue(NumberUtil.isLong("0")); Assert.assertFalse(NumberUtil.isLong("23.4")); + Assert.assertFalse(NumberUtil.isLong(null)); + Assert.assertFalse(NumberUtil.isLong("")); + Assert.assertFalse(NumberUtil.isLong(" ")); } @Test diff --git a/hutool-extra/src/main/java/cn/hutool/extra/mail/MailAccount.java b/hutool-extra/src/main/java/cn/hutool/extra/mail/MailAccount.java index f2d3aef9a4..9ce2a41d08 100755 --- a/hutool-extra/src/main/java/cn/hutool/extra/mail/MailAccount.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/mail/MailAccount.java @@ -23,8 +23,9 @@ public class MailAccount implements Serializable { private static final String SMTP_HOST = "mail.smtp.host"; private static final String SMTP_PORT = "mail.smtp.port"; private static final String SMTP_AUTH = "mail.smtp.auth"; - private static final String SMTP_CONNECTION_TIMEOUT = "mail.smtp.connectiontimeout"; private static final String SMTP_TIMEOUT = "mail.smtp.timeout"; + private static final String SMTP_CONNECTION_TIMEOUT = "mail.smtp.connectiontimeout"; + private static final String SMTP_WRITE_TIMEOUT = "mail.smtp.writetimeout"; // SSL private static final String STARTTLS_ENABLE = "mail.smtp.starttls.enable"; @@ -121,6 +122,10 @@ public class MailAccount implements Serializable { * Socket连接超时值,单位毫秒,缺省值不超时 */ private long connectionTimeout; + /** + * Socket写出超时值,单位毫秒,缺省值不超时 + */ + private long writeTimeout; /** * 自定义的其他属性,此自定义属性会覆盖默认属性 @@ -518,6 +523,18 @@ public class MailAccount implements Serializable { return this; } + /** + * 设置Socket写出超时值,单位毫秒,缺省值不超时 + * + * @param writeTimeout Socket写出超时值,单位毫秒,缺省值不超时 + * @return this + * @since 5.8.3 + */ + public MailAccount setWriteTimeout(long writeTimeout) { + this.writeTimeout = writeTimeout; + return this; + } + /** * 获取自定义属性列表 * @@ -563,6 +580,10 @@ public class MailAccount implements Serializable { if (this.connectionTimeout > 0) { p.put(SMTP_CONNECTION_TIMEOUT, String.valueOf(this.connectionTimeout)); } + // issue#2355 + if (this.writeTimeout > 0) { + p.put(SMTP_WRITE_TIMEOUT, String.valueOf(this.writeTimeout)); + } p.put(MAIL_DEBUG, String.valueOf(this.debug)); diff --git a/hutool-extra/src/test/resources/example/mail-example.setting b/hutool-extra/src/test/resources/example/mail-example.setting index 0138ec4f2a..94784ec03f 100644 --- a/hutool-extra/src/test/resources/example/mail-example.setting +++ b/hutool-extra/src/test/resources/example/mail-example.setting @@ -37,4 +37,6 @@ splitlongparameters = false # SMTP超时时长,单位毫秒,缺省值不超时 timeout = 0 # Socket连接超时值,单位毫秒,缺省值不超时 -connectionTimeout = 0 \ No newline at end of file +connectionTimeout = 0 +# Socket写出超时值,单位毫秒,缺省值不超时 +writeTimeout = 0 -- Gitee From 6b7b2f35b88348082f881b72d70c8fb9797f368d Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 30 May 2022 17:45:37 +0800 Subject: [PATCH 0058/1737] add pptx ext name support --- CHANGELOG.md | 1 + hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java | 3 +++ 2 files changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 69bd4aa57a..c2decfb5af 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ ### 🐣新特性 * 【extra 】 mail增加writeTimeout参数支持(issue#2355@Github) +* 【core 】 FileTypeUtil增加pptx扩展名支持(issue#I5A0GO@Gitee) ### 🐞Bug修复 * 【core 】 修复NumberUtil.isXXX空判断错误(issue#2356@Github) diff --git a/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java index 95292a54f3..66ef23249c 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java @@ -190,6 +190,9 @@ public class FileTypeUtil { } else if ("docx".equalsIgnoreCase(extName)) { // issue#I47JGH typeName = "docx"; + } else if ("pptx".equalsIgnoreCase(extName)) { + // issue#I5A0GO + typeName = "pptx"; } } return typeName; -- Gitee From 811d200d30c593e4f206ecefdc69ad789062ae53 Mon Sep 17 00:00:00 2001 From: thesomeexp <49369318+thesomeexp@users.noreply.github.com> Date: Tue, 31 May 2022 15:56:22 +0800 Subject: [PATCH 0059/1737] Update DigestUtil.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改注释错字 --- .../src/main/java/cn/hutool/crypto/digest/DigestUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/digest/DigestUtil.java b/hutool-crypto/src/main/java/cn/hutool/crypto/digest/DigestUtil.java index e6c04e3051..a35191909e 100644 --- a/hutool-crypto/src/main/java/cn/hutool/crypto/digest/DigestUtil.java +++ b/hutool-crypto/src/main/java/cn/hutool/crypto/digest/DigestUtil.java @@ -332,7 +332,7 @@ public class DigestUtil { * 计算sha256摘要值,使用UTF-8编码 * * @param data 被摘要数据 - * @return MD5摘要 + * @return SHA-256摘要 * @since 3.0.8 */ public static byte[] sha256(String data) { -- Gitee From a38aea70f60dd634515ffb89f8e0b79346f9b74c Mon Sep 17 00:00:00 2001 From: majiang Date: Sat, 4 Jun 2022 11:31:31 +0800 Subject: [PATCH 0060/1737] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=94=99=E5=88=AB?= =?UTF-8?q?=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hutool/core/date/LocalDateTimeUtil.java | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java index d2f3a25abc..7088807490 100755 --- a/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java @@ -5,24 +5,11 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.StrUtil; -import java.time.DayOfWeek; -import java.time.Duration; -import java.time.Instant; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.Period; -import java.time.ZoneId; -import java.time.ZonedDateTime; +import java.time.*; import java.time.chrono.ChronoLocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; -import java.time.temporal.ChronoField; -import java.time.temporal.ChronoUnit; -import java.time.temporal.Temporal; -import java.time.temporal.TemporalAccessor; -import java.time.temporal.TemporalUnit; -import java.time.temporal.WeekFields; +import java.time.temporal.*; import java.util.Date; import java.util.TimeZone; @@ -30,7 +17,7 @@ import java.util.TimeZone; * JDK8+中的{@link LocalDateTime} 工具类封装 * * @author looly - * @see DateUtil java7和一下版本,使用Date工具类 + * @see DateUtil java7和以下版本,使用Date工具类 * @see DatePattern 常用格式工具类 * @since 5.3.9 */ -- Gitee From 106361abd9a8b670586db215569ac6677ad6892f Mon Sep 17 00:00:00 2001 From: majiang Date: Sat, 4 Jun 2022 11:31:55 +0800 Subject: [PATCH 0061/1737] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E6=97=B6=E5=8C=BA=E7=9A=84=E7=9B=B8=E5=85=B3=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/date/DateUtil.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java index 6fd4c42305..553fe869cd 100755 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java @@ -18,6 +18,7 @@ import java.text.SimpleDateFormat; import java.time.Instant; import java.time.LocalDateTime; import java.time.Year; +import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAccessor; import java.util.*; @@ -2100,6 +2101,45 @@ public class DateUtil extends CalendarUtil { return LocalDateTimeUtil.of(date); } + /** + * {@link Date} 转换时区 + * + * @param date {@link Date} + * @param zoneId{@link zoneId} + * @return {@link DateTime} + * @see DateTime(Date,ZoneId) + * @since 5.0.5 + */ + public static DateTime convertTimeZone(Date date, String zoneId) { + return new DateTime(date, ZoneUtil.toTimeZone(ZoneId.of(zoneId))); + } + + /** + * {@link Date} 转换时区 + * + * @param date {@link Date} + * @param zoneId{@link zoneId} + * @return {@link DateTime} + * @see DateTime(Date, ZoneId ) + * @since 5.0.5 + */ + public static DateTime convertTimeZone(Date date, ZoneId zoneId) { + return new DateTime(date, ZoneUtil.toTimeZone(zoneId)); + } + + /** + * {@link Date} 转换时区 + * + * @param date {@link Date} + * @param timeZone{@link timeZone} + * @return {@link DateTime} + * @see DateTime(Date,ZoneId) + * @since 5.0.5 + */ + public static DateTime convertTimeZone(Date date, TimeZone timeZone) { + return new DateTime(date, timeZone); + } + /** * 获得指定年份的总天数 * -- Gitee From 78b6c9909ea017618198ae1b07665260abbd66db Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 5 Jun 2022 23:40:34 +0800 Subject: [PATCH 0062/1737] fix null bug --- CHANGELOG.md | 3 ++- .../java/cn/hutool/core/convert/Convert.java | 15 +++++++++------ .../java/cn/hutool/core/date/DateUtil.java | 19 +++---------------- .../cn/hutool/core/convert/ConvertTest.java | 12 ++++++++++++ 4 files changed, 26 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2decfb5af..78412988d2 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,13 +3,14 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.3.M1 (2022-05-30) +# 5.8.3.M1 (2022-06-05) ### 🐣新特性 * 【extra 】 mail增加writeTimeout参数支持(issue#2355@Github) * 【core 】 FileTypeUtil增加pptx扩展名支持(issue#I5A0GO@Gitee) ### 🐞Bug修复 * 【core 】 修复NumberUtil.isXXX空判断错误(issue#2356@Github) +* 【core 】 修复Convert.toSBC空指针问题(issue#I5APKK@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/Convert.java b/hutool-core/src/main/java/cn/hutool/core/convert/Convert.java index 4d00a1ca8d..a7ca4babb9 100755 --- a/hutool-core/src/main/java/cn/hutool/core/convert/Convert.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/Convert.java @@ -754,23 +754,26 @@ public class Convert { // ----------------------------------------------------------------------- 全角半角转换 /** - * 半角转全角 + * 半角转全角,{@code null}返回{@code null} * * @param input String. - * @return 全角字符串. + * @return 全角字符串,{@code null}返回{@code null} */ public static String toSBC(String input) { return toSBC(input, null); } /** - * 半角转全角 + * 半角转全角,{@code null}返回{@code null} * * @param input String * @param notConvertSet 不替换的字符集合 - * @return 全角字符串. + * @return 全角字符串,{@code null}返回{@code null} */ public static String toSBC(String input, Set notConvertSet) { + if(StrUtil.isEmpty(input)){ + return input; + } final char[] c = input.toCharArray(); for (int i = 0; i < c.length; i++) { if (null != notConvertSet && notConvertSet.contains(c[i])) { @@ -1096,7 +1099,7 @@ public class Convert { /** * long转byte数组
* 默认以小端序转换
- * from: https://stackoverflow.com/questions/4485128/how-do-i-convert-long-to-byte-and-back-in-java + * from: https://stackoverflow.com/questions/4485128/how-do-i-convert-long-to-byte-and-back-in-java * * @param longValue long值 * @return byte数组 @@ -1109,7 +1112,7 @@ public class Convert { /** * byte数组转long
* 默认以小端序转换
- * from: https://stackoverflow.com/questions/4485128/how-do-i-convert-long-to-byte-and-back-in-java + * from: https://stackoverflow.com/questions/4485128/how-do-i-convert-long-to-byte-and-back-in-java * * @param bytes byte数组 * @return long值 diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java index 553fe869cd..de910dc301 100755 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java @@ -1338,7 +1338,7 @@ public class DateUtil extends CalendarUtil { return offset(date, DateField.HOUR_OF_DAY, offset); } - /** + /**w * 偏移天 * * @param date 日期 @@ -2101,19 +2101,6 @@ public class DateUtil extends CalendarUtil { return LocalDateTimeUtil.of(date); } - /** - * {@link Date} 转换时区 - * - * @param date {@link Date} - * @param zoneId{@link zoneId} - * @return {@link DateTime} - * @see DateTime(Date,ZoneId) - * @since 5.0.5 - */ - public static DateTime convertTimeZone(Date date, String zoneId) { - return new DateTime(date, ZoneUtil.toTimeZone(ZoneId.of(zoneId))); - } - /** * {@link Date} 转换时区 * @@ -2121,7 +2108,7 @@ public class DateUtil extends CalendarUtil { * @param zoneId{@link zoneId} * @return {@link DateTime} * @see DateTime(Date, ZoneId ) - * @since 5.0.5 + * @since 5.8.3 */ public static DateTime convertTimeZone(Date date, ZoneId zoneId) { return new DateTime(date, ZoneUtil.toTimeZone(zoneId)); @@ -2134,7 +2121,7 @@ public class DateUtil extends CalendarUtil { * @param timeZone{@link timeZone} * @return {@link DateTime} * @see DateTime(Date,ZoneId) - * @since 5.0.5 + * @since 5.8.3 */ public static DateTime convertTimeZone(Date date, TimeZone timeZone) { return new DateTime(date, timeZone); diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java index 89ab9421f2..0475408884 100755 --- a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java @@ -392,4 +392,16 @@ public class ConvertTest { final LocalDate convert = Convert.convert(LocalDate.class, localDateTime); Assert.assertEquals(localDateTime.toLocalDate(), convert); } + + @Test + public void toSBCTest(){ + final String s = Convert.toSBC(null); + Assert.assertNull(s); + } + + @Test + public void toDBCTest(){ + final String s = Convert.toDBC(null); + Assert.assertNull(s); + } } -- Gitee From bd7d0881787ec2721827bb30a726d1cca719cf25 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 6 Jun 2022 00:38:48 +0800 Subject: [PATCH 0063/1737] fix json bug --- CHANGELOG.md | 3 ++- .../core/convert/impl/ArrayConverter.java | 11 ++++++++++ .../main/java/cn/hutool/core/img/ImgUtil.java | 2 +- hutool-json/src/test/java/Issue2365Test.java | 21 +++++++++++++++++++ 4 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 hutool-json/src/test/java/Issue2365Test.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 78412988d2..0e4e67f09e 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.3.M1 (2022-06-05) +# 5.8.3.M1 (2022-06-06) ### 🐣新特性 * 【extra 】 mail增加writeTimeout参数支持(issue#2355@Github) @@ -11,6 +11,7 @@ ### 🐞Bug修复 * 【core 】 修复NumberUtil.isXXX空判断错误(issue#2356@Github) * 【core 】 修复Convert.toSBC空指针问题(issue#I5APKK@Gitee) +* 【json 】 修复Bean中存在bytes,无法转换问题(issue#2365@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/ArrayConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/ArrayConverter.java index ae4d72fe28..99cf27b2da 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/ArrayConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/ArrayConverter.java @@ -1,5 +1,6 @@ package cn.hutool.core.convert.impl; +import cn.hutool.core.codec.Base64; import cn.hutool.core.collection.IterUtil; import cn.hutool.core.convert.AbstractConverter; import cn.hutool.core.convert.Convert; @@ -124,6 +125,16 @@ public class ArrayConverter extends AbstractConverter { return convertArrayToArray(value.toString().toCharArray()); } + //issue#2365 + // 字符串转bytes,首先判断是否为Base64,是则转换,否则按照默认getBytes方法。 + if(targetComponentType == byte.class){ + final String str = value.toString(); + if(Base64.isBase64(str)){ + return Base64.decode(value.toString()); + } + return str.getBytes(); + } + // 单纯字符串情况下按照逗号分隔后劈开 final String[] strings = StrUtil.splitToArray(value.toString(), CharUtil.COMMA); return convertArrayToArray(strings); diff --git a/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java b/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java index 7fc0196756..a13290c260 100755 --- a/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java @@ -1046,7 +1046,7 @@ public class ImgUtil { /** * 旋转图片为指定角度
- * 来自:http://blog.51cto.com/cping1982/130066 + * 来自:http://blog.51cto.com/cping1982/130066 * * @param image 目标图像 * @param degree 旋转角度 diff --git a/hutool-json/src/test/java/Issue2365Test.java b/hutool-json/src/test/java/Issue2365Test.java new file mode 100644 index 0000000000..f3d0aafaad --- /dev/null +++ b/hutool-json/src/test/java/Issue2365Test.java @@ -0,0 +1,21 @@ +import cn.hutool.json.JSONUtil; +import lombok.Data; +import org.junit.Assert; +import org.junit.Test; + +public class Issue2365Test { + + @Test + public void toBeanTest(){ + String jsonStr = "{\"fileName\":\"aaa\",\"fileBytes\":\"AQ==\"}"; + final FileInfo fileInfo = JSONUtil.toBean(jsonStr, FileInfo.class); + Assert.assertEquals("aaa", fileInfo.getFileName()); + Assert.assertArrayEquals(new byte[]{1}, fileInfo.getFileBytes()); + } + + @Data + public static class FileInfo { + private String fileName; + private byte[] fileBytes; + } +} -- Gitee From 1c6bdf67e05fda310fc948c2a7e477deadf1646f Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 6 Jun 2022 01:27:16 +0800 Subject: [PATCH 0064/1737] fix bug --- CHANGELOG.md | 1 + .../src/main/java/cn/hutool/core/util/ArrayUtil.java | 7 +++++++ .../src/test/java/cn/hutool/core/util/ArrayUtilTest.java | 7 +++++++ 3 files changed, 15 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e4e67f09e..49a273fc95 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ * 【core 】 修复NumberUtil.isXXX空判断错误(issue#2356@Github) * 【core 】 修复Convert.toSBC空指针问题(issue#I5APKK@Gitee) * 【json 】 修复Bean中存在bytes,无法转换问题(issue#2365@Github) +* 【core 】 ArrayUtil.setOrAppend()传入空数组时,抛出异常(issue#I5APJE@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java index 9e535b6681..b8c273e80e 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java @@ -347,6 +347,13 @@ public class ArrayUtil extends PrimitiveArrayUtil { Array.set(buffer, index, value); return buffer; } else { + if(ArrayUtil.isEmpty(buffer)){ + // issue#I5APJE + // 可变长类型在buffer为空的情况下,类型会被擦除,导致报错,此处修正 + final T[] values = newArray(value.getClass(), 1); + values[0] = value; + return append(buffer, values); + } return append(buffer, value); } } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java index de3f0d9119..f0dc8a0294 100755 --- a/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java @@ -527,4 +527,11 @@ public class ArrayUtilTest { result = ArrayUtil.replace(g, 0, h); Assert.assertArrayEquals(g, result); } + + @Test + public void setOrAppendTest(){ + String[] arr = new String[0]; + String[] newArr = ArrayUtil.setOrAppend(arr, 0, "Good");// ClassCastException + Assert.assertArrayEquals(new String[]{"Good"}, newArr); + } } -- Gitee From 6f1a8d4214f9c06b7ebd6b570c63ec6c9e4cb52c Mon Sep 17 00:00:00 2001 From: huangzhiquan <6498754713@qq.com> Date: Tue, 7 Jun 2022 09:36:33 +0800 Subject: [PATCH 0065/1737] =?UTF-8?q?fix:=201.HttpBase=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=8E=B7=E5=8F=96bodyBytes=E5=82=A8=E5=AD=98=E4=B8=BB=E4=BD=93?= =?UTF-8?q?=E6=96=B9=E6=B3=95=EF=BC=88=E4=BF=AE=E5=A4=8D=E4=BD=BF=E7=94=A8?= =?UTF-8?q?HttpRequest=E6=8B=A6=E6=88=AA=E5=99=A8=E6=97=B6=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E8=8E=B7=E5=8F=96=E5=88=B0bodyBytes=E4=B8=BB=E4=BD=93?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hutool-http/src/main/java/cn/hutool/http/HttpBase.java | 9 +++++++++ .../src/main/java/cn/hutool/http/HttpResponse.java | 1 + 2 files changed, 10 insertions(+) diff --git a/hutool-http/src/main/java/cn/hutool/http/HttpBase.java b/hutool-http/src/main/java/cn/hutool/http/HttpBase.java index 8b3ebe4418..743d51a235 100644 --- a/hutool-http/src/main/java/cn/hutool/http/HttpBase.java +++ b/hutool-http/src/main/java/cn/hutool/http/HttpBase.java @@ -297,6 +297,15 @@ public abstract class HttpBase { return (T) this; } + /** + * 获取bodyBytes存储字节码 + * + * @return byte[] + */ + public byte[] bodyBytes() { + return this.bodyBytes; + } + /** * 返回字符集 * diff --git a/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java b/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java index 9bbeff7c3b..21f018f2b3 100755 --- a/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java +++ b/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java @@ -249,6 +249,7 @@ public class HttpResponse extends HttpBase implements Closeable { * * @return byte[] */ + @Override public byte[] bodyBytes() { sync(); return this.bodyBytes; -- Gitee From 1d10e758f4664f1cfb6984a8a50cdd6f0c6057a7 Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 8 Jun 2022 16:02:11 +0800 Subject: [PATCH 0066/1737] fix --- CHANGELOG.md | 3 ++- .../src/main/java/cn/hutool/core/collection/IterUtil.java | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2decfb5af..55a20bbe5d 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,11 +3,12 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.3.M1 (2022-05-30) +# 5.8.3.M1 (2022-06-08) ### 🐣新特性 * 【extra 】 mail增加writeTimeout参数支持(issue#2355@Github) * 【core 】 FileTypeUtil增加pptx扩展名支持(issue#I5A0GO@Gitee) +* 【core 】 IterUtil.get增加判空(issue#I5B12A@Gitee) ### 🐞Bug修复 * 【core 】 修复NumberUtil.isXXX空判断错误(issue#2356@Github) diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java index dd0445e653..b7db3b13fd 100755 --- a/hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java @@ -553,6 +553,9 @@ public class IterUtil { * @since 5.8.0 */ public static E get(final Iterator iterator, int index) throws IndexOutOfBoundsException { + if(null == iterator){ + return null; + } Assert.isTrue(index >= 0, "[index] must be >= 0"); while (iterator.hasNext()) { index--; -- Gitee From dd0fac8889b99382a1586aaa7c3c22805c1a660c Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 9 Jun 2022 12:09:12 +0800 Subject: [PATCH 0067/1737] add webp support --- CHANGELOG.md | 3 +- .../java/cn/hutool/core/io/FileTypeUtil.java | 2 ++ .../cn/hutool/core/io/FileTypeUtilTest.java | 10 +++++++ .../main/java/cn/hutool/system/JavaInfo.java | 29 +++++++++---------- 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 44a48793b3..ac2ad4998a 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,12 +3,13 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.3.M1 (2022-06-08) +# 5.8.3.M1 (2022-06-09) ### 🐣新特性 * 【extra 】 mail增加writeTimeout参数支持(issue#2355@Github) * 【core 】 FileTypeUtil增加pptx扩展名支持(issue#I5A0GO@Gitee) * 【core 】 IterUtil.get增加判空(issue#I5B12A@Gitee) +* 【core 】 FileTypeUtil增加webp类型判断(issue#I5BGTF@Gitee) ### 🐞Bug修复 * 【core 】 修复NumberUtil.isXXX空判断错误(issue#2356@Github) * 【core 】 修复Convert.toSBC空指针问题(issue#I5APKK@Gitee) diff --git a/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java index 66ef23249c..95736387aa 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java @@ -83,6 +83,8 @@ public class FileTypeUtil { FILE_TYPE_MAP.put("AC9EBD8F", "qdf"); // Quicken (qdf) FILE_TYPE_MAP.put("E3828596", "pwl"); // Windows Password (pwl) FILE_TYPE_MAP.put("2E7261FD", "ram"); // Real Audio (ram) + // https://stackoverflow.com/questions/45321665/magic-number-for-google-image-format + FILE_TYPE_MAP.put("52494646", "webp"); } /** diff --git a/hutool-core/src/test/java/cn/hutool/core/io/FileTypeUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/io/FileTypeUtilTest.java index 4ea9bddb65..05703204d4 100755 --- a/hutool-core/src/test/java/cn/hutool/core/io/FileTypeUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/io/FileTypeUtilTest.java @@ -75,4 +75,14 @@ public class FileTypeUtilTest { inputStream.reset(); } + @Test + @Ignore + public void webpTest(){ + // https://gitee.com/dromara/hutool/issues/I5BGTF + final File file = FileUtil.file("d:/test/a.webp"); + final BufferedInputStream inputStream = FileUtil.getInputStream(file); + final String type = FileTypeUtil.getType(inputStream); + Console.log(type); + } + } diff --git a/hutool-system/src/main/java/cn/hutool/system/JavaInfo.java b/hutool-system/src/main/java/cn/hutool/system/JavaInfo.java index 34a91e38ac..0ea8a2027f 100755 --- a/hutool-system/src/main/java/cn/hutool/system/JavaInfo.java +++ b/hutool-system/src/main/java/cn/hutool/system/JavaInfo.java @@ -17,14 +17,6 @@ public class JavaInfo implements Serializable { private final String JAVA_VENDOR = SystemUtil.get("java.vendor", false); private final String JAVA_VENDOR_URL = SystemUtil.get("java.vendor.url", false); - // 1.1--1.3能否识别? - private final boolean IS_JAVA_1_1 = getJavaVersionMatches("1.1"); - private final boolean IS_JAVA_1_2 = getJavaVersionMatches("1.2"); - private final boolean IS_JAVA_1_3 = getJavaVersionMatches("1.3"); - private final boolean IS_JAVA_1_4 = getJavaVersionMatches("1.4"); - private final boolean IS_JAVA_1_5 = getJavaVersionMatches("1.5"); - private final boolean IS_JAVA_1_6 = getJavaVersionMatches("1.6"); - private final boolean IS_JAVA_1_7 = getJavaVersionMatches("1.7"); private final boolean IS_JAVA_1_8 = getJavaVersionMatches("1.8"); private final boolean IS_JAVA_9 = getJavaVersionMatches("9"); private final boolean IS_JAVA_10 = getJavaVersionMatches("10"); @@ -161,8 +153,9 @@ public class JavaInfo implements Serializable { * * @return 如果当前Java版本为1.1,则返回{@code true} */ + @Deprecated public final boolean isJava1_1() { - return IS_JAVA_1_1; + return false; } /** @@ -173,8 +166,9 @@ public class JavaInfo implements Serializable { * * @return 如果当前Java版本为1.2,则返回{@code true} */ + @Deprecated public final boolean isJava1_2() { - return IS_JAVA_1_2; + return false; } /** @@ -185,8 +179,9 @@ public class JavaInfo implements Serializable { * * @return 如果当前Java版本为1.3,则返回{@code true} */ + @Deprecated public final boolean isJava1_3() { - return IS_JAVA_1_3; + return false; } /** @@ -197,8 +192,9 @@ public class JavaInfo implements Serializable { * * @return 如果当前Java版本为1.4,则返回{@code true} */ + @Deprecated public final boolean isJava1_4() { - return IS_JAVA_1_4; + return false; } /** @@ -209,8 +205,9 @@ public class JavaInfo implements Serializable { * * @return 如果当前Java版本为1.5,则返回{@code true} */ + @Deprecated public final boolean isJava1_5() { - return IS_JAVA_1_5; + return false; } /** @@ -221,8 +218,9 @@ public class JavaInfo implements Serializable { * * @return 如果当前Java版本为1.6,则返回{@code true} */ + @Deprecated public final boolean isJava1_6() { - return IS_JAVA_1_6; + return false; } /** @@ -233,8 +231,9 @@ public class JavaInfo implements Serializable { * * @return 如果当前Java版本为1.7,则返回{@code true} */ + @Deprecated public final boolean isJava1_7() { - return IS_JAVA_1_7; + return false; } /** -- Gitee From ea7716a5176ef81d95e2454e2a3e46c9a7c2f0f7 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 10 Jun 2022 08:45:55 +0800 Subject: [PATCH 0068/1737] add check null --- CHANGELOG.md | 1 + .../src/main/java/cn/hutool/extra/ssh/JschSessionPool.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac2ad4998a..41575df27b 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ * 【core 】 修复Convert.toSBC空指针问题(issue#I5APKK@Gitee) * 【json 】 修复Bean中存在bytes,无法转换问题(issue#2365@Github) * 【core 】 ArrayUtil.setOrAppend()传入空数组时,抛出异常(issue#I5APJE@Gitee) +* 【extra 】 JschSessionPool修复空指针检查问题(issue#I5BK4D@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschSessionPool.java b/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschSessionPool.java index 164b7824f8..28afa9e529 100755 --- a/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschSessionPool.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschSessionPool.java @@ -42,7 +42,7 @@ public enum JschSessionPool { */ public Session getSession(String sshHost, int sshPort, String sshUser, String sshPass) { final String key = StrUtil.format("{}@{}:{}", sshUser, sshHost, sshPort); - return this.cache.get(key, Session::isConnected, ()-> JschUtil.openSession(sshHost, sshPort, sshUser, sshPass)); + return this.cache.get(key, (conn)->null != conn && conn.isConnected(), ()-> JschUtil.openSession(sshHost, sshPort, sshUser, sshPass)); } /** @@ -57,7 +57,7 @@ public enum JschSessionPool { */ public Session getSession(String sshHost, int sshPort, String sshUser, String prvkey, byte[] passphrase) { final String key = StrUtil.format("{}@{}:{}", sshUser, sshHost, sshPort); - return this.cache.get(key, Session::isConnected, ()->JschUtil.openSession(sshHost, sshPort, sshUser, prvkey, passphrase)); + return this.cache.get(key, (conn)->null != conn && conn.isConnected(), ()->JschUtil.openSession(sshHost, sshPort, sshUser, prvkey, passphrase)); } /** -- Gitee From 16dfcf315488832510a09dc5053892eca1795502 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 10 Jun 2022 09:00:30 +0800 Subject: [PATCH 0069/1737] fix null --- .../src/main/java/cn/hutool/core/lang/SimpleCache.java | 2 +- .../src/main/java/cn/hutool/extra/ssh/JschSessionPool.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/SimpleCache.java b/hutool-core/src/main/java/cn/hutool/core/lang/SimpleCache.java index 5bef6a15f8..332723c7b7 100755 --- a/hutool-core/src/main/java/cn/hutool/core/lang/SimpleCache.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/SimpleCache.java @@ -96,7 +96,7 @@ public class SimpleCache implements Iterable>, Serializabl */ public V get(K key, Predicate validPredicate, Func0 supplier) { V v = get(key); - if((null != validPredicate && false == validPredicate.test(v))){ + if((null != validPredicate && null != v && false == validPredicate.test(v))){ v = null; } if (null == v && null != supplier) { diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschSessionPool.java b/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschSessionPool.java index 28afa9e529..164b7824f8 100755 --- a/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschSessionPool.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschSessionPool.java @@ -42,7 +42,7 @@ public enum JschSessionPool { */ public Session getSession(String sshHost, int sshPort, String sshUser, String sshPass) { final String key = StrUtil.format("{}@{}:{}", sshUser, sshHost, sshPort); - return this.cache.get(key, (conn)->null != conn && conn.isConnected(), ()-> JschUtil.openSession(sshHost, sshPort, sshUser, sshPass)); + return this.cache.get(key, Session::isConnected, ()-> JschUtil.openSession(sshHost, sshPort, sshUser, sshPass)); } /** @@ -57,7 +57,7 @@ public enum JschSessionPool { */ public Session getSession(String sshHost, int sshPort, String sshUser, String prvkey, byte[] passphrase) { final String key = StrUtil.format("{}@{}:{}", sshUser, sshHost, sshPort); - return this.cache.get(key, (conn)->null != conn && conn.isConnected(), ()->JschUtil.openSession(sshHost, sshPort, sshUser, prvkey, passphrase)); + return this.cache.get(key, Session::isConnected, ()->JschUtil.openSession(sshHost, sshPort, sshUser, prvkey, passphrase)); } /** -- Gitee From 54420d842930f99aa61bdcb252ccb75aae366a93 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 10 Jun 2022 22:06:39 +0800 Subject: [PATCH 0070/1737] fix bug --- CHANGELOG.md | 3 ++- .../core/bean/copier/BeanToMapCopier.java | 2 +- .../hutool/core/bean/copier/CopyOptions.java | 6 +++-- .../core/bean/copier/MapToBeanCopier.java | 2 +- .../copier/ValueProviderToBeanCopier.java | 5 ++++ .../cn/hutool/core/bean/BeanUtilTest.java | 25 +++++++++++++++++++ 6 files changed, 38 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 41575df27b..cc743043a2 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.3.M1 (2022-06-09) +# 5.8.3 (2022-06-10) ### 🐣新特性 * 【extra 】 mail增加writeTimeout参数支持(issue#2355@Github) @@ -16,6 +16,7 @@ * 【json 】 修复Bean中存在bytes,无法转换问题(issue#2365@Github) * 【core 】 ArrayUtil.setOrAppend()传入空数组时,抛出异常(issue#I5APJE@Gitee) * 【extra 】 JschSessionPool修复空指针检查问题(issue#I5BK4D@Gitee) +* 【core 】 修复使用ValueProvider中setFieldMapping无效问题(issue#I5B4R7@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanToMapCopier.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanToMapCopier.java index 36a6d1f4b6..441d40a28f 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanToMapCopier.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanToMapCopier.java @@ -25,7 +25,7 @@ public class BeanToMapCopier extends AbsCopier { * 构造 * * @param source 来源Map - * @param target 目标Bean对象 + * @param target 目标Map对象 * @param targetType 目标泛型类型 * @param copyOptions 拷贝选项 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java index 2a48a38fb3..85b6d216b7 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java @@ -229,7 +229,8 @@ public class CopyOptions implements Serializable { } /** - * 设置拷贝属性的字段映射,用于不同的属性之前拷贝做对应表用 + * 设置拷贝属性的字段映射,用于不同的属性之前拷贝做对应表用
+ * 需要注意的是,当使用ValueProvider作为数据提供者时,这个映射是相反的,即fieldMapping中key为目标Bean的名称,而value是提供者中的key * * @param fieldMapping 拷贝属性的字段映射,用于不同的属性之前拷贝做对应表用 * @return CopyOptions @@ -241,7 +242,8 @@ public class CopyOptions implements Serializable { /** * 设置字段属性编辑器,用于自定义属性转换规则,例如驼峰转下划线等
* 此转换器只针对源端的字段做转换,请确认转换后与目标端字段一致
- * 当转换后的字段名为null时忽略这个字段 + * 当转换后的字段名为null时忽略这个字段
+ * 需要注意的是,当使用ValueProvider作为数据提供者时,这个映射是相反的,即fieldMapping中key为目标Bean的名称,而value是提供者中的key * * @param fieldNameEditor 字段属性编辑器,用于自定义属性转换规则,例如驼峰转下划线等 * @return CopyOptions diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/MapToBeanCopier.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/MapToBeanCopier.java index 349bf7d6cf..df9bdbf4b5 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/copier/MapToBeanCopier.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/MapToBeanCopier.java @@ -68,7 +68,7 @@ public class MapToBeanCopier extends AbsCopier, T> { } // 检查目标字段可写性 - PropDesc tDesc = findPropDesc(targetPropDescMap, sKeyStr); + final PropDesc tDesc = findPropDesc(targetPropDescMap, sKeyStr); if (null == tDesc || false == tDesc.isWritable(this.copyOptions.transientSupport)) { // 字段不可写,跳过之 return; diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/ValueProviderToBeanCopier.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/ValueProviderToBeanCopier.java index f2bc0f7562..35230db3c7 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/copier/ValueProviderToBeanCopier.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/ValueProviderToBeanCopier.java @@ -49,6 +49,11 @@ public class ValueProviderToBeanCopier extends AbsCopier filedMap= new HashMap<>(); + filedMap.put("name", "sourceId"); + copyOptions.setFieldMapping(filedMap); + TestPojo pojo = BeanUtil.toBean(TestPojo.class, new ValueProvider() { + final HashMap map = new HashMap<>(); + { + map.put("sourceId", "123"); + } + @Override + public Object value(String key, Type valueType) { + return map.get(key); + } + + @Override + public boolean containsKey(String key) { + return map.containsKey(key); + } + }, copyOptions); + Assert.assertEquals("123", pojo.getName()); + } } -- Gitee From d0ff3ab07bedf205a1ee327a7f3b4021bd468256 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 10 Jun 2022 22:57:15 +0800 Subject: [PATCH 0071/1737] fix bu --- CHANGELOG.md | 1 + .../java/cn/hutool/json/ObjectMapper.java | 10 +++++++++- .../{ => cn/hutool/json}/Issue2365Test.java | 2 ++ .../java/cn/hutool/json/Issue2369Test.java | 19 +++++++++++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) rename hutool-json/src/test/java/{ => cn/hutool/json}/Issue2365Test.java (95%) create mode 100644 hutool-json/src/test/java/cn/hutool/json/Issue2369Test.java diff --git a/CHANGELOG.md b/CHANGELOG.md index cc743043a2..6307cc303b 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ * 【core 】 ArrayUtil.setOrAppend()传入空数组时,抛出异常(issue#I5APJE@Gitee) * 【extra 】 JschSessionPool修复空指针检查问题(issue#I5BK4D@Gitee) * 【core 】 修复使用ValueProvider中setFieldMapping无效问题(issue#I5B4R7@Gitee) +* 【json 】 修复byte[]作为JSONArray构造问题(issue#2369@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-json/src/main/java/cn/hutool/json/ObjectMapper.java b/hutool-json/src/main/java/cn/hutool/json/ObjectMapper.java index c8eeea2a15..11d53a8375 100755 --- a/hutool-json/src/main/java/cn/hutool/json/ObjectMapper.java +++ b/hutool-json/src/main/java/cn/hutool/json/ObjectMapper.java @@ -145,7 +145,15 @@ public class ObjectMapper { mapFromTokener(new JSONTokener((InputStream) source, jsonArray.getConfig()), jsonArray, filter); } else if (source instanceof byte[]) { // bytes按照JSON的二进制流对待 - mapFromTokener(new JSONTokener(IoUtil.toStream((byte[]) source), jsonArray.getConfig()), jsonArray, filter); + try{ + mapFromTokener(new JSONTokener(IoUtil.toStream((byte[]) source), jsonArray.getConfig()), jsonArray, filter); + } catch (final JSONException ignore){ + // https://github.com/dromara/hutool/issues/2369 + // 非标准的二进制流,则按照普通数组对待 + for(final byte b : (byte[]) source){ + jsonArray.add(b); + } + } } else if (source instanceof JSONTokener) { mapFromTokener((JSONTokener) source, jsonArray, filter); } else { diff --git a/hutool-json/src/test/java/Issue2365Test.java b/hutool-json/src/test/java/cn/hutool/json/Issue2365Test.java similarity index 95% rename from hutool-json/src/test/java/Issue2365Test.java rename to hutool-json/src/test/java/cn/hutool/json/Issue2365Test.java index f3d0aafaad..b4a55dee1c 100644 --- a/hutool-json/src/test/java/Issue2365Test.java +++ b/hutool-json/src/test/java/cn/hutool/json/Issue2365Test.java @@ -1,3 +1,5 @@ +package cn.hutool.json; + import cn.hutool.json.JSONUtil; import lombok.Data; import org.junit.Assert; diff --git a/hutool-json/src/test/java/cn/hutool/json/Issue2369Test.java b/hutool-json/src/test/java/cn/hutool/json/Issue2369Test.java new file mode 100644 index 0000000000..be9c1f8bdc --- /dev/null +++ b/hutool-json/src/test/java/cn/hutool/json/Issue2369Test.java @@ -0,0 +1,19 @@ +package cn.hutool.json; + +import org.junit.Assert; +import org.junit.Test; + +public class Issue2369Test { + + @Test + public void toJsonStrTest(){ + //https://github.com/dromara/hutool/issues/2369 + // byte[]数组对于JSONArray来说,即可能是一个JSON字符串的二进制流,也可能是普通数组,因此需要做双向兼容 + final byte[] bytes = {10, 11}; + final String s = JSONUtil.toJsonStr(bytes); + Assert.assertEquals("[10,11]", s); + + final Object o = JSONUtil.toBean(s, byte[].class, false); + Assert.assertArrayEquals(bytes, (byte[])o); + } +} -- Gitee From 112250e0ac654911c14488c26593a66ea9d6c7d2 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 10 Jun 2022 23:06:56 +0800 Subject: [PATCH 0072/1737] =?UTF-8?q?=F0=9F=98=98release=205.8.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README-EN.md | 6 +++--- README.md | 6 +++--- bin/version.txt | 2 +- docs/js/version.js | 2 +- hutool-all/pom.xml | 2 +- hutool-aop/pom.xml | 2 +- hutool-bloomFilter/pom.xml | 2 +- hutool-bom/pom.xml | 2 +- hutool-cache/pom.xml | 2 +- hutool-captcha/pom.xml | 2 +- hutool-core/pom.xml | 2 +- hutool-cron/pom.xml | 2 +- hutool-crypto/pom.xml | 2 +- hutool-db/pom.xml | 5 +++-- hutool-dfa/pom.xml | 2 +- hutool-extra/pom.xml | 10 +++++----- hutool-http/pom.xml | 2 +- hutool-json/pom.xml | 2 +- hutool-jwt/pom.xml | 2 +- hutool-log/pom.xml | 2 +- hutool-poi/pom.xml | 4 ++-- hutool-script/pom.xml | 4 ++-- hutool-setting/pom.xml | 2 +- hutool-socket/pom.xml | 2 +- hutool-system/pom.xml | 2 +- pom.xml | 2 +- 26 files changed, 38 insertions(+), 37 deletions(-) diff --git a/README-EN.md b/README-EN.md index 8878b78cb9..9e095a1a25 100755 --- a/README-EN.md +++ b/README-EN.md @@ -144,18 +144,18 @@ We provide the T-Shirt and Sweater with Hutool Logo, please visit the shop: cn.hutool hutool-all - 5.8.3.M1 + 5.8.3 ``` ### 🍐Gradle ``` -implementation 'cn.hutool:hutool-all:5.8.3.M1' +implementation 'cn.hutool:hutool-all:5.8.3' ``` ## 📥Download -- [Maven Repo](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.3.M1/) +- [Maven Repo](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.3/) > 🔔️note: > Hutool 5.x supports JDK8+ and is not tested on Android platforms, and cannot guarantee that all tool classes or tool methods are available. diff --git a/README.md b/README.md index 41c902b3a6..92b2bf8b4f 100755 --- a/README.md +++ b/README.md @@ -144,20 +144,20 @@ Hutool的存在就是为了减少代码搜索成本,避免网络上参差不 cn.hutool hutool-all - 5.8.3.M1 + 5.8.3 ``` ### 🍐Gradle ``` -implementation 'cn.hutool:hutool-all:5.8.3.M1' +implementation 'cn.hutool:hutool-all:5.8.3' ``` ### 📥下载jar 点击以下链接,下载`hutool-all-X.X.X.jar`即可: -- [Maven中央库](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.3.M1/) +- [Maven中央库](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.3/) > 🔔️注意 > Hutool 5.x支持JDK8+,对Android平台没有测试,不能保证所有工具类或工具方法可用。 diff --git a/bin/version.txt b/bin/version.txt index e528d0bdc0..332e884712 100755 --- a/bin/version.txt +++ b/bin/version.txt @@ -1 +1 @@ -5.8.3.M1 +5.8.3 diff --git a/docs/js/version.js b/docs/js/version.js index 429f076b64..87c12e8436 100755 --- a/docs/js/version.js +++ b/docs/js/version.js @@ -1 +1 @@ -var version = '5.8.3.M1' \ No newline at end of file +var version = '5.8.3' \ No newline at end of file diff --git a/hutool-all/pom.xml b/hutool-all/pom.xml index 6d03c292fe..42db906eeb 100755 --- a/hutool-all/pom.xml +++ b/hutool-all/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3.M1 + 5.8.3 hutool-all diff --git a/hutool-aop/pom.xml b/hutool-aop/pom.xml index b76ece5235..b2960ae1c5 100755 --- a/hutool-aop/pom.xml +++ b/hutool-aop/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3.M1 + 5.8.3 hutool-aop diff --git a/hutool-bloomFilter/pom.xml b/hutool-bloomFilter/pom.xml index 46dc0ee504..785d508c27 100755 --- a/hutool-bloomFilter/pom.xml +++ b/hutool-bloomFilter/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3.M1 + 5.8.3 hutool-bloomFilter diff --git a/hutool-bom/pom.xml b/hutool-bom/pom.xml index 25a412faf4..561a2b107b 100755 --- a/hutool-bom/pom.xml +++ b/hutool-bom/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3.M1 + 5.8.3 hutool-bom diff --git a/hutool-cache/pom.xml b/hutool-cache/pom.xml index 8c3d3b1367..b484291c2d 100755 --- a/hutool-cache/pom.xml +++ b/hutool-cache/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3.M1 + 5.8.3 hutool-cache diff --git a/hutool-captcha/pom.xml b/hutool-captcha/pom.xml index 12ac2607fd..29e01f0d9a 100755 --- a/hutool-captcha/pom.xml +++ b/hutool-captcha/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3.M1 + 5.8.3 hutool-captcha diff --git a/hutool-core/pom.xml b/hutool-core/pom.xml index a77a9d1661..56624852ba 100755 --- a/hutool-core/pom.xml +++ b/hutool-core/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3.M1 + 5.8.3 hutool-core diff --git a/hutool-cron/pom.xml b/hutool-cron/pom.xml index e344329309..234e6f594a 100755 --- a/hutool-cron/pom.xml +++ b/hutool-cron/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3.M1 + 5.8.3 hutool-cron diff --git a/hutool-crypto/pom.xml b/hutool-crypto/pom.xml index 646739f852..7830a63699 100755 --- a/hutool-crypto/pom.xml +++ b/hutool-crypto/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3.M1 + 5.8.3 hutool-crypto diff --git a/hutool-db/pom.xml b/hutool-db/pom.xml index 3375d7b322..30f714f913 100755 --- a/hutool-db/pom.xml +++ b/hutool-db/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3.M1 + 5.8.3 hutool-db @@ -21,7 +21,8 @@ 0.9.5.5 2.9.0 10.0.20 - 1.2.9 + 1.2.10 + 4.0.3 4.6.0 3.36.0.3 diff --git a/hutool-dfa/pom.xml b/hutool-dfa/pom.xml index 901587426a..923612c98e 100755 --- a/hutool-dfa/pom.xml +++ b/hutool-dfa/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3.M1 + 5.8.3 hutool-dfa diff --git a/hutool-extra/pom.xml b/hutool-extra/pom.xml index 330fb556b0..c8b395438f 100755 --- a/hutool-extra/pom.xml +++ b/hutool-extra/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3.M1 + 5.8.3 hutool-extra @@ -22,16 +22,16 @@ 3.10.0.RELEASE 1.4.1 2.3.31 - 4.9.21 + 5.0.0 3.0.15.RELEASE 1.6.2 0.1.55 0.33.0 - 3.4.1 + 3.5.0 3.8.0 5.1.1 4.0.1 - 2.6.7 + 2.7.0 3.3.0 @@ -453,7 +453,7 @@ org.springframework spring-expression - 5.3.19 + 5.3.20 compile true diff --git a/hutool-http/pom.xml b/hutool-http/pom.xml index 7038558d3b..c5f2af2ea5 100755 --- a/hutool-http/pom.xml +++ b/hutool-http/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3.M1 + 5.8.3 hutool-http diff --git a/hutool-json/pom.xml b/hutool-json/pom.xml index c302902538..9b1ef9d3ed 100755 --- a/hutool-json/pom.xml +++ b/hutool-json/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3.M1 + 5.8.3 hutool-json diff --git a/hutool-jwt/pom.xml b/hutool-jwt/pom.xml index 90cebf8036..ecedc2de1b 100755 --- a/hutool-jwt/pom.xml +++ b/hutool-jwt/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3.M1 + 5.8.3 hutool-jwt diff --git a/hutool-log/pom.xml b/hutool-log/pom.xml index 0d2eab9af7..23ddb6beaf 100755 --- a/hutool-log/pom.xml +++ b/hutool-log/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3.M1 + 5.8.3 hutool-log diff --git a/hutool-poi/pom.xml b/hutool-poi/pom.xml index 325461194a..d095ae4fdb 100755 --- a/hutool-poi/pom.xml +++ b/hutool-poi/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3.M1 + 5.8.3 hutool-poi @@ -45,7 +45,7 @@ org.ofdrw ofdrw-full - 1.17.15 + 1.17.18 compile true diff --git a/hutool-script/pom.xml b/hutool-script/pom.xml index 1def508772..a9752f7406 100755 --- a/hutool-script/pom.xml +++ b/hutool-script/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3.M1 + 5.8.3 hutool-script @@ -19,7 +19,7 @@ 2.7.2 3.0.1 - 3.0.10 + 3.0.11 diff --git a/hutool-setting/pom.xml b/hutool-setting/pom.xml index 9bc5768cfd..7eeb232360 100755 --- a/hutool-setting/pom.xml +++ b/hutool-setting/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3.M1 + 5.8.3 hutool-setting diff --git a/hutool-socket/pom.xml b/hutool-socket/pom.xml index 8cda91689b..612438c161 100755 --- a/hutool-socket/pom.xml +++ b/hutool-socket/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3.M1 + 5.8.3 hutool-socket diff --git a/hutool-system/pom.xml b/hutool-system/pom.xml index 1740d4f655..c49ba69354 100755 --- a/hutool-system/pom.xml +++ b/hutool-system/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3.M1 + 5.8.3 hutool-system diff --git a/pom.xml b/pom.xml index 5ab7db7f81..19c423d37c 100755 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ cn.hutool hutool-parent - 5.8.3.M1 + 5.8.3 hutool Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。 https://github.com/dromara/hutool -- Gitee From ad3d478284dbf617f7d2d52f2376a113fb7eeda1 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 10 Jun 2022 23:12:36 +0800 Subject: [PATCH 0073/1737] fix doc --- .../main/java/cn/hutool/core/collection/CollUtil.java | 9 +++++---- .../src/main/java/cn/hutool/core/date/DateUtil.java | 6 ++---- .../src/main/java/cn/hutool/core/util/ArrayUtil.java | 1 + .../src/main/java/cn/hutool/core/util/ReflectUtil.java | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java index a764a6c4e0..079bcdc7ab 100755 --- a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java @@ -1055,10 +1055,11 @@ public class CollUtil { * 根据函数生成的KEY去重集合,如根据Bean的某个或者某些字段完成去重。
* 去重可选是保留最先加入的值还是后加入的值 * - * @param 集合元素类型 - * @param 唯一键类型 - * @param collection 集合 - * @param override 是否覆盖模式,如果为{@code true},加入的新值会覆盖相同key的旧值,否则会忽略新加值 + * @param 集合元素类型 + * @param 唯一键类型 + * @param collection 集合 + * @param uniqueGenerator 唯一键生成器 + * @param override 是否覆盖模式,如果为{@code true},加入的新值会覆盖相同key的旧值,否则会忽略新加值 * @return {@link ArrayList} * @since 5.8.0 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java index de910dc301..66a04dd25c 100755 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java @@ -2105,9 +2105,8 @@ public class DateUtil extends CalendarUtil { * {@link Date} 转换时区 * * @param date {@link Date} - * @param zoneId{@link zoneId} + * @param zoneId {@link ZoneId} * @return {@link DateTime} - * @see DateTime(Date, ZoneId ) * @since 5.8.3 */ public static DateTime convertTimeZone(Date date, ZoneId zoneId) { @@ -2118,9 +2117,8 @@ public class DateUtil extends CalendarUtil { * {@link Date} 转换时区 * * @param date {@link Date} - * @param timeZone{@link timeZone} + * @param timeZone {@link TimeZone} * @return {@link DateTime} - * @see DateTime(Date,ZoneId) * @since 5.8.3 */ public static DateTime convertTimeZone(Date date, TimeZone timeZone) { diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java index b8c273e80e..dbacd22787 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java @@ -1648,6 +1648,7 @@ public class ArrayUtil extends PrimitiveArrayUtil { * @param 数组元素类型 * @param 唯一键类型 * @param array 数组 + * @param uniqueGenerator 唯一键生成器 * @param override 是否覆盖模式,如果为{@code true},加入的新值会覆盖相同key的旧值,否则会忽略新加值 * @return 去重后的数组 * @since 5.8.0 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java index 7a4c741d4d..152370b150 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java @@ -1017,8 +1017,8 @@ public class ReflectUtil { * @param method 方法(对象方法或static方法都可) * @param args 参数对象 * @return 结果 - * @throws InvocationTargetRuntimeException 目标方法执行异常 - * @throws UtilException {@link IllegalAccessException}异常的包装 + * @throws InvocationTargetException 目标方法执行异常 + * @throws IllegalAccessException 访问异常 * @since 5.8.1 */ @SuppressWarnings("unchecked") -- Gitee From 77818aa3769acb8f440bc142858c3125f10212c3 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 10 Jun 2022 23:30:28 +0800 Subject: [PATCH 0074/1737] prepare 5.8.4 --- CHANGELOG.md | 7 +++++++ README-EN.md | 6 +++--- README.md | 6 +++--- bin/version.txt | 2 +- docs/js/version.js | 2 +- hutool-all/pom.xml | 2 +- hutool-aop/pom.xml | 2 +- hutool-bloomFilter/pom.xml | 2 +- hutool-bom/pom.xml | 2 +- hutool-cache/pom.xml | 2 +- hutool-captcha/pom.xml | 2 +- hutool-core/pom.xml | 2 +- hutool-cron/pom.xml | 2 +- hutool-crypto/pom.xml | 2 +- hutool-db/pom.xml | 2 +- hutool-dfa/pom.xml | 2 +- hutool-extra/pom.xml | 2 +- hutool-http/pom.xml | 2 +- hutool-json/pom.xml | 2 +- hutool-jwt/pom.xml | 2 +- hutool-log/pom.xml | 2 +- hutool-poi/pom.xml | 2 +- hutool-script/pom.xml | 2 +- hutool-setting/pom.xml | 2 +- hutool-socket/pom.xml | 2 +- hutool-system/pom.xml | 2 +- pom.xml | 2 +- 27 files changed, 37 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6307cc303b..b39739c9f9 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,13 @@ ------------------------------------------------------------------------------------------------------------- +# 5.8.4.M1 (2022-06-10) + +### 🐣新特性 +### 🐞Bug修复 + +------------------------------------------------------------------------------------------------------------- + # 5.8.3 (2022-06-10) ### 🐣新特性 diff --git a/README-EN.md b/README-EN.md index 9e095a1a25..1e6fb8cca5 100755 --- a/README-EN.md +++ b/README-EN.md @@ -144,18 +144,18 @@ We provide the T-Shirt and Sweater with Hutool Logo, please visit the shop: cn.hutool hutool-all - 5.8.3 + 5.8.4.M1 ``` ### 🍐Gradle ``` -implementation 'cn.hutool:hutool-all:5.8.3' +implementation 'cn.hutool:hutool-all:5.8.4.M1' ``` ## 📥Download -- [Maven Repo](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.3/) +- [Maven Repo](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.4.M1/) > 🔔️note: > Hutool 5.x supports JDK8+ and is not tested on Android platforms, and cannot guarantee that all tool classes or tool methods are available. diff --git a/README.md b/README.md index 92b2bf8b4f..48cf2d5b7b 100755 --- a/README.md +++ b/README.md @@ -144,20 +144,20 @@ Hutool的存在就是为了减少代码搜索成本,避免网络上参差不 cn.hutool hutool-all - 5.8.3 + 5.8.4.M1 ``` ### 🍐Gradle ``` -implementation 'cn.hutool:hutool-all:5.8.3' +implementation 'cn.hutool:hutool-all:5.8.4.M1' ``` ### 📥下载jar 点击以下链接,下载`hutool-all-X.X.X.jar`即可: -- [Maven中央库](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.3/) +- [Maven中央库](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.4.M1/) > 🔔️注意 > Hutool 5.x支持JDK8+,对Android平台没有测试,不能保证所有工具类或工具方法可用。 diff --git a/bin/version.txt b/bin/version.txt index 332e884712..9afaf3159a 100755 --- a/bin/version.txt +++ b/bin/version.txt @@ -1 +1 @@ -5.8.3 +5.8.4.M1 diff --git a/docs/js/version.js b/docs/js/version.js index 87c12e8436..7a2af42c60 100755 --- a/docs/js/version.js +++ b/docs/js/version.js @@ -1 +1 @@ -var version = '5.8.3' \ No newline at end of file +var version = '5.8.4.M1' \ No newline at end of file diff --git a/hutool-all/pom.xml b/hutool-all/pom.xml index 42db906eeb..429c5bb38f 100755 --- a/hutool-all/pom.xml +++ b/hutool-all/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3 + 5.8.4.M1 hutool-all diff --git a/hutool-aop/pom.xml b/hutool-aop/pom.xml index b2960ae1c5..427b7740f5 100755 --- a/hutool-aop/pom.xml +++ b/hutool-aop/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3 + 5.8.4.M1 hutool-aop diff --git a/hutool-bloomFilter/pom.xml b/hutool-bloomFilter/pom.xml index 785d508c27..461ea5095f 100755 --- a/hutool-bloomFilter/pom.xml +++ b/hutool-bloomFilter/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3 + 5.8.4.M1 hutool-bloomFilter diff --git a/hutool-bom/pom.xml b/hutool-bom/pom.xml index 561a2b107b..3d00669ba0 100755 --- a/hutool-bom/pom.xml +++ b/hutool-bom/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3 + 5.8.4.M1 hutool-bom diff --git a/hutool-cache/pom.xml b/hutool-cache/pom.xml index b484291c2d..d3021e1d47 100755 --- a/hutool-cache/pom.xml +++ b/hutool-cache/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3 + 5.8.4.M1 hutool-cache diff --git a/hutool-captcha/pom.xml b/hutool-captcha/pom.xml index 29e01f0d9a..fafe8c5de0 100755 --- a/hutool-captcha/pom.xml +++ b/hutool-captcha/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3 + 5.8.4.M1 hutool-captcha diff --git a/hutool-core/pom.xml b/hutool-core/pom.xml index 56624852ba..223ef75561 100755 --- a/hutool-core/pom.xml +++ b/hutool-core/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3 + 5.8.4.M1 hutool-core diff --git a/hutool-cron/pom.xml b/hutool-cron/pom.xml index 234e6f594a..173ab3c4c4 100755 --- a/hutool-cron/pom.xml +++ b/hutool-cron/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3 + 5.8.4.M1 hutool-cron diff --git a/hutool-crypto/pom.xml b/hutool-crypto/pom.xml index 7830a63699..7b835189bf 100755 --- a/hutool-crypto/pom.xml +++ b/hutool-crypto/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3 + 5.8.4.M1 hutool-crypto diff --git a/hutool-db/pom.xml b/hutool-db/pom.xml index 30f714f913..5eed147239 100755 --- a/hutool-db/pom.xml +++ b/hutool-db/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3 + 5.8.4.M1 hutool-db diff --git a/hutool-dfa/pom.xml b/hutool-dfa/pom.xml index 923612c98e..63581e1d2b 100755 --- a/hutool-dfa/pom.xml +++ b/hutool-dfa/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3 + 5.8.4.M1 hutool-dfa diff --git a/hutool-extra/pom.xml b/hutool-extra/pom.xml index c8b395438f..a8da9326a9 100755 --- a/hutool-extra/pom.xml +++ b/hutool-extra/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3 + 5.8.4.M1 hutool-extra diff --git a/hutool-http/pom.xml b/hutool-http/pom.xml index c5f2af2ea5..96942ea554 100755 --- a/hutool-http/pom.xml +++ b/hutool-http/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3 + 5.8.4.M1 hutool-http diff --git a/hutool-json/pom.xml b/hutool-json/pom.xml index 9b1ef9d3ed..e3c5fb36dc 100755 --- a/hutool-json/pom.xml +++ b/hutool-json/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3 + 5.8.4.M1 hutool-json diff --git a/hutool-jwt/pom.xml b/hutool-jwt/pom.xml index ecedc2de1b..69a3cdd7b2 100755 --- a/hutool-jwt/pom.xml +++ b/hutool-jwt/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3 + 5.8.4.M1 hutool-jwt diff --git a/hutool-log/pom.xml b/hutool-log/pom.xml index 23ddb6beaf..c085ac8d46 100755 --- a/hutool-log/pom.xml +++ b/hutool-log/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3 + 5.8.4.M1 hutool-log diff --git a/hutool-poi/pom.xml b/hutool-poi/pom.xml index d095ae4fdb..8c78a0520e 100755 --- a/hutool-poi/pom.xml +++ b/hutool-poi/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3 + 5.8.4.M1 hutool-poi diff --git a/hutool-script/pom.xml b/hutool-script/pom.xml index a9752f7406..cb8b0d2626 100755 --- a/hutool-script/pom.xml +++ b/hutool-script/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3 + 5.8.4.M1 hutool-script diff --git a/hutool-setting/pom.xml b/hutool-setting/pom.xml index 7eeb232360..9b7023dede 100755 --- a/hutool-setting/pom.xml +++ b/hutool-setting/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3 + 5.8.4.M1 hutool-setting diff --git a/hutool-socket/pom.xml b/hutool-socket/pom.xml index 612438c161..78082f1762 100755 --- a/hutool-socket/pom.xml +++ b/hutool-socket/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3 + 5.8.4.M1 hutool-socket diff --git a/hutool-system/pom.xml b/hutool-system/pom.xml index c49ba69354..e77f5c1eea 100755 --- a/hutool-system/pom.xml +++ b/hutool-system/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.8.3 + 5.8.4.M1 hutool-system diff --git a/pom.xml b/pom.xml index 19c423d37c..735134073a 100755 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ cn.hutool hutool-parent - 5.8.3 + 5.8.4.M1 hutool Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。 https://github.com/dromara/hutool -- Gitee From 3ab1c45228c93f34fa0e890123a6361fbd2d855f Mon Sep 17 00:00:00 2001 From: bwcx_jzy Date: Sun, 12 Jun 2022 21:20:47 +0800 Subject: [PATCH 0075/1737] sftp add refactoring method --- .../java/cn/hutool/extra/ssh/JschUtil.java | 17 +++++++- .../main/java/cn/hutool/extra/ssh/Sftp.java | 41 ++++++++++++++++++- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java index dfd14b0874..dc71bafa04 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java @@ -114,9 +114,24 @@ public class JschUtil { * @return SSH会话 */ public static Session openSession(String sshHost, int sshPort, String sshUser, String privateKeyPath, byte[] passphrase) { + return openSession(sshHost, sshPort, sshUser, privateKeyPath, passphrase, 0); + } + + /** + * 打开一个新的SSH会话 + * + * @param sshHost 主机 + * @param sshPort 端口 + * @param sshUser 用户名 + * @param privateKeyPath 私钥的路径 + * @param passphrase 私钥文件的密码,可以为null + * @param timeOut 超时时间,单位毫秒 + * @return SSH会话 + */ + public static Session openSession(String sshHost, int sshPort, String sshUser, String privateKeyPath, byte[] passphrase, int timeOut) { final Session session = createSession(sshHost, sshPort, sshUser, privateKeyPath, passphrase); try { - session.connect(); + session.connect(timeOut); } catch (JSchException e) { throw new JschRuntimeException(e); } diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java b/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java index e993b0824d..5abd5d0036 100755 --- a/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java @@ -77,8 +77,21 @@ public class Sftp extends AbstractFtp { * @since 5.3.3 */ public Sftp(FtpConfig config) { + this(config, false); + } + + /** + * 构造 + * + * @param config FTP配置 + * @param init 是否立即初始化 + * @since 5.8.4 + */ + public Sftp(FtpConfig config, boolean init) { super(config); - init(config); + if (init) { + init(config); + } } /** @@ -102,6 +115,32 @@ public class Sftp extends AbstractFtp { init(session, charset); } + /** + * 构造 + * + * @param session {@link Session} + * @param charset 编码 + * @param timeOut 超时时间,单位毫秒 + * @since 5.8.4 + */ + public Sftp(Session session, Charset charset, long timeOut) { + super(FtpConfig.create().setCharset(charset).setConnectionTimeout(timeOut)); + init(session, charset); + } + + /** + * 构造 + * + * @param channel {@link ChannelSftp} + * @param charset 编码 + * @param timeOut 超时时间,单位毫秒 + * @since 5.8.4 + */ + public Sftp(ChannelSftp channel, Charset charset, long timeOut) { + super(FtpConfig.create().setCharset(charset).setConnectionTimeout(timeOut)); + init(channel, charset); + } + /** * 构造 * -- Gitee From 9031c8958e1e9556e58419808ac61470b08e35ff Mon Sep 17 00:00:00 2001 From: bwcx_jzy Date: Sun, 12 Jun 2022 21:24:31 +0800 Subject: [PATCH 0076/1737] sftp add refactoring method --- hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java b/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java index 5abd5d0036..f755d17e04 100755 --- a/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java @@ -77,7 +77,7 @@ public class Sftp extends AbstractFtp { * @since 5.3.3 */ public Sftp(FtpConfig config) { - this(config, false); + this(config, true); } /** -- Gitee From c5ab97444193469f319187de9eef5274acccf908 Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 12 Jun 2022 21:54:33 +0800 Subject: [PATCH 0077/1737] add test and add methods --- CHANGELOG.md | 4 +++- .../java/cn/hutool/extra/ssh/JschUtil.java | 1 + .../main/java/cn/hutool/extra/ssh/Sftp.java | 2 +- .../java/cn/hutool/json/Issue2377Test.java | 23 +++++++++++++++++++ 4 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 hutool-json/src/test/java/cn/hutool/json/Issue2377Test.java diff --git a/CHANGELOG.md b/CHANGELOG.md index b39739c9f9..5a9d467930 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,9 +3,11 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.4.M1 (2022-06-10) +# 5.8.4.M1 (2022-06-12) ### 🐣新特性 +* 【extra 】 Sftp增加构造重载,支持超时(pr#653@Gitee) +* ### 🐞Bug修复 ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java index dc71bafa04..1e5daaf1f6 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java @@ -127,6 +127,7 @@ public class JschUtil { * @param passphrase 私钥文件的密码,可以为null * @param timeOut 超时时间,单位毫秒 * @return SSH会话 + * @since 5.8.4 */ public static Session openSession(String sshHost, int sshPort, String sshUser, String privateKeyPath, byte[] passphrase, int timeOut) { final Session session = createSession(sshHost, sshPort, sshUser, privateKeyPath, passphrase); diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java b/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java index f755d17e04..f66a65ecc8 100755 --- a/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java @@ -31,7 +31,7 @@ import java.util.Vector; * *

* 此类为基于jsch的SFTP实现
- * 参考:https://www.cnblogs.com/longyg/archive/2012/06/25/2556576.html + * 参考:https://www.cnblogs.com/longyg/archive/2012/06/25/2556576.html *

* * @author looly diff --git a/hutool-json/src/test/java/cn/hutool/json/Issue2377Test.java b/hutool-json/src/test/java/cn/hutool/json/Issue2377Test.java new file mode 100644 index 0000000000..a51ef9d1c4 --- /dev/null +++ b/hutool-json/src/test/java/cn/hutool/json/Issue2377Test.java @@ -0,0 +1,23 @@ +package cn.hutool.json; + +import cn.hutool.core.convert.Convert; +import org.junit.Assert; +import org.junit.Test; + +import java.util.List; + +public class Issue2377Test { + + @Test + public void bytesTest(){ + Object[] paramArray = new Object[]{ 1,new byte[]{10,11}, "报表.xlsx"}; + String paramsStr = JSONUtil.toJsonStr(paramArray); + + List paramList = JSONUtil.toList(paramsStr, Object.class); + + String paramBytesStr = JSONUtil.toJsonStr(paramList.get(1)); + + final byte[] convert = Convert.convert(byte[].class, paramBytesStr); + Assert.assertArrayEquals((byte[])paramArray[1], convert); + } +} -- Gitee From 2b7403162e7d939ff907e4da7340d7e553ccbd45 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 13 Jun 2022 21:47:05 +0800 Subject: [PATCH 0078/1737] bytes as array --- .../src/main/java/cn/hutool/json/JSONUtil.java | 7 ------- .../main/java/cn/hutool/json/ObjectMapper.java | 10 +++++----- .../cn/hutool/json/serialize/JSONWriter.java | 9 +-------- .../java/cn/hutool/json/Issue2377Test.java | 18 ++++++++++-------- .../java/cn/hutool/json/IssueI59LW4Test.java | 4 ++-- 5 files changed, 18 insertions(+), 30 deletions(-) diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java b/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java index 97715c113a..7938ed3c6d 100755 --- a/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java @@ -1,6 +1,5 @@ package cn.hutool.json; -import cn.hutool.core.codec.Base64; import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.file.FileReader; import cn.hutool.core.lang.TypeReference; @@ -785,12 +784,6 @@ public class JSONUtil { // JSONArray if (object instanceof Iterable || ArrayUtil.isArray(object)) { - if(object instanceof byte[]){ - // issue#I59LW4 - // json内容中的bytes默认转为Base64 - return Base64.encode((byte[]) object); - } - return new JSONArray(object, jsonConfig); } // JSONObject diff --git a/hutool-json/src/main/java/cn/hutool/json/ObjectMapper.java b/hutool-json/src/main/java/cn/hutool/json/ObjectMapper.java index 11d53a8375..7ae786bb7f 100755 --- a/hutool-json/src/main/java/cn/hutool/json/ObjectMapper.java +++ b/hutool-json/src/main/java/cn/hutool/json/ObjectMapper.java @@ -144,13 +144,13 @@ public class ObjectMapper { } else if (source instanceof InputStream) { mapFromTokener(new JSONTokener((InputStream) source, jsonArray.getConfig()), jsonArray, filter); } else if (source instanceof byte[]) { - // bytes按照JSON的二进制流对待 - try{ - mapFromTokener(new JSONTokener(IoUtil.toStream((byte[]) source), jsonArray.getConfig()), jsonArray, filter); - } catch (final JSONException ignore){ + final byte[] bytesSource = (byte[]) source; + if('[' == bytesSource[0] && ']' == bytesSource[bytesSource.length - 1]){ + mapFromTokener(new JSONTokener(IoUtil.toStream(bytesSource), jsonArray.getConfig()), jsonArray, filter); + }else{ // https://github.com/dromara/hutool/issues/2369 // 非标准的二进制流,则按照普通数组对待 - for(final byte b : (byte[]) source){ + for(final byte b : bytesSource){ jsonArray.add(b); } } diff --git a/hutool-json/src/main/java/cn/hutool/json/serialize/JSONWriter.java b/hutool-json/src/main/java/cn/hutool/json/serialize/JSONWriter.java index 38cce600d6..0a229b386c 100755 --- a/hutool-json/src/main/java/cn/hutool/json/serialize/JSONWriter.java +++ b/hutool-json/src/main/java/cn/hutool/json/serialize/JSONWriter.java @@ -1,6 +1,5 @@ package cn.hutool.json.serialize; -import cn.hutool.core.codec.Base64; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.TemporalAccessorUtil; @@ -226,13 +225,7 @@ public class JSONWriter extends Writer { } else if (value instanceof Map || value instanceof Map.Entry) { new JSONObject(value).write(writer, indentFactor, indent); } else if (value instanceof Iterable || value instanceof Iterator || ArrayUtil.isArray(value)) { - if(value instanceof byte[]){ - // issue#I59LW4 - // json内容中的bytes默认转为Base64 - writeStrValue(Base64.encode((byte[]) value)); - }else{ - new JSONArray(value).write(writer, indentFactor, indent); - } + new JSONArray(value).write(writer, indentFactor, indent); } else if (value instanceof Number) { writeNumberValue((Number) value); } else if (value instanceof Date || value instanceof Calendar || value instanceof TemporalAccessor) { diff --git a/hutool-json/src/test/java/cn/hutool/json/Issue2377Test.java b/hutool-json/src/test/java/cn/hutool/json/Issue2377Test.java index a51ef9d1c4..f5dc02ae1c 100644 --- a/hutool-json/src/test/java/cn/hutool/json/Issue2377Test.java +++ b/hutool-json/src/test/java/cn/hutool/json/Issue2377Test.java @@ -1,6 +1,5 @@ package cn.hutool.json; -import cn.hutool.core.convert.Convert; import org.junit.Assert; import org.junit.Test; @@ -9,15 +8,18 @@ import java.util.List; public class Issue2377Test { @Test - public void bytesTest(){ - Object[] paramArray = new Object[]{ 1,new byte[]{10,11}, "报表.xlsx"}; - String paramsStr = JSONUtil.toJsonStr(paramArray); + public void bytesTest() { + final Object[] paramArray = new Object[]{1, new byte[]{10, 11}, "报表.xlsx"}; + final String paramsStr = JSONUtil.toJsonStr(paramArray); + Assert.assertEquals("[1,[10,11],\"报表.xlsx\"]", paramsStr); - List paramList = JSONUtil.toList(paramsStr, Object.class); + final List paramList = JSONUtil.toList(paramsStr, Object.class); - String paramBytesStr = JSONUtil.toJsonStr(paramList.get(1)); + final String paramBytesStr = JSONUtil.toJsonStr(paramList.get(1)); + Assert.assertEquals("[10,11]", paramBytesStr); - final byte[] convert = Convert.convert(byte[].class, paramBytesStr); - Assert.assertArrayEquals((byte[])paramArray[1], convert); + final byte[] paramBytes = JSONUtil.toBean(paramBytesStr, byte[].class, false); + Assert.assertArrayEquals((byte[]) paramArray[1], paramBytes); } + } diff --git a/hutool-json/src/test/java/cn/hutool/json/IssueI59LW4Test.java b/hutool-json/src/test/java/cn/hutool/json/IssueI59LW4Test.java index 7425821fd9..6f8401f629 100644 --- a/hutool-json/src/test/java/cn/hutool/json/IssueI59LW4Test.java +++ b/hutool-json/src/test/java/cn/hutool/json/IssueI59LW4Test.java @@ -8,7 +8,7 @@ public class IssueI59LW4Test { @Test public void bytesTest(){ final JSONObject jsonObject = JSONUtil.createObj().set("bytes", new byte[]{1}); - Assert.assertEquals("{\"bytes\":\"AQ==\"}", jsonObject.toString()); + Assert.assertEquals("{\"bytes\":[1]}", jsonObject.toString()); final byte[] bytes = jsonObject.getBytes("bytes"); Assert.assertArrayEquals(new byte[]{1}, bytes); @@ -17,7 +17,7 @@ public class IssueI59LW4Test { @Test public void bytesInJSONArrayTest(){ final JSONArray jsonArray = JSONUtil.createArray().set(new byte[]{1}); - Assert.assertEquals("[\"AQ==\"]", jsonArray.toString()); + Assert.assertEquals("[[1]]", jsonArray.toString()); final byte[] bytes = jsonArray.getBytes(0); Assert.assertArrayEquals(new byte[]{1}, bytes); -- Gitee From b1a93a3345e72c97837aa7947f01ddaa56b4a63e Mon Sep 17 00:00:00 2001 From: Takaki <87449034@qq.com> Date: Tue, 14 Jun 2022 11:21:08 +0800 Subject: [PATCH 0079/1737] enhancement in BeanUtil --- .../java/cn/hutool/core/bean/BeanUtil.java | 45 +++++++++++++--- .../cn/hutool/core/bean/BeanUtilTest.java | 53 +++++++++++++++++-- 2 files changed, 87 insertions(+), 11 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java index 401f1ee3e7..ce7b82c9ee 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java @@ -23,13 +23,7 @@ import java.beans.PropertyEditor; import java.beans.PropertyEditorManager; import java.lang.reflect.Field; import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.function.Consumer; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -971,4 +965,41 @@ public class BeanUtil { throw new IllegalArgumentException("Invalid Getter or Setter name: " + getterOrSetterName); } } + + /** + * 判断source与target的所有公共字段的值是否相同 + * @param source 待检测对象1 + * @param target 待检测对象2 + * @param ignoreProperties 不需要检测的字段 + * @return 判断结果,如果为true则证明所有字段的值都相同 + */ + public static boolean isCommonFieldsEqual(Object source, Object target, String...ignoreProperties) { + + if (null == source && null == target) { + return true; + } + if (null == source || null == target) { + return false; + } + + Map sourceFieldsMap = BeanUtil.beanToMap(source); + Map targetFieldsMap = BeanUtil.beanToMap(target); + + Set sourceFields = sourceFieldsMap.keySet(); + sourceFields.removeAll(Arrays.asList(ignoreProperties)); + + for (String field : sourceFields) { + Object sourceValue = sourceFieldsMap.get(field); + Object targetValue = targetFieldsMap.get(field); + + if (null == sourceValue && null == targetValue) { + continue; + } + if (!sourceValue.equals(targetValue)) { + return false; + } + } + + return true; + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java index d61742057d..bbad3b823f 100755 --- a/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java @@ -11,10 +11,7 @@ import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import lombok.Data; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; +import lombok.*; import lombok.experimental.Accessors; import org.junit.Assert; import org.junit.Ignore; @@ -840,4 +837,52 @@ public class BeanUtilTest { }, copyOptions); Assert.assertEquals("123", pojo.getName()); } + + @Data + @EqualsAndHashCode + private static class TestUserEntity { + private String username; + private String name; + private Integer age; + private Integer sex; + private String mobile; + private Date createTime; + } + + @Data + @EqualsAndHashCode + private static class TestUserDTO { + private String name; + private Integer age; + private Integer sex; + private String mobile; + } + @Test + public void isCommonFieldsEqualTest() { + TestUserEntity userEntity = new TestUserEntity(); + TestUserDTO userDTO = new TestUserDTO(); + + userDTO.setAge(20); + userDTO.setName("takaki"); + userDTO.setSex(1); + userDTO.setMobile("17812312023"); + + BeanUtil.copyProperties(userDTO, userEntity); + + System.out.println("相同字段值测试" + BeanUtil.isCommonFieldsEqual(userDTO, userEntity)); + + userEntity.setAge(13); + System.out.println("修改age字段值后测试" + BeanUtil.isCommonFieldsEqual(userDTO, userEntity)); + System.out.println("忽略age字段后测试" + BeanUtil.isCommonFieldsEqual(userDTO, userEntity, "age")); + + System.out.println("全null值测试" + BeanUtil.isCommonFieldsEqual(null, null)); + System.out.println("部分null值测试1" + BeanUtil.isCommonFieldsEqual(null, userEntity)); + System.out.println("部分null值测试2" + BeanUtil.isCommonFieldsEqual(userEntity, null)); + + userEntity.setSex(0); + System.out.println( + "修改age、sex字段修改后并忽略测试" + + BeanUtil.isCommonFieldsEqual(userDTO, userEntity, "age", "sex") + ); + } } -- Gitee From ef289dc6764099ef60735af091f04836039106d2 Mon Sep 17 00:00:00 2001 From: huangchengxing <841396397@qq.com> Date: Tue, 14 Jun 2022 15:17:27 +0800 Subject: [PATCH 0080/1737] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E4=B8=BAjdk=E5=85=83=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E7=9A=84=E6=96=B9=E6=B3=95;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/annotation/AnnotationUtil.java | 54 +++++++++++++++++++ .../CombinationAnnotationElement.java | 16 +----- 2 files changed, 56 insertions(+), 14 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java b/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java index a75affb8d9..5d99bdf927 100755 --- a/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java @@ -1,5 +1,6 @@ package cn.hutool.core.annotation; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ReflectUtil; @@ -16,6 +17,7 @@ import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.HashMap; import java.util.Map; +import java.util.Set; import java.util.function.Predicate; /** @@ -27,6 +29,58 @@ import java.util.function.Predicate; */ public class AnnotationUtil { + /** + * 元注解 + */ + static final Set> META_ANNOTATIONS = CollUtil.newHashSet(Target.class, // + Retention.class, // + Inherited.class, // + Documented.class, // + SuppressWarnings.class, // + Override.class, // + Deprecated.class// + ); + + /** + * 是否为Jdk自带的元注解。
+ * 包括: + *
    + *
  • {@link Target}
  • + *
  • {@link Retention}
  • + *
  • {@link Inherited}
  • + *
  • {@link Documented}
  • + *
  • {@link SuppressWarnings}
  • + *
  • {@link Override}
  • + *
  • {@link Deprecated}
  • + *
+ * + * @param annotationType 注解类型 + * @return 是否为Jdk自带的元注解 + */ + public static boolean isJdkMateAnnotation(Class annotationType) { + return META_ANNOTATIONS.contains(annotationType); + } + + /** + * 是否不为Jdk自带的元注解。
+ * 包括: + *
    + *
  • {@link Target}
  • + *
  • {@link Retention}
  • + *
  • {@link Inherited}
  • + *
  • {@link Documented}
  • + *
  • {@link SuppressWarnings}
  • + *
  • {@link Override}
  • + *
  • {@link Deprecated}
  • + *
+ * + * @param annotationType 注解类型 + * @return 是否为Jdk自带的元注解 + */ + public static boolean isNotJdkMateAnnotation(Class annotationType) { + return !isJdkMateAnnotation(annotationType); + } + /** * 将指定的被注解的元素转换为组合注解元素 * diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/CombinationAnnotationElement.java b/hutool-core/src/main/java/cn/hutool/core/annotation/CombinationAnnotationElement.java index 542793f79a..e2e901d66f 100755 --- a/hutool-core/src/main/java/cn/hutool/core/annotation/CombinationAnnotationElement.java +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/CombinationAnnotationElement.java @@ -39,18 +39,6 @@ public class CombinationAnnotationElement implements AnnotatedElement, Serializa return new CombinationAnnotationElement(element, predicate); } - /** - * 元注解 - */ - private static final Set> META_ANNOTATIONS = CollUtil.newHashSet(Target.class, // - Retention.class, // - Inherited.class, // - Documented.class, // - SuppressWarnings.class, // - Override.class, // - Deprecated.class// - ); - /** * 注解类型与注解对象对应表 */ @@ -138,7 +126,7 @@ public class CombinationAnnotationElement implements AnnotatedElement, Serializa // 直接注解 for (Annotation annotation : annotations) { annotationType = annotation.annotationType(); - if (false == META_ANNOTATIONS.contains(annotationType)) { + if (AnnotationUtil.isNotJdkMateAnnotation(annotationType)) { if(test(annotation)){ declaredAnnotationMap.put(annotationType, annotation); } @@ -157,7 +145,7 @@ public class CombinationAnnotationElement implements AnnotatedElement, Serializa Class annotationType; for (Annotation annotation : annotations) { annotationType = annotation.annotationType(); - if (false == META_ANNOTATIONS.contains(annotationType)) { + if (AnnotationUtil.isNotJdkMateAnnotation(annotationType)) { if(test(annotation)){ annotationMap.put(annotationType, annotation); } -- Gitee From 0cb498bf6e1e4c1a3d700ae638dd7673013bae0e Mon Sep 17 00:00:00 2001 From: huangchengxing <841396397@qq.com> Date: Tue, 14 Jun 2022 15:26:51 +0800 Subject: [PATCH 0081/1737] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E6=89=AB=E6=8F=8F=E5=99=A8;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../annotation/scanner/AnnotationScanner.java | 90 +++++++ .../scanner/FieldAnnotationScanner.java | 27 +++ .../scanner/MateAnnotationScanner.java | 95 ++++++++ .../scanner/MethodAnnotationScanner.java | 27 +++ .../scanner/TypeAnnotationScanner.java | 224 ++++++++++++++++++ .../scanner/AnnotationForScannerTest.java | 15 ++ .../scanner/FieldAnnotationScannerTest.java | 33 +++ .../scanner/MateAnnotationScannerTest.java | 55 +++++ .../scanner/MethodAnnotationScannerTest.java | 35 +++ .../scanner/TypeAnnotationScannerTest.java | 62 +++++ 10 files changed, 663 insertions(+) create mode 100644 hutool-core/src/main/java/cn/hutool/core/annotation/scanner/AnnotationScanner.java create mode 100644 hutool-core/src/main/java/cn/hutool/core/annotation/scanner/FieldAnnotationScanner.java create mode 100644 hutool-core/src/main/java/cn/hutool/core/annotation/scanner/MateAnnotationScanner.java create mode 100644 hutool-core/src/main/java/cn/hutool/core/annotation/scanner/MethodAnnotationScanner.java create mode 100644 hutool-core/src/main/java/cn/hutool/core/annotation/scanner/TypeAnnotationScanner.java create mode 100644 hutool-core/src/test/java/cn/hutool/core/annotation/scanner/AnnotationForScannerTest.java create mode 100644 hutool-core/src/test/java/cn/hutool/core/annotation/scanner/FieldAnnotationScannerTest.java create mode 100644 hutool-core/src/test/java/cn/hutool/core/annotation/scanner/MateAnnotationScannerTest.java create mode 100644 hutool-core/src/test/java/cn/hutool/core/annotation/scanner/MethodAnnotationScannerTest.java create mode 100644 hutool-core/src/test/java/cn/hutool/core/annotation/scanner/TypeAnnotationScannerTest.java diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/scanner/AnnotationScanner.java b/hutool-core/src/main/java/cn/hutool/core/annotation/scanner/AnnotationScanner.java new file mode 100644 index 0000000000..135165634e --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/scanner/AnnotationScanner.java @@ -0,0 +1,90 @@ +package cn.hutool.core.annotation.scanner; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; + +import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 注解扫描器,用于从支持的可注解元素上获取所需注解 + * + * @author huangchengxing + * @see TypeAnnotationScanner + * @see MethodAnnotationScanner + * @see FieldAnnotationScanner + * @see MateAnnotationScanner + */ +public interface AnnotationScanner { + + /** + * 是否支持扫描该可注解元素 + * + * @param annotatedElement 可注解元素 + * @return 是否支持扫描该可注解元素 + */ + default boolean support(AnnotatedElement annotatedElement) { + return false; + } + + /** + * 获取可注解元素上的全部注解。调用该方法前,需要确保调用{@link #support(AnnotatedElement)}返回为true + * + * @param annotatedElement 可注解元素 + * @return 元素上的注解 + */ + List getAnnotations(AnnotatedElement annotatedElement); + + /** + * 若{@link #support(AnnotatedElement)}返回{@code true}, + * 则调用并返回{@link #getAnnotations(AnnotatedElement)}结果, + * 否则返回{@link Collections#emptyList()} + * + * @param annotatedElement 元素 + * @return 元素上的注解 + */ + default List getIfSupport(AnnotatedElement annotatedElement) { + return support(annotatedElement) ? getAnnotations(annotatedElement) : Collections.emptyList(); + } + + /** + * 给定一组扫描器,使用第一个支持处理该类型元素的扫描器获取元素上可能存在的注解 + * + * @param annotatedElement 可注解元素 + * @param scanners 注解扫描器 + * @return 注解 + */ + static List scanByAnySupported(AnnotatedElement annotatedElement, AnnotationScanner... scanners) { + if (ObjectUtil.isNull(annotatedElement) && ArrayUtil.isNotEmpty(scanners)) { + return Collections.emptyList(); + } + return Stream.of(scanners) + .filter(scanner -> scanner.support(annotatedElement)) + .findFirst() + .map(scanner -> scanner.getAnnotations(annotatedElement)) + .orElseGet(Collections::emptyList); + } + + /** + * 根据指定的扫描器,扫描元素上可能存在的注解 + * + * @param annotatedElement 可注解元素 + * @param scanners 注解扫描器 + * @return 注解 + */ + static List scanByAllScanner(AnnotatedElement annotatedElement, AnnotationScanner... scanners) { + if (ObjectUtil.isNull(annotatedElement) && ArrayUtil.isNotEmpty(scanners)) { + return Collections.emptyList(); + } + return Stream.of(scanners) + .map(scanner -> scanner.getIfSupport(annotatedElement)) + .flatMap(Collection::stream) + .collect(Collectors.toList()); + } + +} diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/scanner/FieldAnnotationScanner.java b/hutool-core/src/main/java/cn/hutool/core/annotation/scanner/FieldAnnotationScanner.java new file mode 100644 index 0000000000..119c51ecbc --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/scanner/FieldAnnotationScanner.java @@ -0,0 +1,27 @@ +package cn.hutool.core.annotation.scanner; + +import cn.hutool.core.collection.CollUtil; + +import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Field; +import java.util.List; + +/** + * 扫描{@link Field}上的注解 + * + * @author huangchengxing + */ +public class FieldAnnotationScanner implements AnnotationScanner { + + @Override + public boolean support(AnnotatedElement annotatedElement) { + return annotatedElement instanceof Field; + } + + @Override + public List getAnnotations(AnnotatedElement annotatedElement) { + return CollUtil.newArrayList(annotatedElement.getAnnotations()); + } + +} diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/scanner/MateAnnotationScanner.java b/hutool-core/src/main/java/cn/hutool/core/annotation/scanner/MateAnnotationScanner.java new file mode 100644 index 0000000000..1a6f8d1ac1 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/scanner/MateAnnotationScanner.java @@ -0,0 +1,95 @@ +package cn.hutool.core.annotation.scanner; + +import cn.hutool.core.annotation.AnnotationUtil; +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ClassUtil; +import cn.hutool.core.util.ObjectUtil; + +import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; +import java.util.ArrayList; +import java.util.Deque; +import java.util.List; +import java.util.function.BiConsumer; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 扫描注解类上存在的注解,支持处理枚举实例或枚举类型
+ * 需要注意,当待解析是枚举类时,有可能与{@link TypeAnnotationScanner}冲突 + * + * @author huangchengxing + * @see TypeAnnotationScanner + */ +public class MateAnnotationScanner implements AnnotationScanner { + + /** + * 获取当前注解的元注解后,是否继续递归扫描的元注解的元注解 + */ + private final boolean includeSupperMetaAnnotation; + + /** + * 构造 + * + * @param includeSupperMetaAnnotation 获取当前注解的元注解后,是否继续递归扫描的元注解的元注解 + */ + public MateAnnotationScanner(boolean includeSupperMetaAnnotation) { + this.includeSupperMetaAnnotation = includeSupperMetaAnnotation; + } + + /** + * 构造一个元注解扫描器,默认在扫描当前注解上的元注解后,并继续递归扫描元注解 + */ + public MateAnnotationScanner() { + this(true); + } + + @Override + public boolean support(AnnotatedElement annotatedElement) { + return (annotatedElement instanceof Class && ClassUtil.isAssignable(Annotation.class, (Class)annotatedElement)); + } + + /** + * 按广度优先扫描指定注解上的元注解,对扫描到的注解与层级索引进行操作 + * + * @param consumer 当前层级索引与操作 + * @param source 源注解 + * @param filter 过滤器 + * @author huangchengxing + * @date 2022/6/14 13:28 + */ + public void scan(BiConsumer consumer, Class source, Predicate filter) { + filter = ObjectUtil.defaultIfNull(filter, t -> true); + Deque>> deque = CollUtil.newLinkedList(CollUtil.newArrayList(source)); + int distance = 0; + do { + List> annotationTypes = deque.removeFirst(); + for (Class type : annotationTypes) { + List metaAnnotations = Stream.of(type.getAnnotations()) + .filter(a -> !AnnotationUtil.isJdkMateAnnotation(a.annotationType())) + .filter(filter) + .collect(Collectors.toList()); + for (Annotation metaAnnotation : metaAnnotations) { + consumer.accept(distance, metaAnnotation); + } + deque.addLast(CollStreamUtil.toList(metaAnnotations, Annotation::annotationType)); + } + distance++; + } while (includeSupperMetaAnnotation && !deque.isEmpty()); + } + + @SuppressWarnings("unchecked") + @Override + public List getAnnotations(AnnotatedElement annotatedElement) { + List annotations = new ArrayList<>(); + scan( + (index, annotation) -> annotations.add(annotation), + (Class)annotatedElement, + annotation -> ObjectUtil.notEqual(annotation, annotatedElement) + ); + return annotations; + } + +} diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/scanner/MethodAnnotationScanner.java b/hutool-core/src/main/java/cn/hutool/core/annotation/scanner/MethodAnnotationScanner.java new file mode 100644 index 0000000000..f8de322b8c --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/scanner/MethodAnnotationScanner.java @@ -0,0 +1,27 @@ +package cn.hutool.core.annotation.scanner; + +import cn.hutool.core.collection.CollUtil; + +import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Method; +import java.util.List; + +/** + * 扫描{@link Method}上的注解 + * + * @author huangchengxing + */ +public class MethodAnnotationScanner implements AnnotationScanner { + + @Override + public boolean support(AnnotatedElement annotatedElement) { + return annotatedElement instanceof Method; + } + + @Override + public List getAnnotations(AnnotatedElement annotatedElement) { + return CollUtil.newArrayList(annotatedElement.getAnnotations()); + } + +} diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/scanner/TypeAnnotationScanner.java b/hutool-core/src/main/java/cn/hutool/core/annotation/scanner/TypeAnnotationScanner.java new file mode 100644 index 0000000000..f833a34920 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/scanner/TypeAnnotationScanner.java @@ -0,0 +1,224 @@ +package cn.hutool.core.annotation.scanner; + +import cn.hutool.core.annotation.AnnotationUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; + +import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Proxy; +import java.util.*; +import java.util.function.Predicate; +import java.util.function.UnaryOperator; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 扫描{@link Class}上的注解 + * + * @author huangchengxing + */ +public class TypeAnnotationScanner implements AnnotationScanner { + + /** + * 是否允许扫描父类 + */ + private boolean includeSupperClass; + + /** + * 是否允许扫描父接口 + */ + private boolean includeInterfaces; + + /** + * 过滤器,若类型无法通过该过滤器,则该类型及其树结构将直接不被查找 + */ + private Predicate> filter; + + /** + * 排除的类型,以上类型及其树结构将直接不被查找 + */ + private final Set> excludeTypes; + + /** + * 转换器 + */ + private final List>> converters; + + /** + * 是否有转换器 + */ + private boolean hasConverters; + + /** + * 构造一个类注解扫描器 + * + * @param includeSupperClass 是否允许扫描父类 + * @param includeInterfaces 是否允许扫描父接口 + */ + public TypeAnnotationScanner(boolean includeSupperClass, boolean includeInterfaces, Predicate> filter, Set> excludeTypes) { + Assert.notNull(filter, "filter must not null"); + Assert.notNull(excludeTypes, "excludeTypes must not null"); + this.includeSupperClass = includeSupperClass; + this.includeInterfaces = includeInterfaces; + this.filter = filter; + this.excludeTypes = excludeTypes; + this.converters = new ArrayList<>(); + } + + /** + * 构建一个类注解扫描器,默认允许扫描指定元素的父类以及父接口 + */ + public TypeAnnotationScanner() { + this(true, true, t -> true, CollUtil.newHashSet()); + } + + /** + * 是否允许扫描父类 + * + * @return 是否允许扫描父类 + */ + public boolean isIncludeSupperClass() { + return includeSupperClass; + } + + /** + * 是否允许扫描父接口 + * + * @return 是否允许扫描父接口 + */ + public boolean isIncludeInterfaces() { + return includeInterfaces; + } + + /** + * 设置过滤器,若类型无法通过该过滤器,则该类型及其树结构将直接不被查找 + * + * @param filter 过滤器 + * @return 当前实例 + */ + public TypeAnnotationScanner setFilter(Predicate> filter) { + Assert.notNull(filter, "filter must not null"); + this.filter = filter; + return this; + } + + /** + * 添加不扫描的类型,该类型及其树结构将直接不被查找 + * + * @param excludeTypes 不扫描的类型 + * @return 当前实例 + */ + public TypeAnnotationScanner addExcludeTypes(Class... excludeTypes) { + CollUtil.addAll(this.excludeTypes, excludeTypes); + return this; + } + + /** + * 添加转换器 + * + * @param converter 转换器 + * @return 当前实例 + * @see JdkProxyClassConverter + */ + public TypeAnnotationScanner addConverters(UnaryOperator> converter) { + Assert.notNull(converter, "converter must not null"); + this.converters.add(converter); + if (!this.hasConverters) { + this.hasConverters = true; + } + return this; + } + + /** + * 是否允许扫描父类 + * + * @param includeSupperClass 是否 + * @return 当前实例 + */ + public TypeAnnotationScanner setIncludeSupperClass(boolean includeSupperClass) { + this.includeSupperClass = includeSupperClass; + return this; + } + + /** + * 是否允许扫描父接口 + * + * @param includeInterfaces 是否 + * @return 当前实例 + */ + public TypeAnnotationScanner setIncludeInterfaces(boolean includeInterfaces) { + this.includeInterfaces = includeInterfaces; + return this; + } + + @Override + public boolean support(AnnotatedElement annotatedElement) { + return annotatedElement instanceof Class; + } + + @Override + public List getAnnotations(AnnotatedElement annotatedElement) { + return scan((Class)annotatedElement).stream() + .map(Class::getAnnotations) + .flatMap(Stream::of) + .filter(a -> !AnnotationUtil.isJdkMateAnnotation(a.annotationType())) + .collect(Collectors.toList()); + } + + private Class convert(Class target) { + if (hasConverters) { + converters.forEach(c -> c.apply(target)); + } + return target; + } + + /** + * 递归遍历当前类、父类及其实现的父接口 + * + * @param targetClass 类 + */ + private Set> scan(Class targetClass) { + Deque> classDeque = CollUtil.newLinkedList(targetClass); + Set> accessedTypes = new HashSet<>(); + while (!classDeque.isEmpty()) { + Class target = convert(classDeque.removeFirst()); + // 若当前类已经访问过,则无需再次处理 + if (ObjectUtil.isNull(target) || accessedTypes.contains(target) || excludeTypes.contains(target) || filter.negate().test(target)) { + continue; + } + accessedTypes.add(target); + + // 扫描父类 + if (includeSupperClass) { + Class superClass = target.getSuperclass(); + if (!ObjectUtil.equals(superClass, Object.class) && ObjectUtil.isNotNull(superClass)) { + classDeque.addLast(superClass); + } + } + + // 扫描接口 + if (includeInterfaces) { + Class[] interfaces = target.getInterfaces(); + if (ArrayUtil.isNotEmpty(interfaces)) { + CollUtil.addAll(classDeque, interfaces); + } + } + } + return accessedTypes; + } + + /** + * 若类型为jdk代理类,则尝试转换为原始被代理类 + */ + public static class JdkProxyClassConverter implements UnaryOperator> { + + @Override + public Class apply(Class sourceClass) { + return Proxy.isProxyClass(sourceClass) ? sourceClass.getSuperclass() : sourceClass; + } + } + +} diff --git a/hutool-core/src/test/java/cn/hutool/core/annotation/scanner/AnnotationForScannerTest.java b/hutool-core/src/test/java/cn/hutool/core/annotation/scanner/AnnotationForScannerTest.java new file mode 100644 index 0000000000..d032a516b8 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/annotation/scanner/AnnotationForScannerTest.java @@ -0,0 +1,15 @@ +package cn.hutool.core.annotation.scanner; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author huangchengxing + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.ANNOTATION_TYPE, ElementType.TYPE, ElementType.METHOD, ElementType.FIELD }) +@interface AnnotationForScannerTest { + +} diff --git a/hutool-core/src/test/java/cn/hutool/core/annotation/scanner/FieldAnnotationScannerTest.java b/hutool-core/src/test/java/cn/hutool/core/annotation/scanner/FieldAnnotationScannerTest.java new file mode 100644 index 0000000000..59af613bd5 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/annotation/scanner/FieldAnnotationScannerTest.java @@ -0,0 +1,33 @@ +package cn.hutool.core.annotation.scanner; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ReflectUtil; +import org.junit.Assert; +import org.junit.Test; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.util.List; + +/** + * @author huangchengxing + */ +public class FieldAnnotationScannerTest { + + @Test + public void testFieldAnnotationScanner() { + FieldAnnotationScanner scanner = new FieldAnnotationScanner(); + Field field = ReflectUtil.getField(Example.class, "id"); + Assert.assertNotNull(field); + Assert.assertTrue(scanner.support(field)); + List annotations = scanner.getAnnotations(field); + Assert.assertEquals(1, annotations.size()); + Assert.assertEquals(AnnotationForScannerTest.class, CollUtil.getFirst(annotations).annotationType()); + } + + public static class Example { + @AnnotationForScannerTest + private Integer id; + } + +} diff --git a/hutool-core/src/test/java/cn/hutool/core/annotation/scanner/MateAnnotationScannerTest.java b/hutool-core/src/test/java/cn/hutool/core/annotation/scanner/MateAnnotationScannerTest.java new file mode 100644 index 0000000000..a787670def --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/annotation/scanner/MateAnnotationScannerTest.java @@ -0,0 +1,55 @@ +package cn.hutool.core.annotation.scanner; + +import cn.hutool.core.collection.CollUtil; +import org.junit.Assert; +import org.junit.Test; + +import java.lang.annotation.*; +import java.util.HashMap; +import java.util.Map; + +/** + * @author huangchengxing + * @date 2022/06/10 16:51 + */ +public class MateAnnotationScannerTest { + + @Test + public void testMateAnnotationScanner() { + AnnotationScanner scanner = new MateAnnotationScanner(); + Assert.assertTrue(scanner.support(AnnotationForScannerTest3.class)); + Map, Annotation> annotations = CollUtil.toMap(scanner.getAnnotations(AnnotationForScannerTest3.class), new HashMap<>(), Annotation::annotationType); + Assert.assertEquals(3, annotations.size()); + Assert.assertTrue(annotations.containsKey(AnnotationForScannerTest.class)); + Assert.assertTrue(annotations.containsKey(AnnotationForScannerTest1.class)); + Assert.assertTrue(annotations.containsKey(AnnotationForScannerTest2.class)); + Assert.assertFalse(annotations.containsKey(AnnotationForScannerTest3.class)); + + scanner = new MateAnnotationScanner(false); + Assert.assertTrue(scanner.support(AnnotationForScannerTest3.class)); + annotations = CollUtil.toMap(scanner.getAnnotations(AnnotationForScannerTest3.class), new HashMap<>(), Annotation::annotationType); + Assert.assertEquals(1, annotations.size()); + Assert.assertTrue(annotations.containsKey(AnnotationForScannerTest2.class)); + Assert.assertFalse(annotations.containsKey(AnnotationForScannerTest.class)); + Assert.assertFalse(annotations.containsKey(AnnotationForScannerTest1.class)); + Assert.assertFalse(annotations.containsKey(AnnotationForScannerTest3.class)); + } + + @AnnotationForScannerTest3 + static class Example {} + + @AnnotationForScannerTest + @Retention(RetentionPolicy.RUNTIME) + @Target({ ElementType.ANNOTATION_TYPE, ElementType.TYPE, ElementType.METHOD, ElementType.FIELD }) + @interface AnnotationForScannerTest1 {} + + @AnnotationForScannerTest1 + @Retention(RetentionPolicy.RUNTIME) + @Target({ ElementType.ANNOTATION_TYPE, ElementType.TYPE, ElementType.METHOD, ElementType.FIELD }) + @interface AnnotationForScannerTest2 {} + + @AnnotationForScannerTest2 + @Retention(RetentionPolicy.RUNTIME) + @Target({ ElementType.ANNOTATION_TYPE, ElementType.TYPE, ElementType.METHOD, ElementType.FIELD }) + @interface AnnotationForScannerTest3 {} +} diff --git a/hutool-core/src/test/java/cn/hutool/core/annotation/scanner/MethodAnnotationScannerTest.java b/hutool-core/src/test/java/cn/hutool/core/annotation/scanner/MethodAnnotationScannerTest.java new file mode 100644 index 0000000000..25798c84d7 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/annotation/scanner/MethodAnnotationScannerTest.java @@ -0,0 +1,35 @@ +package cn.hutool.core.annotation.scanner; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ReflectUtil; +import org.junit.Assert; +import org.junit.Test; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; +import java.util.List; + +/** + * @author huangchengxing + */ +public class MethodAnnotationScannerTest { + + @Test + public void testMethodAnnotationScanner() { + AnnotationScanner scanner = new MethodAnnotationScanner(); + Method method = ReflectUtil.getMethod(Example.class, "test"); + Assert.assertNotNull(method); + Assert.assertTrue(scanner.support(method)); + List annotations = scanner.getAnnotations(method); + Assert.assertEquals(1, annotations.size()); + Assert.assertEquals(CollUtil.getFirst(annotations).annotationType(), AnnotationForScannerTest.class); + } + + static class Example { + @AnnotationForScannerTest + public void test() { + + } + } + +} diff --git a/hutool-core/src/test/java/cn/hutool/core/annotation/scanner/TypeAnnotationScannerTest.java b/hutool-core/src/test/java/cn/hutool/core/annotation/scanner/TypeAnnotationScannerTest.java new file mode 100644 index 0000000000..1df0727d16 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/annotation/scanner/TypeAnnotationScannerTest.java @@ -0,0 +1,62 @@ +package cn.hutool.core.annotation.scanner; + +import cn.hutool.core.util.ClassUtil; +import org.junit.Assert; +import org.junit.Test; + +import java.lang.annotation.Annotation; +import java.util.List; + +/** + * @author huangchengxing + * @date 2022/06/10 16:51 + */ +public class TypeAnnotationScannerTest { + + @Test + public void testTypeAnnotationScanner() { + AnnotationScanner scanner = new TypeAnnotationScanner(); + Assert.assertTrue(scanner.support(Example.class)); + List annotations = scanner.getAnnotations(Example.class); + Assert.assertEquals(3, annotations.size()); + annotations.forEach(a -> Assert.assertEquals(a.annotationType(), AnnotationForScannerTest.class)); + + // 不查找父接口 + scanner = new TypeAnnotationScanner().setIncludeInterfaces(false); + Assert.assertTrue(scanner.support(Example.class)); + annotations = scanner.getAnnotations(Example.class); + Assert.assertEquals(2, annotations.size()); + annotations.forEach(a -> Assert.assertEquals(a.annotationType(), AnnotationForScannerTest.class)); + + // 不查找父类 + scanner = new TypeAnnotationScanner().setIncludeSupperClass(false); + Assert.assertTrue(scanner.support(Example.class)); + annotations = scanner.getAnnotations(Example.class); + Assert.assertEquals(1, annotations.size()); + annotations.forEach(a -> Assert.assertEquals(a.annotationType(), AnnotationForScannerTest.class)); + + // 不查找ExampleSupplerClass.class + scanner = new TypeAnnotationScanner().addExcludeTypes(ExampleSupplerClass.class); + Assert.assertTrue(scanner.support(Example.class)); + annotations = scanner.getAnnotations(Example.class); + Assert.assertEquals(1, annotations.size()); + annotations.forEach(a -> Assert.assertEquals(a.annotationType(), AnnotationForScannerTest.class)); + + // 只查找ExampleSupplerClass.class + scanner = new TypeAnnotationScanner().setFilter(t -> ClassUtil.isAssignable(ExampleSupplerClass.class, t)); + Assert.assertTrue(scanner.support(Example.class)); + annotations = scanner.getAnnotations(Example.class); + Assert.assertEquals(2, annotations.size()); + annotations.forEach(a -> Assert.assertEquals(a.annotationType(), AnnotationForScannerTest.class)); + } + + @AnnotationForScannerTest + static class ExampleSupplerClass implements ExampleInterface {} + + @AnnotationForScannerTest + interface ExampleInterface {} + + @AnnotationForScannerTest + static class Example extends ExampleSupplerClass {} + +} -- Gitee From 7ca4a4ffc10869048dc4d24beef5410adf1db836 Mon Sep 17 00:00:00 2001 From: huangchengxing <841396397@qq.com> Date: Tue, 14 Jun 2022 15:39:05 +0800 Subject: [PATCH 0082/1737] =?UTF-8?q?=E5=90=88=E6=88=90=E6=B3=A8=E8=A7=A3;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/annotation/AnnotationUtil.java | 50 +++ .../core/annotation/SyntheticAnnotation.java | 335 ++++++++++++++++++ .../annotation/SyntheticAnnotationTest.java | 81 +++++ 3 files changed, 466 insertions(+) create mode 100644 hutool-core/src/main/java/cn/hutool/core/annotation/SyntheticAnnotation.java create mode 100644 hutool-core/src/test/java/cn/hutool/core/annotation/SyntheticAnnotationTest.java diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java b/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java index 5d99bdf927..1a5f24450a 100755 --- a/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java @@ -2,7 +2,11 @@ package cn.hutool.core.annotation; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.exceptions.UtilException; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.lang.Opt; import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ClassUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; import java.lang.annotation.Annotation; @@ -18,7 +22,10 @@ import java.lang.reflect.Proxy; import java.util.HashMap; import java.util.Map; import java.util.Set; +import java.util.function.Function; import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * 注解工具类
@@ -348,4 +355,47 @@ public class AnnotationUtil { final T annotation = getAnnotation(annotationEle, annotationType); return (T) Proxy.newProxyInstance(annotationType.getClassLoader(), new Class[]{annotationType}, new AnnotationProxy<>(annotation)); } + + /** + * 方法是否为注解属性方法。
+ * 方法无参数,且有返回值的方法认为是注解属性的方法。 + * + * @param method 方法 + */ + static boolean isAttributeMethod(Method method) { + return method.getParameterCount() == 0 && method.getReturnType() != void.class; + } + + /** + * 获取注解的全部属性值获取方法 + * + * @param annotationType 注解 + * @return 注解的全部属性值 + * @throws IllegalArgumentException 当别名属性在注解中不存在,或别名属性的值与原属性的值类型不一致时抛出 + */ + static Map getAttributeMethods(Class annotationType) { + // 获取全部注解属性值 + Map attributeMethods = Stream.of(annotationType.getDeclaredMethods()) + .filter(AnnotationUtil::isAttributeMethod) + .collect(Collectors.toMap(Method::getName, Function.identity())); + // 处理别名 + attributeMethods.forEach((methodName, method) -> { + String alias = Opt.ofNullable(method.getAnnotation(Alias.class)) + .map(Alias::value) + .orElse(null); + if (ObjectUtil.isNull(alias)) { + return; + } + // 存在别名,则将原本的值替换为别名对应的值 + Assert.isTrue(attributeMethods.containsKey(alias), "No method for alias: [{}]", alias); + Method aliasAttributeMethod = attributeMethods.get(alias); + Assert.isTrue( + ObjectUtil.isNull(aliasAttributeMethod) || ClassUtil.isAssignable(method.getReturnType(), aliasAttributeMethod.getReturnType()), + "Return type of the alias method [{}] is inconsistent with the original [{}]", + aliasAttributeMethod.getClass(), method.getParameterTypes() + ); + attributeMethods.put(methodName, aliasAttributeMethod); + }); + return attributeMethods; + } } diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/SyntheticAnnotation.java b/hutool-core/src/main/java/cn/hutool/core/annotation/SyntheticAnnotation.java new file mode 100644 index 0000000000..2df3297540 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/SyntheticAnnotation.java @@ -0,0 +1,335 @@ +package cn.hutool.core.annotation; + +import cn.hutool.core.annotation.scanner.MateAnnotationScanner; +import cn.hutool.core.lang.Opt; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; + +import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 表示一个根注解与根注解上的多层元注解合成的注解 + * + *

假设现有根注解A,A上存在元注解B,B上存在元注解C,则对A解析得到的合成注解X,X作为新的根注解,则CBA都是X的元注解。
+ * 通过{@link #isAnnotationPresent(Class)}可确定指定类型是注解是否是该合成注解的元注解,即是否为当前实例的“父类”。 + * 若指定注解是当前实例的元注解,则通过{@link #getAnnotation(Class)}可获得动态代理生成的对应的注解实例。
+ * 需要注意的是,由于认为合并注解X以最初的根注解A作为元注解,因此{@link #getAnnotations()}或{@link #getDeclaredAnnotations()} + * 都将只能获得A。 + * + *

不同层级的元注解可能存在同名的属性,此时,若认为该合成注解X在第0层,则根注解A在第1层,B在第2层......以此类推。 + * 层级越低的注解中离根注解距离近,则属性优先级越高,即遵循“就近原则”。
+ * 举个例子:若CBA同时存在属性y,则将X视为C,B或者A时,获得的y属性的值都与最底层元注解A的值保持一致。 + * 同理,不同层级可能会出现相同的元注解,比如A注解存在元注解B,C,但是C又存在元注解B,因此根据就近原则,A上的元注解B将优先于C上的元注解B生效。 + * 若两相同注解处于同一层级,则按照从其上一级“子注解”的{@link AnnotatedElement#getAnnotations()}的调用顺序排序。
+ * {@link #getAnnotation(Class)}获得的代理类实例的属性值遵循该规则。 + * + *

别名在合成注解中仍然有效,若注解X中任意属性上存在{@link Alias}注解,则{@link Alias#value()}指定的属性值将会覆盖注解属性的本身的值。
+ * {@link Alias}注解仅能指定注解X中存在的属性作为别名,不允许指定元注解或子类注解的属性。 + * + * @author huangchengxing + * @see AnnotationUtil + */ +public class SyntheticAnnotation implements Annotation, AnnotatedElement { + + /** + * 根注解,即当前查找的注解 + */ + private final A source; + + /** + * 包含根注解以及其元注解在内的全部注解实例 + */ + private final Map, MetaAnnotation> metaAnnotationMap; + + /** + * 属性值缓存 + */ + private final Map attributeCaches; + + /** + * 构造 + * + * @param annotation 当前查找的注解类 + */ + SyntheticAnnotation(A annotation) { + this.source = annotation; + this.metaAnnotationMap = new LinkedHashMap<>(); + this.attributeCaches = new HashMap<>(); + loadMetaAnnotations(); // TODO 是否可以添加注解类对应的元注解信息缓存,避免每次都要解析? + } + + /** + * 基于指定根注解,构建包括其元注解在内的合成注解 + * + * @param rootAnnotation 根注解 + * @return 合成注解 + */ + public static SyntheticAnnotation of(T rootAnnotation) { + return new SyntheticAnnotation<>(rootAnnotation); + } + + /** + * 获取根注解 + * + * @return 根注解 + */ + public A getSource() { + return source; + } + + /** + * 获取已解析的元注解信息 + * + * @return 已解析的元注解信息 + */ + Map, MetaAnnotation> getMetaAnnotationMap() { + return metaAnnotationMap; + } + + /** + * 获取根注解类型 + * + * @return java.lang.Class + */ + @Override + public Class annotationType() { + return getSource().annotationType(); + } + + /** + * 获取属性值,若存在{@link Alias}则获取{@link Alias#value()}指定的别名属性的值 + *

当不同层级的注解之间存在同名属性时,将优先获取更接近根注解的属性 + * + * @param attributeName 属性名 + */ + public Object getAttribute(String attributeName) { + return attributeCaches.computeIfAbsent(attributeName, a -> metaAnnotationMap.values() + .stream() + .filter(ma -> ma.hasAttribute(attributeName)) // 集合默认是根据distance有序的,故此处无需再排序 + .findFirst() + .map(ma -> ma.getAttribute(attributeName)) + .orElse(null) + ); + } + + /** + * 若合成注解在存在指定元注解,则使用动态代理生成一个对应的注解实例 + * + * @param annotationType 注解类型 + * @param 注解类型 + * @return 注解 + */ + @SuppressWarnings("unchecked") + @Override + public T getAnnotation(Class annotationType) { + if (metaAnnotationMap.containsKey(annotationType)) { + return (T) Proxy.newProxyInstance( + annotationType.getClassLoader(), + new Class[]{annotationType, Synthesized.class}, + new SyntheticAnnotationProxy<>(this, annotationType) + ); + } + return null; + } + + /** + * 获取全部注解 + * + * @return java.lang.annotation.Annotation[] + */ + @Override + public Annotation[] getAnnotations() { + return getMetaAnnotationMap().values().toArray(new MetaAnnotation[0]); + } + + /** + * 获取根注解直接声明注解 + * + * @return 直接声明注解 + */ + @Override + public Annotation[] getDeclaredAnnotations() { + return new Annotation[]{ getSource() }; + } + + /** + * 广度优先遍历并缓存该根注解上的全部元注解 + */ + private void loadMetaAnnotations() { + // 若该注解已经是合成注解,则直接使用已解析好的元注解信息 + if (source instanceof SyntheticAnnotation.Synthesized) { + this.metaAnnotationMap.putAll(((Synthesized)source).getMetaAnnotationMap()); + return; + } + // 扫描元注解 + metaAnnotationMap.put(source.annotationType(), new MetaAnnotation(source, 0)); + new MateAnnotationScanner().scan( + (index, annotation) -> metaAnnotationMap.computeIfAbsent( + // 当出现重复的注解时,由于后添加的注解必然层级更高,优先级更低,因此当直接忽略 + annotation.annotationType(), t -> new MetaAnnotation(annotation, index) + ), + source.annotationType(), null + ); + } + + /** + * 元注解包装类 + * + * @author huangchengxing + */ + static class MetaAnnotation implements Annotation { + + private final Annotation annotation; + private final Map attributeMethodCaches; + private final int distance; + + public MetaAnnotation(Annotation annotation, int distance) { + this.annotation = annotation; + this.distance = distance; + this.attributeMethodCaches = AnnotationUtil.getAttributeMethods(annotation.annotationType()); + } + + /** + * 获取注解类型 + * + * @return 注解类型 + */ + @Override + public Class annotationType() { + return annotation.annotationType(); + } + + /** + * 获取元注解 + * + * @return 元注解 + */ + public Annotation get() { + return annotation; + } + + /** + * 获取根注解到元注解的距离 + * + * @return 根注解到元注解的距离 + */ + public int getDistance() { + return distance; + } + + /** + * 元注解是否存在该属性 + * + * @param attributeName 属性名 + * @return 是否存在该属性 + */ + public boolean hasAttribute(String attributeName) { + return attributeMethodCaches.containsKey(attributeName); + } + + /** + * 获取元注解的属性值 + * + * @param attributeName 属性名 + * @return 元注解的属性值 + */ + public Object getAttribute(String attributeName) { + return Opt.ofNullable(attributeMethodCaches.get(attributeName)) + .map(method -> ReflectUtil.invoke(annotation, method)) + .orElse(null); + } + + } + + /** + * 表示一个已经被合成的注解 + * + * @author huangchengxing + */ + interface Synthesized { + + /** + * 获取合成注解中已解析的元注解信息 + * + * @return 合成注解中已解析的元注解信息 + */ + Map, MetaAnnotation> getMetaAnnotationMap(); + + static boolean isMetaAnnotationMapMethod(Method method) { + return StrUtil.equals("getMetaAnnotationMap", method.getName()); + } + + } + + /** + * 合成注解代理类 + * + * @author huangchengxing + */ + static class SyntheticAnnotationProxy implements Annotation, InvocationHandler { + + private final Class annotationType; + private final SyntheticAnnotation syntheticAnnotation; + + public SyntheticAnnotationProxy(SyntheticAnnotation syntheticAnnotation, Class annotationType) { + this.syntheticAnnotation = syntheticAnnotation; + this.annotationType = annotationType; + } + + @Override + public Class annotationType() { + return annotationType; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + if (Synthesized.isMetaAnnotationMapMethod(method)) { + return syntheticAnnotation.getMetaAnnotationMap(); + } + if (ReflectUtil.isHashCodeMethod(method)) { + return getHashCode(); + } + if (ReflectUtil.isToStringMethod(method)) { + return getToString(); + } + return ObjectUtil.defaultIfNull( + syntheticAnnotation.getAttribute(method.getName()), + () -> ReflectUtil.invoke(this, method, args) + ); + } + + /** + * 获取toString值 + * + * @return toString值 + */ + private String getToString() { + String attributes = Stream.of(annotationType().getDeclaredMethods()) + .filter(AnnotationUtil::isAttributeMethod) + .map(method -> StrUtil.format("{}={}", method.getName(), syntheticAnnotation.getAttribute(method.getName()))) + .collect(Collectors.joining(", ")); + return StrUtil.format("@{}({})", annotationType().getName(), attributes); + } + + /** + * 获取hashcode值 + * + * @return hashcode值 + */ + private int getHashCode() { + return Objects.hash((Object)syntheticAnnotation.getAnnotations()); + } + + } +} diff --git a/hutool-core/src/test/java/cn/hutool/core/annotation/SyntheticAnnotationTest.java b/hutool-core/src/test/java/cn/hutool/core/annotation/SyntheticAnnotationTest.java new file mode 100644 index 0000000000..a81147e2e0 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/annotation/SyntheticAnnotationTest.java @@ -0,0 +1,81 @@ +package cn.hutool.core.annotation; + +import org.junit.Assert; +import org.junit.Test; + +import java.lang.annotation.*; +import java.util.Map; + +/** + * 合成注解{@link SyntheticAnnotation}的测试用例 + * + * @author huangchengxing + */ +public class SyntheticAnnotationTest { + + @Test + public void testSynthesisAnnotation() { + ChildAnnotation rootAnnotation = AnnotatedClass.class.getAnnotation(ChildAnnotation.class); + SyntheticAnnotation syntheticAnnotation = SyntheticAnnotation.of(rootAnnotation); + Assert.assertEquals(syntheticAnnotation.getSource(), rootAnnotation); + Assert.assertEquals(syntheticAnnotation.annotationType(), rootAnnotation.annotationType()); + Assert.assertEquals(1, syntheticAnnotation.getDeclaredAnnotations().length); + Assert.assertEquals(syntheticAnnotation.getDeclaredAnnotations()[0], rootAnnotation); + Assert.assertEquals(3, syntheticAnnotation.getAnnotations().length); + + Assert.assertEquals(syntheticAnnotation.getAttribute("childValue"), "Child!"); + Assert.assertEquals(syntheticAnnotation.getAttribute("childValueAlias"), "Child!"); + Assert.assertEquals(syntheticAnnotation.getAttribute("parentValue"), "Child's Parent!"); + Assert.assertEquals(syntheticAnnotation.getAttribute("grandParentValue"), "Child's GrandParent!"); + + Map, SyntheticAnnotation.MetaAnnotation> annotationMap = syntheticAnnotation.getMetaAnnotationMap(); + ChildAnnotation childAnnotation = syntheticAnnotation.getAnnotation(ChildAnnotation.class); + Assert.assertTrue(syntheticAnnotation.isAnnotationPresent(ChildAnnotation.class)); + Assert.assertNotNull(childAnnotation); + Assert.assertEquals(childAnnotation.childValue(), "Child!"); + Assert.assertEquals(childAnnotation.childValueAlias(), "Child!"); + Assert.assertEquals(annotationMap, SyntheticAnnotation.of(childAnnotation).getMetaAnnotationMap()); + + ParentAnnotation parentAnnotation = syntheticAnnotation.getAnnotation(ParentAnnotation.class); + Assert.assertTrue(syntheticAnnotation.isAnnotationPresent(ParentAnnotation.class)); + Assert.assertNotNull(parentAnnotation); + Assert.assertEquals(parentAnnotation.parentValue(), "Child's Parent!"); + Assert.assertEquals(annotationMap, SyntheticAnnotation.of(parentAnnotation).getMetaAnnotationMap()); + + GrandParentAnnotation grandParentAnnotation = syntheticAnnotation.getAnnotation(GrandParentAnnotation.class); + Assert.assertTrue(syntheticAnnotation.isAnnotationPresent(GrandParentAnnotation.class)); + Assert.assertNotNull(grandParentAnnotation); + Assert.assertEquals(grandParentAnnotation.grandParentValue(), "Child's GrandParent!"); + Assert.assertEquals(annotationMap, SyntheticAnnotation.of(grandParentAnnotation).getMetaAnnotationMap()); + } + + // 注解结构如下: + // AnnotatedClass -> @ChildAnnotation -> @ParentAnnotation -> @GrandParentAnnotation + // -> @GrandParentAnnotation + @ChildAnnotation(childValueAlias = "Child!") + class AnnotatedClass {} + + @Retention(RetentionPolicy.RUNTIME) + @Target({ ElementType.ANNOTATION_TYPE }) + @interface GrandParentAnnotation { + String grandParentValue() default ""; + } + + @GrandParentAnnotation(grandParentValue = "Parent's GrandParent!") // 覆盖元注解@GrandParentAnnotation的属性 + @Retention(RetentionPolicy.RUNTIME) + @Target({ ElementType.TYPE }) + @interface ParentAnnotation { + String parentValue() default ""; + } + + @GrandParentAnnotation(grandParentValue = "Child's GrandParent!") // 重复的元注解,靠近根注解的优先级高 + @ParentAnnotation(parentValue = "Child's Parent!") // 覆盖元注解@ParentAnnotation的属性 + @Retention(RetentionPolicy.RUNTIME) + @Target({ ElementType.METHOD, ElementType.TYPE }) + @interface ChildAnnotation { + String childValueAlias() default ""; + @Alias("childValueAlias") + String childValue() default ""; + } + +} -- Gitee From ff30bdf1ea8986b7a38b96fa65054376ee28fa50 Mon Sep 17 00:00:00 2001 From: huangchengxing <841396397@qq.com> Date: Tue, 14 Jun 2022 15:56:26 +0800 Subject: [PATCH 0083/1737] =?UTF-8?q?=E6=B3=A8=E8=A7=A3=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E7=B1=BB=E6=B7=BB=E5=8A=A0=E8=8E=B7=E5=8F=96=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E6=B3=A8=E8=A7=A3=E7=9A=84=E6=96=B9=E6=B3=95;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/annotation/AnnotationUtil.java | 42 +++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java b/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java index 1a5f24450a..5c3f217aa4 100755 --- a/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java @@ -1,5 +1,6 @@ package cn.hutool.core.annotation; +import cn.hutool.core.annotation.scanner.*; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.lang.Assert; @@ -19,9 +20,7 @@ import java.lang.annotation.Target; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Method; import java.lang.reflect.Proxy; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -356,6 +355,43 @@ public class AnnotationUtil { return (T) Proxy.newProxyInstance(annotationType.getClassLoader(), new Class[]{annotationType}, new AnnotationProxy<>(annotation)); } + /** + * 将指定注解实例与其元注解转为合成注解 + * + * @param annotation 注解 + * @param annotationType 注解类型 + * @param 注解类型 + * @return 合成注解 + * @see SyntheticAnnotation + */ + public static T getSynthesisAnnotation(Annotation annotation, Class annotationType) { + return SyntheticAnnotation.of(annotation).getAnnotation(annotationType); + } + + /** + * 获取元素上所有指定注解 + *

+ * + * @param annotatedElement 可注解元素 + * @param annotationType 注解类型 + * @param 注解类型 + * @return 注解 + * @see SyntheticAnnotation + */ + public static List getAllSynthesisAnnotations(AnnotatedElement annotatedElement, Class annotationType) { + AnnotationScanner[] scanners = new AnnotationScanner[] { + new MateAnnotationScanner(), new TypeAnnotationScanner(), new MethodAnnotationScanner(), new FieldAnnotationScanner() + }; + return AnnotationScanner.scanByAnySupported(annotatedElement, scanners).stream() + .map(SyntheticAnnotation::of) + .map(annotation -> annotation.getAnnotation(annotationType)) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } + /** * 方法是否为注解属性方法。
* 方法无参数,且有返回值的方法认为是注解属性的方法。 -- Gitee From e9b6f7b2af9481c759cf2b34b2eae68d280cf665 Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 14 Jun 2022 16:43:05 +0800 Subject: [PATCH 0084/1737] add method --- CHANGELOG.md | 1 + .../java/cn/hutool/core/bean/BeanUtil.java | 11 ++++------ .../cn/hutool/core/bean/BeanUtilTest.java | 21 ++++++++----------- 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a9d467930..ebffcd6d21 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ ### 🐣新特性 * 【extra 】 Sftp增加构造重载,支持超时(pr#653@Gitee) +* 【core 】 BeanUtil增加isCommonFieldsEqual(pr#653@Gitee) * ### 🐞Bug修复 diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java index ce7b82c9ee..f4034c2f1b 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java @@ -968,10 +968,13 @@ public class BeanUtil { /** * 判断source与target的所有公共字段的值是否相同 + * * @param source 待检测对象1 * @param target 待检测对象2 * @param ignoreProperties 不需要检测的字段 * @return 判断结果,如果为true则证明所有字段的值都相同 + * @since 5.8.4 + * @author Takak11 */ public static boolean isCommonFieldsEqual(Object source, Object target, String...ignoreProperties) { @@ -989,13 +992,7 @@ public class BeanUtil { sourceFields.removeAll(Arrays.asList(ignoreProperties)); for (String field : sourceFields) { - Object sourceValue = sourceFieldsMap.get(field); - Object targetValue = targetFieldsMap.get(field); - - if (null == sourceValue && null == targetValue) { - continue; - } - if (!sourceValue.equals(targetValue)) { + if(ObjectUtil.notEqual(sourceFieldsMap.get(field), targetFieldsMap.get(field))){ return false; } } diff --git a/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java index bbad3b823f..219780b430 100755 --- a/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java @@ -859,8 +859,8 @@ public class BeanUtilTest { } @Test public void isCommonFieldsEqualTest() { - TestUserEntity userEntity = new TestUserEntity(); - TestUserDTO userDTO = new TestUserDTO(); + final TestUserEntity userEntity = new TestUserEntity(); + final TestUserDTO userDTO = new TestUserDTO(); userDTO.setAge(20); userDTO.setName("takaki"); @@ -869,20 +869,17 @@ public class BeanUtilTest { BeanUtil.copyProperties(userDTO, userEntity); - System.out.println("相同字段值测试" + BeanUtil.isCommonFieldsEqual(userDTO, userEntity)); + Assert.assertTrue(BeanUtil.isCommonFieldsEqual(userDTO, userEntity)); userEntity.setAge(13); - System.out.println("修改age字段值后测试" + BeanUtil.isCommonFieldsEqual(userDTO, userEntity)); - System.out.println("忽略age字段后测试" + BeanUtil.isCommonFieldsEqual(userDTO, userEntity, "age")); + Assert.assertFalse(BeanUtil.isCommonFieldsEqual(userDTO, userEntity)); + Assert.assertTrue(BeanUtil.isCommonFieldsEqual(userDTO, userEntity, "age")); - System.out.println("全null值测试" + BeanUtil.isCommonFieldsEqual(null, null)); - System.out.println("部分null值测试1" + BeanUtil.isCommonFieldsEqual(null, userEntity)); - System.out.println("部分null值测试2" + BeanUtil.isCommonFieldsEqual(userEntity, null)); + Assert.assertTrue(BeanUtil.isCommonFieldsEqual(null, null)); + Assert.assertFalse(BeanUtil.isCommonFieldsEqual(null, userEntity)); + Assert.assertFalse(BeanUtil.isCommonFieldsEqual(userEntity, null)); userEntity.setSex(0); - System.out.println( - "修改age、sex字段修改后并忽略测试" - + BeanUtil.isCommonFieldsEqual(userDTO, userEntity, "age", "sex") - ); + Assert.assertTrue(BeanUtil.isCommonFieldsEqual(userDTO, userEntity, "age", "sex")); } } -- Gitee From 4c7ac0042cef22ce10f46e9b3b1c73e3370ca899 Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 14 Jun 2022 16:44:34 +0800 Subject: [PATCH 0085/1737] add method --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ebffcd6d21..c77f962ec7 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,11 +3,12 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.4.M1 (2022-06-12) +# 5.8.4.M1 (2022-06-14) ### 🐣新特性 * 【extra 】 Sftp增加构造重载,支持超时(pr#653@Gitee) * 【core 】 BeanUtil增加isCommonFieldsEqual(pr#653@Gitee) +* 【json 】 修改byte[]统一转换为数组形式(issue#2377@Github) * ### 🐞Bug修复 -- Gitee From 0e2e894a3ec6c3ffa04bc910a329d2fd65f0898d Mon Sep 17 00:00:00 2001 From: huangchengxing <841396397@qq.com> Date: Tue, 14 Jun 2022 17:25:57 +0800 Subject: [PATCH 0086/1737] =?UTF-8?q?=E5=90=88=E6=88=90=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E8=B0=83=E6=95=B4=E4=B8=BA=E5=90=8C=E6=97=B6?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E5=90=8D=E7=A7=B0=E5=92=8C=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E8=A6=86=E7=9B=96;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/annotation/SyntheticAnnotation.java | 38 ++++++++++++++----- .../annotation/SyntheticAnnotationTest.java | 18 ++++++--- 2 files changed, 40 insertions(+), 16 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/SyntheticAnnotation.java b/hutool-core/src/main/java/cn/hutool/core/annotation/SyntheticAnnotation.java index 2df3297540..3db0bacfcf 100644 --- a/hutool-core/src/main/java/cn/hutool/core/annotation/SyntheticAnnotation.java +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/SyntheticAnnotation.java @@ -2,6 +2,8 @@ package cn.hutool.core.annotation; import cn.hutool.core.annotation.scanner.MateAnnotationScanner; import cn.hutool.core.lang.Opt; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ClassUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; @@ -21,7 +23,7 @@ import java.util.stream.Stream; /** * 表示一个根注解与根注解上的多层元注解合成的注解 * - *

假设现有根注解A,A上存在元注解B,B上存在元注解C,则对A解析得到的合成注解X,X作为新的根注解,则CBA都是X的元注解。
+ *

假设现有注解A,A上存在元注解B,B上存在元注解C,则对A解析得到的合成注解X,则CBA都是X的元注解,X为根注解。
* 通过{@link #isAnnotationPresent(Class)}可确定指定类型是注解是否是该合成注解的元注解,即是否为当前实例的“父类”。 * 若指定注解是当前实例的元注解,则通过{@link #getAnnotation(Class)}可获得动态代理生成的对应的注解实例。
* 需要注意的是,由于认为合并注解X以最初的根注解A作为元注解,因此{@link #getAnnotations()}或{@link #getDeclaredAnnotations()} @@ -34,6 +36,8 @@ import java.util.stream.Stream; * 若两相同注解处于同一层级,则按照从其上一级“子注解”的{@link AnnotatedElement#getAnnotations()}的调用顺序排序。
* {@link #getAnnotation(Class)}获得的代理类实例的属性值遵循该规则。 * + *

同名属性将根据类型彼此隔离,即当不同层级的元注解存在同名的属性,但是属性类型不同时,此时低层级的属性并不会覆盖高层级注解的属性。 + * *

别名在合成注解中仍然有效,若注解X中任意属性上存在{@link Alias}注解,则{@link Alias#value()}指定的属性值将会覆盖注解属性的本身的值。
* {@link Alias}注解仅能指定注解X中存在的属性作为别名,不允许指定元注解或子类注解的属性。 * @@ -55,7 +59,7 @@ public class SyntheticAnnotation
implements Annotation, An /** * 属性值缓存 */ - private final Map attributeCaches; + private final Map, Object>> attributeCaches; /** * 构造 @@ -108,15 +112,16 @@ public class SyntheticAnnotation implements Annotation, An } /** - * 获取属性值,若存在{@link Alias}则获取{@link Alias#value()}指定的别名属性的值 - *

当不同层级的注解之间存在同名属性时,将优先获取更接近根注解的属性 + * 根据指定的属性名与属性类型获取对应的属性值,若存在{@link Alias}则获取{@link Alias#value()}指定的别名属性的值 + *

当不同层级的注解之间存在同名同类型属性时,将优先获取更接近根注解的属性 * * @param attributeName 属性名 */ - public Object getAttribute(String attributeName) { - return attributeCaches.computeIfAbsent(attributeName, a -> metaAnnotationMap.values() + public Object getAttribute(String attributeName, Class attributeType) { + Map, Object> values = attributeCaches.computeIfAbsent(attributeName, t -> MapUtil.newHashMap()); + return values.computeIfAbsent(attributeType, a -> metaAnnotationMap.values() .stream() - .filter(ma -> ma.hasAttribute(attributeName)) // 集合默认是根据distance有序的,故此处无需再排序 + .filter(ma -> ma.hasAttribute(attributeName, attributeType)) // 集合默认是根据distance有序的,故此处无需再排序 .findFirst() .map(ma -> ma.getAttribute(attributeName)) .orElse(null) @@ -154,7 +159,7 @@ public class SyntheticAnnotation implements Annotation, An } /** - * 获取根注解直接声明注解 + * 获取根注解直接声明的注解,该方法正常情况下当只返回原注解 * * @return 直接声明注解 */ @@ -238,6 +243,19 @@ public class SyntheticAnnotation implements Annotation, An return attributeMethodCaches.containsKey(attributeName); } + /** + * 元注解是否存在该属性,且该属性的值类型是指定类型或其子类 + * + * @param attributeName 属性名 + * @param returnType 返回值类型 + * @return 是否存在该属性 + */ + public boolean hasAttribute(String attributeName, Class returnType) { + return Opt.ofNullable(attributeMethodCaches.get(attributeName)) + .filter(method -> ClassUtil.isAssignable(returnType, method.getReturnType())) + .isPresent(); + } + /** * 获取元注解的属性值 * @@ -304,7 +322,7 @@ public class SyntheticAnnotation implements Annotation, An return getToString(); } return ObjectUtil.defaultIfNull( - syntheticAnnotation.getAttribute(method.getName()), + syntheticAnnotation.getAttribute(method.getName(), method.getReturnType()), () -> ReflectUtil.invoke(this, method, args) ); } @@ -317,7 +335,7 @@ public class SyntheticAnnotation implements Annotation, An private String getToString() { String attributes = Stream.of(annotationType().getDeclaredMethods()) .filter(AnnotationUtil::isAttributeMethod) - .map(method -> StrUtil.format("{}={}", method.getName(), syntheticAnnotation.getAttribute(method.getName()))) + .map(method -> StrUtil.format("{}={}", method.getName(), syntheticAnnotation.getAttribute(method.getName(), method.getReturnType()))) .collect(Collectors.joining(", ")); return StrUtil.format("@{}({})", annotationType().getName(), attributes); } diff --git a/hutool-core/src/test/java/cn/hutool/core/annotation/SyntheticAnnotationTest.java b/hutool-core/src/test/java/cn/hutool/core/annotation/SyntheticAnnotationTest.java index a81147e2e0..8e1db5d3fc 100644 --- a/hutool-core/src/test/java/cn/hutool/core/annotation/SyntheticAnnotationTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/annotation/SyntheticAnnotationTest.java @@ -23,10 +23,10 @@ public class SyntheticAnnotationTest { Assert.assertEquals(syntheticAnnotation.getDeclaredAnnotations()[0], rootAnnotation); Assert.assertEquals(3, syntheticAnnotation.getAnnotations().length); - Assert.assertEquals(syntheticAnnotation.getAttribute("childValue"), "Child!"); - Assert.assertEquals(syntheticAnnotation.getAttribute("childValueAlias"), "Child!"); - Assert.assertEquals(syntheticAnnotation.getAttribute("parentValue"), "Child's Parent!"); - Assert.assertEquals(syntheticAnnotation.getAttribute("grandParentValue"), "Child's GrandParent!"); + Assert.assertEquals(syntheticAnnotation.getAttribute("childValue", String.class), "Child!"); + Assert.assertEquals(syntheticAnnotation.getAttribute("childValueAlias", String.class), "Child!"); + Assert.assertEquals(syntheticAnnotation.getAttribute("parentValue", String.class), "Child's Parent!"); + Assert.assertEquals(syntheticAnnotation.getAttribute("grandParentValue", String.class), "Child's GrandParent!"); Map, SyntheticAnnotation.MetaAnnotation> annotationMap = syntheticAnnotation.getMetaAnnotationMap(); ChildAnnotation childAnnotation = syntheticAnnotation.getAnnotation(ChildAnnotation.class); @@ -34,31 +34,35 @@ public class SyntheticAnnotationTest { Assert.assertNotNull(childAnnotation); Assert.assertEquals(childAnnotation.childValue(), "Child!"); Assert.assertEquals(childAnnotation.childValueAlias(), "Child!"); + Assert.assertEquals(childAnnotation.grandParentType(), Integer.class); Assert.assertEquals(annotationMap, SyntheticAnnotation.of(childAnnotation).getMetaAnnotationMap()); ParentAnnotation parentAnnotation = syntheticAnnotation.getAnnotation(ParentAnnotation.class); Assert.assertTrue(syntheticAnnotation.isAnnotationPresent(ParentAnnotation.class)); Assert.assertNotNull(parentAnnotation); Assert.assertEquals(parentAnnotation.parentValue(), "Child's Parent!"); + Assert.assertEquals(parentAnnotation.grandParentType(), "java.lang.Void"); Assert.assertEquals(annotationMap, SyntheticAnnotation.of(parentAnnotation).getMetaAnnotationMap()); GrandParentAnnotation grandParentAnnotation = syntheticAnnotation.getAnnotation(GrandParentAnnotation.class); Assert.assertTrue(syntheticAnnotation.isAnnotationPresent(GrandParentAnnotation.class)); Assert.assertNotNull(grandParentAnnotation); Assert.assertEquals(grandParentAnnotation.grandParentValue(), "Child's GrandParent!"); + Assert.assertEquals(grandParentAnnotation.grandParentType(), Integer.class); Assert.assertEquals(annotationMap, SyntheticAnnotation.of(grandParentAnnotation).getMetaAnnotationMap()); } // 注解结构如下: // AnnotatedClass -> @ChildAnnotation -> @ParentAnnotation -> @GrandParentAnnotation // -> @GrandParentAnnotation - @ChildAnnotation(childValueAlias = "Child!") - class AnnotatedClass {} + @ChildAnnotation(childValueAlias = "Child!", grandParentType = Integer.class) + static class AnnotatedClass {} @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.ANNOTATION_TYPE }) @interface GrandParentAnnotation { String grandParentValue() default ""; + Class grandParentType() default Void.class; } @GrandParentAnnotation(grandParentValue = "Parent's GrandParent!") // 覆盖元注解@GrandParentAnnotation的属性 @@ -66,6 +70,7 @@ public class SyntheticAnnotationTest { @Target({ ElementType.TYPE }) @interface ParentAnnotation { String parentValue() default ""; + String grandParentType() default "java.lang.Void"; } @GrandParentAnnotation(grandParentValue = "Child's GrandParent!") // 重复的元注解,靠近根注解的优先级高 @@ -76,6 +81,7 @@ public class SyntheticAnnotationTest { String childValueAlias() default ""; @Alias("childValueAlias") String childValue() default ""; + Class grandParentType() default Void.class; } } -- Gitee From 686de3ac0ccee8f6c16ff73c2de693a9b1c7feb9 Mon Sep 17 00:00:00 2001 From: huangchengxing <841396397@qq.com> Date: Tue, 14 Jun 2022 15:39:05 +0800 Subject: [PATCH 0087/1737] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=90=88=E6=88=90?= =?UTF-8?q?=E6=B3=A8=E8=A7=A3;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/annotation/AnnotationUtil.java | 50 +++ .../core/annotation/SyntheticAnnotation.java | 335 ++++++++++++++++++ .../annotation/SyntheticAnnotationTest.java | 81 +++++ 3 files changed, 466 insertions(+) create mode 100644 hutool-core/src/main/java/cn/hutool/core/annotation/SyntheticAnnotation.java create mode 100644 hutool-core/src/test/java/cn/hutool/core/annotation/SyntheticAnnotationTest.java diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java b/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java index 5d99bdf927..1a5f24450a 100755 --- a/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java @@ -2,7 +2,11 @@ package cn.hutool.core.annotation; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.exceptions.UtilException; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.lang.Opt; import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ClassUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; import java.lang.annotation.Annotation; @@ -18,7 +22,10 @@ import java.lang.reflect.Proxy; import java.util.HashMap; import java.util.Map; import java.util.Set; +import java.util.function.Function; import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * 注解工具类
@@ -348,4 +355,47 @@ public class AnnotationUtil { final T annotation = getAnnotation(annotationEle, annotationType); return (T) Proxy.newProxyInstance(annotationType.getClassLoader(), new Class[]{annotationType}, new AnnotationProxy<>(annotation)); } + + /** + * 方法是否为注解属性方法。
+ * 方法无参数,且有返回值的方法认为是注解属性的方法。 + * + * @param method 方法 + */ + static boolean isAttributeMethod(Method method) { + return method.getParameterCount() == 0 && method.getReturnType() != void.class; + } + + /** + * 获取注解的全部属性值获取方法 + * + * @param annotationType 注解 + * @return 注解的全部属性值 + * @throws IllegalArgumentException 当别名属性在注解中不存在,或别名属性的值与原属性的值类型不一致时抛出 + */ + static Map getAttributeMethods(Class annotationType) { + // 获取全部注解属性值 + Map attributeMethods = Stream.of(annotationType.getDeclaredMethods()) + .filter(AnnotationUtil::isAttributeMethod) + .collect(Collectors.toMap(Method::getName, Function.identity())); + // 处理别名 + attributeMethods.forEach((methodName, method) -> { + String alias = Opt.ofNullable(method.getAnnotation(Alias.class)) + .map(Alias::value) + .orElse(null); + if (ObjectUtil.isNull(alias)) { + return; + } + // 存在别名,则将原本的值替换为别名对应的值 + Assert.isTrue(attributeMethods.containsKey(alias), "No method for alias: [{}]", alias); + Method aliasAttributeMethod = attributeMethods.get(alias); + Assert.isTrue( + ObjectUtil.isNull(aliasAttributeMethod) || ClassUtil.isAssignable(method.getReturnType(), aliasAttributeMethod.getReturnType()), + "Return type of the alias method [{}] is inconsistent with the original [{}]", + aliasAttributeMethod.getClass(), method.getParameterTypes() + ); + attributeMethods.put(methodName, aliasAttributeMethod); + }); + return attributeMethods; + } } diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/SyntheticAnnotation.java b/hutool-core/src/main/java/cn/hutool/core/annotation/SyntheticAnnotation.java new file mode 100644 index 0000000000..2df3297540 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/SyntheticAnnotation.java @@ -0,0 +1,335 @@ +package cn.hutool.core.annotation; + +import cn.hutool.core.annotation.scanner.MateAnnotationScanner; +import cn.hutool.core.lang.Opt; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; + +import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 表示一个根注解与根注解上的多层元注解合成的注解 + * + *

假设现有根注解A,A上存在元注解B,B上存在元注解C,则对A解析得到的合成注解X,X作为新的根注解,则CBA都是X的元注解。
+ * 通过{@link #isAnnotationPresent(Class)}可确定指定类型是注解是否是该合成注解的元注解,即是否为当前实例的“父类”。 + * 若指定注解是当前实例的元注解,则通过{@link #getAnnotation(Class)}可获得动态代理生成的对应的注解实例。
+ * 需要注意的是,由于认为合并注解X以最初的根注解A作为元注解,因此{@link #getAnnotations()}或{@link #getDeclaredAnnotations()} + * 都将只能获得A。 + * + *

不同层级的元注解可能存在同名的属性,此时,若认为该合成注解X在第0层,则根注解A在第1层,B在第2层......以此类推。 + * 层级越低的注解中离根注解距离近,则属性优先级越高,即遵循“就近原则”。
+ * 举个例子:若CBA同时存在属性y,则将X视为C,B或者A时,获得的y属性的值都与最底层元注解A的值保持一致。 + * 同理,不同层级可能会出现相同的元注解,比如A注解存在元注解B,C,但是C又存在元注解B,因此根据就近原则,A上的元注解B将优先于C上的元注解B生效。 + * 若两相同注解处于同一层级,则按照从其上一级“子注解”的{@link AnnotatedElement#getAnnotations()}的调用顺序排序。
+ * {@link #getAnnotation(Class)}获得的代理类实例的属性值遵循该规则。 + * + *

别名在合成注解中仍然有效,若注解X中任意属性上存在{@link Alias}注解,则{@link Alias#value()}指定的属性值将会覆盖注解属性的本身的值。
+ * {@link Alias}注解仅能指定注解X中存在的属性作为别名,不允许指定元注解或子类注解的属性。 + * + * @author huangchengxing + * @see AnnotationUtil + */ +public class SyntheticAnnotation
implements Annotation, AnnotatedElement { + + /** + * 根注解,即当前查找的注解 + */ + private final A source; + + /** + * 包含根注解以及其元注解在内的全部注解实例 + */ + private final Map, MetaAnnotation> metaAnnotationMap; + + /** + * 属性值缓存 + */ + private final Map attributeCaches; + + /** + * 构造 + * + * @param annotation 当前查找的注解类 + */ + SyntheticAnnotation(A annotation) { + this.source = annotation; + this.metaAnnotationMap = new LinkedHashMap<>(); + this.attributeCaches = new HashMap<>(); + loadMetaAnnotations(); // TODO 是否可以添加注解类对应的元注解信息缓存,避免每次都要解析? + } + + /** + * 基于指定根注解,构建包括其元注解在内的合成注解 + * + * @param rootAnnotation 根注解 + * @return 合成注解 + */ + public static SyntheticAnnotation of(T rootAnnotation) { + return new SyntheticAnnotation<>(rootAnnotation); + } + + /** + * 获取根注解 + * + * @return 根注解 + */ + public A getSource() { + return source; + } + + /** + * 获取已解析的元注解信息 + * + * @return 已解析的元注解信息 + */ + Map, MetaAnnotation> getMetaAnnotationMap() { + return metaAnnotationMap; + } + + /** + * 获取根注解类型 + * + * @return java.lang.Class + */ + @Override + public Class annotationType() { + return getSource().annotationType(); + } + + /** + * 获取属性值,若存在{@link Alias}则获取{@link Alias#value()}指定的别名属性的值 + *

当不同层级的注解之间存在同名属性时,将优先获取更接近根注解的属性 + * + * @param attributeName 属性名 + */ + public Object getAttribute(String attributeName) { + return attributeCaches.computeIfAbsent(attributeName, a -> metaAnnotationMap.values() + .stream() + .filter(ma -> ma.hasAttribute(attributeName)) // 集合默认是根据distance有序的,故此处无需再排序 + .findFirst() + .map(ma -> ma.getAttribute(attributeName)) + .orElse(null) + ); + } + + /** + * 若合成注解在存在指定元注解,则使用动态代理生成一个对应的注解实例 + * + * @param annotationType 注解类型 + * @param 注解类型 + * @return 注解 + */ + @SuppressWarnings("unchecked") + @Override + public T getAnnotation(Class annotationType) { + if (metaAnnotationMap.containsKey(annotationType)) { + return (T) Proxy.newProxyInstance( + annotationType.getClassLoader(), + new Class[]{annotationType, Synthesized.class}, + new SyntheticAnnotationProxy<>(this, annotationType) + ); + } + return null; + } + + /** + * 获取全部注解 + * + * @return java.lang.annotation.Annotation[] + */ + @Override + public Annotation[] getAnnotations() { + return getMetaAnnotationMap().values().toArray(new MetaAnnotation[0]); + } + + /** + * 获取根注解直接声明注解 + * + * @return 直接声明注解 + */ + @Override + public Annotation[] getDeclaredAnnotations() { + return new Annotation[]{ getSource() }; + } + + /** + * 广度优先遍历并缓存该根注解上的全部元注解 + */ + private void loadMetaAnnotations() { + // 若该注解已经是合成注解,则直接使用已解析好的元注解信息 + if (source instanceof SyntheticAnnotation.Synthesized) { + this.metaAnnotationMap.putAll(((Synthesized)source).getMetaAnnotationMap()); + return; + } + // 扫描元注解 + metaAnnotationMap.put(source.annotationType(), new MetaAnnotation(source, 0)); + new MateAnnotationScanner().scan( + (index, annotation) -> metaAnnotationMap.computeIfAbsent( + // 当出现重复的注解时,由于后添加的注解必然层级更高,优先级更低,因此当直接忽略 + annotation.annotationType(), t -> new MetaAnnotation(annotation, index) + ), + source.annotationType(), null + ); + } + + /** + * 元注解包装类 + * + * @author huangchengxing + */ + static class MetaAnnotation implements Annotation { + + private final Annotation annotation; + private final Map attributeMethodCaches; + private final int distance; + + public MetaAnnotation(Annotation annotation, int distance) { + this.annotation = annotation; + this.distance = distance; + this.attributeMethodCaches = AnnotationUtil.getAttributeMethods(annotation.annotationType()); + } + + /** + * 获取注解类型 + * + * @return 注解类型 + */ + @Override + public Class annotationType() { + return annotation.annotationType(); + } + + /** + * 获取元注解 + * + * @return 元注解 + */ + public Annotation get() { + return annotation; + } + + /** + * 获取根注解到元注解的距离 + * + * @return 根注解到元注解的距离 + */ + public int getDistance() { + return distance; + } + + /** + * 元注解是否存在该属性 + * + * @param attributeName 属性名 + * @return 是否存在该属性 + */ + public boolean hasAttribute(String attributeName) { + return attributeMethodCaches.containsKey(attributeName); + } + + /** + * 获取元注解的属性值 + * + * @param attributeName 属性名 + * @return 元注解的属性值 + */ + public Object getAttribute(String attributeName) { + return Opt.ofNullable(attributeMethodCaches.get(attributeName)) + .map(method -> ReflectUtil.invoke(annotation, method)) + .orElse(null); + } + + } + + /** + * 表示一个已经被合成的注解 + * + * @author huangchengxing + */ + interface Synthesized { + + /** + * 获取合成注解中已解析的元注解信息 + * + * @return 合成注解中已解析的元注解信息 + */ + Map, MetaAnnotation> getMetaAnnotationMap(); + + static boolean isMetaAnnotationMapMethod(Method method) { + return StrUtil.equals("getMetaAnnotationMap", method.getName()); + } + + } + + /** + * 合成注解代理类 + * + * @author huangchengxing + */ + static class SyntheticAnnotationProxy implements Annotation, InvocationHandler { + + private final Class annotationType; + private final SyntheticAnnotation syntheticAnnotation; + + public SyntheticAnnotationProxy(SyntheticAnnotation syntheticAnnotation, Class annotationType) { + this.syntheticAnnotation = syntheticAnnotation; + this.annotationType = annotationType; + } + + @Override + public Class annotationType() { + return annotationType; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + if (Synthesized.isMetaAnnotationMapMethod(method)) { + return syntheticAnnotation.getMetaAnnotationMap(); + } + if (ReflectUtil.isHashCodeMethod(method)) { + return getHashCode(); + } + if (ReflectUtil.isToStringMethod(method)) { + return getToString(); + } + return ObjectUtil.defaultIfNull( + syntheticAnnotation.getAttribute(method.getName()), + () -> ReflectUtil.invoke(this, method, args) + ); + } + + /** + * 获取toString值 + * + * @return toString值 + */ + private String getToString() { + String attributes = Stream.of(annotationType().getDeclaredMethods()) + .filter(AnnotationUtil::isAttributeMethod) + .map(method -> StrUtil.format("{}={}", method.getName(), syntheticAnnotation.getAttribute(method.getName()))) + .collect(Collectors.joining(", ")); + return StrUtil.format("@{}({})", annotationType().getName(), attributes); + } + + /** + * 获取hashcode值 + * + * @return hashcode值 + */ + private int getHashCode() { + return Objects.hash((Object)syntheticAnnotation.getAnnotations()); + } + + } +} diff --git a/hutool-core/src/test/java/cn/hutool/core/annotation/SyntheticAnnotationTest.java b/hutool-core/src/test/java/cn/hutool/core/annotation/SyntheticAnnotationTest.java new file mode 100644 index 0000000000..a81147e2e0 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/annotation/SyntheticAnnotationTest.java @@ -0,0 +1,81 @@ +package cn.hutool.core.annotation; + +import org.junit.Assert; +import org.junit.Test; + +import java.lang.annotation.*; +import java.util.Map; + +/** + * 合成注解{@link SyntheticAnnotation}的测试用例 + * + * @author huangchengxing + */ +public class SyntheticAnnotationTest { + + @Test + public void testSynthesisAnnotation() { + ChildAnnotation rootAnnotation = AnnotatedClass.class.getAnnotation(ChildAnnotation.class); + SyntheticAnnotation syntheticAnnotation = SyntheticAnnotation.of(rootAnnotation); + Assert.assertEquals(syntheticAnnotation.getSource(), rootAnnotation); + Assert.assertEquals(syntheticAnnotation.annotationType(), rootAnnotation.annotationType()); + Assert.assertEquals(1, syntheticAnnotation.getDeclaredAnnotations().length); + Assert.assertEquals(syntheticAnnotation.getDeclaredAnnotations()[0], rootAnnotation); + Assert.assertEquals(3, syntheticAnnotation.getAnnotations().length); + + Assert.assertEquals(syntheticAnnotation.getAttribute("childValue"), "Child!"); + Assert.assertEquals(syntheticAnnotation.getAttribute("childValueAlias"), "Child!"); + Assert.assertEquals(syntheticAnnotation.getAttribute("parentValue"), "Child's Parent!"); + Assert.assertEquals(syntheticAnnotation.getAttribute("grandParentValue"), "Child's GrandParent!"); + + Map, SyntheticAnnotation.MetaAnnotation> annotationMap = syntheticAnnotation.getMetaAnnotationMap(); + ChildAnnotation childAnnotation = syntheticAnnotation.getAnnotation(ChildAnnotation.class); + Assert.assertTrue(syntheticAnnotation.isAnnotationPresent(ChildAnnotation.class)); + Assert.assertNotNull(childAnnotation); + Assert.assertEquals(childAnnotation.childValue(), "Child!"); + Assert.assertEquals(childAnnotation.childValueAlias(), "Child!"); + Assert.assertEquals(annotationMap, SyntheticAnnotation.of(childAnnotation).getMetaAnnotationMap()); + + ParentAnnotation parentAnnotation = syntheticAnnotation.getAnnotation(ParentAnnotation.class); + Assert.assertTrue(syntheticAnnotation.isAnnotationPresent(ParentAnnotation.class)); + Assert.assertNotNull(parentAnnotation); + Assert.assertEquals(parentAnnotation.parentValue(), "Child's Parent!"); + Assert.assertEquals(annotationMap, SyntheticAnnotation.of(parentAnnotation).getMetaAnnotationMap()); + + GrandParentAnnotation grandParentAnnotation = syntheticAnnotation.getAnnotation(GrandParentAnnotation.class); + Assert.assertTrue(syntheticAnnotation.isAnnotationPresent(GrandParentAnnotation.class)); + Assert.assertNotNull(grandParentAnnotation); + Assert.assertEquals(grandParentAnnotation.grandParentValue(), "Child's GrandParent!"); + Assert.assertEquals(annotationMap, SyntheticAnnotation.of(grandParentAnnotation).getMetaAnnotationMap()); + } + + // 注解结构如下: + // AnnotatedClass -> @ChildAnnotation -> @ParentAnnotation -> @GrandParentAnnotation + // -> @GrandParentAnnotation + @ChildAnnotation(childValueAlias = "Child!") + class AnnotatedClass {} + + @Retention(RetentionPolicy.RUNTIME) + @Target({ ElementType.ANNOTATION_TYPE }) + @interface GrandParentAnnotation { + String grandParentValue() default ""; + } + + @GrandParentAnnotation(grandParentValue = "Parent's GrandParent!") // 覆盖元注解@GrandParentAnnotation的属性 + @Retention(RetentionPolicy.RUNTIME) + @Target({ ElementType.TYPE }) + @interface ParentAnnotation { + String parentValue() default ""; + } + + @GrandParentAnnotation(grandParentValue = "Child's GrandParent!") // 重复的元注解,靠近根注解的优先级高 + @ParentAnnotation(parentValue = "Child's Parent!") // 覆盖元注解@ParentAnnotation的属性 + @Retention(RetentionPolicy.RUNTIME) + @Target({ ElementType.METHOD, ElementType.TYPE }) + @interface ChildAnnotation { + String childValueAlias() default ""; + @Alias("childValueAlias") + String childValue() default ""; + } + +} -- Gitee From b8a30fd11b445e0fd78ec94f3eac5ef1710ac0ae Mon Sep 17 00:00:00 2001 From: huangchengxing <841396397@qq.com> Date: Tue, 14 Jun 2022 15:56:26 +0800 Subject: [PATCH 0088/1737] =?UTF-8?q?=E6=B3=A8=E8=A7=A3=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E7=B1=BB=E6=B7=BB=E5=8A=A0=E8=8E=B7=E5=8F=96=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E6=B3=A8=E8=A7=A3=E7=9A=84=E6=96=B9=E6=B3=95;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/annotation/AnnotationUtil.java | 42 +++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java b/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java index 1a5f24450a..5c3f217aa4 100755 --- a/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java @@ -1,5 +1,6 @@ package cn.hutool.core.annotation; +import cn.hutool.core.annotation.scanner.*; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.lang.Assert; @@ -19,9 +20,7 @@ import java.lang.annotation.Target; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Method; import java.lang.reflect.Proxy; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -356,6 +355,43 @@ public class AnnotationUtil { return (T) Proxy.newProxyInstance(annotationType.getClassLoader(), new Class[]{annotationType}, new AnnotationProxy<>(annotation)); } + /** + * 将指定注解实例与其元注解转为合成注解 + * + * @param annotation 注解 + * @param annotationType 注解类型 + * @param 注解类型 + * @return 合成注解 + * @see SyntheticAnnotation + */ + public static T getSynthesisAnnotation(Annotation annotation, Class annotationType) { + return SyntheticAnnotation.of(annotation).getAnnotation(annotationType); + } + + /** + * 获取元素上所有指定注解 + *

+ * + * @param annotatedElement 可注解元素 + * @param annotationType 注解类型 + * @param 注解类型 + * @return 注解 + * @see SyntheticAnnotation + */ + public static List getAllSynthesisAnnotations(AnnotatedElement annotatedElement, Class annotationType) { + AnnotationScanner[] scanners = new AnnotationScanner[] { + new MateAnnotationScanner(), new TypeAnnotationScanner(), new MethodAnnotationScanner(), new FieldAnnotationScanner() + }; + return AnnotationScanner.scanByAnySupported(annotatedElement, scanners).stream() + .map(SyntheticAnnotation::of) + .map(annotation -> annotation.getAnnotation(annotationType)) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } + /** * 方法是否为注解属性方法。
* 方法无参数,且有返回值的方法认为是注解属性的方法。 -- Gitee From 5e402a1dd969df8cef2b54c5fb5a2e4ab15e1494 Mon Sep 17 00:00:00 2001 From: huangchengxing <841396397@qq.com> Date: Tue, 14 Jun 2022 17:25:57 +0800 Subject: [PATCH 0089/1737] =?UTF-8?q?=E5=90=88=E6=88=90=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E8=B0=83=E6=95=B4=E4=B8=BA=E5=90=8C=E6=97=B6?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E5=90=8D=E7=A7=B0=E5=92=8C=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E8=A6=86=E7=9B=96;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/annotation/SyntheticAnnotation.java | 38 ++++++++++++++----- .../annotation/SyntheticAnnotationTest.java | 18 ++++++--- 2 files changed, 40 insertions(+), 16 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/SyntheticAnnotation.java b/hutool-core/src/main/java/cn/hutool/core/annotation/SyntheticAnnotation.java index 2df3297540..3db0bacfcf 100644 --- a/hutool-core/src/main/java/cn/hutool/core/annotation/SyntheticAnnotation.java +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/SyntheticAnnotation.java @@ -2,6 +2,8 @@ package cn.hutool.core.annotation; import cn.hutool.core.annotation.scanner.MateAnnotationScanner; import cn.hutool.core.lang.Opt; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ClassUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; @@ -21,7 +23,7 @@ import java.util.stream.Stream; /** * 表示一个根注解与根注解上的多层元注解合成的注解 * - *

假设现有根注解A,A上存在元注解B,B上存在元注解C,则对A解析得到的合成注解X,X作为新的根注解,则CBA都是X的元注解。
+ *

假设现有注解A,A上存在元注解B,B上存在元注解C,则对A解析得到的合成注解X,则CBA都是X的元注解,X为根注解。
* 通过{@link #isAnnotationPresent(Class)}可确定指定类型是注解是否是该合成注解的元注解,即是否为当前实例的“父类”。 * 若指定注解是当前实例的元注解,则通过{@link #getAnnotation(Class)}可获得动态代理生成的对应的注解实例。
* 需要注意的是,由于认为合并注解X以最初的根注解A作为元注解,因此{@link #getAnnotations()}或{@link #getDeclaredAnnotations()} @@ -34,6 +36,8 @@ import java.util.stream.Stream; * 若两相同注解处于同一层级,则按照从其上一级“子注解”的{@link AnnotatedElement#getAnnotations()}的调用顺序排序。
* {@link #getAnnotation(Class)}获得的代理类实例的属性值遵循该规则。 * + *

同名属性将根据类型彼此隔离,即当不同层级的元注解存在同名的属性,但是属性类型不同时,此时低层级的属性并不会覆盖高层级注解的属性。 + * *

别名在合成注解中仍然有效,若注解X中任意属性上存在{@link Alias}注解,则{@link Alias#value()}指定的属性值将会覆盖注解属性的本身的值。
* {@link Alias}注解仅能指定注解X中存在的属性作为别名,不允许指定元注解或子类注解的属性。 * @@ -55,7 +59,7 @@ public class SyntheticAnnotation
implements Annotation, An /** * 属性值缓存 */ - private final Map attributeCaches; + private final Map, Object>> attributeCaches; /** * 构造 @@ -108,15 +112,16 @@ public class SyntheticAnnotation implements Annotation, An } /** - * 获取属性值,若存在{@link Alias}则获取{@link Alias#value()}指定的别名属性的值 - *

当不同层级的注解之间存在同名属性时,将优先获取更接近根注解的属性 + * 根据指定的属性名与属性类型获取对应的属性值,若存在{@link Alias}则获取{@link Alias#value()}指定的别名属性的值 + *

当不同层级的注解之间存在同名同类型属性时,将优先获取更接近根注解的属性 * * @param attributeName 属性名 */ - public Object getAttribute(String attributeName) { - return attributeCaches.computeIfAbsent(attributeName, a -> metaAnnotationMap.values() + public Object getAttribute(String attributeName, Class attributeType) { + Map, Object> values = attributeCaches.computeIfAbsent(attributeName, t -> MapUtil.newHashMap()); + return values.computeIfAbsent(attributeType, a -> metaAnnotationMap.values() .stream() - .filter(ma -> ma.hasAttribute(attributeName)) // 集合默认是根据distance有序的,故此处无需再排序 + .filter(ma -> ma.hasAttribute(attributeName, attributeType)) // 集合默认是根据distance有序的,故此处无需再排序 .findFirst() .map(ma -> ma.getAttribute(attributeName)) .orElse(null) @@ -154,7 +159,7 @@ public class SyntheticAnnotation implements Annotation, An } /** - * 获取根注解直接声明注解 + * 获取根注解直接声明的注解,该方法正常情况下当只返回原注解 * * @return 直接声明注解 */ @@ -238,6 +243,19 @@ public class SyntheticAnnotation implements Annotation, An return attributeMethodCaches.containsKey(attributeName); } + /** + * 元注解是否存在该属性,且该属性的值类型是指定类型或其子类 + * + * @param attributeName 属性名 + * @param returnType 返回值类型 + * @return 是否存在该属性 + */ + public boolean hasAttribute(String attributeName, Class returnType) { + return Opt.ofNullable(attributeMethodCaches.get(attributeName)) + .filter(method -> ClassUtil.isAssignable(returnType, method.getReturnType())) + .isPresent(); + } + /** * 获取元注解的属性值 * @@ -304,7 +322,7 @@ public class SyntheticAnnotation implements Annotation, An return getToString(); } return ObjectUtil.defaultIfNull( - syntheticAnnotation.getAttribute(method.getName()), + syntheticAnnotation.getAttribute(method.getName(), method.getReturnType()), () -> ReflectUtil.invoke(this, method, args) ); } @@ -317,7 +335,7 @@ public class SyntheticAnnotation implements Annotation, An private String getToString() { String attributes = Stream.of(annotationType().getDeclaredMethods()) .filter(AnnotationUtil::isAttributeMethod) - .map(method -> StrUtil.format("{}={}", method.getName(), syntheticAnnotation.getAttribute(method.getName()))) + .map(method -> StrUtil.format("{}={}", method.getName(), syntheticAnnotation.getAttribute(method.getName(), method.getReturnType()))) .collect(Collectors.joining(", ")); return StrUtil.format("@{}({})", annotationType().getName(), attributes); } diff --git a/hutool-core/src/test/java/cn/hutool/core/annotation/SyntheticAnnotationTest.java b/hutool-core/src/test/java/cn/hutool/core/annotation/SyntheticAnnotationTest.java index a81147e2e0..8e1db5d3fc 100644 --- a/hutool-core/src/test/java/cn/hutool/core/annotation/SyntheticAnnotationTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/annotation/SyntheticAnnotationTest.java @@ -23,10 +23,10 @@ public class SyntheticAnnotationTest { Assert.assertEquals(syntheticAnnotation.getDeclaredAnnotations()[0], rootAnnotation); Assert.assertEquals(3, syntheticAnnotation.getAnnotations().length); - Assert.assertEquals(syntheticAnnotation.getAttribute("childValue"), "Child!"); - Assert.assertEquals(syntheticAnnotation.getAttribute("childValueAlias"), "Child!"); - Assert.assertEquals(syntheticAnnotation.getAttribute("parentValue"), "Child's Parent!"); - Assert.assertEquals(syntheticAnnotation.getAttribute("grandParentValue"), "Child's GrandParent!"); + Assert.assertEquals(syntheticAnnotation.getAttribute("childValue", String.class), "Child!"); + Assert.assertEquals(syntheticAnnotation.getAttribute("childValueAlias", String.class), "Child!"); + Assert.assertEquals(syntheticAnnotation.getAttribute("parentValue", String.class), "Child's Parent!"); + Assert.assertEquals(syntheticAnnotation.getAttribute("grandParentValue", String.class), "Child's GrandParent!"); Map, SyntheticAnnotation.MetaAnnotation> annotationMap = syntheticAnnotation.getMetaAnnotationMap(); ChildAnnotation childAnnotation = syntheticAnnotation.getAnnotation(ChildAnnotation.class); @@ -34,31 +34,35 @@ public class SyntheticAnnotationTest { Assert.assertNotNull(childAnnotation); Assert.assertEquals(childAnnotation.childValue(), "Child!"); Assert.assertEquals(childAnnotation.childValueAlias(), "Child!"); + Assert.assertEquals(childAnnotation.grandParentType(), Integer.class); Assert.assertEquals(annotationMap, SyntheticAnnotation.of(childAnnotation).getMetaAnnotationMap()); ParentAnnotation parentAnnotation = syntheticAnnotation.getAnnotation(ParentAnnotation.class); Assert.assertTrue(syntheticAnnotation.isAnnotationPresent(ParentAnnotation.class)); Assert.assertNotNull(parentAnnotation); Assert.assertEquals(parentAnnotation.parentValue(), "Child's Parent!"); + Assert.assertEquals(parentAnnotation.grandParentType(), "java.lang.Void"); Assert.assertEquals(annotationMap, SyntheticAnnotation.of(parentAnnotation).getMetaAnnotationMap()); GrandParentAnnotation grandParentAnnotation = syntheticAnnotation.getAnnotation(GrandParentAnnotation.class); Assert.assertTrue(syntheticAnnotation.isAnnotationPresent(GrandParentAnnotation.class)); Assert.assertNotNull(grandParentAnnotation); Assert.assertEquals(grandParentAnnotation.grandParentValue(), "Child's GrandParent!"); + Assert.assertEquals(grandParentAnnotation.grandParentType(), Integer.class); Assert.assertEquals(annotationMap, SyntheticAnnotation.of(grandParentAnnotation).getMetaAnnotationMap()); } // 注解结构如下: // AnnotatedClass -> @ChildAnnotation -> @ParentAnnotation -> @GrandParentAnnotation // -> @GrandParentAnnotation - @ChildAnnotation(childValueAlias = "Child!") - class AnnotatedClass {} + @ChildAnnotation(childValueAlias = "Child!", grandParentType = Integer.class) + static class AnnotatedClass {} @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.ANNOTATION_TYPE }) @interface GrandParentAnnotation { String grandParentValue() default ""; + Class grandParentType() default Void.class; } @GrandParentAnnotation(grandParentValue = "Parent's GrandParent!") // 覆盖元注解@GrandParentAnnotation的属性 @@ -66,6 +70,7 @@ public class SyntheticAnnotationTest { @Target({ ElementType.TYPE }) @interface ParentAnnotation { String parentValue() default ""; + String grandParentType() default "java.lang.Void"; } @GrandParentAnnotation(grandParentValue = "Child's GrandParent!") // 重复的元注解,靠近根注解的优先级高 @@ -76,6 +81,7 @@ public class SyntheticAnnotationTest { String childValueAlias() default ""; @Alias("childValueAlias") String childValue() default ""; + Class grandParentType() default Void.class; } } -- Gitee From f5318c6daddc1114f40119e0030dcde56819c8e3 Mon Sep 17 00:00:00 2001 From: huangzhiquan <6498754713@qq.com> Date: Wed, 15 Jun 2022 14:59:57 +0800 Subject: [PATCH 0090/1737] =?UTF-8?q?fix:=201.HttpResponse=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E8=AE=BE=E7=BD=AEbodyBytes=E5=82=A8=E5=AD=98=E4=B8=BB?= =?UTF-8?q?=E4=BD=93=E6=96=B9=E6=B3=95=EF=BC=88=E4=BF=AE=E5=A4=8D=E4=BD=BF?= =?UTF-8?q?=E7=94=A8HttpResponse=E6=8B=A6=E6=88=AA=E5=99=A8=E8=A7=A3?= =?UTF-8?q?=E5=AF=86=E6=97=A0=E6=B3=95=E9=87=8D=E6=96=B0=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?bodyBytes=E4=B8=BB=E4=BD=93=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/hutool/http/HttpResponse.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java b/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java index 21f018f2b3..a4439b527f 100755 --- a/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java +++ b/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java @@ -255,6 +255,21 @@ public class HttpResponse extends HttpBase implements Closeable { return this.bodyBytes; } + /** + * 设置主体字节码
+ * 需在此方法调用前使用charset方法设置编码,否则使用默认编码UTF-8 + * + * @param bodyBytes 主体 + * @return this + */ + public HttpResponse body(byte[] bodyBytes) { + sync(); + if (null != bodyBytes) { + this.bodyBytes = bodyBytes; + } + return this; + } + /** * 获取响应主体 * -- Gitee From 60dd7ce5633bd866cd16a0ddc15101a005bc9e66 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 16 Jun 2022 12:10:56 +0800 Subject: [PATCH 0091/1737] fix buf --- CHANGELOG.md | 3 ++- .../src/test/java/cn/hutool/core/util/ReUtilTest.java | 8 ++++++++ .../hutool/extra/compress/extractor/StreamExtractor.java | 5 ++++- .../src/test/java/cn/hutool/http/HttpRequestTest.java | 7 +++++++ hutool-json/src/main/java/cn/hutool/json/JSONParser.java | 2 ++ 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c77f962ec7..1ecad145e7 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.4.M1 (2022-06-14) +# 5.8.4.M1 (2022-06-16) ### 🐣新特性 * 【extra 】 Sftp增加构造重载,支持超时(pr#653@Gitee) @@ -11,6 +11,7 @@ * 【json 】 修改byte[]统一转换为数组形式(issue#2377@Github) * ### 🐞Bug修复 +* 【extra 】 修复createExtractor中抛出异常后流未关闭问题(issue#2384@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java index 0b26e62414..116c48f5d3 100755 --- a/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java @@ -142,6 +142,14 @@ public class ReUtilTest { Assert.assertEquals("我有个\\$符号\\{\\}", escape); } + @Test + public void escapeTest2(){ + String str = "a[bbbc"; + String re = "["; + final String s = ReUtil.get(ReUtil.escape(re), str, 0); + Assert.assertEquals("[", s); + } + @Test public void getAllGroupsTest() { //转义给定字符串,为正则相关的特殊符号转义 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/StreamExtractor.java b/hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/StreamExtractor.java index 150cea1011..a81eb3af7d 100755 --- a/hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/StreamExtractor.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/StreamExtractor.java @@ -59,7 +59,8 @@ public class StreamExtractor implements Extractor{ } /** - * 构造 + * 构造
+ * 如果抛出异常,则提供的流将被关闭 * * @param charset 编码 * @param archiverName 归档包格式,null表示自动检测 @@ -75,6 +76,8 @@ public class StreamExtractor implements Extractor{ this.in = factory.createArchiveInputStream(archiverName, in); } } catch (ArchiveException e) { + // issue#2384,如果报错可能持有文件句柄,导致无法删除文件 + IoUtil.close(in); throw new CompressException(e); } } diff --git a/hutool-http/src/test/java/cn/hutool/http/HttpRequestTest.java b/hutool-http/src/test/java/cn/hutool/http/HttpRequestTest.java index 765218027c..0d326d15ac 100644 --- a/hutool-http/src/test/java/cn/hutool/http/HttpRequestTest.java +++ b/hutool-http/src/test/java/cn/hutool/http/HttpRequestTest.java @@ -204,4 +204,11 @@ public class HttpRequestTest { HttpRequest httpRequest = new HttpRequest(urlBuilder); httpRequest.setMethod(Method.GET).execute(); } + + @Test + public void get122Test(){ + String url = "http://122.112.234.240:9007/monitor/devices/real/59312710/all/0"; + final String s = HttpUtil.get(url); + Console.log(s); + } } diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONParser.java b/hutool-json/src/main/java/cn/hutool/json/JSONParser.java index 6eedd09c6e..dc341408be 100755 --- a/hutool-json/src/main/java/cn/hutool/json/JSONParser.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONParser.java @@ -77,6 +77,8 @@ public class JSONParser { case ';': case ',': if (tokener.nextClean() == '}') { + // issue#2380 + // 尾后逗号(Trailing Commas),JSON中虽然不支持,但是ECMAScript 2017支持,此处做兼容。 return; } tokener.back(); -- Gitee From 4203b6532bedd3644778ad8ae9c03d99f1498917 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 16 Jun 2022 12:25:51 +0800 Subject: [PATCH 0092/1737] fix bug and add methods --- CHANGELOG.md | 3 ++- .../src/test/java/cn/hutool/http/HttpRequestTest.java | 7 ------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ecad145e7..19f547c884 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,9 +9,10 @@ * 【extra 】 Sftp增加构造重载,支持超时(pr#653@Gitee) * 【core 】 BeanUtil增加isCommonFieldsEqual(pr#653@Gitee) * 【json 】 修改byte[]统一转换为数组形式(issue#2377@Github) +* 【http 】 HttpResponse增加body方法,支持自定义返回内容(pr#655@Gitee) * ### 🐞Bug修复 -* 【extra 】 修复createExtractor中抛出异常后流未关闭问题(issue#2384@Github) +* 【extra 】 修复createExtractor中抛出异常后流未关闭问题(pr#2384@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-http/src/test/java/cn/hutool/http/HttpRequestTest.java b/hutool-http/src/test/java/cn/hutool/http/HttpRequestTest.java index 0d326d15ac..765218027c 100644 --- a/hutool-http/src/test/java/cn/hutool/http/HttpRequestTest.java +++ b/hutool-http/src/test/java/cn/hutool/http/HttpRequestTest.java @@ -204,11 +204,4 @@ public class HttpRequestTest { HttpRequest httpRequest = new HttpRequest(urlBuilder); httpRequest.setMethod(Method.GET).execute(); } - - @Test - public void get122Test(){ - String url = "http://122.112.234.240:9007/monitor/devices/real/59312710/all/0"; - final String s = HttpUtil.get(url); - Console.log(s); - } } -- Gitee From 64e11c9de8fd48009f9207bb5cfb51c9474bcc31 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 16 Jun 2022 12:30:21 +0800 Subject: [PATCH 0093/1737] fix bug --- CHANGELOG.md | 1 + hutool-core/src/main/java/cn/hutool/core/text/csv/CsvData.java | 3 +++ 2 files changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19f547c884..779fdec9ea 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ * ### 🐞Bug修复 * 【extra 】 修复createExtractor中抛出异常后流未关闭问题(pr#2384@Github) +* 【core 】 修复CsvData.getHeader没有判空导致空指针问题(issue#I5CK7Q@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvData.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvData.java index 1bf31a92e8..bd852ad69e 100755 --- a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvData.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvData.java @@ -42,6 +42,9 @@ public class CsvData implements Iterable, Serializable { * @return the header row - might be {@code null} if no header exists */ public List getHeader() { + if(null == this.header){ + return null; + } return Collections.unmodifiableList(this.header); } -- Gitee From ea4bc023af99e0ef6b58f151e92a72b5bd304a07 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 16 Jun 2022 12:49:55 +0800 Subject: [PATCH 0094/1737] fix convert to int bug --- CHANGELOG.md | 1 + .../java/cn/hutool/core/convert/impl/NumberConverter.java | 2 +- .../src/test/java/cn/hutool/core/map/MapUtilTest.java | 7 +++++++ .../src/test/java/cn/hutool/core/util/NumberUtilTest.java | 6 ++++++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 779fdec9ea..92915ce9c9 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ ### 🐞Bug修复 * 【extra 】 修复createExtractor中抛出异常后流未关闭问题(pr#2384@Github) * 【core 】 修复CsvData.getHeader没有判空导致空指针问题(issue#I5CK7Q@Gitee) +* 【core 】 修复单字母转换为数字的问题(issue#I5C4K1@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/NumberConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/NumberConverter.java index 421628c91e..1a2837ff1f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/NumberConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/NumberConverter.java @@ -68,7 +68,7 @@ public class NumberConverter extends AbstractConverter { @Override protected String convertToStr(Object value) { String result = StrUtil.trim(super.convertToStr(value)); - if (StrUtil.isNotEmpty(result)) { + if (null != result && result.length() > 1) { final char c = Character.toUpperCase(result.charAt(result.length() - 1)); if (c == 'D' || c == 'L' || c == 'F') { // 类型标识形式(例如123.6D) diff --git a/hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java index aa667dc450..0f371b0725 100644 --- a/hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java @@ -217,4 +217,11 @@ public class MapUtilTest { Assert.assertEquals(Integer.valueOf(1), map.get("a")); Assert.assertEquals(Integer.valueOf(2), map.get("b")); } + + @Test(expected = NumberFormatException.class) + public void getIntTest(){ + final HashMap map = MapUtil.of("age", "d"); + final Integer age = MapUtil.getInt(map, "age"); + Assert.assertNotNull(age); + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java index 4368ada2f4..d4ab4b079d 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java @@ -287,6 +287,12 @@ public class NumberUtilTest { Assert.assertEquals(1482, v1); } + @Test(expected = NumberFormatException.class) + public void parseIntTest3() { + int v1 = NumberUtil.parseInt("d"); + Assert.assertEquals(0, v1); + } + @Test public void parseNumberTest() { // from 5.4.8 issue#I23ORQ@Gitee -- Gitee From 231e0cf1d7d43e8c3f8b6d079ebeb97ba9ea00aa Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 16 Jun 2022 13:05:53 +0800 Subject: [PATCH 0095/1737] add test --- .../src/test/java/cn/hutool/core/util/ReUtilTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java index 116c48f5d3..ee2d51cbbf 100755 --- a/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java @@ -150,6 +150,14 @@ public class ReUtilTest { Assert.assertEquals("[", s); } + @Test + public void escapeTest3(){ + String context = "{prefix}_"; + String regex = "{prefix}_"; + final boolean b = ReUtil.isMatch(ReUtil.escape(regex), context); + Assert.assertTrue(b); + } + @Test public void getAllGroupsTest() { //转义给定字符串,为正则相关的特殊符号转义 -- Gitee From 4670dccb67e88a8a6841b4df0fba75c5423927ca Mon Sep 17 00:00:00 2001 From: witt Date: Fri, 17 Jun 2022 11:55:32 +0800 Subject: [PATCH 0096/1737] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=B1=A0=E5=85=B3=E9=97=AD=E6=97=B6=EF=BC=8C=E9=98=BB=E5=A1=9E?= =?UTF-8?q?=E7=AD=96=E7=95=A5=E4=BB=8D=E7=84=B6=E5=8F=AF=E4=BB=A5=E5=B0=86?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=B7=BB=E5=8A=A0=E5=88=B0=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=B1=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hutool/core/thread/BlockPolicy.java | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/BlockPolicy.java b/hutool-core/src/main/java/cn/hutool/core/thread/BlockPolicy.java index 8128a483be..745c00dc51 100755 --- a/hutool-core/src/main/java/cn/hutool/core/thread/BlockPolicy.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/BlockPolicy.java @@ -3,6 +3,7 @@ package cn.hutool.core.thread; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; +import java.util.function.Consumer; /** * 当任务队列过长时处于阻塞状态,直到添加到队列中 @@ -14,15 +15,35 @@ import java.util.concurrent.ThreadPoolExecutor; */ public class BlockPolicy implements RejectedExecutionHandler { + /** + * 线程池关闭时,为避免任务丢失,留下处理方法 + * 如果需要由调用方来运行,可以{@code new BlockPolicy(Runnable::run)} + */ + private final Consumer handlerwhenshutdown; + + public BlockPolicy(final Consumer handlerwhenshutdown) { + this.handlerwhenshutdown = handlerwhenshutdown; + } + public BlockPolicy() { + this(null); } @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { - try { - e.getQueue().put(r); - } catch (InterruptedException ex) { - throw new RejectedExecutionException("Task " + r + " rejected from " + e); + // 线程池未关闭时,阻塞等待 + if(!e.isShutdown()){ + try { + e.getQueue().put(r); + } catch (InterruptedException ex) { + throw new RejectedExecutionException("Task " + r + " rejected from " + e); + } + return; + } + + // 当设置了关闭时候的处理 + if(null != handlerwhenshutdown){ + handlerwhenshutdown.accept(r); } } } -- Gitee From d9601cbbf503e23a148019a05e18d2fa1b80d4cf Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 18 Jun 2022 11:06:56 +0800 Subject: [PATCH 0097/1737] change code for ObjectUtil.isNotNull --- CHANGELOG.md | 3 ++- .../src/main/java/cn/hutool/core/util/ObjectUtil.java | 11 ++++++++--- .../test/java/cn/hutool/core/util/ObjectUtilTest.java | 6 ++++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92915ce9c9..dc2c8d73ed 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,13 +3,14 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.4.M1 (2022-06-16) +# 5.8.4.M1 (2022-06-18) ### 🐣新特性 * 【extra 】 Sftp增加构造重载,支持超时(pr#653@Gitee) * 【core 】 BeanUtil增加isCommonFieldsEqual(pr#653@Gitee) * 【json 】 修改byte[]统一转换为数组形式(issue#2377@Github) * 【http 】 HttpResponse增加body方法,支持自定义返回内容(pr#655@Gitee) +* 【core 】 修改ObjectUtil.isNull逻辑(issue#I5COJF@Gitee) * ### 🐞Bug修复 * 【extra 】 修复createExtractor中抛出异常后流未关闭问题(pr#2384@Github) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java index 00c3454de6..bc064f864d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java @@ -211,12 +211,17 @@ public class ObjectUtil { /** * 检查对象是否不为null + *

+	 * 1. != null
+	 * 2. not equals(null)
+	 * 
* * @param obj 对象 - * @return 是否为null + * @return 是否为非null */ public static boolean isNotNull(Object obj) { - return false == isNull(obj); + //noinspection ConstantConditions + return null != obj && false == obj.equals(null); } /** @@ -621,8 +626,8 @@ public class ObjectUtil { * * @param objs 被检查对象 * @return 是否存在 - * @since 5.5.3 * @see ArrayUtil#hasNull(Object[]) + * @since 5.5.3 */ public static boolean hasNull(Object... objs) { return ArrayUtil.hasNull(objs); diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ObjectUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ObjectUtilTest.java index 347a534f72..175efa1ef2 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/ObjectUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/ObjectUtilTest.java @@ -93,4 +93,10 @@ public class ObjectUtilTest { final boolean basicType = ObjectUtil.isBasicType(a); Assert.assertTrue(basicType); } + + @Test + public void isNotNullTest(){ + String a = null; + Assert.assertFalse(ObjectUtil.isNotNull(a)); + } } -- Gitee From 96c9a3529c9a2e9d6c7fc2e5d2d5f220774e5187 Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 18 Jun 2022 23:54:06 +0800 Subject: [PATCH 0098/1737] fix bug --- CHANGELOG.md | 1 + .../src/main/java/cn/hutool/core/collection/IterUtil.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc2c8d73ed..2eabe10625 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ * 【extra 】 修复createExtractor中抛出异常后流未关闭问题(pr#2384@Github) * 【core 】 修复CsvData.getHeader没有判空导致空指针问题(issue#I5CK7Q@Gitee) * 【core 】 修复单字母转换为数字的问题(issue#I5C4K1@Gitee) +* 【core 】 修复IterUtil.filter无效问题 ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java index b7db3b13fd..b930486184 100755 --- a/hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java @@ -689,7 +689,7 @@ public class IterUtil { for (T t : iter) { modified = (null == editor) ? t : editor.edit(t); if (null != modified) { - result.add(t); + result.add(modified); } } return result; -- Gitee From 916a56dac382e519737f2f5be34063d46964f589 Mon Sep 17 00:00:00 2001 From: lihai03 Date: Mon, 20 Jun 2022 11:12:21 +0800 Subject: [PATCH 0099/1737] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=B8=A6=E9=BB=98=E8=AE=A4=E5=80=BC=E7=9A=84=20Ipv4Util.ipv4To?= =?UTF-8?q?Long=20=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/hutool/core/net/Ipv4Util.java | 11 +++++++++++ .../test/java/cn/hutool/core/net/Ipv4UtilTest.java | 13 +++++++++++++ 2 files changed, 24 insertions(+) diff --git a/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Util.java b/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Util.java index 886f9c47fe..15adb041c2 100755 --- a/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Util.java +++ b/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Util.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.ListUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.PatternPool; +import cn.hutool.core.lang.Validator; import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.StrUtil; @@ -168,6 +169,16 @@ public class Ipv4Util { throw new IllegalArgumentException("Invalid IPv4 address!"); } + /** + * 根据ip地址(xxx.xxx.xxx.xxx)计算出long型的数据, 如果格式不正确返回 defaultValue + * @param strIP IP V4 地址 + * @param defaultValue 默认值 + * @return long值 + */ + public static long ipv4ToLong(String strIP, long defaultValue) { + return Validator.isIpv4(strIP) ? ipv4ToLong(strIP) : defaultValue; + } + /** * 根据 ip/掩码位 计算IP段的起始IP(字符串型) * 方法别名:inet_ntoa diff --git a/hutool-core/src/test/java/cn/hutool/core/net/Ipv4UtilTest.java b/hutool-core/src/test/java/cn/hutool/core/net/Ipv4UtilTest.java index 13d5ddbd17..3d590f9b07 100644 --- a/hutool-core/src/test/java/cn/hutool/core/net/Ipv4UtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/net/Ipv4UtilTest.java @@ -86,4 +86,17 @@ public class Ipv4UtilTest { l = Ipv4Util.ipv4ToLong("255.255.255.255"); Assert.assertEquals(4294967295L, l); } + + @Test + public void ipv4ToLongWithDefaultTest() { + String strIP = "不正确的 IP 地址"; + long defaultValue = 0L; + long ipOfLong = Ipv4Util.ipv4ToLong(strIP, defaultValue); + Assert.assertEquals(ipOfLong, defaultValue); + + String strIP2 = "255.255.255.255"; + long defaultValue2 = 0L; + long ipOfLong2 = Ipv4Util.ipv4ToLong(strIP2, defaultValue2); + Assert.assertEquals(ipOfLong2, 4294967295L); + } } -- Gitee From 6f6f094d30ce2b713a68aa248dafd3f57f326c6c Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 20 Jun 2022 12:08:22 +0800 Subject: [PATCH 0100/1737] add test --- .../core/thread/ExecutorBuilderTest.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 hutool-core/src/test/java/cn/hutool/core/thread/ExecutorBuilderTest.java diff --git a/hutool-core/src/test/java/cn/hutool/core/thread/ExecutorBuilderTest.java b/hutool-core/src/test/java/cn/hutool/core/thread/ExecutorBuilderTest.java new file mode 100644 index 0000000000..9da9d587b4 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/thread/ExecutorBuilderTest.java @@ -0,0 +1,26 @@ +package cn.hutool.core.thread; + +import cn.hutool.core.lang.Console; +import org.junit.Ignore; +import org.junit.Test; + +import java.util.concurrent.ThreadPoolExecutor; + +public class ExecutorBuilderTest { + + @Test + @Ignore + public void CallerRunsPolicyTest(){ + // https://gitee.com/dromara/hutool/pulls/660 + final ThreadPoolExecutor executor = ExecutorBuilder.create().setCorePoolSize(1).setMaxPoolSize(1).setHandler(RejectPolicy.BLOCK.getValue()).build(); + executor.execute(()-> Console.log("### 1")); + executor.execute(()-> Console.log("### 2")); + + executor.shutdown(); + executor.execute(()-> Console.log("### 3")); + executor.execute(()-> Console.log("### 4")); + executor.execute(()-> Console.log("### 5")); + executor.execute(()-> Console.log("### 6")); + ThreadUtil.sleep(3000); + } +} -- Gitee From 461e72d0e0757ef438d3b490063c52ceeba3bba1 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 20 Jun 2022 12:12:07 +0800 Subject: [PATCH 0101/1737] =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E6=B1=A0=E9=98=BB?= =?UTF-8?q?=E5=A1=9E=E7=AD=96=E7=95=A5=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 ++- .../cn/hutool/core/thread/BlockPolicy.java | 19 +++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2eabe10625..bdf93874fa 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.4.M1 (2022-06-18) +# 5.8.4.M1 (2022-06-20) ### 🐣新特性 * 【extra 】 Sftp增加构造重载,支持超时(pr#653@Gitee) @@ -11,6 +11,7 @@ * 【json 】 修改byte[]统一转换为数组形式(issue#2377@Github) * 【http 】 HttpResponse增加body方法,支持自定义返回内容(pr#655@Gitee) * 【core 】 修改ObjectUtil.isNull逻辑(issue#I5COJF@Gitee) +* 【core 】 BlockPolicy增加线程池关闭后的逻辑(pr#660@Gitee) * ### 🐞Bug修复 * 【extra 】 修复createExtractor中抛出异常后流未关闭问题(pr#2384@Github) diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/BlockPolicy.java b/hutool-core/src/main/java/cn/hutool/core/thread/BlockPolicy.java index 745c00dc51..eb3b82f6ff 100755 --- a/hutool-core/src/main/java/cn/hutool/core/thread/BlockPolicy.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/BlockPolicy.java @@ -21,10 +21,18 @@ public class BlockPolicy implements RejectedExecutionHandler { */ private final Consumer handlerwhenshutdown; + /** + * 构造 + * + * @param handlerwhenshutdown 线程池关闭后的执行策略 + */ public BlockPolicy(final Consumer handlerwhenshutdown) { this.handlerwhenshutdown = handlerwhenshutdown; } + /** + * 构造 + */ public BlockPolicy() { this(null); } @@ -32,18 +40,17 @@ public class BlockPolicy implements RejectedExecutionHandler { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { // 线程池未关闭时,阻塞等待 - if(!e.isShutdown()){ + if (false == e.isShutdown()) { try { e.getQueue().put(r); } catch (InterruptedException ex) { throw new RejectedExecutionException("Task " + r + " rejected from " + e); } - return; - } - - // 当设置了关闭时候的处理 - if(null != handlerwhenshutdown){ + } else if (null != handlerwhenshutdown) { + // 当设置了关闭时候的处理 handlerwhenshutdown.accept(r); } + + // 线程池关闭后,丢弃任务 } } -- Gitee From 6c1281242be34e4b249f731ec8423648ef3d1069 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 20 Jun 2022 12:15:22 +0800 Subject: [PATCH 0102/1737] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=B8=A6=E9=BB=98=E8=AE=A4=E5=80=BC=E7=9A=84=20Ipv4Util.ipv4To?= =?UTF-8?q?Long=20=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bdf93874fa..b7a6cc686f 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ * 【http 】 HttpResponse增加body方法,支持自定义返回内容(pr#655@Gitee) * 【core 】 修改ObjectUtil.isNull逻辑(issue#I5COJF@Gitee) * 【core 】 BlockPolicy增加线程池关闭后的逻辑(pr#660@Gitee) +* 【core 】 Ipv4Util增加ipv4ToLong重载(pr#661@Gitee) * ### 🐞Bug修复 * 【extra 】 修复createExtractor中抛出异常后流未关闭问题(pr#2384@Github) -- Gitee From e27b24005d75228a2ec94f47065930aad86c8ec9 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 20 Jun 2022 12:25:23 +0800 Subject: [PATCH 0103/1737] =?UTF-8?q?LocalDateTimeUtil.parse=E6=94=B9?= =?UTF-8?q?=E4=B8=BAblank=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + .../main/java/cn/hutool/core/date/LocalDateTimeUtil.java | 4 ++-- .../java/cn/hutool/core/date/LocalDateTimeUtilTest.java | 7 ++++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7a6cc686f..48633aaa12 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ * 【core 】 修改ObjectUtil.isNull逻辑(issue#I5COJF@Gitee) * 【core 】 BlockPolicy增加线程池关闭后的逻辑(pr#660@Gitee) * 【core 】 Ipv4Util增加ipv4ToLong重载(pr#661@Gitee) +* 【core 】 LocalDateTimeUtil.parse改为blank检查(issue#I5CZJ9@Gitee) * ### 🐞Bug修复 * 【extra 】 修复createExtractor中抛出异常后流未关闭问题(pr#2384@Github) diff --git a/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java index 7088807490..0eb2a0bc57 100755 --- a/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java @@ -229,7 +229,7 @@ public class LocalDateTimeUtil { * @return {@link LocalDateTime} */ public static LocalDateTime parse(CharSequence text, DateTimeFormatter formatter) { - if (null == text) { + if (StrUtil.isBlank(text)) { return null; } if (null == formatter) { @@ -247,7 +247,7 @@ public class LocalDateTimeUtil { * @return {@link LocalDateTime} */ public static LocalDateTime parse(CharSequence text, String format) { - if (null == text) { + if (StrUtil.isBlank(text)) { return null; } diff --git a/hutool-core/src/test/java/cn/hutool/core/date/LocalDateTimeUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/date/LocalDateTimeUtilTest.java index 08a89b122b..f99b49e813 100755 --- a/hutool-core/src/test/java/cn/hutool/core/date/LocalDateTimeUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/date/LocalDateTimeUtilTest.java @@ -11,7 +11,6 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAccessor; -import java.util.Date; public class LocalDateTimeUtilTest { @@ -237,4 +236,10 @@ public class LocalDateTimeUtilTest { final LocalDateTime of = LocalDateTimeUtil.of((TemporalAccessor) instant); Console.log(of); } + + @Test + public void parseBlankTest(){ + final LocalDateTime parse = LocalDateTimeUtil.parse(""); + Assert.assertNull(parse); + } } -- Gitee From 7f9fbeed20614372b9e2db2a8c3d120d1013095f Mon Sep 17 00:00:00 2001 From: leitao Date: Mon, 20 Jun 2022 15:49:34 +0800 Subject: [PATCH 0104/1737] =?UTF-8?q?=E4=B8=80=E4=B8=AA=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E8=A7=84=E8=8C=83=E6=A3=80=E6=B5=8B=E7=9A=84=E5=B0=8F=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/hutool/core/date/chinese/LunarInfo.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/date/chinese/LunarInfo.java b/hutool-core/src/main/java/cn/hutool/core/date/chinese/LunarInfo.java index faf8fd6926..8b6246030c 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/chinese/LunarInfo.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/chinese/LunarInfo.java @@ -61,8 +61,9 @@ public class LunarInfo { public static int yearDays(int y) { int i, sum = 348; for (i = 0x8000; i > 0x8; i >>= 1) { - if ((getCode(y) & i) != 0) + if ((getCode(y) & i) != 0) { sum += 1; + } } return (sum + leapDays(y)); } -- Gitee From d32e513191e31a63d577e56bcbc89d3b5baa3559 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 20 Jun 2022 18:54:37 +0800 Subject: [PATCH 0105/1737] fix --- .../src/main/java/cn/hutool/core/date/chinese/LunarInfo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/date/chinese/LunarInfo.java b/hutool-core/src/main/java/cn/hutool/core/date/chinese/LunarInfo.java index 8b6246030c..d8c479ef44 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/chinese/LunarInfo.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/chinese/LunarInfo.java @@ -20,7 +20,7 @@ public class LunarInfo { public static final long BASE_DAY = LocalDate.of(BASE_YEAR, 1, 31).toEpochDay(); /** - * 此表来自:https://github.com/jjonline/calendar.js/blob/master/calendar.js + * 此表来自:https://github.com/jjonline/calendar.js/blob/master/calendar.js * 农历表示: * 1. 表示当年有无闰年,有的话,为闰月的月份,没有的话,为0。 * 2-4.为除了闰月外的正常月份是大月还是小月,1为30天,0为29天。 -- Gitee From 33e95b23c1b8bb822f57fe4f83dc49debc06eaf6 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 20 Jun 2022 19:49:07 +0800 Subject: [PATCH 0106/1737] =?UTF-8?q?BeanPath=E5=9C=A8=E7=A9=BA=E5=85=83?= =?UTF-8?q?=E7=B4=A0=E6=97=B6=E9=BB=98=E8=AE=A4=E5=8A=A0=E5=85=A5map?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=94=B9=E6=A0=B9=E6=8D=AE=E4=B8=8B=E6=A0=87?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E8=B5=8B=E5=80=BCList=20or=20map?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + .../java/cn/hutool/core/bean/BeanPath.java | 61 ++++++++++----- .../java/cn/hutool/core/bean/BeanUtil.java | 12 ++- .../cn/hutool/core/collection/ListUtil.java | 41 ++++++++++ .../cn/hutool/core/bean/BeanPathTest.java | 64 +++++++++------ .../hutool/core/collection/ListUtilTest.java | 78 ++++++++++++------- 6 files changed, 183 insertions(+), 74 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48633aaa12..ced7dc6bf9 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ * 【core 】 BlockPolicy增加线程池关闭后的逻辑(pr#660@Gitee) * 【core 】 Ipv4Util增加ipv4ToLong重载(pr#661@Gitee) * 【core 】 LocalDateTimeUtil.parse改为blank检查(issue#I5CZJ9@Gitee) +* 【core 】 BeanPath在空元素时默认加入map,修改根据下标类型赋值List or map(issue#2362@Github) * ### 🐞Bug修复 * 【extra 】 修复createExtractor中抛出异常后流未关闭问题(pr#2384@Github) diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java index d9e67c99ac..324bc19c71 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java @@ -6,6 +6,7 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.CharUtil; +import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; import java.io.Serializable; @@ -22,7 +23,7 @@ import java.util.Map; *
  • .表达式,可以获取Bean对象中的属性(字段)值或者Map中key对应的值
  • *
  • []表达式,可以获取集合等对象中对应index的值
  • * - * + *

    * 表达式栗子: * *

    @@ -36,11 +37,13 @@ import java.util.Map;
      * @author Looly
      * @since 4.0.6
      */
    -public class BeanPath implements Serializable{
    +public class BeanPath implements Serializable {
     	private static final long serialVersionUID = 1L;
     
    -	/** 表达式边界符号数组 */
    -	private static final char[] EXP_CHARS = { CharUtil.DOT, CharUtil.BRACKET_START, CharUtil.BRACKET_END };
    +	/**
    +	 * 表达式边界符号数组
    +	 */
    +	private static final char[] EXP_CHARS = {CharUtil.DOT, CharUtil.BRACKET_START, CharUtil.BRACKET_END};
     
     	private boolean isStartWith = false;
     	protected List patternParts;
    @@ -53,7 +56,7 @@ public class BeanPath implements Serializable{
     	 * 
  • .表达式,可以获取Bean对象中的属性(字段)值或者Map中key对应的值
  • *
  • []表达式,可以获取集合等对象中对应index的值
  • * - * + *

    * 表达式栗子: * *

    @@ -85,7 +88,7 @@ public class BeanPath implements Serializable{
     	 *
     	 * @return 表达式分段列表
     	 */
    -	public List getPatternParts(){
    +	public List getPatternParts() {
     		return this.patternParts;
     	}
     
    @@ -109,11 +112,11 @@ public class BeanPath implements Serializable{
     	 * 2. 如果为数组,如果下标不大于数组长度,则替换原有值,否则追加值
     	 * 
    * - * @param bean Bean、Map或List + * @param bean Bean、Map或List * @param value 值 */ public void set(final Object bean, final Object value) { - set(bean, this.patternParts, value); + set(bean, this.patternParts, lastIsNumber(this.patternParts), value); } @Override @@ -122,6 +125,7 @@ public class BeanPath implements Serializable{ } //region Private Methods + /** * 设置表达式指定位置(或filed对应)的值
    * 若表达式指向一个List则设置其坐标对应位置的值,若指向Map则put对应key的值,Bean则设置字段的值
    @@ -132,26 +136,47 @@ public class BeanPath implements Serializable{ * 2. 如果为数组,如果下标不大于数组长度,则替换原有值,否则追加值 *
    * - * @param bean Bean、Map或List + * @param bean Bean、Map或List * @param patternParts 表达式块列表 - * @param value 值 + * @param value 值 */ - private void set(final Object bean, final List patternParts, final Object value) { - Object subBean = get(patternParts, bean, true); - if(null == subBean) { - set(bean, patternParts.subList(0, patternParts.size() - 1), new HashMap<>()); + private void set(Object bean, List patternParts, boolean nextNumberPart, Object value) { + Object subBean = this.get(patternParts, bean, true); + if (null == subBean) { + final List parentParts = getParentParts(patternParts); + this.set(bean, parentParts, lastIsNumber(parentParts), nextNumberPart ? new ArrayList<>() : new HashMap<>()); //set中有可能做过转换,因此此处重新获取bean - subBean = get(patternParts, bean, true); + subBean = this.get(patternParts, bean, true); } BeanUtil.setFieldValue(subBean, patternParts.get(patternParts.size() - 1), value); } + /** + * 判断path列表中末尾的标记是否为数字 + * + * @param patternParts path列表 + * @return 是否为数字 + */ + private static boolean lastIsNumber(List patternParts) { + return NumberUtil.isInteger(patternParts.get(patternParts.size() - 1)); + } + + /** + * 获取父级路径列表 + * + * @param patternParts 路径列表 + * @return 父级路径列表 + */ + private static List getParentParts(List patternParts) { + return patternParts.subList(0, patternParts.size() - 1); + } + /** * 获取Bean中对应表达式的值 * * @param patternParts 表达式分段列表 - * @param bean Bean对象或Map或List等 - * @param ignoreLast 是否忽略最后一个值,忽略最后一个值则用于set,否则用于read + * @param bean Bean对象或Map或List等 + * @param ignoreLast 是否忽略最后一个值,忽略最后一个值则用于set,否则用于read * @return 值,如果对应值不存在,则返回null */ private Object get(final List patternParts, final Object bean, final boolean ignoreLast) { @@ -247,7 +272,7 @@ public class BeanPath implements Serializable{ continue; } - if('\'' == c){ + if ('\'' == c) { // 结束 isInWrap = (false == isInWrap); continue; diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java index f4034c2f1b..8815c6ef50 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java @@ -4,6 +4,7 @@ import cn.hutool.core.bean.copier.BeanCopier; import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.bean.copier.ValueProvider; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Editor; import cn.hutool.core.map.CaseInsensitiveMap; @@ -23,7 +24,14 @@ import java.beans.PropertyEditor; import java.beans.PropertyEditorManager; import java.lang.reflect.Field; import java.lang.reflect.Method; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.function.Consumer; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -309,7 +317,7 @@ public class BeanUtil { if (bean instanceof Map) { ((Map) bean).put(fieldNameOrIndex, value); } else if (bean instanceof List) { - CollUtil.setOrAppend((List) bean, Convert.toInt(fieldNameOrIndex), value); + ListUtil.setOrPadding((List) bean, Convert.toInt(fieldNameOrIndex), value); } else if (ArrayUtil.isArray(bean)) { ArrayUtil.setOrAppend(bean, Convert.toInt(fieldNameOrIndex), value); } else { diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java index b0d8bfe123..b6dedc5b21 100755 --- a/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java @@ -2,6 +2,7 @@ package cn.hutool.core.collection; import cn.hutool.core.comparator.PinyinComparator; import cn.hutool.core.comparator.PropertyComparator; +import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Matcher; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; @@ -384,6 +385,7 @@ public class ListUtil { * @since 4.1.2 */ public static List setOrAppend(List list, int index, T element) { + Assert.notNull(list, "List must be not null !"); if (index < list.size()) { list.set(index, element); } else { @@ -392,6 +394,45 @@ public class ListUtil { return list; } + /** + * 在指定位置设置元素。当index小于List的长度时,替换指定位置的值,否则追加{@code null}直到到达index后,设置值 + * + * @param 元素类型 + * @param list List列表 + * @param index 位置 + * @param element 新元素 + * @return 原List + * @since 5。8.4 + */ + public static List setOrPadding(List list, int index, T element) { + return setOrPadding(list, index, element, null); + } + + /** + * 在指定位置设置元素。当index小于List的长度时,替换指定位置的值,否则追加{@code paddingElement}直到到达index后,设置值 + * + * @param 元素类型 + * @param list List列表 + * @param index 位置 + * @param element 新元素 + * @param paddingElement 填充的值 + * @return 原List + * @since 5。8.4 + */ + public static List setOrPadding(List list, int index, T element, T paddingElement) { + Assert.notNull(list, "List must be not null !"); + final int size = list.size(); + if (index < size) { + list.set(index, element); + } else { + for (int i = size; i < index; i++) { + list.add(paddingElement); + } + list.add(element); + } + return list; + } + /** * 截取集合的部分 * diff --git a/hutool-core/src/test/java/cn/hutool/core/bean/BeanPathTest.java b/hutool-core/src/test/java/cn/hutool/core/bean/BeanPathTest.java index 4b323f48cd..e0cd8731b6 100644 --- a/hutool-core/src/test/java/cn/hutool/core/bean/BeanPathTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/bean/BeanPathTest.java @@ -1,22 +1,20 @@ package cn.hutool.core.bean; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - +import cn.hutool.core.lang.test.bean.ExamInfoDict; +import cn.hutool.core.lang.test.bean.UserInfoDict; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import cn.hutool.core.lang.test.bean.ExamInfoDict; -import cn.hutool.core.lang.test.bean.UserInfoDict; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * {@link BeanPath} 单元测试 * * @author looly - * */ public class BeanPathTest { @@ -25,28 +23,28 @@ public class BeanPathTest { @Before public void init() { // ------------------------------------------------- 考试信息列表 - ExamInfoDict examInfoDict = new ExamInfoDict(); + final ExamInfoDict examInfoDict = new ExamInfoDict(); examInfoDict.setId(1); examInfoDict.setExamType(0); examInfoDict.setAnswerIs(1); - ExamInfoDict examInfoDict1 = new ExamInfoDict(); + final ExamInfoDict examInfoDict1 = new ExamInfoDict(); examInfoDict1.setId(2); examInfoDict1.setExamType(0); examInfoDict1.setAnswerIs(0); - ExamInfoDict examInfoDict2 = new ExamInfoDict(); + final ExamInfoDict examInfoDict2 = new ExamInfoDict(); examInfoDict2.setId(3); examInfoDict2.setExamType(1); examInfoDict2.setAnswerIs(0); - List examInfoDicts = new ArrayList<>(); + final List examInfoDicts = new ArrayList<>(); examInfoDicts.add(examInfoDict); examInfoDicts.add(examInfoDict1); examInfoDicts.add(examInfoDict2); // ------------------------------------------------- 用户信息 - UserInfoDict userInfoDict = new UserInfoDict(); + final UserInfoDict userInfoDict = new UserInfoDict(); userInfoDict.setId(1); userInfoDict.setPhotoPath("yx.mm.com"); userInfoDict.setRealName("张三"); @@ -59,7 +57,7 @@ public class BeanPathTest { @Test public void beanPathTest1() { - BeanPath pattern = new BeanPath("userInfo.examInfoDict[0].id"); + final BeanPath pattern = new BeanPath("userInfo.examInfoDict[0].id"); Assert.assertEquals("userInfo", pattern.patternParts.get(0)); Assert.assertEquals("examInfoDict", pattern.patternParts.get(1)); Assert.assertEquals("0", pattern.patternParts.get(2)); @@ -69,7 +67,7 @@ public class BeanPathTest { @Test public void beanPathTest2() { - BeanPath pattern = new BeanPath("[userInfo][examInfoDict][0][id]"); + final BeanPath pattern = new BeanPath("[userInfo][examInfoDict][0][id]"); Assert.assertEquals("userInfo", pattern.patternParts.get(0)); Assert.assertEquals("examInfoDict", pattern.patternParts.get(1)); Assert.assertEquals("0", pattern.patternParts.get(2)); @@ -78,7 +76,7 @@ public class BeanPathTest { @Test public void beanPathTest3() { - BeanPath pattern = new BeanPath("['userInfo']['examInfoDict'][0]['id']"); + final BeanPath pattern = new BeanPath("['userInfo']['examInfoDict'][0]['id']"); Assert.assertEquals("userInfo", pattern.patternParts.get(0)); Assert.assertEquals("examInfoDict", pattern.patternParts.get(1)); Assert.assertEquals("0", pattern.patternParts.get(2)); @@ -87,25 +85,43 @@ public class BeanPathTest { @Test public void getTest() { - BeanPath pattern = BeanPath.create("userInfo.examInfoDict[0].id"); - Object result = pattern.get(tempMap); + final BeanPath pattern = BeanPath.create("userInfo.examInfoDict[0].id"); + final Object result = pattern.get(tempMap); Assert.assertEquals(1, result); } @Test public void setTest() { - BeanPath pattern = BeanPath.create("userInfo.examInfoDict[0].id"); + final BeanPath pattern = BeanPath.create("userInfo.examInfoDict[0].id"); pattern.set(tempMap, 2); - Object result = pattern.get(tempMap); + final Object result = pattern.get(tempMap); Assert.assertEquals(2, result); } @Test - public void getMapTest () { - BeanPath pattern = BeanPath.create("userInfo[id, photoPath]"); - @SuppressWarnings("unchecked") - Map result = (Map)pattern.get(tempMap); + public void getMapTest() { + final BeanPath pattern = BeanPath.create("userInfo[id, photoPath]"); + @SuppressWarnings("unchecked") final Map result = (Map) pattern.get(tempMap); Assert.assertEquals(1, result.get("id")); Assert.assertEquals("yx.mm.com", result.get("photoPath")); } + + @Test + public void issue2362Test() { + final Map map = new HashMap<>(); + + BeanPath beanPath = BeanPath.create("list[0].name"); + beanPath.set(map, "张三"); + Assert.assertEquals("{list=[{name=张三}]}", map.toString()); + + map.clear(); + beanPath = BeanPath.create("list[1].name"); + beanPath.set(map, "张三"); + Assert.assertEquals("{list=[null, {name=张三}]}", map.toString()); + + map.clear(); + beanPath = BeanPath.create("list[0].1.name"); + beanPath.set(map, "张三"); + Assert.assertEquals("{list=[[null, {name=张三}]]}", map.toString()); + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/collection/ListUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/collection/ListUtilTest.java index 937fb59170..64e8a5b2bc 100644 --- a/hutool-core/src/test/java/cn/hutool/core/collection/ListUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/collection/ListUtilTest.java @@ -38,20 +38,20 @@ public class ListUtilTest { @Test @Ignore public void splitBenchTest() { - List list = new ArrayList<>(); + final List list = new ArrayList<>(); CollUtil.padRight(list, RandomUtil.randomInt(1000_0000, 1_0000_0000), "test"); - int size = RandomUtil.randomInt(10, 1000); + final int size = RandomUtil.randomInt(10, 1000); Console.log("\nlist size: {}", list.size()); Console.log("partition size: {}\n", size); - StopWatch stopWatch = new StopWatch(); + final StopWatch stopWatch = new StopWatch(); stopWatch.start("CollUtil#split"); - List> CollSplitResult = CollUtil.split(list, size); + final List> CollSplitResult = CollUtil.split(list, size); stopWatch.stop(); stopWatch.start("ListUtil#split"); - List> ListSplitResult = ListUtil.split(list, size); + final List> ListSplitResult = ListUtil.split(list, size); stopWatch.stop(); Assert.assertEquals(CollSplitResult, ListSplitResult); @@ -87,7 +87,7 @@ public class ListUtilTest { @Test public void editTest() { - List a = ListUtil.toLinkedList("1", "2", "3"); + final List a = ListUtil.toLinkedList("1", "2", "3"); final List filter = (List) CollUtil.edit(a, str -> "edit" + str); Assert.assertEquals("edit1", filter.get(0)); Assert.assertEquals("edit2", filter.get(1)); @@ -96,7 +96,7 @@ public class ListUtilTest { @Test public void indexOfAll() { - List a = ListUtil.toLinkedList("1", "2", "3", "4", "3", "2", "1"); + final List a = ListUtil.toLinkedList("1", "2", "3", "4", "3", "2", "1"); final int[] indexArray = ListUtil.indexOfAll(a, "2"::equals); Assert.assertArrayEquals(new int[]{1,5}, indexArray); final int[] indexArray2 = ListUtil.indexOfAll(a, "1"::equals); @@ -105,14 +105,14 @@ public class ListUtilTest { @Test public void pageTest() { - List a = ListUtil.toLinkedList(1, 2, 3,4,5); + final List a = ListUtil.toLinkedList(1, 2, 3,4,5); PageUtil.setFirstPageNo(1); - int[] a_1 = ListUtil.page(1,2,a).stream().mapToInt(Integer::valueOf).toArray(); - int[] a1 = ListUtil.page(1,2,a).stream().mapToInt(Integer::valueOf).toArray(); - int[] a2 = ListUtil.page(2,2,a).stream().mapToInt(Integer::valueOf).toArray(); - int[] a3 = ListUtil.page(3,2,a).stream().mapToInt(Integer::valueOf).toArray(); - int[] a4 = ListUtil.page(4,2,a).stream().mapToInt(Integer::valueOf).toArray(); + final int[] a_1 = ListUtil.page(1,2,a).stream().mapToInt(Integer::valueOf).toArray(); + final int[] a1 = ListUtil.page(1,2,a).stream().mapToInt(Integer::valueOf).toArray(); + final int[] a2 = ListUtil.page(2,2,a).stream().mapToInt(Integer::valueOf).toArray(); + final int[] a3 = ListUtil.page(3,2,a).stream().mapToInt(Integer::valueOf).toArray(); + final int[] a4 = ListUtil.page(4,2,a).stream().mapToInt(Integer::valueOf).toArray(); Assert.assertArrayEquals(new int[]{1,2},a_1); Assert.assertArrayEquals(new int[]{1,2},a1); Assert.assertArrayEquals(new int[]{3,4},a2); @@ -121,11 +121,11 @@ public class ListUtilTest { PageUtil.setFirstPageNo(2); - int[] b_1 = ListUtil.page(1,2,a).stream().mapToInt(Integer::valueOf).toArray(); - int[] b1 = ListUtil.page(2,2,a).stream().mapToInt(Integer::valueOf).toArray(); - int[] b2 = ListUtil.page(3,2,a).stream().mapToInt(Integer::valueOf).toArray(); - int[] b3 = ListUtil.page(4,2,a).stream().mapToInt(Integer::valueOf).toArray(); - int[] b4 = ListUtil.page(5,2,a).stream().mapToInt(Integer::valueOf).toArray(); + final int[] b_1 = ListUtil.page(1,2,a).stream().mapToInt(Integer::valueOf).toArray(); + final int[] b1 = ListUtil.page(2,2,a).stream().mapToInt(Integer::valueOf).toArray(); + final int[] b2 = ListUtil.page(3,2,a).stream().mapToInt(Integer::valueOf).toArray(); + final int[] b3 = ListUtil.page(4,2,a).stream().mapToInt(Integer::valueOf).toArray(); + final int[] b4 = ListUtil.page(5,2,a).stream().mapToInt(Integer::valueOf).toArray(); Assert.assertArrayEquals(new int[]{1,2},b_1); Assert.assertArrayEquals(new int[]{1,2},b1); Assert.assertArrayEquals(new int[]{3,4},b2); @@ -133,11 +133,11 @@ public class ListUtilTest { Assert.assertArrayEquals(new int[]{},b4); PageUtil.setFirstPageNo(0); - int[] c_1 = ListUtil.page(-1,2,a).stream().mapToInt(Integer::valueOf).toArray(); - int[] c1 = ListUtil.page(0,2,a).stream().mapToInt(Integer::valueOf).toArray(); - int[] c2 = ListUtil.page(1,2,a).stream().mapToInt(Integer::valueOf).toArray(); - int[] c3 = ListUtil.page(2,2,a).stream().mapToInt(Integer::valueOf).toArray(); - int[] c4 = ListUtil.page(3,2,a).stream().mapToInt(Integer::valueOf).toArray(); + final int[] c_1 = ListUtil.page(-1,2,a).stream().mapToInt(Integer::valueOf).toArray(); + final int[] c1 = ListUtil.page(0,2,a).stream().mapToInt(Integer::valueOf).toArray(); + final int[] c2 = ListUtil.page(1,2,a).stream().mapToInt(Integer::valueOf).toArray(); + final int[] c3 = ListUtil.page(2,2,a).stream().mapToInt(Integer::valueOf).toArray(); + final int[] c4 = ListUtil.page(3,2,a).stream().mapToInt(Integer::valueOf).toArray(); Assert.assertArrayEquals(new int[]{1,2},c_1); Assert.assertArrayEquals(new int[]{1,2},c1); Assert.assertArrayEquals(new int[]{3,4},c2); @@ -146,11 +146,11 @@ public class ListUtilTest { PageUtil.setFirstPageNo(1); - int[] d1 = ListUtil.page(0,8,a).stream().mapToInt(Integer::valueOf).toArray(); + final int[] d1 = ListUtil.page(0,8,a).stream().mapToInt(Integer::valueOf).toArray(); Assert.assertArrayEquals(new int[]{1,2,3,4,5},d1); // page with consumer - List> pageListData = new ArrayList<>(); + final List> pageListData = new ArrayList<>(); ListUtil.page(a, 2, pageListData::add); Assert.assertArrayEquals(new int[]{1, 2}, pageListData.get(0).stream().mapToInt(Integer::valueOf).toArray()); Assert.assertArrayEquals(new int[]{3, 4}, pageListData.get(1).stream().mapToInt(Integer::valueOf).toArray()); @@ -210,20 +210,20 @@ public class ListUtilTest { @Test public void swapIndex() { - List list = Arrays.asList(7, 2, 8, 9); + final List list = Arrays.asList(7, 2, 8, 9); ListUtil.swapTo(list, 8, 1); Assert.assertEquals(8, (int) list.get(1)); } @Test public void swapElement() { - Map map1 = new HashMap<>(); + final Map map1 = new HashMap<>(); map1.put("1", "张三"); - Map map2 = new HashMap<>(); + final Map map2 = new HashMap<>(); map2.put("2", "李四"); - Map map3 = new HashMap<>(); + final Map map3 = new HashMap<>(); map3.put("3", "王五"); - List> list = Arrays.asList(map1, map2, map3); + final List> list = Arrays.asList(map1, map2, map3); ListUtil.swapElement(list, map2, map3); Map map = list.get(2); Assert.assertEquals("李四", map.get("2")); @@ -232,4 +232,22 @@ public class ListUtilTest { map = list.get(0); Assert.assertEquals("李四", map.get("2")); } + + @Test + public void setOrPaddingNullTest(){ + final List list = new ArrayList<>(); + list.add("1"); + + // 替换原值 + ListUtil.setOrPadding(list, 0, "a"); + Assert.assertEquals("[a]", list.toString()); + + //append值 + ListUtil.setOrPadding(list, 1, "a"); + Assert.assertEquals("[a, a]", list.toString()); + + // padding null 后加入值 + ListUtil.setOrPadding(list, 3, "a"); + Assert.assertEquals(4, list.size()); + } } -- Gitee From 9498287ec73c0ca9a6a8d5eb67e355d1a0659347 Mon Sep 17 00:00:00 2001 From: TigerBeanst <3889846+TigerBeanst@users.noreply.github.com> Date: Thu, 23 Jun 2022 17:35:12 +0800 Subject: [PATCH 0107/1737] fix isDouble() --- hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java index 1f113681dd..8720bd8ecd 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java @@ -1285,7 +1285,7 @@ public class NumberUtil { } catch (NumberFormatException ignore) { // ignore } - return true; + return false; } /** -- Gitee From 7eca54cf08a758eb62265c516905dd618fdd9d84 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 23 Jun 2022 18:23:21 +0800 Subject: [PATCH 0108/1737] fix bug --- CHANGELOG.md | 3 ++- hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ced7dc6bf9..b77bba2758 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.4.M1 (2022-06-20) +# 5.8.4.M1 (2022-06-23) ### 🐣新特性 * 【extra 】 Sftp增加构造重载,支持超时(pr#653@Gitee) @@ -21,6 +21,7 @@ * 【core 】 修复CsvData.getHeader没有判空导致空指针问题(issue#I5CK7Q@Gitee) * 【core 】 修复单字母转换为数字的问题(issue#I5C4K1@Gitee) * 【core 】 修复IterUtil.filter无效问题 +* 【core 】 修复NumberUtil传入null,返回了true(issue#I5DTSL@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java index 1f113681dd..a696a34749 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java @@ -2671,6 +2671,9 @@ public class NumberUtil { * @since 4.6.7 */ public static boolean isValidNumber(Number number) { + if(null == number){ + return false; + } if (number instanceof Double) { return (false == ((Double) number).isInfinite()) && (false == ((Double) number).isNaN()); } else if (number instanceof Float) { -- Gitee From 98590cb895dfd35abd549eddfc8e65c93f2b6ef6 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 23 Jun 2022 18:26:58 +0800 Subject: [PATCH 0109/1737] fix bug --- CHANGELOG.md | 1 + .../src/main/java/cn/hutool/core/util/NumberUtil.java | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b77bba2758..f4f587c500 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ * 【core 】 修复单字母转换为数字的问题(issue#I5C4K1@Gitee) * 【core 】 修复IterUtil.filter无效问题 * 【core 】 修复NumberUtil传入null,返回了true(issue#I5DTSL@Gitee) +* 【core 】 修复NumberUtil.isDouble问题(pr#2400@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java index 3511ac25ee..902e2b3c51 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java @@ -1281,11 +1281,10 @@ public class NumberUtil { } try { Double.parseDouble(s); - return s.contains("."); } catch (NumberFormatException ignore) { - // ignore + return false; } - return false; + return s.contains("."); } /** -- Gitee From 55d9bb860208e408e9f0790fb217ff0311dd48b4 Mon Sep 17 00:00:00 2001 From: bwcx_jzy Date: Sun, 26 Jun 2022 19:50:23 +0800 Subject: [PATCH 0110/1737] =?UTF-8?q?localAddressList=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E9=87=8D=E6=9E=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/hutool/core/net/NetUtil.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/hutool-core/src/main/java/cn/hutool/core/net/NetUtil.java b/hutool-core/src/main/java/cn/hutool/core/net/NetUtil.java index e08b9212c4..1877191fb0 100755 --- a/hutool-core/src/main/java/cn/hutool/core/net/NetUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/net/NetUtil.java @@ -429,6 +429,17 @@ public class NetUtil { * @since 4.5.17 */ public static LinkedHashSet localAddressList(Filter addressFilter) { + return localAddressList(null, addressFilter); + } + + /** + * 获取所有满足过滤条件的本地IP地址对象 + * + * @param addressFilter 过滤器,null表示不过滤,获取所有地址 + * @param networkInterfaceFilter 过滤器,null表示不过滤,获取所有网卡 + * @return 过滤后的地址对象列表 + */ + public static LinkedHashSet localAddressList(Filter networkInterfaceFilter, Filter addressFilter) { Enumeration networkInterfaces; try { networkInterfaces = NetworkInterface.getNetworkInterfaces(); @@ -444,6 +455,9 @@ public class NetUtil { while (networkInterfaces.hasMoreElements()) { final NetworkInterface networkInterface = networkInterfaces.nextElement(); + if (networkInterfaceFilter != null && false == networkInterfaceFilter.accept(networkInterface)) { + continue; + } final Enumeration inetAddresses = networkInterface.getInetAddresses(); while (inetAddresses.hasMoreElements()) { final InetAddress inetAddress = inetAddresses.nextElement(); -- Gitee From 8032f828fed09727b3488da6262189fae9dc3d78 Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 26 Jun 2022 23:49:26 +0800 Subject: [PATCH 0111/1737] =?UTF-8?q?localAddressList=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E9=87=8D=E6=9E=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f4f587c500..97424cc4f7 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.4.M1 (2022-06-23) +# 5.8.4.M1 (2022-06-26) ### 🐣新特性 * 【extra 】 Sftp增加构造重载,支持超时(pr#653@Gitee) @@ -15,6 +15,7 @@ * 【core 】 Ipv4Util增加ipv4ToLong重载(pr#661@Gitee) * 【core 】 LocalDateTimeUtil.parse改为blank检查(issue#I5CZJ9@Gitee) * 【core 】 BeanPath在空元素时默认加入map,修改根据下标类型赋值List or map(issue#2362@Github) +* 【core 】 localAddressList 添加重构方法(pr#665@Gitee) * ### 🐞Bug修复 * 【extra 】 修复createExtractor中抛出异常后流未关闭问题(pr#2384@Github) -- Gitee From cbb3592a702a8e2112e8bae9641020fb1695297e Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 27 Jun 2022 20:06:12 +0800 Subject: [PATCH 0112/1737] =?UTF-8?q?=E4=BB=8E=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=8A=A0=E8=BD=BD=E4=BB=BB=E5=8A=A1=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89ID=E9=81=BF=E5=85=8D=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E4=BB=8E=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 ++- hutool-cron/src/main/java/cn/hutool/cron/Scheduler.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 97424cc4f7..49b643fc17 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.4.M1 (2022-06-26) +# 5.8.4.M1 (2022-06-27) ### 🐣新特性 * 【extra 】 Sftp增加构造重载,支持超时(pr#653@Gitee) @@ -16,6 +16,7 @@ * 【core 】 LocalDateTimeUtil.parse改为blank检查(issue#I5CZJ9@Gitee) * 【core 】 BeanPath在空元素时默认加入map,修改根据下标类型赋值List or map(issue#2362@Github) * 【core 】 localAddressList 添加重构方法(pr#665@Gitee) +* 【cron 】 从配置文件加载任务时,自定义ID避免重复从配置文件加载(issue#I5E7BM@Gitee) * ### 🐞Bug修复 * 【extra 】 修复createExtractor中抛出异常后流未关闭问题(pr#2384@Github) diff --git a/hutool-cron/src/main/java/cn/hutool/cron/Scheduler.java b/hutool-cron/src/main/java/cn/hutool/cron/Scheduler.java index e2111b6a11..a82f035e1f 100755 --- a/hutool-cron/src/main/java/cn/hutool/cron/Scheduler.java +++ b/hutool-cron/src/main/java/cn/hutool/cron/Scheduler.java @@ -211,7 +211,8 @@ public class Scheduler implements Serializable { final String pattern = entry.getValue(); StaticLog.debug("Load job: {} {}", pattern, jobClass); try { - schedule(pattern, new InvokeTask(jobClass)); + // issue#I5E7BM@Gitee,自定义ID避免重复从配置文件加载 + schedule("id_" + jobClass, pattern, new InvokeTask(jobClass)); } catch (Exception e) { throw new CronException(e, "Schedule [{}] [{}] error!", pattern, jobClass); } -- Gitee From a6d4e96a41a11571fb0fd1f98a42edbbf373ebb3 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 27 Jun 2022 20:25:14 +0800 Subject: [PATCH 0113/1737] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E6=89=AB=E6=8F=8F=E5=99=A8=E5=92=8C=E5=90=88=E6=88=90=E6=B3=A8?= =?UTF-8?q?=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + .../core/annotation/AnnotationUtil.java | 10 +-- .../core/annotation/SyntheticAnnotation.java | 68 +++++++++---------- .../annotation/scanner/AnnotationScanner.java | 2 +- ...canner.java => MetaAnnotationScanner.java} | 10 +-- .../scanner/TypeAnnotationScanner.java | 2 +- .../core/annotation/scanner/package-info.java | 7 ++ .../scanner/MateAnnotationScannerTest.java | 4 +- 8 files changed, 56 insertions(+), 48 deletions(-) rename hutool-core/src/main/java/cn/hutool/core/annotation/scanner/{MateAnnotationScanner.java => MetaAnnotationScanner.java} (92%) create mode 100644 hutool-core/src/main/java/cn/hutool/core/annotation/scanner/package-info.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 49b643fc17..143626f848 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ * 【core 】 BeanPath在空元素时默认加入map,修改根据下标类型赋值List or map(issue#2362@Github) * 【core 】 localAddressList 添加重构方法(pr#665@Gitee) * 【cron 】 从配置文件加载任务时,自定义ID避免重复从配置文件加载(issue#I5E7BM@Gitee) +* 【core 】 新增注解扫描器和合成注解(pr#654@Gitee) * ### 🐞Bug修复 * 【extra 】 修复createExtractor中抛出异常后流未关闭问题(pr#2384@Github) diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java b/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java index 5c3f217aa4..f765ffa2b9 100755 --- a/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/AnnotationUtil.java @@ -48,7 +48,7 @@ public class AnnotationUtil { ); /** - * 是否为Jdk自带的元注解。
    + * 是否为Jdk自带的元注解。
    * 包括: *