diff options
Diffstat (limited to 'sca-java-1.x/tags/java-M1-20060522/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/CompositeScopeContext.java')
-rw-r--r-- | sca-java-1.x/tags/java-M1-20060522/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/CompositeScopeContext.java | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/sca-java-1.x/tags/java-M1-20060522/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/CompositeScopeContext.java b/sca-java-1.x/tags/java-M1-20060522/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/CompositeScopeContext.java new file mode 100644 index 0000000000..7468ff9dd6 --- /dev/null +++ b/sca-java-1.x/tags/java-M1-20060522/java/sca/core/src/main/java/org/apache/tuscany/core/context/scope/CompositeScopeContext.java @@ -0,0 +1,156 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.context.scope; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.tuscany.core.builder.ContextFactory; +import org.apache.tuscany.core.context.CompositeContext; +import org.apache.tuscany.core.context.Context; +import org.apache.tuscany.core.context.EventContext; +import org.apache.tuscany.core.context.QualifiedName; +import org.apache.tuscany.core.context.ScopeContext; +import org.apache.tuscany.core.context.ScopeInitializationException; +import org.apache.tuscany.core.context.ScopeRuntimeException; +import org.apache.tuscany.core.context.TargetException; +import org.apache.tuscany.core.context.event.Event; +import org.apache.tuscany.core.context.event.ModuleStart; +import org.apache.tuscany.core.context.event.ModuleStop; +import org.apache.tuscany.core.context.impl.AbstractLifecycle; + +/** + * Manages the lifecycle of composite component contexts, i.e. contexts which contain child contexts + * + * @see org.apache.tuscany.core.context.CompositeContext + * @version $Rev$ $Date$ + */ +public class CompositeScopeContext extends AbstractLifecycle implements ScopeContext { + + private List<ContextFactory<Context>> configs = new ArrayList<ContextFactory<Context>>(); + + // Composite component contexts in this scope keyed by name + private Map<String, CompositeContext> contexts = new ConcurrentHashMap<String, CompositeContext>(); + + // indicates if a module start event has been previously propagated so child contexts added after can be notified + private boolean moduleScopeStarted; + + public CompositeScopeContext(EventContext eventContext) { + assert (eventContext != null) : "Event context was null"; + setName("Composite Scope"); + } + + public void start() throws ScopeInitializationException { + for (ContextFactory<Context> configuration : configs) { + Context context = configuration.createContext(); + if (!(context instanceof CompositeContext)) { + ScopeInitializationException e = new ScopeInitializationException("Context not an composite type"); + e.addContextName(context.getName()); + throw e; + } + CompositeContext compositeCtx = (CompositeContext) context; + compositeCtx.start(); + contexts.put(compositeCtx.getName(), compositeCtx); + } + lifecycleState = RUNNING; + } + + public void stop() throws ScopeRuntimeException { + for (CompositeContext context : contexts.values()) { + context.stop(); + } + } + + public void registerFactories(List<ContextFactory<Context>> configurations) { + this.configs = configurations; + } + + public void registerFactory(ContextFactory<Context> configuration) { + assert (configuration != null) : "Configuration was null"; + configs.add(configuration); + if (getLifecycleState() == RUNNING) { + Context context = configuration.createContext(); + if (!(context instanceof CompositeContext)) { + ScopeInitializationException e = new ScopeInitializationException("Context not an composite type"); + e.setIdentifier(context.getName()); + throw e; + } + CompositeContext compositeCtx = (CompositeContext) context; + compositeCtx.start(); + if (moduleScopeStarted) { + compositeCtx.publish(new ModuleStart(this)); + } + contexts.put(compositeCtx.getName(), compositeCtx); + } + } + + public boolean isCacheable() { + return false; + } + + public Object getInstance(QualifiedName qName) throws TargetException { + Context context = getContext(qName.getPartName()); + if (context == null) { + TargetException e = new TargetException("Component not found"); + e.setIdentifier(qName.getQualifiedName()); + throw e; + } + return context.getInstance(qName); + } + + public Context getContext(String ctxName) { + checkInit(); + return contexts.get(ctxName); + } + + public Context getContextByKey(String ctxName, Object key) { + return getContext(ctxName); + } + + public void removeContext(String ctxName) throws ScopeRuntimeException { + Context context = contexts.remove(ctxName); + if (context != null) { + context.stop(); + } + } + + public void removeContextByKey(String ctxName, Object key) throws ScopeRuntimeException { + throw new UnsupportedOperationException(); + } + + public void onEvent(Event event){ + if (event instanceof ModuleStart) { + // track module starting so that composite contexts registered after the event are notified properly + moduleScopeStarted = true; + } else if (event instanceof ModuleStop) { + moduleScopeStarted = false; + publish(event); + } + // propagate events to child contexts + for (CompositeContext context : contexts.values()) { + context.publish(event); + } + } + + private void checkInit() { + if (getLifecycleState()!= RUNNING) { + throw new IllegalStateException("Scope not running [" + getLifecycleState() + "]"); + } + } +} |