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

net.amygdalum.testrecorder.deserializers.builder.ArraysListAdaptor Maven / Gradle / Ivy

There is a newer version: 0.10.5
Show newest version
package net.amygdalum.testrecorder.deserializers.builder;

import static net.amygdalum.testrecorder.deserializers.Templates.assignLocalVariableStatement;
import static net.amygdalum.testrecorder.deserializers.Templates.callLocalMethod;
import static net.amygdalum.testrecorder.types.Computation.variable;
import static net.amygdalum.testrecorder.util.TypeFilters.in;
import static net.amygdalum.testrecorder.util.Types.array;
import static net.amygdalum.testrecorder.util.Types.baseType;
import static net.amygdalum.testrecorder.util.Types.equalBaseTypes;
import static net.amygdalum.testrecorder.util.Types.innerClasses;
import static net.amygdalum.testrecorder.util.Types.parameterized;
import static net.amygdalum.testrecorder.util.Types.wildcard;

import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

import net.amygdalum.testrecorder.deserializers.Deserializer;
import net.amygdalum.testrecorder.types.Computation;
import net.amygdalum.testrecorder.types.DeserializerContext;
import net.amygdalum.testrecorder.types.SerializedValue;
import net.amygdalum.testrecorder.types.TypeManager;
import net.amygdalum.testrecorder.values.SerializedArray;
import net.amygdalum.testrecorder.values.SerializedList;

public class ArraysListAdaptor implements SetupGenerator {

	private DefaultArrayAdaptor adaptor;

	public ArraysListAdaptor() {
		this.adaptor = new DefaultArrayAdaptor();
	}

	@Override
	public Class getAdaptedClass() {
		return SerializedList.class;
	}

	@Override
	public Class> parent() {
		return DefaultListAdaptor.class;
	}

	@Override
	public boolean matches(Type type) {
		return innerClasses(Arrays.class).stream()
			.filter(in("ArrayList"))
			.filter(element -> List.class.isAssignableFrom(element))
			.anyMatch(element -> equalBaseTypes(element, type));
	}

	@Override
	public Computation tryDeserialize(SerializedList value, Deserializer generator) {
		DeserializerContext context = generator.getContext();
		TypeManager types = context.getTypes();
		
		Type componentType = value.getComponentType();
		types.staticImport(Arrays.class, "asList");
		types.registerType(componentType);

		Type type = array(componentType);
		SerializedArray baseValue = new SerializedArray(baseType(type));
		baseValue.useAs(type);
		for (SerializedValue element : value) {
			baseValue.add(element);
		}

		Type resultType = types.isHidden(componentType)
			? parameterized(List.class, null, wildcard())
			: parameterized(List.class, null, componentType);
		return context.forVariable(value, resultType, local -> {

			Computation computation = adaptor.tryDeserialize(baseValue, generator);
			List statements = new LinkedList<>(computation.getStatements());
			String resultArray = computation.getValue();

			String asListStatement = assignLocalVariableStatement(types.getVariableTypeName(resultType), local.getName(), callLocalMethod("asList", resultArray));
			statements.add(asListStatement);

			return variable(local.getName(), local.getType(), statements);
		});
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy