You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by rf...@apache.org on 2007/04/03 19:40:41 UTC

svn commit: r525216 - in /incubator/tuscany/java/sca/modules: ./ core/ core/src/main/java/org/apache/tuscany/core/ core/src/main/java/org/apache/tuscany/core/bootstrap/ core/src/main/java/org/apache/tuscany/core/component/ core/src/main/java/org/apache...

Author: rfeng
Date: Tue Apr  3 10:40:40 2007
New Revision: 525216

URL: http://svn.apache.org/viewvc?view=rev&rev=525216
Log:
Add the minicore that can bootstrap Tuscany system without dependency on SCDL and Java component type

Added:
    incubator/tuscany/java/sca/modules/
    incubator/tuscany/java/sca/modules/core/
      - copied from r521957, incubator/tuscany/sandbox/rfeng/minicore/
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/
      - copied from r524305, incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/Bootstrapper.java
      - copied, changed from r524852, incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/Bootstrapper.java
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java
      - copied, changed from r524852, incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionActivator.java
      - copied, changed from r524852, incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionActivator.java
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionRegistry.java   (with props)
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionRegistryImpl.java   (with props)
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/component/CallableReferenceImpl.java
      - copied unchanged from r524852, incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/component/CallableReferenceImpl.java
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/component/CallbackReferenceImpl.java
      - copied unchanged from r524852, incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/component/CallbackReferenceImpl.java
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/component/ComponentContextImpl.java
      - copied unchanged from r524852, incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/component/ComponentContextImpl.java
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/component/ServiceReferenceImpl.java
      - copied unchanged from r524852, incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/component/ServiceReferenceImpl.java
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/component/WorkContextImpl.java
      - copied unchanged from r524852, incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/component/WorkContextImpl.java
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/deployer/DeployerImpl.java
      - copied unchanged from r524852, incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/deployer/DeployerImpl.java
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeComponentTypeLoader.java
      - copied unchanged from r524852, incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeComponentTypeLoader.java
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.java
      - copied unchanged from r524852, incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.java
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/loader/
      - copied from r524852, incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/loader/
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java
      - copied, changed from r524852, incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java
    incubator/tuscany/java/sca/modules/core/src/test/java/org/apache/tuscany/core/bootstrap/ExtensionRegistryImplTestCase.java   (with props)
    incubator/tuscany/java/sca/modules/core/src/test/java/org/apache/tuscany/core/component/scope/BasicConversationalScopeTestCase.java
      - copied unchanged from r521966, incubator/tuscany/sandbox/rfeng/minicore/src/test/java/org/apache/tuscany/core/component/scope/BasicConversationalScopeTestCase.java
    incubator/tuscany/java/sca/modules/core/src/test/java/org/apache/tuscany/core/component/scope/BasicHttpSessionScopeTestCase.java
      - copied unchanged from r521966, incubator/tuscany/sandbox/rfeng/minicore/src/test/java/org/apache/tuscany/core/component/scope/BasicHttpSessionScopeTestCase.java
    incubator/tuscany/java/sca/modules/core/src/test/java/org/apache/tuscany/core/component/scope/ConversationalScopeContainerDestroyOnExpirationTestCase.java
      - copied unchanged from r521966, incubator/tuscany/sandbox/rfeng/minicore/src/test/java/org/apache/tuscany/core/component/scope/ConversationalScopeContainerDestroyOnExpirationTestCase.java
    incubator/tuscany/java/sca/modules/core/src/test/java/org/apache/tuscany/core/component/scope/ConversationalScopeContainerMaxAgeTestCase.java
      - copied unchanged from r521966, incubator/tuscany/sandbox/rfeng/minicore/src/test/java/org/apache/tuscany/core/component/scope/ConversationalScopeContainerMaxAgeTestCase.java
    incubator/tuscany/java/sca/modules/core/src/test/java/org/apache/tuscany/core/component/scope/ConversationalScopeContainerMaxIdleTimeTestCase.java
      - copied unchanged from r521966, incubator/tuscany/sandbox/rfeng/minicore/src/test/java/org/apache/tuscany/core/component/scope/ConversationalScopeContainerMaxIdleTimeTestCase.java
    incubator/tuscany/java/sca/modules/core/src/test/java/org/apache/tuscany/core/component/scope/ConversationalScopeContainerPersistenceTestCase.java
      - copied unchanged from r521966, incubator/tuscany/sandbox/rfeng/minicore/src/test/java/org/apache/tuscany/core/component/scope/ConversationalScopeContainerPersistenceTestCase.java
    incubator/tuscany/java/sca/modules/core/src/test/java/org/apache/tuscany/core/component/scope/WorkContextTestCase.java
      - copied unchanged from r521966, incubator/tuscany/sandbox/rfeng/minicore/src/test/java/org/apache/tuscany/core/component/scope/WorkContextTestCase.java
