From 23e3be4ec1067cc3543cc415e730886a9acfc104 Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 16 Sep 2025 21:05:59 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E4=BF=AE=E5=A4=8D`JschSessionPool`?= =?UTF-8?q?=E5=B9=B6=E5=8F=91=E9=97=AE=E9=A2=98=EF=BC=88pr#4079@Github?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + .../src/main/java/cn/hutool/extra/ssh/JschSessionPool.java | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c3d9037c..efa905a95 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ * 【cron 】 修复`CronPatternUtil.nextDateAfter`当日为L时计算错误问题。(issue#4056@Github) * 【db 】 修复`NamedSql.replaceVar`关键字处理问题(issue#4062@Github) * 【db 】 修复`DialectRunner.count`方法中,去除包含多字段order by子句的SQL语句时错误问题(issue#4066@Github) +* 【extra 】 修复`JschSessionPool`并发问题(pr#4079@Github) ------------------------------------------------------------------------------------------------------------- # 5.8.40(2025-08-26) 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 ffcf99c7a..4d312c8ec 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 @@ -6,7 +6,6 @@ import com.jcraft.jsch.Session; import java.util.Iterator; import java.util.Map.Entry; -import java.util.concurrent.ConcurrentHashMap; /** * Jsch会话池 @@ -14,12 +13,16 @@ import java.util.concurrent.ConcurrentHashMap; * @author looly */ public enum JschSessionPool { + + /** + * 单例对象 + */ INSTANCE; /** * SSH会话池,key:host,value:Session对象 */ - private final SimpleCache cache = new SimpleCache<>(new ConcurrentHashMap<>()); + private final SimpleCache cache = new SimpleCache<>(); /** * 获取Session,不存在返回null From a4f5a084b8faa0f97e82d55fd8840e83beea5e44 Mon Sep 17 00:00:00 2001 From: 18855532268 Date: Thu, 18 Sep 2025 23:18:15 +0800 Subject: [PATCH 2/9] =?UTF-8?q?fix:=E6=B7=BB=E5=8A=A0=E5=88=A4=E7=A9=BA?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/hutool/extra/pinyin/PinyinUtil.java | 2 +- .../test/java/cn/hutool/extra/pinyin/PinyinUtilTest.java | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/hutool-extra/src/main/java/cn/hutool/extra/pinyin/PinyinUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/pinyin/PinyinUtil.java index d6ac1497f..721aa777b 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/pinyin/PinyinUtil.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/pinyin/PinyinUtil.java @@ -104,7 +104,7 @@ public class PinyinUtil { * @return 汉字返回拼音,非汉字原样返回 */ public static String getFirstLetter(String str, String separator) { - return getEngine().getFirstLetter(str, separator); + return (str == null) ? null : getEngine().getFirstLetter(str, separator); } /** diff --git a/hutool-extra/src/test/java/cn/hutool/extra/pinyin/PinyinUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/pinyin/PinyinUtilTest.java index ac1dee5c5..803da9e2e 100644 --- a/hutool-extra/src/test/java/cn/hutool/extra/pinyin/PinyinUtilTest.java +++ b/hutool-extra/src/test/java/cn/hutool/extra/pinyin/PinyinUtilTest.java @@ -22,4 +22,10 @@ public class PinyinUtilTest { final String result = PinyinUtil.getFirstLetter("崞阳", ", "); assertEquals("g, y", result); } + + @Test + public void getFirstLetterTest3(){ + final String result = PinyinUtil.getFirstLetter(null, ", "); + assertNull(result); + } } From 6991c570cd92aad2458ceaf704f8e8cbebaad23c Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 19 Sep 2025 20:34:19 +0800 Subject: [PATCH 3/9] =?UTF-8?q?`PinyinUtil`=E5=A2=9E=E5=8A=A0=E5=88=A4?= =?UTF-8?q?=E7=A9=BA=EF=BC=88pr#4081@Github=EF=BC=89?= 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 efa905a95..86bbf4dfc 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ # 🚀Changelog ------------------------------------------------------------------------------------------------------------- -# 5.8.41(2025-09-16) +# 5.8.41(2025-09-19) ### 🐣新特性 * 【core 】 增加`WeakKeyValueConcurrentMap`及其关联类,同时废弃`WeakConcurrentMap`并替换(issue#4039@Github) @@ -18,6 +18,7 @@ * 【extra 】 `Mail.buildContent`改进,正文部分总在最前(issue#4072@Github) * 【core 】 `DataSizeUtil`改进,兼容`GiB`等单位名称(issue#ICXXVF@Github) * 【ai 】 `Message`增加setter和构造方法(issue#ICXTP2@Gitee) +* 【extra 】 `PinyinUtil`增加判空(pr#4081@Github) ### 🐞Bug修复 * 【core 】 修复`ReflectUtil`中因class和Method关联导致的缓存无法回收问题(issue#4039@Github) From be37ef95a33dbcf79dd9913a3fb865097b03c70f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E6=97=A5?= <451922429@qq.com> Date: Wed, 24 Sep 2025 11:46:57 +0800 Subject: [PATCH 4/9] =?UTF-8?q?fix=20LocalDateTimeUtil.parseDate=20?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E6=B3=A8=E9=87=8A=E4=B8=8E=E5=AE=9E=E9=99=85?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=B8=8D=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 2c5f4e216..0b019e52c 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 @@ -298,7 +298,7 @@ public class LocalDateTimeUtil { } /** - * 解析日期时间字符串为{@link LocalDate},仅支持yyyy-MM-dd'T'HH:mm:ss格式,例如:2007-12-03T10:15:30 + * 解析日期时间字符串为{@link LocalDate},仅支持yyyy-MM-dd格式,例如:2007-12-03 * * @param text 日期时间字符串 * @return {@link LocalDate} From 1fbf3dd4207e68bc1fec21894eea681439b7ccdb Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 24 Sep 2025 21:12:14 +0800 Subject: [PATCH 5/9] fix commentgts --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 86bbf4dfc..b178f3f99 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ # 🚀Changelog ------------------------------------------------------------------------------------------------------------- -# 5.8.41(2025-09-19) +# 5.8.41(2025-09-24) ### 🐣新特性 * 【core 】 增加`WeakKeyValueConcurrentMap`及其关联类,同时废弃`WeakConcurrentMap`并替换(issue#4039@Github) @@ -19,6 +19,7 @@ * 【core 】 `DataSizeUtil`改进,兼容`GiB`等单位名称(issue#ICXXVF@Github) * 【ai 】 `Message`增加setter和构造方法(issue#ICXTP2@Gitee) * 【extra 】 `PinyinUtil`增加判空(pr#4081@Github) +* 【core 】 `LocalDateTimeUtil.parseDate`注释修正(pr#parseDate @Github) ### 🐞Bug修复 * 【core 】 修复`ReflectUtil`中因class和Method关联导致的缓存无法回收问题(issue#4039@Github) From 32363c919e0c453b6289e015d6901393dbb2173e Mon Sep 17 00:00:00 2001 From: lianxin Date: Fri, 26 Sep 2025 10:17:46 +0800 Subject: [PATCH 6/9] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E9=80=92=E5=BD=92?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E7=9B=AE=E5=BD=95=E6=97=B6=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E7=9B=B8=E5=AF=B9=E8=B7=AF=E5=BE=84=E5=8F=AF=E8=83=BD=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E6=AD=BB=E5=BE=AA=E7=8E=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 c7a74bde7..049f3941c 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 @@ -462,9 +462,9 @@ public class Sftp extends AbstractFtp { fileName = entry.getFilename(); if (false == ".".equals(fileName) && false == "..".equals(fileName)) { if (entry.getAttrs().isDir()) { - delDir(fileName); + delDir(dirPath + "/" + fileName); } else { - delFile(fileName); + delFile(dirPath + "/" + fileName); } } } From aa6b1332d5f22e755eba70bdf1ff07d9907649a9 Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 27 Sep 2025 19:46:11 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E4=BF=AE=E5=A4=8D`Sftp`=E9=80=92=E5=BD=92?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E7=9B=AE=E5=BD=95=E6=97=B6=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E7=9B=B8=E5=AF=B9=E8=B7=AF=E5=BE=84=E5=8F=AF=E8=83=BD=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E6=AD=BB=E5=BE=AA=E7=8E=AF=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=88pr#1380@Gitee=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 ++- hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b178f3f99..1f64af9a4 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ # 🚀Changelog ------------------------------------------------------------------------------------------------------------- -# 5.8.41(2025-09-24) +# 5.8.41(2025-09-27) ### 🐣新特性 * 【core 】 增加`WeakKeyValueConcurrentMap`及其关联类,同时废弃`WeakConcurrentMap`并替换(issue#4039@Github) @@ -30,6 +30,7 @@ * 【db 】 修复`NamedSql.replaceVar`关键字处理问题(issue#4062@Github) * 【db 】 修复`DialectRunner.count`方法中,去除包含多字段order by子句的SQL语句时错误问题(issue#4066@Github) * 【extra 】 修复`JschSessionPool`并发问题(pr#4079@Github) +* 【extra 】 修复`Sftp`递归删除目录时使用相对路径可能导致死循环的问题(pr#1380@Gitee) ------------------------------------------------------------------------------------------------------------- # 5.8.40(2025-08-26) 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 049f3941c..0fa65b9e5 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 @@ -462,8 +462,12 @@ public class Sftp extends AbstractFtp { fileName = entry.getFilename(); if (false == ".".equals(fileName) && false == "..".equals(fileName)) { if (entry.getAttrs().isDir()) { + // pr#1380Gitee 当目录名包含特殊字符(如 \u000b)时,会导致不断进入同一目录循环 + // 此处强制使用绝对路径 delDir(dirPath + "/" + fileName); } else { + // pr#1380Gitee 当目录名包含特殊字符(如 \u000b)时,会导致不断进入同一目录循环 + // 此处强制使用绝对路径 delFile(dirPath + "/" + fileName); } } From f3992c706da3f22ec8627387658a48c2601be37f Mon Sep 17 00:00:00 2001 From: asukavuuyn <1346007099@qq.com> Date: Sun, 28 Sep 2025 01:15:57 +0800 Subject: [PATCH 8/9] =?UTF-8?q?fix:=E5=AD=97=E7=AC=A6=E4=B8=B2NPE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 index 24c282a8c..f37eb27e8 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java @@ -370,6 +370,9 @@ public class StrUtil extends CharSequenceUtil implements StrPool { * @since 3.0.9 */ public static String reverse(String str) { + if (null == str) { + return null; + } return new String(ArrayUtil.reverse(str.toCharArray())); } @@ -414,6 +417,9 @@ public class StrUtil extends CharSequenceUtil implements StrPool { * @since 3.1.2 */ public static String fill(String str, char filledChar, int len, boolean isPre) { + if (null == str) { + str = ""; + } final int strLen = str.length(); if (strLen > len) { return str; From 9b9d1369ce3b5025080a4d357601a7a6ed67a917 Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 28 Sep 2025 01:23:02 +0800 Subject: [PATCH 9/9] =?UTF-8?q?`StrUtil`=E5=A2=9E=E5=8A=A0null=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E5=A4=84=E7=90=86=EF=BC=88pr#4086@Github=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f64af9a4..7e9457f27 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ # 🚀Changelog ------------------------------------------------------------------------------------------------------------- -# 5.8.41(2025-09-27) +# 5.8.41(2025-09-28) ### 🐣新特性 * 【core 】 增加`WeakKeyValueConcurrentMap`及其关联类,同时废弃`WeakConcurrentMap`并替换(issue#4039@Github) @@ -19,7 +19,8 @@ * 【core 】 `DataSizeUtil`改进,兼容`GiB`等单位名称(issue#ICXXVF@Github) * 【ai 】 `Message`增加setter和构造方法(issue#ICXTP2@Gitee) * 【extra 】 `PinyinUtil`增加判空(pr#4081@Github) -* 【core 】 `LocalDateTimeUtil.parseDate`注释修正(pr#parseDate @Github) +* 【core 】 `LocalDateTimeUtil.parseDate`注释修正(pr#4085@Github) +* 【core 】 `StrUtil`增加null检查处理(pr#4086@Github) ### 🐞Bug修复 * 【core 】 修复`ReflectUtil`中因class和Method关联导致的缓存无法回收问题(issue#4039@Github)