Author: jsdelfino
Date: Mon Aug 13 21:46:00 2007
New Revision: 565619

URL: http://svn.apache.org/viewvc?view=rev&rev=565619
Log:
Moved logic to populate ProviderFactory extension point out of embedded host.

Removed:
    
incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/LazyBindingProviderFactory.java
    
incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/LazyImplementationProviderFactory.java
Modified:
    
incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/core/DefaultExtensionPointRegistry.java
    
incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/DefaultProviderFactoryExtensionPoint.java
    
incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/ReallySmallRuntime.java

Modified: 
incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/core/DefaultExtensionPointRegistry.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/core/DefaultExtensionPointRegistry.java?view=diff&rev=565619&r1=565618&r2=565619
==============================================================================
--- 
incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/core/DefaultExtensionPointRegistry.java
 (original)
+++ 
incubator/tuscany/java/sca/modules/core-spi/src/main/java/org/apache/tuscany/sca/core/DefaultExtensionPointRegistry.java
 Mon Aug 13 21:46:00 2007
@@ -81,7 +81,12 @@
                             Constructor constructor = 
extensionPointClass.getConstructor(ModelFactoryExtensionPoint.class);
                             extensionPoint = 
constructor.newInstance(getExtensionPoint(ModelFactoryExtensionPoint.class));
                         } catch (NoSuchMethodException e2) {
-                            throw new IllegalArgumentException(e2);
+                            try {
+                                Constructor constructor = 
extensionPointClass.getConstructor(ExtensionPointRegistry.class);
+                                extensionPoint = constructor.newInstance(this);
+                            } catch (NoSuchMethodException e3) {
+                                throw new IllegalArgumentException(e3);
+                            }
                         }
                     }
                     

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?view=diff&rev=565619&r1=565618&r2=565619
==============================================================================
--- 
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
 Mon Aug 13 21:46:00 2007
@@ -19,8 +19,21 @@
 
 package org.apache.tuscany.sca.provider;
 
+import java.io.IOException;
+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.Implementation;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.interfacedef.impl.TempServiceDeclarationUtil;
+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.
@@ -29,14 +42,16 @@
  */
 public class DefaultProviderFactoryExtensionPoint implements 
