You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by sl...@apache.org on 2008/06/07 12:52:10 UTC

svn commit: r664316 [2/2] - in /incubator/tuscany/java/sca: itest/ itest/late-reference-resolution/ itest/late-reference-resolution/src/ itest/late-reference-resolution/src/main/ itest/late-reference-resolution/src/main/java/ itest/late-reference-resol...

Added: incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/endpointresolver/DefaultEndpointResolverFactoryExtensionPoint.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/endpointresolver/DefaultEndpointResolverFactoryExtensionPoint.java?rev=664316&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/endpointresolver/DefaultEndpointResolverFactoryExtensionPoint.java (added)
+++ incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/endpointresolver/DefaultEndpointResolverFactoryExtensionPoint.java Sat Jun  7 03:52:09 2008
@@ -0,0 +1,184 @@
+/*
+ * 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.endpointresolver;
+
+import java.lang.reflect.Constructor;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.tuscany.sca.assembly.Binding;
+import org.apache.tuscany.sca.assembly.Endpoint;
+import org.apache.tuscany.sca.assembly.Implementation;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.extensibility.ServiceDeclaration;
+import org.apache.tuscany.sca.extensibility.ServiceDiscovery;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.apache.tuscany.sca.runtime.RuntimeComponentReference;
+import org.apache.tuscany.sca.runtime.RuntimeComponentService;
+
+/**
+ * Default implementation of a provider factory extension point.
+ *
+ * @version $Rev$ $Date$
+ */
+public class DefaultEndpointResolverFactoryExtensionPoint implements EndpointResolverFactoryExtensionPoint {
+
+    private ExtensionPointRegistry registry;
+    private final Map<Class<?>, EndpointResolverFactory> endpointResolverFactories = new HashMap<Class<?>, EndpointResolverFactory>();
+    private boolean loaded;
+
+    /**
+     * The default constructor. Does nothing.
+     *
+     */
+    public DefaultEndpointResolverFactoryExtensionPoint(ExtensionPointRegistry registry) {
+        this.registry = registry;
+    }
+
+    /**
+     * Add an endpoint resolver factory.
+     * 
+     * @param endpointResolverFactory The resolver factory
+     */
+    public void addEndpointResolverFactory(EndpointResolverFactory endpointResolverFactory){
+        endpointResolverFactories.put(endpointResolverFactory.getModelType(), endpointResolverFactory);
+    }
+
+    /**
+     * Remove a endpoint resolver factory.
+     * 
+     * @param endpointResolverFactory The endpoint resolver factory
+     */
+    public void removeEndpointResolverFactory(EndpointResolverFactory endpointResolverFactory){
+        endpointResolverFactories.remove(endpointResolverFactory.getModelType());
+    }
+
+    /**
+     * Returns the provider factory associated with the given model type.
+     * @param modelType A model type
+     * @return The provider factory associated with the given model type
+     */
+    public EndpointResolverFactory getEndpointResolverFactory(Class<?> modelType) {
+        loadProviderFactories();
+
+        Class<?>[] classes = modelType.getInterfaces();
+        for (Class<?> c : classes) {
+            EndpointResolverFactory factory = endpointResolverFactories.get(c);
+            if (factory != null) {
+                return factory;
+            }
+        }
+        return endpointResolverFactories.get(modelType);
+    }
+
+
+    /**
+     * Load provider factories declared under META-INF/services.
+     * @param registry
+     */
+    private void loadProviderFactories() {
+        if (loaded)
+            return;
+
+        // Get the provider factory service declarations
+        Set<ServiceDeclaration> factoryDeclarations;
+        ServiceDiscovery serviceDiscovery = ServiceDiscovery.getInstance();
+        try {
+            factoryDeclarations = serviceDiscovery.getServiceDeclarations(EndpointResolverFactory.class);
+        } catch (Exception e) {
+            throw new IllegalStateException(e);
+        }
+
+        // Get the extension point
+        EndpointResolverFactoryExtensionPoint factoryExtensionPoint =
+            registry.getExtensionPoint(EndpointResolverFactoryExtensionPoint.class);
+        List<EndpointResolverFactory> factories = new ArrayList<EndpointResolverFactory>();
+
+        for (ServiceDeclaration factoryDeclaration : factoryDeclarations) {
+            Map<String, String> attributes = factoryDeclaration.getAttributes();
+
+            // Find the model type that identifies this resolver
+            String modelTypeName = attributes.get("model");
+
+            // Create a provider factory wrapper and register it
+            EndpointResolverFactory factory =
+                new LazyEndpointResolverFactory(registry, modelTypeName, factoryDeclaration);
+            factoryExtensionPoint.addEndpointResolverFactory(factory);
+            factories.add(factory);
+        }
+
+        loaded = true;
+    }
+
+    /**
+     * A wrapper around an endpoint provider factory allowing lazy
+     * loading and initialization of endpoint providers.
+     */
+    private class LazyEndpointResolverFactory implements EndpointResolverFactory {
+        private ExtensionPointRegistry registry;
+        private String modelTypeName;
+        private ServiceDeclaration providerClass;
+        private EndpointResolverFactory factory;
+        private Class modelType;
+
+        private LazyEndpointResolverFactory(ExtensionPointRegistry registry,
+                                            String modelTypeName,
+                                            ServiceDeclaration providerClass) {
+            this.registry = registry;
+            this.modelTypeName = modelTypeName;
+            this.providerClass = providerClass;
+        }
+
+        @SuppressWarnings("unchecked")
+        private EndpointResolverFactory getFactory() {
+            if (factory == null) {
+                try {
+                    Class<EndpointResolverFactory> factoryClass = (Class<EndpointResolverFactory>)providerClass.loadClass();
+                    Constructor<EndpointResolverFactory> constructor =
+                        factoryClass.getConstructor(ExtensionPointRegistry.class);
+                    factory = constructor.newInstance(registry);
+                } catch (Exception e) {
+                    throw new IllegalStateException(e);
+                }
+            }
+            return factory;
+        }
+
+        public EndpointResolver createEndpointResolver(Endpoint endpoint, Binding binding) {
+            return getFactory().createEndpointResolver(endpoint, binding);
+        }
+
+        public Class getModelType() {
+            if (modelType == null) {
+                try {
+                    modelType = providerClass.loadClass(modelTypeName);
+                } catch (Exception e) {
+                    throw new IllegalStateException(e);
+                }
+            }
+            return modelType;
+        }
+
+    }    
+
+}

