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 2007/07/16 00:32:30 UTC

svn commit: r556465 - in /incubator/tuscany/java/sca/modules: core/src/main/java/org/apache/tuscany/sca/core/runtime/CompositeActivatorImpl.java extension-helper/src/main/java/org/apache/tuscany/sca/spi/impl/BindingsActivator.java

Author: rfeng
Date: Sun Jul 15 15:32:29 2007
New Revision: 556465

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

Modified:
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/CompositeActivatorImpl.java
    incubator/tuscany/java/sca/modules/extension-helper/src/main/java/org/apache/tuscany/sca/spi/impl/BindingsActivator.java

Modified: incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/CompositeActivatorImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/CompositeActivatorImpl.java?view=diff&rev=556465&r1=556464&r2=556465
==============================================================================
--- incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/CompositeActivatorImpl.java (original)
+++ incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/CompositeActivatorImpl.java Sun Jul 15 15:32:29 2007
@@ -241,7 +241,14 @@
                 ReferenceBindingProvider bindingProvider = ((RuntimeComponentReference)reference)
                     .getBindingProvider(binding);
                 if (bindingProvider != null) {
-                    bindingProvider.start();
+                    try {
+                        bindingProvider.start();
+                    } catch (RuntimeException e) {
+                        // TODO: [rfeng] Ignore the self reference if a runtime exception happens
+                        if (!reference.getName().startsWith("$self$.")) {
+                            throw e;
+                        }
+                    }
                 }
             }
             if (reference.getCallback() != null) {
@@ -630,17 +637,24 @@
                                        Binding binding,
                                        InvocationChain chain,
                                        Operation operation) {
-        ReferenceBindingProvider provider = ((RuntimeComponentReference)reference).getBindingProvider(binding);
-        if (provider != null) {
-            Invoker invoker = null;
-            if (provider instanceof ReferenceBindingProvider2) { 
-                invoker = ((ReferenceBindingProvider2)provider).createInvoker(operation);
-            } else {
-                // must be an old provider that only has the deprecated signature
-                invoker = provider.createInvoker(operation, false);
-            }
-            if (invoker != null) {
-                chain.addInvoker(invoker);
+        try {
+            ReferenceBindingProvider provider = ((RuntimeComponentReference)reference).getBindingProvider(binding);
+            if (provider != null) {
+                Invoker invoker = null;
+                if (provider instanceof ReferenceBindingProvider2) {
+                    invoker = ((ReferenceBindingProvider2)provider).createInvoker(operation);
+                } else {
+                    // must be an old provider that only has the deprecated signature
+                    invoker = provider.createInvoker(operation, false);
+                }
+                if (invoker != null) {
+                    chain.addInvoker(invoker);
+                }
+            }
+        } catch (RuntimeException e) {
+            // TODO: [rfeng] Ignore the self reference if a runtime exception happens
+            if (!reference.getName().startsWith("$self$.")) {
+                throw e;
             }
         }
     }

Modified: incubator/tuscany/java/sca/modules/extension-helper/src/main/java/org/apache/tuscany/sca/spi/impl/BindingsActivator.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/extension-helper/src/main/java/org/apache/tuscany/sca/spi/impl/BindingsActivator.java?view=diff&rev=556465&r1=556464&r2=556465
==============================================================================
--- incubator/tuscany/java/sca/modules/extension-helper/src/main/java/org/apache/tuscany/sca/spi/impl/BindingsActivator.java (original)
+++ incubator/tuscany/java/sca/modules/extension-helper/src/main/java/org/apache/tuscany/sca/spi/impl/BindingsActivator.java Sun Jul 15 15:32:29 2007
@@ -20,7 +20,9 @@
 package org.apache.tuscany.sca.spi.impl;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import javax.xml.namespace.QName;
 
@@ -52,105 +54,52 @@
 
     protected List<BindingActivator> bindingActivators;
     protected AssemblyFactory assemblyFactory;
-    
+    protected Map<Class, BindingActivator> bindingActivatorMap = new HashMap<Class, BindingActivator>();
+
     public void start(ExtensionPointRegistry registry) {
 
         ModelFactoryExtensionPoint factories = registry.getExtensionPoint(ModelFactoryExtensionPoint.class);
         this.assemblyFactory = factories.getFactory(AssemblyFactory.class);
 
-        this.bindingActivators = DiscoveryUtils.discoverActivators(BindingActivator.class, getClass().getClassLoader(), registry);
-
-        StAXArtifactProcessorExtensionPoint staxProcessors = registry.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);
-
-        for (final BindingActivator bindingActivator : bindingActivators) {
+        this.bindingActivators =
+            DiscoveryUtils.discoverActivators(BindingActivator.class, getClass().getClassLoader(), registry);
 
-            QName scdlQName = getBindingQName(bindingActivator.getBindingClass());
-            staxProcessors.addArtifactProcessor(new BindingSCDLProcessor(scdlQName, bindingActivator.getBindingClass()));
+        StAXArtifactProcessorExtensionPoint staxProcessors =
+            registry.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);
 
-            if (bindingActivator.getBindingClass() != null) {
-                // Add a ProviderFactory
-                ProviderFactoryExtensionPoint providerFactories =
-                    registry.getExtensionPoint(ProviderFactoryExtensionPoint.class);
-
-                providerFactories.addProviderFactory(new BindingProviderFactory() {
-                    public ReferenceBindingProvider createReferenceBindingProvider(final RuntimeComponent rc,
-                                                                                   final RuntimeComponentReference rcr,
-                                                                                   final Binding b) {
-                        return new ReferenceBindingProvider() {
-                            List<InvokerProxy> invokers = new ArrayList<InvokerProxy>();
-                            private InvokerFactory factory;
-                            public Invoker createInvoker(Operation operation, boolean isCallback) {
-                                InvokerProxy invoker = new InvokerProxy(operation);
-                                invokers.add(invoker);    
-                                return invoker;
-                            }
-                            public InterfaceContract getBindingInterfaceContract() {
-                                return null;
-                            }
-                            public void start() {
-                                if (b instanceof PojoBinding) {
-                                    factory = bindingActivator.createInvokerFactory(rc, rcr, b, ((PojoBinding)b).getUserBinding());
-                                } else {
-                                    factory = bindingActivator.createInvokerFactory(rc, rcr, b, b);
-                                }
-                                if (factory instanceof ComponentLifecycle) {
-                                    ((ComponentLifecycle)factory).start();
-                                }
-                                for (InvokerProxy invoker : invokers) {
-                                    invoker.start(factory);
-                                }
-                            }
-                            public void stop() {
-                                if (factory instanceof ComponentLifecycle) {
-                                    ((ComponentLifecycle)factory).stop();
-                                }
-                            }};
-                    }
-
-                    public ServiceBindingProvider createServiceBindingProvider(final RuntimeComponent rc,
-                                                                               final RuntimeComponentService rcs,
-                                                                               final Binding b) {
-                        final Object pojoBinding;
-                        if (b instanceof PojoBinding) {
-                            pojoBinding = ((PojoBinding)b).getUserBinding();
-                        } else {
-                            pojoBinding = b;
-                        }
-                        return new ServiceBindingProvider(){
-                            ComponentLifecycle listener = bindingActivator.createService(rc, rcs, b, pojoBinding);
-                            public InterfaceContract getBindingInterfaceContract() {
-                                return null;
-                            }
-                            public void start() {
-                                listener.start();
-                            }
-                            public void stop() {
-                                listener.stop();
-                            }};
-                    }
+        ProviderFactoryExtensionPoint providerFactories =
+            registry.getExtensionPoint(ProviderFactoryExtensionPoint.class);
 
-                    public Class getModelType() {
-                        Class c = bindingActivator.getBindingClass();
-                        if (Binding.class.isAssignableFrom(c)) {
-                            return c;
-                        } else {
-                            return PojoBinding.class;
-                        }
-                    }
-                });
+        for (final BindingActivator bindingActivator : bindingActivators) {
+            Class bindingClass = bindingActivator.getBindingClass();
+            bindingActivatorMap.put(bindingClass, bindingActivator);
+            QName scdlQName = getBindingQName(bindingClass);
+            staxProcessors.addArtifactProcessor(new BindingSCDLProcessor(scdlQName, bindingClass));
+            
+            // Check if the binding extends from Binding interface
+            if (Binding.class.isAssignableFrom(bindingClass)) {
+                // Add provider factory against the binding class
+                providerFactories.addProviderFactory(new DelegatingBindingProviderFactory(bindingClass));
             }
+
         }
+
+        // Add a generic provider factory against PojoBinding.class
+        providerFactories.addProviderFactory(new DelegatingBindingProviderFactory(PojoBinding.class));
     }
 
     public void stop(ExtensionPointRegistry registry) {
-        StAXArtifactProcessorExtensionPoint staxProcessors = registry.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);
-        ProviderFactoryExtensionPoint providerFactories = registry.getExtensionPoint(ProviderFactoryExtensionPoint.class);
+        StAXArtifactProcessorExtensionPoint staxProcessors =
+            registry.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);
+        ProviderFactoryExtensionPoint providerFactories =
+            registry.getExtensionPoint(ProviderFactoryExtensionPoint.class);
 
         for (final BindingActivator bindingActivator : bindingActivators) {
 
             // Remove the binding SCDL processor from the runtime
             if (staxProcessors != null) {
-                StAXArtifactProcessor processor = staxProcessors.getProcessor(getBindingQName(bindingActivator.getBindingClass()));
+                StAXArtifactProcessor processor =
+                    staxProcessors.getProcessor(getBindingQName(bindingActivator.getBindingClass()));
                 if (processor != null) {
                     staxProcessors.removeArtifactProcessor(processor);
                 }
@@ -164,6 +113,12 @@
                 }
             }
         }
