package com.gravspace.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import scala.concurrent.Future; import com.gravspace.abstractions.ICalculation; import com.gravspace.abstractions.IDataAccessor; import com.gravspace.abstractions.IRenderer; import com.gravspace.bases.ConcurrantCallable; import com.gravspace.bases.RendererBase; import com.gravspace.defaults.DefaultRenderer; import com.gravspace.messages.CalculationMessage; import com.gravspace.messages.PersistanceMessage; import com.gravspace.messages.RenderMessage; import com.gravspace.messages.TaskMessage; public class Renderers { private static class RendererProxyImpl implements InvocationHandler { protected ConcurrantCallable caller; private String concreteCanonicalName; public RendererProxyImpl(ConcurrantCallable caller, String concreteCanonicalName) { this.caller = caller; this.concreteCanonicalName = concreteCanonicalName; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (args == null) args = new Object[]{}; RenderMessage rm = null; //this is either template / or context if (args[0] instanceof String){ rm = new RenderMessage(concreteCanonicalName, (String)args[0], (Map<String, ?>)args[1]); } else { rm = new RenderMessage(concreteCanonicalName, (Map<String, ?>)args[1]); } // List<Object> task_args = new ArrayList<>(); // task_args.add(Arrays.asList(args)); //RenderMessage rm = new RenderMessage(concreteCanonicalName, template, task_args[0]) return caller.ask(rm); } } @SuppressWarnings("unchecked") public static <T> T get(Class<T> iface, Class<? extends IDataAccessor> concrete, ConcurrantCallable caller) { return (T) Proxy.newProxyInstance( Renderers.class.getClassLoader(), new Class[] { iface }, new RendererProxyImpl(caller, concrete.getCanonicalName())); } @SuppressWarnings("unchecked") public static IRenderer getDefault(ConcurrantCallable caller) { return (IRenderer) Proxy.newProxyInstance( Renderers.class.getClassLoader(), new Class[] { IRenderer.class }, new RendererProxyImpl(caller, DefaultRenderer.class.getCanonicalName())); } }