This commit is contained in:
Looly 2023-04-25 17:57:23 +08:00
parent bd97a73cb9
commit a6f01e75c6
7 changed files with 133 additions and 10 deletions

View File

@ -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);

View File

@ -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 <K, V> Map<K, V> createMap(final Class<?> mapType) {
return createMap(mapType, HashMap::new);
}
/**
* 创建Map<br>
* 传入抽象Map{@link AbstractMap}{@link Map}类将默认创建{@link HashMap}
*
* @param <K> map键类型
* @param <V> map值类型
* @param mapType map类型
* @param defaultMap 如果通过反射创建失败或提供的是抽象Map则创建的默认Map
* @return {@link Map}实例
*/
@SuppressWarnings("unchecked")
public static <K, V> Map<K, V> createMap(final Class<?> mapType, final Supplier<Map<K, V>> defaultMap) {
if (null == mapType || mapType.isAssignableFrom(AbstractMap.class)) {
return new HashMap<>();
return defaultMap.get();
} else {
try {
return (Map<K, V>) ConstructorUtil.newInstance(mapType);
} catch (final Exception e) {
// 不支持的map类型返回默认的HashMap
return new HashMap<>();
return defaultMap.get();
}
}
}

View File

@ -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<DateTime> 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));
}
}

View File

@ -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);
}
/**

View File

@ -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;

View File

@ -199,4 +199,15 @@ public class HtmlUtilTest {
charsetName = ReUtil.get(HtmlUtil.META_CHARSET_PATTERN, "<meta charset = \"utf-8\"", 1);
Assertions.assertEquals("utf-8", charsetName);
}
@Test
void issueI6YNTFTest() {
String html = "<html><body><div class=\"a1 a2\">hello world</div></body></html>";
String cleanText = HtmlUtil.removeHtmlAttr(html,"class");
Assertions.assertEquals("<html><body><div>hello world</div></body></html>", cleanText);
html = "<html><body><div class=a1>hello world</div></body></html>";
cleanText = HtmlUtil.removeHtmlAttr(html,"class");
Assertions.assertEquals("<html><body><div>hello world</div></body></html>", cleanText);
}
}

View File

@ -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<User> bean = jsonObject.toBean(new TypeReference<PageQuery<User>>() {});
Assertions.assertEquals("{name=姓名, age=年龄, email=邮箱, number=号码, pwd=密码}", bean.headers.toString());
}
@Data
public static class PageQuery<T> {
private Map<String, String> headers = new LinkedHashMap<>();
private T conditions;
}
@Data
public static class User {
private String name;
private String sex;
}
}