You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by js...@apache.org on 2007/06/21 02:40:01 UTC

svn commit: r549306 - /incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/

Author: jsdelfino
Date: Wed Jun 20 17:40:00 2007
New Revision: 549306

URL: http://svn.apache.org/viewvc?view=rev&rev=549306
Log:
Added support for lazy loading and initialization of artifact processors and provider factories.

Added:
    incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/LazyBindingProviderFactory.java   (with props)
    incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/LazyImplementationProviderFactory.java   (with props)
    incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/LazyStAXArtifactProcessor.java   (with props)
    incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/LazyURLArtifactProcessor.java   (with props)
Modified:
    incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/ReallySmallRuntime.java
    incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/ReallySmallRuntimeBuilder.java

Added: incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/LazyBindingProviderFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/LazyBindingProviderFactory.java?view=auto&rev=549306
==============================================================================
--- incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/LazyBindingProviderFactory.java (added)
+++ incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/LazyBindingProviderFactory.java Wed Jun 20 17:40:00 2007
@@ -0,0 +1,91 @@
+/*
+ * 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.host.embedded.impl;
+
+import java.lang.ref.WeakReference;
+import java.lang.reflect.Constructor;
+
+import org.apache.tuscany.sca.assembly.Binding;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.provider.BindingProviderFactory;
+import org.apache.tuscany.sca.provider.ReferenceBindingProvider;
+import org.apache.tuscany.sca.provider.ServiceBindingProvider;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.apache.tuscany.sca.runtime.RuntimeComponentReference;
+import org.apache.tuscany.sca.runtime.RuntimeComponentService;
+
+/**
+ * A wrapper around an implementation provider factory allowing lazy
+ * loading and initialization of implementation providers.
+ *
+ * @version $Rev$ $Date$
+ */
+public class LazyBindingProviderFactory implements BindingProviderFactory {
+
+    private ExtensionPointRegistry registry;
+    private String modelTypeName;
+    private WeakReference<ClassLoader> classLoader;
+    private String className;
+    private BindingProviderFactory factory;
+    private Class modelType;
+    
+    LazyBindingProviderFactory(ExtensionPointRegistry registry, String modelTypeName, ClassLoader classLoader, String className) {
+        this.registry = registry;
+        this.modelTypeName = modelTypeName;
+        this.classLoader = new WeakReference<ClassLoader>(classLoader);
+        this.className = className;
+    }
+
+    @SuppressWarnings("unchecked")
+    private BindingProviderFactory getFactory() {
+        if (factory == null) {
+            try {
+                Class<BindingProviderFactory> factoryClass = (Class<BindingProviderFactory>)Class.forName(className, true, classLoader.get());
+                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 {
+                modelType = Class.forName(modelTypeName, true, classLoader.get());
+            } catch (Exception e) {
+                throw new IllegalStateException(e);
+            }
+        }
+        return modelType;
+    }
+
+}

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

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

Added: incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/LazyImplementationProviderFactory.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/LazyImplementationProviderFactory.java?view=auto&rev=549306
==============================================================================
--- incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/LazyImplementationProviderFactory.java (added)
+++ incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/LazyImplementationProviderFactory.java Wed Jun 20 17:40:00 2007
@@ -0,0 +1,83 @@
+/*
+ * 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.host.embedded.impl;
+
+import java.lang.ref.WeakReference;
+import java.lang.reflect.Constructor;
+
+import org.apache.tuscany.sca.assembly.Implementation;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.provider.ImplementationProvider;
+import org.apache.tuscany.sca.provider.ImplementationProviderFactory;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+
+/**
+ * A wrapper around an implementation provider factory allowing lazy
+ * loading and initialization of implementation providers.
+ *
+ * @version $Rev$ $Date$
+ */
+public class LazyImplementationProviderFactory implements ImplementationProviderFactory {
+
+    private ExtensionPointRegistry registry;
+    private String modelTypeName;
+    private WeakReference<ClassLoader> classLoader;
+    private String className;
+    private ImplementationProviderFactory factory;
+    private Class modelType;
+    
+    LazyImplementationProviderFactory(ExtensionPointRegistry registry, String modelTypeName, ClassLoader classLoader, String className) {
+        this.registry = registry;
+        this.modelTypeName = modelTypeName;
+        this.classLoader = new WeakReference<ClassLoader>(classLoader);
+        this.className = className;
+    }
+
+    @SuppressWarnings("unchecked")
+    private ImplementationProviderFactory getFactory() {
+        if (factory == null) {
+            try {
+                Class<ImplementationProviderFactory> factoryClass = (Class<ImplementationProviderFactory>)Class.forName(className, true, classLoader.get());
+                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 {
+                modelType = Class.forName(modelTypeName, true, classLoader.get());
+            } catch (Exception e) {
+                throw new IllegalStateException(e);
+            }
+        }
+        return modelType;
+    }
+
+}

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

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

Added: incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/LazyStAXArtifactProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/LazyStAXArtifactProcessor.java?view=auto&rev=549306
==============================================================================
--- incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/LazyStAXArtifactProcessor.java (added)
+++ incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/LazyStAXArtifactProcessor.java Wed Jun 20 17:40:00 2007
@@ -0,0 +1,120 @@
+/*
+ * 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.host.embedded.impl;
+
+import java.lang.ref.WeakReference;
+import java.lang.reflect.Constructor;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.assembly.xml.DefaultBeanModelProcessor;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+import org.apache.tuscany.sca.contribution.service.ContributionReadException;
+import org.apache.tuscany.sca.contribution.service.ContributionResolveException;
+import org.apache.tuscany.sca.contribution.service.ContributionWriteException;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.core.ModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.policy.PolicyFactory;
+
+/**
+ * A wrapper around an Artifact processor class allowing lazy loading and
+ * initialization of artifact processors.
+ *
+ * @version $Rev$ $Date$
+ */
+class LazyStAXArtifactProcessor implements StAXArtifactProcessor {
+
+    private ExtensionPointRegistry registry;
+    private QName artifactType;
+    private String modelTypeName;
+    private WeakReference<ClassLoader> classLoader;
+    private String className;
+    private StAXArtifactProcessor processor;
+    private Class modelType;
+    
+    LazyStAXArtifactProcessor(ExtensionPointRegistry registry, QName artifactType, String modelTypeName, ClassLoader classLoader, String className) {
+        this.registry = registry;
+        this.artifactType = artifactType;
+        this.modelTypeName = modelTypeName;
+        this.classLoader = new WeakReference<ClassLoader>(classLoader);
+        this.className = className;
+    }
+
+    public QName getArtifactType() {
+        return artifactType;
+    }
+    
+    @SuppressWarnings("unchecked")
+    private StAXArtifactProcessor getProcessor() {
+        if (processor == null) {
+
+            if (className.equals(DefaultBeanModelProcessor.class.getName())) {
+                
+                // Specific initialization for the DefaultBeanModelProcessor
+                ModelFactoryExtensionPoint modelFactories = registry.getExtensionPoint(ModelFactoryExtensionPoint.class);
+                AssemblyFactory assemblyFactory = modelFactories.getFactory(AssemblyFactory.class);
+                PolicyFactory policyFactory = modelFactories.getFactory(PolicyFactory.class);
+                processor = new DefaultBeanModelProcessor(assemblyFactory, policyFactory, artifactType, getModelType());
+            } else {
+                
+                // Load and instanciate the processor class
+                try {
+                    Class<StAXArtifactProcessor> processorClass = (Class<StAXArtifactProcessor>)Class.forName(className, true, classLoader.get());
+                    Constructor<StAXArtifactProcessor> constructor = processorClass.getConstructor(ExtensionPointRegistry.class);
+                    processor = constructor.newInstance(registry);
+                } catch (Exception e) {
+                    throw new IllegalStateException(e);
+                }
+            }
+        }
+        return processor;
+    }
+
+    public Object read(XMLStreamReader inputSource) throws ContributionReadException, XMLStreamException {
+        return getProcessor().read(inputSource);
+    }
+
+    @SuppressWarnings("unchecked")
+    public void write(Object model, XMLStreamWriter outputSource) throws ContributionWriteException, XMLStreamException {
+        getProcessor().write(model, outputSource);
+    }
+
+    public Class getModelType() {
+        if (modelType == null) {
+            try {
+                modelType = Class.forName(modelTypeName, true, classLoader.get());
+            } catch (Exception e) {
+                throw new IllegalStateException(e);
+            }
+        }
+        return modelType;
+    }
+
+    @SuppressWarnings("unchecked")
+    public void resolve(Object model, ModelResolver resolver) throws ContributionResolveException {
+        getProcessor().resolve(model, resolver);
+    }
+
+}

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

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

Added: incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/LazyURLArtifactProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/LazyURLArtifactProcessor.java?view=auto&rev=549306
==============================================================================
--- incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/LazyURLArtifactProcessor.java (added)
+++ incubator/tuscany/java/sca/modules/host-embedded/src/main/java/org/apache/tuscany/sca/host/embedded/impl/LazyURLArtifactProcessor.java Wed Jun 20 17:40:00 2007
@@ -0,0 +1,95 @@
+/*
+ * 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.host.embedded.impl;
+
+import java.lang.ref.WeakReference;
+import java.lang.reflect.Constructor;
+import java.net.URI;
+import java.net.URL;
+
+import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+import org.apache.tuscany.sca.contribution.service.ContributionReadException;
+import org.apache.tuscany.sca.contribution.service.ContributionResolveException;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+
+/**
+ * A wrapper around an Artifact processor class allowing lazy loading and
+ * initialization of artifact processors.
+ *
+ * @version $Rev$ $Date$
+ */
+class LazyURLArtifactProcessor implements URLArtifactProcessor {
+
+    private ExtensionPointRegistry registry;
+    private String artifactType;
+    private String modelTypeName;
+    private WeakReference<ClassLoader> classLoader;
+    private String className;
+    private URLArtifactProcessor processor;
+    private Class modelType;
+    
+    LazyURLArtifactProcessor(ExtensionPointRegistry registry, String artifactType, String modelTypeName, ClassLoader classLoader, String className) {
+        this.registry = registry;
+        this.artifactType = artifactType;
+        this.modelTypeName = modelTypeName;
+        this.classLoader = new WeakReference<ClassLoader>(classLoader);
+        this.className = className;
+    }
+
+    public String getArtifactType() {
+        return artifactType;
+    }
+    
+    @SuppressWarnings("unchecked")
+    private URLArtifactProcessor getProcessor() {
+        if (processor == null) {
+            try {
+                Class<URLArtifactProcessor> processorClass = (Class<URLArtifactProcessor>)Class.forName(className, true, classLoader.get());
+                Constructor<URLArtifactProcessor> constructor = processorClass.getConstructor(ExtensionPointRegistry.class);
+                processor = constructor.newInstance(registry);
+            } catch (Exception e) {
+                throw new IllegalStateException(e);
+            }
+        }
+        return processor;
+    }
+
+    public Object read(URL contributionURL, URI artifactURI, URL artifactURL) throws ContributionReadException {
+        return getProcessor().read(contributionURL, artifactURI, artifactURL);
+    }
+    
+    public Class getModelType() {
+        if (modelType == null) {
+            try {
+                modelType = Class.forName(modelTypeName, true, classLoader.get());
+            } catch (Exception e) {
+                throw new IllegalStateException(e);
+            }
+        }
+        return modelType;
+    }
+
+    @SuppressWarnings("unchecked")
+    public void resolve(Object model, ModelResolver resolver) throws ContributionResolveException {
+        getProcessor().resolve(model, resolver);
+    }
+
+}

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

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

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=549306&r1=549305&r2=549306
==============================================================================
--- 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 Wed Jun 20 17:40:00 2007
@@ -19,13 +19,25 @@
 
 package org.apache.tuscany.sca.host.embedded.impl;
 
+import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.namespace.QName;
 
 import org.apache.tuscany.sca.assembly.AssemblyFactory;
 import org.apache.tuscany.sca.assembly.DefaultSCABindingFactory;
 import org.apache.tuscany.sca.assembly.SCABindingFactory;
+import org.apache.tuscany.sca.assembly.xml.Constants;
 import org.apache.tuscany.sca.contribution.ContributionFactory;
 import org.apache.tuscany.sca.contribution.impl.ContributionFactoryImpl;
+import org.apache.tuscany.sca.contribution.processor.ArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint;
+import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor;
+import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessorExtensionPoint;
 import org.apache.tuscany.sca.contribution.service.ContributionService;
 import org.apache.tuscany.sca.core.DefaultExtensionPointRegistry;
 import org.apache.tuscany.sca.core.DefaultModelFactoryExtensionPoint;
@@ -43,6 +55,10 @@
 import org.apache.tuscany.sca.invocation.MessageFactory;
 import org.apache.tuscany.sca.policy.DefaultPolicyFactory;
 import org.apache.tuscany.sca.policy.PolicyFactory;
+import org.apache.tuscany.sca.provider.BindingProviderFactory;
+import org.apache.tuscany.sca.provider.ImplementationProviderFactory;
+import org.apache.tuscany.sca.provider.ProviderFactory;
+import org.apache.tuscany.sca.provider.ProviderFactoryExtensionPoint;
 import org.apache.tuscany.sca.scope.ScopeRegistry;
 
 public class ReallySmallRuntime {
@@ -111,8 +127,19 @@
                                                                                 scopeRegistry,
                                                                                 workManager);
 
+        // Load the runtime modules
+        modules = loadModules(registry, classLoader);
+        
         // Start the runtime modules
-        modules = startModules(registry, classLoader);
+        startModules(registry, modules);
+        
+        // Load the artifact processor extensions
+        loadArtifactProcessors(registry, classLoader, URLArtifactProcessor.class);
+        loadArtifactProcessors(registry, classLoader, StAXArtifactProcessor.class);
+        
+        // Load the provider factory extensions
+        loadProviderFactories(registry, classLoader, BindingProviderFactory.class);
+        loadProviderFactories(registry, classLoader, ImplementationProviderFactory.class);
 
     }
 
@@ -147,8 +174,7 @@
     }
 
     @SuppressWarnings("unchecked")
