From ef98edd91ae3be7e0f3f90d51fe753ae187f7042 Mon Sep 17 00:00:00 2001 From: Redkale <8730487+redkale@users.noreply.github.com> Date: Sun, 13 Oct 2019 12:55:00 +0800 Subject: [PATCH] =?UTF-8?q?Convert.newConvert=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=AC=AC2=E4=B8=AAFunction=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/org/redkale/convert/Convert.java | 9 ++- src/org/redkale/convert/ObjectEncoder.java | 13 ++++ src/org/redkale/convert/Writer.java | 59 ++++++++++++++++--- src/org/redkale/convert/bson/BsonConvert.java | 7 ++- src/org/redkale/convert/bson/BsonWriter.java | 8 +-- src/org/redkale/convert/json/JsonConvert.java | 7 ++- src/org/redkale/convert/json/JsonWriter.java | 5 +- .../test/convert/BiFunctionConvertMain.java | 39 +++++++----- 8 files changed, 113 insertions(+), 34 deletions(-) diff --git a/src/org/redkale/convert/Convert.java b/src/org/redkale/convert/Convert.java index eca49ffbd..8e45843af 100644 --- a/src/org/redkale/convert/Convert.java +++ b/src/org/redkale/convert/Convert.java @@ -36,12 +36,15 @@ public abstract class Convert { return writer; } - protected S fieldFunc(S writer, BiFunction fieldFunc) { - writer.fieldFunc = fieldFunc; + protected S fieldFunc(S writer, BiFunction objFieldFunc, Function objExtFunc) { + writer.objFieldFunc = objFieldFunc; + writer.objExtFunc = objExtFunc; return writer; } - public abstract Convert newConvert(final BiFunction fieldFunc); + public abstract Convert newConvert(final BiFunction objFieldFunc); + + public abstract Convert newConvert(final BiFunction objFieldFunc, Function objExtFunc); public abstract boolean isBinary(); diff --git a/src/org/redkale/convert/ObjectEncoder.java b/src/org/redkale/convert/ObjectEncoder.java index 6a180e69b..8a03c8753 100644 --- a/src/org/redkale/convert/ObjectEncoder.java +++ b/src/org/redkale/convert/ObjectEncoder.java @@ -164,9 +164,22 @@ public class ObjectEncoder implements Encodeable { return; } if (out.writeObjectB(value) < 0) { + int maxPosition = 0; for (EnMember member : members) { + maxPosition = member.getPosition(); out.writeObjectField(member, value); } + if (out.objExtFunc != null) { + EnFieldObject[] extFields = out.objExtFunc.apply(value); + if (extFields != null) { + Encodeable anyEncoder = factory.getAnyEncoder(); + for (EnFieldObject en : extFields) { + if (en == null) continue; + maxPosition++; + out.writeObjectField(en.getName(), en.getType(), Math.max(en.getPosition(), maxPosition), anyEncoder, en.getValue()); + } + } + } } out.writeObjectE(value); } diff --git a/src/org/redkale/convert/Writer.java b/src/org/redkale/convert/Writer.java index 947eb67ba..73d1c39d7 100644 --- a/src/org/redkale/convert/Writer.java +++ b/src/org/redkale/convert/Writer.java @@ -6,7 +6,7 @@ package org.redkale.convert; import java.lang.reflect.*; -import java.util.function.BiFunction; +import java.util.function.*; import org.redkale.util.*; /** @@ -26,7 +26,10 @@ public abstract class Writer { protected Type specify; //对某个字段值进行动态处理 - protected BiFunction fieldFunc; + protected BiFunction objFieldFunc; + + //对某个对象进行动态扩展字段值处理 + protected Function objExtFunc; /** * 设置specify @@ -44,7 +47,7 @@ public abstract class Writer { } protected boolean recycle() { - this.fieldFunc = null; + this.objFieldFunc = null; return true; } @@ -116,10 +119,10 @@ public abstract class Writer { @SuppressWarnings("unchecked") public void writeObjectField(final EnMember member, Object obj) { Object value; - if (fieldFunc == null) { + if (objFieldFunc == null) { value = member.attribute.get(obj); } else { - value = fieldFunc.apply(member.attribute, obj); + value = objFieldFunc.apply(member.attribute, obj); } if (value == null) return; if (tiny()) { @@ -129,11 +132,49 @@ public abstract class Writer { if (!((Boolean) value)) return; } } - this.writeFieldName(member); + Attribute attr = member.getAttribute(); + this.writeFieldName(attr.field(), attr.genericType(), member.getPosition()); member.encoder.convertTo(this, value); this.comma = true; } + /** + * 输出一个对象的某个扩展字段 + * + * + * @param fieldName 字段名称 + * @param fieldType 字段类型 + * @param fieldPos 字段顺序 + * @param anyEncoder Encoder + * @param value 写入的字段对象 + */ + @SuppressWarnings("unchecked") + public void writeObjectField(final String fieldName, Type fieldType, int fieldPos, Encodeable anyEncoder, Object value) { + if (value == null) return; + if (fieldType == null) fieldType = value.getClass(); + if (tiny() && fieldType instanceof Class) { + Class clazz = (Class) fieldType; + if (CharSequence.class.isAssignableFrom(clazz)) { + if (((CharSequence) value).length() == 0) return; + } else if (clazz == boolean.class || clazz == Boolean.class) { + if (!((Boolean) value)) return; + } + } + this.writeFieldName(fieldName, fieldType, fieldPos); + anyEncoder.convertTo(this, value); + this.comma = true; + } + + /** + * 输出一个字段名 + * + * @param member 字段 + */ + public final void writeFieldName(final EnMember member) { + Attribute attr = member.getAttribute(); + this.writeFieldName(attr.field(), attr.genericType(), member.getPosition()); + } + /** * 输出一个对象后的操作 * @@ -191,9 +232,11 @@ public abstract class Writer { /** * 输出一个字段名 * - * @param member 字段的EnMember对象 + * @param fieldName 字段名称 + * @param fieldType 字段类型 + * @param fieldPos 字段顺序 */ - public abstract void writeFieldName(EnMember member); + public abstract void writeFieldName(String fieldName, Type fieldType, int fieldPos); /** * 写入一个boolean值 diff --git a/src/org/redkale/convert/bson/BsonConvert.java b/src/org/redkale/convert/bson/BsonConvert.java index ac4214b3c..adee83785 100644 --- a/src/org/redkale/convert/bson/BsonConvert.java +++ b/src/org/redkale/convert/bson/BsonConvert.java @@ -61,10 +61,15 @@ public class BsonConvert extends BinaryConvert { @Override public BsonConvert newConvert(final BiFunction fieldFunc) { + return newConvert(fieldFunc, null); + } + + @Override + public BsonConvert newConvert(final BiFunction fieldFunc, Function objExtFunc) { return new BsonConvert(getFactory(), tiny) { @Override protected S configWrite(S writer) { - return fieldFunc(writer, fieldFunc); + return fieldFunc(writer, fieldFunc, objExtFunc); } }; } diff --git a/src/org/redkale/convert/bson/BsonWriter.java b/src/org/redkale/convert/bson/BsonWriter.java index 71859877a..9717cabd9 100644 --- a/src/org/redkale/convert/bson/BsonWriter.java +++ b/src/org/redkale/convert/bson/BsonWriter.java @@ -5,6 +5,7 @@ */ package org.redkale.convert.bson; +import java.lang.reflect.Type; import java.nio.ByteBuffer; import org.redkale.convert.*; import org.redkale.convert.ext.ByteSimpledCoder; @@ -200,11 +201,10 @@ public class BsonWriter extends Writer { } @Override - public final void writeFieldName(EnMember member) { - Attribute attribute = member.getAttribute(); + public final void writeFieldName(String fieldName, Type fieldType, int fieldPos) { writeByte(BsonReader.SIGN_HASNEXT); - writeSmallString(attribute.field()); - writeByte(BsonFactory.typeEnum(attribute.type())); + writeSmallString(fieldName); + writeByte(BsonFactory.typeEnum(fieldType)); } /** diff --git a/src/org/redkale/convert/json/JsonConvert.java b/src/org/redkale/convert/json/JsonConvert.java index 5dc0b3a98..61852b6fc 100644 --- a/src/org/redkale/convert/json/JsonConvert.java +++ b/src/org/redkale/convert/json/JsonConvert.java @@ -48,10 +48,15 @@ public class JsonConvert extends TextConvert { @Override public JsonConvert newConvert(final BiFunction fieldFunc) { + return newConvert(fieldFunc, null); + } + + @Override + public JsonConvert newConvert(final BiFunction fieldFunc, Function objExtFunc) { return new JsonConvert(getFactory(), tiny) { @Override protected S configWrite(S writer) { - return fieldFunc(writer, fieldFunc); + return fieldFunc(writer, fieldFunc, objExtFunc); } }; } diff --git a/src/org/redkale/convert/json/JsonWriter.java b/src/org/redkale/convert/json/JsonWriter.java index 303cbee60..fcc70b0f9 100644 --- a/src/org/redkale/convert/json/JsonWriter.java +++ b/src/org/redkale/convert/json/JsonWriter.java @@ -5,6 +5,7 @@ */ package org.redkale.convert.json; +import java.lang.reflect.Type; import java.nio.ByteBuffer; import org.redkale.convert.*; import org.redkale.util.*; @@ -159,9 +160,9 @@ public class JsonWriter extends Writer { } @Override - public final void writeFieldName(EnMember member) { + public final void writeFieldName(String fieldName, Type fieldType, int fieldPos) { if (this.comma) writeTo(','); - writeTo(true, member.getAttribute().field()); + writeTo(true, fieldName); writeTo(':'); } diff --git a/test/org/redkale/test/convert/BiFunctionConvertMain.java b/test/org/redkale/test/convert/BiFunctionConvertMain.java index cda9c72d7..10be928e3 100644 --- a/test/org/redkale/test/convert/BiFunctionConvertMain.java +++ b/test/org/redkale/test/convert/BiFunctionConvertMain.java @@ -5,6 +5,7 @@ */ package org.redkale.test.convert; +import org.redkale.convert.EnFieldObject; import org.redkale.convert.json.JsonConvert; import org.redkale.util.Attribute; @@ -15,44 +16,52 @@ import org.redkale.util.Attribute; public class BiFunctionConvertMain { public static class GamePlayer { + public int userid; + public String username; + public int[] cards; } public static class GameTable { + public int tableid; + public GamePlayer[] players; } public static void main(String[] args) throws Throwable { GamePlayer player1 = new GamePlayer(); - player1.userid= 1; - player1.username="玩家1"; - player1.cards = new int[]{11,12,13,14,15}; + player1.userid = 1; + player1.username = "玩家1"; + player1.cards = new int[]{11, 12, 13, 14, 15}; GamePlayer player2 = new GamePlayer(); - player2.userid= 2; - player2.username="玩家2"; - player2.cards = new int[]{21,22,23,24,25}; + player2.userid = 2; + player2.username = "玩家2"; + player2.cards = new int[]{21, 22, 23, 24, 25}; GamePlayer player3 = new GamePlayer(); - player3.userid= 3; - player3.username="玩家3"; - player3.cards = new int[]{31,32,33,34,35}; + player3.userid = 3; + player3.username = "玩家3"; + player3.cards = new int[]{31, 32, 33, 34, 35}; GameTable table = new GameTable(); - table.tableid=100; - table.players = new GamePlayer[]{player1,player2,player3}; + table.tableid = 100; + table.players = new GamePlayer[]{player1, player2, player3}; JsonConvert convert1 = JsonConvert.root(); System.out.println(convert1.convertTo(table)); JsonConvert convert2 = convert1.newConvert((Attribute t, Object u) -> { - if(t.field().equals("cards") && u instanceof GamePlayer){ - int userid = ((GamePlayer)u).userid; - if(userid == 3) return null; //玩家3的cards不输出 + if (t.field().equals("cards") && u instanceof GamePlayer) { + int userid = ((GamePlayer) u).userid; + if (userid == 3) return null; //玩家3的cards不输出 return t.get(u); } return t.get(u); + }, (Object u) -> { + if (table != u) return null; + return new EnFieldObject[]{new EnFieldObject("extcol1", 30), new EnFieldObject("extcol2", "扩展字段值")}; }); System.out.println(convert2.convertTo(table)); //{"players":[{"cards":[11,12,13,14,15],"userid":1,"username":"玩家1"},{"cards":[21,22,23,24,25],"userid":2,"username":"玩家2"},{"cards":[31,32,33,34,35],"userid":3,"username":"玩家3"}],"tableid":100} - //{"players":[{"cards":[11,12,13,14,15],"userid":1,"username":"玩家1"},{"cards":[21,22,23,24,25],"userid":2,"username":"玩家2"},{"userid":3,"username":"玩家3"}],"tableid":100} + //{"players":[{"cards":[11,12,13,14,15],"userid":1,"username":"玩家1"},{"cards":[21,22,23,24,25],"userid":2,"username":"玩家2"},{"userid":3,"username":"玩家3"}],"tableid":100,"extcol1":30,"extcol2":"扩展字段值"} } }