package org.archstudio.myx.java.conn;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import org.archstudio.myx.fw.IMyxBrickItems;
import org.archstudio.myx.fw.MyxUtils;
import com.google.common.collect.Sets;
/**
* Myx brick: "Event Pump Impl"
*
* @see org.archstudio.myx.java.conn.EventPumpConnectorStub
* @generated
*/
public class EventPumpConnector extends org.archstudio.myx.java.conn.EventPumpConnectorStub {
protected ExecutorService asyncExecutor = null;
@Override
public void init() {
super.init();
asyncExecutor = Executors.newSingleThreadExecutor();
}
@Override
public void destroy() {
asyncExecutor.shutdown();
try {
asyncExecutor.awaitTermination(5, TimeUnit.SECONDS);
}
catch (InterruptedException e) {
e.printStackTrace();
}
asyncExecutor = null;
super.destroy();
}
protected ClassLoader getClassLoader(IMyxBrickItems brickItems) {
return getClass().getClassLoader();
}
protected Class<?>[] getInterfaceClasses(IMyxBrickItems brickItems, ClassLoader classLoader) {
try {
Set<Class<?>> interfaceClasses = Sets.newHashSet();
int i = 0;
while (true) {
String interfaceClassName = MyxUtils.getInitProperties(this).get("interfaceClassName" + i);
if (interfaceClassName == null) {
break;
}
interfaceClasses.add(classLoader.loadClass(interfaceClassName));
i++;
}
return interfaceClasses.toArray(new Class<?>[0]);
}
catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
@Override
public void setMyxBrickItems(IMyxBrickItems brickItems) {
super.setMyxBrickItems(brickItems);
ClassLoader classLoader = getClassLoader(brickItems);
in = Proxy.newProxyInstance(classLoader, getInterfaceClasses(brickItems, classLoader), new InvocationHandler() {
@Override
public Object invoke(Object proxy, final Method method, final Object[] args) throws Throwable {
for (final Object o : out) {
try {
asyncExecutor.submit(new Runnable() {
@Override
public void run() {
try {
method.invoke(o, args);
}
catch (Throwable e) {
e.printStackTrace();
}
}
});
}
catch (Throwable t) {
t.printStackTrace();
}
}
return null;
}
});
}
}