+        if (providerFactories != null) {
+            ProviderFactory factory = providerFactories.getProviderFactory(PojoBinding.class);
+            if (factory != null) {
+                providerFactories.removeProviderFactory(factory);
+            }
+        }
     }
 
     protected QName getBindingQName(Class bindingClass) {
@@ -172,10 +127,10 @@
             localName = localName.substring(localName.lastIndexOf('.') + 1);
         }
         if (localName.endsWith("Binding")) {
-            localName = localName.substring(0, localName.length()-7);
+            localName = localName.substring(0, localName.length() - 7);
         }
         StringBuilder sb = new StringBuilder(localName);
-        for (int i=0; i<sb.length(); i++) {
+        for (int i = 0; i < sb.length(); i++) {
             if (Character.isUpperCase(sb.charAt(i))) {
                 sb.setCharAt(i, Character.toLowerCase(sb.charAt(i)));
             } else {
@@ -185,23 +140,111 @@
         return new QName(Constants.SCA10_NS, "binding." + sb.toString());
     }
 
-
     public Object[] getExtensionPoints() {
         return null; // not used by binding or implementation extensions
     }
 
+    private final class DelegatingBindingProviderFactory implements BindingProviderFactory {
+        private Class modelType;
+
+        public DelegatingBindingProviderFactory(Class modelType) {
+            super();
+            this.modelType = modelType;
+        }
+
+        public ReferenceBindingProvider createReferenceBindingProvider(final RuntimeComponent rc,
+                                                                       final RuntimeComponentReference rcr,
+                                                                       final Binding b) {
+            final Object realBinding;
+            if (b instanceof PojoBinding) {
+                realBinding = ((PojoBinding)b).getUserBinding();
+            } else {
+                realBinding = b;
+            }
+            final BindingActivator bindingActivator = bindingActivatorMap.get(realBinding.getClass());
+            return new ReferenceBindingProvider() {
+                List<InvokerProxy> invokers = new ArrayList<InvokerProxy>();
+                private InvokerFactory factory;
+
+                public Invoker createInvoker(Operation operation, boolean isCallback) {
+                    InvokerProxy invoker = new InvokerProxy(operation);
+                    invokers.add(invoker);
+                    return invoker;
+                }
+
+                public InterfaceContract getBindingInterfaceContract() {
+                    return null;
+                }
+
+                public void start() {
+                    if (b instanceof PojoBinding) {
+                        factory = bindingActivator.createInvokerFactory(rc, rcr, b, ((PojoBinding)b).getUserBinding());
+                    } else {
+                        factory = bindingActivator.createInvokerFactory(rc, rcr, b, b);
+                    }
+                    if (factory instanceof ComponentLifecycle) {
+                        ((ComponentLifecycle)factory).start();
+                    }
+                    for (InvokerProxy invoker : invokers) {
+                        invoker.start(factory);
+                    }
+                }
+
+                public void stop() {
+                    if (factory instanceof ComponentLifecycle) {
+                        ((ComponentLifecycle)factory).stop();
+                    }
+                }
+            };
+        }
+
+        public ServiceBindingProvider createServiceBindingProvider(final RuntimeComponent rc,
+                                                                   final RuntimeComponentService rcs,
+                                                                   final Binding b) {
+            final Object realBinding;
+            if (b instanceof PojoBinding) {
+                realBinding = ((PojoBinding)b).getUserBinding();
+            } else {
+                realBinding = b;
+            }
+            final BindingActivator bindingActivator = bindingActivatorMap.get(realBinding.getClass());
+            return new ServiceBindingProvider() {
+                ComponentLifecycle listener = bindingActivator.createService(rc, rcs, b, realBinding);
+
+                public InterfaceContract getBindingInterfaceContract() {
+                    return null;
+                }
+
+                public void start() {
+                    listener.start();
+                }
+
+                public void stop() {
+                    listener.stop();
+                }
+            };
+        }
+
+        public Class getModelType() {
+            return modelType;
+        }
+    }
+
 }
+
 class InvokerProxy implements Invoker {
     Invoker invoker;
     Operation op;
+
     InvokerProxy(Operation op) {
         this.op = op;
     }
+
     public Message invoke(Message arg0) {
         return invoker.invoke(arg0);
     }
+
     public void start(InvokerFactory factory) {
         invoker = factory.createInvoker(op);
     }
- }
-
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org