/*
* (c) Rob Gordon 2005
*/
package org.oddjob.beanbus.mega;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.Collection;
import org.oddjob.arooa.ArooaSession;
import org.oddjob.arooa.life.ComponentProxyResolver;
import org.oddjob.framework.WrapperInvocationHandler;
/**
* Possibly provide a proxy to use as the component.
*
*
* @author Rob Gordon.
*/
public class MegaBusComponentResolver
implements ComponentProxyResolver {
private final ComponentProxyResolver existing;
public MegaBusComponentResolver(ComponentProxyResolver existing) {
this.existing = existing;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public Object resolve(final Object component, ArooaSession session) {
Object proxy;
if (component instanceof BusPart) {
proxy = component;
}
else if (component instanceof Collection) {
proxy = new CollectionProxyGenerator().generate(
(Collection<?>) component,
component.getClass().getClassLoader());
}
else {
proxy = existing.resolve(component, session);
}
return proxy;
}
@Override
public Object restore(Object proxy, ArooaSession session) {
Object component;
if (!Proxy.isProxyClass(proxy.getClass())) {
component = proxy;
}
else {
InvocationHandler handler = Proxy.getInvocationHandler(proxy);
component = ((WrapperInvocationHandler) handler).getWrappedComponent();
}
return component;
}
}