/*
**
** Copyright 2013, Jules White
**
**
*/
package org.magnum.soda.android;
import java.io.File;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.HashMap;
import java.util.Map;
import org.magnum.soda.proxy.ProxyCreator;
import com.google.dexmaker.stock.ProxyBuilder;
public class DexProxyCreator implements ProxyCreator {
public DexProxyCreator(ClassLoader cl) {
classLoader_ = cl;
}
private ClassLoader classLoader_;
private Map<Object, InvocationHandler> proxies_ = new HashMap<Object, InvocationHandler>();
private File dexCache_;
public DexProxyCreator(File dexCache) {
super();
dexCache_ = dexCache;
}
@Override
public Object createProxy(ClassLoader arg0, Class<?>[] arg1,
InvocationHandler arg2) {
Object proxy = null;
try {
if (arg1.length == 1 && !arg1[0].isInterface()) {
proxy = ProxyBuilder.forClass(arg1[0]).dexCache(dexCache_)
.handler(arg2).build();
} else {
proxy = Proxy.newProxyInstance(classLoader_,
arg1, arg2);
}
if(proxy != null){
proxies_.put(proxy, arg2);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return proxy;
}
@Override
public InvocationHandler getInvocationHandler(Object arg0) {
return proxies_.get(arg0);
}
@Override
public boolean supportsNonInterfaceProxies() {
return true;
}
@Override
public ClassLoader getProxyClassLoader() {
return classLoader_;
}
}