Propchange: incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/endpointresolver/DefaultEndpointResolverFactoryExtensionPoint.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/endpointresolver/DefaultEndpointResolverFactoryExtensionPoint.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/endpointresolver/EndpointResolver.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/endpointresolver/EndpointResolver.java?rev=664316&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/endpointresolver/EndpointResolver.java (added)
+++ incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/endpointresolver/EndpointResolver.java Sat Jun  7 03:52:09 2008
@@ -0,0 +1,55 @@
+/*
+ * 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.endpointresolver;
+
+
+/**
+ * A reference binding implementation can options implement this
+ * interface to tie into the Tuscany SCA runtime
+ * 
+ * @version $Rev$ $Date$
+ */
+public interface EndpointResolver {
+
+    /**
+     * This method will be invoked when the endpoint is
+     * activated. It gives the resolver the opportunity
+     * to do any set up ready for when it is asked to 
+     * resolve the endpoint when a message arrives
+     */
+    void start();
+    
+    /**
+     * This method will be invoked when the endpoint is
+     * to be resolved. The resolver will attempt to resolve the 
+     * endpoint against available services. The resolvers extending
+     * this interface will provide environment or binding specific 
+     * resolution processing
+     */
+    void resolve();
+
+    /**
+     * This method will be invoked when the endpont is
+     * deactivated. It gives the resolver the opportunity
+     * to take and required resolver shutdown actions
+     */
+    void stop();    
+
+}

Propchange: incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/endpointresolver/EndpointResolver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/endpointresolver/EndpointResolver.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/endpointresolver/EndpointResolverFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/endpointresolver/EndpointResolverFactory.java?rev=664316&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/endpointresolver/EndpointResolverFactory.java (added)
+++ incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/endpointresolver/EndpointResolverFactory.java Sat Jun  7 03:52:09 2008
@@ -0,0 +1,44 @@
+/*
+ * 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.endpointresolver;
+
+import org.apache.tuscany.sca.assembly.Binding;
+import org.apache.tuscany.sca.assembly.Endpoint;
+
+/**
+ * A factory for creating the runtime artifacts that resolve endpoints.
+ * 
+ * @version $Rev$ $Date$
+ */
+public interface EndpointResolverFactory <M>{
+
+    /**
+     * Creates a new endpoint resolver for the given component,
+     * reference and binding.
+     * 
+     * @param component The runtime component
+     * @param reference The reference on the runtime component
+     * @param enpoint The endpoint assembly model object
+     * @return The endpoint provider
+     */
+    EndpointResolver createEndpointResolver(Endpoint endpoint, Binding binding);
+    
+    Class<M> getModelType();
+}

Propchange: incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/endpointresolver/EndpointResolverFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/endpointresolver/EndpointResolverFactory.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/endpointresolver/EndpointResolverFactoryExtensionPoint.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/endpointresolver/EndpointResolverFactoryExtensionPoint.java?rev=664316&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/endpointresolver/EndpointResolverFactoryExtensionPoint.java (added)
+++ incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/endpointresolver/EndpointResolverFactoryExtensionPoint.java Sat Jun  7 03:52:09 2008
@@ -0,0 +1,57 @@
+/*
+ * 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.endpointresolver;
+
+import java.util.List;
+
+
+/**
+ * An extension point for resolver factories. Holds all of the resolver
+ * factories from loaded extension points. Allows a resolver factory
+ * to be located based on a given model type. Hence the runtime can 
+ * generate endpoint resolvers from the in memory assembly model. 
+ *
+ * @version $Rev$ $Date$
+ */
+public interface EndpointResolverFactoryExtensionPoint {
+
+
+    /**
+     * Add an endpoint resolver factory.
+     * 
+     * @param endpointResolverFactory The resolver factory
+     */
+    void addEndpointResolverFactory(EndpointResolverFactory endpointResolverFactory);
+
+    /**
+     * Remove a endpoint resolver factory.
+     * 
+     * @param endpointResolverFactory The endpoint resolver factory
+     */
+    void removeEndpointResolverFactory(EndpointResolverFactory endpointResolverFactory);
+
+    /**
+     * Returns the endpoint resolver factory associated with the given binding type.
+     * @param bindingType A binding type
+     * @return The endpoint resolver factory associated with the given binding type
+     */
+    EndpointResolverFactory getEndpointResolverFactory(Class<?> bindingType);
+    
+}

Propchange: incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/endpointresolver/EndpointResolverFactoryExtensionPoint.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/endpointresolver/EndpointResolverFactoryExtensionPoint.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/DefaultProviderFactoryExtensionPoint.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/DefaultProviderFactoryExtensionPoint.java?rev=664316&r1=664315&r2=664316&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/DefaultProviderFactoryExtensionPoint.java (original)
+++ incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/DefaultProviderFactoryExtensionPoint.java Sat Jun  7 03:52:09 2008
@@ -111,7 +111,6 @@
         if (loaded)
             return;
 
-        loadProviderFactories(EndpointProviderFactory.class);
         loadProviderFactories(BindingProviderFactory.class);
         loadProviderFactories(ImplementationProviderFactory.class);
         loadProviderFactories(PolicyProviderFactory.class);
@@ -173,15 +172,6 @@
                     new LazyPolicyProviderFactory(registry, modelTypeName, factoryDeclaration);
                 factoryExtensionPoint.addProviderFactory(factory);
                 factories.add(factory);
-            } else if (factoryClass == EndpointProviderFactory.class) {
-                // Load a policy provider factory
-                String modelTypeName = attributes.get("model");
-
-                // Create a provider factory wrapper and register it
-                EndpointProviderFactory factory =
-                    new LazyEndpointProviderFactory(registry, modelTypeName, factoryDeclaration);
-                factoryExtensionPoint.addProviderFactory(factory);
-                factories.add(factory);
             }
         }
         return factories;
