if (instance_ != null)
return instance_;
//
ExoContainer exocontainer = (ExoContainer)container;
Component component = null;
ConfigurationManager manager;
String componentKey;
try
{
InitParams params = null;
boolean debug = false;
synchronized (this)
{
// Avoid to create duplicate instances if it is called at the same time by several threads
if (instance_ != null)
return instance_;
// Get the component
Object key = getComponentKey();
if (key instanceof String)
componentKey = (String)key;
else
componentKey = ((Class)key).getName();
manager = (ConfigurationManager)exocontainer.getComponentInstanceOfType(ConfigurationManager.class);
component = manager.getComponent(componentKey);
if (component != null)
{
params = component.getInitParams();
debug = component.getShowDeployInfo();
}
// Please note that we cannot fully initialize the Object "instance_" before releasing other
// threads because it could cause StackOverflowError due to recursive calls
Object instance = exocontainer.createComponent(getComponentImplementation(), params);
if (instance_ != null)
{
// Avoid instantiating twice the same component in case of a cyclic reference due
// to component plugins
return instance_;
}
exocontainer.addComponentToCtx(getComponentKey(), instance);
if (debug)
LOG.debug("==> create component : " + instance_);
if (component != null && component.getComponentPlugins() != null)
{
addComponentPlugin(debug, instance, component.getComponentPlugins(), exocontainer);
}
ExternalComponentPlugins ecplugins = manager.getConfiguration().getExternalComponentPlugins(componentKey);
if (ecplugins != null)
{
addComponentPlugin(debug, instance, ecplugins.getComponentPlugins(), exocontainer);
}
// check if component implement the ComponentLifecycle
if (instance instanceof ComponentLifecycle)
{
ComponentLifecycle lc = (ComponentLifecycle)instance;
lc.initComponent(exocontainer);
}
instance_ = instance;
}
}
catch (Exception ex)
{
String msg = "Cannot instantiate component " + getComponentImplementation();
if (component != null)
{
msg =
"Cannot instantiate component key=" + component.getKey() + " type=" + component.getType() + " found at "
+ component.getDocumentURL();
}
throw new RuntimeException(msg, ex);
}
finally
{