package org.oddjob.beanbus.mega;
import org.oddjob.arooa.ArooaDescriptor;
import org.oddjob.arooa.ArooaSession;
import org.oddjob.arooa.ArooaTools;
import org.oddjob.arooa.deploy.ClassPathDescriptorFactory;
import org.oddjob.arooa.deploy.LinkedDescriptor;
import org.oddjob.arooa.life.ComponentPersister;
import org.oddjob.arooa.life.ComponentProxyResolver;
import org.oddjob.arooa.registry.BeanRegistry;
import org.oddjob.arooa.registry.ComponentPool;
import org.oddjob.arooa.runtime.PropertyManager;
import org.oddjob.arooa.standard.ExtendedTools;
/**
* Constructs an {@link ArooaSession} for a {@link MegaBeanBus}.
*
* @author rob
*
*/
public class MegaBusSessionFactory {
public static final String AROOA_DESCRIPTOR_RESOURCE =
"META-INF/beanbus-parts.xml";
/**
* Create a session.
*
* @param oddjob Used to find the id of Oddjob in any existing session
* if a persister is being used.
*
* @return A session. Never null.
*/
public ArooaSession createSession(final ArooaSession existingSession,
ClassLoader classLoader) {
if (existingSession == null) {
throw new NullPointerException("No existing ArooaSession.");
}
ComponentProxyResolver componentProxyResolver = null;
ClassPathDescriptorFactory descriptorFactory =
new ClassPathDescriptorFactory();
descriptorFactory.setResource(AROOA_DESCRIPTOR_RESOURCE);
ArooaDescriptor descriptor = descriptorFactory.createDescriptor(
classLoader);
ArooaDescriptor existingDescriptor =
existingSession.getArooaDescriptor();
descriptor = new LinkedDescriptor(descriptor,
existingDescriptor);
ArooaTools tools = new ExtendedTools(
existingSession.getTools(),
descriptor);
componentProxyResolver =
new MegaBusComponentResolver(
existingSession.getComponentProxyResolver());
final ArooaDescriptor finalDescriptor = descriptor;
final ArooaTools finalTools = tools;
final ComponentProxyResolver finalComponentProxyResolver =
componentProxyResolver;
return new ArooaSession() {
@Override
public ArooaDescriptor getArooaDescriptor() {
return finalDescriptor;
}
@Override
public ComponentPool getComponentPool() {
return existingSession.getComponentPool();
}
@Override
public BeanRegistry getBeanRegistry() {
return existingSession.getBeanRegistry();
}
@Override
public PropertyManager getPropertyManager() {
return existingSession.getPropertyManager();
}
@Override
public ArooaTools getTools() {
return finalTools;
}
@Override
public ComponentPersister getComponentPersister() {
return null;
}
@Override
public ComponentProxyResolver getComponentProxyResolver() {
return finalComponentProxyResolver;
}
};
}
}