package sk.stuba.fiit.perconik.utilities.constant;
import java.io.InvalidObjectException;
import java.io.ObjectInputStream;
import java.util.Set;
import javax.annotation.Nonnull;
import com.google.common.base.Function;
import static com.google.common.base.Preconditions.checkArgument;
public final class TypeConstantSupport<E extends Enum<E> & TypeConstant<T>, T> extends AbstractConstantSupport<Class<? extends T>, E> {
private static final long serialVersionUID = -2957728433673208288L;
private TypeConstantSupport(final Class<E> type) {
super(type);
}
private enum Transformation implements Function<TypeConstant<?>, Class<?>> {
INSTANCE;
public Class<?> apply(@Nonnull final TypeConstant<?> constant) {
return constant.getType();
}
}
@Override
@SuppressWarnings({"rawtypes", "unchecked"})
Function<E, Class<? extends T>> transformation() {
return (Function) Transformation.INSTANCE;
}
public static <E extends Enum<E> & TypeConstant<T>, T> TypeConstantSupport<E, T> of(final Class<E> type) {
return new TypeConstantSupport<>(type);
}
private static final class SerializationProxy<E extends Enum<E> & TypeConstant<T>, T> extends AbstractSerializationProxy<Class<? extends T>, E, TypeConstantSupport<E, T>> {
private static final long serialVersionUID = -8420579032363855266L;
SerializationProxy(final TypeConstantSupport<E, T> support) {
super(support);
}
@Override
TypeConstantSupport<E, T> resolve(final Class<E> type) {
return of(type);
}
}
@SuppressWarnings({"static-method", "unused"})
private void readObject(final ObjectInputStream in) throws InvalidObjectException {
throw new InvalidObjectException("Serialization proxy required");
}
private Object writeReplace() {
return new SerializationProxy<>(this);
}
public Set<Class<? extends T>> getTypes() {
return this.map.keySet();
}
public E getConstant(final Class<? extends T> type) {
E constant = this.map.get(type);
checkArgument(constant != null, "Constant for type %s not found", type.getName());
return constant;
}
}