public void start(CompositeContext compositeContext, Component component) {
if (logger.isLoggable(Level.FINE)) {
logger.fine("Starting component: " + component.getURI());
}
RuntimeComponent runtimeComponent = ((RuntimeComponent)component);
if(runtimeComponent.isStarted()) {
return;
}
compositeContext.bindComponent(runtimeComponent);
Implementation implementation = component.getImplementation();
List<RuntimeProvider> providers = new ArrayList<RuntimeProvider>();
try {
if (implementation instanceof Composite) {
try {
start(compositeContext, (Composite)implementation);
} catch (Throwable e) {
try {
stop(compositeContext, (Composite) implementation);
} catch (Throwable e1) {
logger.log(Level.SEVERE, e1.getMessage(), e1);
}
rethrow(e);
}
} else {
for (PolicyProvider policyProvider : runtimeComponent.getPolicyProviders()) {
policyProvider.start();
providers.add(policyProvider);
}
ImplementationProvider implementationProvider = runtimeComponent.getImplementationProvider();
if (implementationProvider != null) {
implementationProvider.start();
providers.add(implementationProvider);
}
}
// Reference bindings aren't started until the wire is first used although this may
// happen when the scope container is started in the case of @EagerInit
for (ComponentService service : component.getServices()) {
if (logger.isLoggable(Level.FINE)) {
logger.fine("Starting component service: " + component.getURI() + "#" + service.getName());
}
for (Endpoint endpoint : service.getEndpoints()) {
RuntimeEndpoint ep = (RuntimeEndpoint)endpoint;
startEndpoint(compositeContext, ep, providers);
}
}
} catch (Throwable e) {
for (int i = providers.size() - 1; i >= 0; i--) {
try {
providers.get(i).stop();
} catch (Throwable e1) {
logger.log(Level.SEVERE, e1.getMessage(), e1);
}
}
rethrow(e);
} finally {
providers.clear();
}
runtimeComponent.setStarted(true);
}