fix(serialize-generator): A large number of fixes for incorrectly carried over gson stuff

This commit is contained in:
Johannes Frohnmeyer 2024-04-18 20:54:36 +02:00
parent 988aefe96d
commit 54f16611cc
Signed by: Johannes
GPG Key ID: E76429612C2929F4
20 changed files with 140 additions and 84 deletions

View File

@ -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;

View File

@ -9,6 +9,7 @@ repositories {
dependencies {
implementation(projects.commonsSerialize)
implementation(projects.commonsSerializeDatabindApi)
compileOnly(projects.commonsSerializeGeneratorAnnotations)
annotationProcessor(projects.commonsSerializeGenerator)
}

View File

@ -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();
}
}

View File

@ -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) {
}
}

View File

@ -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;

View File

@ -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");

View File

@ -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);
}
}
}

View File

@ -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)

View File

@ -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()");

View File

@ -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()");

View File

@ -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)

View File

@ -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());
}

View File

@ -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());
}

View File

@ -3,7 +3,7 @@ plugins {
}
dependencies {
implementation(projects.commons)
api(projects.commons)
}
publishing {

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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

View File

@ -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());

View File

@ -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;
}

View File

@ -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);
}