Removed:
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/model/
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/wire/NonBlockingInterceptorGenerator.java
    incubator/tuscany/java/sca/modules/core/src/test/java/org/apache/tuscany/core/builder/physical/
    incubator/tuscany/java/sca/modules/core/src/test/java/org/apache/tuscany/core/component/WorkContextImplTestCase.java
Modified:
    incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/component/scope/AbstractScopeContainer.java

Copied: incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/Bootstrapper.java (from r524852, incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/Bootstrapper.java)
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/Bootstrapper.java?view=diff&rev=525216&p1=incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/Bootstrapper.java&r1=524852&p2=incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/Bootstrapper.java&r2=525216
==============================================================================
--- incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/Bootstrapper.java (original)
+++ incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/Bootstrapper.java Tue Apr  3 10:40:40 2007
@@ -71,5 +71,6 @@
     AutowireResolver getAutowireResolver();
     
     ComponentManager getComponentManager();
+    ExtensionRegistry getExtensionRegistry();
 
 }

Copied: incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java (from r524852, incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java)
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java?view=diff&rev=525216&p1=incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java&r1=524852&p2=incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java&r2=525216
==============================================================================
--- incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java (original)
+++ incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java Tue Apr  3 10:40:40 2007
@@ -24,6 +24,8 @@
 import org.apache.tuscany.core.binding.local.LocalBindingDefinition;
 import org.apache.tuscany.core.binding.local.LocalBindingLoader;
 import org.apache.tuscany.core.builder.BuilderRegistryImpl;
+import org.apache.tuscany.core.builder.ConnectorImpl;
+import org.apache.tuscany.core.component.ComponentManagerImpl;
 import org.apache.tuscany.core.component.scope.AbstractScopeContainer;
 import org.apache.tuscany.core.component.scope.CompositeScopeContainer;
 import org.apache.tuscany.core.component.scope.RequestScopeContainer;
@@ -41,8 +43,10 @@
 import org.apache.tuscany.core.loader.ReferenceLoader;
 import org.apache.tuscany.core.loader.ServiceLoader;
 import org.apache.tuscany.core.resolver.AutowireResolver;
+import org.apache.tuscany.core.resolver.DefaultAutowireResolver;
 import org.apache.tuscany.host.MonitorFactory;
 import org.apache.tuscany.spi.builder.Builder;
+import org.apache.tuscany.spi.builder.BuilderRegistry;
 import org.apache.tuscany.spi.builder.Connector;
 import org.apache.tuscany.spi.component.ComponentManager;
 import org.apache.tuscany.spi.component.ScopeContainerMonitor;
@@ -68,6 +72,7 @@
     private final AutowireResolver resolver;
     private final Connector connector;
     private final ScopeRegistry scopeRegistry;
+    private final ExtensionRegistry extensionRegistry;
 
     /**
      * Create a default bootstrapper.
@@ -91,7 +96,18 @@
         this.resolver = resolver;
         this.connector = connector;
         this.scopeRegistry = createScopeRegistry();
+        this.extensionRegistry = new ExtensionRegistryImpl();
     }
+    
+    public DefaultBootstrapper(MonitorFactory monitorFactory) {
+        this.monitorFactory = monitorFactory;
+        this.xmlFactory = XMLInputFactory.newInstance("javax.xml.stream.XMLInputFactory", getClass().getClassLoader());
+        this.resolver = new DefaultAutowireResolver();
+        this.componentManager = new ComponentManagerImpl(null, this.resolver);
+        this.connector = new ConnectorImpl(componentManager);
+        this.scopeRegistry = createScopeRegistry();
+        this.extensionRegistry = new ExtensionRegistryImpl();
+    }    
 
     /**
      * Returns the MonitorFactory being used by this bootstrapper.
@@ -110,11 +126,15 @@
      */
     public Deployer createDeployer() {
         ScopeRegistry scopeRegistry = getScopeRegistry();
-        Builder builder = createBuilder(scopeRegistry);
-        Loader loader = createLoader(null, null);
+        BuilderRegistry builder = createBuilder(scopeRegistry);
+        LoaderRegistry loader = createLoader(null, null);
         DeployerImpl deployer = new DeployerImpl(xmlFactory, loader, builder, componentManager, resolver, connector);
         deployer.setMonitor(getMonitorFactory().getMonitor(ScopeContainerMonitor.class));
         deployer.setScopeRegistry(getScopeRegistry());
+        extensionRegistry.addExtension(ScopeRegistry.class, scopeRegistry);
+        extensionRegistry.addExtension(BuilderRegistry.class, builder);
+        extensionRegistry.addExtension(LoaderRegistry.class, loader);
+        extensionRegistry.addExtension(Deployer.class, deployer);
         return deployer;
     }
 
