You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by rf...@apache.org on 2010/02/19 04:25:34 UTC

svn commit: r911687 - in /tuscany/sca-java-2.x/trunk/modules: core-spi/src/main/java/org/apache/tuscany/sca/provider/ core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/

Author: rfeng
Date: Fri Feb 19 03:25:33 2010
New Revision: 911687

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

Added:
    tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/RuntimeProvider.java   (with props)
Modified:
    tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ImplementationProvider.java
    tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/PolicyProvider.java
    tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ReferenceBindingProvider.java
    tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ServiceBindingProvider.java
    tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/CompositeActivatorImpl.java

Modified: tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ImplementationProvider.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ImplementationProvider.java?rev=911687&r1=911686&r2=911687&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ImplementationProvider.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ImplementationProvider.java Fri Feb 19 03:25:33 2010
@@ -29,19 +29,7 @@
  * 
  * @version $Rev$ $Date$
  */
-public interface ImplementationProvider {
-
-    /**
-     * This method will be invoked when the component implementation
-     * is activated.
-     */
-    void start();
-
-    /**
-     * This method will be invoked when the component implementation
-     * is deactivated.
-     */
-    void stop();
+public interface ImplementationProvider extends RuntimeProvider {
 
     /**
      * Create an invoker for the component implementation in the invocation

Modified: tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/PolicyProvider.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/PolicyProvider.java?rev=911687&r1=911686&r2=911687&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/PolicyProvider.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/PolicyProvider.java Fri Feb 19 03:25:33 2010
@@ -25,7 +25,7 @@
 /**
  * @version $Rev$ $Date$
  */
-public interface PolicyProvider {
+public interface PolicyProvider extends RuntimeProvider {
     /**
      * Create an interceptor for a given operation
      * 
@@ -51,14 +51,4 @@
      *        binding that will be modified
      */
     void configureBinding(Object configuration);
-    
-    /**
-     * Start the provider
-     */
-    void start();
-    
-    /**
-     * Stop the provider
-     */
-    void stop();
 }

Modified: tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ReferenceBindingProvider.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ReferenceBindingProvider.java?rev=911687&r1=911686&r2=911687&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ReferenceBindingProvider.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ReferenceBindingProvider.java Fri Feb 19 03:25:33 2010
@@ -29,20 +29,7 @@
  * 
  * @version $Rev$ $Date$
  */
-public interface ReferenceBindingProvider {
-
-    /**
-     * This method will be invoked when the component reference binding is
-     * activated.
-     */
-    void start();
-
-    /**
-     * This method will be invoked when the component reference binding is
-     * deactivated.
-     */
-    void stop();
-
+public interface ReferenceBindingProvider extends RuntimeProvider {
     /**
      * Create an invoker for the reference binding in the invocation chain. The
      * invoker is responsible for making the outbound invocation over the

Added: tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/RuntimeProvider.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/RuntimeProvider.java?rev=911687&view=auto
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/RuntimeProvider.java (added)
+++ tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/RuntimeProvider.java Fri Feb 19 03:25:33 2010
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.tuscany.sca.provider;
+
+/**
+ * The base interface for runtime providers that can be started or stoppped
+ */
+public interface RuntimeProvider {
+    /**
+     * This method will be invoked when the corresponding SCA component is started.
+     */
+    void start();
+
+    /**
+     * This method will be invoked when the corresponding SCA component is stopped
+     */
+    void stop();
+}

Propchange: tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/RuntimeProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/RuntimeProvider.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ServiceBindingProvider.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ServiceBindingProvider.java?rev=911687&r1=911686&r2=911687&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ServiceBindingProvider.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ServiceBindingProvider.java Fri Feb 19 03:25:33 2010
@@ -27,18 +27,7 @@
  * 
  * @version $Rev$ $Date$
  */
-public interface ServiceBindingProvider {
-    /**
-     * This method will be invoked when the component service binding is
-     * activated.
-     */
-    void start();
-
-    /**
-     * This method will be invoked when the component service binding is
-     * deactivated.
-     */
-    void stop();
+public interface ServiceBindingProvider extends RuntimeProvider {
 
     /**
      * Get the effective interface contract imposed by the binding. For example,

Modified: tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/CompositeActivatorImpl.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/CompositeActivatorImpl.java?rev=911687&r1=911686&r2=911687&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/CompositeActivatorImpl.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/CompositeActivatorImpl.java Fri Feb 19 03:25:33 2010
@@ -21,6 +21,8 @@
 
 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;
 
@@ -45,6 +47,7 @@
 import org.apache.tuscany.sca.provider.PolicyProviderFactory;
 import org.apache.tuscany.sca.provider.ProviderFactoryExtensionPoint;
 import org.apache.tuscany.sca.provider.ReferenceBindingProvider;
+import org.apache.tuscany.sca.provider.RuntimeProvider;
 import org.apache.tuscany.sca.provider.ServiceBindingProvider;
 import org.apache.tuscany.sca.runtime.ActivationException;
 import org.apache.tuscany.sca.runtime.CompositeActivator;
@@ -336,39 +339,79 @@
         compositeContext.bindComponent(runtimeComponent);
         Implementation implementation = component.getImplementation();
         
-        if (implementation instanceof Composite) {
-            start(compositeContext, (Composite)implementation);
-        } else {
-            for (PolicyProvider policyProvider : runtimeComponent.getPolicyProviders()) {
-                policyProvider.start();
-            }
-            ImplementationProvider implementationProvider = runtimeComponent.getImplementationProvider();
-            if (implementationProvider != null) {
-                implementationProvider.start();
+        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
+            // 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;
-                start(compositeContext, ep);
-            }
+            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);
     }
 
+    private void rethrow(Throwable e) throws Error {
+        if(e instanceof RuntimeException) {
+            throw (RuntimeException) e;
+        } else if(e instanceof Error) {
+            throw (Error) e;
+        }
+    }
+
     public void start(CompositeContext compositeContext, RuntimeEndpoint ep) {
+        startEndpoint(compositeContext, ep, null);
+    }
+
+    private void startEndpoint(CompositeContext compositeContext, RuntimeEndpoint ep, final List<RuntimeProvider> providers) {
         // FIXME: Should the policy providers be started before the endpoint is started?
         for (PolicyProvider policyProvider : ep.getPolicyProviders()) {
             policyProvider.start();
+            if (providers != null) {
+                providers.add(policyProvider);
+            }
         }
 
         final ServiceBindingProvider bindingProvider = ep.getBindingProvider();
@@ -378,6 +421,9 @@
             AccessController.doPrivileged(new PrivilegedAction<Object>() {
                 public Object run() {
                     bindingProvider.start();
+                    if (providers != null) {
+                        providers.add(bindingProvider);
+                    }
                     return null;
                   }
             });