@@ -369,56 +359,5 @@
         }
 
     }
-    
-    /**
-     * A wrapper around an endpoint provider factory allowing lazy
-     * loading and initialization of endpoint providers.
-     */
-    private class LazyEndpointProviderFactory implements EndpointProviderFactory {
-        private ExtensionPointRegistry registry;
-        private String modelTypeName;
-        private ServiceDeclaration providerClass;
-        private EndpointProviderFactory factory;
-        private Class modelType;
-
-        private LazyEndpointProviderFactory(ExtensionPointRegistry registry,
-                                            String modelTypeName,
-                                            ServiceDeclaration providerClass) {
-            this.registry = registry;
-            this.modelTypeName = modelTypeName;
-            this.providerClass = providerClass;
-        }
-
-        @SuppressWarnings("unchecked")
-        private EndpointProviderFactory getFactory() {
-            if (factory == null) {
-                try {
-                    Class<EndpointProviderFactory> factoryClass = (Class<EndpointProviderFactory>)providerClass.loadClass();
-                    Constructor<EndpointProviderFactory> constructor =
-                        factoryClass.getConstructor(ExtensionPointRegistry.class);
-                    factory = constructor.newInstance(registry);
-                } catch (Exception e) {
-                    throw new IllegalStateException(e);
-                }
-            }
-            return factory;
-        }
-
-        public EndpointProvider createEndpointProvider(Endpoint endpoint) {
-            return getFactory().createEndpointProvider(endpoint);
-        }
-
-        public Class getModelType() {
-            if (modelType == null) {
-                try {
-                    modelType = providerClass.loadClass(modelTypeName);
-                } catch (Exception e) {
-                    throw new IllegalStateException(e);
-                }
-            }
-            return modelType;
-        }
-
-    }    
 
 }

Modified: incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/runtime/RuntimeComponentReference.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/runtime/RuntimeComponentReference.java?rev=664316&r1=664315&r2=664316&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/runtime/RuntimeComponentReference.java (original)
+++ incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/runtime/RuntimeComponentReference.java Sat Jun  7 03:52:09 2008
@@ -24,9 +24,9 @@
 import org.apache.tuscany.sca.assembly.Binding;
 import org.apache.tuscany.sca.assembly.ComponentReference;
 import org.apache.tuscany.sca.assembly.Endpoint;
+import org.apache.tuscany.sca.endpointresolver.EndpointResolver;
 import org.apache.tuscany.sca.interfacedef.Operation;
 import org.apache.tuscany.sca.invocation.Invoker;
-import org.apache.tuscany.sca.provider.EndpointProvider;
 import org.apache.tuscany.sca.provider.PolicyProvider;
 import org.apache.tuscany.sca.provider.ReferenceBindingProvider;
 
@@ -72,22 +72,22 @@
     void setBindingProvider(Binding binding, ReferenceBindingProvider bindingProvider);
     
     /**
-     * Returns the endpoint provider associated with this
+     * Returns the endpoint resolver associated with this
      * component reference and the given endpoint.
      * 
      * @param endpont The assembly model endpoint 
-     * @return The enpoint provider
+     * @return The enpoint resolver
      */
-    EndpointProvider getEndpointProvider(Endpoint endpoint);
+    EndpointResolver getEndpointResolver(Endpoint endpoint);
     
     /**
-     * Sets the endpoint provider associated with this
+     * Sets the endpoint resolver associated with this
      * component reference and the given endpoint.
      * 
      * @param binding The assembly model binding 
      * @param bindingProvider The runtime reference binding provider
      */
-    void setEndpointProvider(Endpoint endpoint, EndpointProvider endpointProvider);    
+    void setEndpointResolver(Endpoint endpoint, EndpointResolver endpointResolver);    
     
     /**
      * Add a policy provider for the given binding to the reference

Added: incubator/tuscany/java/sca/modules/core-spi/src/main/resources/META-INF/services/org.apache.tuscany.sca.endpointresolver.EndpointResolverFactoryExtensionPoint
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core-spi/src/main/resources/META-INF/services/org.apache.tuscany.sca.endpointresolver.EndpointResolverFactoryExtensionPoint?rev=664316&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/core-spi/src/main/resources/META-INF/services/org.apache.tuscany.sca.endpointresolver.EndpointResolverFactoryExtensionPoint (added)
+++ incubator/tuscany/java/sca/modules/core-spi/src/main/resources/META-INF/services/org.apache.tuscany.sca.endpointresolver.EndpointResolverFactoryExtensionPoint Sat Jun  7 03:52:09 2008
@@ -0,0 +1,18 @@
+# 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.
+
+org.apache.tuscany.sca.endpointresolver.DefaultEndpointResolverFactoryExtensionPoint

Modified: incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/CompositeActivatorImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/CompositeActivatorImpl.java?rev=664316&r1=664315&r2=664316&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/CompositeActivatorImpl.java (original)
+++ incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/CompositeActivatorImpl.java Sat Jun  7 03:52:09 2008
@@ -49,13 +49,14 @@
 import org.apache.tuscany.sca.core.scope.ScopeContainer;
 import org.apache.tuscany.sca.core.scope.ScopeRegistry;
 import org.apache.tuscany.sca.core.scope.ScopedRuntimeComponent;
+import org.apache.tuscany.sca.endpointresolver.EndpointResolver;
+import org.apache.tuscany.sca.endpointresolver.EndpointResolverFactory;
+import org.apache.tuscany.sca.endpointresolver.EndpointResolverFactoryExtensionPoint;
 import org.apache.tuscany.sca.interfacedef.InterfaceContract;
 import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
 import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;
 import org.apache.tuscany.sca.invocation.MessageFactory;
 import org.apache.tuscany.sca.provider.BindingProviderFactory;
-import org.apache.tuscany.sca.provider.EndpointProvider;
-import org.apache.tuscany.sca.provider.EndpointProviderFactory;
 import org.apache.tuscany.sca.provider.ImplementationProvider;
 import org.apache.tuscany.sca.provider.ImplementationProviderFactory;
 import org.apache.tuscany.sca.provider.PolicyProvider;
@@ -85,6 +86,7 @@
     private final WorkScheduler workScheduler;
     private final RuntimeWireProcessor wireProcessor;
     private final ProviderFactoryExtensionPoint providerFactories;
+    private final EndpointResolverFactoryExtensionPoint endpointResolverFactories;
 
     private final RequestContextFactory requestContextFactory;
     private final ProxyFactory proxyFactory;
@@ -114,6 +116,7 @@
                                   RequestContextFactory requestContextFactory,
                                   ProxyFactory proxyFactory,
                                   ProviderFactoryExtensionPoint providerFactories,
+                                  EndpointResolverFactoryExtensionPoint endpointResolverFactories,
                                   StAXArtifactProcessorExtensionPoint processors,
                                   ConversationManager conversationManager) {
         this.assemblyFactory = assemblyFactory;
@@ -123,6 +126,7 @@
         this.workScheduler = workScheduler;
         this.wireProcessor = wireProcessor;
         this.providerFactories = providerFactories;
+        this.endpointResolverFactories = endpointResolverFactories;
         this.javaInterfaceFactory = javaInterfaceFactory;
         this.requestContextFactory = requestContextFactory;
         this.proxyFactory = proxyFactory;
@@ -147,7 +151,7 @@
             //        way the builder is written it's difficult to get at it
             endpoint.setSourceComponent(component);
             
-            addEndpointProvider(component, ref, endpoint);
+            addEndpointResolver(component, ref, endpoint);
         }
     }
 
@@ -202,37 +206,35 @@
      * @param reference
      * @param binding
      */