@@ -195,7 +215,7 @@
      *            will be supported
      * @return a new Builder
      */
-    private Builder createBuilder(ScopeRegistry scopeRegistry) {
+    private BuilderRegistry createBuilder(ScopeRegistry scopeRegistry) {
         BuilderRegistryImpl builderRegistry = new BuilderRegistryImpl(scopeRegistry);
         CompositeBuilder compositeBuilder = new CompositeBuilder();
         compositeBuilder.setBuilderRegistry(builderRegistry);
@@ -219,6 +239,13 @@
      */
     public ScopeRegistry getScopeRegistry() {
         return scopeRegistry;
+    }
+
+    /**
+     * @return the extensionRegistry
+     */
+    public ExtensionRegistry getExtensionRegistry() {
+        return extensionRegistry;
     }
 
 }

Copied: incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionActivator.java (from r524852, incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionActivator.java)
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionActivator.java?view=diff&rev=525216&p1=incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionActivator.java&r1=524852&p2=incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionActivator.java&r2=525216
==============================================================================
--- incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionActivator.java (original)
+++ incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionActivator.java Tue Apr  3 10:40:40 2007
@@ -19,13 +19,17 @@
 
 package org.apache.tuscany.core.bootstrap;
 
-import org.apache.tuscany.spi.builder.BuilderRegistry;
-import org.apache.tuscany.spi.loader.LoaderRegistry;
 
 /**
  * @version $Rev$ $Date$
  */
 public interface ExtensionActivator {
-    void start(LoaderRegistry loaderRegistry, BuilderRegistry builderRegistry);
-    void stop();
+    /**
+     * @param registry
+     */
+    void start(ExtensionRegistry registry);
+    /**
+     * @param registry
+     */
+    void stop(ExtensionRegistry registry);
 }

Added: incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionRegistry.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionRegistry.java?view=auto&rev=525216
==============================================================================
--- incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionRegistry.java (added)
+++ incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionRegistry.java Tue Apr  3 10:40:40 2007
@@ -0,0 +1,56 @@
+/*
+ * 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.core.bootstrap;
+
+import java.util.List;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public interface ExtensionRegistry {
+    /**
+     * @param <T>
+     * @param extensionPoint
+     * @param extension
+     */
+    <T> void addExtension(Class<T> extensionPoint, T extension);
+    /**
+     * @param <T>
+     * @param extensionPoint
+     * @return
+     */
+    <T> List<T> getExtensions(Class<T> extensionPoint);
+    /**
+     * @param <T>
+     * @param extensionPoint
+     * @return
+     */
+    <T> T getExtension(Class<T> extensionPoint);
+    /**
+     * @param <T>
+     * @param extensionPoint
+     * @param extension
+     */
+    <T> void removeExtension(Class<T> extensionPoint, T extension);
+    /**
+     * @param extensionPoint
+     */
+    void removeExtensionPoint(Class extensionPoint);
+}

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

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

