Skip to content

Commit

Permalink
refactor and simplification
Browse files Browse the repository at this point in the history
  • Loading branch information
mariofusco committed Jul 30, 2024
1 parent cf09612 commit fb388f8
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 143 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -190,43 +190,17 @@ private void writeField(Type fieldType, String fieldName, BytecodeCreator byteco
return;
}

if (typeName.equals("io.vertx.core.json.JsonObject")) {
MethodDescriptor writeMethod = MethodDescriptor.ofMethod(JacksonMapperUtil.class, "writeIterableOfMapEntry",
void.class, JsonGenerator.class, SerializerProvider.class, String.class, Object.class);
bytecode.invokeStaticMethod(writeMethod, jsonGenerator, serializerProvider, bytecode.load(fieldName),
fieldReader);
return;
}
registerTypeToBeGenerated(fieldType, typeName);

if (typeName.equals("io.vertx.core.json.JsonArray")) {
MethodDescriptor writeMethod = MethodDescriptor.ofMethod(JacksonMapperUtil.class, "writeIterable",
void.class, JsonGenerator.class, SerializerProvider.class, String.class, Iterable.class);
bytecode.invokeStaticMethod(writeMethod, jsonGenerator, serializerProvider, bytecode.load(fieldName),
bytecode.checkCast(fieldReader, Iterable.class));
return;
}
MethodDescriptor writeMethod = MethodDescriptor.ofMethod(JSON_GEN_CLASS_NAME, "writePOJOField",
void.class, String.class, Object.class);
bytecode.invokeVirtualMethod(writeMethod, jsonGenerator, bytecode.load(fieldName), fieldReader);
}

private void registerTypeToBeGenerated(Type fieldType, String typeName) {
if (!isCollectionType(fieldType, typeName)) {
registerTypeToBeGenerated(typeName);
}

MethodDescriptor writeMethod = MethodDescriptor.ofMethod(JacksonMapperUtil.class, "writeJacksonField",
void.class, JsonGenerator.class, SerializerProvider.class, String.class, Object.class);
bytecode.invokeStaticMethod(writeMethod, jsonGenerator, serializerProvider, bytecode.load(fieldName),
fieldReader);
}

private void registerTypeToBeGenerated(Type type) {
registerTypeToBeGenerated(type.name().toString());
}

private void registerTypeToBeGenerated(String typeName) {
if (!vetoedClassName(typeName)) {
ClassInfo classInfo = jandexIndex.getClassByName(typeName);
if (classInfo != null && !classInfo.isEnum()) {
toBeGenerated.add(classInfo);
}
}
}