-    private EndpointProvider addEndpointProvider(RuntimeComponent component,
+    private EndpointResolver addEndpointResolver(RuntimeComponent component,
                                                  RuntimeComponentReference reference,
                                                  Endpoint endpoint){
         
-        // only create provides for unresolved endpoint currently
+        // only create endpoint resolvers for unresolved endpoints currently
         // this will also prevent a wire from being created later
         if (!endpoint.isUnresolved()){
             return null;
         }
         
-        EndpointProviderFactory providerFactory =
-            (EndpointProviderFactory)providerFactories.getProviderFactory(endpoint.getClass());
+        // This souldn't happen as the endpoint resolver extension point is in core-spi but 
+        // just in case returning null here will mean that no wire is created and calling 
+        // the reference will fail with NPE
+        if (endpointResolverFactories == null){
+            return null;
+        }
         
-        if (providerFactory != null) {
+        EndpointResolverFactory<Endpoint> resolverFactory =
+            (EndpointResolverFactory<Endpoint>)endpointResolverFactories.getEndpointResolverFactory(endpoint.getClass());
+        
+        if (resolverFactory != null) {
             @SuppressWarnings("unchecked")
-            EndpointProvider endpointProvider =
-                providerFactory.createEndpointProvider(endpoint);
-            if (endpointProvider != null) {
-                ((RuntimeComponentReference)reference).setEndpointProvider(endpoint, endpointProvider);
+            EndpointResolver endpointResolver =
+                resolverFactory.createEndpointResolver(endpoint, null);
+            if (endpointResolver != null) {
+                ((RuntimeComponentReference)reference).setEndpointResolver(endpoint, endpointResolver);
             }
             
-            /* TODO - should this get done here for endpoints or in the endpoint itself?
-            for (PolicyProviderFactory f : providerFactories.getPolicyProviderFactories()) {
-                PolicyProvider policyProvider = f.createReferencePolicyProvider(component, reference, binding);
-                if (policyProvider != null) {
-                    reference.addPolicyProvider(binding, policyProvider);
-                }
-            }
-            */
-
-            return endpointProvider;
+            return endpointResolver;
         } else {
             // TODO - for the time being allow the lack of an endpoint provider to be the 
             //        switch to turn off endpoint processing
@@ -300,7 +302,7 @@
     private void addReferenceEndpointWire(Component component, ComponentReference reference, Endpoint endpoint) {
         // only deal with unresolved endpoints as, to prevent breaking changes, targets that are resolved
         // at build time are still represented as bindings in the binding list
-        if (((RuntimeComponentReference)reference).getEndpointProvider(endpoint) == null){ 
+        if (((RuntimeComponentReference)reference).getEndpointResolver(endpoint) == null){ 
             // no endpoint provider has previously been created so don't create the 
             // wire
             return;
@@ -573,28 +575,27 @@
             }
             RuntimeComponentReference runtimeRef = ((RuntimeComponentReference)reference);
             runtimeRef.setComponent(runtimeComponent);
-            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. 
+            
+            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() {
-                            bindingProvider.start();
+                            endpointResolver.start();
                             return null;
                           }
                     });                       
                 }
             }
-            for (Endpoint endpoint : reference.getEndpoints()) {
-                final EndpointProvider endpointProvider = runtimeRef.getEndpointProvider(endpoint);
-                if (endpointProvider != null) {
-                    // Allow endpoints to add shutdown hooks. Requires RuntimePermission shutdownHooks in policy.
-                    // TODO - do we need to allow this for endpoints. Leave as is for now
-                    //        doesn't seem to be done this way if a provider is started
-                    //        at wire creation time?
+            
+            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() {
-                            endpointProvider.start();
+                            bindingProvider.start();
                             return null;
                           }
                     });                       
@@ -684,6 +685,7 @@
                 logger.fine("Starting component reference: " + component.getURI() + "#" + reference.getName());
             }
             RuntimeComponentReference runtimeRef = ((RuntimeComponentReference)reference);
+            
             for (Binding binding : reference.getBindings()) {
                 final ReferenceBindingProvider bindingProvider = runtimeRef.getBindingProvider(binding);
                 if (bindingProvider != null) {
@@ -695,22 +697,20 @@
                           }
                     });                       
                 }
