feat: 新增命令行配置、优先级最高.

This commit is contained in:
2024-12-25 14:28:30 +08:00
parent aa934121dc
commit a0b0764ac3
5 changed files with 210 additions and 4 deletions

View File

@@ -1,5 +1,6 @@
package com.serliunx.ddns; package com.serliunx.ddns;
import com.serliunx.ddns.config.CommandLineConfiguration;
import com.serliunx.ddns.config.Configuration; import com.serliunx.ddns.config.Configuration;
import com.serliunx.ddns.config.PropertiesConfiguration; import com.serliunx.ddns.config.PropertiesConfiguration;
import com.serliunx.ddns.constant.SystemConstants; import com.serliunx.ddns.constant.SystemConstants;
@@ -8,6 +9,8 @@ import com.serliunx.ddns.core.context.MultipleSourceInstanceContext;
import com.serliunx.ddns.support.SystemInitializer; import com.serliunx.ddns.support.SystemInitializer;
import com.serliunx.ddns.support.okhttp.HttpClient; import com.serliunx.ddns.support.okhttp.HttpClient;
import java.util.Collections;
/** /**
* 启动类 * 启动类
* *
@@ -33,7 +36,7 @@ public final class ManagerLite {
public static void main(String[] args) { public static void main(String[] args) {
// 配置初始化 // 配置初始化
initConfiguration(); initConfiguration(args);
// 相关工具初始化 // 相关工具初始化
initTools(); initTools();
@@ -55,8 +58,10 @@ public final class ManagerLite {
/** /**
* 配置初始化 * 配置初始化
*/ */
private static void initConfiguration() { private static void initConfiguration(String[] args) {
configuration = new PropertiesConfiguration(SystemConstants.USER_SETTINGS_PROPERTIES_PATH); final CommandLineConfiguration cc = new CommandLineConfiguration(args);
cc.from(new PropertiesConfiguration(SystemConstants.USER_SETTINGS_PROPERTIES_PATH));
configuration = cc;
} }
/** /**

View File

@@ -20,7 +20,7 @@ public abstract class AbstractConfiguration implements Configuration {
protected final Logger log = LoggerFactory.getLogger(this.getClass()); protected final Logger log = LoggerFactory.getLogger(this.getClass());
protected final Map<String, String> valueMap = new LinkedHashMap<>(16); protected final Map<String, String> valueMap = new LinkedHashMap<>(16);
private final Lock loadLock = new ReentrantLock(); protected final Lock loadLock = new ReentrantLock();
public AbstractConfiguration() {} public AbstractConfiguration() {}

View File

@@ -0,0 +1,133 @@
package com.serliunx.ddns.config;
import com.serliunx.ddns.core.Combination;
import com.serliunx.ddns.support.Assert;
import java.util.*;
/**
* 从启动命令中读取的配置信息
*
* @author <a href="mailto:serliunx@yeah.net">SerLiunx</a>
* @version 1.0.3
* @since 2024/12/24
*/
public final class CommandLineConfiguration extends AbstractConfiguration implements Combination<Configuration> {
/**
* 原始参数
*/
private final String[] sourceArgs;
/**
* 待合并的其他配置信息
*/
private final Collection<Configuration> configurations;
/**
* 配置项标记
*/
private static final String TAG = "-D";
/**
* 配置赋值符号(=)
*/
private static final String EQUAL = "=";
/**
* 配置缓存
*/
private final Map<String, String> cache = new HashMap<>();
public CommandLineConfiguration(String[] sourceArgs) {
this(sourceArgs, new ArrayList<>());
}
public CommandLineConfiguration(String[] sourceArgs, Collection<Configuration> configurations) {
this.sourceArgs = sourceArgs;
this.configurations = configurations;
}
/**
* 获取原始启动参数
*
* @return 原始启动参数
*/
public String[] getSourceArgs() {
return sourceArgs;
}
@Override
public int getPriority() {
return 0;
}
@Override
public void from(Configuration configuration) {
configurations.add(configuration);
}
@Override
public void from(Collection<? extends Configuration> configurations) {
this.configurations.addAll(configurations);
}
@Override
public Configuration getOriginal() {
return this;
}
@Override
public Collection<? extends Configuration> getCombinations() {
return configurations;
}
@Override
protected void refresh0() {
if (sourceArgs == null) {
return;
}
for (String arg : sourceArgs) {
if (!arg.startsWith(TAG)) {
continue;
}
String key = arg.substring(TAG.length(), arg.indexOf(EQUAL));
String value = arg.substring(arg.indexOf(EQUAL) + 1);
cache.put(key, value);
}
// 载入配置
load();
}
@Override
protected void load0() {
// 合并
merge();
// 更新
valueMap.putAll(cache);
// 清除缓存
cache.clear();
}
/**
* 将其他配置信息合并到当前配置信息
* <li> 命令行参数的配置信息优先级高于其他配置信息
* <li> 仅在持有锁的情况下访问
*/
private void merge() {
Assert.notEmpty(configurations);
for (Configuration configuration : configurations) {
if (configuration instanceof AbstractConfiguration) {
AbstractConfiguration ac = (AbstractConfiguration) configuration;
ac.refresh0();
}
final Map<String, String> keyValue = configuration.getAllKeyAndValue();
keyValue.forEach((k, v) -> {
if (!cache.containsKey(k)) {
cache.put(k, v);
}
});
}
}
}

View File

@@ -0,0 +1,43 @@
package com.serliunx.ddns.core;
import java.util.Collection;
/**
* 组合, 将多个对象以一定的逻辑相组合
*
* @author <a href="mailto:serliunx@yeah.net">SerLiunx</a>
* @version 1.0.3
* @since 2024/12/24
*
* @param <E> 合并的类型
*/
public interface Combination<E> {
/**
* 组合指定对象
*
* @param e 对象
*/
void from(E e);
/**
* 批量组合对象
*
* @param es 对象集合
*/
void from(Collection<? extends E> es);
/**
* 获取原始对象(未组合前的)
*
* @return 原始对象
*/
E getOriginal();
/**
* 获取该对象中所有组合的来源
*
* @return 所有组合来源
*/
Collection<? extends E> getCombinations();
}

View File

@@ -0,0 +1,25 @@
package com.serliunx.ddns.test.config;
import com.serliunx.ddns.config.CommandLineConfiguration;
import com.serliunx.ddns.config.PropertiesConfiguration;
import com.serliunx.ddns.constant.SystemConstants;
import org.junit.Test;
import java.util.Collections;
/**
* 命令行配置读取测试
*
* @author <a href="mailto:serliunx@yeah.net">SerLiunx</a>
* @since 2024/12/24
*/
public class CmdConfigurationTest {
@Test
public void testCmd() {
CommandLineConfiguration configuration = new CommandLineConfiguration(new String[]{"-Dtest.env=1",
"-Dsystem.cfg.log.onstart=false", "-Dapplication.name=jack"},
Collections.singleton(new PropertiesConfiguration(SystemConstants.USER_SETTINGS_PROPERTIES_PATH)));
configuration.refresh();
}
}