ProviderFactoryExtensionPoint {
     
-    protected final Map<Class<?>, ProviderFactory> providerFactories = 
-        new HashMap<Class<?>, ProviderFactory>();
+    private ExtensionPointRegistry registry;
+    private final Map<Class<?>, ProviderFactory> providerFactories = new 
HashMap<Class<?>, ProviderFactory>();
+    private boolean loaded;
 
     /**
      * The default constructor. Does nothing.
      *
      */
-    public DefaultProviderFactoryExtensionPoint() {
+    public DefaultProviderFactoryExtensionPoint(ExtensionPointRegistry 
registry) {
+        this.registry = registry;
     }
 
     /**
@@ -63,6 +78,8 @@
      * @return The provider factory associated with the given model type
      */
     public ProviderFactory getProviderFactory(Class<?> modelType) {
+        loadProviderFactories();
+        
         Class<?>[] classes = modelType.getInterfaces();
         for (Class<?> c : classes) {
             ProviderFactory factory = providerFactories.get(c);
@@ -71,6 +88,177 @@
             }
         }
         return providerFactories.get(modelType);
+    }
+
+    /**
+     * Load provider factories declared under META-INF/services.
+     * @param registry
+     */
+    private void loadProviderFactories() {
+        if (loaded)
+            return;
+
+        loadProviderFactories(BindingProviderFactory.class);
+        loadProviderFactories(ImplementationProviderFactory.class);
+        
+        loaded = true;
+    }
+    
+    /**
+     * Load provider factories declared under META-INF/services.
+     * @param registry
+     * @param factoryClass
+     * @return
+     */
+    private List<ProviderFactory> loadProviderFactories(Class<?> factoryClass) 
{
+
+        // Get the provider factory service declarations
+        Set<String> factoryDeclarations; 
+        try {
+            ClassLoader classLoader = factoryClass.getClassLoader();
+            factoryDeclarations = 
TempServiceDeclarationUtil.getServiceClassNames(classLoader, 
factoryClass.getName());
+        } catch (IOException e) {
+            throw new IllegalStateException(e);
+        }
+        
+        // Get the target extension point
+        ProviderFactoryExtensionPoint factoryExtensionPoint = 
registry.getExtensionPoint(ProviderFactoryExtensionPoint.class);
+        List<ProviderFactory> factories = new ArrayList<ProviderFactory>();
+        
+        for (String factoryDeclaration: factoryDeclarations) {
+            Map<String, String> attributes = 
TempServiceDeclarationUtil.parseServiceDeclaration(factoryDeclaration);
+            String className = attributes.get("class");
+            
+            // Load an implementation provider factory
+            if (factoryClass == ImplementationProviderFactory.class) {
+                String modelTypeName = attributes.get("model");
+                
+                // Create a provider factory wrapper and register it
+                ImplementationProviderFactory factory = new 
LazyImplementationProviderFactory(registry, modelTypeName, className);
+                factoryExtensionPoint.addProviderFactory(factory);
+                factories.add(factory);
+
+            } else if (factoryClass == BindingProviderFactory.class) {
+
+                // Load a binding provider factory
+                String modelTypeName = attributes.get("model");
+                
+                // Create a provider factory wrapper and register it
+                BindingProviderFactory factory = new 
LazyBindingProviderFactory(registry, modelTypeName, className);
+                factoryExtensionPoint.addProviderFactory(factory);
+                factories.add(factory);
+            }
+        }
+        return factories;
+    }
+
+    /**
+     * A wrapper around an implementation provider factory allowing lazy
+     * loading and initialization of implementation providers.
+     */
+    private static class LazyBindingProviderFactory implements 
BindingProviderFactory {
+
+        private ExtensionPointRegistry registry;
+        private String modelTypeName;
+        private String className;
+        private BindingProviderFactory factory;
+        private Class modelType;
+        
+        private LazyBindingProviderFactory(ExtensionPointRegistry registry, 
String modelTypeName, String className) {
+            this.registry = registry;
+            this.modelTypeName = modelTypeName;
+            this.className = className;
+        }
+
+        @SuppressWarnings("unchecked")
+        private BindingProviderFactory getFactory() {
+            if (factory == null) {
+                try {
+                    ClassLoader classLoader = 
BindingProviderFactory.class.getClassLoader();
+                    Class<BindingProviderFactory> factoryClass = 
(Class<BindingProviderFactory>)Class.forName(className, true, classLoader);
+                    Constructor<BindingProviderFactory> constructor = 
factoryClass.getConstructor(ExtensionPointRegistry.class);
+                    factory = constructor.newInstance(registry);
+                } catch (Exception e) {
+                    throw new IllegalStateException(e);
+                }
+            }
+            return factory;
+        }
+
+        @SuppressWarnings("unchecked")
+        public ReferenceBindingProvider 
createReferenceBindingProvider(RuntimeComponent component, 
RuntimeComponentReference reference, Binding binding) {
+            return getFactory().createReferenceBindingProvider(component, 
reference, binding);
+        }
+        
+        @SuppressWarnings("unchecked")
+        public ServiceBindingProvider 
createServiceBindingProvider(RuntimeComponent component, 
RuntimeComponentService service, Binding binding) {
+            return getFactory().createServiceBindingProvider(component, 
service, binding);
+        }
+        
+        public Class getModelType() {
+            if (modelType == null) {
+                try {
+                    ClassLoader classLoader = 
BindingProviderFactory.class.getClassLoader();
+                    modelType = Class.forName(modelTypeName, true, 
classLoader);
+                } catch (Exception e) {
+                    throw new IllegalStateException(e);
+                }
+            }
+            return modelType;
+        }
+
+    }
+
+    /**
+     * A wrapper around an implementation provider factory allowing lazy
+     * loading and initialization of implementation providers.
+     */
+    private class LazyImplementationProviderFactory implements 
ImplementationProviderFactory {
+
+        private ExtensionPointRegistry registry;
+        private String modelTypeName;
+        private String className;
+        private ImplementationProviderFactory factory;
+        private Class modelType;
+        
+        private LazyImplementationProviderFactory(ExtensionPointRegistry 
registry, String modelTypeName, String className) {
+            this.registry = registry;
+            this.modelTypeName = modelTypeName;
+            this.className = className;
+        }
+
+        @SuppressWarnings("unchecked")
+        private ImplementationProviderFactory getFactory() {
+            if (factory == null) {
+                try {
+                    ClassLoader classLoader = 
ImplementationProviderFactory.class.getClassLoader();
+                    Class<ImplementationProviderFactory> factoryClass = 
(Class<ImplementationProviderFactory>)Class.forName(className, true, 
classLoader);
+                    Constructor<ImplementationProviderFactory> constructor = 
factoryClass.getConstructor(ExtensionPointRegistry.class);
+                    factory = constructor.newInstance(registry);
+                } catch (Exception e) {
+                    throw new IllegalStateException(e);
+                }
+            }
+            return factory;
+        }
+
+        @SuppressWarnings("unchecked")
+        public ImplementationProvider 
createImplementationProvider(RuntimeComponent component, Implementation 
Implementation) {
+            return getFactory().createImplementationProvider(component, 
Implementation);
+        }
+
+        public Class getModelType() {
+            if (modelType == null) {
+                try {
+                    ClassLoader classLoader = 
ImplementationProviderFactory.class.getClassLoader();
+                    modelType = Class.forName(modelTypeName, true, 
classLoader);
+                } catch (Exception e) {
+                    throw new IllegalStateException(e);
+                }
+            }
+            return modelType;
+        }
+
     }
 
 }

