From eec8939461216bba4f7f00f4e901214ce73d3ba8 Mon Sep 17 00:00:00 2001 From: redkale Date: Fri, 15 Dec 2023 22:10:19 +0800 Subject: [PATCH] AnyValueWriter --- src/main/java/org/redkale/boot/AppConfig.java | 7 +- .../java/org/redkale/boot/Application.java | 159 ++--- .../java/org/redkale/boot/ClassFilter.java | 7 +- .../java/org/redkale/boot/ModuleEngine.java | 8 +- .../java/org/redkale/boot/NodeHttpServer.java | 5 +- .../java/org/redkale/boot/NodeServer.java | 86 +-- .../java/org/redkale/boot/NodeSncpServer.java | 3 +- .../org/redkale/boot/PropertiesAgent.java | 7 +- .../cache/support/CacheModuleEngine.java | 2 +- .../redkale/cluster/ClusterModuleEngine.java | 12 +- .../org/redkale/convert/ConvertFactory.java | 2 +- .../org/redkale/convert/bson/BsonFactory.java | 4 +- .../org/redkale/convert/json/JsonFactory.java | 4 +- .../convert/protobuf/ProtobufFactory.java | 5 +- .../org/redkale/mq/MessageModuleEngine.java | 7 +- .../net/http/HttpDispatcherServlet.java | 7 +- .../org/redkale/net/http/HttpResponse.java | 5 +- .../support/ScheduleModuleEngine.java | 2 +- .../java/org/redkale/source/DataSources.java | 2 +- .../redkale/source/SourceModuleEngine.java | 14 +- src/main/java/org/redkale/util/AnyValue.java | 657 +----------------- .../java/org/redkale/util/AnyValueWriter.java | 604 ++++++++++++++++ .../java/org/redkale/util/Environment.java | 94 ++- src/main/java/org/redkale/util/Inners.java | 4 +- src/main/java/org/redkale/util/XmlReader.java | 19 +- .../test/http/HttpSimpleClientTest.java | 4 +- .../org/redkale/test/http/RestSleepTest.java | 2 +- .../test/rest/_DynHelloRestServlet1.java | 3 +- .../redkale/test/service/ABMainService.java | 9 +- .../org/redkale/test/service/TestService.java | 2 +- .../org/redkale/test/sncp/SncpSleepTest.java | 2 +- .../java/org/redkale/test/sncp/SncpTest.java | 4 +- .../org/redkale/test/source/JsonRecord.java | 5 +- .../test/util/AnyValuePropertiesTest.java | 4 +- .../test/websocket/VideoWebSocketServlet.java | 16 +- 35 files changed, 911 insertions(+), 866 deletions(-) create mode 100644 src/main/java/org/redkale/util/AnyValueWriter.java diff --git a/src/main/java/org/redkale/boot/AppConfig.java b/src/main/java/org/redkale/boot/AppConfig.java index c49f2b3cd..9ab6db7e9 100644 --- a/src/main/java/org/redkale/boot/AppConfig.java +++ b/src/main/java/org/redkale/boot/AppConfig.java @@ -21,13 +21,12 @@ import java.util.Properties; import java.util.Set; import java.util.logging.Logger; import java.util.logging.SimpleFormatter; -import static org.redkale.boot.Application.RESNAME_APP_CONF_DIR; -import static org.redkale.boot.Application.RESNAME_APP_CONF_FILE; -import static org.redkale.boot.Application.RESNAME_APP_HOME; +import static org.redkale.boot.Application.*; import org.redkale.source.DataSources; import org.redkale.util.AnyValue; import org.redkale.util.RedkaleClassLoader; import org.redkale.util.RedkaleException; +import org.redkale.util.AnyValueWriter; import org.redkale.util.Utility; /** @@ -448,7 +447,7 @@ class AppConfig { conf = AnyValue.loadFromProperties(text).getAnyValue("redkale"); } if (fromCache) { - ((AnyValue.DefaultAnyValue) conf).addValue("[config-from-cache]", "true"); + ((AnyValueWriter) conf).addValue("[config-from-cache]", "true"); } return conf; diff --git a/src/main/java/org/redkale/boot/Application.java b/src/main/java/org/redkale/boot/Application.java index 3a01f7e96..ec3405af7 100644 --- a/src/main/java/org/redkale/boot/Application.java +++ b/src/main/java/org/redkale/boot/Application.java @@ -36,7 +36,6 @@ import org.redkale.schedule.support.ScheduleModuleEngine; import org.redkale.service.Service; import org.redkale.source.*; import org.redkale.util.*; -import org.redkale.util.AnyValue.DefaultAnyValue; import org.redkale.watch.WatchServlet; /** @@ -276,8 +275,14 @@ public final class Application { System.setProperty("redkale.application.nodeid", String.valueOf(this.nodeid)); System.setProperty("redkale.application.home", this.home.getPath()); System.setProperty("redkale.application.confPath", this.confPath.toString()); - this.sysPropNames = Collections.unmodifiableSet((Set) System.getProperties().keySet()); + this.envProperties.put(RESNAME_APP_NAME, this.name); + this.envProperties.put(RESNAME_APP_NODEID, String.valueOf(this.nodeid)); + this.envProperties.put(RESNAME_APP_TIME, String.valueOf(this.startTime)); + this.envProperties.put(RESNAME_APP_HOME, this.home.getPath()); + this.envProperties.put(RESNAME_APP_ADDR, this.localAddress.getAddress().getHostAddress()); + this.envProperties.put(RESNAME_APP_CONF_DIR, this.confPath.toString()); + this.sysPropNames = Collections.unmodifiableSet((Set) System.getProperties().keySet()); //初始化本地配置的System.properties appConfig.localSysProperties.forEach((k, v) -> { String key = k.toString(); @@ -596,51 +601,23 @@ public final class Application { final AtomicInteger propertyIndex = new AtomicInteger(); Properties logProps = null; //新的日志配置项 //------------------------------------ 读取配置项 ------------------------------------ - AnyValue propertiesConf = config.getAnyValue("properties"); - if (propertiesConf == null) { + AnyValue propsConf = config.getAnyValue("properties"); + if (propsConf == null) { final AnyValue resources = config.getAnyValue("resources"); if (resources != null) { logger.log(Level.WARNING, " in application config file is deprecated"); - propertiesConf = resources.getAnyValue("properties"); + propsConf = resources.getAnyValue("properties"); } } - if (propertiesConf != null) { + if (propsConf != null) { final Properties agentEnvs = new Properties(); - if (propertiesConf.getValue("load") != null) { //加载本地配置项文件 - for (String dfload : propertiesConf.getValue("load").replace(',', ';').split(";")) { - if (dfload.trim().isEmpty()) { - continue; - } - final URI df = RedkaleClassLoader.getConfResourceAsURI(configFromCache ? null : this.confPath.toString(), dfload.trim()); - if (df != null && (!"file".equals(df.getScheme()) || df.toString().contains("!") || new File(df).isFile())) { - Properties ps = new Properties(); - try { - InputStream in = df.toURL().openStream(); - ps.load(in); - in.close(); - if (logger.isLoggable(Level.FINE)) { - logger.log(Level.FINE, "Load properties(" + dfload + ") size = " + ps.size()); - } - ps.forEach((x, y) -> { //load中的配置项除了redkale.cachesource.和redkale.datasource.开头,不应该有其他redkale.开头配置项 - if (!x.toString().startsWith("redkale.")) { - agentEnvs.put(x, y); - } else { - logger.log(Level.WARNING, "skip illegal(startswith 'redkale.') key " + x + " in properties file"); - } - }); - } catch (Exception e) { - logger.log(Level.WARNING, "Load properties(" + dfload + ") error", e); - } - } - } - } { //可能通过系统环境变量配置信息 Iterator it = ServiceLoader.load(PropertiesAgentProvider.class, classLoader).iterator(); RedkaleClassLoader.putServiceLoader(PropertiesAgentProvider.class); List providers = new ArrayList<>(); while (it.hasNext()) { PropertiesAgentProvider provider = it.next(); - if (provider != null && provider.acceptsConf(propertiesConf)) { + if (provider != null && provider.acceptsConf(propsConf)) { RedkaleClassLoader.putReflectionPublicConstructors(provider.getClass(), provider.getClass().getName()); providers.add(provider); } @@ -650,9 +627,9 @@ public final class Application { this.propertiesAgent = provider.createInstance(); this.resourceFactory.inject(this.propertiesAgent); if (compileMode) { - this.propertiesAgent.compile(propertiesConf); + this.propertiesAgent.compile(propsConf); } else { - Map propMap = this.propertiesAgent.init(this, propertiesConf); + Map propMap = this.propertiesAgent.init(this, propsConf); int propCount = 0; if (propMap != null) { for (Map.Entry en : propMap.entrySet()) { @@ -675,7 +652,7 @@ public final class Application { } final Properties oldEnvs = new Properties(); - for (AnyValue prop : propertiesConf.getAnyValues("property")) { + for (AnyValue prop : propsConf.getAnyValues("property")) { String key = prop.getValue("name"); String value = prop.getValue("value"); if (key == null || value == null) { @@ -691,14 +668,14 @@ public final class Application { } }); //原有properties节点上的属性同步到dyncEnvs - propertiesConf.forEach((k, v) -> dyncProps.put("redkale.properties[" + k + "]", v)); + propsConf.forEach((k, v) -> dyncProps.put("redkale.properties[" + k + "]", v)); oldEnvs.forEach((k, v) -> { //去重后的配置项 String prefix = "redkale.properties.property[" + propertyIndex.getAndIncrement() + "]"; dyncProps.put(prefix + ".name", k); dyncProps.put(prefix + ".value", v); }); //移除旧节点 - ((DefaultAnyValue) this.config).removeAnyValues("properties"); + ((AnyValueWriter) this.config).removeAnyValues("properties"); } //环境变量的优先级最高 System.getProperties().forEach((k, v) -> { @@ -734,12 +711,12 @@ public final class Application { this.config.merge(AnyValue.loadFromProperties(newDyncProps).getAnyValue("redkale"), NodeServer.appConfigmergeFunction); } //使用合并后的新配置节点 - propertiesConf = this.config.getAnyValue("properties"); - if (propertiesConf != null) { + propsConf = this.config.getAnyValue("properties"); + if (propsConf != null) { //清除property节点数组的下坐标 - ((DefaultAnyValue) propertiesConf).clearParentArrayIndex("property"); + ((AnyValueWriter) propsConf).clearParentArrayIndex("property"); //注入配置项 - for (AnyValue prop : propertiesConf.getAnyValues("property")) { + for (AnyValue prop : propsConf.getAnyValues("property")) { String key = prop.getValue("name"); String value = prop.getValue("value"); if (key == null) { @@ -1361,10 +1338,10 @@ public final class Application { if ("SNCP".equals(protocol)) { server = NodeSncpServer.createNodeServer(Application.this, serconf); } else if ("WATCH".equalsIgnoreCase(protocol)) { - DefaultAnyValue serconf2 = (DefaultAnyValue) serconf; - DefaultAnyValue rest = (DefaultAnyValue) serconf2.getAnyValue("rest"); + AnyValueWriter serconf2 = (AnyValueWriter) serconf; + AnyValueWriter rest = (AnyValueWriter) serconf2.getAnyValue("rest"); if (rest == null) { - rest = new DefaultAnyValue(); + rest = new AnyValueWriter(); serconf2.addValue("rest", rest); } rest.setValue("base", WatchServlet.class.getName()); @@ -1497,58 +1474,56 @@ public final class Application { Times.midnight(); //先初始化一下Utility Thread.currentThread().setName("Redkale-Application-Main-Thread"); //运行主程序 - { - String cmd = System.getProperty("cmd", System.getProperty("CMD")); - String[] params = args; - if (args != null && args.length > 0) { + String cmd = System.getProperty("cmd", System.getProperty("CMD")); + String[] params = args; + if (args != null && args.length > 0) { + for (int i = 0; i < args.length; i++) { + if (args[i] != null && args[i].toLowerCase().startsWith("--conf-file=")) { + System.setProperty(RESNAME_APP_CONF_FILE, args[i].substring("--conf-file=".length())); + String[] newargs = new String[args.length - 1]; + System.arraycopy(args, 0, newargs, 0, i); + System.arraycopy(args, i + 1, newargs, i, args.length - 1 - i); + args = newargs; + break; + } + } + if (cmd == null) { for (int i = 0; i < args.length; i++) { - if (args[i] != null && args[i].toLowerCase().startsWith("--conf-file=")) { - System.setProperty(RESNAME_APP_CONF_FILE, args[i].substring("--conf-file=".length())); - String[] newargs = new String[args.length - 1]; - System.arraycopy(args, 0, newargs, 0, i); - System.arraycopy(args, i + 1, newargs, i, args.length - 1 - i); - args = newargs; + if (args[i] != null && !args[i].startsWith("-")) { //非-开头的第一个视为命令号 + cmd = args[i]; + if ("start".equalsIgnoreCase(cmd) || "startup".equalsIgnoreCase(cmd)) { + cmd = null; + } + params = new String[args.length - 1]; + System.arraycopy(args, 0, params, 0, i); + System.arraycopy(args, i + 1, params, i, args.length - 1 - i); break; } } - if (cmd == null) { - for (int i = 0; i < args.length; i++) { - if (args[i] != null && !args[i].startsWith("-")) { //非-开头的第一个视为命令号 - cmd = args[i]; - if ("start".equalsIgnoreCase(cmd) || "startup".equalsIgnoreCase(cmd)) { - cmd = null; - } - params = new String[args.length - 1]; - System.arraycopy(args, 0, params, 0, i); - System.arraycopy(args, i + 1, params, i, args.length - 1 - i); - break; - } - } - } - if (cmd == null) { - if (args.length == 1 && ("--help".equalsIgnoreCase(args[0]) || "-h".equalsIgnoreCase(args[0]))) { - cmd = args[0]; - } - } } - if (cmd != null) { - if ("stop".equalsIgnoreCase(cmd)) { - cmd = "shutdown"; - } - if ("help".equalsIgnoreCase(cmd) || "--help".equalsIgnoreCase(cmd) || "-h".equalsIgnoreCase(cmd)) { - (System.out).println(generateHelp()); - return; - } - boolean restart = "restart".equalsIgnoreCase(cmd); - AnyValue config = AppConfig.loadAppConfig(); - Application.sendCommand(null, config.getIntValue("port"), restart ? "SHUTDOWN" : cmd, params); - if (!restart) { - return; + if (cmd == null) { + if (args.length == 1 && ("--help".equalsIgnoreCase(args[0]) || "-h".equalsIgnoreCase(args[0]))) { + cmd = args[0]; } } } - //PrepareCompiler.main(args); //测试代码 + if (cmd != null) { + if ("stop".equalsIgnoreCase(cmd)) { + cmd = "shutdown"; + } + if ("help".equalsIgnoreCase(cmd) || "--help".equalsIgnoreCase(cmd) || "-h".equalsIgnoreCase(cmd)) { + (System.out).println(generateHelp()); + return; + } + boolean restart = "restart".equalsIgnoreCase(cmd); + AnyValue config = AppConfig.loadAppConfig(); + Application.sendCommand(null, config.getIntValue("port"), restart ? "SHUTDOWN" : cmd, params); + if (!restart) { + return; + } + } + //PrepareCompiler.main(args); //测试代码 final Application application = Application.create(false); application.init(); application.startSelfServer(); @@ -1732,6 +1707,10 @@ public final class Application { return startTime; } + public Environment getEnvironment() { + return environment; + } + public AnyValue getAppConfig() { return config; } diff --git a/src/main/java/org/redkale/boot/ClassFilter.java b/src/main/java/org/redkale/boot/ClassFilter.java index 33f204b60..2313578f9 100644 --- a/src/main/java/org/redkale/boot/ClassFilter.java +++ b/src/main/java/org/redkale/boot/ClassFilter.java @@ -19,7 +19,6 @@ import java.util.regex.Pattern; import org.redkale.annotation.*; import org.redkale.annotation.AutoLoad; import org.redkale.util.*; -import org.redkale.util.AnyValue.DefaultAnyValue; /** * class过滤器, 符合条件的class会保留下来存入FilterEntry。 @@ -214,10 +213,10 @@ public final class ClassFilter { if (cf.conf != null) { if (property == null) { property = cf.conf; - } else if (property instanceof DefaultAnyValue) { - ((DefaultAnyValue) property).addAllStringSet(cf.conf); + } else if (property instanceof AnyValueWriter) { + ((AnyValueWriter) property).addAllStringSet(cf.conf); } else { - DefaultAnyValue dav = new DefaultAnyValue(); + AnyValueWriter dav = new AnyValueWriter(); dav.addAllStringSet(property); dav.addAllStringSet(cf.conf); property = dav; diff --git a/src/main/java/org/redkale/boot/ModuleEngine.java b/src/main/java/org/redkale/boot/ModuleEngine.java index d85a8b2c9..e697817cc 100644 --- a/src/main/java/org/redkale/boot/ModuleEngine.java +++ b/src/main/java/org/redkale/boot/ModuleEngine.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.Properties; import java.util.logging.Logger; import org.redkale.service.Service; +import org.redkale.util.Environment; import org.redkale.util.ResourceEvent; import org.redkale.util.ResourceFactory; @@ -29,16 +30,19 @@ public abstract class ModuleEngine { protected final ResourceFactory resourceFactory; + protected final Environment environment; + public ModuleEngine(Application application) { this.application = application; this.resourceFactory = application.getResourceFactory(); + this.environment = application.getEnvironment(); } /** * 进入Application.init方法时被调用 * 此时状态: - * 1、远程配置项未获取 - * 2、WorkExecutor未初始化 + * 1、远程配置项未获取 + * 2、WorkExecutor未初始化 */ public void onAppPreInit() { //do nothing diff --git a/src/main/java/org/redkale/boot/NodeHttpServer.java b/src/main/java/org/redkale/boot/NodeHttpServer.java index 6eb4c1040..0bb970e7e 100644 --- a/src/main/java/org/redkale/boot/NodeHttpServer.java +++ b/src/main/java/org/redkale/boot/NodeHttpServer.java @@ -23,7 +23,6 @@ import org.redkale.net.http.*; import org.redkale.net.sncp.Sncp; import org.redkale.service.Service; import org.redkale.util.*; -import org.redkale.util.AnyValue.DefaultAnyValue; import org.redkale.watch.*; /** @@ -201,7 +200,7 @@ public class NodeHttpServer extends NodeServer { RedkaleClassLoader.putReflectionDeclaredConstructors(clazz, clazz.getName()); final HttpFilter filter = clazz.getDeclaredConstructor().newInstance(); resourceFactory.inject(filter, this); - DefaultAnyValue filterConf = (DefaultAnyValue) entry.getProperty(); + AnyValueWriter filterConf = (AnyValueWriter) entry.getProperty(); this.httpServer.addHttpFilter(filter, filterConf); if (sb != null) { sb.append("Load ").append(clazz.getName()).append(LINE_SEPARATOR); @@ -265,7 +264,7 @@ public class NodeHttpServer extends NodeServer { resourceFactory.inject(servlet, this); final String[] mappings = ws.value(); String pref = ws.repair() ? prefix : ""; - DefaultAnyValue servletConf = (DefaultAnyValue) entry.getProperty(); + AnyValueWriter servletConf = (AnyValueWriter) entry.getProperty(); this.httpServer.addHttpServlet(servlet, pref, servletConf, mappings); if (ss != null) { for (int i = 0; i < mappings.length; i++) { diff --git a/src/main/java/org/redkale/boot/NodeServer.java b/src/main/java/org/redkale/boot/NodeServer.java index bf704dcc0..0f8983dc3 100644 --- a/src/main/java/org/redkale/boot/NodeServer.java +++ b/src/main/java/org/redkale/boot/NodeServer.java @@ -243,44 +243,44 @@ public abstract class NodeServer { //--------------------------------------------------------------------------------------------- final ResourceFactory appResFactory = application.getResourceFactory(); //------------------------------------- 注册 Resource -------------------------------------------------------- - resourceFactory.register((ResourceFactory rf, String srcResourceName, final Object srcObj, String resourceName, Field field, final Object attachment) -> { - try { - String resName = null; - Resource res = field.getAnnotation(Resource.class); - if (res != null) { - resName = res.name(); - } else { - javax.annotation.Resource res2 = field.getAnnotation(javax.annotation.Resource.class); - if (res2 != null) { - resName = res2.name(); - } - } - if (resName == null || !resName.startsWith("properties.")) { - return null; - } - if ((srcObj instanceof Service) && Sncp.isRemote((Service) srcObj)) { - return null; //远程模式不得注入 DataSource - } - Class type = field.getType(); - if (type != AnyValue.class && type != AnyValue[].class) { - return null; - } - Object resource = null; - final AnyValue properties = application.getAppConfig().getAnyValue("properties"); - if (properties != null && type == AnyValue.class) { - resource = properties.getAnyValue(resName.substring("properties.".length())); - appResFactory.register(resourceName, AnyValue.class, resource); - } else if (properties != null && type == AnyValue[].class) { - resource = properties.getAnyValues(resName.substring("properties.".length())); - appResFactory.register(resourceName, AnyValue[].class, resource); - } - field.set(srcObj, resource); - return resource; - } catch (Exception e) { - logger.log(Level.SEVERE, "Resource inject error", e); - return null; - } - }, AnyValue.class, AnyValue[].class); +// resourceFactory.register((ResourceFactory rf, String srcResourceName, final Object srcObj, String resourceName, Field field, final Object attachment) -> { +// try { +// String resName = null; +// Resource res = field.getAnnotation(Resource.class); +// if (res != null) { +// resName = res.name(); +// } else { +// javax.annotation.Resource res2 = field.getAnnotation(javax.annotation.Resource.class); +// if (res2 != null) { +// resName = res2.name(); +// } +// } +// if (resName == null || !resName.startsWith("properties.")) { +// return null; +// } +// if ((srcObj instanceof Service) && Sncp.isRemote((Service) srcObj)) { +// return null; //远程模式不得注入 DataSource +// } +// Class type = field.getType(); +// if (type != AnyValue.class && type != AnyValue[].class) { +// return null; +// } +// Object resource = null; +// final AnyValue properties = application.getAppConfig().getAnyValue("properties"); +// if (properties != null && type == AnyValue.class) { +// resource = properties.getAnyValue(resName.substring("properties.".length())); +// appResFactory.register(resourceName, AnyValue.class, resource); +// } else if (properties != null && type == AnyValue[].class) { +// resource = properties.getAnyValues(resName.substring("properties.".length())); +// appResFactory.register(resourceName, AnyValue[].class, resource); +// } +// field.set(srcObj, resource); +// return resource; +// } catch (Exception e) { +// logger.log(Level.SEVERE, "Resource inject error", e); +// return null; +// } +// }, AnyValue.class, AnyValue[].class); //------------------------------------- 注册 Local AutoLoad(false) Service -------------------------------------------------------- resourceFactory.register((ResourceFactory rf, String srcResourceName, final Object srcObj, String resourceName, Field field, final Object attachment) -> { @@ -751,7 +751,7 @@ public abstract class NodeServer { } cf = null; for (AnyValue list : proplist) { - AnyValue.DefaultAnyValue prop = null; + AnyValueWriter prop = null; String sc = list.getValue("group"); String mq = list.getValue("mq"); if (sc != null) { @@ -761,7 +761,7 @@ public abstract class NodeServer { sc = localGroup; } if (sc != null || mq != null) { - prop = new AnyValue.DefaultAnyValue(); + prop = new AnyValueWriter(); if (sc != null) { prop.addValue("group", sc); } @@ -772,8 +772,8 @@ public abstract class NodeServer { ClassFilter filter = new ClassFilter(this.serverClassLoader, ref, inter, excludeSuperClasses, prop); for (AnyValue av : list.getAnyValues(property)) { // 节点 final AnyValue[] items = av.getAnyValues("property"); - if (av instanceof AnyValue.DefaultAnyValue && items.length > 0) { //存在 节点 - AnyValue.DefaultAnyValue dav = AnyValue.DefaultAnyValue.create(); + if (av instanceof AnyValueWriter && items.length > 0) { //存在 节点 + AnyValueWriter dav = AnyValueWriter.create(); final AnyValue.Entry[] strings = av.getStringEntrys(); if (strings != null) { //将节点的属性值传给dav for (AnyValue.Entry en : strings) { @@ -788,7 +788,7 @@ public abstract class NodeServer { } } } - AnyValue.DefaultAnyValue ps = AnyValue.DefaultAnyValue.create(); + AnyValueWriter ps = AnyValueWriter.create(); for (AnyValue item : items) { ps.addValue(item.getValue("name"), item.getValue("value")); } diff --git a/src/main/java/org/redkale/boot/NodeSncpServer.java b/src/main/java/org/redkale/boot/NodeSncpServer.java index 4d8e89650..b3af0e68a 100644 --- a/src/main/java/org/redkale/boot/NodeSncpServer.java +++ b/src/main/java/org/redkale/boot/NodeSncpServer.java @@ -14,7 +14,6 @@ import org.redkale.net.*; import org.redkale.net.sncp.*; import org.redkale.service.Local; import org.redkale.util.*; -import org.redkale.util.AnyValue.DefaultAnyValue; /** * SNCP Server节点的配置Server @@ -123,7 +122,7 @@ public class NodeSncpServer extends NodeServer { RedkaleClassLoader.putReflectionDeclaredConstructors(clazz, clazz.getName()); final SncpFilter filter = clazz.getDeclaredConstructor().newInstance(); resourceFactory.inject(filter, this); - DefaultAnyValue filterConf = (DefaultAnyValue) entry.getProperty(); + AnyValueWriter filterConf = (AnyValueWriter) entry.getProperty(); this.sncpServer.addSncpFilter(filter, filterConf); if (sb != null) { sb.append("Load ").append(clazz.getName()).append(LINE_SEPARATOR); diff --git a/src/main/java/org/redkale/boot/PropertiesAgent.java b/src/main/java/org/redkale/boot/PropertiesAgent.java index 5e56c96b0..e291aecd4 100644 --- a/src/main/java/org/redkale/boot/PropertiesAgent.java +++ b/src/main/java/org/redkale/boot/PropertiesAgent.java @@ -8,7 +8,6 @@ import java.util.logging.Level; import java.util.logging.Logger; import org.redkale.net.http.MimeType; import org.redkale.util.*; -import org.redkale.util.AnyValue.DefaultAnyValue; /** * 配置源Agent, 在init方法内需要实现读取配置信息,如果支持配置更改通知,也需要在init里实现监听 @@ -164,11 +163,11 @@ public abstract class PropertiesAgent { if (!envRegisterProps.isEmpty()) { application.envProperties.putAll(envChangedProps); envRemovedKeys.forEach(application.envProperties::remove); - DefaultAnyValue oldConf = (DefaultAnyValue) application.getAppConfig().getAnyValue("properties"); - DefaultAnyValue newConf = new DefaultAnyValue(); + AnyValueWriter oldConf = (AnyValueWriter) application.getAppConfig().getAnyValue("properties"); + AnyValueWriter newConf = new AnyValueWriter(); oldConf.forEach((k, v) -> newConf.addValue(k, v)); application.envProperties.forEach((k, v) -> { - newConf.addValue("property", new DefaultAnyValue().addValue("name", k.toString()).addValue("value", v.toString())); + newConf.addValue("property", new AnyValueWriter().addValue("name", k.toString()).addValue("value", v.toString())); }); oldConf.replace(newConf); application.getResourceFactory().register(envRegisterProps, "", Environment.class); diff --git a/src/main/java/org/redkale/cache/support/CacheModuleEngine.java b/src/main/java/org/redkale/cache/support/CacheModuleEngine.java index ffca3bc71..a79654c5e 100644 --- a/src/main/java/org/redkale/cache/support/CacheModuleEngine.java +++ b/src/main/java/org/redkale/cache/support/CacheModuleEngine.java @@ -26,7 +26,7 @@ public class CacheModuleEngine extends ModuleEngine { public void onAppPostInit() { //设置缓存管理器 this.cacheManager = CacheManagerService.create(null).enabled(false); - final AnyValue cacheConf = application.getAppConfig().getAnyValue("cache"); + final AnyValue cacheConf = environment.getAnyValue("redkale.cache", false); this.resourceFactory.inject(this.cacheManager); if (!application.isCompileMode() && cacheConf != null) { this.cacheManager.init(cacheConf); diff --git a/src/main/java/org/redkale/cluster/ClusterModuleEngine.java b/src/main/java/org/redkale/cluster/ClusterModuleEngine.java index 074b459a7..be7e05e92 100644 --- a/src/main/java/org/redkale/cluster/ClusterModuleEngine.java +++ b/src/main/java/org/redkale/cluster/ClusterModuleEngine.java @@ -15,7 +15,7 @@ import java.util.logging.Level; import org.redkale.boot.Application; import org.redkale.boot.ModuleEngine; import org.redkale.util.AnyValue; -import org.redkale.util.AnyValue.DefaultAnyValue; +import org.redkale.util.AnyValueWriter; import org.redkale.util.RedkaleClassLoader; import org.redkale.util.ResourceEvent; @@ -41,9 +41,9 @@ public class ClusterModuleEngine extends ModuleEngine { * 结束Application.init方法前被调用 */ @Override - public void onAppPostInit() { + public void onAppPostInit() { ClusterAgent cluster = null; - AnyValue clusterConf = application.getAppConfig().getAnyValue("cluster"); + AnyValue clusterConf = environment.getAnyValue("redkale.cluster", false); if (clusterConf != null) { try { String classVal = application.getPropertyValue(clusterConf.getValue("type", clusterConf.getValue("value"))); //兼容value字段 @@ -88,7 +88,7 @@ public class ClusterModuleEngine extends ModuleEngine { } } this.clusterAgent = cluster; - + if (this.clusterAgent != null) { if (logger.isLoggable(Level.FINER)) { logger.log(Level.FINER, "ClusterAgent (type = " + this.clusterAgent.getClass().getSimpleName() + ") initing"); @@ -143,7 +143,7 @@ public class ClusterModuleEngine extends ModuleEngine { //第三方服务注册配置项的变更 if (!clusterChangedProps.isEmpty() || !clusterRemovedKeys.isEmpty()) { if (this.clusterAgent != null) { - final DefaultAnyValue old = (DefaultAnyValue) application.getAppConfig().getAnyValue("cluster"); + final AnyValueWriter old = (AnyValueWriter) environment.getAnyValue("redkale.cluster", false); Properties newProps = new Properties(); newProps.putAll(clusterProperties); List changeEvents = new ArrayList<>(); @@ -158,7 +158,7 @@ public class ClusterModuleEngine extends ModuleEngine { changeEvents.add(ResourceEvent.create(key.substring("redkale.cluster.".length()), null, this.clusterProperties.getProperty(key))); }); if (!changeEvents.isEmpty()) { - DefaultAnyValue back = old.copy(); + AnyValueWriter back = old.copy(); try { old.replace(AnyValue.loadFromProperties(newProps).getAnyValue("redkale").getAnyValue("cluster")); clusterAgent.onResourceChange(changeEvents.toArray(new ResourceEvent[changeEvents.size()])); diff --git a/src/main/java/org/redkale/convert/ConvertFactory.java b/src/main/java/org/redkale/convert/ConvertFactory.java index 1264b06fa..7f4397e75 100644 --- a/src/main/java/org/redkale/convert/ConvertFactory.java +++ b/src/main/java/org/redkale/convert/ConvertFactory.java @@ -141,7 +141,7 @@ public abstract class ConvertFactory { this.register(DoubleStream.class, DoubleArraySimpledCoder.DoubleStreamSimpledCoder.instance); this.register(String[].class, StringArraySimpledCoder.instance); //--------------------------------------------------------- - this.register(AnyValue.class, Creator.create(AnyValue.DefaultAnyValue.class)); + this.register(AnyValue.class, Creator.create(AnyValueWriter.class)); this.register(HttpCookie.class, new Creator() { @Override @ConstructorParameters({"name", "value"}) diff --git a/src/main/java/org/redkale/convert/bson/BsonFactory.java b/src/main/java/org/redkale/convert/bson/BsonFactory.java index e37e937fe..a768337ac 100644 --- a/src/main/java/org/redkale/convert/bson/BsonFactory.java +++ b/src/main/java/org/redkale/convert/bson/BsonFactory.java @@ -47,8 +47,8 @@ public final class BsonFactory extends ConvertFactory { instance.register(Serializable.class, objectDecoder); instance.register(Serializable.class, objectEncoder); - //instance.register(AnyValue.class, instance.loadDecoder(AnyValue.DefaultAnyValue.class)); - //instance.register(AnyValue.class, instance.loadEncoder(AnyValue.DefaultAnyValue.class)); + //instance.register(AnyValue.class, instance.loadDecoder(SimpleAnyValue.class)); + //instance.register(AnyValue.class, instance.loadEncoder(SimpleAnyValue.class)); } private BsonFactory(BsonFactory parent, int features) { diff --git a/src/main/java/org/redkale/convert/json/JsonFactory.java b/src/main/java/org/redkale/convert/json/JsonFactory.java index 393f9e519..0a727c88e 100644 --- a/src/main/java/org/redkale/convert/json/JsonFactory.java +++ b/src/main/java/org/redkale/convert/json/JsonFactory.java @@ -32,8 +32,8 @@ public final class JsonFactory extends ConvertFactory { static { instance.register(Serializable.class, instance.loadEncoder(Object.class)); - //instance.register(AnyValue.class, instance.loadDecoder(AnyValue.DefaultAnyValue.class)); - //instance.register(AnyValue.class, instance.loadEncoder(AnyValue.DefaultAnyValue.class)); + //instance.register(AnyValue.class, instance.loadDecoder(SimpleAnyValue.class)); + //instance.register(AnyValue.class, instance.loadEncoder(SimpleAnyValue.class)); } private JsonFactory(JsonFactory parent, int features) { diff --git a/src/main/java/org/redkale/convert/protobuf/ProtobufFactory.java b/src/main/java/org/redkale/convert/protobuf/ProtobufFactory.java index 00cb213e7..12d50fa03 100644 --- a/src/main/java/org/redkale/convert/protobuf/ProtobufFactory.java +++ b/src/main/java/org/redkale/convert/protobuf/ProtobufFactory.java @@ -12,6 +12,7 @@ import java.util.concurrent.atomic.*; import java.util.stream.Stream; import org.redkale.convert.*; import org.redkale.util.AnyValue; +import org.redkale.util.AnyValueWriter; /** * @@ -36,8 +37,8 @@ public class ProtobufFactory extends ConvertFactory { final String key = k.toString(); @@ -270,7 +271,7 @@ public class MessageModuleEngine extends ModuleEngine { changeEvents.add(ResourceEvent.create(key.substring(prefix.length()), null, this.messageProperties.getProperty(key))); }); if (!changeEvents.isEmpty()) { - AnyValue.DefaultAnyValue back = old.copy(); + AnyValueWriter back = old.copy(); try { old.replace(AnyValue.loadFromProperties(newProps).getAnyValue("redkale").getAnyValue("mq").getAnyValue(mqName)); agent.onResourceChange(changeEvents.toArray(new ResourceEvent[changeEvents.size()])); @@ -403,7 +404,7 @@ public class MessageModuleEngine extends ModuleEngine { if (mqsNode != null) { AnyValue confNode = mqsNode.getAnyValue(mqName); if (confNode != null) { //必须要设置name属性 - ((AnyValue.DefaultAnyValue) confNode).setValue("name", mqName); + ((AnyValueWriter) confNode).setValue("name", mqName); } return confNode; } diff --git a/src/main/java/org/redkale/net/http/HttpDispatcherServlet.java b/src/main/java/org/redkale/net/http/HttpDispatcherServlet.java index 8c7b3a615..e2783b96a 100644 --- a/src/main/java/org/redkale/net/http/HttpDispatcherServlet.java +++ b/src/main/java/org/redkale/net/http/HttpDispatcherServlet.java @@ -18,7 +18,6 @@ import org.redkale.net.Filter; import org.redkale.net.http.Rest.RestDynSourceType; import org.redkale.service.Service; import org.redkale.util.*; -import org.redkale.util.AnyValue.DefaultAnyValue; /** * HTTP Servlet的总入口,请求在HttpDispatcherServlet中进行分流。
@@ -268,11 +267,11 @@ public class HttpDispatcherServlet extends DispatcherServlet { private final byte[] jsonContentTypeBytes; - private final DefaultAnyValue header = new DefaultAnyValue(); + private final AnyValueWriter header = new AnyValueWriter(); private final String[][] defaultAddHeaders; @@ -1365,7 +1364,7 @@ public class HttpResponse extends Response { return this; } - protected DefaultAnyValue duplicateHeader() { + protected AnyValueWriter duplicateHeader() { return this.header.duplicate(); } diff --git a/src/main/java/org/redkale/schedule/support/ScheduleModuleEngine.java b/src/main/java/org/redkale/schedule/support/ScheduleModuleEngine.java index dbfc2faf4..282bdd4bc 100644 --- a/src/main/java/org/redkale/schedule/support/ScheduleModuleEngine.java +++ b/src/main/java/org/redkale/schedule/support/ScheduleModuleEngine.java @@ -27,7 +27,7 @@ public class ScheduleModuleEngine extends ModuleEngine { public void onAppPostInit() { //设置定时管理器 this.scheduleManager = ScheduleManagerService.create(null).enabled(false); - final AnyValue scheduleConf = application.getAppConfig().getAnyValue("schedule", true); + final AnyValue scheduleConf = environment.getAnyValue("redkale.schedule", true); this.resourceFactory.inject(this.scheduleManager); if (!application.isCompileMode()) { this.scheduleManager.init(scheduleConf); diff --git a/src/main/java/org/redkale/source/DataSources.java b/src/main/java/org/redkale/source/DataSources.java index 4f90a5c0a..0853db83d 100644 --- a/src/main/java/org/redkale/source/DataSources.java +++ b/src/main/java/org/redkale/source/DataSources.java @@ -297,7 +297,7 @@ public final class DataSources { // // RedkaleClassLoader.putServiceLoader(DataSourceProvider.class); // Class dsClass = null; -// final AnyValue.DefaultAnyValue lc = new AnyValue.DefaultAnyValue(); +// final SimpleAnyValue lc = new SimpleAnyValue(); // readprop.forEach((k, v) -> lc.addValue(k.toString(), v.toString())); // lc.setValue("dbtype", dbtype); // List providers = new ArrayList<>(); diff --git a/src/main/java/org/redkale/source/SourceModuleEngine.java b/src/main/java/org/redkale/source/SourceModuleEngine.java index 8fd0ec4cb..aa390df6e 100644 --- a/src/main/java/org/redkale/source/SourceModuleEngine.java +++ b/src/main/java/org/redkale/source/SourceModuleEngine.java @@ -23,7 +23,7 @@ import org.redkale.net.Servlet; import org.redkale.net.sncp.Sncp; import org.redkale.service.Service; import org.redkale.util.AnyValue; -import org.redkale.util.AnyValue.DefaultAnyValue; +import org.redkale.util.AnyValueWriter; import org.redkale.util.InstanceProvider; import org.redkale.util.RedkaleClassLoader; import org.redkale.util.RedkaleException; @@ -205,7 +205,7 @@ public class SourceModuleEngine extends ModuleEngine { if (source == null) { continue; //多余的数据源 } - final AnyValue.DefaultAnyValue old = (AnyValue.DefaultAnyValue) findSourceConfig(sourceName, "cachesource"); + final AnyValueWriter old = (AnyValueWriter) findSourceConfig(sourceName, "cachesource"); Properties newProps = new Properties(); this.sourceProperties.forEach((k, v) -> { final String key = k.toString(); @@ -250,7 +250,7 @@ public class SourceModuleEngine extends ModuleEngine { changeEvents.add(ResourceEvent.create(key.substring(prefix.length()), null, this.sourceProperties.getProperty(key))); }); if (!changeEvents.isEmpty()) { - AnyValue.DefaultAnyValue back = old.copy(); + AnyValueWriter back = old.copy(); try { old.replace(AnyValue.loadFromProperties(newProps).getAnyValue("redkale").getAnyValue("cachesource").getAnyValue(sourceName)); ((AbstractCacheSource) source).onResourceChange(changeEvents.toArray(new ResourceEvent[changeEvents.size()])); @@ -266,7 +266,7 @@ public class SourceModuleEngine extends ModuleEngine { if (source == null) { continue; //多余的数据源 } - AnyValue.DefaultAnyValue old = (AnyValue.DefaultAnyValue) findSourceConfig(sourceName, "datasource"); + AnyValueWriter old = (AnyValueWriter) findSourceConfig(sourceName, "datasource"); Properties newProps = new Properties(); this.sourceProperties.forEach((k, v) -> { final String key = k.toString(); @@ -311,7 +311,7 @@ public class SourceModuleEngine extends ModuleEngine { changeEvents.add(ResourceEvent.create(key.substring(prefix.length()), null, this.sourceProperties.getProperty(key))); }); if (!changeEvents.isEmpty()) { - AnyValue.DefaultAnyValue back = old.copy(); + AnyValueWriter back = old.copy(); try { old.replace(AnyValue.loadFromProperties(newProps).getAnyValue("redkale").getAnyValue("datasource").getAnyValue(sourceName)); ((AbstractDataSource) source).onResourceChange(changeEvents.toArray(new ResourceEvent[changeEvents.size()])); @@ -496,8 +496,8 @@ public class SourceModuleEngine extends ModuleEngine { if (props.isEmpty()) { return null; } - AnyValue conf = DefaultAnyValue.loadFromProperties(props); - ((DefaultAnyValue) conf).setValue("name", sourceName); + AnyValue conf = AnyValueWriter.loadFromProperties(props); + ((AnyValueWriter) conf).setValue("name", sourceName); return conf; } diff --git a/src/main/java/org/redkale/util/AnyValue.java b/src/main/java/org/redkale/util/AnyValue.java index 1d50c6c5c..c2c335383 100644 --- a/src/main/java/org/redkale/util/AnyValue.java +++ b/src/main/java/org/redkale/util/AnyValue.java @@ -11,7 +11,6 @@ import java.util.*; import java.util.function.*; import org.redkale.annotation.ConstructorParameters; import org.redkale.convert.ConvertColumn; -import org.redkale.convert.ConvertDisabled; import static org.redkale.util.Utility.isEmpty; /** @@ -48,602 +47,18 @@ public abstract class AnyValue { } /** - * 可读写的AnyValue默认实现类 * - * @author zhangjx + * @see org.redkale.util.AnyValueWriter + * @deprecated replace {@link org.redkale.util.AnyValueWriter} */ - @SuppressWarnings("unchecked") - public static final class DefaultAnyValue extends AnyValue { + @Deprecated(since = "2.8.0") + public static final class DefaultAnyValue extends AnyValueWriter { - /** - * 区分name大小写的比较策略 - * - */ - public static final BiPredicate EQUALS_PREDICATE = (name1, name2) -> name1.equals(name2); - - /** - * 不区分name大小写的比较策略 - */ - public static final BiPredicate EQUALS_IGNORE = (name1, name2) -> name1.equalsIgnoreCase(name2); - - @ConvertColumn(index = 1) - private boolean ignoreCase; - - private BiPredicate predicate; - - @ConvertColumn(index = 2) - private Entry[] stringEntrys = new Entry[0]; - - @ConvertColumn(index = 3) - private Entry[] anyEntrys = new Entry[0]; - - private int parentArrayIndex = -1; //只可能被loadFromProperties方法赋值 - - /** - * 创建空的DefaultAnyValue对象 - * - * @return DefaultAnyValue对象 - */ public static final DefaultAnyValue create() { return new DefaultAnyValue(); } - - /** - * 创建含name-value值的DefaultAnyValue对象 - * - * @param name name - * @param value value值 - * - * @return DefaultAnyValue对象 - */ - public static final DefaultAnyValue create(String name, Number value) { - DefaultAnyValue conf = new DefaultAnyValue(); - conf.addValue(name, value); - return conf; - } - - /** - * 创建含name-value值的DefaultAnyValue对象 - * - * @param name name - * @param value value值 - * - * @return DefaultAnyValue对象 - */ - public static final DefaultAnyValue create(String name, String value) { - DefaultAnyValue conf = new DefaultAnyValue(); - conf.addValue(name, value); - return conf; - } - - /** - * 创建含name-value值的DefaultAnyValue对象 - * - * @param name name - * @param value value值 - * - * @return DefaultAnyValue对象 - */ - public static final DefaultAnyValue create(String name, AnyValue value) { - DefaultAnyValue conf = new DefaultAnyValue(); - conf.addValue(name, value); - return conf; - } - - /** - * 创建一个区分大小写比较策略的DefaultAnyValue对象 - * - */ - public DefaultAnyValue() { - this(false); - } - - /** - * 创建DefaultAnyValue对象 - * - * @param ignoreCase name是否不区分大小写 - */ - public DefaultAnyValue(boolean ignoreCase) { - this.ignoreCase = ignoreCase; - this.predicate = ignoreCase ? EQUALS_IGNORE : EQUALS_PREDICATE; - } - - /** - * 创建共享此内容的DefaultAnyValue对象 - * - * @return DefaultAnyValue对象 - */ - public DefaultAnyValue duplicate() { - DefaultAnyValue rs = new DefaultAnyValue(this.ignoreCase); - rs.stringEntrys = this.stringEntrys; - rs.anyEntrys = this.anyEntrys; - return rs; - } - - /** - * 复制一份对象 - * - * @return DefaultAnyValue对象 - */ - @Override - public DefaultAnyValue copy() { - DefaultAnyValue rs = new DefaultAnyValue(this.ignoreCase); - rs.predicate = this.predicate; - rs.parentArrayIndex = this.parentArrayIndex; - if (this.stringEntrys != null) { - rs.stringEntrys = new Entry[this.stringEntrys.length]; - for (int i = 0; i < rs.stringEntrys.length; i++) { - Entry en = this.stringEntrys[i]; - if (en == null) { - continue; - } - rs.stringEntrys[i] = new Entry(en.name, en.value); - } - } - if (this.anyEntrys != null) { - rs.anyEntrys = new Entry[this.anyEntrys.length]; - for (int i = 0; i < rs.anyEntrys.length; i++) { - Entry en = this.anyEntrys[i]; - if (en == null) { - continue; - } - rs.anyEntrys[i] = new Entry(en.name, en.value == null ? null : en.value.copy()); - } - } - return rs; - } - - /** - * 将另一个对象替换本对象 - * - * @param node 替换的对象 - * - * @return AnyValue - */ - @Override - public DefaultAnyValue replace(AnyValue node) { - if (node != null) { - DefaultAnyValue rs = (DefaultAnyValue) node; - this.ignoreCase = rs.ignoreCase; - this.predicate = rs.predicate; - this.parentArrayIndex = rs.parentArrayIndex; - this.stringEntrys = rs.stringEntrys; - this.anyEntrys = rs.anyEntrys; - } - return this; - } - - /** - * 将另一个对象合并过来 - * - * @param node 代合并对象 - * @param func 判断覆盖方式的函数 - * - * @return AnyValue - */ - @Override - public DefaultAnyValue merge(AnyValue node, MergeFunction func) { - return merge(node, "", func); - } - - protected DefaultAnyValue merge(AnyValue node0, String path, MergeFunction func) { - if (node0 == null) { - return this; - } - if (node0 == this) { - throw new IllegalArgumentException(); - } - DefaultAnyValue node = (DefaultAnyValue) node0; - if (node.stringEntrys != null) { - for (Entry en : node.stringEntrys) { - if (en == null) { - continue; - } - setValue(en.name, en.value); - } - } - if (node.anyEntrys != null) { - for (Entry en : node.anyEntrys) { - if (en == null || en.value == null) { - continue; - } - Entry[] ns = getAnyValueEntrys(en.name); - if (ns == null || ns.length < 1) { - addValue(en.name, en.value); - } else { - boolean ok = false; - for (Entry item : ns) { - if (item == null) { - continue; - } - if (item.value != null && en.value.parentArrayIndex == ((DefaultAnyValue) item.value).parentArrayIndex) { - if (func == null) { - item.value.merge(en.value, func); - ok = true; - break; - } else { - int funcVal = func.apply(path, en.name, en.value, item.value); - if (funcVal == MergeFunction.MERGE) { - String subPath = path.isEmpty() ? en.name : (path + "." + en.name); - ((DefaultAnyValue) item.value).merge(en.value, subPath, func); - ok = true; - break; - } else if (funcVal == MergeFunction.REPLACE) { - item.value = en.value.copy(); - ok = true; - break; - } else if (funcVal == MergeFunction.SKIP) { - ok = true; - break; - } - } - } - } - if (!ok) { - addValue(en.name, en.value); - } - } - } - } - return this; - } - - /** - * 合并两个AnyValue对象, 会去重, 没有的才增加 - * - * @param av AnyValue - * - * @return DefaultAnyValue - */ - public DefaultAnyValue addAllStringSet(final AnyValue av) { - if (av == null) { - return this; - } - final Entry[] strings = av.getStringEntrys(); - if (strings == null) { - return this; - } - for (Entry en : strings) { - if (!existsValue(en.name)) { - this.addValue(en.name, en.value); - } - } - return this; - } - - /** - * 合并两个AnyValue对象 不去重 - * - * @param av AnyValue - * - * @return DefaultAnyValue - */ - public DefaultAnyValue addAll(final AnyValue av) { - if (av == null) { - return this; - } - if (av instanceof DefaultAnyValue) { - final DefaultAnyValue adv = (DefaultAnyValue) av; - if (adv.stringEntrys != null) { - for (Entry en : adv.stringEntrys) { - this.addValue(en.name, en.value); - } - } - if (adv.anyEntrys != null) { - for (Entry en : adv.anyEntrys) { - this.addValue(en.name, en.value); - } - } - } else { - final Entry[] strings = av.getStringEntrys(); - if (strings != null) { - for (Entry en : strings) { - this.addValue(en.name, en.value); - } - } - final Entry[] anys = av.getAnyEntrys(); - if (anys != null) { - for (Entry en : anys) { - this.addValue(en.name, en.value); - } - } - } - return this; - } - - /** - * 合并两个AnyValue对象 会去重 - * - * @param av AnyValue - * - * @return DefaultAnyValue - */ - @ConvertDisabled - public DefaultAnyValue setAll(final AnyValue av) { - if (av == null) { - return this; - } - if (av instanceof DefaultAnyValue) { - final DefaultAnyValue adv = (DefaultAnyValue) av; - if (adv.stringEntrys != null) { - for (Entry en : adv.stringEntrys) { - this.setValue(en.name, en.value); - } - } - if (adv.anyEntrys != null) { - for (Entry en : adv.anyEntrys) { - this.setValue(en.name, en.value); - } - } - } else { - final Entry[] strings = av.getStringEntrys(); - if (strings != null) { - for (Entry en : strings) { - this.setValue(en.name, en.value); - } - } - final Entry[] anys = av.getAnyEntrys(); - if (anys != null) { - for (Entry en : anys) { - this.setValue(en.name, en.value); - } - } - } - return this; - } - - @Override - public void forEach(BiConsumer stringConsumer) { - forEach(stringConsumer, null); - } - - @Override - public void forEach(BiConsumer stringConsumer, BiConsumer anyConsumer) { - if (stringConsumer != null) { - for (Entry en : stringEntrys) { - stringConsumer.accept(en.name, en.value); - } - } - if (anyConsumer != null) { - for (Entry en : (Entry[]) anyEntrys) { - anyConsumer.accept(en.name, en.value); - } - } - } - - @Override - public Entry[] getStringEntrys() { - return stringEntrys; - } - - public void setStringEntrys(Entry[] stringEntrys) { - this.stringEntrys = stringEntrys; - } - - @Override - public Entry[] getAnyEntrys() { - return (Entry[]) (Entry[]) anyEntrys; - } - - public void setAnyEntrys(Entry[] anyEntrys) { - this.anyEntrys = anyEntrys; - } - - public boolean isIgnoreCase() { - return ignoreCase; - } - - public void setIgnoreCase(boolean ignoreCase) { - this.ignoreCase = ignoreCase; - if (this.predicate == null) { - this.predicate = ignoreCase ? EQUALS_IGNORE : EQUALS_PREDICATE; - } - } - - @Override - @ConvertDisabled - public String[] getNames() { - Set set = new LinkedHashSet<>(); - for (Entry en : this.stringEntrys) { - set.add(en.name); - } - for (Entry en : this.anyEntrys) { - set.add(en.name); - } - return set.toArray(new String[set.size()]); - } - - @Override - public String[] getValues(String... names) { - return Entry.getStringArray(this.predicate, this.stringEntrys, names); - } - - @Override - public AnyValue[] getAnyValues(String... names) { - return Entry.getAnyValueArray(this.predicate, this.anyEntrys, names); - } - - @Override - public String[] getValues(String name) { - return Entry.getStringArray(this.predicate, this.stringEntrys, name); - } - - @Override - public AnyValue[] getAnyValues(String name) { - return Entry.getAnyValueArray(this.predicate, this.anyEntrys, name); - } - - protected Entry[] getAnyValueEntrys(String name) { - return Entry.getEntryAnyValueArray(this.predicate, this.anyEntrys, name); - } - - @Override - public String toString() { - return toString(0, (any, space) -> { - int index = ((DefaultAnyValue) any).parentArrayIndex; - if (index < 0) { - return null; - } - return new StringBuilder().append(space).append(" '$index': ").append(index).append(",\r\n"); - }); - } - - public DefaultAnyValue clear() { - if (this.stringEntrys != null && this.stringEntrys.length > 0) { - this.stringEntrys = new Entry[0]; - } - if (this.anyEntrys != null && this.anyEntrys.length > 0) { - this.anyEntrys = new Entry[0]; - } - return this; - } - - public DefaultAnyValue setValue(String name, String value) { - Objects.requireNonNull(name); - if (!existsValue(name)) { - this.addValue(name, value); - } else { - for (Entry en : this.stringEntrys) { - if (predicate.test(en.name, name)) { - en.value = value; - return this; - } - } - } - return this; - } - - public DefaultAnyValue setValue(String name, AnyValue value) { - Objects.requireNonNull(name); - if (!existsValue(name)) { - this.addValue(name, value); - } else { - for (Entry en : this.anyEntrys) { - if (predicate.test(en.name, name)) { - en.value = (DefaultAnyValue) value; - return this; - } - } - } - return this; - } - - public DefaultAnyValue put(String name, boolean value) { - return addValue(name, String.valueOf(value)); - } - - public DefaultAnyValue put(String name, Number value) { - return addValue(name, String.valueOf(value)); - } - - public DefaultAnyValue put(String name, String value) { - this.stringEntrys = Utility.append(this.stringEntrys, new Entry(name, value)); - return this; - } - - public DefaultAnyValue addValue(String name, boolean value) { - return addValue(name, String.valueOf(value)); - } - - public DefaultAnyValue addValue(String name, Number value) { - return addValue(name, String.valueOf(value)); - } - - public DefaultAnyValue addValue(String name, String value) { - Objects.requireNonNull(name); - this.stringEntrys = Utility.append(this.stringEntrys, new Entry(name, value)); - return this; - } - - public DefaultAnyValue addValue(String name, AnyValue value) { - Objects.requireNonNull(name); - this.anyEntrys = Utility.append(this.anyEntrys, new Entry(name, value)); - return this; - } - - public void clearParentArrayIndex(String name) { - for (Entry item : getAnyValueEntrys(name)) { - if (item.value != null) { - ((DefaultAnyValue) item.value).parentArrayIndex = -1; - } - } - } - - public DefaultAnyValue removeAnyValues(String name) { - Objects.requireNonNull(name); - if (this.anyEntrys == null) { - return this; - } - this.anyEntrys = Utility.remove(this.anyEntrys, t -> name.equals(((Entry) t).name)); - return this; - } - - public DefaultAnyValue removeValue(String name, AnyValue value) { - Objects.requireNonNull(name); - if (value == null || this.anyEntrys == null) { - return this; - } - this.anyEntrys = Utility.remove(this.anyEntrys, t -> name.equals(((Entry) t).name) && ((Entry) t).getValue().equals(value)); - return this; - } - - public DefaultAnyValue removeStringValues(String name) { - Objects.requireNonNull(name); - if (this.stringEntrys == null) { - return this; - } - this.stringEntrys = Utility.remove(this.stringEntrys, t -> name.equals(((Entry) t).name)); - return this; - } - - public DefaultAnyValue removeValue(String name, String value) { - Objects.requireNonNull(name); - if (value == null || this.stringEntrys == null) { - return this; - } - this.stringEntrys = Utility.remove(this.stringEntrys, t -> name.equals(((Entry) t).name) && ((Entry) t).getValue().equals(value)); - return this; - } - - @Override - public AnyValue getAnyValue(String name) { - return getAnyValue(name, false); - } - - @Override - public AnyValue getAnyValue(String name, boolean create) { - for (Entry en : this.anyEntrys) { - if (predicate.test(en.name, name)) { - return en.value; - } - } - return create ? new DefaultAnyValue() : null; - } - - @Override - public String get(String name) { - return getValue(name); - } - - @Override - public String getValue(String name) { - for (Entry en : this.stringEntrys) { - if (predicate.test(en.name, name)) { - return en.value; - } - } - return null; - } - - public boolean existsValue(String name) { - for (Entry en : this.stringEntrys) { - if (predicate.test(en.name, name)) { - return true; - } - } - return false; - } } +// /** * 字段名和值的组合对象 @@ -685,7 +100,7 @@ public abstract class AnyValue { return value; } - static Entry[] getEntryAnyValueArray(BiPredicate comparison, Entry[] entitys, String name) { + static Entry[] getEntryAnyValueArray(BiPredicate comparison, Entry[] entitys, String name) { int len = 0; for (Entry en : entitys) { if (comparison.test(en.name, name)) { @@ -697,7 +112,7 @@ public abstract class AnyValue { } Entry[] rs = new Entry[len]; int i = 0; - for (Entry en : entitys) { + for (Entry en : entitys) { if (comparison.test(en.name, name)) { rs[i++] = en; } @@ -725,7 +140,7 @@ public abstract class AnyValue { return rs; } - static AnyValue[] getAnyValueArray(BiPredicate comparison, Entry[] entitys, String name) { + static AnyValue[] getAnyValueArray(BiPredicate comparison, Entry[] entitys, String name) { int len = 0; for (Entry en : entitys) { if (comparison.test(en.name, name)) { @@ -737,7 +152,7 @@ public abstract class AnyValue { } AnyValue[] rs = new AnyValue[len]; int i = 0; - for (Entry en : entitys) { + for (Entry en : entitys) { if (comparison.test(en.name, name)) { rs[i++] = en.value; } @@ -771,7 +186,7 @@ public abstract class AnyValue { return rs; } - static AnyValue[] getAnyValueArray(BiPredicate comparison, Entry[] entitys, String... names) { + static AnyValue[] getAnyValueArray(BiPredicate comparison, Entry[] entitys, String... names) { int len = 0; for (Entry en : entitys) { for (String name : names) { @@ -786,7 +201,7 @@ public abstract class AnyValue { } AnyValue[] rs = new AnyValue[len]; int i = 0; - for (Entry en : entitys) { + for (Entry en : entitys) { for (String name : names) { if (comparison.test(en.name, name)) { rs[i++] = en.value; @@ -799,12 +214,12 @@ public abstract class AnyValue { } /** - * 创建DefaultAnyValue + * 创建AnyValueWriter * - * @return DefaultAnyValue + * @return AnyValueWriter */ - public static DefaultAnyValue create() { - return new DefaultAnyValue(); + public static AnyValueWriter create() { + return new AnyValueWriter(); } /** @@ -900,9 +315,9 @@ public abstract class AnyValue { if (properties == null) { return null; } - DefaultAnyValue conf = new DefaultAnyValue(); + AnyValueWriter conf = new AnyValueWriter(); final char splitChar = (char) 2; - Map prefixArray = new TreeMap<>(); //已处理的数组key,如 redkale.source[0].xx 存redkale.source[0] + Map prefixArray = new TreeMap<>(); //已处理的数组key,如:redkale.source[0].xx存redkale.source[0] properties.forEach((key, value) -> { StringBuilder temp = new StringBuilder(); boolean flag = false; @@ -921,15 +336,15 @@ public abstract class AnyValue { for (int i = 0; i < keys.length; i++) { keys[i] = keys[i].replace(splitChar, '.'); } - DefaultAnyValue parent = conf; + AnyValueWriter parent = conf; if (keys.length > 1) { for (int i = 0; i < keys.length - 1; i++) { String item = keys[i]; int pos = item.indexOf('['); if (pos < 0) { - DefaultAnyValue child = (DefaultAnyValue) parent.getAnyValue(item); + AnyValueWriter child = (AnyValueWriter) parent.getAnyValue(item); if (child == null) { - child = new DefaultAnyValue(); + child = new AnyValueWriter(); parent.addValue(item, child); } parent = child; @@ -948,12 +363,12 @@ public abstract class AnyValue { for (int j = 0; j < i; j++) { prefixKey += keys[j] + "."; } - DefaultAnyValue array = prefixArray.get(prefixKey + item); //item: [1] + AnyValueWriter array = prefixArray.get(prefixKey + item); //item: [1] if (array == null) { final int ii = i; String findkey = prefixKey + itemField + "["; - Map keymap = new TreeMap<>(); - Map sortmap = new TreeMap<>(); + Map keymap = new TreeMap<>(); + Map sortmap = new TreeMap<>(); properties.keySet().stream().filter(x -> x.toString().startsWith(findkey)).forEach(k -> { String[] ks = k.toString().split("\\."); String prefixKey2 = ""; @@ -962,7 +377,7 @@ public abstract class AnyValue { } prefixKey2 += ks[ii]; if (!keymap.containsKey(prefixKey2)) { - DefaultAnyValue vv = new DefaultAnyValue(); + AnyValueWriter vv = new AnyValueWriter(); keymap.put(prefixKey2, vv); int aindex = Integer.parseInt(ks[ii].substring(ks[ii].indexOf('[') + 1, ks[ii].lastIndexOf(']'))); vv.parentArrayIndex = aindex; @@ -970,20 +385,20 @@ public abstract class AnyValue { } }); prefixArray.putAll(keymap); - DefaultAnyValue pv = parent; + AnyValueWriter pv = parent; sortmap.values().forEach(v -> pv.addValue(itemField, v)); array = prefixArray.get(prefixKey + item); } parent = array; } else { //Map结构 - DefaultAnyValue field = (DefaultAnyValue) parent.getAnyValue(itemField); + AnyValueWriter field = (AnyValueWriter) parent.getAnyValue(itemField); if (field == null) { - field = new DefaultAnyValue(); + field = new AnyValueWriter(); parent.addValue(itemField, field); } - DefaultAnyValue index = (DefaultAnyValue) field.getAnyValue(keyOrIndex); + AnyValueWriter index = (AnyValueWriter) field.getAnyValue(keyOrIndex); if (index == null) { - index = new DefaultAnyValue(); + index = new AnyValueWriter(); if (nameName != null) { index.setValue(nameName, keyOrIndex); } @@ -1027,13 +442,13 @@ public abstract class AnyValue { sortmap.put(Integer.parseInt(ks[ii].substring(ks[ii].indexOf('[') + 1, ks[ii].lastIndexOf(']'))), vv); } }); - DefaultAnyValue pv = parent; + AnyValueWriter pv = parent; sortmap.values().forEach(v -> pv.addValue(itemField, v)); } } else { //Map - DefaultAnyValue child = (DefaultAnyValue) parent.getAnyValue(itemField); + AnyValueWriter child = (AnyValueWriter) parent.getAnyValue(itemField); if (child == null) { - child = new DefaultAnyValue(); + child = new AnyValueWriter(); parent.addValue(itemField, child); } child.addValue(itemIndex, value.toString()); @@ -1088,7 +503,7 @@ public abstract class AnyValue { * @return AnyValue * @throws IOException 异常 */ - public static AnyValue loadFromXml(String text, BiFunction attrFunc) throws IOException { + public static AnyValue loadFromXml(String text, BinaryOperator attrFunc) throws IOException { return new XmlReader(text).attrFunc(attrFunc).read(); } @@ -1101,7 +516,7 @@ public abstract class AnyValue { * @return AnyValue * @throws IOException 异常 */ - public static AnyValue loadFromXml(InputStream in, BiFunction attrFunc) throws IOException { + public static AnyValue loadFromXml(InputStream in, BinaryOperator attrFunc) throws IOException { return loadFromXml(in, StandardCharsets.UTF_8, attrFunc); } @@ -1115,7 +530,7 @@ public abstract class AnyValue { * @return AnyValue * @throws IOException 异常 */ - public static AnyValue loadFromXml(InputStream in, Charset charset, BiFunction attrFunc) throws IOException { + public static AnyValue loadFromXml(InputStream in, Charset charset, BinaryOperator attrFunc) throws IOException { return new XmlReader(Utility.read(in, charset)).attrFunc(attrFunc).read(); } @@ -1282,7 +697,7 @@ public abstract class AnyValue { /** * 根据字段名获取AnyValue类型的字段值 * - * @param name 字段名 + * @param name 字段名 * @param create 没有是否创建一个新的对象返回 * * @return AnyValue diff --git a/src/main/java/org/redkale/util/AnyValueWriter.java b/src/main/java/org/redkale/util/AnyValueWriter.java new file mode 100644 index 000000000..34a648820 --- /dev/null +++ b/src/main/java/org/redkale/util/AnyValueWriter.java @@ -0,0 +1,604 @@ +/* + * + */ +package org.redkale.util; + +import java.util.LinkedHashSet; +import java.util.Objects; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.BiPredicate; +import org.redkale.convert.ConvertColumn; +import org.redkale.convert.ConvertDisabled; + +/** + * AnyValue的可写版 + * + *

+ * 详情见: https://redkale.org + * + * @author zhangjx + */ +@SuppressWarnings("unchecked") +public class AnyValueWriter extends AnyValue { + + /** + * 区分name大小写的比较策略 + * + */ + public static final BiPredicate EQUALS_PREDICATE = (name1, name2) -> name1.equals(name2); + + /** + * 不区分name大小写的比较策略 + */ + public static final BiPredicate EQUALS_IGNORE = (name1, name2) -> name1.equalsIgnoreCase(name2); + + @ConvertColumn(index = 1) + private boolean ignoreCase; + + private BiPredicate predicate; + + @ConvertColumn(index = 2) + private Entry[] stringEntrys = new Entry[0]; + + @ConvertColumn(index = 3) + private Entry[] anyEntrys = new Entry[0]; + + int parentArrayIndex = -1; //只可能被loadFromProperties方法赋值 + + /** + * 创建含name-value值的AnyValueWriter + * + * @param name name + * @param value value值 + * + * @return AnyValueWriter + */ + public static final AnyValueWriter create(String name, Number value) { + AnyValueWriter conf = new AnyValueWriter(); + conf.addValue(name, value); + return conf; + } + + /** + * 创建含name-value值的AnyValueWriter对象 + * + * @param name name + * @param value value值 + * + * @return AnyValueWriter对象 + */ + public static final AnyValueWriter create(String name, String value) { + AnyValueWriter conf = new AnyValueWriter(); + conf.addValue(name, value); + return conf; + } + + /** + * 创建含name-value值的AnyValueWriter对象 + * + * @param name name + * @param value value值 + * + * @return AnyValueWriter对象 + */ + public static final AnyValueWriter create(String name, AnyValue value) { + AnyValueWriter conf = new AnyValueWriter(); + conf.addValue(name, value); + return conf; + } + + /** + * 创建一个区分大小写比较策略的AnyValueWriter对象 + * + */ + public AnyValueWriter() { + this(false); + } + + /** + * 创建AnyValueWriter对象 + * + * @param ignoreCase name是否不区分大小写 + */ + public AnyValueWriter(boolean ignoreCase) { + this.ignoreCase = ignoreCase; + this.predicate = ignoreCase ? EQUALS_IGNORE : EQUALS_PREDICATE; + } + + /** + * 创建共享此内容的AnyValueWriter对象 + * + * @return AnyValueWriter对象 + */ + public AnyValueWriter duplicate() { + AnyValueWriter rs = new AnyValueWriter(this.ignoreCase); + rs.stringEntrys = this.stringEntrys; + rs.anyEntrys = this.anyEntrys; + return rs; + } + + /** + * 复制一份对象 + * + * @return AnyValueWriter对象 + */ + @Override + public AnyValueWriter copy() { + AnyValueWriter rs = new AnyValueWriter(this.ignoreCase); + rs.predicate = this.predicate; + rs.parentArrayIndex = this.parentArrayIndex; + if (this.stringEntrys != null) { + rs.stringEntrys = new Entry[this.stringEntrys.length]; + for (int i = 0; i < rs.stringEntrys.length; i++) { + Entry en = this.stringEntrys[i]; + if (en == null) { + continue; + } + rs.stringEntrys[i] = new Entry(en.name, en.value); + } + } + if (this.anyEntrys != null) { + rs.anyEntrys = new Entry[this.anyEntrys.length]; + for (int i = 0; i < rs.anyEntrys.length; i++) { + Entry en = this.anyEntrys[i]; + if (en == null) { + continue; + } + rs.anyEntrys[i] = new Entry(en.name, en.value == null ? null : en.value.copy()); + } + } + return rs; + } + + /** + * 将另一个对象替换本对象 + * + * @param node 替换的对象 + * + * @return AnyValue + */ + @Override + public AnyValueWriter replace(AnyValue node) { + if (node != null) { + AnyValueWriter rs = (AnyValueWriter) node; + this.ignoreCase = rs.ignoreCase; + this.predicate = rs.predicate; + this.parentArrayIndex = rs.parentArrayIndex; + this.stringEntrys = rs.stringEntrys; + this.anyEntrys = rs.anyEntrys; + } + return this; + } + + /** + * 将另一个对象合并过来 + * + * @param node 代合并对象 + * @param func 判断覆盖方式的函数 + * + * @return AnyValue + */ + @Override + public AnyValueWriter merge(AnyValue node, MergeFunction func) { + return merge(node, "", func); + } + + protected AnyValueWriter merge(AnyValue node0, String path, MergeFunction func) { + if (node0 == null) { + return this; + } + if (node0 == this) { + throw new IllegalArgumentException(); + } + AnyValueWriter node = (AnyValueWriter) node0; + if (node.stringEntrys != null) { + for (Entry en : node.stringEntrys) { + if (en == null) { + continue; + } + setValue(en.name, en.value); + } + } + if (node.anyEntrys != null) { + for (Entry en : node.anyEntrys) { + if (en == null || en.value == null) { + continue; + } + Entry[] ns = getAnyValueEntrys(en.name); + if (ns == null || ns.length < 1) { + addValue(en.name, en.value); + } else { + boolean ok = false; + for (Entry item : ns) { + if (item == null) { + continue; + } + if (item.value != null && en.value.parentArrayIndex == ((AnyValueWriter) item.value).parentArrayIndex) { + if (func == null) { + item.value.merge(en.value, func); + ok = true; + break; + } else { + int funcVal = func.apply(path, en.name, en.value, item.value); + if (funcVal == MergeFunction.MERGE) { + String subPath = path.isEmpty() ? en.name : (path + "." + en.name); + ((AnyValueWriter) item.value).merge(en.value, subPath, func); + ok = true; + break; + } else if (funcVal == MergeFunction.REPLACE) { + item.value = en.value.copy(); + ok = true; + break; + } else if (funcVal == MergeFunction.SKIP) { + ok = true; + break; + } + } + } + } + if (!ok) { + addValue(en.name, en.value); + } + } + } + } + return this; + } + + /** + * 合并两个AnyValue对象, 会去重, 没有的才增加 + * + * @param av AnyValue + * + * @return AnyValueWriter + */ + public AnyValueWriter addAllStringSet(final AnyValue av) { + if (av == null) { + return this; + } + final Entry[] strings = av.getStringEntrys(); + if (strings == null) { + return this; + } + for (Entry en : strings) { + if (!existsValue(en.name)) { + this.addValue(en.name, en.value); + } + } + return this; + } + + /** + * 合并两个AnyValue对象 不去重 + * + * @param av AnyValue + * + * @return AnyValueWriter + */ + public AnyValueWriter addAll(final AnyValue av) { + if (av == null) { + return this; + } + if (av instanceof AnyValueWriter) { + final AnyValueWriter adv = (AnyValueWriter) av; + if (adv.stringEntrys != null) { + for (Entry en : adv.stringEntrys) { + this.addValue(en.name, en.value); + } + } + if (adv.anyEntrys != null) { + for (Entry en : adv.anyEntrys) { + this.addValue(en.name, en.value); + } + } + } else { + final Entry[] strings = av.getStringEntrys(); + if (strings != null) { + for (Entry en : strings) { + this.addValue(en.name, en.value); + } + } + final Entry[] anys = av.getAnyEntrys(); + if (anys != null) { + for (Entry en : anys) { + this.addValue(en.name, en.value); + } + } + } + return this; + } + + /** + * 合并两个AnyValue对象 会去重 + * + * @param av AnyValue + * + * @return AnyValueWriter + */ + @ConvertDisabled + public AnyValueWriter setAll(final AnyValue av) { + if (av == null) { + return this; + } + if (av instanceof AnyValueWriter) { + final AnyValueWriter adv = (AnyValueWriter) av; + if (adv.stringEntrys != null) { + for (Entry en : adv.stringEntrys) { + this.setValue(en.name, en.value); + } + } + if (adv.anyEntrys != null) { + for (Entry en : adv.anyEntrys) { + this.setValue(en.name, en.value); + } + } + } else { + final Entry[] strings = av.getStringEntrys(); + if (strings != null) { + for (Entry en : strings) { + this.setValue(en.name, en.value); + } + } + final Entry[] anys = av.getAnyEntrys(); + if (anys != null) { + for (Entry en : anys) { + this.setValue(en.name, en.value); + } + } + } + return this; + } + + @Override + public void forEach(BiConsumer stringConsumer) { + forEach(stringConsumer, null); + } + + @Override + public void forEach(BiConsumer stringConsumer, BiConsumer anyConsumer) { + if (stringConsumer != null) { + for (Entry en : stringEntrys) { + stringConsumer.accept(en.name, en.value); + } + } + if (anyConsumer != null) { + for (Entry en : (Entry[]) anyEntrys) { + anyConsumer.accept(en.name, en.value); + } + } + } + + @Override + public Entry[] getStringEntrys() { + return stringEntrys; + } + + public void setStringEntrys(Entry[] stringEntrys) { + this.stringEntrys = stringEntrys; + } + + @Override + public Entry[] getAnyEntrys() { + return (Entry[]) (Entry[]) anyEntrys; + } + + public void setAnyEntrys(Entry[] anyEntrys) { + this.anyEntrys = anyEntrys; + } + + public boolean isIgnoreCase() { + return ignoreCase; + } + + public void setIgnoreCase(boolean ignoreCase) { + this.ignoreCase = ignoreCase; + if (this.predicate == null) { + this.predicate = ignoreCase ? EQUALS_IGNORE : EQUALS_PREDICATE; + } + } + + @Override + @ConvertDisabled + public String[] getNames() { + Set set = new LinkedHashSet<>(); + for (Entry en : this.stringEntrys) { + set.add(en.name); + } + for (Entry en : this.anyEntrys) { + set.add(en.name); + } + return set.toArray(new String[set.size()]); + } + + @Override + public String[] getValues(String... names) { + return Entry.getStringArray(this.predicate, this.stringEntrys, names); + } + + @Override + public AnyValue[] getAnyValues(String... names) { + return Entry.getAnyValueArray(this.predicate, this.anyEntrys, names); + } + + @Override + public String[] getValues(String name) { + return Entry.getStringArray(this.predicate, this.stringEntrys, name); + } + + @Override + public AnyValue[] getAnyValues(String name) { + return Entry.getAnyValueArray(this.predicate, this.anyEntrys, name); + } + + protected Entry[] getAnyValueEntrys(String name) { + return Entry.getEntryAnyValueArray(this.predicate, this.anyEntrys, name); + } + + @Override + public String toString() { + return toString(0, (any, space) -> { + int index = ((AnyValueWriter) any).parentArrayIndex; + if (index < 0) { + return null; //不能用"null" + } + return new StringBuilder().append(space).append(" '$index': ").append(index).append(",\r\n"); + }); + } + + public AnyValueWriter clear() { + if (this.stringEntrys != null && this.stringEntrys.length > 0) { + this.stringEntrys = new Entry[0]; + } + if (this.anyEntrys != null && this.anyEntrys.length > 0) { + this.anyEntrys = new Entry[0]; + } + return this; + } + + public AnyValueWriter setValue(String name, String value) { + Objects.requireNonNull(name); + if (!existsValue(name)) { + this.addValue(name, value); + } else { + for (Entry en : this.stringEntrys) { + if (predicate.test(en.name, name)) { + en.value = value; + return this; + } + } + } + return this; + } + + public AnyValueWriter setValue(String name, AnyValue value) { + Objects.requireNonNull(name); + if (!existsValue(name)) { + this.addValue(name, value); + } else { + for (Entry en : this.anyEntrys) { + if (predicate.test(en.name, name)) { + en.value = (AnyValueWriter) value; + return this; + } + } + } + return this; + } + + public AnyValueWriter put(String name, boolean value) { + return addValue(name, String.valueOf(value)); + } + + public AnyValueWriter put(String name, Number value) { + return addValue(name, String.valueOf(value)); + } + + public AnyValueWriter put(String name, String value) { + this.stringEntrys = Utility.append(this.stringEntrys, new Entry(name, value)); + return this; + } + + public AnyValueWriter addValue(String name, boolean value) { + return addValue(name, String.valueOf(value)); + } + + public AnyValueWriter addValue(String name, Number value) { + return addValue(name, String.valueOf(value)); + } + + public AnyValueWriter addValue(String name, String value) { + Objects.requireNonNull(name); + this.stringEntrys = Utility.append(this.stringEntrys, new Entry(name, value)); + return this; + } + + public AnyValueWriter addValue(String name, AnyValue value) { + Objects.requireNonNull(name); + this.anyEntrys = Utility.append(this.anyEntrys, new Entry(name, value)); + return this; + } + + public void clearParentArrayIndex(String name) { + for (Entry item : getAnyValueEntrys(name)) { + if (item.value != null) { + ((AnyValueWriter) item.value).parentArrayIndex = -1; + } + } + } + + public AnyValueWriter removeAnyValues(String name) { + Objects.requireNonNull(name); + if (this.anyEntrys == null) { + return this; + } + this.anyEntrys = Utility.remove(this.anyEntrys, t -> name.equals(((Entry) t).name)); + return this; + } + + public AnyValueWriter removeValue(String name, AnyValue value) { + Objects.requireNonNull(name); + if (value == null || this.anyEntrys == null) { + return this; + } + this.anyEntrys = Utility.remove(this.anyEntrys, t -> name.equals(((Entry) t).name) && ((Entry) t).getValue().equals(value)); + return this; + } + + public AnyValueWriter removeStringValues(String name) { + Objects.requireNonNull(name); + if (this.stringEntrys == null) { + return this; + } + this.stringEntrys = Utility.remove(this.stringEntrys, t -> name.equals(((Entry) t).name)); + return this; + } + + public AnyValueWriter removeValue(String name, String value) { + Objects.requireNonNull(name); + if (value == null || this.stringEntrys == null) { + return this; + } + this.stringEntrys = Utility.remove(this.stringEntrys, t -> name.equals(((Entry) t).name) && ((Entry) t).getValue().equals(value)); + return this; + } + + @Override + public AnyValue getAnyValue(String name) { + return getAnyValue(name, false); + } + + @Override + public AnyValue getAnyValue(String name, boolean create) { + for (Entry en : this.anyEntrys) { + if (predicate.test(en.name, name)) { + return en.value; + } + } + return create ? new AnyValueWriter() : null; + } + + @Override + public String get(String name) { + return getValue(name); + } + + @Override + public String getValue(String name) { + for (Entry en : this.stringEntrys) { + if (predicate.test(en.name, name)) { + return en.value; + } + } + return null; + } + + public boolean existsValue(String name) { + for (Entry en : this.stringEntrys) { + if (predicate.test(en.name, name)) { + return true; + } + } + return false; + } +} diff --git a/src/main/java/org/redkale/util/Environment.java b/src/main/java/org/redkale/util/Environment.java index 1d0755b16..94f1306f8 100644 --- a/src/main/java/org/redkale/util/Environment.java +++ b/src/main/java/org/redkale/util/Environment.java @@ -35,30 +35,82 @@ public class Environment implements java.io.Serializable { return properties.containsKey(key); } - public String getProperty(String key) { - return properties.getProperty(key); - } - - public String getProperty(String key, String defaultValue) { - return properties.getProperty(key, defaultValue); - } - public void forEach(BiConsumer action) { properties.forEach((BiConsumer) action); } public void forEach(Predicate predicate, BiConsumer action) { properties.entrySet().stream().filter(en -> predicate.test(en.getKey().toString())) - .forEach(en -> action.accept(en.getKey().toString(), en.getValue() == null ? null : en.getValue().toString())); + .forEach(en -> action.accept(en.getKey().toString(), String.valueOf(en.getValue()))); + } + + public String getProperty(String name) { + return getProperty(name, null); + } + + public String getProperty(String name, String defaultValue) { + return getPropertyValue(getRawProperty(name, defaultValue)); + } + + public String getPropertyValue(String val, Properties... envs) { + if (val == null || val.isBlank()) { + return val; + } + //${domain}/${path}/xxx ${aa${bbb}} + int pos2 = val.indexOf("}"); + int pos1 = val.lastIndexOf("${", pos2); + if (pos1 >= 0 && pos2 > 0) { + String key = val.substring(pos1 + 2, pos2); + String subVal = properties.getProperty(key); + if (subVal != null) { + String newVal = getPropertyValue(subVal, envs); + return getPropertyValue(val.substring(0, pos1) + newVal + val.substring(pos2 + 1)); + } else { + for (Properties prop : envs) { + subVal = prop.getProperty(key); + if (subVal != null) { + String newVal = getPropertyValue(subVal, envs); + return getPropertyValue(val.substring(0, pos1) + newVal + val.substring(pos2 + 1)); + } + } + throw new RedkaleException("Not found '" + key + "' value"); + } + + } else if ((pos1 >= 0 && pos2 < 0) || (pos1 < 0 && pos2 >= 0)) { + throw new RedkaleException(val + " is illegal naming"); + } + return val; + } + + public AnyValue getAnyValue(String name, boolean autoCreated) { + Properties props = new Properties(); + String prefix = name + "."; + properties.forEach((k, v) -> { + if (k.toString().equals(name) || k.toString().startsWith(prefix)) { + props.put(k, getProperty(k.toString())); + } + }); + if (props.isEmpty()) { + return autoCreated ? AnyValueWriter.create() : null; + } + return AnyValueWriter.loadFromProperties(props); + } + + public String getRawProperty(String key) { + return getRawProperty(key, null); + } + + public String getRawProperty(String key, String defaultValue) { + return properties.getProperty(key, defaultValue); } public boolean getBooleanProperty(String key) { - String val = properties.getProperty(key); + String val = getProperty(key); return "true".equalsIgnoreCase(val) || "1".equalsIgnoreCase(val); } public boolean getBooleanProperty(String key, boolean defaultValue) { - String val = properties.getProperty(key); + String val = getProperty(key); if (val == null || val.isEmpty()) { return defaultValue; } @@ -66,11 +118,11 @@ public class Environment implements java.io.Serializable { } public short getShortProperty(String key) { - return Short.parseShort(properties.getProperty(key)); + return Short.parseShort(getProperty(key)); } public short getShortProperty(String key, short defaultValue) { - String val = properties.getProperty(key); + String val = getProperty(key); if (val == null || val.isEmpty()) { return defaultValue; } @@ -82,11 +134,11 @@ public class Environment implements java.io.Serializable { } public int getIntProperty(String key) { - return Integer.parseInt(properties.getProperty(key)); + return Integer.parseInt(getProperty(key)); } public int getIntProperty(String key, int defaultValue) { - String val = properties.getProperty(key); + String val = getProperty(key); if (val == null || val.isEmpty()) { return defaultValue; } @@ -98,11 +150,11 @@ public class Environment implements java.io.Serializable { } public float getFloatProperty(String key) { - return Float.parseFloat(properties.getProperty(key)); + return Float.parseFloat(getProperty(key)); } public float getFloatProperty(String key, float defaultValue) { - String val = properties.getProperty(key); + String val = getProperty(key); if (val == null || val.isEmpty()) { return defaultValue; } @@ -114,11 +166,11 @@ public class Environment implements java.io.Serializable { } public long getLongProperty(String key) { - return Long.parseLong(properties.getProperty(key)); + return Long.parseLong(getProperty(key)); } public long getLongProperty(String key, long defaultValue) { - String val = properties.getProperty(key); + String val = getProperty(key); if (val == null || val.isEmpty()) { return defaultValue; } @@ -130,11 +182,11 @@ public class Environment implements java.io.Serializable { } public double getDoubleProperty(String key) { - return Double.parseDouble(properties.getProperty(key)); + return Double.parseDouble(getProperty(key)); } public double getDoubleProperty(String key, double defaultValue) { - String val = properties.getProperty(key); + String val = getProperty(key); if (val == null || val.isEmpty()) { return defaultValue; } diff --git a/src/main/java/org/redkale/util/Inners.java b/src/main/java/org/redkale/util/Inners.java index 2476da37c..bec79eefa 100644 --- a/src/main/java/org/redkale/util/Inners.java +++ b/src/main/java/org/redkale/util/Inners.java @@ -50,8 +50,8 @@ class Inners { creatorCacheMap.put(CompletableFuture.class, p -> new CompletableFuture<>()); creatorCacheMap.put(CompletionStage.class, p -> new CompletableFuture<>()); creatorCacheMap.put(Future.class, p -> new CompletableFuture<>()); - creatorCacheMap.put(AnyValue.DefaultAnyValue.class, p -> new AnyValue.DefaultAnyValue()); - creatorCacheMap.put(AnyValue.class, p -> new AnyValue.DefaultAnyValue()); + creatorCacheMap.put(AnyValueWriter.class, p -> new AnyValueWriter()); + creatorCacheMap.put(AnyValue.class, p -> new AnyValueWriter()); creatorCacheMap.put(Map.Entry.class, new Creator() { @Override @org.redkale.annotation.ConstructorParameters({"key", "value"}) diff --git a/src/main/java/org/redkale/util/XmlReader.java b/src/main/java/org/redkale/util/XmlReader.java index ed6c3c130..f722ffa76 100644 --- a/src/main/java/org/redkale/util/XmlReader.java +++ b/src/main/java/org/redkale/util/XmlReader.java @@ -8,7 +8,6 @@ package org.redkale.util; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.function.BiFunction; -import org.redkale.util.AnyValue.DefaultAnyValue; /** * 简单的xml读取器, 只读element节点信息,其他信息(如: namespace、comment、docdecl等)都会丢弃 @@ -38,9 +37,9 @@ public class XmlReader { public String tag; - public DefaultAnyValue config; + public AnyValueWriter config; - public TagNode(String tag, DefaultAnyValue node) { + public TagNode(String tag, AnyValueWriter node) { this.tag = tag; this.config = node; } @@ -71,7 +70,7 @@ public class XmlReader { } public AnyValue read() { - DefaultAnyValue root = DefaultAnyValue.create(); + AnyValueWriter root = AnyValueWriter.create(); char ch; lineNumber++; ByteArray array = new ByteArray(128); @@ -172,7 +171,7 @@ public class XmlReader { } //返回是否endtag, 即以 />结尾 - protected boolean readTagAttribute(String tag, DefaultAnyValue config) { + protected boolean readTagAttribute(String tag, AnyValueWriter config) { boolean first = true; boolean endtag = false; boolean endattr = false; @@ -254,7 +253,7 @@ public class XmlReader { return readTagAttribute(tag, config); } - protected void readStartTag(DefaultAnyValue root) { + protected void readStartTag(AnyValueWriter root) { final int start = this.position; boolean hasattr = false; boolean endtag = false; @@ -273,7 +272,7 @@ public class XmlReader { ch = nextChar(); } final String tag = new String(this.text, start, this.position - start).trim(); - DefaultAnyValue config = DefaultAnyValue.create(); + AnyValueWriter config = AnyValueWriter.create(); TagNode tagNode = new TagNode(tag, config); if (tags.isEmpty()) { root.addValue(tag, tagNode.config); @@ -322,7 +321,7 @@ public class XmlReader { } } - protected void readDocdecl(DefaultAnyValue root, ByteArray array) {//读取到 ' + protected void readDocdecl(AnyValueWriter root, ByteArray array) {//读取到 ' if (nextChar() != 'O') { throw newException("expected ' Char*)) ]]>' + protected void readCDSect(AnyValueWriter root, ByteArray array) {//读取到 ' Char*)) ]]>' if (nextChar() != 'C') { throw newException("expected + protected void readXmlDecl(AnyValueWriter root, ByteArray array) {//读取到 char ch; array.clear(); array.putByte('<'); diff --git a/src/test/java/org/redkale/test/http/HttpSimpleClientTest.java b/src/test/java/org/redkale/test/http/HttpSimpleClientTest.java index a902df067..ce8118397 100644 --- a/src/test/java/org/redkale/test/http/HttpSimpleClientTest.java +++ b/src/test/java/org/redkale/test/http/HttpSimpleClientTest.java @@ -12,7 +12,7 @@ import org.redkale.net.AsyncIOGroup; import org.redkale.net.http.HttpServer; import org.redkale.net.http.HttpSimpleClient; import org.redkale.net.http.HttpSimpleRequest; -import org.redkale.util.AnyValue; +import org.redkale.util.AnyValueWriter; import org.redkale.util.ResourceFactory; /** @@ -96,7 +96,7 @@ public class HttpSimpleClientTest { @Override public void run() { try { - AnyValue.DefaultAnyValue conf = new AnyValue.DefaultAnyValue(); + AnyValueWriter conf = new AnyValueWriter(); conf.addValue("host", "0.0.0.0"); conf.addValue("port", "" + port); conf.addValue("protocol", "HTTP"); diff --git a/src/test/java/org/redkale/test/http/RestSleepTest.java b/src/test/java/org/redkale/test/http/RestSleepTest.java index 9bb41e1c2..917927521 100644 --- a/src/test/java/org/redkale/test/http/RestSleepTest.java +++ b/src/test/java/org/redkale/test/http/RestSleepTest.java @@ -43,7 +43,7 @@ public class RestSleepTest { HttpServer server = new HttpServer(application, System.currentTimeMillis(), resFactory); server.getResourceFactory().register(application); System.out.println("servlet = " + server.addRestServlet(null, service, null, HttpServlet.class, "")); - server.init(AnyValue.DefaultAnyValue.create("port", 0)); + server.init(AnyValueWriter.create("port", 0)); server.start(); int port = server.getSocketAddress().getPort(); diff --git a/src/test/java/org/redkale/test/rest/_DynHelloRestServlet1.java b/src/test/java/org/redkale/test/rest/_DynHelloRestServlet1.java index 7286e54c8..f2871b83c 100644 --- a/src/test/java/org/redkale/test/rest/_DynHelloRestServlet1.java +++ b/src/test/java/org/redkale/test/rest/_DynHelloRestServlet1.java @@ -8,7 +8,6 @@ import org.redkale.net.http.*; import org.redkale.service.RetResult; import org.redkale.source.Flipper; import org.redkale.util.*; -import org.redkale.util.AnyValue.DefaultAnyValue; @WebServlet(value = {"/hello/*"}, repair = true) public class _DynHelloRestServlet1 extends SimpleRestServlet { @@ -27,7 +26,7 @@ public class _DynHelloRestServlet1 extends SimpleRestServlet { System.out.println(server.addRestServlet(null, service, null, SimpleRestServlet.class, "/pipes")); System.out.println(server.addRestServlet(null, new HelloService(3), null, SimpleRestServlet.class, "/pipes")); - DefaultAnyValue conf = DefaultAnyValue.create("port", "" + port); + AnyValueWriter conf = AnyValueWriter.create("port", "" + port); server.init(conf); server.start(); Utility.sleep(100); diff --git a/src/test/java/org/redkale/test/service/ABMainService.java b/src/test/java/org/redkale/test/service/ABMainService.java index 36ee06392..a767a97a0 100644 --- a/src/test/java/org/redkale/test/service/ABMainService.java +++ b/src/test/java/org/redkale/test/service/ABMainService.java @@ -23,7 +23,6 @@ import org.redkale.net.http.*; import org.redkale.net.sncp.*; import org.redkale.service.Service; import org.redkale.util.*; -import org.redkale.util.AnyValue.DefaultAnyValue; /** * @@ -58,7 +57,7 @@ public class ABMainService implements Service { cserver.getResourceFactory().register(application); //cserver.getLogger().setLevel(Level.WARNING); cserver.addSncpServlet(cservice); - cserver.init(DefaultAnyValue.create("port", 5577)); + cserver.init(AnyValueWriter.create("port", 5577)); cserver.start(); //------------------------ 初始化 BCService ------------------------------------ @@ -72,7 +71,7 @@ public class ABMainService implements Service { bcserver.getResourceFactory().register(application); //bcserver.getLogger().setLevel(Level.WARNING); bcserver.addSncpServlet(bcservice); - bcserver.init(DefaultAnyValue.create("port", 5588)); + bcserver.init(AnyValueWriter.create("port", 5588)); bcserver.start(); //------------------------ 初始化 ABMainService ------------------------------------ @@ -91,7 +90,7 @@ public class ABMainService implements Service { server.getResourceFactory().register(application); //server.getLogger().setLevel(Level.WARNING); - server.init(DefaultAnyValue.create("port", abport)); + server.init(AnyValueWriter.create("port", abport)); server.addRestServlet(null, service, null, HttpServlet.class, "/pipes"); server.start(); Thread.sleep(100); @@ -140,7 +139,7 @@ public class ABMainService implements Service { server.addRestServlet(null, service, null, HttpServlet.class, "/pipes"); - server.init(DefaultAnyValue.create("port", "" + abport)); + server.init(AnyValueWriter.create("port", "" + abport)); server.start(); Thread.sleep(100); diff --git a/src/test/java/org/redkale/test/service/TestService.java b/src/test/java/org/redkale/test/service/TestService.java index ac689a91d..6304ab88e 100644 --- a/src/test/java/org/redkale/test/service/TestService.java +++ b/src/test/java/org/redkale/test/service/TestService.java @@ -29,6 +29,6 @@ public class TestService implements Service { SncpServer cserver = new SncpServer(); cserver.getResourceFactory().register(application); cserver.addSncpServlet(new TestService()); - cserver.init(AnyValue.DefaultAnyValue.create("port", 5577)); + cserver.init(AnyValueWriter.create("port", 5577)); } } diff --git a/src/test/java/org/redkale/test/sncp/SncpSleepTest.java b/src/test/java/org/redkale/test/sncp/SncpSleepTest.java index e730c6c81..d0aaf4482 100644 --- a/src/test/java/org/redkale/test/sncp/SncpSleepTest.java +++ b/src/test/java/org/redkale/test/sncp/SncpSleepTest.java @@ -45,7 +45,7 @@ public class SncpSleepTest { SncpServer server = new SncpServer(application, System.currentTimeMillis(), null, resFactory); server.getResourceFactory().register(application); server.addSncpServlet(service); - server.init(AnyValue.DefaultAnyValue.create("port", 0)); + server.init(AnyValueWriter.create("port", 0)); server.start(); int port = server.getSocketAddress().getPort(); diff --git a/src/test/java/org/redkale/test/sncp/SncpTest.java b/src/test/java/org/redkale/test/sncp/SncpTest.java index 2511f000b..f575abb5b 100644 --- a/src/test/java/org/redkale/test/sncp/SncpTest.java +++ b/src/test/java/org/redkale/test/sncp/SncpTest.java @@ -167,7 +167,7 @@ public class SncpTest { @Override public void run() { try { - AnyValue.DefaultAnyValue conf = new AnyValue.DefaultAnyValue(); + AnyValueWriter conf = new AnyValueWriter(); conf.addValue("host", "0.0.0.0"); conf.addValue("port", "" + port); conf.addValue("protocol", protocol); @@ -206,7 +206,7 @@ public class SncpTest { @Override public void run() { try { - AnyValue.DefaultAnyValue conf = new AnyValue.DefaultAnyValue(); + AnyValueWriter conf = new AnyValueWriter(); conf.addValue("host", "0.0.0.0"); conf.addValue("port", "" + (port2 < 10 ? 0 : port2)); conf.addValue("protocol", protocol); diff --git a/src/test/java/org/redkale/test/source/JsonRecord.java b/src/test/java/org/redkale/test/source/JsonRecord.java index 87e61404a..6e7e8e06c 100644 --- a/src/test/java/org/redkale/test/source/JsonRecord.java +++ b/src/test/java/org/redkale/test/source/JsonRecord.java @@ -7,12 +7,11 @@ package org.redkale.test.source; import java.io.Serializable; import java.util.*; - import org.redkale.convert.json.JsonConvert; import org.redkale.persistence.Column; import org.redkale.persistence.Id; import org.redkale.source.*; -import org.redkale.util.AnyValue.DefaultAnyValue; +import org.redkale.util.AnyValueWriter; /** * @@ -63,7 +62,7 @@ public class JsonRecord { } public static void main(String[] args) throws Throwable { - DefaultAnyValue conf = DefaultAnyValue.create(); + AnyValueWriter conf = AnyValueWriter.create(); conf.addValue("name", ""); conf.addValue("url", "jdbc:mysql://localhost:3306/center?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true"); conf.addValue("user", "root"); diff --git a/src/test/java/org/redkale/test/util/AnyValuePropertiesTest.java b/src/test/java/org/redkale/test/util/AnyValuePropertiesTest.java index f470fd2fc..10d1604b0 100644 --- a/src/test/java/org/redkale/test/util/AnyValuePropertiesTest.java +++ b/src/test/java/org/redkale/test/util/AnyValuePropertiesTest.java @@ -5,7 +5,7 @@ package org.redkale.test.util; import java.util.Properties; import org.junit.jupiter.api.*; import org.redkale.util.AnyValue; -import org.redkale.util.AnyValue.DefaultAnyValue; +import org.redkale.util.AnyValueWriter; /** * @@ -110,7 +110,7 @@ public class AnyValuePropertiesTest { @Test public void run3() { - DefaultAnyValue conf = AnyValue.create(); + AnyValueWriter conf = AnyValue.create(); conf.addValue("name", "haha"); conf.addValue("value", AnyValue.create().addValue("id", 1234).addValue("key", (String) null).addValue("desc", "nothing !!!")); String json = "{\"name\":\"haha\",\"value\":{\"id\":\"1234\",\"key\":null,\"desc\":\"nothing !!!\"}}"; diff --git a/src/test/java/org/redkale/test/websocket/VideoWebSocketServlet.java b/src/test/java/org/redkale/test/websocket/VideoWebSocketServlet.java index a383f7ae0..bb4270545 100644 --- a/src/test/java/org/redkale/test/websocket/VideoWebSocketServlet.java +++ b/src/test/java/org/redkale/test/websocket/VideoWebSocketServlet.java @@ -5,16 +5,16 @@ */ package org.redkale.test.websocket; -import org.redkale.net.http.WebServlet; -import org.redkale.net.http.WebSocketServlet; -import org.redkale.net.http.HttpRequest; -import org.redkale.net.http.WebSocket; -import org.redkale.net.http.HttpServer; -import org.redkale.util.TypeToken; -import org.redkale.util.AnyValue; import java.io.*; import java.util.*; import java.util.concurrent.*; +import org.redkale.net.http.HttpRequest; +import org.redkale.net.http.HttpServer; +import org.redkale.net.http.WebServlet; +import org.redkale.net.http.WebSocket; +import org.redkale.net.http.WebSocketServlet; +import org.redkale.util.AnyValueWriter; +import org.redkale.util.TypeToken; /** * @@ -108,7 +108,7 @@ public class VideoWebSocketServlet extends WebSocketServlet { public static void main(String[] args) throws Throwable { CountDownLatch cdl = new CountDownLatch(1); - AnyValue.DefaultAnyValue config = AnyValue.create() + AnyValueWriter config = AnyValueWriter.create() .addValue("threads", System.getProperty("threads")) .addValue("bufferPoolSize", System.getProperty("bufferPoolSize")) .addValue("responsePoolSize", System.getProperty("responsePoolSize"))