X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=system%2Fgeneral%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fsystem%2Fcore%2FDefaultScope.java;fp=system%2Fgeneral%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fsystem%2Fcore%2FDefaultScope.java;h=8b0c88efe0e4b746a6d92dd5e9a49d1fe1446ddc;hb=a003b7d0db5305071271df0439f31adf9d1f426a;hp=0000000000000000000000000000000000000000;hpb=dea786c9d49228a37cb5fd5b4113b86d9f6cddbf;p=utils diff --git a/system/general/src/main/java/org/wamblee/system/core/DefaultScope.java b/system/general/src/main/java/org/wamblee/system/core/DefaultScope.java new file mode 100644 index 00000000..8b0c88ef --- /dev/null +++ b/system/general/src/main/java/org/wamblee/system/core/DefaultScope.java @@ -0,0 +1,109 @@ +/* + * Copyright 2008 the original author or authors. + * + * 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.wamblee.system.core; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +public class DefaultScope implements Scope { + + private List _parents; + private int _count; + private Map _properties; + private Map _runtimes; + private Map _provided; + private ProvidedInterface[] _externallyProvided; + + public DefaultScope(ProvidedInterface[] aExternallyProvided) { + this(aExternallyProvided, new ArrayList()); + } + + public DefaultScope(ProvidedInterface[] aExternallyProvided, Scope aParent) { + this(aExternallyProvided, Arrays.asList(new Scope[] { aParent })); + } + + public DefaultScope(ProvidedInterface[] aExternallyProvided, + List aParent) { + _parents = new ArrayList(aParent); + _count = 0; + _properties = new TreeMap(); + _runtimes = new TreeMap(); + _provided = new TreeMap(); + _externallyProvided = aExternallyProvided; + } + + @Override + public ProvidedInterface[] getProvidedInterfaces() { + return _externallyProvided; + } + + @Override + public Object get(String aKey) { + return _properties.get(aKey); + } + + @Override + public void put(String aKey, Object aValue) { + _properties.put(aKey, aValue); + } + + @Override + public void addRuntime(Component aComponent, Object aRuntime) { + _runtimes.put(aComponent.getQualifiedName(), aRuntime); + } + + @Override + public Object getRuntime(Component aComponent) { + return _runtimes.get(aComponent.getQualifiedName()); + } + + @Override + synchronized public void publishInterface(ProvidedInterface aInterface, + Object aImplementation) { + String id = "" + _count++; + _provided.put(id, new ProvidedInterfaceImplementation(aInterface, + aImplementation)); + aInterface.setUniqueId(id); + } + + @Override + public T retrieveInterfaceImplementation(ProvidedInterface aInterface, + Class aType) { + if ( aInterface == null ) { + return null; + } + String id = aInterface.getUniqueId(); + if ( id == null ) { + // optional interface that was not published. + return null; + } + ProvidedInterfaceImplementation provided = _provided.get(id); + if (provided == null) { + for (Scope parent : _parents) { + T impl = parent.retrieveInterfaceImplementation(aInterface, aType); + if ( impl != null ) { + return impl; + } + } + return null; + } else { + return provided.getImplementation(aType); + } + } +}