public Component lookup(final String role)
throws ComponentException {
if (null == role) {
final String message =
"ComponentLocator Attempted to retrieve component with null role.";
throw new ComponentException(role, message);
}
if (role.equals(SourceResolver.ROLE)) {
if (null == this.sourceResolver) {
if(wasDisposed) {
// (BD) working on bug 27249: I think we could throw an Exception here, as
// the following call fails anyway, but I'm not sure enough ;-)
getLogger().warn("Trying to lookup SourceResolver on disposed CocoonComponentManager");
}
this.sourceResolver = (SourceResolver) super.lookup( role );
}
return this;
}
final EnvironmentStack stack = (EnvironmentStack)environmentStack.get();
if ( null != stack && !stack.isEmpty()) {
final Object[] objects = (Object[])stack.getCurrent();
final Map objectModel = ((Environment)objects[0]).getObjectModel();
EnvironmentDescription desc = (EnvironmentDescription)objectModel.get(PROCESS_KEY);
if ( null != desc ) {
Component component = desc.getRequestLifecycleComponent(role);
if (null != component) {
return component;
}
component = desc.getGlobalRequestLifecycleComponent(role);
if (null != component) {
return component;
}
}
}
final Component component = super.lookup(role);
if (component != null && component instanceof RequestLifecycleComponent) {
if (stack == null || stack.isEmpty()) {
throw new ComponentException(role, "ComponentManager has no Environment Stack.");
}
final Object[] objects = (Object[]) stack.getCurrent();
final Map objectModel = ((Environment) objects[0]).getObjectModel();
EnvironmentDescription desc = (EnvironmentDescription) objectModel.get(PROCESS_KEY);
if (null != desc) {
// first test if the parent CM has already initialized this component
if (!desc.containsRequestLifecycleComponent(role)) {
try {
if (component instanceof Recomposable) {
((Recomposable) component).recompose(this);
}
((RequestLifecycleComponent) component).setup((org.apache.cocoon.environment.SourceResolver)objects[0],
objectModel);
} catch (Exception local) {
throw new ComponentException(role, "Exception during setup of RequestLifecycleComponent.", local);
}
desc.addRequestLifecycleComponent(role, component, this);
}
}
}
if (component != null && component instanceof GlobalRequestLifecycleComponent) {
if (stack == null || stack.isEmpty()) {
throw new ComponentException(role, "ComponentManager has no Environment Stack.");
}
final Object[] objects = (Object[]) stack.getCurrent();
final Map objectModel = ((Environment)objects[0]).getObjectModel();
EnvironmentDescription desc = (EnvironmentDescription) objectModel.get(PROCESS_KEY);
if (null != desc) {
// first test if the parent CM has already initialized this component
if ( !desc.containsGlobalRequestLifecycleComponent( role ) ) {
try {
if (component instanceof Recomposable) {
((Recomposable) component).recompose(this);
}
((GlobalRequestLifecycleComponent) component).setup((org.apache.cocoon.environment.SourceResolver)objects[0],
objectModel);
} catch (Exception local) {
throw new ComponentException(role, "Exception during setup of RequestLifecycleComponent.", local);
}
desc.addGlobalRequestLifecycleComponent(role, component, this);
}
}
}
if (component != null && component instanceof SitemapConfigurable) {
// FIXME: how can we prevent that this is called over and over again?
SitemapConfigurationHolder holder;
holder = (SitemapConfigurationHolder) this.sitemapConfigurationHolders.get(role);
if (null == holder) {
// create new holder
holder = new DefaultSitemapConfigurationHolder(role);
this.sitemapConfigurationHolders.put(role, holder);
}
try {
((SitemapConfigurable)component).configure(holder);
} catch (ConfigurationException ce) {
throw new ComponentException(role, "Exception during setup of SitemapConfigurable.", ce);
}
}
return component;
}