-    private List<ModuleActivator> startModules(ExtensionPointRegistry registry, ClassLoader classLoader)
-        throws ActivationException {
+    private List<ModuleActivator> loadModules(ExtensionPointRegistry registry, ClassLoader classLoader) {
 
         // Load and instantiate the modules found on the classpath
         List<ModuleActivator> modules = ReallySmallRuntimeBuilder.getServices(classLoader, ModuleActivator.class);
@@ -160,13 +186,110 @@
                 }
             }
         }
+        return modules;
+    }
+    
+    private void startModules(ExtensionPointRegistry registry, List<ModuleActivator> modules) throws ActivationException {
 
         // Start all the extension modules
         for (ModuleActivator activator : modules) {
             activator.start(registry);
         }
+    }
 
-        return modules;
+    private List<ArtifactProcessor> loadArtifactProcessors(ExtensionPointRegistry registry, ClassLoader classLoader, Class<?> processorClass) {
+
+        // Get the processor service declarations
+        Set<String> processorDeclarations; 
+        try {
+            processorDeclarations = ReallySmallRuntimeBuilder.getServiceClassNames(classLoader, processorClass.getName());
+        } catch (IOException e) {
+            throw new IllegalStateException(e);
+        }
+        
+        // Get the target extension points
+        StAXArtifactProcessorExtensionPoint staxProcessors = registry.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);
+        URLArtifactProcessorExtensionPoint urlProcessors = registry.getExtensionPoint(URLArtifactProcessorExtensionPoint.class);
+        List<ArtifactProcessor> processors = new ArrayList<ArtifactProcessor>();
+        
+        for (String processorDeclaration: processorDeclarations) {
+            Map<String, String> attributes = ReallySmallRuntimeBuilder.parseServiceDeclaration(processorDeclaration);
+            String className = attributes.get("class");
+            
+            // Load a StAX artifact processor
+            if (processorClass == StAXArtifactProcessor.class) {
+                QName artifactType = null;
+                String qname = attributes.get("type");
+                if (qname != null) {
+                    int h = qname.indexOf('#');
+                    if (h == -1) {
+                        artifactType = new QName(Constants.SCA10_NS, qname);
+                    } else {
+                        artifactType = new QName(qname.substring(0, h), qname.substring(h+1));
+                    }
+                }
+                
+                String modelTypeName = attributes.get("model");
+                
+                // Create a processor wrapper and register it
+                StAXArtifactProcessor processor = new LazyStAXArtifactProcessor(registry, artifactType, modelTypeName, classLoader, className);
+                staxProcessors.addArtifactProcessor(processor);
+                processors.add(processor);
+
+            } else if (processorClass == URLArtifactProcessor.class) {
+
+                String artifactType = attributes.get("type");
+                String modelTypeName = attributes.get("model");
+                
+                // Create a processor wrapper and register it
+                URLArtifactProcessor processor = new LazyURLArtifactProcessor(registry, artifactType, modelTypeName, classLoader, className);
+                urlProcessors.addArtifactProcessor(processor);
+                processors.add(processor);
+
+            }
+        }
+        return processors;
+    }
+
+    private List<ProviderFactory> loadProviderFactories(ExtensionPointRegistry registry, ClassLoader classLoader, Class<?> factoryClass) {
+
+        // Get the processor service declarations
+        Set<String> factoryDeclarations; 
+        try {
+            factoryDeclarations = ReallySmallRuntimeBuilder.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 = ReallySmallRuntimeBuilder.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) {

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?view=diff&rev=549306&r1=549305&r2=549306
==============================================================================
--- 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 Wed Jun 20 17:40:00 2007
@@ -26,9 +26,12 @@
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Enumeration;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
+import java.util.StringTokenizer;
 
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLOutputFactory;
@@ -218,7 +221,7 @@
      * @return A class name which extends/implements the service class
      * @throws IOException
      */
-    private static Set<String> getServiceClassNames(ClassLoader classLoader, String name) throws IOException {
+    public static Set<String> getServiceClassNames(ClassLoader classLoader, String name) throws IOException {
         Set<String> set = new HashSet<String>();
         Enumeration<URL> urls = classLoader.getResources("META-INF/services/" + name);
         while (urls.hasMoreElements()) {
@@ -276,6 +279,33 @@
             throw new IllegalStateException(e);
         }
         return instances;
+    }
+
+    /**
+     * Parse a service declaration in the form class;attr=value,attr=value and
+     * return a map of attributes
+     * @param declaration
+     * @return a map of attributes
+     */
+    public static Map<String, String> parseServiceDeclaration(String declaration) {
+        Map<String, String> attributes = new HashMap<String, String>(); 
+        StringTokenizer tokens = new StringTokenizer(declaration);
+        String className = tokens.nextToken(";");
+        if (className != null) {
+            attributes.put("class", className);
+        }
+        for (;;) {
+            if (!tokens.hasMoreTokens())
+                break;
+            String key = tokens.nextToken("=").substring(1);
+            if (key == null)
+                break;
+            String value = tokens.nextToken(",").substring(1);
+            if (value == null)
+                break;
+            attributes.put(key, value);
+        }
+        return attributes;
     }
 
 }



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