package org.infinispan.server.hotrod.iteration;
import java.lang.reflect.InvocationTargetException;
import java.util.Optional;
import org.infinispan.commons.CacheException;
import org.infinispan.commons.marshall.Marshaller;
import org.infinispan.commons.marshall.jboss.GenericJBossMarshaller;
import org.infinispan.filter.KeyValueFilterConverter;
/**
* @author gustavonalle
* @since 8.0
*/
class MarshallerBuilder {
static <K, V, C> Class<?> toClass(IterationFilter<K, V, C> filter) {
return filter.marshaller.map(Object::getClass).orElse(null);
}
static Marshaller fromClass(Optional<Class<Marshaller>> marshallerClass, Optional<KeyValueFilterConverter> filter) {
return filter.flatMap(f -> marshallerClass.map(m -> {
try {
return m.getConstructor(ClassLoader.class);
} catch (NoSuchMethodException e) {
throw new CacheException(e);
}
}).map(c -> {
try {
return c.newInstance(f.getClass().getClassLoader());
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
throw new CacheException(e);
}
})).orElse(marshallerClass.map(c -> {
try {
return c.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
throw new CacheException(e);
}
}).orElse(genericFromInstance(filter)));
}
static Marshaller genericFromInstance(Optional<?> instance) {
return new GenericJBossMarshaller(instance.map(i -> i.getClass().getClassLoader()).orElse(null));
}
}