Modified: 
incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/ReallySmallRuntime.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/ReallySmallRuntime.java?view=diff&rev=565619&r1=565618&r2=565619
==============================================================================
--- 
incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/ReallySmallRuntime.java
 (original)
+++ 
incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/ReallySmallRuntime.java
 Mon Aug 13 21:46:00 2007
@@ -134,11 +134,6 @@
         
         // Start the runtime modules
         startModules(registry, modules);
-        
-        // Load the provider factory extensions
-        loadProviderFactories(registry, classLoader, 
BindingProviderFactory.class);
-        loadProviderFactories(registry, classLoader, 
ImplementationProviderFactory.class);
-
     }
 
     public void stop() throws ActivationException {
@@ -206,47 +201,6 @@
         for (ModuleActivator activator : modules) {
             activator.start(registry);
         }
-    }
-
-    private List<ProviderFactory> loadProviderFactories(ExtensionPointRegistry 
registry, ClassLoader classLoader, Class<?> factoryClass) {
-
-        // Get the provider factory service declarations
-        Set<String> factoryDeclarations; 
-        try {
-            factoryDeclarations = 
TempServiceDeclarationUtil.getServiceClassNames(classLoader, 
factoryClass.getName());
-        } catch (IOException e) {
-            throw new IllegalStateException(e);
-        }
-        
-        // Get the target extension point
-        ProviderFactoryExtensionPoint factoryExtensionPoint = 
registry.getExtensionPoint(ProviderFactoryExtensionPoint.class);
-        List<ProviderFactory> factories = new ArrayList<ProviderFactory>();
-        
-        for (String factoryDeclaration: factoryDeclarations) {
-            Map<String, String> attributes = 
TempServiceDeclarationUtil.parseServiceDeclaration(factoryDeclaration);
-            String className = attributes.get("class");
-            
-            // Load an implementation provider factory
-            if (factoryClass == ImplementationProviderFactory.class) {
-                String modelTypeName = attributes.get("model");
-                
-                // Create a provider factory wrapper and register it
-                ImplementationProviderFactory factory = new 
LazyImplementationProviderFactory(registry, modelTypeName, classLoader, 
className);
-                factoryExtensionPoint.addProviderFactory(factory);
-                factories.add(factory);
-
-            } else if (factoryClass == BindingProviderFactory.class) {
-
-                // Load a binding provider factory
-                String modelTypeName = attributes.get("model");
-                
-                // Create a provider factory wrapper and register it
-                BindingProviderFactory factory = new 
LazyBindingProviderFactory(registry, modelTypeName, classLoader, className);
-                factoryExtensionPoint.addProviderFactory(factory);
-                factories.add(factory);
-            }
-        }
-        return factories;
     }
 
     private void stopModules(ExtensionPointRegistry registry, 
List<ModuleActivator> modules) {



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to