mirror of
https://github.com/usatiuk/dhfs.git
synced 2025-10-29 04:57:48 +01:00
autoprotomap: record support
This commit is contained in:
@@ -14,6 +14,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
import java.util.function.Function;
|
||||||
import java.util.function.IntConsumer;
|
import java.util.function.IntConsumer;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@@ -61,7 +62,7 @@ public class ProtoSerializerGenerator {
|
|||||||
visitor.accept(cur);
|
visitor.accept(cur);
|
||||||
|
|
||||||
var next = cur.superClassType().name();
|
var next = cur.superClassType().name();
|
||||||
if (next.equals(DotName.OBJECT_NAME)) break;
|
if (next.equals(DotName.OBJECT_NAME) || next.equals(DotName.RECORD_NAME)) break;
|
||||||
cur = index.getClassByName(next);
|
cur = index.getClassByName(next);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -82,6 +83,10 @@ public class ProtoSerializerGenerator {
|
|||||||
|
|
||||||
var objectClass = index.getClassByName(objectType.name().toString());
|
var objectClass = index.getClassByName(objectType.name().toString());
|
||||||
|
|
||||||
|
Function<String, String> getterGetter = objectClass.isRecord()
|
||||||
|
? Function.identity()
|
||||||
|
: s -> "get" + capitalize(stripPrefix(s, FIELD_PREFIX));
|
||||||
|
|
||||||
for (var f : findAllFields(index, objectClass)) {
|
for (var f : findAllFields(index, objectClass)) {
|
||||||
var consideredFieldName = stripPrefix(f.name(), FIELD_PREFIX);
|
var consideredFieldName = stripPrefix(f.name(), FIELD_PREFIX);
|
||||||
|
|
||||||
@@ -89,7 +94,7 @@ public class ProtoSerializerGenerator {
|
|||||||
if ((f.flags() & Opcodes.ACC_PUBLIC) != 0)
|
if ((f.flags() & Opcodes.ACC_PUBLIC) != 0)
|
||||||
return bytecodeCreator.readInstanceField(f, object);
|
return bytecodeCreator.readInstanceField(f, object);
|
||||||
else {
|
else {
|
||||||
var fieldGetter = "get" + capitalize(stripPrefix(f.name(), FIELD_PREFIX));
|
var fieldGetter = getterGetter.apply(f.name());
|
||||||
return bytecodeCreator.invokeVirtualMethod(
|
return bytecodeCreator.invokeVirtualMethod(
|
||||||
MethodDescriptor.ofMethod(objectType.toString(), fieldGetter, f.type().name().toString()), object);
|
MethodDescriptor.ofMethod(objectType.toString(), fieldGetter, f.type().name().toString()), object);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package com.usatiuk.autoprotomap.it;
|
||||||
|
|
||||||
|
import com.usatiuk.autoprotomap.runtime.ProtoMirror;
|
||||||
|
|
||||||
|
@ProtoMirror(InterfaceObjectProto.class)
|
||||||
|
public interface InterfaceObject {
|
||||||
|
String key();
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package com.usatiuk.autoprotomap.it;
|
||||||
|
|
||||||
|
import com.usatiuk.autoprotomap.runtime.ProtoMirror;
|
||||||
|
|
||||||
|
@ProtoMirror(RecordObjectProto.class)
|
||||||
|
public record RecordObject(String key) implements InterfaceObject {
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package com.usatiuk.autoprotomap.it;
|
||||||
|
|
||||||
|
import com.usatiuk.autoprotomap.runtime.ProtoMirror;
|
||||||
|
|
||||||
|
@ProtoMirror(RecordObject2Proto.class)
|
||||||
|
public record RecordObject2(String key, int value) implements InterfaceObject {
|
||||||
|
}
|
||||||
@@ -28,4 +28,20 @@ message AbstractProto {
|
|||||||
SimpleObjectProto simpleObject = 2;
|
SimpleObjectProto simpleObject = 2;
|
||||||
CustomObjectProto customObject = 3;
|
CustomObjectProto customObject = 3;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
message RecordObjectProto {
|
||||||
|
string key = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message RecordObject2Proto {
|
||||||
|
string key = 1;
|
||||||
|
int32 value = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message InterfaceObjectProto {
|
||||||
|
oneof obj {
|
||||||
|
RecordObjectProto recordObject = 1;
|
||||||
|
RecordObject2Proto recordObject2 = 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -16,6 +16,8 @@ public class AutoprotomapResourceTest {
|
|||||||
ProtoSerializer<NestedObjectProto, NestedObject> nestedProtoSerializer;
|
ProtoSerializer<NestedObjectProto, NestedObject> nestedProtoSerializer;
|
||||||
@Inject
|
@Inject
|
||||||
ProtoSerializer<AbstractProto, AbstractObject> abstractProtoSerializer;
|
ProtoSerializer<AbstractProto, AbstractObject> abstractProtoSerializer;
|
||||||
|
@Inject
|
||||||
|
ProtoSerializer<InterfaceObjectProto, InterfaceObject> interfaceProtoSerializer;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSimple() {
|
public void testSimple() {
|
||||||
@@ -74,7 +76,7 @@ public class AutoprotomapResourceTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void tesAbstractNested() {
|
public void testAbstractNested() {
|
||||||
var ret = abstractProtoSerializer.serialize(
|
var ret = abstractProtoSerializer.serialize(
|
||||||
new NestedObject(
|
new NestedObject(
|
||||||
new SimpleObject(333, "nested so", ByteString.copyFrom(new byte[]{1, 2, 3})),
|
new SimpleObject(333, "nested so", ByteString.copyFrom(new byte[]{1, 2, 3})),
|
||||||
@@ -93,4 +95,19 @@ public class AutoprotomapResourceTest {
|
|||||||
Assertions.assertEquals("nested obj", des.get_nestedName());
|
Assertions.assertEquals("nested obj", des.get_nestedName());
|
||||||
Assertions.assertEquals(ByteString.copyFrom(new byte[]{4, 5, 6}), des.get_nestedSomeBytes());
|
Assertions.assertEquals(ByteString.copyFrom(new byte[]{4, 5, 6}), des.get_nestedSomeBytes());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testInterface() {
|
||||||
|
var ret = interfaceProtoSerializer.serialize(new RecordObject("record test"));
|
||||||
|
Assertions.assertEquals("record test", ret.getRecordObject().getKey());
|
||||||
|
var des = (RecordObject) interfaceProtoSerializer.deserialize(ret);
|
||||||
|
Assertions.assertEquals("record test", des.key());
|
||||||
|
|
||||||
|
var ret2 = interfaceProtoSerializer.serialize(new RecordObject2("record test 2", 1234));
|
||||||
|
Assertions.assertEquals("record test 2", ret2.getRecordObject2().getKey());
|
||||||
|
Assertions.assertEquals(1234, ret2.getRecordObject2().getValue());
|
||||||
|
var des2 = (RecordObject2) interfaceProtoSerializer.deserialize(ret2);
|
||||||
|
Assertions.assertEquals("record test 2", des2.key());
|
||||||
|
Assertions.assertEquals(1234, des2.value());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user