All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.amygdalum.testrecorder.serializers.AbstractCompositeSerializer Maven / Gradle / Ivy

package net.amygdalum.testrecorder.serializers;

import static net.amygdalum.testrecorder.util.Reflections.accessing;
import static net.amygdalum.testrecorder.util.Types.baseType;
import static net.amygdalum.testrecorder.util.Types.isLiteral;
import static net.amygdalum.testrecorder.util.Types.isPrimitive;
import static net.amygdalum.testrecorder.util.Types.serializableOf;
import static net.amygdalum.testrecorder.values.SerializedLiteral.literal;
import static net.amygdalum.testrecorder.values.SerializedNull.nullInstance;

import java.lang.reflect.Field;
import java.lang.reflect.Type;

import net.amygdalum.testrecorder.types.FieldSignature;
import net.amygdalum.testrecorder.types.SerializationException;
import net.amygdalum.testrecorder.types.SerializedField;
import net.amygdalum.testrecorder.types.SerializedValue;
import net.amygdalum.testrecorder.types.SerializerSession;
import net.amygdalum.testrecorder.values.SerializedNull;

public abstract class AbstractCompositeSerializer {

	public SerializedField resolvedFieldOf(SerializerSession session, Object object, Class type, String name) {
		try {
			Field field = type.getDeclaredField(name);
			return resolvedFieldOf(session, object, field);
		} catch (ReflectiveOperationException | IllegalArgumentException e) {
			throw new SerializationException(e);
		}
	}

	public SerializedField resolvedFieldOf(SerializerSession session, Object object, Field field) {
		Class declaringClass = field.getDeclaringClass();
		String name = field.getName();
		Type type = serializableOf(field.getGenericType());
		FieldSignature signature = new FieldSignature(declaringClass, type, name);
		Object value = fieldOf(object, field);
		SerializedValue serializedValue = resolvedValueOf(session, type, value);

		return new SerializedField(signature, serializedValue);
	}

	public SerializedValue resolvedValueOf(SerializerSession session, Type type, Object value) {
		SerializedValue serializedValue = session.ref(value, type);
		if (serializedValue != null) {
			return serializedValue;
		}
		Class clazz = type == null ? null : baseType(type);
		if (value == null) {
			SerializedNull nullInstance = nullInstance();
			if (clazz != null && !clazz.isSynthetic()) {
				nullInstance.useAs(type);
			}
			return nullInstance;
		}
		if (isPrimitive(clazz)) {
			return literal(clazz, value);
		}
		if (isLiteral(value.getClass())) {
			return literal(value);
		} else {
			throw new SerializationException("cannot resolve value of type " + value.getClass().getName());
		}
	}

	public Object fieldOf(Object object, Class type, String name) {
		try {
			Field field = type.getDeclaredField(name);
			return fieldOf(object, field);
		} catch (ReflectiveOperationException | IllegalArgumentException e) {
			throw new SerializationException(e);
		}
	}

	public Object fieldOf(Object object, Field field) {
		try {
			return accessing(field).call(f -> f.get(object));
		} catch (ReflectiveOperationException | IllegalArgumentException e) {
			throw new SerializationException(e);
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy