fix(serialize-generator): A large number of fixes for incorrectly carried over gson stuff
This commit is contained in:
parent
988aefe96d
commit
54f16611cc
|
@ -10,13 +10,13 @@ import io.gitlab.jfronny.commons.serialize.SerializeWriter;
|
|||
* @param <T> The type of the object to serialize/deserialize
|
||||
*/
|
||||
public abstract class TypeAdapter<T> {
|
||||
public abstract <TEx extends Throwable, Writer extends SerializeWriter<TEx, Writer>> void serialize(T value, Writer writer) throws TEx, MalformedDataException;
|
||||
public abstract <TEx extends Throwable, Reader extends SerializeReader<TEx, Reader>> T deserialize(Reader reader) throws TEx, MalformedDataException;
|
||||
public abstract <TEx extends Exception, Writer extends SerializeWriter<TEx, Writer>> void serialize(T value, Writer writer) throws TEx, MalformedDataException;
|
||||
public abstract <TEx extends Exception, Reader extends SerializeReader<TEx, Reader>> T deserialize(Reader reader) throws TEx, MalformedDataException;
|
||||
|
||||
public final TypeAdapter<T> nullSafe() {
|
||||
return new TypeAdapter<>() {
|
||||
@Override
|
||||
public <TEx extends Throwable, Writer extends SerializeWriter<TEx, Writer>> void serialize(T value, Writer writer) throws TEx, MalformedDataException {
|
||||
public <TEx extends Exception, Writer extends SerializeWriter<TEx, Writer>> void serialize(T value, Writer writer) throws TEx, MalformedDataException {
|
||||
if (value == null) {
|
||||
writer.nullValue();
|
||||
} else {
|
||||
|
@ -25,7 +25,7 @@ public abstract class TypeAdapter<T> {
|
|||
}
|
||||
|
||||
@Override
|
||||
public <TEx extends Throwable, Reader extends SerializeReader<TEx, Reader>> T deserialize(Reader reader) throws TEx, MalformedDataException {
|
||||
public <TEx extends Exception, Reader extends SerializeReader<TEx, Reader>> T deserialize(Reader reader) throws TEx, MalformedDataException {
|
||||
if (reader.peek() == null) {
|
||||
reader.nextNull();
|
||||
return null;
|
||||
|
|
|
@ -9,6 +9,7 @@ repositories {
|
|||
|
||||
dependencies {
|
||||
implementation(projects.commonsSerialize)
|
||||
implementation(projects.commonsSerializeDatabindApi)
|
||||
compileOnly(projects.commonsSerializeGeneratorAnnotations)
|
||||
annotationProcessor(projects.commonsSerializeGenerator)
|
||||
}
|
||||
|
|
|
@ -4,11 +4,11 @@ import io.gitlab.jfronny.commons.serialize.SerializeReader;
|
|||
import io.gitlab.jfronny.commons.serialize.SerializeWriter;
|
||||
|
||||
public class ExampleAdapter {
|
||||
public static <TEx extends Throwable, Writer extends SerializeWriter<TEx, Writer>> void write(boolean bool, Writer writer) throws TEx {
|
||||
public static <TEx extends Exception, Writer extends SerializeWriter<TEx, Writer>> void serialize(boolean bool, Writer writer) throws TEx {
|
||||
writer.value(!bool);
|
||||
}
|
||||
|
||||
public static <TEx extends Throwable, Reader extends SerializeReader<TEx, Reader>> boolean read(Reader reader) throws TEx {
|
||||
public static <TEx extends Exception, Reader extends SerializeReader<TEx, Reader>> boolean deserialize(Reader reader) throws TEx {
|
||||
return !reader.nextBoolean();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -130,11 +130,11 @@ public class Main {
|
|||
}
|
||||
|
||||
public static class Configuration {
|
||||
public static <TEx extends Throwable, Writer extends SerializeWriter<TEx, Writer>> void configure(Writer writer) {
|
||||
public static <TEx extends Exception, Writer extends SerializeWriter<TEx, Writer>> void configure(Writer writer) {
|
||||
|
||||
}
|
||||
|
||||
public static <TEx extends Throwable, Reader extends SerializeReader<TEx, Reader>> void configure(Reader reader) {
|
||||
public static <TEx extends Exception, Reader extends SerializeReader<TEx, Reader>> void configure(Reader reader) {
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
module io.gitlab.jfronny.commons.serialize.generator.example {
|
||||
requires static io.gitlab.jfronny.commons.serialize.generator.annotations;
|
||||
requires io.gitlab.jfronny.commons;
|
||||
requires io.gitlab.jfronny.commons.serialize;
|
||||
requires io.gitlab.jfronny.commons.serialize.databind.api;
|
||||
exports io.gitlab.jfronny.commons.serialize.generator.example;
|
||||
|
|
|
@ -12,6 +12,7 @@ public class Cl {
|
|||
public static final ClassName GSON_TOKEN = ClassName.get("io.gitlab.jfronny.commons.serialize", "Token");
|
||||
public static final ClassName SERIALIZED_NAME = ClassName.get("io.gitlab.jfronny.commons.serialize.annotations", "SerializedName");
|
||||
public static final ClassName MALFORMED_DATA_EXCEPTION = ClassName.get("io.gitlab.jfronny.commons.serialize", "MalformedDataException");
|
||||
public static final ClassName TRANSPORT = ClassName.get("io.gitlab.jfronny.commons.serialize", "Transport");
|
||||
|
||||
// Databind Interop
|
||||
public static final ClassName TYPE_ADAPTER = ClassName.get("io.gitlab.jfronny.commons.serialize.databind.api", "TypeAdapter");
|
||||
|
|
|
@ -17,7 +17,7 @@ public abstract class AdapterAdapter<T extends AdapterAdapter<T>.Hydrated> exten
|
|||
@Override
|
||||
public void generateWrite(Runnable writeGet) {
|
||||
Object adapter = getAdapter();
|
||||
code.add("$" + (adapter instanceof String ? "L" : "T") + ".write(", adapter);
|
||||
code.add("$" + (adapter instanceof String ? "L" : "T") + ".serialize(", adapter);
|
||||
writeGet.run();
|
||||
code.add(", writer);\n");
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ public abstract class AdapterAdapter<T extends AdapterAdapter<T>.Hydrated> exten
|
|||
@Override
|
||||
public void generateRead() {
|
||||
Object adapter = getAdapter();
|
||||
code.add("$" + (adapter instanceof String ? "L" : "T") + ".read(reader)", adapter);
|
||||
code.add("$" + (adapter instanceof String ? "L" : "T") + ".deserialize(reader)", adapter);
|
||||
}
|
||||
|
||||
private Object getAdapter() {
|
||||
|
@ -66,7 +66,7 @@ public abstract class AdapterAdapter<T extends AdapterAdapter<T>.Hydrated> exten
|
|||
if (allowClassType) {
|
||||
code.add("$T.class", typeName);
|
||||
} else {
|
||||
code.add("TypeToken.get($T.class)", typeName);
|
||||
code.add("$T.get($T.class)", Cl.TYPE_TOKEN, typeName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,7 +40,7 @@ public class ArrayAdapter extends Adapter<ArrayAdapter.Hydrated> {
|
|||
writeGet.run();
|
||||
code.beginControlFlow(")")
|
||||
.beginControlFlow("if ($N == null)", argName)
|
||||
.addStatement("if (writer.getSerializeNulls()) writer.nullValue()")
|
||||
.addStatement("if (writer.isSerializeNulls()) writer.nullValue()")
|
||||
.nextControlFlow("else");
|
||||
generateWrite(code, componentType, argName, componentType.getAnnotationMirrors(), () -> code.add(argName));
|
||||
code.endControlFlow().endControlFlow();
|
||||
|
@ -70,7 +70,7 @@ public class ArrayAdapter extends Adapter<ArrayAdapter.Hydrated> {
|
|||
.addStatement("reader.endArray()")
|
||||
.addStatement("return list.toArray($T[]::new)", componentType);
|
||||
|
||||
String methodName = "read$" + name;
|
||||
String methodName = "deserialize$" + name;
|
||||
klazz.addMethod(
|
||||
MethodSpec.methodBuilder(methodName)
|
||||
.addModifiers(Modifier.PRIVATE, Modifier.STATIC)
|
||||
|
|
|
@ -72,7 +72,7 @@ public class CollectionAdapter extends Adapter<CollectionAdapter.Hydrated> {
|
|||
writeGet.run();
|
||||
code.beginControlFlow(")")
|
||||
.beginControlFlow("if ($N == null)", argName)
|
||||
.addStatement("if (writer.getSerializeNulls()) writer.nullValue()")
|
||||
.addStatement("if (writer.isSerializeNulls()) writer.nullValue()")
|
||||
.nextControlFlow("else");
|
||||
generateWrite(code, componentType, argName, componentType.getAnnotationMirrors(), () -> code.add(argName));
|
||||
code.endControlFlow().endControlFlow().addStatement("writer.endArray()");
|
||||
|
|
|
@ -140,7 +140,7 @@ public class MapAdapter extends Adapter<MapAdapter.Hydrated> {
|
|||
code.add("for ($T.Entry<$T, $T> $N : (", Map.class, componentType1, componentType2, argName);
|
||||
writeGet.run();
|
||||
code.beginControlFlow(").entrySet())")
|
||||
.beginControlFlow("if ($N.getKey() != null || writer.getSerializeNulls())", argName)
|
||||
.beginControlFlow("if ($N.getKey() != null || writer.isSerializeNulls())", argName)
|
||||
.add("writer.name(");
|
||||
if (isEnum(componentType1)) {
|
||||
code.add("$N.getKey() == null ? \"null\" : $N.getKey().name()", argName, argName);
|
||||
|
@ -150,7 +150,7 @@ public class MapAdapter extends Adapter<MapAdapter.Hydrated> {
|
|||
code.addStatement(")")
|
||||
.addStatement("$T value$N = $N.getValue()", componentType2, argName, argName)
|
||||
.beginControlFlow("if (value$N == null)", argName)
|
||||
.addStatement("if (writer.getSerializeNulls()) writer.nullValue()")
|
||||
.addStatement("if (writer.isSerializeNulls()) writer.nullValue()")
|
||||
.nextControlFlow("else");
|
||||
generateWrite(code, componentType2, "value" + argName, componentType2.getAnnotationMirrors(), () -> code.add("value" + argName));
|
||||
code.endControlFlow().endControlFlow().endControlFlow().addStatement("writer.endObject()");
|
||||
|
|
|
@ -27,7 +27,9 @@ public abstract class GProcessor {
|
|||
|
||||
private final boolean isStatic;
|
||||
private final String readStatement;
|
||||
private final String readStatementT;
|
||||
private final String writeStatement;
|
||||
private final String writeStatementT;
|
||||
private final boolean disableSafe;
|
||||
|
||||
public GProcessor(ValueCreator valueCreator, Messager message, boolean hasManifold, boolean isStatic, boolean disableSafe) {
|
||||
|
@ -37,8 +39,10 @@ public abstract class GProcessor {
|
|||
this.disableSafe = disableSafe;
|
||||
|
||||
this.isStatic = isStatic;
|
||||
this.readStatement = isStatic ? "read(reader)" : "return read(reader)";
|
||||
this.writeStatement = isStatic ? "write(writer)" : "write(value, writer)";
|
||||
this.readStatement = isStatic ? "deserialize(reader)" : "return deserialize(reader)";
|
||||
this.readStatementT = isStatic ? "deserialize(reader, transport)" : "return deserialize(reader, transport)";
|
||||
this.writeStatement = isStatic ? "serialize(writer)" : "serialize(value, writer)";
|
||||
this.writeStatementT = isStatic ? "serialize(writer, transport)" : "serialize(value, writer, transport)";
|
||||
}
|
||||
|
||||
public abstract ClassName generateDelegatingAdapter(TypeSpec.Builder spec, TypeName classType, ClassName generatedClassName);
|
||||
|
@ -63,8 +67,7 @@ public abstract class GProcessor {
|
|||
if (hasManifold) {
|
||||
method.addAnnotation(Cl.MANIFOLD_EXTENSION);
|
||||
method.addParameter(ParameterSpec.builder(thizName, "value").addAnnotation(Cl.MANIFOLD_THIS).build());
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
method.addParameter(thizName, "value");
|
||||
}
|
||||
return method;
|
||||
|
@ -88,19 +91,23 @@ public abstract class GProcessor {
|
|||
);
|
||||
}
|
||||
spec.addMethod(
|
||||
extension(MethodSpec.methodBuilder("read"))
|
||||
extension(MethodSpec.methodBuilder("deserialize"))
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||
.addParameter(Cl.SERIALIZE_READER, "reader")
|
||||
.addException(IOException.class)
|
||||
.addTypeVariable(TypeVariableName.get("TEx", Exception.class))
|
||||
.addTypeVariable(TypeVariableName.get("Reader", ParameterizedTypeName.get(Cl.SERIALIZE_READER, TypeVariableName.get("TEx"), TypeVariableName.get("Reader"))))
|
||||
.addParameter(TypeVariableName.get("Reader"), "reader")
|
||||
.addException(TypeVariableName.get("TEx"))
|
||||
.returns(isStatic ? TypeName.VOID : classType)
|
||||
.addCode(isStatic ? this.isStatic ? "$T.read(reader);" : "return $T.read(reader);" : this.isStatic ? "$L.read(reader);" : "return $L.read(reader);", isStatic ? adapter : "adapter")
|
||||
.addCode(isStatic ? this.isStatic ? "$T.deserialize(reader);" : "return $T.deserialize(reader);" : this.isStatic ? "$L.deserialize(reader);" : "return $L.deserialize(reader);", isStatic ? adapter : "adapter")
|
||||
.build()
|
||||
);
|
||||
spec.addMethod(
|
||||
extension(MethodSpec.methodBuilder("write"), this.isStatic ? null : classType)
|
||||
extension(MethodSpec.methodBuilder("serialize"), this.isStatic ? null : classType)
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||
.addParameter(Cl.SERIALIZE_WRITER, "writer")
|
||||
.addException(IOException.class)
|
||||
.addTypeVariable(TypeVariableName.get("TEx", Exception.class))
|
||||
.addTypeVariable(TypeVariableName.get("Writer", ParameterizedTypeName.get(Cl.SERIALIZE_WRITER, TypeVariableName.get("TEx"), TypeVariableName.get("Writer"))))
|
||||
.addParameter(TypeVariableName.get("Writer"), "writer")
|
||||
.addException(TypeVariableName.get("TEx"))
|
||||
.addCode(isStatic ? "$T.$L;" : "$L.$L", isStatic ? adapter : "adapter", writeStatement)
|
||||
.build()
|
||||
);
|
||||
|
@ -117,12 +124,16 @@ public abstract class GProcessor {
|
|||
};
|
||||
|
||||
spec.addMethod(
|
||||
extension(MethodSpec.methodBuilder("read"))
|
||||
extension(MethodSpec.methodBuilder("deserialize"))
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||
.addTypeVariable(TypeVariableName.get("TEx", Exception.class))
|
||||
.addTypeVariable(TypeVariableName.get("Reader", ParameterizedTypeName.get(Cl.SERIALIZE_READER, TypeVariableName.get("TEx"), TypeVariableName.get("Reader"))))
|
||||
.addTypeVariable(TypeVariableName.get("Writer", ParameterizedTypeName.get(Cl.SERIALIZE_WRITER, TypeVariableName.get("TEx"), TypeVariableName.get("Writer"))))
|
||||
.addParameter(TypeName.get(Reader.class), "in")
|
||||
.addException(IOException.class)
|
||||
.addParameter(ParameterizedTypeName.get(Cl.TRANSPORT, TypeVariableName.get("TEx"), TypeVariableName.get("Reader"), TypeVariableName.get("Writer")), "transport")
|
||||
.addException(TypeVariableName.get("TEx"))
|
||||
.returns(isStatic ? TypeName.VOID : classType)
|
||||
.addCode(configureReader.apply(CodeBlock.builder().beginControlFlow("try ($1T reader = new $1T(in))", Cl.SERIALIZE_READER))
|
||||
.addCode(configureReader.apply(CodeBlock.builder().beginControlFlow("try ($T reader = transport.createReader(in))", Cl.SERIALIZE_READER))
|
||||
.addStatement(readStatement)
|
||||
.endControlFlow()
|
||||
.build())
|
||||
|
@ -130,23 +141,27 @@ public abstract class GProcessor {
|
|||
);
|
||||
|
||||
spec.addMethod(
|
||||
extension(MethodSpec.methodBuilder("read"))
|
||||
extension(MethodSpec.methodBuilder("deserialize"))
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||
.addParameter(TypeName.get(String.class), "json")
|
||||
.addException(IOException.class)
|
||||
.addTypeVariable(TypeVariableName.get("TEx", Exception.class))
|
||||
.addTypeVariable(TypeVariableName.get("Reader", ParameterizedTypeName.get(Cl.SERIALIZE_READER, TypeVariableName.get("TEx"), TypeVariableName.get("Reader"))))
|
||||
.addTypeVariable(TypeVariableName.get("Writer", ParameterizedTypeName.get(Cl.SERIALIZE_WRITER, TypeVariableName.get("TEx"), TypeVariableName.get("Writer"))))
|
||||
.addParameter(ParameterizedTypeName.get(Cl.TRANSPORT, TypeVariableName.get("TEx"), TypeVariableName.get("Reader"), TypeVariableName.get("Writer")), "transport")
|
||||
.addException(TypeVariableName.get("TEx"))
|
||||
.returns(isStatic ? TypeName.VOID : classType)
|
||||
.addCode(CodeBlock.builder().beginControlFlow("try ($1T reader = new $1T(json))", StringReader.class)
|
||||
.addStatement(readStatement)
|
||||
.addStatement(readStatementT)
|
||||
.endControlFlow()
|
||||
.build())
|
||||
.build()
|
||||
);
|
||||
|
||||
spec.addMethod(
|
||||
extension(MethodSpec.methodBuilder("read"))
|
||||
extension(MethodSpec.methodBuilder("deserialize"))
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||
.addParameter(Cl.GSON_ELEMENT, "tree")
|
||||
.addException(IOException.class)
|
||||
.addException(Cl.MALFORMED_DATA_EXCEPTION)
|
||||
.returns(isStatic ? TypeName.VOID : classType)
|
||||
.addCode(configureReader.apply(CodeBlock.builder().beginControlFlow("try ($1T reader = new $1T(tree))", Cl.EMULATED_READER))
|
||||
.addStatement(readStatement)
|
||||
|
@ -156,24 +171,33 @@ public abstract class GProcessor {
|
|||
);
|
||||
|
||||
spec.addMethod(
|
||||
extension(MethodSpec.methodBuilder("read"))
|
||||
extension(MethodSpec.methodBuilder("deserialize"))
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||
.addParameter(Path.class, "path")
|
||||
.addTypeVariable(TypeVariableName.get("TEx", Exception.class))
|
||||
.addTypeVariable(TypeVariableName.get("Reader", ParameterizedTypeName.get(Cl.SERIALIZE_READER, TypeVariableName.get("TEx"), TypeVariableName.get("Reader"))))
|
||||
.addTypeVariable(TypeVariableName.get("Writer", ParameterizedTypeName.get(Cl.SERIALIZE_WRITER, TypeVariableName.get("TEx"), TypeVariableName.get("Writer"))))
|
||||
.addParameter(ParameterizedTypeName.get(Cl.TRANSPORT, TypeVariableName.get("TEx"), TypeVariableName.get("Reader"), TypeVariableName.get("Writer")), "transport")
|
||||
.addException(TypeVariableName.get("TEx"))
|
||||
.addException(IOException.class)
|
||||
.returns(isStatic ? TypeName.VOID : classType)
|
||||
.addCode(CodeBlock.builder().beginControlFlow("try ($T reader = $T.newBufferedReader(path))", BufferedReader.class, Files.class)
|
||||
.addStatement(readStatement)
|
||||
.addStatement(readStatementT)
|
||||
.endControlFlow()
|
||||
.build())
|
||||
.build()
|
||||
);
|
||||
|
||||
spec.addMethod(
|
||||
extension(MethodSpec.methodBuilder("write"), isStatic ? null : classType)
|
||||
extension(MethodSpec.methodBuilder("serialize"), isStatic ? null : classType)
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||
.addParameter(Writer.class, "out")
|
||||
.addException(IOException.class)
|
||||
.addCode(configureWriter.apply(CodeBlock.builder().beginControlFlow("try ($1T writer = new $1T(out))", Cl.SERIALIZE_WRITER))
|
||||
.addTypeVariable(TypeVariableName.get("TEx", Exception.class))
|
||||
.addTypeVariable(TypeVariableName.get("Reader", ParameterizedTypeName.get(Cl.SERIALIZE_READER, TypeVariableName.get("TEx"), TypeVariableName.get("Reader"))))
|
||||
.addTypeVariable(TypeVariableName.get("Writer", ParameterizedTypeName.get(Cl.SERIALIZE_WRITER, TypeVariableName.get("TEx"), TypeVariableName.get("Writer"))))
|
||||
.addParameter(ParameterizedTypeName.get(Cl.TRANSPORT, TypeVariableName.get("TEx"), TypeVariableName.get("Reader"), TypeVariableName.get("Writer")), "transport")
|
||||
.addException(TypeVariableName.get("TEx"))
|
||||
.addCode(configureWriter.apply(CodeBlock.builder().beginControlFlow("try ($T writer = transport.createWriter(out))", Cl.SERIALIZE_WRITER))
|
||||
.addStatement(writeStatement)
|
||||
.endControlFlow()
|
||||
.build())
|
||||
|
@ -181,17 +205,22 @@ public abstract class GProcessor {
|
|||
);
|
||||
|
||||
spec.addMethod(
|
||||
extension(MethodSpec.methodBuilder("write"), isStatic ? null : classType)
|
||||
extension(MethodSpec.methodBuilder("serialize"), isStatic ? null : classType)
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||
.addParameter(Path.class, "path")
|
||||
.addTypeVariable(TypeVariableName.get("TEx", Exception.class))
|
||||
.addTypeVariable(TypeVariableName.get("Reader", ParameterizedTypeName.get(Cl.SERIALIZE_READER, TypeVariableName.get("TEx"), TypeVariableName.get("Reader"))))
|
||||
.addTypeVariable(TypeVariableName.get("Writer", ParameterizedTypeName.get(Cl.SERIALIZE_WRITER, TypeVariableName.get("TEx"), TypeVariableName.get("Writer"))))
|
||||
.addParameter(ParameterizedTypeName.get(Cl.TRANSPORT, TypeVariableName.get("TEx"), TypeVariableName.get("Reader"), TypeVariableName.get("Writer")), "transport")
|
||||
.addException(TypeVariableName.get("TEx"))
|
||||
.addException(IOException.class)
|
||||
.addCode(disableSafe ? CodeBlock.builder().beginControlFlow("try ($1T writer = $2T.newBufferedWriter(path, $3T.CREATE, $3T.WRITE, $3T.TRUNCATE_EXISTING))", BufferedWriter.class, Files.class, StandardOpenOption.class)
|
||||
.addStatement(writeStatement)
|
||||
.addStatement(writeStatementT)
|
||||
.endControlFlow()
|
||||
.build() : CodeBlock.builder()
|
||||
.addStatement("$T temp = $T.createTempFile($S, $S)", Path.class, Files.class, "serializegenerator-", ".json")
|
||||
.beginControlFlow("try ($1T writer = $2T.newBufferedWriter(temp, $3T.CREATE, $3T.WRITE, $3T.TRUNCATE_EXISTING))", BufferedWriter.class, Files.class, StandardOpenOption.class)
|
||||
.addStatement(writeStatement)
|
||||
.addStatement(writeStatementT)
|
||||
.addStatement("$T.move(temp, path, $T.REPLACE_EXISTING)", Files.class, StandardCopyOption.class)
|
||||
.nextControlFlow("finally")
|
||||
.addStatement("$T.deleteIfExists(temp)", Files.class)
|
||||
|
@ -201,12 +230,17 @@ public abstract class GProcessor {
|
|||
);
|
||||
|
||||
spec.addMethod(
|
||||
extension(MethodSpec.methodBuilder("toJson"), isStatic ? null : classType)
|
||||
extension(MethodSpec.methodBuilder("serializeToString"), isStatic ? null : classType)
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||
.addTypeVariable(TypeVariableName.get("TEx", Exception.class))
|
||||
.addTypeVariable(TypeVariableName.get("Reader", ParameterizedTypeName.get(Cl.SERIALIZE_READER, TypeVariableName.get("TEx"), TypeVariableName.get("Reader"))))
|
||||
.addTypeVariable(TypeVariableName.get("Writer", ParameterizedTypeName.get(Cl.SERIALIZE_WRITER, TypeVariableName.get("TEx"), TypeVariableName.get("Writer"))))
|
||||
.addParameter(ParameterizedTypeName.get(Cl.TRANSPORT, TypeVariableName.get("TEx"), TypeVariableName.get("Reader"), TypeVariableName.get("Writer")), "transport")
|
||||
.addException(TypeVariableName.get("TEx"))
|
||||
.addException(IOException.class)
|
||||
.returns(String.class)
|
||||
.addCode(CodeBlock.builder().beginControlFlow("try ($1T writer = new $1T())", StringWriter.class)
|
||||
.addStatement(writeStatement)
|
||||
.addStatement(writeStatementT)
|
||||
.addStatement("return writer.toString()")
|
||||
.endControlFlow()
|
||||
.build())
|
||||
|
@ -214,9 +248,9 @@ public abstract class GProcessor {
|
|||
);
|
||||
|
||||
spec.addMethod(
|
||||
extension(MethodSpec.methodBuilder("toJsonTree"), isStatic ? null : classType)
|
||||
extension(MethodSpec.methodBuilder("toDataTree"), isStatic ? null : classType)
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||
.addException(IOException.class)
|
||||
.addException(Cl.MALFORMED_DATA_EXCEPTION)
|
||||
.returns(Cl.GSON_ELEMENT)
|
||||
.addCode(configureWriter.apply(CodeBlock.builder().beginControlFlow("try ($1T writer = new $1T())", Cl.EMULATED_WRITER))
|
||||
.addStatement(writeStatement)
|
||||
|
|
|
@ -10,7 +10,6 @@ import io.gitlab.jfronny.commons.serialize.generator.core.value.*;
|
|||
import javax.annotation.processing.Messager;
|
||||
import javax.lang.model.element.Modifier;
|
||||
import javax.lang.model.element.TypeElement;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
|
@ -26,21 +25,25 @@ public class InstanceProcessor extends GProcessor {
|
|||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||
.addAnnotation(AnnotationSpec.builder(Cl.SERIALIZER_FOR).addMember("targets", CodeBlock.builder().add("$T.class", classType).build()).build())
|
||||
.superclass(ParameterizedTypeName.get(Cl.TYPE_ADAPTER, classType))
|
||||
.addMethod(MethodSpec.methodBuilder("write")
|
||||
.addMethod(MethodSpec.methodBuilder("serialize")
|
||||
.addAnnotation(Override.class)
|
||||
.addModifiers(Modifier.PUBLIC)
|
||||
.addParameter(Cl.SERIALIZE_WRITER, "writer")
|
||||
.addTypeVariable(TypeVariableName.get("TEx", Exception.class))
|
||||
.addTypeVariable(TypeVariableName.get("Writer", ParameterizedTypeName.get(Cl.SERIALIZE_WRITER, TypeVariableName.get("TEx"), TypeVariableName.get("Writer"))))
|
||||
.addParameter(classType, "value")
|
||||
.addException(IOException.class)
|
||||
.addCode(generatedClassName.simpleName() + ".write(value, writer);")
|
||||
.addParameter(TypeVariableName.get("Writer"), "writer")
|
||||
.addException(TypeVariableName.get("TEx"))
|
||||
.addCode(generatedClassName.simpleName() + ".serialize(value, writer);")
|
||||
.build())
|
||||
.addMethod(MethodSpec.methodBuilder("read")
|
||||
.addMethod(MethodSpec.methodBuilder("deserialize")
|
||||
.addAnnotation(Override.class)
|
||||
.addModifiers(Modifier.PUBLIC)
|
||||
.addParameter(Cl.SERIALIZE_READER, "reader")
|
||||
.addException(IOException.class)
|
||||
.addTypeVariable(TypeVariableName.get("TEx", Exception.class))
|
||||
.addTypeVariable(TypeVariableName.get("Reader", ParameterizedTypeName.get(Cl.SERIALIZE_READER, TypeVariableName.get("TEx"), TypeVariableName.get("Reader"))))
|
||||
.addParameter(TypeVariableName.get("Reader"), "reader")
|
||||
.addException(TypeVariableName.get("TEx"))
|
||||
.returns(classType)
|
||||
.addCode("return " + generatedClassName.simpleName() + ".read(reader);")
|
||||
.addCode("return " + generatedClassName.simpleName() + ".deserialize(reader);")
|
||||
.build())
|
||||
.build()
|
||||
);
|
||||
|
@ -75,7 +78,7 @@ public class InstanceProcessor extends GProcessor {
|
|||
code.addStatement("writer.name($S)", getSerializedName(param));
|
||||
Adapters.generateWrite(param, spec, code, typeVariables, otherAdapters, message, writeGet);
|
||||
} else {
|
||||
code.beginControlFlow("if (value.$N != null || writer.getSerializeNulls())", param.getCallableName());
|
||||
code.beginControlFlow("if (value.$N != null || writer.isSerializeNulls())", param.getCallableName());
|
||||
generateComments(param, code);
|
||||
code.addStatement("writer.name($S)", getSerializedName(param));
|
||||
code.addStatement("if (value.$N == null) writer.nullValue()", param.getCallableName());
|
||||
|
@ -92,7 +95,7 @@ public class InstanceProcessor extends GProcessor {
|
|||
Adapters.generateWrite(param, spec, code, typeVariables, otherAdapters, message, () -> code.add("value.$N()", param.getCallableName()));
|
||||
} else {
|
||||
code.addStatement("$T $L$N = value.$N()", param.getType(), "$", param.getCallableName(), param.getCallableName());
|
||||
code.beginControlFlow("if ($L$N != null || writer.getSerializeNulls())", "$", param.getCallableName());
|
||||
code.beginControlFlow("if ($L$N != null || writer.isSerializeNulls())", "$", param.getCallableName());
|
||||
generateComments(param, code);
|
||||
code.addStatement("writer.name($S)", getSerializedName(param));
|
||||
code.addStatement("if ($L$N == null) writer.nullValue()", "$", param.getCallableName());
|
||||
|
@ -104,10 +107,12 @@ public class InstanceProcessor extends GProcessor {
|
|||
}
|
||||
code.addStatement("writer.endObject()");
|
||||
|
||||
spec.addMethod(extension(MethodSpec.methodBuilder("write"), self.getTypeName())
|
||||
spec.addMethod(extension(MethodSpec.methodBuilder("serialize"), self.getTypeName())
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||
.addParameter(Cl.SERIALIZE_WRITER, "writer")
|
||||
.addException(IOException.class)
|
||||
.addTypeVariable(TypeVariableName.get("TEx", Exception.class))
|
||||
.addTypeVariable(TypeVariableName.get("Writer", ParameterizedTypeName.get(Cl.SERIALIZE_WRITER, TypeVariableName.get("TEx"), TypeVariableName.get("Writer"))))
|
||||
.addParameter(TypeVariableName.get("Writer"), "writer")
|
||||
.addException(TypeVariableName.get("TEx"))
|
||||
.addCode(code.build())
|
||||
.build());
|
||||
}
|
||||
|
@ -196,11 +201,13 @@ public class InstanceProcessor extends GProcessor {
|
|||
}
|
||||
code.addStatement("return result");
|
||||
|
||||
spec.addMethod(extension(MethodSpec.methodBuilder("read"))
|
||||
spec.addMethod(extension(MethodSpec.methodBuilder("deserialize"))
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||
.returns(self.getTypeName())
|
||||
.addParameter(Cl.SERIALIZE_READER, "reader")
|
||||
.addException(IOException.class)
|
||||
.addTypeVariable(TypeVariableName.get("TEx", Exception.class))
|
||||
.addTypeVariable(TypeVariableName.get("Reader", ParameterizedTypeName.get(Cl.SERIALIZE_READER, TypeVariableName.get("TEx"), TypeVariableName.get("Reader"))))
|
||||
.addParameter(TypeVariableName.get("Reader"), "reader")
|
||||
.addException(TypeVariableName.get("TEx"))
|
||||
.addCode(code.build())
|
||||
.build());
|
||||
}
|
||||
|
|
|
@ -45,7 +45,7 @@ public class StaticProcessor extends GProcessor {
|
|||
code.addStatement("writer.name($S)", getSerializedName(param));
|
||||
Adapters.generateWrite(param, spec, code, typeVariables, otherAdapters, message, writeGet);
|
||||
} else {
|
||||
code.beginControlFlow("if ($T.$N != null || writer.getSerializeNulls())", self.getTypeName(), param.getCallableName());
|
||||
code.beginControlFlow("if ($T.$N != null || writer.isSerializeNulls())", self.getTypeName(), param.getCallableName());
|
||||
generateComments(param, code);
|
||||
code.addStatement("writer.name($S)", getSerializedName(param));
|
||||
code.addStatement("if ($T.$N == null) writer.nullValue()", self.getTypeName(), param.getCallableName());
|
||||
|
@ -62,7 +62,7 @@ public class StaticProcessor extends GProcessor {
|
|||
Adapters.generateWrite(param, spec, code, typeVariables, otherAdapters, message, () -> code.add("$T.$N()", self.getTypeName(), param.getCallableName()));
|
||||
} else {
|
||||
code.addStatement("$T $L$N = $T.$N()", param.getType(), "$", param.getCallableName(), self.getTypeName(), param.getCallableName());
|
||||
code.beginControlFlow("if ($L$N != null || writer.getSerializeNulls())", "$", param.getCallableName());
|
||||
code.beginControlFlow("if ($L$N != null || writer.isSerializeNulls())", "$", param.getCallableName());
|
||||
generateComments(param, code);
|
||||
code.addStatement("writer.name($S)", getSerializedName(param));
|
||||
code.addStatement("if ($L$N == null) writer.nullValue()", "$", param.getCallableName());
|
||||
|
@ -74,10 +74,12 @@ public class StaticProcessor extends GProcessor {
|
|||
}
|
||||
code.addStatement("writer.endObject()");
|
||||
|
||||
spec.addMethod(extension(MethodSpec.methodBuilder("write"))
|
||||
spec.addMethod(extension(MethodSpec.methodBuilder("serialize"))
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||
.addParameter(Cl.SERIALIZE_WRITER, "writer")
|
||||
.addException(IOException.class)
|
||||
.addTypeVariable(TypeVariableName.get("TEx", Exception.class))
|
||||
.addTypeVariable(TypeVariableName.get("Writer", ParameterizedTypeName.get(Cl.SERIALIZE_WRITER, TypeVariableName.get("TEx"), TypeVariableName.get("Writer"))))
|
||||
.addParameter(TypeVariableName.get("Writer"), "writer")
|
||||
.addException(TypeVariableName.get("TEx"))
|
||||
.addCode(code.build())
|
||||
.build());
|
||||
}
|
||||
|
@ -125,10 +127,12 @@ public class StaticProcessor extends GProcessor {
|
|||
.addStatement("reader.endObject()");
|
||||
}
|
||||
|
||||
spec.addMethod(extension(MethodSpec.methodBuilder("read"))
|
||||
spec.addMethod(extension(MethodSpec.methodBuilder("deserialize"))
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||
.addParameter(Cl.SERIALIZE_READER, "reader")
|
||||
.addException(IOException.class)
|
||||
.addTypeVariable(TypeVariableName.get("TEx", Exception.class))
|
||||
.addTypeVariable(TypeVariableName.get("Reader", ParameterizedTypeName.get(Cl.SERIALIZE_READER, TypeVariableName.get("TEx"), TypeVariableName.get("Reader"))))
|
||||
.addParameter(TypeVariableName.get("Reader"), "reader")
|
||||
.addException(TypeVariableName.get("TEx"))
|
||||
.addCode(code.build())
|
||||
.build());
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@ plugins {
|
|||
}
|
||||
|
||||
dependencies {
|
||||
implementation(projects.commons)
|
||||
api(projects.commons)
|
||||
}
|
||||
|
||||
publishing {
|
||||
|
|
|
@ -2,7 +2,7 @@ package io.gitlab.jfronny.commons.serialize;
|
|||
|
||||
import io.gitlab.jfronny.commons.SamWithReceiver;
|
||||
|
||||
public abstract class SerializeReader<TEx extends Throwable, T extends SerializeReader<TEx, T>> implements AutoCloseable {
|
||||
public abstract class SerializeReader<TEx extends Exception, T extends SerializeReader<TEx, T>> implements AutoCloseable {
|
||||
protected boolean lenient = false;
|
||||
protected boolean serializeSpecialFloatingPointValues = false;
|
||||
|
||||
|
@ -64,13 +64,16 @@ public abstract class SerializeReader<TEx extends Throwable, T extends Serialize
|
|||
public abstract String getPath();
|
||||
public abstract String getPreviousPath();
|
||||
|
||||
@Override
|
||||
public abstract void close() throws TEx;
|
||||
|
||||
/**
|
||||
* Copies the current element to the writer.
|
||||
*
|
||||
* @param writer the writer to copy to
|
||||
* @throws TEx if an error occurs
|
||||
*/
|
||||
public <TEx2 extends Throwable> void copyTo(SerializeWriter<TEx2, ?> writer) throws TEx, TEx2 {
|
||||
public <TEx2 extends Exception> void copyTo(SerializeWriter<TEx2, ?> writer) throws TEx, TEx2 {
|
||||
switch (peek()) {
|
||||
case BEGIN_ARRAY -> {
|
||||
this.beginArray();
|
||||
|
@ -116,7 +119,7 @@ public abstract class SerializeReader<TEx extends Throwable, T extends Serialize
|
|||
|
||||
|
||||
@SamWithReceiver
|
||||
public interface SerializeReaderFunction<TEx extends Throwable, T extends SerializeReader<TEx, T>, R> {
|
||||
public interface SerializeReaderFunction<TEx extends Exception, T extends SerializeReader<TEx, T>, R> {
|
||||
R accept(T reader) throws TEx;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||
import java.util.concurrent.atomic.AtomicLong;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public abstract class SerializeWriter<TEx extends Throwable, T extends SerializeWriter<TEx, T>> implements AutoCloseable, Flushable {
|
||||
public abstract class SerializeWriter<TEx extends Exception, T extends SerializeWriter<TEx, T>> implements AutoCloseable, Flushable {
|
||||
private static final Pattern VALID_JSON_NUMBER_PATTERN =
|
||||
Pattern.compile("-?(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][-+]?[0-9]+)?");
|
||||
|
||||
|
@ -131,8 +131,11 @@ public abstract class SerializeWriter<TEx extends Throwable, T extends Serialize
|
|||
*/
|
||||
public abstract T literalValue(String value) throws TEx;
|
||||
|
||||
@Override
|
||||
public abstract void close() throws TEx;
|
||||
|
||||
@SamWithReceiver
|
||||
public interface SerializeWriterConsumer<TEx extends Throwable, T extends SerializeWriter<TEx, T>> {
|
||||
public interface SerializeWriterConsumer<TEx extends Exception, T extends SerializeWriter<TEx, T>> {
|
||||
T accept(T writer) throws TEx;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@ import org.jetbrains.annotations.ApiStatus;
|
|||
|
||||
import java.io.StringReader;
|
||||
|
||||
public interface Transport<TEx extends Throwable, Reader extends SerializeReader<TEx, Reader>, Writer extends SerializeWriter<TEx, Writer>> extends WithScopedValue<Transport<?, ?, ?>> {
|
||||
public interface Transport<TEx extends Exception, Reader extends SerializeReader<TEx, Reader>, Writer extends SerializeWriter<TEx, Writer>> extends WithScopedValue<Transport<?, ?, ?>> {
|
||||
ScopedValue<Transport<?, ?, ?>> DEFAULT = new ScopedValue<>();
|
||||
|
||||
@Override
|
||||
|
|
|
@ -6,7 +6,7 @@ import io.gitlab.jfronny.commons.serialize.SerializeWriter;
|
|||
import java.util.Map;
|
||||
|
||||
public class DataElementSerializer {
|
||||
public static <TEx extends Throwable, T extends SerializeWriter<TEx, T>> void serialize(DataElement element, T out) throws TEx {
|
||||
public static <TEx extends Exception, T extends SerializeWriter<TEx, T>> void serialize(DataElement element, T out) throws TEx {
|
||||
switch (element) {
|
||||
case DataElement.Array(var elements) -> out.array(b -> {
|
||||
for (DataElement e : elements) {
|
||||
|
@ -32,7 +32,7 @@ public class DataElementSerializer {
|
|||
}
|
||||
}
|
||||
|
||||
public static <TEx extends Throwable, T extends SerializeReader<TEx, T>> DataElement deserialize(T in) throws TEx {
|
||||
public static <TEx extends Exception, T extends SerializeReader<TEx, T>> DataElement deserialize(T in) throws TEx {
|
||||
return switch (in.peek()) {
|
||||
case STRING -> new DataElement.Primitive.String(in.nextString());
|
||||
case NUMBER -> new DataElement.Primitive.Number(in.nextNumber());
|
||||
|
|
|
@ -4,6 +4,7 @@ import io.gitlab.jfronny.commons.serialize.MalformedDataException;
|
|||
import io.gitlab.jfronny.commons.serialize.SerializeReader;
|
||||
import io.gitlab.jfronny.commons.serialize.Token;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
@ -274,7 +275,7 @@ public class EmulatedReader extends SerializeReader<MalformedDataException, Emul
|
|||
}
|
||||
|
||||
@Override
|
||||
public void close() throws Exception {
|
||||
public void close() {
|
||||
stack = new Object[] {SENTINEL_CLOSED};
|
||||
stackSize = 1;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package io.gitlab.jfronny.commons.serialize.emulated;
|
||||
|
||||
import io.gitlab.jfronny.commons.serialize.MalformedDataException;
|
||||
import io.gitlab.jfronny.commons.serialize.SerializeWriter;
|
||||
|
||||
import java.io.Closeable;
|
||||
|
@ -178,9 +179,9 @@ public class EmulatedWriter extends SerializeWriter<RuntimeException, EmulatedWr
|
|||
public void flush() throws IOException {}
|
||||
|
||||
@Override
|
||||
public void close() throws IOException {
|
||||
public void close() {
|
||||
if (!stack.isEmpty()) {
|
||||
throw new IOException("Incomplete document");
|
||||
throw new IllegalStateException("Incomplete document");
|
||||
}
|
||||
stack.add(SENTINEL_CLOSED);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue