ImmutablePrimitiveTypes.java

package tools.jackson.datatype.guava.util;

import tools.jackson.core.type.TypeReference;
import tools.jackson.databind.deser.std.StdDeserializer;
import tools.jackson.datatype.guava.deser.primitives.BaseImmutableArrayDeserializer;
import tools.jackson.datatype.guava.deser.primitives.ImmutableDoubleArrayDeserializer;
import tools.jackson.datatype.guava.deser.primitives.ImmutableIntArrayDeserializer;
import tools.jackson.datatype.guava.deser.primitives.ImmutableLongArrayDeserializer;
import tools.jackson.datatype.guava.ser.primitives.BaseImmutableArraySerializer;
import tools.jackson.datatype.guava.ser.primitives.ImmutableDoubleArraySerializer;
import tools.jackson.datatype.guava.ser.primitives.ImmutableIntArraySerializer;
import tools.jackson.datatype.guava.ser.primitives.ImmutableLongArraySerializer;

import com.google.common.base.Optional;
import com.google.common.primitives.ImmutableDoubleArray;
import com.google.common.primitives.ImmutableIntArray;
import com.google.common.primitives.ImmutableLongArray;

import static tools.jackson.datatype.guava.util.PrimitiveTypes.typeRefOf;

import java.io.Serializable;
import java.util.function.Supplier;

/**
 * Utility class to cover all {@code Immutable[Primitive]Array} primitive types
 *
 * @author robert@albertlr.ro
 */
public class ImmutablePrimitiveTypes {
    /**
     * An enum with all the primitives
     */
    public enum ImmutablePrimitiveArrays {
        INT(ImmutableIntArrayType, int.class, Integer.class,
                ImmutableIntArraySerializer::new,
                ImmutableIntArrayDeserializer::new
        ),
        DOUBLE(ImmutableDoubleArrayType, double.class, Double.class,
                ImmutableDoubleArraySerializer::new,
                ImmutableDoubleArrayDeserializer::new
        ),
        LONG(ImmutableLongArrayType, long.class, Long.class,
                ImmutableLongArraySerializer::new,
                ImmutableLongArrayDeserializer::new
        );

        private final Class<?> type;
        private final Class<?> primitiveType;
        private final Class<?> objectType;
        private final Supplier<? extends BaseImmutableArraySerializer> serializerFactory;
        private final Supplier<? extends BaseImmutableArrayDeserializer> deserializerFactory;

        private ImmutablePrimitiveArrays(Class<?> type, Class<?> primitiveType, Class<?> objectType,
                                         Supplier<? extends BaseImmutableArraySerializer> serializerFactory,
                                         Supplier<? extends BaseImmutableArrayDeserializer> deserializerFactory) {
            this.type = type;
            this.primitiveType = primitiveType;
            this.objectType = objectType;
            this.deserializerFactory = deserializerFactory;
            this.serializerFactory = serializerFactory;
        }

        public Class<?> type() {
            return type;
        }

        public Class<?> primitiveType() {
            return primitiveType;
        }

        public <T> Class<T> objectType() {
            return (Class<T>) objectType;
        }

        public <T extends Serializable> BaseImmutableArraySerializer<T> newSerializer() {
            return serializerFactory.get();
        }

        public <T> StdDeserializer<T> newDeserializer() {
            return deserializerFactory.get();
        }

    }

    public static Optional<ImmutablePrimitiveTypes.ImmutablePrimitiveArrays> isAssignableFromImmutableArray(Class<?> immutableArrayType) {
        for (ImmutablePrimitiveArrays primitive : ImmutablePrimitiveArrays.values()) {
            if (primitive.type().isAssignableFrom(immutableArrayType)) {
                return Optional.of(primitive);
            }
        }
        return Optional.absent();
    }


    /**
     * Type of array returned by {@link ImmutableIntArray}
     */
    public static final Class<? extends ImmutableIntArray> ImmutableIntArrayType = ImmutableIntArray.class;
    /**
     * Type of array returned by {@link ImmutableLongArray}
     */
    public static final Class<? extends ImmutableLongArray> ImmutableLongArrayType = ImmutableLongArray.class;
    /**
     * Type of array returned by {@link ImmutableDoubleArray}
     */
    public static final Class<? extends ImmutableDoubleArray> ImmutableDoubleArrayType = ImmutableDoubleArray.class;

    public static final TypeReference<ImmutableIntArray> ImmutableIntArrayReference = typeRefOf(ImmutableIntArrayType);
    public static final TypeReference<ImmutableLongArray> ImmutableLongArrayReference = typeRefOf(ImmutableLongArrayType);
    public static final TypeReference<ImmutableDoubleArray> ImmutableDoubleArrayReference = typeRefOf(ImmutableDoubleArrayType);

    public static final String ImmutableIntArrayName = ImmutableIntArrayType.getName();
    public static final String ImmutableLongArrayName = ImmutableLongArrayType.getName();
    public static final String ImmutableDoubleArrayName = ImmutableDoubleArrayType.getName();

}