From 5cf2cf2306522c7bd3b420e7ce6e362ce3b743f1 Mon Sep 17 00:00:00 2001 From: rfeng Date: Fri, 19 Feb 2010 03:25:33 +0000 Subject: Fix for TUSCANY-3466 git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@911687 13f79535-47bb-0310-9956-ffa450edef68 --- .../sca/provider/ImplementationProvider.java | 14 +--- .../tuscany/sca/provider/PolicyProvider.java | 12 +--- .../sca/provider/ReferenceBindingProvider.java | 15 +--- .../tuscany/sca/provider/RuntimeProvider.java | 35 +++++++++ .../sca/provider/ServiceBindingProvider.java | 13 +--- .../core/assembly/impl/CompositeActivatorImpl.java | 84 +++++++++++++++++----- 6 files changed, 104 insertions(+), 69 deletions(-) create mode 100644 sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/RuntimeProvider.java (limited to 'sca-java-2.x') diff --git a/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ImplementationProvider.java b/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ImplementationProvider.java index 015c673d66..c346463023 100644 --- a/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ImplementationProvider.java +++ b/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ImplementationProvider.java @@ -29,19 +29,7 @@ import org.apache.tuscany.sca.runtime.RuntimeComponentService; * * @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 diff --git a/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/PolicyProvider.java b/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/PolicyProvider.java index 35b64ad56f..92af4c37a0 100644 --- a/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/PolicyProvider.java +++ b/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/PolicyProvider.java @@ -25,7 +25,7 @@ import org.apache.tuscany.sca.invocation.PhasedInterceptor; /** * @version $Rev$ $Date$ */ -public interface PolicyProvider { +public interface PolicyProvider extends RuntimeProvider { /** * Create an interceptor for a given operation * @@ -51,14 +51,4 @@ public interface PolicyProvider { * binding that will be modified */ void configureBinding(Object configuration); - - /** - * Start the provider - */ - void start(); - - /** - * Stop the provider - */ - void stop(); } diff --git a/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ReferenceBindingProvider.java b/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ReferenceBindingProvider.java index b3ab1d8b87..20314a9978 100644 --- a/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ReferenceBindingProvider.java +++ b/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ReferenceBindingProvider.java @@ -29,20 +29,7 @@ import org.apache.tuscany.sca.invocation.Invoker; * * @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 diff --git a/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/RuntimeProvider.java b/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/RuntimeProvider.java new file mode 100644 index 0000000000..2afd44af31 --- /dev/null +++ b/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/RuntimeProvider.java @@ -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(); +} diff --git a/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ServiceBindingProvider.java b/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ServiceBindingProvider.java index e15234a549..a1739db2d2 100644 --- a/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ServiceBindingProvider.java +++ b/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/ServiceBindingProvider.java @@ -27,18 +27,7 @@ import org.apache.tuscany.sca.interfacedef.InterfaceContract; * * @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, diff --git a/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/CompositeActivatorImpl.java b/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/CompositeActivatorImpl.java index 5d07bdad89..629d39ad3e 100644 --- a/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/CompositeActivatorImpl.java +++ b/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/CompositeActivatorImpl.java @@ -21,6 +21,8 @@ package org.apache.tuscany.sca.core.assembly.impl; 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.PolicyProvider; 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 @@ public class CompositeActivatorImpl implements CompositeActivator { 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 providers = new ArrayList(); + 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 (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); + } } - for (Endpoint endpoint : service.getEndpoints()) { - RuntimeEndpoint ep = (RuntimeEndpoint) endpoint; - start(compositeContext, ep); + } 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 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 @@ public class CompositeActivatorImpl implements CompositeActivator { AccessController.doPrivileged(new PrivilegedAction() { public Object run() { bindingProvider.start(); + if (providers != null) { + providers.add(bindingProvider); + } return null; } }); -- cgit v1.2.3