private boolean isCollectionType(Type fieldType, String typeName) {
Expand All @@ -250,6 +224,19 @@ private boolean isCollectionType(Type fieldType, String typeName) {
return false;
}

private void registerTypeToBeGenerated(Type type) {
registerTypeToBeGenerated(type.name().toString());
}

private void registerTypeToBeGenerated(String typeName) {
if (!vetoedClassName(typeName)) {
ClassInfo classInfo = jandexIndex.getClassByName(typeName);
if (classInfo != null && !classInfo.isEnum()) {
toBeGenerated.add(classInfo);
}
}
}

private String writeMethodForPrimitiveFields(String typeName) {
return switch (typeName) {
case "java.lang.String" -> "writeStringField";
Expand Down Expand Up @@ -352,14 +339,6 @@ private ResultHandle toValueReaderHandle(Object member, BytecodeCreator serializ
throw new UnsupportedOperationException("Unknown member type: " + member.getClass());
}

private MethodInfo getGetterMethodInfo(ClassInfo classInfo, String getterMethodName) {
MethodInfo getterMethodInfo = classInfo.method(getterMethodName);
if (getterMethodInfo != null && isGetterMethod(getterMethodInfo)) {
return getterMethodInfo;
}
return onSuperClass(classInfo, superClassInfo -> getGetterMethodInfo(superClassInfo, getterMethodName));
}

private <T> T onSuperClass(ClassInfo classInfo, Function<ClassInfo, T> f) {
Type superType = classInfo.superClassType();
if (superType != null && !vetoedClassName(superType.name().toString())) {
Expand Down Expand Up @@ -432,6 +411,6 @@ private boolean isBooleanType(String type) {
}

private boolean vetoedClassName(String className) {
return className.startsWith("java") || className.startsWith("jakarta");
return className.startsWith("java.") || className.startsWith("jakarta.") || className.startsWith("io.vertx.core.json.");
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,7 @@
package io.quarkus.resteasy.reactive.jackson.runtime.mappers;

import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.locks.ReentrantLock;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;

import io.quarkus.arc.Arc;
import io.quarkus.arc.ArcContainer;
import io.quarkus.arc.InstanceHandle;
Expand All @@ -16,102 +10,6 @@

public class JacksonMapperUtil {

public static void writeIterableOfMapEntry(JsonGenerator jsonGenerator, SerializerProvider serializerProvider,
String fieldName,
Object value) throws IOException {
if (value == null) {
return;
}
jsonGenerator.writeFieldName(fieldName);
writeMap(jsonGenerator, serializerProvider, (Iterable<Map.Entry>) value);
}

public static void writeJacksonField(JsonGenerator jsonGenerator, SerializerProvider serializerProvider, String fieldName,
Object value) throws IOException {
if (value == null) {
return;
}
jsonGenerator.writeFieldName(fieldName);
jsonGenerator.writeObject(value);
//writeValue(jsonGenerator, serializerProvider, value);
}

private static void writeValue(JsonGenerator jsonGenerator, SerializerProvider serializerProvider, Object value)
throws IOException {
if (value == null) {
return;
}
if (value instanceof Number) {
if (value instanceof Integer i) {
jsonGenerator.writeNumber(i);
} else if (value instanceof Long l) {
jsonGenerator.writeNumber(l);
} else if (value instanceof Double d) {
jsonGenerator.writeNumber(d);
} else if (value instanceof Float f) {
jsonGenerator.writeNumber(f);
} else if (value instanceof Short s) {
jsonGenerator.writeNumber(s);
}
} else if (value instanceof String s) {
jsonGenerator.writeString(s);
} else if (value instanceof Boolean b) {
jsonGenerator.writeBoolean(b);
} else if (value instanceof Iterable i) {
writeIterable(jsonGenerator, serializerProvider, i);
} else if (value.getClass().isArray()) {
writeIterable(jsonGenerator, serializerProvider, Arrays.asList((Object[]) value));
} else if (value instanceof Map.Entry e) {
writeMapEntry(jsonGenerator, serializerProvider, e);
} else {
serializerProvider.defaultSerializeValue(value, jsonGenerator);
}
}

public static void writeIterable(JsonGenerator jsonGenerator, SerializerProvider serializerProvider, String fieldName,
Iterable i)
throws IOException {
jsonGenerator.writeFieldName(fieldName);
writeIterable(jsonGenerator, serializerProvider, i);
}

private static void writeIterable(JsonGenerator jsonGenerator, SerializerProvider serializerProvider, Iterable i)
throws IOException {
Object first = getFirstItem(i);
if (first instanceof Map.Entry) {
writeMap(jsonGenerator, serializerProvider, (Iterable<Map.Entry>) i);
} else {
jsonGenerator.writeStartArray();
for (Object item : i) {
writeValue(jsonGenerator, serializerProvider, item);
}
jsonGenerator.writeEndArray();
}
}

private static void writeMap(JsonGenerator jsonGenerator, SerializerProvider serializerProvider,
Iterable<Map.Entry> entries) throws IOException {
jsonGenerator.writeStartObject();
for (Map.Entry e : entries) {
writeMapEntry(jsonGenerator, serializerProvider, e);
}
jsonGenerator.writeEndObject();
}

private static void writeMapEntry(JsonGenerator jsonGenerator, SerializerProvider serializerProvider, Map.Entry e)
throws IOException {
jsonGenerator.writeFieldName(e.getKey().toString());
writeValue(jsonGenerator, serializerProvider, e.getValue());
}

private static Object getFirstItem(Iterable i) {
if (i == null) {
return null;
}
var it = i.iterator();
return it.hasNext() ? it.next() : null;
}

public static boolean includeSecureField(String[] rolesAllowed) {
ArcContainer container = Arc.container();
if (container == null) {
Expand Down

0 comments on commit fb388f8

Please sign in to comment.