Author: rfeng
Date: Thu Feb 18 22:53:56 2010
New Revision: 911633

URL: http://svn.apache.org/viewvc?rev=911633&view=rev
Log:
Fix for TUSCANY-3466

Modified:
    
tuscany/sca-java-1.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/CompositeActivatorImpl.java

Modified: 
tuscany/sca-java-1.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/CompositeActivatorImpl.java
URL: 
http://svn.apache.org/viewvc/tuscany/sca-java-1.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/CompositeActivatorImpl.java?rev=911633&r1=911632&r2=911633&view=diff
==============================================================================
--- 
tuscany/sca-java-1.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/CompositeActivatorImpl.java
 (original)
+++ 
tuscany/sca-java-1.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/CompositeActivatorImpl.java
 Thu Feb 18 22:53:56 2010
@@ -21,6 +21,7 @@
 
 import java.security.AccessController;
 import java.security.PrivilegedAction;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -575,84 +576,140 @@
             logger.fine("Starting component: " + component.getURI());
         }
         RuntimeComponent runtimeComponent = ((RuntimeComponent)component);
-        if(runtimeComponent.isStarted()) {
-               return;
+        if (runtimeComponent.isStarted()) {
+            return;
         }
-        
+
         configureComponentContext(runtimeComponent);
 
-        for (ComponentReference reference : component.getReferences()) {
-            if (logger.isLoggable(Level.FINE)) {
-                logger.fine("Starting component reference: " + 
component.getURI() + "#" + reference.getName());
-            }
-            RuntimeComponentReference runtimeRef = 
((RuntimeComponentReference)reference);
-            runtimeRef.setComponent(runtimeComponent);
-            
-            for (Endpoint endpoint : reference.getEndpoints()) {
-                final EndpointResolver endpointResolver = 
runtimeRef.getEndpointResolver(endpoint);
-                if (endpointResolver != null) {
-                    // Allow endpoint resolvers to do any startup reference 
manipulation
-                    AccessController.doPrivileged(new 
PrivilegedAction<Object>() {
-                        public Object run() {
-                            endpointResolver.start();
-                            return null;
-                          }
-                    });                       
+        // TUSCANY-3466: We need to track all the providers that are started 
for the component
+        final List<Object> providers = new ArrayList<Object>();
+        try {
+
+            for (ComponentReference reference : component.getReferences()) {
+                if (logger.isLoggable(Level.FINE)) {
+                    logger.fine("Starting component reference: " + 
component.getURI() + "#" + reference.getName());
                 }
-            }
-            
-            for (Binding binding : reference.getBindings()) {
-                final ReferenceBindingProvider bindingProvider = 
runtimeRef.getBindingProvider(binding);
-                if (bindingProvider != null) {
-                    // Allow bindings to add shutdown hooks. Requires 
RuntimePermission shutdownHooks in policy. 
-                    AccessController.doPrivileged(new 
PrivilegedAction<Object>() {
-                        public Object run() {
-                            bindingProvider.start();
-                            return null;
-                          }
-                    });                       
+                RuntimeComponentReference runtimeRef = 
((RuntimeComponentReference)reference);
+                runtimeRef.setComponent(runtimeComponent);
+
+                for (Endpoint endpoint : reference.getEndpoints()) {
+                    final EndpointResolver endpointResolver = 
runtimeRef.getEndpointResolver(endpoint);
+                    if (endpointResolver != null) {
+                        // Allow endpoint resolvers to do any startup 
reference manipulation
+                        AccessController.doPrivileged(new 
PrivilegedAction<Object>() {
+                            public Object run() {
+                                endpointResolver.start();
+                                providers.add(endpointResolver);
+                                return null;
+                            }
+                        });
+                    }
+                }
+
+                for (Binding binding : reference.getBindings()) {
+                    final ReferenceBindingProvider bindingProvider = 
runtimeRef.getBindingProvider(binding);
+                    if (bindingProvider != null) {
+                        // Allow bindings to add shutdown hooks. Requires 
RuntimePermission shutdownHooks in policy. 
+                        AccessController.doPrivileged(new 
PrivilegedAction<Object>() {
+                            public Object run() {
+                                bindingProvider.start();
+                                providers.add(bindingProvider);
+                                return null;
+                            }
+                        });
+                    }
                 }
             }
-        }
 
-        for (ComponentService service : component.getServices()) {
-            if (logger.isLoggable(Level.FINE)) {
-                logger.fine("Starting component service: " + 
component.getURI() + "#" + service.getName());
+            for (ComponentService service : component.getServices()) {
+                if (logger.isLoggable(Level.FINE)) {
+                    logger.fine("Starting component service: " + 
component.getURI() + "#" + service.getName());
+                }
+                RuntimeComponentService runtimeService = 
(RuntimeComponentService)service;
+                for (Binding binding : service.getBindings()) {
+                    final ServiceBindingProvider bindingProvider = 
runtimeService.getBindingProvider(binding);
+                    if (bindingProvider != null) {
+                        // bindingProvider.start();
+                        // Allow bindings to add shutdown hooks. Requires 
RuntimePermission shutdownHooks in policy. 
+                        AccessController.doPrivileged(new 
PrivilegedAction<Object>() {
+                            public Object run() {
+                                bindingProvider.start();
+                                providers.add(bindingProvider);
+                                return null;
+                            }
+                        });
+                    }
+                }
             }
-            RuntimeComponentService runtimeService = 
(RuntimeComponentService)service;
-            for (Binding binding : service.getBindings()) {
-                final ServiceBindingProvider bindingProvider = 
runtimeService.getBindingProvider(binding);
-                if (bindingProvider != null) {
-                    // bindingProvider.start();
-                    // Allow bindings to add shutdown hooks. Requires 
RuntimePermission shutdownHooks in policy. 
-                    AccessController.doPrivileged(new 
PrivilegedAction<Object>() {
-                        public Object run() {
-                            bindingProvider.start();
-                            return null;
-                          }
-                    });                       
+
+            Implementation implementation = component.getImplementation();
+            if (implementation instanceof Composite) {
+                try {
+                    start((Composite)implementation);
+                } catch (Throwable e) {
+                    // Stop the started components within the composite
+                    try {
+                        stop((Composite)implementation);
+                    } catch (Throwable e1) {
+                        logger.log(Level.SEVERE, e1.getMessage(), e1);
+                    }
+                    rethrow(e);
+                }
+            } else {
+                ImplementationProvider implementationProvider = 
runtimeComponent.getImplementationProvider();
+                if (implementationProvider != null) {
+                    implementationProvider.start();
+                    providers.add(implementationProvider);
                 }
             }
+
+            if (component instanceof ScopedRuntimeComponent) {
+                ScopedRuntimeComponent scopedRuntimeComponent = 
(ScopedRuntimeComponent)component;
+                ScopeContainer<?> scopeContainer = 
scopedRuntimeComponent.getScopeContainer();
+                if (scopeContainer != null) {
+                    scopeContainer.start();
+                    providers.add(scopeContainer);
+                }
+            }
+        } catch (Throwable e) {
+            // Stop all the providers that are already started so far
+            stopProviders(providers);
+            rethrow(e);
+        } finally {
+            providers.clear();
         }
 
-        Implementation implementation = component.getImplementation();
-        if (implementation instanceof Composite) {
-            start((Composite)implementation);
-        } else {
-            ImplementationProvider implementationProvider = 
runtimeComponent.getImplementationProvider();
-            if (implementationProvider != null) {
-                implementationProvider.start();
-            }
+        runtimeComponent.setStarted(true);
+    }
+
+    private void rethrow(Throwable e) throws Error {
+        if (e instanceof RuntimeException) {
+            throw (RuntimeException)e;
+        } else if (e instanceof Error) {
+            throw (Error)e;
         }
+    }
 
-        if (component instanceof ScopedRuntimeComponent) {
-            ScopedRuntimeComponent scopedRuntimeComponent = 
(ScopedRuntimeComponent)component;
-            if (scopedRuntimeComponent.getScopeContainer() != null) {
-                scopedRuntimeComponent.getScopeContainer().start();
+    private void stopProviders(final List<Object> providers) {
+        for (int i = providers.size() - 1; i >= 0; i--) {
+            Object provider = providers.get(i);
+            try {
+                if (provider instanceof ImplementationProvider) {
+                    ((ImplementationProvider)provider).stop();
+                } else if (provider instanceof ReferenceBindingProvider) {
+                    ((ReferenceBindingProvider)provider).stop();
+                } else if (provider instanceof ServiceBindingProvider) {
+                    ((ServiceBindingProvider)provider).stop();
+                } else if (provider instanceof EndpointResolver) {
+                    ((EndpointResolver)provider).stop();
+                } else if (provider instanceof ScopeContainer) {
+                    ((ScopeContainer)provider).stop();
+                }
+            } catch (Throwable e) {
+                logger.log(Level.SEVERE, e.getMessage(), e);
             }
         }
-
-        runtimeComponent.setStarted(true);
     }
 
     /**


Reply via email to