-            }
+            } 
+            
             for (Endpoint endpoint : reference.getEndpoints()) {
-                final EndpointProvider endpointProvider = runtimeRef.getEndpointProvider(endpoint);
-                if (endpointProvider != null) {
-                    // Allow endpoints to add shutdown hooks. Requires RuntimePermission shutdownHooks in policy.
-                    // TODO - do we need to allow this for endpoints. Leave as is for now
-                    //        doesn't seem to be done this way if a provider is started
-                    //        at wire creation time?
+                final EndpointResolver endpointResolver = runtimeRef.getEndpointResolver(endpoint);
+                if (endpointResolver != null) {
+                    // Allow endpoint resolvers to do any shutdown reference manipulation
                     AccessController.doPrivileged(new PrivilegedAction<Object>() {
                         public Object run() {
-                            endpointProvider.stop();
+                            endpointResolver.stop();
                             return null;
                           }
                     });                       
                 }
-            }            
+            }             
         }
         Implementation implementation = component.getImplementation();
         if (implementation instanceof Composite) {

Modified: incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/EndpointWireImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/EndpointWireImpl.java?rev=664316&r1=664315&r2=664316&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/EndpointWireImpl.java (original)
+++ incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/EndpointWireImpl.java Sat Jun  7 03:52:09 2008
@@ -24,11 +24,11 @@
 
 import org.apache.tuscany.sca.assembly.Endpoint;
 import org.apache.tuscany.sca.assembly.Reference;
+import org.apache.tuscany.sca.endpointresolver.EndpointResolver;
 import org.apache.tuscany.sca.interfacedef.InterfaceContract;
 import org.apache.tuscany.sca.interfacedef.Operation;
 import org.apache.tuscany.sca.invocation.InvocationChain;
 import org.apache.tuscany.sca.invocation.Message;
-import org.apache.tuscany.sca.provider.EndpointProvider;
 import org.apache.tuscany.sca.provider.ReferenceBindingProvider;
 import org.apache.tuscany.sca.runtime.EndpointReference;
 import org.apache.tuscany.sca.runtime.RuntimeComponent;
@@ -44,7 +44,7 @@
     private Endpoint endpoint;
     private CompositeActivatorImpl compositeActivator;
     
-    private EndpointProvider endpointProvider;
+    private EndpointResolver endpointResolver;
     private EndpointReference source;
     private RuntimeWire wire;
 
@@ -70,7 +70,7 @@
                                             sourceContract);
         
         RuntimeComponentReference runtimeRef = ((RuntimeComponentReference)endpoint.getSourceComponentReference());
-        endpointProvider = runtimeRef.getEndpointProvider(endpoint);
+        endpointResolver = runtimeRef.getEndpointResolver(endpoint);
         
     }
 
@@ -81,7 +81,7 @@
             
             // this method should locate a viable target service and complete the 
             // endpoint configuration
