Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(java): replace Guava's TypeToken with self-made #1553

Merged
merged 20 commits into from
Apr 26, 2024
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,7 @@ Args = -H:+ReportExceptionStackTraces \
org.apache.fury.graalvm.ThreadSafeExample,\
org.apache.fury.graalvm.ProxyExample,\
org.apache.fury.graalvm.Benchmark,\
org.apache.fury.resolver.DisallowedList
org.apache.fury.resolver.DisallowedList,\
Munoon marked this conversation as resolved.
Show resolved Hide resolved
org.apache.fury.reflect.Types$ClassOwnership,\
org.apache.fury.reflect.Types$ClassOwnership$1,\
org.apache.fury.reflect.Types$ClassOwnership$2

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
import static org.apache.fury.type.TypeUtils.PRIMITIVE_VOID_TYPE;
import static org.apache.fury.type.TypeUtils.getRawType;

import com.google.common.reflect.TypeToken;
import java.lang.invoke.MethodHandle;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
Expand All @@ -55,6 +54,7 @@
import org.apache.fury.codegen.Expression.StaticInvoke;
import org.apache.fury.collection.Tuple2;
import org.apache.fury.memory.MemoryBuffer;
import org.apache.fury.reflect.TypeRef;
import org.apache.fury.resolver.ClassInfo;
import org.apache.fury.resolver.ClassInfoHolder;
import org.apache.fury.type.Descriptor;
Expand Down Expand Up @@ -84,23 +84,23 @@ public abstract class CodecBuilder {
protected static final String ROOT_OBJECT_NAME = "obj";
// avoid user class has field with name fury.
protected static final String FURY_NAME = "fury";
static TypeToken<Object[]> objectArrayTypeToken = TypeToken.of(Object[].class);
static TypeToken<MemoryBuffer> bufferTypeToken = TypeToken.of(MemoryBuffer.class);
static TypeToken<ClassInfo> classInfoTypeToken = TypeToken.of(ClassInfo.class);
static TypeToken<ClassInfoHolder> classInfoHolderTypeToken = TypeToken.of(ClassInfoHolder.class);
static TypeRef<Object[]> objectArrayTypeToken = TypeRef.of(Object[].class);
Munoon marked this conversation as resolved.
Show resolved Hide resolved
static TypeRef<MemoryBuffer> bufferTypeToken = TypeRef.of(MemoryBuffer.class);
static TypeRef<ClassInfo> classInfoTypeToken = TypeRef.of(ClassInfo.class);
static TypeRef<ClassInfoHolder> classInfoHolderTypeToken = TypeRef.of(ClassInfoHolder.class);

protected final CodegenContext ctx;
protected final TypeToken<?> beanType;
protected final TypeRef<?> beanType;
protected final Class<?> beanClass;
protected final boolean isRecord;
private final Set<String> duplicatedFields;
protected Reference furyRef = new Reference(FURY_NAME, TypeToken.of(Fury.class));
protected Reference furyRef = new Reference(FURY_NAME, TypeRef.of(Fury.class));
public static final Reference recordComponentDefaultValues =
new Reference("recordComponentDefaultValues", OBJECT_ARRAY_TYPE);
protected final Map<String, Reference> fieldMap = new HashMap<>();
protected boolean recordCtrAccessible;

public CodecBuilder(CodegenContext ctx, TypeToken<?> beanType) {
public CodecBuilder(CodegenContext ctx, TypeRef<?> beanType) {
this.ctx = ctx;
this.beanType = beanType;
this.beanClass = getRawType(beanType);
Expand All @@ -126,16 +126,16 @@ protected boolean sourcePublicAccessible(Class<?> cls) {
return ctx.sourcePublicAccessible(cls);
}

protected Expression tryInlineCast(Expression expression, TypeToken<?> targetType) {
protected Expression tryInlineCast(Expression expression, TypeRef<?> targetType) {
return tryCastIfPublic(expression, targetType, true);
}

protected Expression tryCastIfPublic(Expression expression, TypeToken<?> targetType) {
protected Expression tryCastIfPublic(Expression expression, TypeRef<?> targetType) {
return tryCastIfPublic(expression, targetType, false);
}

protected Expression tryCastIfPublic(
Expression expression, TypeToken<?> targetType, boolean inline) {
Expression expression, TypeRef<?> targetType, boolean inline) {
Class<?> rawType = getRawType(targetType);
if (rawType == FinalObjectTypeStub.class) {
// final field doesn't exist in this class, skip cast.
Expand All @@ -145,14 +145,14 @@ protected Expression tryCastIfPublic(
if (sourcePublicAccessible(rawType)) {
return new Cast(expression, targetType);
} else {
return new Cast(expression, ReflectionUtils.getPublicSuperType(TypeToken.of(rawType)));
return new Cast(expression, ReflectionUtils.getPublicSuperType(TypeRef.of(rawType)));
}
}
return tryCastIfPublic(expression, targetType, "castedValue");
}

protected Expression tryCastIfPublic(
Expression expression, TypeToken<?> targetType, String valuePrefix) {
Expression expression, TypeRef<?> targetType, String valuePrefix) {
Class<?> rawType = getRawType(targetType);
if (sourcePublicAccessible(rawType)
&& !expression.type().wrap().isSubtypeOf(targetType.wrap())) {
Expand All @@ -172,10 +172,10 @@ protected Reference getRecordCtrHandle() {
new StaticInvoke(
RecordUtils.class,
"getRecordCtrHandle",
TypeToken.of(MethodHandle.class),
TypeRef.of(MethodHandle.class),
beanClassExpr());
ctx.addField(ctx.type(MethodHandle.class), fieldName, getRecordCtrHandle);
fieldRef = new Reference(fieldName, TypeToken.of(MethodHandle.class));
fieldRef = new Reference(fieldName, TypeRef.of(MethodHandle.class));
fieldMap.put(fieldName, fieldRef);
}
return fieldRef;
Expand All @@ -188,7 +188,7 @@ protected Expression buildDefaultComponentsArray() {

/** Returns an expression that get field value from <code>bean</code>. */
protected Expression getFieldValue(Expression inputBeanExpr, Descriptor descriptor) {
TypeToken<?> fieldType = descriptor.getTypeToken();
TypeRef<?> fieldType = descriptor.getTypeToken();
Class<?> rawType = descriptor.getRawType();
String fieldName = descriptor.getName();
if (isRecord) {
Expand Down Expand Up @@ -234,7 +234,7 @@ protected Expression getFieldValue(Expression inputBeanExpr, Descriptor descript
}

private Expression getRecordFieldValue(Expression inputBeanExpr, Descriptor descriptor) {
TypeToken<?> fieldType = descriptor.getTypeToken();
TypeRef<?> fieldType = descriptor.getTypeToken();
if (!sourcePublicAccessible(descriptor.getRawType())) {
fieldType = OBJECT_TYPE;
}
Expand All @@ -249,7 +249,7 @@ private Expression getRecordFieldValue(Expression inputBeanExpr, Descriptor desc
Tuple2<Class<?>, String> methodInfo = Functions.getterMethodInfo(descriptor.getRawType());
if (ref == null) {
Class<?> funcInterface = methodInfo.f0;
TypeToken<?> getterType = TypeToken.of(funcInterface);
TypeRef<?> getterType = TypeRef.of(funcInterface);
Expression getter =
new StaticInvoke(
Functions.class,
Expand Down Expand Up @@ -288,7 +288,7 @@ private Expression unsafeAccessField(
if (descriptor.getTypeToken().isPrimitive()) {
// ex: Platform.UNSAFE.getFloat(obj, fieldOffset)
Preconditions.checkArgument(!fieldNullable);
TypeToken<?> returnType = descriptor.getTypeToken();
TypeRef<?> returnType = descriptor.getTypeToken();
String funcName = "get" + StringUtils.capitalize(descriptor.getRawType().toString());
return new StaticInvoke(
Platform.class, funcName, returnType, false, inputObject, fieldOffsetExpr);
Expand Down Expand Up @@ -317,7 +317,7 @@ private Expression getFieldOffset(Class<?> cls, Descriptor descriptor) {
fieldName + "_offset_",
() -> {
Expression classExpr = beanClassExpr(field.getDeclaringClass());
new Invoke(classExpr, "getDeclaredField", TypeToken.of(Field.class));
new Invoke(classExpr, "getDeclaredField", TypeRef.of(Field.class));
Expression reflectFieldRef = getReflectField(cls, field, false);
return new StaticInvoke(
Platform.class, "objectFieldOffset", PRIMITIVE_LONG_TYPE, reflectFieldRef)
Expand Down Expand Up @@ -390,7 +390,7 @@ private Expression reflectSetField(Expression bean, Field field, Expression valu
* Unsafe}.
*/
private Expression unsafeSetField(Expression bean, Descriptor descriptor, Expression value) {
TypeToken<?> fieldType = descriptor.getTypeToken();
TypeRef<?> fieldType = descriptor.getTypeToken();
// Use Field in case the class has duplicate field name as `fieldName`.
Expression fieldOffsetExpr = getFieldOffset(beanClass, descriptor);
if (descriptor.getTypeToken().isPrimitive()) {
Expand Down Expand Up @@ -419,19 +419,19 @@ private Reference getReflectField(Class<?> cls, Field field, boolean setAccessib
Field.class,
fieldRefName,
() -> {
TypeToken<Field> fieldTypeToken = TypeToken.of(Field.class);
TypeRef<Field> fieldTypeRef = TypeRef.of(Field.class);
Expression classExpr = beanClassExpr(field.getDeclaringClass());
Expression fieldExpr;
if (GraalvmSupport.isGraalBuildtime()) {
fieldExpr =
inlineInvoke(
classExpr, "getDeclaredField", fieldTypeToken, Literal.ofString(fieldName));
classExpr, "getDeclaredField", fieldTypeRef, Literal.ofString(fieldName));
} else {
fieldExpr =
new StaticInvoke(
ReflectionUtils.class,
"getField",
fieldTypeToken,
fieldTypeRef,
classExpr,
Literal.ofString(fieldName));
}
Expand All @@ -448,7 +448,7 @@ private Reference getOrCreateField(
Reference fieldRef = fieldMap.get(fieldName);
if (fieldRef == null) {
ctx.addField(isStatic, true, ctx.type(type), fieldName, value.get());
fieldRef = new Reference(fieldName, TypeToken.of(type));
fieldRef = new Reference(fieldName, TypeRef.of(type));
fieldMap.put(fieldName, fieldRef);
}
return fieldRef;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@

package org.apache.fury.builder;

import com.google.common.reflect.TypeToken;
import java.util.Collections;
import org.apache.fury.Fury;
import org.apache.fury.codegen.CodeGenerator;
import org.apache.fury.codegen.CompileUnit;
import org.apache.fury.meta.ClassDef;
import org.apache.fury.reflect.TypeRef;
import org.apache.fury.resolver.ClassResolver;
import org.apache.fury.resolver.FieldResolver;
import org.apache.fury.serializer.Serializer;
Expand All @@ -47,7 +47,7 @@ public static <T> Class<? extends Serializer<T>> loadOrGenMetaSharedCodecClass(
Fury fury, Class<T> cls, ClassDef classDef) {
Preconditions.checkNotNull(fury);
MetaSharedCodecBuilder codecBuilder =
new MetaSharedCodecBuilder(TypeToken.of(cls), fury, classDef);
new MetaSharedCodecBuilder(TypeRef.of(cls), fury, classDef);
return loadOrGenCodecClass(cls, fury, codecBuilder);
}

Expand All @@ -61,7 +61,7 @@ public static <T> Class<? extends Serializer<T>> loadOrGenCompatibleCodecClass(
Class<T> cls, Fury fury, FieldResolver fieldResolver, Class<?> parentSerializerClass) {
Preconditions.checkNotNull(fury);
BaseObjectCodecBuilder codecBuilder =
new CompatibleCodecBuilder(TypeToken.of(cls), fury, fieldResolver, parentSerializerClass);
new CompatibleCodecBuilder(TypeRef.of(cls), fury, fieldResolver, parentSerializerClass);
return loadOrGenCodecClass(cls, fury, codecBuilder);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
import static org.apache.fury.type.TypeUtils.PRIMITIVE_VOID_TYPE;
import static org.apache.fury.type.TypeUtils.getRawType;

import com.google.common.reflect.TypeToken;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
Expand Down Expand Up @@ -65,6 +64,7 @@
import org.apache.fury.codegen.ExpressionOptimizer;
import org.apache.fury.codegen.ExpressionUtils;
import org.apache.fury.collection.Tuple2;
import org.apache.fury.reflect.TypeRef;
import org.apache.fury.resolver.ClassInfo;
import org.apache.fury.resolver.ClassResolver;
import org.apache.fury.resolver.FieldResolver;
Expand All @@ -91,10 +91,7 @@ public class CompatibleCodecBuilder extends BaseObjectCodecBuilder {
private final Map<String, Expression> methodCache;

public CompatibleCodecBuilder(
TypeToken<?> beanType,
Fury fury,
FieldResolver fieldResolver,
Class<?> superSerializerClass) {
TypeRef<?> beanType, Fury fury, FieldResolver fieldResolver, Class<?> superSerializerClass) {
// if not resolveParent, there won't be necessary to implement
// `CompatibleSerializerBase.readAndSetFields`.
super(beanType, fury, superSerializerClass);
Expand All @@ -108,15 +105,15 @@ public CompatibleCodecBuilder(
}
ctx.reserveName(FIELD_RESOLVER_NAME);
endTagLiteral = new Literal(fieldResolver.getEndTag(), PRIMITIVE_LONG_TYPE);
TypeToken<FieldResolver> fieldResolverTypeToken = TypeToken.of(FieldResolver.class);
fieldResolverRef = fieldRef(FIELD_RESOLVER_NAME, fieldResolverTypeToken);
TypeRef<FieldResolver> fieldResolverTypeRef = TypeRef.of(FieldResolver.class);
fieldResolverRef = fieldRef(FIELD_RESOLVER_NAME, fieldResolverTypeRef);
Expression fieldResolverExpr =
inlineInvoke(
classResolverRef,
"getFieldResolver",
fieldResolverTypeToken,
fieldResolverTypeRef,
getClassExpr(getRawType(beanType)));
ctx.addField(ctx.type(fieldResolverTypeToken), FIELD_RESOLVER_NAME, fieldResolverExpr);
ctx.addField(ctx.type(fieldResolverTypeRef), FIELD_RESOLVER_NAME, fieldResolverExpr);
if (isRecord) {
buildRecordComponentDefaultValues();
}
Expand All @@ -140,19 +137,19 @@ protected boolean isMonomorphic(Class<?> clz) {
}

private Descriptor createDescriptor(FieldInfo fieldInfo) {
TypeToken<?> typeToken;
TypeRef<?> typeRef;
Field field = fieldInfo.getField();
if (fieldInfo instanceof MapFieldInfo) {
MapFieldInfo mapFieldInfo = (MapFieldInfo) fieldInfo;
// Remove nested generics such as `Map<Integer, Map<Integer, Collection<Integer>>>` to keep
// consistent with
// CompatibleSerializer.
// TODO support nested collection/map generics.
typeToken =
typeRef =
TypeUtils.mapOf(
mapFieldInfo.getType(), mapFieldInfo.getKeyType(), mapFieldInfo.getValueType());
} else {
typeToken = TypeToken.of(field.getGenericType());
typeRef = TypeRef.of(field.getGenericType());
}
Method readerMethod = null;
if (isRecord) {
Expand All @@ -163,7 +160,7 @@ private Descriptor createDescriptor(FieldInfo fieldInfo) {
Platform.throwException(e);
}
}
return new Descriptor(field, typeToken, readerMethod, null);
return new Descriptor(field, typeRef, readerMethod, null);
}

private Expression invokeGenerated(
Expand Down Expand Up @@ -804,7 +801,7 @@ private Expression readObjectField(
invokeGenerated(
ctx,
() -> {
TypeToken<?> typeToken = descriptor.getTypeToken();
TypeRef<?> typeRef = descriptor.getTypeToken();
Expression refId = tryPreserveRefId(buffer);
// indicates that the object is first read.
Expression needDeserialize =
Expand All @@ -821,7 +818,7 @@ private Expression readObjectField(
inlineInvoke(buffer, "readByte", PRIMITIVE_BYTE_TYPE),
expectType));
if (type == FieldTypes.OBJECT) {
deserializedValue.add(readForNotNullNonFinal(buffer, typeToken, null));
deserializedValue.add(readForNotNullNonFinal(buffer, typeRef, null));
} else {
if (type == FieldTypes.COLLECTION_ELEMENT_FINAL) {
deserializedValue.add(
Expand All @@ -840,12 +837,12 @@ private Expression readObjectField(
deserializedValue.add(
skipFinalClassInfo(((MapFieldInfo) fieldInfo).getValueType(), buffer));
}
Class<?> clz = getRawType(typeToken);
Class<?> clz = getRawType(typeRef);
if (ReflectionUtils.isMonomorphic(clz)) {
// deserializeForNotNull won't read field type if it's final
deserializedValue.add(skipFinalClassInfo(clz, buffer));
}
deserializedValue.add(deserializeForNotNull(buffer, typeToken, null));
deserializedValue.add(deserializeForNotNull(buffer, typeRef, null));
}
Expression setReadObject =
new Invoke(refResolverRef, "setReadObject", refId, deserializedValue);
Expand All @@ -856,13 +853,13 @@ private Expression readObjectField(
refId,
deserializedValue,
setReadObject,
setFieldValue(bean, descriptor, tryInlineCast(deserializedValue, typeToken))),
setFieldValue(bean, descriptor, tryInlineCast(deserializedValue, typeRef))),
setFieldValue(
bean,
descriptor,
tryInlineCast(
new Invoke(refResolverRef, "getReadObject", OBJECT_TYPE, false),
typeToken)),
typeRef)),
false,
PRIMITIVE_VOID_TYPE);
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@

import static org.apache.fury.builder.Generated.GeneratedMetaSharedSerializer.SERIALIZER_FIELD_NAME;

import com.google.common.reflect.TypeToken;
import java.util.Collection;
import java.util.SortedMap;
import org.apache.fury.Fury;
Expand All @@ -33,6 +32,7 @@
import org.apache.fury.config.FuryBuilder;
import org.apache.fury.memory.MemoryBuffer;
import org.apache.fury.meta.ClassDef;
import org.apache.fury.reflect.TypeRef;
import org.apache.fury.serializer.CodegenSerializer;
import org.apache.fury.serializer.MetaSharedSerializer;
import org.apache.fury.serializer.ObjectSerializer;
Expand Down Expand Up @@ -65,7 +65,7 @@
public class MetaSharedCodecBuilder extends ObjectCodecBuilder {
private final ClassDef classDef;

public MetaSharedCodecBuilder(TypeToken<?> beanType, Fury fury, ClassDef classDef) {
public MetaSharedCodecBuilder(TypeRef<?> beanType, Fury fury, ClassDef classDef) {
super(beanType, fury, GeneratedMetaSharedSerializer.class);
Preconditions.checkArgument(
!fury.getConfig().checkClassVersion(),
Expand Down Expand Up @@ -160,7 +160,7 @@ protected Expression createRecord(SortedMap<Integer, Expression> recordComponent
Object defaultValue = defaultValues[i];
assert components != null;
RecordComponent component = components[i];
recordComponents.put(i, new Literal(defaultValue, TypeToken.of(component.getType())));
recordComponents.put(i, new Literal(defaultValue, TypeRef.of(component.getType())));
}
}
Expression[] params = recordComponents.values().toArray(new Expression[0]);
Expand Down
Loading
Loading