package org.jboss.jms.container;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.jms.JMSException;
import org.jboss.aop.Advised;
import org.jboss.aop.InstanceAdvisor;
import org.jboss.aop.MethodInfo;
import org.jboss.aop.advice.Interceptor;
import org.jboss.aop.joinpoint.Invocation;
import org.jboss.aop.joinpoint.MethodInvocation;
import org.jboss.aop.metadata.MetaDataResolver;
import org.jboss.aop.metadata.SimpleMetaData;
public class Container implements InvocationHandler
{
protected Interceptor[] interceptors;
protected SimpleMetaData metadata = new SimpleMetaData();
private Object proxy;
private Container parent;
private Set children = Collections.synchronizedSet(new HashSet());
public static Container getContainer(Object object)
throws Throwable
{
Proxy proxy = (Proxy) object;
return (Container) Proxy.getInvocationHandler(proxy);
}
public static Container getContainer(Invocation invocation)
{
return (Container) invocation.getMetaData("JMS", "Container");
}
public static Object getProxy(Invocation invocation)
{
return getContainer(invocation).getProxy();
}
public Container(Container parent, Interceptor[] interceptors, SimpleMetaData metadata)
throws JMSException
{
this.interceptors = interceptors;
this.parent = parent;
if (metadata != null)
this.metadata = metadata;
this.metadata.addMetaData("JMS", "Container", this);
if (parent != null)
parent.children.add(this);
}
public Object getProxy()
{
return proxy;
}
public void setProxy(Object proxy)
{
this.proxy = proxy;
}
public Container getParent()
{
return parent;
}
public Set getChildren()
{
return children;
}
public void addChild(Container child)
{
children.add(child);
}
public void removeChild(Container child)
{
children.remove(child);
}
public Object invoke (Invocation invocation)
throws Throwable
{
try
{
return invocation.invokeNext(interceptors);
}
finally
{
}
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
MethodInfo info = new MethodInfo();
MethodInvocation invocation = new MethodInvocation(info, interceptors);
return invocation.invokeNext();
}
}