Added: incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionRegistryImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionRegistryImpl.java?view=auto&rev=525216
==============================================================================
--- incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionRegistryImpl.java (added)
+++ incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionRegistryImpl.java Tue Apr  3 10:40:40 2007
@@ -0,0 +1,71 @@
+/*
+ * 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.core.bootstrap;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A registry to hold all the extension points and extensions
+ * 
+ * @version $Rev$ $Date$
+ */
+public class ExtensionRegistryImpl implements ExtensionRegistry {
+    private Map<Class, List<Object>> extensions = new HashMap<Class, List<Object>>();
+
+    public <T> void addExtension(Class<T> extensionPoint, T extension) {
+        List<Object> list = extensions.get(extensionPoint);
+        if (list == null) {
+            list = new ArrayList<Object>();
+            extensions.put(extensionPoint, list);
+        }
+        if (!list.contains(extension)) {
+            list.add(extension);
+        }
+    }
+
+    public <T> T getExtension(Class<T> extensionPoint) {
+        List<Object> list = extensions.get(extensionPoint);
+        if (list == null || list.isEmpty()) {
+            return null;
+        } else {
+            return extensionPoint.cast(list.get(0));
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T> List<T> getExtensions(Class<T> extensionPoint) {
+        return (List<T>)extensions.get(extensionPoint);
+    }
+
+    public <T> void removeExtension(Class<T> extensionPoint, T extension) {
+        List<T> list = getExtensions(extensionPoint);
+        if (list != null) {
+            list.remove(extension);
+        }
+    }
+
+    public void removeExtensionPoint(Class extensionPoint) {
+        extensions.remove(extensionPoint);
+    }
+
+}

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

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

Modified: incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/component/scope/AbstractScopeContainer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/component/scope/AbstractScopeContainer.java?view=diff&rev=525216&r1=524305&r2=525216
==============================================================================
--- incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/component/scope/AbstractScopeContainer.java (original)
+++ incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/component/scope/AbstractScopeContainer.java Tue Apr  3 10:40:40 2007
@@ -59,127 +59,42 @@
         }
     };
 
-    private final Scope scope;
-    protected final ScopeContainerMonitor monitor;
-
     protected final Map<AtomicComponent<?>, URI> componentGroups =
         new ConcurrentHashMap<AtomicComponent<?>, URI>();
-
     protected final Map<KEY, URI> contextGroups = new ConcurrentHashMap<KEY, URI>();
 
+    // the queue of instanceWrappers to destroy, in the order that their instances were created
+    protected final Map<KEY, List<InstanceWrapper<?>>> destroyQueues =
+        new ConcurrentHashMap<KEY, List<InstanceWrapper<?>>>();
+
     // the queue of components to eagerly initialize in each group
     protected final Map<URI, List<AtomicComponent<?>>> initQueues =
         new HashMap<URI, List<AtomicComponent<?>>>();
 
-    // the queue of instanceWrappers to destroy, in the order that their instances were created
-    protected final Map<KEY, List<InstanceWrapper<?>>> destroyQueues =
-        new ConcurrentHashMap<KEY, List<InstanceWrapper<?>>>();
+    protected final ScopeContainerMonitor monitor;
+
+    private final Scope scope;
 
     public AbstractScopeContainer(Scope scope, ScopeContainerMonitor monitor) {
         this.scope = scope;
         this.monitor = monitor;
     }
 
-    public Scope getScope() {
-        return scope;
-    }
-
-    @Reference
-    public void setScopeRegistry(ScopeRegistry scopeRegistry) {
-        scopeRegistry.register(this);
-    }
-
-    @Init
-    public synchronized void start() {
-        int lifecycleState = getLifecycleState();
-        if (lifecycleState != UNINITIALIZED && lifecycleState != STOPPED) {
-            throw new IllegalStateException("Scope must be in UNINITIALIZED or STOPPED state [" + lifecycleState + "]");
-        }
-        setLifecycleState(RUNNING);
-    }
-
-    @Destroy
-    public synchronized void stop() {
-        int lifecycleState = getLifecycleState();
-        if (lifecycleState != RUNNING) {
-            throw new IllegalStateException("Scope in wrong state [" + lifecycleState + "]");
-        }
-        setLifecycleState(STOPPED);
-        componentGroups.clear();
-        contextGroups.clear();
-        synchronized (initQueues) {
-            initQueues.clear();
-        }
-        destroyQueues.clear();
-    }
-
     protected void checkInit() {
         if (getLifecycleState() != RUNNING) {
             throw new IllegalStateException("Scope container not running [" + getLifecycleState() + "]");
         }
     }
 
