64 lines
3.8 KiB
Java
64 lines
3.8 KiB
Java
package io.gitlab.jfronny.commons.serialize.generator.adapter;
|
|
|
|
import com.squareup.javapoet.CodeBlock;
|
|
import com.squareup.javapoet.TypeSpec;
|
|
import com.squareup.javapoet.TypeVariableName;
|
|
import io.gitlab.jfronny.commons.serialize.generator.SerializableClass;
|
|
import io.gitlab.jfronny.commons.serialize.generator.adapter.impl.*;
|
|
import io.gitlab.jfronny.commons.serialize.generator.core.value.Property;
|
|
|
|
import javax.annotation.processing.Messager;
|
|
import javax.lang.model.element.AnnotationMirror;
|
|
import javax.lang.model.element.Element;
|
|
import javax.lang.model.type.TypeMirror;
|
|
import javax.tools.Diagnostic;
|
|
import java.util.List;
|
|
import java.util.Set;
|
|
import java.util.function.Consumer;
|
|
|
|
public class Adapters {
|
|
public static final List<Adapter<?>> ADAPTERS = List.of(
|
|
new DeclaredAdapter(),
|
|
new PrimitiveAdapter(),
|
|
new StringAdapter(),
|
|
new DateAdapter(),
|
|
new EnumAdapter(),
|
|
new ArrayAdapter(),
|
|
new CollectionAdapter(),
|
|
new MapAdapter(),
|
|
new OtherSerializableAdapter(),
|
|
new ReflectAdapter()
|
|
);
|
|
|
|
public static void generateRead(Property<?> prop, TypeSpec.Builder klazz, CodeBlock.Builder code, List<TypeVariableName> typeVariables, Set<SerializableClass> otherAdapters, Messager message) {
|
|
withAdapter(prop, klazz, code, typeVariables, otherAdapters, message, Adapter.Hydrated::generateRead);
|
|
}
|
|
|
|
public static void generateWrite(Property<?> prop, TypeSpec.Builder klazz, CodeBlock.Builder code, List<TypeVariableName> typeVariables, Set<SerializableClass> otherAdapters, Messager message, Runnable writeGet) {
|
|
withAdapter(prop, klazz, code, typeVariables, otherAdapters, message, adapter -> adapter.generateWrite(writeGet));
|
|
}
|
|
|
|
private static void withAdapter(Property<?> prop, TypeSpec.Builder klazz, CodeBlock.Builder code, List<TypeVariableName> typeVariables, Set<SerializableClass> otherAdapters, Messager message, Consumer<Adapter<?>.Hydrated> action) {
|
|
withAdapter(klazz, code, typeVariables, otherAdapters, prop.getType(), prop.getName(), prop.getAnnotations(), prop.getElement(), message, action);
|
|
}
|
|
|
|
public static void generateRead(TypeSpec.Builder klazz, CodeBlock.Builder code, List<TypeVariableName> typeVariables, Set<SerializableClass> other, TypeMirror type, String propName, List<? extends AnnotationMirror> annotations, Element sourceElement, Messager message) {
|
|
withAdapter(klazz, code, typeVariables, other, type, propName, annotations, sourceElement, message, Adapter.Hydrated::generateRead);
|
|
}
|
|
|
|
public static void generateWrite(TypeSpec.Builder klazz, CodeBlock.Builder code, List<TypeVariableName> typeVariables, Set<SerializableClass> other, TypeMirror type, String propName, List<? extends AnnotationMirror> annotations, Element sourceElement, Messager message, Runnable writeGet) {
|
|
withAdapter(klazz, code, typeVariables, other, type, propName, annotations, sourceElement, message, adapter -> adapter.generateWrite(writeGet));
|
|
}
|
|
|
|
private static void withAdapter(TypeSpec.Builder klazz, CodeBlock.Builder code, List<TypeVariableName> typeVariables, Set<SerializableClass> other, TypeMirror type, String propName, List<? extends AnnotationMirror> annotations, Element sourceElement, Messager message, Consumer<Adapter<?>.Hydrated> action) {
|
|
for (Adapter<?> adapter : Adapters.ADAPTERS) {
|
|
Adapter<?>.Hydrated hydrated = adapter.hydrate(klazz, code, typeVariables, other, type, propName, annotations, sourceElement);
|
|
if (hydrated.applies()) {
|
|
action.accept(hydrated);
|
|
return;
|
|
}
|
|
}
|
|
message.printMessage(Diagnostic.Kind.ERROR, "Could not find applicable adapter for property " + propName, sourceElement);
|
|
}
|
|
}
|