package net.sourceforge.javautil.container.impl;
import java.lang.reflect.Proxy;
import net.sourceforge.javautil.common.reflection.cache.ClassCache;
import net.sourceforge.javautil.common.reflection.cache.ClassMethod;
import net.sourceforge.javautil.container.IContainer;
import net.sourceforge.javautil.container.annotation.Container;
import net.sourceforge.javautil.lifecycle.ILifecycle;
import net.sourceforge.javautil.lifecycle.ILifecycle.PhaseType;
import net.sourceforge.javautil.lifecycle.annotation.Lifecycle;
import net.sourceforge.javautil.lifecycle.impl.ChildLifecycle;
import net.sourceforge.javautil.lifecycle.impl.LifecyclePojo;
import net.sourceforge.javautil.lifecycle.impl.ParentLifecycle;
/**
* A container backed by a POJO.
*
* @author elponderador
* @author $Author$
* @version $Id$
*/
public class ContainerPojo<T> extends ContainerAbstract {
/**
* @param pojoContainer The pojo container from which to extract a name
* @return The name of the pojo container
*/
public static String getPojoContainerName (Object pojoContainer) {
Container container = pojoContainer.getClass().getAnnotation(Container.class);
if (container != null && !"".equals(container.name())) {
return container.name();
} else {
if (Proxy.isProxyClass(pojoContainer.getClass())) {
for (Class<?> iface : pojoContainer.getClass().getInterfaces()) {
container = iface.getAnnotation(Container.class);
if (container != null && !"".equals(container.name())) {
return container.name();
} else if (container != null) {
return iface.getSimpleName();
}
}
return "Proxied Container";
}
return pojoContainer.getClass().getSimpleName().split("\\$")[0];
}
}
protected final T pojoContainer;
public ContainerPojo(T pojoContainer) {
this(getPojoContainerName(pojoContainer), pojoContainer);
}
public ContainerPojo(String name, T pojoContainer) {
super(name);
this.pojoContainer = pojoContainer;
}
@Override protected ILifecycle createLifecycle() {
ClassMethod method = ClassCache.getFor(pojoContainer.getClass()).getMethod(Lifecycle.class);
if (method != null) {
return (ILifecycle) method.invoke(pojoContainer);
} else {
return new LifecyclePojo(pojoContainer);
}
}
}