package org.n3r.eql.eqler; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import lombok.SneakyThrows; import lombok.val; import org.n3r.eql.eqler.generators.ClassGenerator; import org.n3r.eql.ex.EqlConfigException; public class EqlerFactory { private static LoadingCache<Class, Object> eqlerCache = CacheBuilder.newBuilder().build(new CacheLoader<Class, Object>() { @Override public Object load(Class eqlerClass) throws Exception { val generator = new ClassGenerator(eqlerClass); Class<?> eqlImplClass = generator.generate(); return createObject(eqlImplClass); } }); public static <T> T getEqler(final Class<T> eqlerClass) { ensureClassIsAnInterface(eqlerClass); return (T) eqlerCache.getUnchecked(eqlerClass); } @SneakyThrows private static <T> T createObject(Class<T> clazz) { return clazz.newInstance(); } private static <T> void ensureClassIsAnInterface(Class<T> clazz) { if (clazz.isInterface()) return; throw new EqlConfigException(clazz + " is not an interface"); } }