优化AnyValue.merge方法

This commit is contained in:
Redkale
2022-12-08 19:36:26 +08:00
parent 5093663cfd
commit 1e49fa50b5
3 changed files with 33 additions and 7 deletions

View File

@@ -642,7 +642,7 @@ public final class Application {
}
}
//------------------------------------ 读取配置中心 ------------------------------------
//------------------------------------ 读取配置 ------------------------------------
final AnyValue resources = config.getAnyValue("resources");
if (resources != null) {
resourceFactory.register(RESNAME_APP_GRES, AnyValue.class, resources);

View File

@@ -8,6 +8,8 @@ import org.redkale.util.*;
/**
* 配置源Agent, 在init方法内需要实现读取配置信息如果支持配置更改通知也需要在init里实现监听
*
* 配置项优先级: 本地配置 < 配置中心 < 环境变量
*
*
* 详情见: https://redkale.org

View File

@@ -27,6 +27,15 @@ public abstract class AnyValue {
*/
public static final String XML_TEXT_NODE_NAME = "";
/**
* merge两节点是否覆盖的判断函数
*
*/
public static interface MergeReplacePredicate {
public boolean test(String name, AnyValue val1, AnyValue val2);
}
/**
* 可读写的AnyValue默认实现类
*
@@ -167,12 +176,13 @@ public abstract class AnyValue {
/**
* 将另一个对象合并过来
*
* @param node0 代合并对象
* @param node0 代合并对象
* @param predicate 判断是否覆盖的函数
*
* @return AnyValue
*/
@Override
public DefaultAnyValue merge(AnyValue node0) {
public DefaultAnyValue merge(AnyValue node0, MergeReplacePredicate predicate) {
if (node0 == null) return this;
if (node0 == this) throw new IllegalArgumentException();
DefaultAnyValue node = (DefaultAnyValue) node0;
@@ -193,9 +203,11 @@ public abstract class AnyValue {
for (AnyValue item : ns) {
if (item == null) continue;
if (en.value.parentArrayIndex == ((DefaultAnyValue) item).parentArrayIndex) {
item.merge(en.value);
ok = true;
break;
if (predicate == null || predicate.test(en.name, en.value, item)) {
item.merge(en.value, predicate);
ok = true;
break;
}
}
}
if (!ok) {
@@ -969,7 +981,19 @@ public abstract class AnyValue {
*
* @return AnyValue
*/
public abstract AnyValue merge(AnyValue node);
public AnyValue merge(AnyValue node) {
return merge(node, null);
}
/**
* 将另一个对象合并过来
*
* @param node 代合并对象
* @param predicate 判断是否覆盖的函数
*
* @return AnyValue
*/
public abstract AnyValue merge(AnyValue node, MergeReplacePredicate predicate);
/**
* 回调子节点