protobuf
This commit is contained in:
@@ -595,7 +595,7 @@ public final class ApiDocCommand {
|
|||||||
if (col != null) {
|
if (col != null) {
|
||||||
desc = col.comment();
|
desc = col.comment();
|
||||||
if (!col.nullable()) {
|
if (!col.nullable()) {
|
||||||
requireds.add(member.getAttribute().field());
|
requireds.add(member.getFieldName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (desc.isEmpty() && member.getField().getAnnotation(Comment.class) != null) {
|
if (desc.isEmpty() && member.getField().getAnnotation(Comment.class) != null) {
|
||||||
@@ -613,7 +613,7 @@ public final class ApiDocCommand {
|
|||||||
if (col != null) {
|
if (col != null) {
|
||||||
desc = col.comment();
|
desc = col.comment();
|
||||||
if (!col.nullable()) {
|
if (!col.nullable()) {
|
||||||
requireds.add(member.getAttribute().field());
|
requireds.add(member.getFieldName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (desc.isEmpty() && member.getMethod().getAnnotation(Comment.class) != null) {
|
if (desc.isEmpty() && member.getMethod().getAnnotation(Comment.class) != null) {
|
||||||
@@ -630,7 +630,7 @@ public final class ApiDocCommand {
|
|||||||
if (!desc.isEmpty()) {
|
if (!desc.isEmpty()) {
|
||||||
schemaMap.put("description", desc);
|
schemaMap.put("description", desc);
|
||||||
}
|
}
|
||||||
properties.put(member.getAttribute().field(), schemaMap);
|
properties.put(member.getFieldName(), schemaMap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!requireds.isEmpty()) {
|
if (!requireds.isEmpty()) {
|
||||||
@@ -899,7 +899,7 @@ public final class ApiDocCommand {
|
|||||||
if (index > 0) {
|
if (index > 0) {
|
||||||
json.append(",");
|
json.append(",");
|
||||||
}
|
}
|
||||||
json.append('"').append(member.getAttribute().field()).append("\":{}");
|
json.append('"').append(member.getFieldName()).append("\":{}");
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
json.append("}");
|
json.append("}");
|
||||||
|
|||||||
@@ -119,6 +119,10 @@ public final class DeMember<R extends Reader, T, F> {
|
|||||||
return ((TagDecodeable<R, F>) decoder).convertFrom(in, this);
|
return ((TagDecodeable<R, F>) decoder).convertFrom(in, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getFieldName() {
|
||||||
|
return this.attribute.field();
|
||||||
|
}
|
||||||
|
|
||||||
public Attribute<T, F> getAttribute() {
|
public Attribute<T, F> getAttribute() {
|
||||||
return this.attribute;
|
return this.attribute;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ public class DeMemberInfo {
|
|||||||
this.memberFieldMap = new HashMap<>(deMembers.length);
|
this.memberFieldMap = new HashMap<>(deMembers.length);
|
||||||
this.memberTagMap = new HashMap<>(deMembers.length);
|
this.memberTagMap = new HashMap<>(deMembers.length);
|
||||||
for (DeMember member : deMembers) {
|
for (DeMember member : deMembers) {
|
||||||
this.memberFieldMap.put(member.getAttribute().field(), member);
|
this.memberFieldMap.put(member.getFieldName(), member);
|
||||||
this.memberTagMap.put(member.getTag(), member);
|
this.memberTagMap.put(member.getTag(), member);
|
||||||
}
|
}
|
||||||
this.memberNode = DeMemberNode.create(deMembers);
|
this.memberNode = DeMemberNode.create(deMembers);
|
||||||
|
|||||||
@@ -137,6 +137,10 @@ public final class EnMember<W extends Writer, T, F> {
|
|||||||
return attribute.field().equals(name);
|
return attribute.field().equals(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getFieldName() {
|
||||||
|
return this.attribute.field();
|
||||||
|
}
|
||||||
|
|
||||||
public Attribute<T, F> getAttribute() {
|
public Attribute<T, F> getAttribute() {
|
||||||
return attribute;
|
return attribute;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -359,13 +359,12 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
|
|||||||
@Override
|
@Override
|
||||||
public T convertFrom(final R in) {
|
public T convertFrom(final R in) {
|
||||||
this.checkInited();
|
this.checkInited();
|
||||||
R objin = objectReader(in);
|
final String clazz = in.readObjectB(typeClass);
|
||||||
final String clazz = objin.readObjectB(typeClass);
|
|
||||||
if (clazz == null) {
|
if (clazz == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (!clazz.isEmpty()) {
|
if (!clazz.isEmpty()) {
|
||||||
return (T) factory.loadDecoder(factory.getEntityAlias(clazz)).convertFrom(objin);
|
return (T) factory.loadDecoder(factory.getEntityAlias(clazz)).convertFrom(in);
|
||||||
}
|
}
|
||||||
if (this.creator == null) {
|
if (this.creator == null) {
|
||||||
if (typeClass.isInterface() || Modifier.isAbstract(typeClass.getModifiers())) {
|
if (typeClass.isInterface() || Modifier.isAbstract(typeClass.getModifiers())) {
|
||||||
@@ -378,18 +377,17 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
|
|||||||
if (this.creatorConstructorMembers == null) { // 空构造函数
|
if (this.creatorConstructorMembers == null) { // 空构造函数
|
||||||
final T result = this.creator == null ? null : this.creator.create();
|
final T result = this.creator == null ? null : this.creator.create();
|
||||||
boolean first = true;
|
boolean first = true;
|
||||||
while (objin.hasNext()) {
|
while (in.hasNext()) {
|
||||||
DeMember member = objin.readFieldName(info);
|
DeMember member = in.readFieldName(info);
|
||||||
objin.readBlank();
|
in.readBlank();
|
||||||
if (member == null) {
|
if (member == null) {
|
||||||
objin.skipValue(); // 跳过不存在的属性的值
|
in.skipValue(); // 跳过不存在的属性的值
|
||||||
} else {
|
} else {
|
||||||
readDeMemberValue(objin, member, result, first);
|
readDeMemberValue(in, member, result, first);
|
||||||
}
|
}
|
||||||
first = false;
|
first = false;
|
||||||
}
|
}
|
||||||
objin.readObjectE(typeClass);
|
in.readObjectE(typeClass);
|
||||||
offerReader(in, objin);
|
|
||||||
return result;
|
return result;
|
||||||
} else { // 带参数的构造函数
|
} else { // 带参数的构造函数
|
||||||
final DeMember<R, T, ?>[] constructorFields = this.creatorConstructorMembers;
|
final DeMember<R, T, ?>[] constructorFields = this.creatorConstructorMembers;
|
||||||
@@ -397,13 +395,13 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
|
|||||||
final Object[][] otherParams = new Object[info.length()][2];
|
final Object[][] otherParams = new Object[info.length()][2];
|
||||||
int oc = 0;
|
int oc = 0;
|
||||||
boolean first = true;
|
boolean first = true;
|
||||||
while (objin.hasNext()) {
|
while (in.hasNext()) {
|
||||||
DeMember member = objin.readFieldName(info);
|
DeMember member = in.readFieldName(info);
|
||||||
objin.readBlank();
|
in.readBlank();
|
||||||
if (member == null) {
|
if (member == null) {
|
||||||
objin.skipValue(); // 跳过不存在的属性的值
|
in.skipValue(); // 跳过不存在的属性的值
|
||||||
} else {
|
} else {
|
||||||
Object val = readDeMemberValue(objin, member, first);
|
Object val = readDeMemberValue(in, member, first);
|
||||||
boolean flag = true;
|
boolean flag = true;
|
||||||
for (int i = 0; i < constructorFields.length; i++) {
|
for (int i = 0; i < constructorFields.length; i++) {
|
||||||
if (member == constructorFields[i]) {
|
if (member == constructorFields[i]) {
|
||||||
@@ -418,8 +416,7 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
|
|||||||
}
|
}
|
||||||
first = false;
|
first = false;
|
||||||
}
|
}
|
||||||
objin.readObjectE(typeClass);
|
in.readObjectE(typeClass);
|
||||||
offerReader(in, objin);
|
|
||||||
if (this.creator == null) {
|
if (this.creator == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -440,18 +437,6 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
|
|||||||
// do nothing
|
// do nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean hasNext(R in, boolean first) {
|
|
||||||
return in.hasNext();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected R objectReader(R in) {
|
|
||||||
return in;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void offerReader(R parent, R out) {
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Object readDeMemberValue(R in, DeMember member, boolean first) {
|
protected Object readDeMemberValue(R in, DeMember member, boolean first) {
|
||||||
return member.read(in);
|
return member.read(in);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,9 +7,9 @@ package org.redkale.convert.bson;
|
|||||||
|
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import org.redkale.convert.*;
|
import org.redkale.convert.*;
|
||||||
|
import static org.redkale.convert.Reader.SIGN_NULL;
|
||||||
import org.redkale.convert.ext.ByteSimpledCoder;
|
import org.redkale.convert.ext.ByteSimpledCoder;
|
||||||
import org.redkale.util.*;
|
import org.redkale.util.*;
|
||||||
import static org.redkale.convert.Reader.SIGN_NULL;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BSON数据源
|
* BSON数据源
|
||||||
@@ -129,7 +129,6 @@ public class BsonReader extends Reader {
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Decodeable decoder = BsonFactory.typeEnum(val);
|
Decodeable decoder = BsonFactory.typeEnum(val);
|
||||||
System.out.println("val = " + val + ", decoder = " + decoder);
|
|
||||||
if (decoder != null) {
|
if (decoder != null) {
|
||||||
decoder.convertFrom(this);
|
decoder.convertFrom(this);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ public class JsonMultiImplDecoder<T> implements Decodeable<JsonReader, T> {
|
|||||||
max = decoder.getMembers().length;
|
max = decoder.getMembers().length;
|
||||||
}
|
}
|
||||||
for (DeMember member : decoder.getMembers()) {
|
for (DeMember member : decoder.getMembers()) {
|
||||||
String name = member.getAttribute().field();
|
String name = member.getFieldName();
|
||||||
this.repeatFieldToDecoders.put(name, decoder);
|
this.repeatFieldToDecoders.put(name, decoder);
|
||||||
fields[i].add(name);
|
fields[i].add(name);
|
||||||
Attribute t = fieldTypes.get(name);
|
Attribute t = fieldTypes.get(name);
|
||||||
@@ -164,7 +164,7 @@ public class JsonMultiImplDecoder<T> implements Decodeable<JsonReader, T> {
|
|||||||
for (int j = 0; j < params.length; j++) {
|
for (int j = 0; j < params.length; j++) {
|
||||||
if (params[j] != null
|
if (params[j] != null
|
||||||
&& params[j][0] != null
|
&& params[j][0] != null
|
||||||
&& constructorFields[i].getAttribute().field().equals(((Attribute) params[j][0]).field())) {
|
&& constructorFields[i].getFieldName().equals(((Attribute) params[j][0]).field())) {
|
||||||
constructorParams[i] = params[j][1];
|
constructorParams[i] = params[j][1];
|
||||||
params[j] = null;
|
params[j] = null;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ public class JsonReader extends Reader {
|
|||||||
public JsonReader(char[] text, int start, int len) {
|
public JsonReader(char[] text, int start, int len) {
|
||||||
this.text = Objects.requireNonNull(text);
|
this.text = Objects.requireNonNull(text);
|
||||||
this.position = start - 1;
|
this.position = start - 1;
|
||||||
this.limit = start + len - 1;
|
this.limit = this.position + len;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final JsonReader setText(String text) {
|
public final JsonReader setText(String text) {
|
||||||
@@ -58,7 +58,7 @@ public class JsonReader extends Reader {
|
|||||||
public final JsonReader setText(char[] text, int start, int len) {
|
public final JsonReader setText(char[] text, int start, int len) {
|
||||||
this.text = text;
|
this.text = text;
|
||||||
this.position = start - 1;
|
this.position = start - 1;
|
||||||
this.limit = start + len - 1;
|
this.limit = this.position + len;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,26 +27,25 @@ public class ProtobufArrayDecoder<T> extends ArrayDecoder<ProtobufReader, T> {
|
|||||||
@Override
|
@Override
|
||||||
public T[] convertFrom(ProtobufReader in, DeMember member) {
|
public T[] convertFrom(ProtobufReader in, DeMember member) {
|
||||||
this.checkInited();
|
this.checkInited();
|
||||||
|
final boolean simpled = this.componentSimpled;
|
||||||
final Decodeable<ProtobufReader, T> itemDecoder = this.componentDecoder;
|
final Decodeable<ProtobufReader, T> itemDecoder = this.componentDecoder;
|
||||||
in.readArrayB(member, itemDecoder);
|
in.readArrayB(member, itemDecoder);
|
||||||
int contentLength = in.readMemberContentLength(member, itemDecoder);
|
|
||||||
final List<T> result = new ArrayList();
|
final List<T> result = new ArrayList();
|
||||||
boolean first = true;
|
final int limit = in.limit();
|
||||||
int startPosition = in.position();
|
while (in.hasNext()) {
|
||||||
while (in.hasNext(startPosition, contentLength)) {
|
ProtobufReader subin = in;
|
||||||
ProtobufReader itemReader = getItemReader(in, member, first);
|
if (!simpled) {
|
||||||
if (itemReader == null) { // 元素读取完毕
|
int contentLen = in.readRawVarint32();
|
||||||
|
in.limit(in.position() + contentLen + 1);
|
||||||
|
}
|
||||||
|
result.add(itemDecoder.convertFrom(subin));
|
||||||
|
in.limit(limit);
|
||||||
|
if (!in.readNextTag(member)) { // 元素结束
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
result.add(itemDecoder.convertFrom(itemReader));
|
|
||||||
first = false;
|
|
||||||
}
|
}
|
||||||
in.readArrayE();
|
in.readArrayE();
|
||||||
T[] rs = this.componentArrayFunction.apply(result.size());
|
T[] rs = this.componentArrayFunction.apply(result.size());
|
||||||
return result.toArray(rs);
|
return result.toArray(rs);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ProtobufReader getItemReader(ProtobufReader in, DeMember member, boolean first) {
|
|
||||||
return ProtobufFactory.getItemReader(in, member, componentSimpled, first);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,25 +25,23 @@ public class ProtobufCollectionDecoder<T> extends CollectionDecoder<ProtobufRead
|
|||||||
@Override
|
@Override
|
||||||
public Collection<T> convertFrom(ProtobufReader in, DeMember member) {
|
public Collection<T> convertFrom(ProtobufReader in, DeMember member) {
|
||||||
this.checkInited();
|
this.checkInited();
|
||||||
|
final boolean simpled = !this.componentSimpled;
|
||||||
final Decodeable<ProtobufReader, T> itemDecoder = this.componentDecoder;
|
final Decodeable<ProtobufReader, T> itemDecoder = this.componentDecoder;
|
||||||
in.readArrayB(member, itemDecoder);
|
in.readArrayB(member, itemDecoder);
|
||||||
int contentLength = in.readMemberContentLength(member, itemDecoder);
|
|
||||||
final Collection<T> result = this.creator.create();
|
final Collection<T> result = this.creator.create();
|
||||||
boolean first = true;
|
final int limit = in.limit();
|
||||||
int startPosition = in.position();
|
while (in.hasNext()) {
|
||||||
while (in.hasNext(startPosition, contentLength)) {
|
if (!simpled) {
|
||||||
ProtobufReader itemReader = getItemReader(in, member, first);
|
int contentLen = in.readRawVarint32();
|
||||||
if (itemReader == null) { // 元素读取完毕
|
in.limit(in.position() + contentLen + 1);
|
||||||
|
}
|
||||||
|
result.add(itemDecoder.convertFrom(in));
|
||||||
|
in.limit(limit);
|
||||||
|
if (!in.readNextTag(member)) { // 元素结束
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
result.add(itemDecoder.convertFrom(itemReader));
|
|
||||||
first = false;
|
|
||||||
}
|
}
|
||||||
in.readArrayE();
|
in.readArrayE();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ProtobufReader getItemReader(ProtobufReader in, DeMember member, boolean first) {
|
|
||||||
return ProtobufFactory.getItemReader(in, member, componentSimpled, first);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -240,7 +240,7 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
|
|||||||
.append(ProtobufFactory.wireTypeString(
|
.append(ProtobufFactory.wireTypeString(
|
||||||
member.getDecoder().getType(), ((ProtobufFactory) factory).enumtostring))
|
member.getDecoder().getType(), ((ProtobufFactory) factory).enumtostring))
|
||||||
.append(" ")
|
.append(" ")
|
||||||
.append(member.getAttribute().field())
|
.append(member.getFieldName())
|
||||||
.append("\" : ")
|
.append("\" : ")
|
||||||
.append(member.getPosition())
|
.append(member.getPosition())
|
||||||
.append(i == members.size() - 1 ? "\r\n" : ",\r\n");
|
.append(i == members.size() - 1 ? "\r\n" : ",\r\n");
|
||||||
@@ -389,7 +389,7 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
|
|||||||
.append(ProtobufFactory.wireTypeString(
|
.append(ProtobufFactory.wireTypeString(
|
||||||
member.getEncoder().getType(), ((ProtobufFactory) factory).enumtostring))
|
member.getEncoder().getType(), ((ProtobufFactory) factory).enumtostring))
|
||||||
.append(" ")
|
.append(" ")
|
||||||
.append(member.getAttribute().field())
|
.append(member.getFieldName())
|
||||||
.append("\" : ")
|
.append("\" : ")
|
||||||
.append(member.getPosition())
|
.append(member.getPosition())
|
||||||
.append(i == members.size() - 1 ? "\r\n" : ",\r\n");
|
.append(i == members.size() - 1 ? "\r\n" : ",\r\n");
|
||||||
@@ -541,7 +541,7 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
|
|||||||
.append(ProtobufFactory.wireTypeString(
|
.append(ProtobufFactory.wireTypeString(
|
||||||
member.getEncoder().getType(), ((ProtobufFactory) factory).enumtostring))
|
member.getEncoder().getType(), ((ProtobufFactory) factory).enumtostring))
|
||||||
.append(" ")
|
.append(" ")
|
||||||
.append(member.getAttribute().field())
|
.append(member.getFieldName())
|
||||||
.append(" = ")
|
.append(" = ")
|
||||||
.append(member.getPosition())
|
.append(member.getPosition())
|
||||||
.append(member.getComment().isEmpty() ? ";\r\n" : ("; //" + member.getComment() + " \r\n"));
|
.append(member.getComment().isEmpty() ? ";\r\n" : ("; //" + member.getComment() + " \r\n"));
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ import java.lang.reflect.*;
|
|||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.atomic.*;
|
import java.util.concurrent.atomic.*;
|
||||||
import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES;
|
|
||||||
import org.redkale.asm.*;
|
import org.redkale.asm.*;
|
||||||
|
import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES;
|
||||||
import static org.redkale.asm.Opcodes.*;
|
import static org.redkale.asm.Opcodes.*;
|
||||||
import org.redkale.convert.*;
|
import org.redkale.convert.*;
|
||||||
import org.redkale.util.*;
|
import org.redkale.util.*;
|
||||||
@@ -54,7 +54,7 @@ public abstract class ProtobufDynEncoder<T> extends ProtobufObjectEncoder<T> {
|
|||||||
final Map<String, EnMember> otherMembers = new HashMap<>();
|
final Map<String, EnMember> otherMembers = new HashMap<>();
|
||||||
StringBuilder elementb = new StringBuilder();
|
StringBuilder elementb = new StringBuilder();
|
||||||
for (EnMember member : selfObjEncoder.getMembers()) {
|
for (EnMember member : selfObjEncoder.getMembers()) {
|
||||||
final String fieldName = member.getAttribute().field();
|
final String fieldName = member.getFieldName();
|
||||||
final Class fieldClass = member.getAttribute().type();
|
final Class fieldClass = member.getAttribute().type();
|
||||||
final Type fieldType = member.getAttribute().genericType();
|
final Type fieldType = member.getAttribute().genericType();
|
||||||
elementb.append(fieldName).append(',');
|
elementb.append(fieldName).append(',');
|
||||||
@@ -172,7 +172,7 @@ public abstract class ProtobufDynEncoder<T> extends ProtobufObjectEncoder<T> {
|
|||||||
mv.visitMethodInsn(INVOKEVIRTUAL, pbwriterName, "writeObjectB", "(Ljava/lang/Object;)V", false);
|
mv.visitMethodInsn(INVOKEVIRTUAL, pbwriterName, "writeObjectB", "(Ljava/lang/Object;)V", false);
|
||||||
|
|
||||||
for (EnMember member : selfObjEncoder.getMembers()) {
|
for (EnMember member : selfObjEncoder.getMembers()) {
|
||||||
final String fieldName = member.getAttribute().field();
|
final String fieldName = member.getFieldName();
|
||||||
final Type fieldType = member.getAttribute().genericType();
|
final Type fieldType = member.getAttribute().genericType();
|
||||||
final Class fieldClass = member.getAttribute().type();
|
final Class fieldClass = member.getAttribute().type();
|
||||||
if (ProtobufFactory.isSimpleType(fieldClass)) {
|
if (ProtobufFactory.isSimpleType(fieldClass)) {
|
||||||
|
|||||||
@@ -303,44 +303,6 @@ public class ProtobufFactory extends ConvertFactory<ProtobufReader, ProtobufWrit
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static ProtobufReader getItemReader(ProtobufReader in, DeMember member, boolean simpled, boolean first) {
|
|
||||||
if (simpled) {
|
|
||||||
if (member == null || first) {
|
|
||||||
return in;
|
|
||||||
}
|
|
||||||
int tag = in.readTag();
|
|
||||||
if (tag != member.getTag()) { // 元素结束
|
|
||||||
in.backTag(tag);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return in;
|
|
||||||
} else {
|
|
||||||
if (!first && member != null) {
|
|
||||||
int tag = in.readTag();
|
|
||||||
if (tag != member.getTag()) { // 元素结束
|
|
||||||
in.backTag(tag);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
byte[] bs = in.readByteArray();
|
|
||||||
return new ProtobufReader(bs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static boolean isNoLenBytesType(Type type) {
|
|
||||||
return (type instanceof Class && ((Class) type).isPrimitive())
|
|
||||||
|| type == Boolean.class
|
|
||||||
|| type == Byte.class
|
|
||||||
|| type == Short.class
|
|
||||||
|| type == Character.class
|
|
||||||
|| type == Integer.class
|
|
||||||
|| type == Float.class
|
|
||||||
|| type == Long.class
|
|
||||||
|| type == Double.class
|
|
||||||
|| type == AtomicInteger.class
|
|
||||||
|| type == AtomicLong.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static boolean isSimpleType(Class fieldClass) {
|
protected static boolean isSimpleType(Class fieldClass) {
|
||||||
return fieldClass.isPrimitive()
|
return fieldClass.isPrimitive()
|
||||||
|| fieldClass == Boolean.class
|
|| fieldClass == Boolean.class
|
||||||
@@ -476,23 +438,21 @@ public class ProtobufFactory extends ConvertFactory<ProtobufReader, ProtobufWrit
|
|||||||
public static int wireType(Type javaType, boolean enumtostring) {
|
public static int wireType(Type javaType, boolean enumtostring) {
|
||||||
if (javaType == double.class || javaType == Double.class) {
|
if (javaType == double.class || javaType == Double.class) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
} else if (javaType == float.class || javaType == Float.class) {
|
||||||
if (javaType == float.class || javaType == Float.class) {
|
|
||||||
return 5;
|
return 5;
|
||||||
}
|
} else if ((javaType == boolean.class || javaType == Boolean.class)
|
||||||
if (javaType == boolean.class || javaType == Boolean.class) {
|
|| (javaType == byte.class || javaType == Byte.class)
|
||||||
|
|| (javaType == char.class || javaType == Character.class)
|
||||||
|
|| (javaType == short.class || javaType == Short.class)
|
||||||
|
|| (javaType == int.class || javaType == Integer.class)
|
||||||
|
|| (javaType == long.class || javaType == Long.class)
|
||||||
|
|| (javaType == AtomicInteger.class || javaType == AtomicLong.class)) {
|
||||||
return 0;
|
return 0;
|
||||||
|
} else if (!enumtostring && (javaType instanceof Class) && ((Class) javaType).isEnum()) {
|
||||||
|
return 0;
|
||||||
|
} else { // byte[]
|
||||||
|
return 2;
|
||||||
}
|
}
|
||||||
if (javaType instanceof Class) {
|
|
||||||
Class javaClazz = (Class) javaType;
|
|
||||||
if (javaClazz.isEnum()) {
|
|
||||||
return enumtostring ? 2 : 0;
|
|
||||||
}
|
|
||||||
if (javaClazz.isPrimitive() || Number.class.isAssignableFrom(javaClazz)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String wireTypeString(Type javaType, boolean enumtostring) {
|
public static String wireTypeString(Type javaType, boolean enumtostring) {
|
||||||
|
|||||||
@@ -28,34 +28,23 @@ public class ProtobufMapDecoder<K, V> extends MapDecoder<ProtobufReader, K, V> {
|
|||||||
this.checkInited();
|
this.checkInited();
|
||||||
in.readMapB(member, this.keyDecoder, this.valueDecoder);
|
in.readMapB(member, this.keyDecoder, this.valueDecoder);
|
||||||
final Map<K, V> result = this.creator.create();
|
final Map<K, V> result = this.creator.create();
|
||||||
boolean first = true;
|
|
||||||
Decodeable<ProtobufReader, K> kdecoder = this.keyDecoder;
|
Decodeable<ProtobufReader, K> kdecoder = this.keyDecoder;
|
||||||
Decodeable<ProtobufReader, V> vdecoder = this.valueDecoder;
|
Decodeable<ProtobufReader, V> vdecoder = this.valueDecoder;
|
||||||
|
final int limit = in.limit();
|
||||||
while (in.hasNext()) {
|
while (in.hasNext()) {
|
||||||
ProtobufReader entryReader = getEntryReader(in, member, first);
|
int contentLen = in.readRawVarint32();
|
||||||
if (entryReader == null) {
|
in.limit(in.position() + contentLen + 1);
|
||||||
|
in.readTag();
|
||||||
|
K key = kdecoder.convertFrom(in);
|
||||||
|
in.readTag();
|
||||||
|
V value = vdecoder.convertFrom(in);
|
||||||
|
result.put(key, value);
|
||||||
|
in.limit(limit);
|
||||||
|
if (!in.readNextTag(member)) { // 元素结束
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
entryReader.readTag();
|
|
||||||
K key = kdecoder.convertFrom(entryReader);
|
|
||||||
entryReader.readTag();
|
|
||||||
V value = vdecoder.convertFrom(entryReader);
|
|
||||||
result.put(key, value);
|
|
||||||
first = false;
|
|
||||||
}
|
}
|
||||||
in.readMapE();
|
in.readMapE();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ProtobufReader getEntryReader(ProtobufReader in, DeMember member, boolean first) {
|
|
||||||
if (!first && member != null) {
|
|
||||||
int tag = in.readTag();
|
|
||||||
if (tag != member.getTag()) {
|
|
||||||
in.backTag(tag);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
byte[] bs = in.readByteArray();
|
|
||||||
return new ProtobufReader(bs);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,12 +13,27 @@ import org.redkale.util.*;
|
|||||||
* @author zhangjx
|
* @author zhangjx
|
||||||
* @param <T> T
|
* @param <T> T
|
||||||
*/
|
*/
|
||||||
public class ProtobufObjectDecoder<T> extends ObjectDecoder<ProtobufReader, T> {
|
public class ProtobufObjectDecoder<T> extends ObjectDecoder<ProtobufReader, T>
|
||||||
|
implements TagDecodeable<ProtobufReader, T> {
|
||||||
|
|
||||||
protected ProtobufObjectDecoder(Type type) {
|
protected ProtobufObjectDecoder(Type type) {
|
||||||
super(type);
|
super(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T convertFrom(ProtobufReader in, DeMember member) {
|
||||||
|
if (member == null) {
|
||||||
|
return super.convertFrom(in);
|
||||||
|
} else {
|
||||||
|
final int limit = in.limit();
|
||||||
|
int contentLen = in.readRawVarint32();
|
||||||
|
in.limit(in.position() + contentLen + 1);
|
||||||
|
T result = super.convertFrom(in);
|
||||||
|
in.limit(limit);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void initForEachDeMember(ConvertFactory factory, DeMember member) {
|
protected void initForEachDeMember(ConvertFactory factory, DeMember member) {
|
||||||
if (member.getIndex() < 1) {
|
if (member.getIndex() < 1) {
|
||||||
@@ -30,19 +45,6 @@ public class ProtobufObjectDecoder<T> extends ObjectDecoder<ProtobufReader, T> {
|
|||||||
setTag(member, ProtobufFactory.getTag(attr.field(), attr.genericType(), member.getPosition(), enumtostring));
|
setTag(member, ProtobufFactory.getTag(attr.field(), attr.genericType(), member.getPosition(), enumtostring));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected ProtobufReader objectReader(ProtobufReader in) {
|
|
||||||
if (in.position() > in.initoffset) {
|
|
||||||
return new ProtobufReader(in.readByteArray());
|
|
||||||
}
|
|
||||||
return in;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean hasNext(ProtobufReader in, boolean first) {
|
|
||||||
return in.hasNext();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Object readDeMemberValue(ProtobufReader in, DeMember member, boolean first) {
|
protected Object readDeMemberValue(ProtobufReader in, DeMember member, boolean first) {
|
||||||
Decodeable decoder = member.getDecoder();
|
Decodeable decoder = member.getDecoder();
|
||||||
@@ -62,4 +64,5 @@ public class ProtobufObjectDecoder<T> extends ObjectDecoder<ProtobufReader, T> {
|
|||||||
member.read(in, result);
|
member.read(in, result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,9 +16,11 @@ public class ProtobufReader extends Reader {
|
|||||||
|
|
||||||
protected int position = -1;
|
protected int position = -1;
|
||||||
|
|
||||||
protected int initoffset;
|
protected byte[] content;
|
||||||
|
|
||||||
private byte[] content;
|
//protected int initoffset;
|
||||||
|
|
||||||
|
protected int limit;
|
||||||
|
|
||||||
protected int cacheTag = Integer.MIN_VALUE;
|
protected int cacheTag = Integer.MIN_VALUE;
|
||||||
|
|
||||||
@@ -49,7 +51,8 @@ public class ProtobufReader extends Reader {
|
|||||||
public final void setBytes(byte[] bytes) {
|
public final void setBytes(byte[] bytes) {
|
||||||
if (bytes == null) {
|
if (bytes == null) {
|
||||||
this.position = 0;
|
this.position = 0;
|
||||||
this.initoffset = 0;
|
//this.initoffset = 0;
|
||||||
|
this.limit = 0;
|
||||||
} else {
|
} else {
|
||||||
setBytes(bytes, 0, bytes.length);
|
setBytes(bytes, 0, bytes.length);
|
||||||
}
|
}
|
||||||
@@ -58,17 +61,28 @@ public class ProtobufReader extends Reader {
|
|||||||
public final void setBytes(byte[] bytes, int start, int len) {
|
public final void setBytes(byte[] bytes, int start, int len) {
|
||||||
if (bytes == null) {
|
if (bytes == null) {
|
||||||
this.position = 0;
|
this.position = 0;
|
||||||
this.initoffset = 0;
|
//this.initoffset = 0;
|
||||||
|
this.limit = 0;
|
||||||
} else {
|
} else {
|
||||||
this.content = bytes;
|
this.content = bytes;
|
||||||
this.position = start - 1;
|
this.position = start - 1;
|
||||||
this.initoffset = this.position;
|
this.limit = start + len;
|
||||||
|
//this.initoffset = this.position;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void limit(int limit) {
|
||||||
|
this.limit = limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int limit() {
|
||||||
|
return this.limit;
|
||||||
|
}
|
||||||
|
|
||||||
protected boolean recycle() {
|
protected boolean recycle() {
|
||||||
this.position = -1;
|
this.position = -1;
|
||||||
this.initoffset = -1;
|
this.limit = -1;
|
||||||
|
//this.initoffset = -1;
|
||||||
this.content = null;
|
this.content = null;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -78,11 +92,12 @@ public class ProtobufReader extends Reader {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 通常用于尾部解析
|
||||||
public byte[] remainBytes() {
|
public byte[] remainBytes() {
|
||||||
if (this.position >= this.content.length) {
|
if (this.position >= this.limit) {
|
||||||
return new byte[0];
|
return new byte[0];
|
||||||
}
|
}
|
||||||
return Arrays.copyOfRange(this.content, this.position + 1, this.content.length);
|
return Arrays.copyOfRange(this.content, this.position + 1, this.limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 跳过属性的值 */
|
/** 跳过属性的值 */
|
||||||
@@ -113,7 +128,7 @@ public class ProtobufReader extends Reader {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final String readObjectB(final Class clazz) {
|
public final String readObjectB(final Class clazz) {
|
||||||
return (this.position + 1) < this.content.length ? "" : null;
|
return (this.position + 1) < this.limit ? "" : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -159,13 +174,6 @@ public class ProtobufReader extends Reader {
|
|||||||
return this.position;
|
return this.position;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final int readMemberContentLength(DeMember member, Decodeable decoder) {
|
|
||||||
if (member == null && decoder == null) {
|
|
||||||
return -1; // 为byte[]
|
|
||||||
}
|
|
||||||
return member != null ? -1 : readRawVarint32(); // readUInt32
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final DeMember readFieldName(final DeMemberInfo memberInfo) {
|
public final DeMember readFieldName(final DeMemberInfo memberInfo) {
|
||||||
int tag = readTag();
|
int tag = readTag();
|
||||||
@@ -452,6 +460,18 @@ public class ProtobufReader extends Reader {
|
|||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean readNextTag(DeMember member) {
|
||||||
|
if (!hasNext()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int tag = readTag();
|
||||||
|
if (tag != member.getTag()) { // 元素结束
|
||||||
|
backTag(tag);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
protected final int readTag() {
|
protected final int readTag() {
|
||||||
if (cacheTag != Integer.MIN_VALUE) {
|
if (cacheTag != Integer.MIN_VALUE) {
|
||||||
int tag = cacheTag;
|
int tag = cacheTag;
|
||||||
@@ -471,22 +491,7 @@ public class ProtobufReader extends Reader {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasNext() {
|
public boolean hasNext() {
|
||||||
return (this.position + 1) < this.content.length;
|
return (this.position + 1) < this.limit;
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 判断对象是否存在下一个属性或者数组是否存在下一个元素
|
|
||||||
*
|
|
||||||
* @param startPosition 起始位置
|
|
||||||
* @param contentLength 内容大小, 不确定的传-1
|
|
||||||
* @return 是否存在
|
|
||||||
*/
|
|
||||||
public boolean hasNext(int startPosition, int contentLength) {
|
|
||||||
// ("-------------: " + startPosition + ", " + contentLength + ", " + this.position);
|
|
||||||
if (startPosition >= 0 && contentLength >= 0) {
|
|
||||||
return (this.position) < (startPosition + contentLength);
|
|
||||||
}
|
|
||||||
return (this.position + 1) < this.content.length;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -503,7 +508,7 @@ public class ProtobufReader extends Reader {
|
|||||||
fastpath:
|
fastpath:
|
||||||
{
|
{
|
||||||
int curr = this.position;
|
int curr = this.position;
|
||||||
if ((curr + 1) == data.length) {
|
if ((curr + 1) == limit) {
|
||||||
break fastpath;
|
break fastpath;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -511,7 +516,7 @@ public class ProtobufReader extends Reader {
|
|||||||
if ((x = data[++curr]) >= 0) {
|
if ((x = data[++curr]) >= 0) {
|
||||||
this.position = curr;
|
this.position = curr;
|
||||||
return x;
|
return x;
|
||||||
} else if (data.length - (curr + 1) < 9) {
|
} else if (limit - (curr + 1) < 9) {
|
||||||
break fastpath;
|
break fastpath;
|
||||||
} else if ((x ^= (data[++curr] << 7)) < 0) {
|
} else if ((x ^= (data[++curr] << 7)) < 0) {
|
||||||
x ^= (~0 << 7);
|
x ^= (~0 << 7);
|
||||||
@@ -543,7 +548,7 @@ public class ProtobufReader extends Reader {
|
|||||||
fastpath:
|
fastpath:
|
||||||
{
|
{
|
||||||
int curr = this.position;
|
int curr = this.position;
|
||||||
if ((curr + 1) == data.length) {
|
if ((curr + 1) == this.limit) {
|
||||||
break fastpath;
|
break fastpath;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -552,7 +557,7 @@ public class ProtobufReader extends Reader {
|
|||||||
if ((y = data[++curr]) >= 0) {
|
if ((y = data[++curr]) >= 0) {
|
||||||
this.position = curr;
|
this.position = curr;
|
||||||
return y;
|
return y;
|
||||||
} else if (data.length - (curr + 1) < 9) {
|
} else if (this.limit - (curr + 1) < 9) {
|
||||||
break fastpath;
|
break fastpath;
|
||||||
} else if ((y ^= (data[++curr] << 7)) < 0) {
|
} else if ((y ^= (data[++curr] << 7)) < 0) {
|
||||||
x = y ^ (~0 << 7);
|
x = y ^ (~0 << 7);
|
||||||
|
|||||||
@@ -26,25 +26,23 @@ public class ProtobufStreamDecoder<T> extends StreamDecoder<ProtobufReader, T> {
|
|||||||
@Override
|
@Override
|
||||||
public Stream<T> convertFrom(ProtobufReader in, DeMember member) {
|
public Stream<T> convertFrom(ProtobufReader in, DeMember member) {
|
||||||
this.checkInited();
|
this.checkInited();
|
||||||
|
final boolean simpled = !this.componentSimpled;
|
||||||
final Decodeable<ProtobufReader, T> itemDecoder = this.componentDecoder;
|
final Decodeable<ProtobufReader, T> itemDecoder = this.componentDecoder;
|
||||||
in.readArrayB(member, itemDecoder);
|
in.readArrayB(member, itemDecoder);
|
||||||
int contentLength = in.readMemberContentLength(member, itemDecoder);
|
|
||||||
final List<T> result = new ArrayList();
|
final List<T> result = new ArrayList();
|
||||||
boolean first = true;
|
final int limit = in.limit();
|
||||||
int startPosition = in.position();
|
while (in.hasNext()) {
|
||||||
while (in.hasNext(startPosition, contentLength)) {
|
if (!simpled) {
|
||||||
ProtobufReader itemReader = getItemReader(in, member, first);
|
int contentLen = in.readRawVarint32();
|
||||||
if (itemReader == null) { // 元素读取完毕
|
in.limit(in.position() + contentLen + 1);
|
||||||
|
}
|
||||||
|
result.add(itemDecoder.convertFrom(in));
|
||||||
|
in.limit(limit);
|
||||||
|
if (!in.readNextTag(member)) { // 元素结束
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
result.add(itemDecoder.convertFrom(itemReader));
|
|
||||||
first = false;
|
|
||||||
}
|
}
|
||||||
in.readArrayE();
|
in.readArrayE();
|
||||||
return result.stream();
|
return result.stream();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ProtobufReader getItemReader(ProtobufReader in, DeMember member, boolean first) {
|
|
||||||
return ProtobufFactory.getItemReader(in, member, componentSimpled, first);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3562,6 +3562,18 @@ public final class Utility {
|
|||||||
* @param bytes 字节数组
|
* @param bytes 字节数组
|
||||||
*/
|
*/
|
||||||
public static void println(String string, byte... bytes) {
|
public static void println(String string, byte... bytes) {
|
||||||
|
println(string, bytes, 0, bytes.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将字节数组的内容转换成字符串并打印到控制台, string参数不为空时会追加在字节数组内容字符串之前
|
||||||
|
*
|
||||||
|
* @param string 字符串前缀
|
||||||
|
* @param bytes 字节数组
|
||||||
|
* @param start 起始位置
|
||||||
|
* @param len 长度
|
||||||
|
*/
|
||||||
|
public static void println(String string, byte[] bytes, int start, int len) {
|
||||||
if (bytes == null) {
|
if (bytes == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -3569,9 +3581,10 @@ public final class Utility {
|
|||||||
if (string != null) {
|
if (string != null) {
|
||||||
sb.append(string);
|
sb.append(string);
|
||||||
}
|
}
|
||||||
sb.append(bytes.length).append(".[");
|
sb.append(len).append(".[");
|
||||||
boolean last = false;
|
boolean last = false;
|
||||||
for (byte b : bytes) {
|
for (int i = 0; i < len; i++) {
|
||||||
|
byte b = bytes[start + i];
|
||||||
if (last) {
|
if (last) {
|
||||||
sb.append(',');
|
sb.append(',');
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user