From 79ee417ae635c6e6a0ac8b7a11c79cbc9c16abb0 Mon Sep 17 00:00:00 2001 From: redkale Date: Fri, 1 Sep 2023 07:38:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96ConvertFactory.features?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/redkale/boot/ApiDocCommand.java | 2 +- .../java/org/redkale/convert/Convert.java | 15 +++- .../org/redkale/convert/ConvertFactory.java | 76 ++++++++++--------- src/main/java/org/redkale/convert/Writer.java | 8 +- .../org/redkale/convert/bson/BsonFactory.java | 33 ++++---- .../org/redkale/convert/bson/BsonWriter.java | 2 +- .../redkale/convert/json/JsonDynEncoder.java | 6 +- .../org/redkale/convert/json/JsonFactory.java | 29 +++++-- .../org/redkale/convert/json/JsonWriter.java | 2 +- src/main/java/org/redkale/net/http/Rest.java | 4 +- .../redkale/test/convert/GenericEntity.java | 7 +- .../org/redkale/test/convert/Json5Test.java | 4 +- .../redkale/test/convert/JsonMainTest.java | 4 +- .../org/redkale/test/convert/TinyTest.java | 6 +- 14 files changed, 114 insertions(+), 84 deletions(-) diff --git a/src/main/java/org/redkale/boot/ApiDocCommand.java b/src/main/java/org/redkale/boot/ApiDocCommand.java index ab0e01a2d..549f0ba41 100644 --- a/src/main/java/org/redkale/boot/ApiDocCommand.java +++ b/src/main/java/org/redkale/boot/ApiDocCommand.java @@ -762,6 +762,6 @@ public final class ApiDocCommand { return example; } - private static final JsonFactory exampleFactory = JsonFactory.create().features(0); + private static final JsonFactory exampleFactory = JsonFactory.create().withFeatures(0); } diff --git a/src/main/java/org/redkale/convert/Convert.java b/src/main/java/org/redkale/convert/Convert.java index caec50d66..74d8a3705 100644 --- a/src/main/java/org/redkale/convert/Convert.java +++ b/src/main/java/org/redkale/convert/Convert.java @@ -22,10 +22,17 @@ import org.redkale.util.*; */ public abstract class Convert { - protected final ConvertFactory factory; + //值为true时 String类型值为"",Boolean类型值为false时不会输出,默认为false + public static final int FEATURE_TINY = 1 << 1; + //值为true时 字段值为null时会输出,默认为false + public static final int FEATURE_NULLABLE = 1 << 2; + + //配置属性集合, 1<<1至1<<10为系统内置 protected final int features; + protected final ConvertFactory factory; + protected Convert(ConvertFactory factory, int features) { this.factory = factory; this.features = features; @@ -39,7 +46,8 @@ public abstract class Convert { return writer; } - protected S fieldFunc(S writer, BiFunction objFieldFunc, BiFunction mapFieldFunc, Function objExtFunc) { + protected S fieldFunc(S writer, BiFunction objFieldFunc, + BiFunction mapFieldFunc, Function objExtFunc) { writer.mapFieldFunc = mapFieldFunc; writer.objFieldFunc = objFieldFunc; writer.objExtFunc = objExtFunc; @@ -58,7 +66,8 @@ public abstract class Convert { return newConvert(objFieldFunc, null, objExtFunc); } - public abstract Convert newConvert(BiFunction objFieldFunc, BiFunction mapFieldFunc, Function objExtFunc); + public abstract Convert newConvert(BiFunction objFieldFunc, + BiFunction mapFieldFunc, Function objExtFunc); public abstract boolean isBinary(); diff --git a/src/main/java/org/redkale/convert/ConvertFactory.java b/src/main/java/org/redkale/convert/ConvertFactory.java index 7cf0ce655..09e4a89ce 100644 --- a/src/main/java/org/redkale/convert/ConvertFactory.java +++ b/src/main/java/org/redkale/convert/ConvertFactory.java @@ -36,12 +36,6 @@ import org.redkale.util.*; @SuppressWarnings("unchecked") public abstract class ConvertFactory { - //值为true时 String类型值为"",Boolean类型值为false时不会输出,默认为false - public static final int FEATURE_TINY = 1 << 1; - - //值为true时 字段值为null时会输出,默认为false - public static final int FEATURE_NULLABLE = 1 << 2; - private static final AtomicBoolean loaderInited = new AtomicBoolean(); private static Convert defProtobufConvert; @@ -50,7 +44,7 @@ public abstract class ConvertFactory { protected Convert convert; - //配置属性集合, 1<<1至1<<10为系统内置 + //配置属性集合 protected int features; private final Encodeable anyEncoder = new AnyEncoder(this); @@ -213,17 +207,6 @@ public abstract class ConvertFactory { } } - public final int features() { - return this.features; - } - - public ConvertFactory features(int features) { - if (features > -1) { - this.features = features; - } - return this; - } - public ConvertFactory parent() { return this.parent; } @@ -348,30 +331,51 @@ public abstract class ConvertFactory { return convert; } - public static boolean tinyFeature(int features) { - return (features & FEATURE_TINY) > 0; + public final int getFeatures() { + return this.features; } - public static boolean nullableFeature(int features) { - return (features & FEATURE_NULLABLE) > 0; - } - - public ConvertFactory tiny(boolean tiny) { - if (tiny) { - this.features |= FEATURE_TINY; - } else { - this.features = this.features & ~FEATURE_TINY; + protected > F withFeatures(int features) { + if (features > -1) { + this.features = features; } - return this; + return (F) this; } - public ConvertFactory nullable(boolean nullable) { - if (nullable) { - this.features |= FEATURE_NULLABLE; - } else { - this.features = this.features & ~FEATURE_NULLABLE; + protected > F addFeature(int feature) { + if (feature > 0) { + if (features > -1) { + this.features |= feature; + } else { + this.features = feature; + } } - return this; + return (F) this; + } + + protected > F removeFeature(int feature) { + if (feature > 0) { + if (features > -1) { + this.features = this.features & ~feature; + } + } + return (F) this; + } + + protected > F withTinyFeature(boolean tiny) { + return tiny ? addFeature(Convert.FEATURE_TINY) : removeFeature(Convert.FEATURE_NULLABLE); + } + + protected > F withNullableFeature(boolean nullable) { + return nullable ? addFeature(Convert.FEATURE_NULLABLE) : removeFeature(Convert.FEATURE_NULLABLE); + } + + public static boolean checkTinyFeature(int features) { + return (features & Convert.FEATURE_TINY) > 0; + } + + public static boolean checkNullableFeature(int features) { + return (features & Convert.FEATURE_NULLABLE) > 0; } public boolean isConvertDisabled(AccessibleObject element) { diff --git a/src/main/java/org/redkale/convert/Writer.java b/src/main/java/org/redkale/convert/Writer.java index ef5febc4b..67e00eeea 100644 --- a/src/main/java/org/redkale/convert/Writer.java +++ b/src/main/java/org/redkale/convert/Writer.java @@ -80,18 +80,16 @@ public abstract class Writer { } public Writer features(int features) { - if (features > -1) { - this.features = features; - } + this.features = features; return this; } protected final boolean tiny() { - return ConvertFactory.tinyFeature(features); + return ConvertFactory.checkTinyFeature(features); } protected final boolean nullable() { - return ConvertFactory.nullableFeature(features); + return ConvertFactory.checkNullableFeature(features); } /** diff --git a/src/main/java/org/redkale/convert/bson/BsonFactory.java b/src/main/java/org/redkale/convert/bson/BsonFactory.java index 1e3bdd322..d7b2ea79c 100644 --- a/src/main/java/org/redkale/convert/bson/BsonFactory.java +++ b/src/main/java/org/redkale/convert/bson/BsonFactory.java @@ -25,8 +25,8 @@ import org.redkale.util.TypeToken; public final class BsonFactory extends ConvertFactory { private static final BsonFactory instance = new BsonFactory(null, - getSystemPropertyInt("redkale.convert.bson.tiny", "redkale.convert.tiny", true, FEATURE_TINY) - | getSystemPropertyInt("redkale.convert.bson.nullable", "redkale.convert.nullable", false, FEATURE_NULLABLE) + getSystemPropertyInt("redkale.convert.bson.tiny", "redkale.convert.tiny", true, Convert.FEATURE_TINY) + | getSystemPropertyInt("redkale.convert.bson.nullable", "redkale.convert.nullable", false, Convert.FEATURE_NULLABLE) ); static final Decodeable objectDecoder = instance.loadDecoder(Object.class); @@ -56,23 +56,28 @@ public final class BsonFactory extends ConvertFactory { } @Override - public BsonFactory tiny(boolean tiny) { - super.tiny(tiny); - return this; - } - - protected boolean tiny() { - return (this.features & FEATURE_TINY) > 0; + public BsonFactory withFeatures(int features) { + return super.withFeatures(features); } @Override - public BsonFactory nullable(boolean nullable) { - super.nullable(nullable); - return this; + public BsonFactory addFeature(int feature) { + return super.addFeature(feature); } - protected boolean nullable() { - return (this.features & FEATURE_NULLABLE) > 0; + @Override + public BsonFactory removeFeature(int feature) { + return super.removeFeature(feature); + } + + @Override + public BsonFactory withTinyFeature(boolean tiny) { + return super.withTinyFeature(tiny); + } + + @Override + public BsonFactory withNullableFeature(boolean nullable) { + return super.withNullableFeature(nullable); } @Override diff --git a/src/main/java/org/redkale/convert/bson/BsonWriter.java b/src/main/java/org/redkale/convert/bson/BsonWriter.java index 54bb7415b..4223327cb 100644 --- a/src/main/java/org/redkale/convert/bson/BsonWriter.java +++ b/src/main/java/org/redkale/convert/bson/BsonWriter.java @@ -82,7 +82,7 @@ public class BsonWriter extends Writer implements ByteTuple { public BsonWriter() { this(defaultSize); - this.features = BsonFactory.root().features(); + this.features = BsonFactory.root().getFeatures(); } public BsonWriter(int size) { diff --git a/src/main/java/org/redkale/convert/json/JsonDynEncoder.java b/src/main/java/org/redkale/convert/json/JsonDynEncoder.java index a8b94ae85..c42334c12 100644 --- a/src/main/java/org/redkale/convert/json/JsonDynEncoder.java +++ b/src/main/java/org/redkale/convert/json/JsonDynEncoder.java @@ -386,7 +386,7 @@ public abstract class JsonDynEncoder implements Encodeable { final Map mixedNames = mixedNames0; final ClassLoader loader = Thread.currentThread().getContextClassLoader(); final String newDynName = "org/redkaledyn/json/_Dyn" + JsonDynEncoder.class.getSimpleName() - + "__" + clazz.getName().replace('.', '_').replace('$', '_') + "_" + factory.features() + "_" + Utility.md5Hex(memberb.toString()); //tiny必须要加上, 同一个类会有多个字段定制Convert + + "__" + clazz.getName().replace('.', '_').replace('$', '_') + "_" + factory.getFeatures() + "_" + Utility.md5Hex(memberb.toString()); //tiny必须要加上, 同一个类会有多个字段定制Convert try { Class clz = RedkaleClassLoader.findDynClass(newDynName.replace('/', '.')); Class newClazz = clz == null ? loader.loadClass(newDynName.replace('/', '.')) : clz; @@ -511,8 +511,8 @@ public abstract class JsonDynEncoder implements Encodeable { int maxLocals = 4; int elementIndex = -1; - final boolean tiny = ConvertFactory.tinyFeature(factory.features()); - final boolean nullable = ConvertFactory.nullableFeature(factory.features()); + final boolean tiny = ConvertFactory.checkTinyFeature(factory.getFeatures()); + final boolean nullable = ConvertFactory.checkNullableFeature(factory.getFeatures()); final Class firstType = readGetSetFieldType(members.get(0)); final boolean mustHadComma = firstType.isPrimitive() && (firstType != boolean.class || !tiny || nullable); //byte/short/char/int/float/long/double diff --git a/src/main/java/org/redkale/convert/json/JsonFactory.java b/src/main/java/org/redkale/convert/json/JsonFactory.java index 118911818..c5b66da7b 100644 --- a/src/main/java/org/redkale/convert/json/JsonFactory.java +++ b/src/main/java/org/redkale/convert/json/JsonFactory.java @@ -25,8 +25,8 @@ import org.redkale.util.Uint128; public final class JsonFactory extends ConvertFactory { private static final JsonFactory instance = new JsonFactory(null, - getSystemPropertyInt("redkale.convert.json.tiny", "redkale.convert.tiny", false, FEATURE_TINY) - | getSystemPropertyInt("redkale.convert.json.nullable", "redkale.convert.nullable", false, FEATURE_NULLABLE) + getSystemPropertyInt("redkale.convert.json.tiny", "redkale.convert.tiny", false, Convert.FEATURE_TINY) + | getSystemPropertyInt("redkale.convert.json.nullable", "redkale.convert.nullable", false, Convert.FEATURE_NULLABLE) ); static { @@ -56,9 +56,24 @@ public final class JsonFactory extends ConvertFactory { } } - public JsonFactory features(int features) { - this.features = features; - return this; + public JsonFactory withFeatures(int features) { + return super.withFeatures(features); + } + + public JsonFactory addFeature(int feature) { + return super.addFeature(feature); + } + + public JsonFactory removeFeature(int feature) { + return super.removeFeature(feature); + } + + public JsonFactory withTinyFeature(boolean tiny) { + return super.withTinyFeature(tiny); + } + + public JsonFactory withNullableFeature(boolean nullable) { + return super.withNullableFeature(nullable); } @Override @@ -72,8 +87,8 @@ public final class JsonFactory extends ConvertFactory { } public static JsonFactory create() { - return new JsonFactory(null, instance.features()); - } + return new JsonFactory(null, instance.getFeatures()); + } @Override protected Encodeable createDyncEncoder(Type type) { diff --git a/src/main/java/org/redkale/convert/json/JsonWriter.java b/src/main/java/org/redkale/convert/json/JsonWriter.java index 4e9c58fce..a1a5486fe 100644 --- a/src/main/java/org/redkale/convert/json/JsonWriter.java +++ b/src/main/java/org/redkale/convert/json/JsonWriter.java @@ -22,7 +22,7 @@ public abstract class JsonWriter extends Writer { protected static final int defaultSize = Integer.getInteger("redkale.convert.json.writer.buffer.defsize", Integer.getInteger("redkale.convert.writer.buffer.defsize", 1024)); protected JsonWriter() { - this.features = JsonFactory.root().features(); + this.features = JsonFactory.root().getFeatures(); } public JsonWriter features(int features) { diff --git a/src/main/java/org/redkale/net/http/Rest.java b/src/main/java/org/redkale/net/http/Rest.java index feaf22f7d..a594d9a2d 100644 --- a/src/main/java/org/redkale/net/http/Rest.java +++ b/src/main/java/org/redkale/net/http/Rest.java @@ -181,7 +181,7 @@ public final class Rest { } final JsonFactory childFactory = JsonFactory.create(); if (features > -1) { - childFactory.features(features); + childFactory.withFeatures(features); } List types = new ArrayList<>(); Set reloadTypes = new HashSet<>(); @@ -212,7 +212,7 @@ public final class Rest { } types.add(rc.type()); if (rc.features() > -1) { - childFactory.features(rc.features()); + childFactory.withFeatures(rc.features()); } } } diff --git a/src/test/java/org/redkale/test/convert/GenericEntity.java b/src/test/java/org/redkale/test/convert/GenericEntity.java index 493022107..b76a28e61 100644 --- a/src/test/java/org/redkale/test/convert/GenericEntity.java +++ b/src/test/java/org/redkale/test/convert/GenericEntity.java @@ -5,11 +5,10 @@ */ package org.redkale.test.convert; -import org.redkale.util.TypeToken; -import org.redkale.convert.json.JsonFactory; -import java.lang.reflect.*; +import java.lang.reflect.Type; import java.util.*; import org.redkale.convert.json.*; +import org.redkale.util.TypeToken; /** * 支持泛型的 @@ -36,7 +35,7 @@ public class GenericEntity { bean.setEntry(new Entry<>("aaaa", SimpleEntity.create())); final Type type = new TypeToken>() { }.getType(); - JsonFactory.root().tiny(true); + JsonFactory.root().withTinyFeature(true); String json = JsonConvert.root().convertTo(bean); System.out.println(json); System.out.println(JsonConvert.root().convertFrom(type, json).toString()); diff --git a/src/test/java/org/redkale/test/convert/Json5Test.java b/src/test/java/org/redkale/test/convert/Json5Test.java index e7775fb29..11c5b1faf 100644 --- a/src/test/java/org/redkale/test/convert/Json5Test.java +++ b/src/test/java/org/redkale/test/convert/Json5Test.java @@ -4,7 +4,7 @@ package org.redkale.test.convert; import java.util.*; import org.junit.jupiter.api.*; -import org.redkale.convert.ConvertFactory; +import org.redkale.convert.Convert; import org.redkale.convert.json.*; /** @@ -24,7 +24,7 @@ public class Json5Test { @Test public void run1() throws Exception { - JsonFactory factory = JsonFactory.root().features(ConvertFactory.FEATURE_TINY | ConvertFactory.FEATURE_NULLABLE); + JsonFactory factory = JsonFactory.root().withFeatures(Convert.FEATURE_TINY | Convert.FEATURE_NULLABLE); final JsonConvert convert = factory.getConvert(); Json5Bean bean = new Json5Bean(); bean.id = 60; diff --git a/src/test/java/org/redkale/test/convert/JsonMainTest.java b/src/test/java/org/redkale/test/convert/JsonMainTest.java index f87cdf4bd..07bd3f556 100644 --- a/src/test/java/org/redkale/test/convert/JsonMainTest.java +++ b/src/test/java/org/redkale/test/convert/JsonMainTest.java @@ -9,7 +9,7 @@ import java.io.*; import java.nio.ByteBuffer; import java.util.Map; import org.junit.jupiter.api.*; -import org.redkale.convert.ConvertFactory; +import org.redkale.convert.Convert; import org.redkale.convert.json.*; /** @@ -33,7 +33,7 @@ public class JsonMainTest { @Test public void run1() throws Throwable { - JsonFactory factory = JsonFactory.root().features(ConvertFactory.FEATURE_TINY); + JsonFactory factory = JsonFactory.root().withFeatures(Convert.FEATURE_TINY); final JsonConvert convert = JsonConvert.root(); String json = "{\"access_token\":\"null\",\"priv\":null, vvv:nulla,\"priv2\":\"nulla\",\"expires_in\":7200, \"aa\":\"\"}"; Map map = convert.convertFrom(JsonConvert.TYPE_MAP_STRING_STRING, json); diff --git a/src/test/java/org/redkale/test/convert/TinyTest.java b/src/test/java/org/redkale/test/convert/TinyTest.java index 96471ada0..01c79d8da 100644 --- a/src/test/java/org/redkale/test/convert/TinyTest.java +++ b/src/test/java/org/redkale/test/convert/TinyTest.java @@ -3,7 +3,7 @@ package org.redkale.test.convert; import org.junit.jupiter.api.*; -import org.redkale.convert.ConvertFactory; +import org.redkale.convert.Convert; import org.redkale.convert.json.*; /** @@ -25,7 +25,7 @@ public class TinyTest { TinyRecord record = new TinyRecord(); record.id = 5; { - JsonFactory factory = JsonFactory.create().features(ConvertFactory.FEATURE_TINY); + JsonFactory factory = JsonFactory.create().withFeatures(Convert.FEATURE_TINY); JsonConvert convert = factory.getConvert(); String json = "{\"id\":5}"; if (!main) { @@ -34,7 +34,7 @@ public class TinyTest { System.out.println(convert.convertTo(record)); } { - JsonFactory factory = JsonFactory.create().features(0); + JsonFactory factory = JsonFactory.create().withFeatures(0); JsonConvert convert = factory.getConvert(); String json = "{\"id\":5,\"name\":\"\"}"; if (!main) {