From 7e28a55c75842dc0a2d8867770e43af5ac7ef25f Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 13 Nov 2022 19:50:05 +0800 Subject: [PATCH] fix code --- .../hutool/core/io/resource/ResourceUtil.java | 46 +++++++++++++- .../java/cn/hutool/core/map/ForestMap.java | 28 ++++----- .../main/java/cn/hutool/setting/Setting.java | 3 - .../java/cn/hutool/setting/dialect/Props.java | 8 +-- .../setting/dialect/PropsLoaderUtil.java | 61 +++++++++++++++++++ 5 files changed, 121 insertions(+), 25 deletions(-) create mode 100755 hutool-setting/src/main/java/cn/hutool/setting/dialect/PropsLoaderUtil.java 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 index 7bd57ae81..bed806d64 100755 --- 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 @@ -8,6 +8,7 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.classloader.ClassLoaderUtil; import cn.hutool.core.text.StrUtil; import cn.hutool.core.net.url.URLUtil; +import cn.hutool.core.util.ObjUtil; import java.io.BufferedReader; import java.io.File; @@ -174,9 +175,26 @@ public class ResourceUtil { * @since 4.1.5 */ public static EnumerationIter getResourceUrlIter(final String resource) { + return getResourceUrlIter(resource, null); + } + + /** + * 获取指定路径下的资源Iterator
+ * 路径格式必须为目录格式,用/分隔,例如: + * + *
+	 * config/a
+	 * spring/xml
+	 * 
+ * + * @param resource 资源路径 + * @param classLoader {@link ClassLoader} + * @return 资源列表 + */ + public static EnumerationIter getResourceUrlIter(final String resource, final ClassLoader classLoader) { final Enumeration resources; try { - resources = ClassLoaderUtil.getClassLoader().getResources(resource); + resources = ObjUtil.defaultIfNull(classLoader, ClassLoaderUtil.getClassLoader()).getResources(resource); } catch (final IOException e) { throw new IORuntimeException(e); } @@ -233,4 +251,30 @@ public class ResourceUtil { public static Resource getResource(final File file) { return new FileResource(file); } + + /** + * 获取同名的所有资源 + * + * @param resource 资源名 + * @return {@link MultiResource} + */ + public static MultiResource getResources(final String resource) { + return getResources(resource, null); + } + + /** + * 获取同名的所有资源 + * + * @param resource 资源名 + * @param classLoader {@link ClassLoader},{@code null}表示使用默认的当前上下文ClassLoader + * @return {@link MultiResource} + */ + public static MultiResource getResources(final String resource, final ClassLoader classLoader) { + final EnumerationIter iter = getResourceUrlIter(resource, classLoader); + final MultiResource resources = new MultiResource(); + for (final URL url : iter) { + resources.add(getResource(url)); + } + return resources; + } } diff --git a/hutool-core/src/main/java/cn/hutool/core/map/ForestMap.java b/hutool-core/src/main/java/cn/hutool/core/map/ForestMap.java index 997900843..38785e985 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/ForestMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/ForestMap.java @@ -37,7 +37,7 @@ public interface ForestMap extends Map> { * @see #putNode(Object, Object) */ @Override - default TreeEntry put(K key, TreeEntry node) { + default TreeEntry put(final K key, final TreeEntry node) { return putNode(key, node.getValue()); } @@ -47,7 +47,7 @@ public interface ForestMap extends Map> { * @param treeEntryMap 节点集合 */ @Override - default void putAll(Map> treeEntryMap) { + default void putAll(final Map> treeEntryMap) { if (CollUtil.isEmpty(treeEntryMap)) { return; } @@ -73,7 +73,7 @@ public interface ForestMap extends Map> { * @param ignoreNullNode 是否获取到的key为null的子节点/父节点 */ default > void putAllNode( - C values, Function keyGenerator, Function parentKeyGenerator, boolean ignoreNullNode) { + final C values, final Function keyGenerator, final Function parentKeyGenerator, final boolean ignoreNullNode) { if (CollUtil.isEmpty(values)) { return; } @@ -137,7 +137,7 @@ public interface ForestMap extends Map> { * @param childKey 子节点的key * @param childValue 子节点的值 */ - default void putLinkedNodes(K parentKey, V parentValue, K childKey, V childValue) { + default void putLinkedNodes(final K parentKey, final V parentValue, final K childKey, final V childValue) { putNode(parentKey, parentValue); putNode(childKey, childValue); linkNodes(parentKey, childKey); @@ -162,7 +162,7 @@ public interface ForestMap extends Map> { * @param parentKey 父节点的key * @param childKey 子节点的key */ - default void linkNodes(K parentKey, K childKey) { + default void linkNodes(final K parentKey, final K childKey) { linkNodes(parentKey, childKey, null); } @@ -192,7 +192,7 @@ public interface ForestMap extends Map> { * @param key 指定节点的key * @return 节点 */ - default Set> getTreeNodes(K key) { + default Set> getTreeNodes(final K key) { final TreeEntry target = get(key); if (ObjUtil.isNull(target)) { return Collections.emptySet(); @@ -209,7 +209,7 @@ public interface ForestMap extends Map> { * @param key 指定节点的key * @return 节点 */ - default TreeEntry getRootNode(K key) { + default TreeEntry getRootNode(final K key) { return Opt.ofNullable(get(key)) .map(TreeEntry::getRoot) .orElse(null); @@ -222,7 +222,7 @@ public interface ForestMap extends Map> { * @param key 指定节点的key * @return 节点 */ - default TreeEntry getDeclaredParentNode(K key) { + default TreeEntry getDeclaredParentNode(final K key) { return Opt.ofNullable(get(key)) .map(TreeEntry::getDeclaredParent) .orElse(null); @@ -235,7 +235,7 @@ public interface ForestMap extends Map> { * @param parentKey 指定父节点key * @return 节点 */ - default TreeEntry getParentNode(K key, K parentKey) { + default TreeEntry getParentNode(final K key, final K parentKey) { return Opt.ofNullable(get(key)) .map(t -> t.getParent(parentKey)) .orElse(null); @@ -248,7 +248,7 @@ public interface ForestMap extends Map> { * @param parentKey 指定父节点的key * @return 是否 */ - default boolean containsParentNode(K key, K parentKey) { + default boolean containsParentNode(final K key, final K parentKey) { return Opt.ofNullable(get(key)) .map(m -> m.containsParent(parentKey)) .orElse(false); @@ -260,7 +260,7 @@ public interface ForestMap extends Map> { * @param key 节点的key * @return 节点值,若节点不存在,或节点值为null都将返回null */ - default V getNodeValue(K key) { + default V getNodeValue(final K key) { return Opt.ofNullable(get(key)) .map(TreeEntry::getValue) .get(); @@ -275,7 +275,7 @@ public interface ForestMap extends Map> { * @param childKey 子节点 * @return 是否 */ - default boolean containsChildNode(K parentKey, K childKey) { + default boolean containsChildNode(final K parentKey, final K childKey) { return Opt.ofNullable(get(parentKey)) .map(m -> m.containsChild(childKey)) .orElse(false); @@ -288,7 +288,7 @@ public interface ForestMap extends Map> { * @param key key * @return 节点 */ - default Collection> getDeclaredChildNodes(K key) { + default Collection> getDeclaredChildNodes(final K key) { return Opt.ofNullable(get(key)) .map(TreeEntry::getDeclaredChildren) .map(Map::values) @@ -302,7 +302,7 @@ public interface ForestMap extends Map> { * @param key key * @return 该节点的全部子节点 */ - default Collection> getChildNodes(K key) { + default Collection> getChildNodes(final K key) { return Opt.ofNullable(get(key)) .map(TreeEntry::getChildren) .map(Map::values) diff --git a/hutool-setting/src/main/java/cn/hutool/setting/Setting.java b/hutool-setting/src/main/java/cn/hutool/setting/Setting.java index 853cb86c6..ec5161eb5 100644 --- a/hutool-setting/src/main/java/cn/hutool/setting/Setting.java +++ b/hutool-setting/src/main/java/cn/hutool/setting/Setting.java @@ -697,7 +697,6 @@ public class Setting extends AbsSetting implements Map { * * @return 默认分组(空分组)中的所有键列表 */ - @SuppressWarnings("NullableProblems") @Override public Set keySet() { return this.groupedMap.keySet(DEFAULT_GROUP); @@ -708,7 +707,6 @@ public class Setting extends AbsSetting implements Map { * * @return 默认分组(空分组)中的所有值列表 */ - @SuppressWarnings("NullableProblems") @Override public Collection values() { return this.groupedMap.values(DEFAULT_GROUP); @@ -719,7 +717,6 @@ public class Setting extends AbsSetting implements Map { * * @return 默认分组(空分组)中的所有键值对列表 */ - @SuppressWarnings("NullableProblems") @Override public Set> entrySet() { return this.groupedMap.entrySet(DEFAULT_GROUP); diff --git a/hutool-setting/src/main/java/cn/hutool/setting/dialect/Props.java b/hutool-setting/src/main/java/cn/hutool/setting/dialect/Props.java index 26854fe9a..c7bfac22d 100644 --- a/hutool-setting/src/main/java/cn/hutool/setting/dialect/Props.java +++ b/hutool-setting/src/main/java/cn/hutool/setting/dialect/Props.java @@ -23,7 +23,6 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.log.StaticLog; -import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.Writer; @@ -190,12 +189,7 @@ public final class Props extends Properties implements TypeGetter public void load(final Resource resource) { Assert.notNull(resource, "Props resource must be not null!"); this.resource = resource; - - try (final BufferedReader reader = resource.getReader(charset)) { - super.load(reader); - } catch (final IOException e) { - throw new IORuntimeException(e); - } + PropsLoaderUtil.loadTo(this, resource, this.charset); } /** diff --git a/hutool-setting/src/main/java/cn/hutool/setting/dialect/PropsLoaderUtil.java b/hutool-setting/src/main/java/cn/hutool/setting/dialect/PropsLoaderUtil.java new file mode 100755 index 000000000..fcac7e144 --- /dev/null +++ b/hutool-setting/src/main/java/cn/hutool/setting/dialect/PropsLoaderUtil.java @@ -0,0 +1,61 @@ +package cn.hutool.setting.dialect; + +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.io.resource.Resource; +import cn.hutool.core.io.resource.ResourceUtil; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.Charset; +import java.util.Properties; + +/** + * {@link Properties} 资源内容加载工具 + * + * @author looly + * @since 6.0.0 + */ +public class PropsLoaderUtil { + + /** + * 加载配置文件内容到{@link Properties}中
+ * 需要注意的是,如果资源文件的扩展名是.xml,会调用{@link Properties#loadFromXML(InputStream)} 读取。 + * + * @param properties {@link Properties}文件 + * @param resource 资源 + * @param charset 编码,对XML无效 + */ + public static void loadTo(final Properties properties, final Resource resource, final Charset charset) { + final String filename = resource.getName(); + if (filename != null && filename.endsWith(".xml")) { + // XML + try (final InputStream in = resource.getStream()) { + properties.loadFromXML(in); + } catch (final IOException e) { + throw new IORuntimeException(e); + } + } else { + // .properties + try (final BufferedReader reader = resource.getReader(charset)) { + properties.load(reader); + } catch (final IOException e) { + throw new IORuntimeException(e); + } + } + } + + /** + * 加载指定名称的所有配置文件内容到{@link Properties}中 + * + * @param properties {@link Properties}文件 + * @param resourceName 资源名,可以是相对classpath的路径,也可以是绝对路径 + * @param classLoader {@link ClassLoader},{@code null}表示使用默认的当前上下文ClassLoader + * @param charset 编码,对XML无效 + */ + public static void loadAllTo(final Properties properties, final String resourceName, final ClassLoader classLoader, final Charset charset) { + for (final Resource resource : ResourceUtil.getResources(resourceName, classLoader)) { + loadTo(properties, resource, charset); + } + } +}