From a6f01e75c6de8e13e21a7d5e831ab45af1eb58d5 Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 25 Apr 2023 17:57:23 +0800 Subject: [PATCH] fix code --- .../core/convert/impl/MapConverter.java | 4 +- .../org/dromara/hutool/core/map/MapUtil.java | 25 +++++++--- .../hutool/core/data/Issue3081Test.java | 45 ++++++++++++++++++ .../client/engine/ClientEngineFactory.java | 2 +- .../dromara/hutool/http/html/HtmlUtil.java | 10 +++- .../org/dromara/hutool/http/HtmlUtilTest.java | 11 +++++ .../dromara/hutool/json/IssueI6YN2ATest.java | 46 +++++++++++++++++++ 7 files changed, 133 insertions(+), 10 deletions(-) create mode 100755 hutool-core/src/test/java/org/dromara/hutool/core/data/Issue3081Test.java create mode 100755 hutool-json/src/test/java/org/dromara/hutool/json/IssueI6YN2ATest.java diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/MapConverter.java b/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/MapConverter.java index 1a5b1627d..690cf1a39 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/MapConverter.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/convert/impl/MapConverter.java @@ -22,6 +22,7 @@ import org.dromara.hutool.core.reflect.TypeUtil; import java.io.Serializable; import java.lang.reflect.Type; +import java.util.LinkedHashMap; import java.util.Map; import java.util.Objects; @@ -80,7 +81,8 @@ public class MapConverter implements Converter, Serializable { return (Map) value; } } - map = MapUtil.createMap(TypeUtil.getClass(targetType)); + + map = MapUtil.createMap(TypeUtil.getClass(targetType), LinkedHashMap::new); convertMapToMap(keyType, valueType, (Map) value, map); } else if (BeanUtil.isBean(value.getClass())) { map = BeanUtil.beanToMap(value); diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/map/MapUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/map/MapUtil.java index 673c627dd..442ff86a3 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/map/MapUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/map/MapUtil.java @@ -24,10 +24,7 @@ import org.dromara.hutool.core.util.ObjUtil; import java.util.*; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.function.UnaryOperator; +import java.util.function.*; import java.util.stream.Collectors; /** @@ -240,16 +237,30 @@ public class MapUtil extends MapGetUtil { * @param mapType map类型 * @return {@link Map}实例 */ - @SuppressWarnings("unchecked") public static Map createMap(final Class mapType) { + return createMap(mapType, HashMap::new); + } + + /** + * 创建Map
+ * 传入抽象Map{@link AbstractMap}和{@link Map}类将默认创建{@link HashMap} + * + * @param map键类型 + * @param map值类型 + * @param mapType map类型 + * @param defaultMap 如果通过反射创建失败或提供的是抽象Map,则创建的默认Map + * @return {@link Map}实例 + */ + @SuppressWarnings("unchecked") + public static Map createMap(final Class mapType, final Supplier> defaultMap) { if (null == mapType || mapType.isAssignableFrom(AbstractMap.class)) { - return new HashMap<>(); + return defaultMap.get(); } else { try { return (Map) ConstructorUtil.newInstance(mapType); } catch (final Exception e) { // 不支持的map类型,返回默认的HashMap - return new HashMap<>(); + return defaultMap.get(); } } } diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/data/Issue3081Test.java b/hutool-core/src/test/java/org/dromara/hutool/core/data/Issue3081Test.java new file mode 100755 index 000000000..38ef27918 --- /dev/null +++ b/hutool-core/src/test/java/org/dromara/hutool/core/data/Issue3081Test.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.core.data; + +import org.dromara.hutool.core.date.DateField; +import org.dromara.hutool.core.date.DateRange; +import org.dromara.hutool.core.date.DateTime; +import org.dromara.hutool.core.date.DateUtil; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +public class Issue3081Test { + + @Test + void dateRangeTest() { + final DateTime start = DateUtil.parse("2023-01-01 00:00:00"); + final DateTime end = DateUtil.parse("2023-04-25 00:00:00"); + + final DateRange dateTimes = new DateRange(start, end, DateField.DAY_OF_MONTH, 30, true, true); + + final List dateTimeList = new ArrayList<>(); + while (dateTimes.hasNext()) { + dateTimeList.add(dateTimes.next()); + } + Assertions.assertEquals(4, dateTimeList.size()); + + Assertions.assertEquals(DateUtil.parse("2023-01-01 00:00:00"), dateTimeList.get(0)); + Assertions.assertEquals(DateUtil.parse("2023-01-31 00:00:00"), dateTimeList.get(1)); + Assertions.assertEquals(DateUtil.parse("2023-03-02 00:00:00"), dateTimeList.get(2)); + Assertions.assertEquals(DateUtil.parse("2023-04-01 00:00:00"), dateTimeList.get(3)); + } +} diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/ClientEngineFactory.java b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/ClientEngineFactory.java index a2f3ad616..aa7ede4b1 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/ClientEngineFactory.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/ClientEngineFactory.java @@ -33,7 +33,7 @@ public class ClientEngineFactory { * @return 单例的ClientEngine */ public static ClientEngine getEngine() { - return Singleton.get(ClientEngine.class.getName(), ClientEngineFactory::getEngine); + return Singleton.get(ClientEngine.class.getName(), ClientEngineFactory::createEngine); } /** diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/html/HtmlUtil.java b/hutool-http/src/main/java/org/dromara/hutool/http/html/HtmlUtil.java index 53cdfb6d4..554c1f91c 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/html/HtmlUtil.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/html/HtmlUtil.java @@ -186,7 +186,15 @@ public class HtmlUtil { // [^>]+? 属性值,至少有一个非>的字符,>表示标签结束 // \s+(?=>) 表示属性值后跟空格加>,即末尾的属性,此时去掉空格 // (?=\s|>) 表示属性值后跟空格(属性后还有别的属性)或者跟>(最后一个属性) - regex = StrUtil.format("(?i)(\\s*{}\\s*=[^>]+?\\s+(?=>))|(\\s*{}\\s*=[^>]+?(?=\\s|>))", attr, attr); + regex = StrUtil.format("(?i)(\\s*{}\\s*=\\s*)" + + "(" + + // name="xxxx" + "([\"][^\"]+?[\"]\\s*)|" + + // name=xxx > + "([^>]+?\\s+(?=>))|" + + // name=xxx> 或者 name=xxx name2=xxx + "([^>]+?(?=\\s|>))" + + ")", attr); content = content.replaceAll(regex, StrUtil.EMPTY); } return content; diff --git a/hutool-http/src/test/java/org/dromara/hutool/http/HtmlUtilTest.java b/hutool-http/src/test/java/org/dromara/hutool/http/HtmlUtilTest.java index 8d07952bf..f1d9f2251 100644 --- a/hutool-http/src/test/java/org/dromara/hutool/http/HtmlUtilTest.java +++ b/hutool-http/src/test/java/org/dromara/hutool/http/HtmlUtilTest.java @@ -199,4 +199,15 @@ public class HtmlUtilTest { charsetName = ReUtil.get(HtmlUtil.META_CHARSET_PATTERN, "hello world"; + String cleanText = HtmlUtil.removeHtmlAttr(html,"class"); + Assertions.assertEquals("
hello world
", cleanText); + + html = "
hello world
"; + cleanText = HtmlUtil.removeHtmlAttr(html,"class"); + Assertions.assertEquals("
hello world
", cleanText); + } } diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/IssueI6YN2ATest.java b/hutool-json/src/test/java/org/dromara/hutool/json/IssueI6YN2ATest.java new file mode 100755 index 000000000..9dbfcd1d1 --- /dev/null +++ b/hutool-json/src/test/java/org/dromara/hutool/json/IssueI6YN2ATest.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.json; + +import lombok.Data; +import org.dromara.hutool.core.reflect.TypeReference; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class IssueI6YN2ATest { + + @Test + public void toBeanTest() { + final String str = "{\"conditions\":{\"user\":\"test\",\"sex\":\"男\"}," + + "\"headers\":{\"name\":\"姓名\",\"age\":\"年龄\",\"email\":\"邮箱\",\"number\":\"号码\",\"pwd\":\"密码\"}}"; + final JSONObject jsonObject = JSONUtil.parseObj(str); + + final PageQuery bean = jsonObject.toBean(new TypeReference>() {}); + Assertions.assertEquals("{name=姓名, age=年龄, email=邮箱, number=号码, pwd=密码}", bean.headers.toString()); + } + + @Data + public static class PageQuery { + private Map headers = new LinkedHashMap<>(); + private T conditions; + } + + @Data + public static class User { + private String name; + private String sex; + } +}