Convert.newConvert 增加第2个Function参数

This commit is contained in:
Redkale
2019-10-13 12:55:00 +08:00
parent f4548bbe34
commit ef98edd91a
8 changed files with 113 additions and 34 deletions

View File

@@ -36,12 +36,15 @@ public abstract class Convert<R extends Reader, W extends Writer> {
return writer; return writer;
} }
protected <S extends W> S fieldFunc(S writer, BiFunction<Attribute, Object, Object> fieldFunc) { protected <S extends W> S fieldFunc(S writer, BiFunction<Attribute, Object, Object> objFieldFunc, Function<Object, EnFieldObject[]> objExtFunc) {
writer.fieldFunc = fieldFunc; writer.objFieldFunc = objFieldFunc;
writer.objExtFunc = objExtFunc;
return writer; return writer;
} }
public abstract Convert<R, W> newConvert(final BiFunction<Attribute, Object, Object> fieldFunc); public abstract Convert<R, W> newConvert(final BiFunction<Attribute, Object, Object> objFieldFunc);
public abstract Convert<R, W> newConvert(final BiFunction<Attribute, Object, Object> objFieldFunc, Function<Object, EnFieldObject[]> objExtFunc);
public abstract boolean isBinary(); public abstract boolean isBinary();

View File

@@ -164,9 +164,22 @@ public class ObjectEncoder<W extends Writer, T> implements Encodeable<W, T> {
return; return;
} }
if (out.writeObjectB(value) < 0) { if (out.writeObjectB(value) < 0) {
int maxPosition = 0;
for (EnMember member : members) { for (EnMember member : members) {
maxPosition = member.getPosition();
out.writeObjectField(member, value); out.writeObjectField(member, value);
} }
if (out.objExtFunc != null) {
EnFieldObject[] extFields = out.objExtFunc.apply(value);
if (extFields != null) {
Encodeable<W, ?> 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); out.writeObjectE(value);
} }

View File

@@ -6,7 +6,7 @@
package org.redkale.convert; package org.redkale.convert;
import java.lang.reflect.*; import java.lang.reflect.*;
import java.util.function.BiFunction; import java.util.function.*;
import org.redkale.util.*; import org.redkale.util.*;
/** /**
@@ -26,7 +26,10 @@ public abstract class Writer {
protected Type specify; protected Type specify;
//对某个字段值进行动态处理 //对某个字段值进行动态处理
protected BiFunction<Attribute, Object, Object> fieldFunc; protected BiFunction<Attribute, Object, Object> objFieldFunc;
//对某个对象进行动态扩展字段值处理
protected Function<Object, EnFieldObject[]> objExtFunc;
/** /**
* 设置specify * 设置specify
@@ -44,7 +47,7 @@ public abstract class Writer {
} }
protected boolean recycle() { protected boolean recycle() {
this.fieldFunc = null; this.objFieldFunc = null;
return true; return true;
} }
@@ -116,10 +119,10 @@ public abstract class Writer {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void writeObjectField(final EnMember member, Object obj) { public void writeObjectField(final EnMember member, Object obj) {
Object value; Object value;
if (fieldFunc == null) { if (objFieldFunc == null) {
value = member.attribute.get(obj); value = member.attribute.get(obj);
} else { } else {
value = fieldFunc.apply(member.attribute, obj); value = objFieldFunc.apply(member.attribute, obj);
} }
if (value == null) return; if (value == null) return;
if (tiny()) { if (tiny()) {
@@ -129,11 +132,49 @@ public abstract class Writer {
if (!((Boolean) value)) return; if (!((Boolean) value)) return;
} }
} }
this.writeFieldName(member); Attribute attr = member.getAttribute();
this.writeFieldName(attr.field(), attr.genericType(), member.getPosition());
member.encoder.convertTo(this, value); member.encoder.convertTo(this, value);
this.comma = true; 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值 * 写入一个boolean值

View File

@@ -61,10 +61,15 @@ public class BsonConvert extends BinaryConvert<BsonReader, BsonWriter> {
@Override @Override
public BsonConvert newConvert(final BiFunction<Attribute, Object, Object> fieldFunc) { public BsonConvert newConvert(final BiFunction<Attribute, Object, Object> fieldFunc) {
return newConvert(fieldFunc, null);
}
@Override
public BsonConvert newConvert(final BiFunction<Attribute, Object, Object> fieldFunc, Function<Object, EnFieldObject[]> objExtFunc) {
return new BsonConvert(getFactory(), tiny) { return new BsonConvert(getFactory(), tiny) {
@Override @Override
protected <S extends BsonWriter> S configWrite(S writer) { protected <S extends BsonWriter> S configWrite(S writer) {
return fieldFunc(writer, fieldFunc); return fieldFunc(writer, fieldFunc, objExtFunc);
} }
}; };
} }

View File

@@ -5,6 +5,7 @@
*/ */
package org.redkale.convert.bson; package org.redkale.convert.bson;
import java.lang.reflect.Type;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import org.redkale.convert.*; import org.redkale.convert.*;
import org.redkale.convert.ext.ByteSimpledCoder; import org.redkale.convert.ext.ByteSimpledCoder;
@@ -200,11 +201,10 @@ public class BsonWriter extends Writer {
} }
@Override @Override
public final void writeFieldName(EnMember member) { public final void writeFieldName(String fieldName, Type fieldType, int fieldPos) {
Attribute attribute = member.getAttribute();
writeByte(BsonReader.SIGN_HASNEXT); writeByte(BsonReader.SIGN_HASNEXT);
writeSmallString(attribute.field()); writeSmallString(fieldName);
writeByte(BsonFactory.typeEnum(attribute.type())); writeByte(BsonFactory.typeEnum(fieldType));
} }
/** /**

View File

@@ -48,10 +48,15 @@ public class JsonConvert extends TextConvert<JsonReader, JsonWriter> {
@Override @Override
public JsonConvert newConvert(final BiFunction<Attribute, Object, Object> fieldFunc) { public JsonConvert newConvert(final BiFunction<Attribute, Object, Object> fieldFunc) {
return newConvert(fieldFunc, null);
}
@Override
public JsonConvert newConvert(final BiFunction<Attribute, Object, Object> fieldFunc, Function<Object, EnFieldObject[]> objExtFunc) {
return new JsonConvert(getFactory(), tiny) { return new JsonConvert(getFactory(), tiny) {
@Override @Override
protected <S extends JsonWriter> S configWrite(S writer) { protected <S extends JsonWriter> S configWrite(S writer) {
return fieldFunc(writer, fieldFunc); return fieldFunc(writer, fieldFunc, objExtFunc);
} }
}; };
} }

View File

@@ -5,6 +5,7 @@
*/ */
package org.redkale.convert.json; package org.redkale.convert.json;
import java.lang.reflect.Type;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import org.redkale.convert.*; import org.redkale.convert.*;
import org.redkale.util.*; import org.redkale.util.*;
@@ -159,9 +160,9 @@ public class JsonWriter extends Writer {
} }
@Override @Override
public final void writeFieldName(EnMember member) { public final void writeFieldName(String fieldName, Type fieldType, int fieldPos) {
if (this.comma) writeTo(','); if (this.comma) writeTo(',');
writeTo(true, member.getAttribute().field()); writeTo(true, fieldName);
writeTo(':'); writeTo(':');
} }

View File

@@ -5,6 +5,7 @@
*/ */
package org.redkale.test.convert; package org.redkale.test.convert;
import org.redkale.convert.EnFieldObject;
import org.redkale.convert.json.JsonConvert; import org.redkale.convert.json.JsonConvert;
import org.redkale.util.Attribute; import org.redkale.util.Attribute;
@@ -15,13 +16,18 @@ import org.redkale.util.Attribute;
public class BiFunctionConvertMain { public class BiFunctionConvertMain {
public static class GamePlayer { public static class GamePlayer {
public int userid; public int userid;
public String username; public String username;
public int[] cards; public int[] cards;
} }
public static class GameTable { public static class GameTable {
public int tableid; public int tableid;
public GamePlayer[] players; public GamePlayer[] players;
} }
@@ -50,9 +56,12 @@ public class BiFunctionConvertMain {
return t.get(u); return t.get(u);
} }
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)); 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"},{"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":"扩展字段值"}
} }
} }