-            endpointProvider.start();
+            endpointResolver.resolve();
             
             if (endpoint.isUnresolved()){
                 throw new ServiceUnavailableException("Unable to resolve service for component: " +

Modified: incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/RuntimeComponentReferenceImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/RuntimeComponentReferenceImpl.java?rev=664316&r1=664315&r2=664316&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/RuntimeComponentReferenceImpl.java (original)
+++ incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/RuntimeComponentReferenceImpl.java Sat Jun  7 03:52:09 2008
@@ -26,10 +26,10 @@
 import org.apache.tuscany.sca.assembly.Binding;
 import org.apache.tuscany.sca.assembly.Endpoint;
 import org.apache.tuscany.sca.assembly.impl.ComponentReferenceImpl;
+import org.apache.tuscany.sca.endpointresolver.EndpointResolver;
 import org.apache.tuscany.sca.interfacedef.Operation;
 import org.apache.tuscany.sca.invocation.InvocationChain;
 import org.apache.tuscany.sca.invocation.Invoker;
-import org.apache.tuscany.sca.provider.EndpointProvider;
 import org.apache.tuscany.sca.provider.PolicyProvider;
 import org.apache.tuscany.sca.provider.ReferenceBindingProvider;
 import org.apache.tuscany.sca.runtime.RuntimeComponent;
@@ -45,8 +45,8 @@
     private ArrayList<RuntimeWire> wires;
     private HashMap<Binding, ReferenceBindingProvider> bindingProviders =
         new HashMap<Binding, ReferenceBindingProvider>();
-    private HashMap<Endpoint, EndpointProvider> endpointProviders =
-        new HashMap<Endpoint, EndpointProvider>();    
+    private HashMap<Endpoint, EndpointResolver> endpointResolvers =
+        new HashMap<Endpoint, EndpointResolver>();    
     private HashMap<Binding, List<PolicyProvider>> policyProviders = new HashMap<Binding, List<PolicyProvider>>();
 
     private RuntimeComponent component;
@@ -80,12 +80,12 @@
         bindingProviders.put(binding, bindingProvider);
     }
     
-    public EndpointProvider getEndpointProvider(Endpoint endpoint){
-        return endpointProviders.get(endpoint);
+    public EndpointResolver getEndpointResolver(Endpoint endpoint){
+        return endpointResolvers.get(endpoint);
     }
     
-    public void setEndpointProvider(Endpoint endpoint, EndpointProvider endpointProvider){
-        endpointProviders.put(endpoint, endpointProvider);
+    public void setEndpointResolver(Endpoint endpoint, EndpointResolver endpointResolver){
+        endpointResolvers.put(endpoint, endpointResolver);
     }
 
     public Invoker getInvoker(Binding binding, Operation operation) {

Added: incubator/tuscany/java/sca/modules/endpoint/src/main/java/org/apache/tuscany/sca/endpoint/impl/EndpointResolverFactoryImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/endpoint/src/main/java/org/apache/tuscany/sca/endpoint/impl/EndpointResolverFactoryImpl.java?rev=664316&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/endpoint/src/main/java/org/apache/tuscany/sca/endpoint/impl/EndpointResolverFactoryImpl.java (added)
+++ incubator/tuscany/java/sca/modules/endpoint/src/main/java/org/apache/tuscany/sca/endpoint/impl/EndpointResolverFactoryImpl.java Sat Jun  7 03:52:09 2008
@@ -0,0 +1,49 @@
+/*
+ * 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.endpoint.impl;
+
+import org.apache.tuscany.sca.assembly.Binding;
+import org.apache.tuscany.sca.assembly.Endpoint;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.endpointresolver.EndpointResolver;
+import org.apache.tuscany.sca.endpointresolver.EndpointResolverFactory;
+
+/**
+ * The factory for creating endpoint Binding providers
+ * 
+ * @version $Rev$ $Date$
+ */
+public class EndpointResolverFactoryImpl implements EndpointResolverFactory<Endpoint> {
+    
+    private ExtensionPointRegistry extensionPoints;
+    
+    public EndpointResolverFactoryImpl(ExtensionPointRegistry extensionPoints) {
+        this.extensionPoints = extensionPoints;     
+    } 
+    
+    public EndpointResolver createEndpointResolver(Endpoint endpoint, Binding binding) {
+              
+        return  new EndpointResolverImpl(extensionPoints, endpoint);
+    }
+
+    public Class<Endpoint> getModelType() {
+        return Endpoint.class;
+    }
+}

Propchange: incubator/tuscany/java/sca/modules/endpoint/src/main/java/org/apache/tuscany/sca/endpoint/impl/EndpointResolverFactoryImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/endpoint/src/main/java/org/apache/tuscany/sca/endpoint/impl/EndpointResolverFactoryImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/endpoint/src/main/java/org/apache/tuscany/sca/endpoint/impl/EndpointResolverImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/endpoint/src/main/java/org/apache/tuscany/sca/endpoint/impl/EndpointResolverImpl.java?rev=664316&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/endpoint/src/main/java/org/apache/tuscany/sca/endpoint/impl/EndpointResolverImpl.java (added)
+++ incubator/tuscany/java/sca/modules/endpoint/src/main/java/org/apache/tuscany/sca/endpoint/impl/EndpointResolverImpl.java Sat Jun  7 03:52:09 2008
@@ -0,0 +1,106 @@
+/*
+ * 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.endpoint.impl;
+
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Logger;
+
+import org.apache.tuscany.sca.assembly.Binding;
+import org.apache.tuscany.sca.assembly.Endpoint;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.endpointresolver.EndpointResolver;
+import org.apache.tuscany.sca.endpointresolver.EndpointResolverFactory;
+import org.apache.tuscany.sca.endpointresolver.EndpointResolverFactoryExtensionPoint;
+
+
+/** 
+ * The endpoint resolver allows unresolved endpoints to be plumbed into
+ * the runtime start and message send processing as a hook to late resolution
+ * of target services
+ * 
+ * @version $Rev$ $Date$
+ */
+public class EndpointResolverImpl implements EndpointResolver {
+
+    private final static Logger logger = Logger.getLogger(EndpointResolverImpl.class.getName());
+
+    private Endpoint endpoint;
+    private List<EndpointResolver> endpointResolvers = new ArrayList<EndpointResolver>();    
+
+    public EndpointResolverImpl(ExtensionPointRegistry extensionPoints,
+                                Endpoint endpoint) {
+        this.endpoint = endpoint;
+        
+        EndpointResolverFactoryExtensionPoint resolverFactories = 
+            extensionPoints.getExtensionPoint(EndpointResolverFactoryExtensionPoint.class);
+        
+        for (Binding binding : endpoint.getCandidateBindings()){
+            EndpointResolverFactory resolverFactory = resolverFactories.getEndpointResolverFactory(binding.getClass());
+            
+            // if the binding in question has a endpoint resolver factory they try and 
+            // create an endpoint resolver
+            if (resolverFactory != null){
+                EndpointResolver resolver = resolverFactory.createEndpointResolver(endpoint, binding);
+                
+                if (resolver != null){
+                    endpointResolvers.add(resolver);
+                }
+            }
+        }
+    }
+    
+    public void start(){
+        // do nothing
+    }
+    
+    public void stop(){
+        // do nothing
+    }    
+
+    public void resolve() {
+        if (endpoint.isUnresolved()){
+            // Resolve the endpoint binding here
+            
+            // first do any general resolution that's required
+            
+            // ask the bindings to resolve the endpoint one by one
+            for (EndpointResolver resolver : endpointResolvers){
+                resolver.resolve();
+                if (endpoint.isUnresolved() != true){
+                    break;
+                }
+            }
+            
+            if (endpoint.isUnresolved() != true){
+                // If we have to build the endpoint because we are matching
+                // intents and policies then we do that now. If the binding
+                // is just configured by setting its uri we can just do local binding
+                // configuration here
+                
+                // EndpointBuilderImpl.build(endpoint);
+            } else {
+                // raise an exception saying the endpoint can't be resolved
+            }
+        }
+    }
+
+}

Propchange: incubator/tuscany/java/sca/modules/endpoint/src/main/java/org/apache/tuscany/sca/endpoint/impl/EndpointResolverImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/endpoint/src/main/java/org/apache/tuscany/sca/endpoint/impl/EndpointResolverImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/endpoint/src/main/resources/META-INF/services/org.apache.tuscany.sca.endpointresolver.EndpointResolverFactory
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/endpoint/src/main/resources/META-INF/services/org.apache.tuscany.sca.endpointresolver.EndpointResolverFactory?rev=664316&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/endpoint/src/main/resources/META-INF/services/org.apache.tuscany.sca.endpointresolver.EndpointResolverFactory (added)
+++ incubator/tuscany/java/sca/modules/endpoint/src/main/resources/META-INF/services/org.apache.tuscany.sca.endpointresolver.EndpointResolverFactory Sat Jun  7 03:52:09 2008
@@ -0,0 +1,19 @@
+# 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. 
+
+# Implementation class for the binding extension
+org.apache.tuscany.sca.endpoint.impl.EndpointResolverFactoryImpl;model=org.apache.tuscany.sca.assembly.Endpoint

Modified: incubator/tuscany/java/sca/modules/endpoint/src/test/java/org/apace/tuscany/sca/binding/sca/EndpointTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/endpoint/src/test/java/org/apace/tuscany/sca/binding/sca/EndpointTestCase.java?rev=664316&r1=664315&r2=664316&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/endpoint/src/test/java/org/apace/tuscany/sca/binding/sca/EndpointTestCase.java (original)
+++ incubator/tuscany/java/sca/modules/endpoint/src/test/java/org/apace/tuscany/sca/binding/sca/EndpointTestCase.java Sat Jun  7 03:52:09 2008
@@ -52,13 +52,13 @@
 import org.apache.tuscany.sca.core.UtilityExtensionPoint;
 import org.apache.tuscany.sca.core.assembly.CompositeActivator;
 import org.apache.tuscany.sca.core.assembly.RuntimeAssemblyFactory;
-import org.apache.tuscany.sca.endpoint.impl.EndpointProviderFactoryImpl;
+import org.apache.tuscany.sca.endpoint.impl.EndpointResolverFactoryImpl;
+import org.apache.tuscany.sca.endpointresolver.EndpointResolver;
+import org.apache.tuscany.sca.endpointresolver.EndpointResolverFactory;
 import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
 import org.apache.tuscany.sca.monitor.Monitor;
 import org.apache.tuscany.sca.monitor.MonitorFactory;
 import org.apache.tuscany.sca.policy.IntentAttachPointTypeFactory;
-import org.apache.tuscany.sca.provider.EndpointProvider;
-import org.apache.tuscany.sca.provider.EndpointProviderFactory;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -194,12 +194,13 @@
             
             Endpoint endpoint = ref.getEndpoints().get(0);
             
-            EndpointProviderFactory factory = new EndpointProviderFactoryImpl(extensionPoints);
+            EndpointResolverFactory<Endpoint> factory = new EndpointResolverFactoryImpl(extensionPoints);
             
-            EndpointProvider endpointProvider = factory.createEndpointProvider(endpoint);
+            EndpointResolver endpointResolver = factory.createEndpointResolver(endpoint, null);
             
-            Assert.assertNotNull(endpointProvider);
-              
+            Assert.assertNotNull(endpointResolver);
+            
+    
         } catch(Exception ex) {
             ex.printStackTrace();
             System.out.println(ex.toString());

Modified: incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/ReallySmallRuntimeBuilder.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/ReallySmallRuntimeBuilder.java?rev=664316&r1=664315&r2=664316&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/ReallySmallRuntimeBuilder.java (original)
+++ incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/ReallySmallRuntimeBuilder.java Sat Jun  7 03:52:09 2008
@@ -28,6 +28,7 @@
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLOutputFactory;
 
+
 import org.apache.tuscany.sca.assembly.AssemblyFactory;
 import org.apache.tuscany.sca.assembly.Composite;
 import org.apache.tuscany.sca.assembly.EndpointFactory;
@@ -78,6 +79,7 @@
 import org.apache.tuscany.sca.core.scope.ScopeRegistryImpl;
 import org.apache.tuscany.sca.core.scope.StatelessScopeContainerFactory;
 import org.apache.tuscany.sca.definitions.SCADefinitions;
+import org.apache.tuscany.sca.endpointresolver.EndpointResolverFactoryExtensionPoint;
 import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
 import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;
 import org.apache.tuscany.sca.invocation.MessageFactory;
@@ -131,6 +133,10 @@
         // Create a provider factory extension point
         ProviderFactoryExtensionPoint providerFactories =
             registry.getExtensionPoint(ProviderFactoryExtensionPoint.class);
+        
+        // Create a endpoint resolver factory extension point
+        EndpointResolverFactoryExtensionPoint endpointResolverFactories =
+            registry.getExtensionPoint(EndpointResolverFactoryExtensionPoint.class);        
 
         JavaInterfaceFactory javaInterfaceFactory =
             registry.getExtensionPoint(ModelFactoryExtensionPoint.class).getFactory(JavaInterfaceFactory.class);
@@ -144,7 +150,7 @@
         CompositeActivator compositeActivator =
             new CompositeActivatorImpl(assemblyFactory, messageFactory, javaInterfaceFactory, scaBindingFactory,
                                        mapper, scopeRegistry, workScheduler, wireProcessor, requestContextFactory,
-                                       proxyFactory, providerFactories, processors, conversationManager);
+                                       proxyFactory, providerFactories, endpointResolverFactories, processors, conversationManager);
 
         return compositeActivator;
     }

Added: incubator/tuscany/java/sca/modules/runtime-tomcat/src/main/java/org/apache/tuscany/sca/runtime/tomcat/EndpointResolverFactoryImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/runtime-tomcat/src/main/java/org/apache/tuscany/sca/runtime/tomcat/EndpointResolverFactoryImpl.java?rev=664316&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/runtime-tomcat/src/main/java/org/apache/tuscany/sca/runtime/tomcat/EndpointResolverFactoryImpl.java (added)
+++ incubator/tuscany/java/sca/modules/runtime-tomcat/src/main/java/org/apache/tuscany/sca/runtime/tomcat/EndpointResolverFactoryImpl.java Sat Jun  7 03:52:09 2008
@@ -0,0 +1,49 @@
+/*
+ * 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.runtime.tomcat;
+
+import org.apache.tuscany.sca.assembly.Binding;
+import org.apache.tuscany.sca.assembly.Endpoint;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.endpointresolver.EndpointResolver;
+import org.apache.tuscany.sca.endpointresolver.EndpointResolverFactory;
+
+/**
+ * The factory for creating endpoint Binding providers
+ * 
+ * @version $Rev$ $Date$
+ */
+public class EndpointResolverFactoryImpl implements EndpointResolverFactory<Endpoint> {
+    
+    private ExtensionPointRegistry extensionPoints;
+    
+    public EndpointResolverFactoryImpl(ExtensionPointRegistry extensionPoints) {
+        this.extensionPoints = extensionPoints;     
+    } 
+    
+    public EndpointResolver createEndpointResolver(Endpoint endpoint, Binding binding) {
+              
+        return  new EndpointResolverImpl(extensionPoints, endpoint);
+    }
+
+    public Class<Endpoint> getModelType() {
+        return Endpoint.class;
+    }
+}

Propchange: incubator/tuscany/java/sca/modules/runtime-tomcat/src/main/java/org/apache/tuscany/sca/runtime/tomcat/EndpointResolverFactoryImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/runtime-tomcat/src/main/java/org/apache/tuscany/sca/runtime/tomcat/EndpointResolverFactoryImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/runtime-tomcat/src/main/java/org/apache/tuscany/sca/runtime/tomcat/EndpointResolverImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/runtime-tomcat/src/main/java/org/apache/tuscany/sca/runtime/tomcat/EndpointResolverImpl.java?rev=664316&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/runtime-tomcat/src/main/java/org/apache/tuscany/sca/runtime/tomcat/EndpointResolverImpl.java (added)
+++ incubator/tuscany/java/sca/modules/runtime-tomcat/src/main/java/org/apache/tuscany/sca/runtime/tomcat/EndpointResolverImpl.java Sat Jun  7 03:52:09 2008
@@ -0,0 +1,131 @@
+/*
+ * 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.runtime.tomcat;
+
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Logger;
+
+import org.apache.catalina.core.StandardContext;
+import org.apache.tuscany.sca.assembly.Binding;
+import org.apache.tuscany.sca.assembly.Component;
+import org.apache.tuscany.sca.assembly.Endpoint;
+import org.apache.tuscany.sca.assembly.builder.DefaultEndpointBuilder;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.endpointresolver.EndpointResolver;
+import org.apache.tuscany.sca.endpointresolver.EndpointResolverFactory;
+import org.apache.tuscany.sca.endpointresolver.EndpointResolverFactoryExtensionPoint;
+import org.apache.tuscany.sca.host.embedded.SCADomain;
+import org.apache.tuscany.sca.host.embedded.impl.DefaultSCADomain;
+import org.apache.tuscany.sca.host.webapp.WebAppServletHost;
+import org.apache.tuscany.sca.monitor.Monitor;
+import org.apache.tuscany.sca.monitor.Problem;
+
+
+/** 
+ * The endpoint resolver allows unresolved endpoints to be plumbed into
+ * the runtime start and message send processing as a hook to late resolution
+ * of target services
+ * 
+ * @version $Rev$ $Date$
+ */
+public class EndpointResolverImpl implements EndpointResolver {
+
+    private final static Logger logger = Logger.getLogger(EndpointResolverImpl.class.getName());
+
+    private Endpoint endpoint;
+    private List<EndpointResolver> endpointResolvers = new ArrayList<EndpointResolver>();    
+
+    public EndpointResolverImpl(ExtensionPointRegistry extensionPoints,
+                                Endpoint endpoint) {
+        this.endpoint = endpoint;
+        
+        EndpointResolverFactoryExtensionPoint resolverFactories = 
+            extensionPoints.getExtensionPoint(EndpointResolverFactoryExtensionPoint.class);
+        
+        for (Binding binding : endpoint.getCandidateBindings()){
+            EndpointResolverFactory resolverFactory = resolverFactories.getEndpointResolverFactory(binding.getClass());
+            
+            // if the binding in question has a endpoint resolver factory they try and 
+            // create an endpoint resolver
+            if (resolverFactory != null){
+                EndpointResolver resolver = resolverFactory.createEndpointResolver(endpoint, binding);
+                
+                if (resolver != null){
+                    endpointResolvers.add(resolver);
+                }
+            }
+        }
+    }
+    
+    public void start(){
+        // do nothing
+    }
+    
+    public void resolve() {
+        if (endpoint.isUnresolved()){
+            logger.info("resolving endpoint: " + endpoint.getTargetName());
+
+            Component target = findTarget();
+            if (target != null) {
+                logger.info("endpoint target found: " + endpoint.getTargetName() + " component " + target);
+                resolveEndpoint(target);
+            } else {
+                logger.info("endpoint target not found: " + endpoint.getTargetName());
+            }
+            
+        }
+    }
+
+    protected void resolveEndpoint(Component targetComponent) {
+        
+        endpoint.setTargetComponent(targetComponent);
+        endpoint.setTargetComponentService(targetComponent.getServices().get(0)); // TODO real service
+
+        DefaultEndpointBuilder ebi = new DefaultEndpointBuilder(new Monitor() {
+            public void problem(Problem problem) {
+                logger.warning(problem.toString());
+            }});
+
+        ebi.build(endpoint);
+    }
+
+    protected Component findTarget() {
+        for (StandardContext sc : TuscanyHost.scaApps) {
+            SCADomain scaDomain = (SCADomain)sc.getServletContext().getAttribute(WebAppServletHost.SCA_DOMAIN_ATTRIBUTE);
+            if (scaDomain != null) {
+                Component component = ((DefaultSCADomain)scaDomain).getComponent(endpoint.getTargetName());
+                if ( component != null) {
+                    return component;
+                }
+            }
+        }
+        return null;
+    }
+
+    public void stop() {
+        if (!endpoint.isUnresolved()){
+            // Currently the CompositeActivator stop() should take care of the providers and 
+            // wires that have been added. 
+        }
+    }
+
+}

Propchange: incubator/tuscany/java/sca/modules/runtime-tomcat/src/main/java/org/apache/tuscany/sca/runtime/tomcat/EndpointResolverImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/runtime-tomcat/src/main/java/org/apache/tuscany/sca/runtime/tomcat/EndpointResolverImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/runtime-tomcat/src/main/resources/META-INF/services/org.apache.tuscany.sca.endpointresolver.EndpointResolverFactory
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/runtime-tomcat/src/main/resources/META-INF/services/org.apache.tuscany.sca.endpointresolver.EndpointResolverFactory?rev=664316&view=auto
==============================================================================
--- incubator/tuscany/java/sca/modules/runtime-tomcat/src/main/resources/META-INF/services/org.apache.tuscany.sca.endpointresolver.EndpointResolverFactory (added)
+++ incubator/tuscany/java/sca/modules/runtime-tomcat/src/main/resources/META-INF/services/org.apache.tuscany.sca.endpointresolver.EndpointResolverFactory Sat Jun  7 03:52:09 2008
@@ -0,0 +1,19 @@
+# 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. 
+
+# Implementation class for the binding extension
+org.apache.tuscany.sca.endpoint.impl.EndpointResolverFactoryImpl;model=org.apache.tuscany.sca.assembly.Endpoint