-    public void onEvent(Event event) {
-    }
-
-    public <T> void register(AtomicComponent<T> component, URI groupId) {
-        checkInit();
-        if (component.isEagerInit()) {
-            componentGroups.put(component, groupId);
-            synchronized (initQueues) {
-                List<AtomicComponent<?>> initQueue = initQueues.get(groupId);
-                if (initQueue == null) {
-                    initQueue = new ArrayList<AtomicComponent<?>>();
-                    initQueues.put(groupId, initQueue);
-                }
-                // FIXME it would be more efficient to binary search and then insert
-                initQueue.add(component);
-                Collections.sort(initQueue, COMPARATOR);
-            }
-        }
-    }
-
-    public <T> void unregister(AtomicComponent<T> component) {
-        if (component.isEagerInit()) {
-            URI groupId = componentGroups.remove(component);
-            synchronized (initQueues) {
-                List<AtomicComponent<?>> initQueue = initQueues.get(groupId);
-                initQueue.remove(component);
-                if (initQueue.isEmpty()) {
-                    initQueues.remove(groupId);
-                }
-            }
-        }
-    }
-
-    public void startContext(KEY contextId, URI groupId) throws GroupInitializationException {
-        assert !contextGroups.containsKey(contextId);
-        contextGroups.put(contextId, groupId);
-        destroyQueues.put(contextId, new ArrayList<InstanceWrapper<?>>());
-
-        // get and clone initialization queue
-        List<AtomicComponent<?>> initQueue;
-        synchronized (initQueues) {
-            initQueue = initQueues.get(groupId);
-            if (initQueue != null) {
-                initQueue = new ArrayList<AtomicComponent<?>>(initQueue);
-            }
-        }
-        if (initQueue != null) {
-            initializeComponents(contextId, initQueue);
-        }
-    }
-
-    public void stopContext(KEY contextId) {
-        assert contextGroups.containsKey(contextId);
-        shutdownComponents(destroyQueues.get(contextId));
-        contextGroups.remove(contextId);
-        destroyQueues.remove(contextId);
-    }
-
-    public <T> InstanceWrapper<T> getWrapper(AtomicComponent<T> component, KEY contextId)
-        throws TargetResolutionException {
-        return null;
+    /**
+     * Creates a new physical instance of a component, wrapped in an InstanceWrapper.
+     *
+     * @param component the component whose instance should be created
+     * @return a wrapped instance that has been injected but not yet started
+     * @throws TargetResolutionException if there was a problem creating the instance
+     */
+    protected <T> InstanceWrapper<T> createInstance(AtomicComponent<T> component) throws TargetResolutionException {
+        return component.createInstanceWrapper();
     }
 
     public <T> InstanceWrapper<T> getAssociatedWrapper(AtomicComponent<T> component, KEY contextId)
@@ -187,12 +102,13 @@
         return null;
     }
 
