From 4c202733e50e175a9dcc56c303efd4db55dfc505 Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 11 Feb 2020 17:41:15 +0800 Subject: [PATCH] add PropsUtil --- .../main/java/cn/hutool/setting/Setting.java | 12 ++-- .../java/cn/hutool/setting/SettingUtil.java | 41 ++++++++--- .../java/cn/hutool/setting/dialect/Props.java | 5 ++ .../cn/hutool/setting/dialect/PropsUtil.java | 70 +++++++++++++++++++ .../cn/hutool/setting/test/PropsUtilTest.java | 22 ++++++ .../hutool/setting/test/SettingUtilTest.java | 6 ++ 6 files changed, 141 insertions(+), 15 deletions(-) create mode 100644 hutool-setting/src/main/java/cn/hutool/setting/dialect/PropsUtil.java create mode 100644 hutool-setting/src/test/java/cn/hutool/setting/test/PropsUtilTest.java 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 b0fbd7163..a801b03ab 100644 --- a/hutool-setting/src/main/java/cn/hutool/setting/Setting.java +++ b/hutool-setting/src/main/java/cn/hutool/setting/Setting.java @@ -609,6 +609,7 @@ public class Setting extends AbsSetting implements Map { * * @param m Map */ + @SuppressWarnings("NullableProblems") @Override public void putAll(Map m) { this.groupedMap.putAll(DEFAULT_GROUP, m); @@ -627,6 +628,7 @@ public class Setting extends AbsSetting implements Map { * * @return 默认分组(空分组)中的所有键列表 */ + @SuppressWarnings("NullableProblems") @Override public Set keySet() { return this.groupedMap.keySet(DEFAULT_GROUP); @@ -637,6 +639,7 @@ public class Setting extends AbsSetting implements Map { * * @return 默认分组(空分组)中的所有值列表 */ + @SuppressWarnings("NullableProblems") @Override public Collection values() { return this.groupedMap.values(DEFAULT_GROUP); @@ -647,6 +650,7 @@ public class Setting extends AbsSetting implements Map { * * @return 默认分组(空分组)中的所有键值对列表 */ + @SuppressWarnings("NullableProblems") @Override public Set> entrySet() { return this.groupedMap.entrySet(DEFAULT_GROUP); @@ -657,7 +661,7 @@ public class Setting extends AbsSetting implements Map { final int prime = 31; int result = 1; result = prime * result + ((charset == null) ? 0 : charset.hashCode()); - result = prime * result + ((groupedMap == null) ? 0 : groupedMap.hashCode()); + result = prime * result + groupedMap.hashCode(); result = prime * result + (isUseVariable ? 1231 : 1237); result = prime * result + ((settingUrl == null) ? 0 : settingUrl.hashCode()); return result; @@ -682,11 +686,7 @@ public class Setting extends AbsSetting implements Map { } else if (false == charset.equals(other.charset)) { return false; } - if (groupedMap == null) { - if (other.groupedMap != null) { - return false; - } - } else if (false == groupedMap.equals(other.groupedMap)) { + if (false == groupedMap.equals(other.groupedMap)) { return false; } if (isUseVariable != other.isUseVariable) { diff --git a/hutool-setting/src/main/java/cn/hutool/setting/SettingUtil.java b/hutool-setting/src/main/java/cn/hutool/setting/SettingUtil.java index 2dfed771c..f7a90358f 100644 --- a/hutool-setting/src/main/java/cn/hutool/setting/SettingUtil.java +++ b/hutool-setting/src/main/java/cn/hutool/setting/SettingUtil.java @@ -1,27 +1,29 @@ package cn.hutool.setting; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.resource.NoResourceException; +import cn.hutool.core.util.StrUtil; + import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.util.StrUtil; - /** * Setting工具类
* 提供静态方法获取配置文件 - * - * @author looly * + * @author looly */ public class SettingUtil { - /** 配置文件缓存 */ + /** + * 配置文件缓存 + */ private static Map settingMap = new ConcurrentHashMap<>(); private static final Object lock = new Object(); /** * 获取当前环境下的配置文件
* name可以为不包括扩展名的文件名(默认.setting为结尾),也可以是文件名全称 - * + * * @param name 文件名,如果没有扩展名,默认为.setting * @return 当前环境下配置文件 */ @@ -33,8 +35,8 @@ public class SettingUtil { if (null == setting) { String filePath = name; String extName = FileUtil.extName(filePath); - if(StrUtil.isEmpty(extName)) { - filePath = filePath + "." + Setting.EXT_NAME; + if (StrUtil.isEmpty(extName)) { + filePath = filePath + "." + Setting.EXT_NAME; } setting = new Setting(filePath, true); settingMap.put(name, setting); @@ -43,4 +45,25 @@ public class SettingUtil { } return setting; } + + /** + * 获取给定路径找到的第一个配置文件
+ * * name可以为不包括扩展名的文件名(默认.setting为结尾),也可以是文件名全称 + * + * @param names 文件名,如果没有扩展名,默认为.setting + * + * @return 当前环境下配置文件 + * @since 5.1.3 + */ + public static Setting getFirstFound(String... names) { + Setting setting; + for (String name : names) { + try { + return get(name); + } catch (NoResourceException e) { + //ignore + } + } + return null; + } } 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 31c4d6a77..1a64e9aa0 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 @@ -48,6 +48,11 @@ public final class Props extends Properties implements BasicTypeGetter, private static final long serialVersionUID = 1935981579709590740L; private final static Log log = LogFactory.get(); + /** + * 默认配置文件扩展名 + */ + public final static String EXT_NAME = "properties"; + // ----------------------------------------------------------------------- 私有属性 start /** 属性文件的URL */ private URL propertiesFileUrl; diff --git a/hutool-setting/src/main/java/cn/hutool/setting/dialect/PropsUtil.java b/hutool-setting/src/main/java/cn/hutool/setting/dialect/PropsUtil.java new file mode 100644 index 000000000..b1d1ab434 --- /dev/null +++ b/hutool-setting/src/main/java/cn/hutool/setting/dialect/PropsUtil.java @@ -0,0 +1,70 @@ +package cn.hutool.setting.dialect; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.resource.NoResourceException; +import cn.hutool.core.util.StrUtil; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Props工具类
+ * 提供静态方法获取配置文件 + * + * @author looly + * @since 5.1.3 + */ +public class PropsUtil { + + /** + * 配置文件缓存 + */ + private static Map propsMap = new ConcurrentHashMap<>(); + private static final Object lock = new Object(); + + /** + * 获取当前环境下的配置文件
+ * name可以为不包括扩展名的文件名(默认.properties),也可以是文件名全称 + * + * @param name 文件名,如果没有扩展名,默认为.properties + * @return 当前环境下配置文件 + */ + public static Props get(String name) { + Props props = propsMap.get(name); + if (null == props) { + synchronized (lock) { + props = propsMap.get(name); + if (null == props) { + String filePath = name; + String extName = FileUtil.extName(filePath); + if (StrUtil.isEmpty(extName)) { + filePath = filePath + "." + Props.EXT_NAME; + } + props = new Props(filePath); + propsMap.put(name, props); + } + } + } + return props; + } + + /** + * 获取给定路径找到的第一个配置文件
+ * * name可以为不包括扩展名的文件名(默认.setting为结尾),也可以是文件名全称 + * + * @param names 文件名,如果没有扩展名,默认为.setting + * + * @return 当前环境下配置文件 + */ + public static Props getFirstFound(String... names) { + Props props; + for (String name : names) { + try { + return get(name); + } catch (NoResourceException e) { + //ignore + } + } + return null; + } +} diff --git a/hutool-setting/src/test/java/cn/hutool/setting/test/PropsUtilTest.java b/hutool-setting/src/test/java/cn/hutool/setting/test/PropsUtilTest.java new file mode 100644 index 000000000..ae32be122 --- /dev/null +++ b/hutool-setting/src/test/java/cn/hutool/setting/test/PropsUtilTest.java @@ -0,0 +1,22 @@ +package cn.hutool.setting.test; + +import cn.hutool.setting.dialect.PropsUtil; +import org.junit.Assert; +import org.junit.Test; + +import java.util.Objects; + +public class PropsUtilTest { + + @Test + public void getTest() { + String driver = PropsUtil.get("test").getStr("driver"); + Assert.assertEquals("com.mysql.jdbc.Driver", driver); + } + + @Test + public void getFirstFoundTest() { + String driver = Objects.requireNonNull(PropsUtil.getFirstFound("test2", "test")).getStr("driver"); + Assert.assertEquals("com.mysql.jdbc.Driver", driver); + } +} diff --git a/hutool-setting/src/test/java/cn/hutool/setting/test/SettingUtilTest.java b/hutool-setting/src/test/java/cn/hutool/setting/test/SettingUtilTest.java index b4ffe62e9..a276bb00a 100644 --- a/hutool-setting/src/test/java/cn/hutool/setting/test/SettingUtilTest.java +++ b/hutool-setting/src/test/java/cn/hutool/setting/test/SettingUtilTest.java @@ -12,4 +12,10 @@ public class SettingUtilTest { String driver = SettingUtil.get("test").get("demo", "driver"); Assert.assertEquals("com.mysql.jdbc.Driver", driver); } + + @Test + public void getFirstFoundTest() { + String driver = SettingUtil.getFirstFound("test2", "test").get("demo", "driver"); + Assert.assertEquals("com.mysql.jdbc.Driver", driver); + } }