-    public <T> void returnWrapper(AtomicComponent<T> component, InstanceWrapper<T> wrapper, KEY contextId)
-        throws TargetDestructionException {
+    public Scope getScope() {
+        return scope;
     }
 
-    public <T> void remove(AtomicComponent<T> component) throws PersistenceException {
-        throw new UnsupportedOperationException("Scope does not support persistence");
+    public <T> InstanceWrapper<T> getWrapper(AtomicComponent<T> component, KEY contextId)
+        throws TargetResolutionException {
+        return null;
     }
 
     /**
@@ -223,6 +139,39 @@
         }
     }
 
+    public void onEvent(Event event) {
+    }
+
+    public <T> void register(AtomicComponent<T> component, URI groupId) {
+        checkInit();
+        if (component.isEagerInit()) {
+            componentGroups.put(component, groupId);
+            synchronized (initQueues) {
+                List<AtomicComponent<?>> initQueue = initQueues.get(groupId);
+                if (initQueue == null) {
+                    initQueue = new ArrayList<AtomicComponent<?>>();
+                    initQueues.put(groupId, initQueue);
+                }
+                // FIXME it would be more efficient to binary search and then insert
+                initQueue.add(component);
+                Collections.sort(initQueue, COMPARATOR);
+            }
+        }
+    }
+
+    public <T> void remove(AtomicComponent<T> component) throws PersistenceException {
+        throw new UnsupportedOperationException("Scope does not support persistence");
+    }
+
+    public <T> void returnWrapper(AtomicComponent<T> component, InstanceWrapper<T> wrapper, KEY contextId)
+        throws TargetDestructionException {
+    }
+
+    @Reference
+    public void setScopeRegistry(ScopeRegistry scopeRegistry) {
+        scopeRegistry.register(this);
+    }
+
     /**
      * Shut down an ordered list of instances.
      * The list passed to this method is treated as a live, mutable list
@@ -248,18 +197,69 @@
         }
     }
 
+    @Init
+    public synchronized void start() {
+        int lifecycleState = getLifecycleState();
+        if (lifecycleState != UNINITIALIZED && lifecycleState != STOPPED) {
+            throw new IllegalStateException("Scope must be in UNINITIALIZED or STOPPED state [" + lifecycleState + "]");
+        }
+        setLifecycleState(RUNNING);
+    }
+
+    public void startContext(KEY contextId, URI groupId) throws GroupInitializationException {
+        assert !contextGroups.containsKey(contextId);
+        contextGroups.put(contextId, groupId);
+        destroyQueues.put(contextId, new ArrayList<InstanceWrapper<?>>());
+
+        // get and clone initialization queue
+        List<AtomicComponent<?>> initQueue;
+        synchronized (initQueues) {
+            initQueue = initQueues.get(groupId);
+            if (initQueue != null) {
+                initQueue = new ArrayList<AtomicComponent<?>>(initQueue);
+            }
+        }
+        if (initQueue != null) {
+            initializeComponents(contextId, initQueue);
+        }
+    }
+
+    @Destroy
+    public synchronized void stop() {
+        int lifecycleState = getLifecycleState();
+        if (lifecycleState != RUNNING) {
+            throw new IllegalStateException("Scope in wrong state [" + lifecycleState + "]");
+        }
+        setLifecycleState(STOPPED);
+        componentGroups.clear();
+        contextGroups.clear();
+        synchronized (initQueues) {
+            initQueues.clear();
+        }
+        destroyQueues.clear();
+    }
+
+    public void stopContext(KEY contextId) {
+        assert contextGroups.containsKey(contextId);
+        shutdownComponents(destroyQueues.get(contextId));
+        contextGroups.remove(contextId);
+        destroyQueues.remove(contextId);
+    }
+
     public String toString() {
         return "In state [" + super.toString() + ']';
     }
 
-    /**
-     * Creates a new physical instance of a component, wrapped in an InstanceWrapper.
-     *
-     * @param component the component whose instance should be created
-     * @return a wrapped instance that has been injected but not yet started
-     * @throws TargetResolutionException if there was a problem creating the instance
-     */
-    protected <T> InstanceWrapper<T> createInstance(AtomicComponent<T> component) throws TargetResolutionException {
-        return component.createInstanceWrapper();
+    public <T> void unregister(AtomicComponent<T> component) {
+        if (component.isEagerInit()) {
+            URI groupId = componentGroups.remove(component);
+            synchronized (initQueues) {
+                List<AtomicComponent<?>> initQueue = initQueues.get(groupId);
+                initQueue.remove(component);
+                if (initQueue.isEmpty()) {
+                    initQueues.remove(groupId);
+                }
+            }
+        }
     }
 }

Copied: incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java (from r524852, incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java)
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java?view=diff&rev=525216&p1=incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java&r1=524852&p2=incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java&r2=525216
==============================================================================
--- incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java (original)
+++ incubator/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java Tue Apr  3 10:40:40 2007
@@ -40,6 +40,7 @@
 import org.apache.tuscany.core.bootstrap.Bootstrapper;
 import org.apache.tuscany.core.bootstrap.DefaultBootstrapper;
 import org.apache.tuscany.core.bootstrap.ExtensionActivator;
+import org.apache.tuscany.core.bootstrap.ExtensionRegistry;
 import org.apache.tuscany.core.builder.ConnectorImpl;
 import org.apache.tuscany.core.component.ComponentManagerImpl;
 import org.apache.tuscany.core.component.SimpleWorkContext;
@@ -119,6 +120,7 @@
      * The ComponentManager that manages all components in this runtime.
      */
     protected ComponentManager componentManager;
+    protected ExtensionRegistry extensionRegistry;
 
     /**
      * Registry for ClassLoaders used by this runtime.
@@ -205,16 +207,17 @@
         // URI name = TUSCANY_SYSTEM_ROOT.resolve("main");
         Bootstrapper bootstrapper = createBootstrapper();
         Deployer deployer = bootstrapper.createDeployer();
+        this.extensionRegistry = bootstrapper.getExtensionRegistry();
+        
         registerSystemComponent(TUSCANY_DEPLOYER, Deployer.class, deployer);
         registerSystemComponent(WORK_CONTEXT_URI, WorkContext.class, new SimpleWorkContext());
 
         this.scopeRegistry = bootstrapper.getScopeRegistry();
-        
-        LoaderRegistry loaderRegistry = (LoaderRegistry)((DeployerImpl)deployer).getLoader();
-        BuilderRegistry builderRegistry = (BuilderRegistry)((DeployerImpl)deployer).getBuilder();
+
         activators = getInstances(getHostClassLoader(), ExtensionActivator.class);
+        ExtensionRegistry registry = bootstrapper.getExtensionRegistry();
         for (ExtensionActivator activator : activators) {
-            activator.start(loaderRegistry, builderRegistry);
+            activator.start(registry);
         }
 
         registerBaselineSystemComponents();
@@ -275,6 +278,7 @@
         try {
             JavaServiceContract<S> contract = new JavaServiceContract<S>(type);
             componentManager.registerJavaObject(uri, contract, component);
+            extensionRegistry.addExtension(type, component);
         } catch (RegistrationException e) {
             throw new InitializationException(e);
         }
@@ -333,16 +337,17 @@
         Enumeration<URL> urls = classLoader.getResources("META-INF/services/" + name);
         while (urls.hasMoreElements()) {
             URL url = urls.nextElement();
-            String service = getServiceName(url);
+            Set<String> service = getServiceNames(url);
             if (service != null) {
-                set.add(service);
+                set.addAll(service);
 
             }
         }
         return set;
     }
 
-    private static String getServiceName(URL url) throws IOException {
+    private static Set<String> getServiceNames(URL url) throws IOException {
+        Set<String> names = new HashSet<String>();
         InputStream is = IOHelper.getInputStream(url);
         BufferedReader reader = null;
         try {
@@ -351,8 +356,10 @@
                 String line = reader.readLine();
                 if (line == null) {
                     break;
-                } else if (!line.startsWith("#")) {
-                    return line.trim();
+                }
+                line = line.trim();
+                if (!line.startsWith("#") && !"".equals(line)) {
+                    names.add(line.trim());
                 }
             }
         } finally {
@@ -360,7 +367,7 @@
                 reader.close();
             }
         }
-        return null;
+        return names;
     }
 
     private static <T> Collection<T> getInstances(final ClassLoader classLoader, Class<T> serviceClass) {

Added: incubator/tuscany/java/sca/modules/core/src/test/java/org/apache/tuscany/core/bootstrap/ExtensionRegistryImplTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core/src/test/java/org/apache/tuscany/core/bootstrap/ExtensionRegistryImplTestCase.java?view=auto&rev=525216
==============================================================================
--- incubator/tuscany/java/sca/modules/core/src/test/java/org/apache/tuscany/core/bootstrap/ExtensionRegistryImplTestCase.java (added)
+++ incubator/tuscany/java/sca/modules/core/src/test/java/org/apache/tuscany/core/bootstrap/ExtensionRegistryImplTestCase.java Tue Apr  3 10:40:40 2007
@@ -0,0 +1,40 @@
+package org.apache.tuscany.core.bootstrap;
+
+import junit.framework.TestCase;
+
+public class ExtensionRegistryImplTestCase extends TestCase {
+    private ExtensionRegistry registry;
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        registry = new ExtensionRegistryImpl();
+    }
+
+    public void testRegistry() {
+        MyService service = new MyServiceImpl();
+        registry.addExtension(MyService.class, service);
+        assertSame(service, registry.getExtension(MyService.class));
+        assertEquals(1, registry.getExtensions(MyService.class).size());
+        MyService service2 = new MyServiceImpl();
+        registry.addExtension(MyService.class, service2);
+        assertSame(service, registry.getExtension(MyService.class));
+        assertEquals(2, registry.getExtensions(MyService.class).size());
+        registry.removeExtension(MyService.class, service);
+        assertSame(service2, registry.getExtension(MyService.class));
+        assertEquals(1, registry.getExtensions(MyService.class).size());
+        registry.removeExtensionPoint(MyService.class);
+        assertNull(registry.getExtension(MyService.class));
+    }
+
+    private static interface MyService {
+        void doSomething();
+    }
+
+    private static class MyServiceImpl implements MyService {
+
+        public void doSomething() {
+        }
+
+    }
+
+}

Propchange: incubator/tuscany/java/sca/modules/core/src/test/java/org/apache/tuscany/core/bootstrap/ExtensionRegistryImplTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/core/src/test/java/org/apache/tuscany/core/bootstrap/ExtensionRegistryImplTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date



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