From a003b7d0db5305071271df0439f31adf9d1f426a Mon Sep 17 00:00:00 2001 From: Erik Brakkee Date: Sat, 12 Apr 2008 20:20:31 +0000 Subject: [PATCH] --- .../org/wamblee/system/core/DefaultScope.java | 109 ++++++++++++++++++ .../core/ProvidedInterfaceImplementation.java | 53 +++++++++ .../java/org/wamblee/system/core/Scope.java | 77 +++++++++++++ 3 files changed, 239 insertions(+) create mode 100644 system/general/src/main/java/org/wamblee/system/core/DefaultScope.java create mode 100644 system/general/src/main/java/org/wamblee/system/core/ProvidedInterfaceImplementation.java create mode 100644 system/general/src/main/java/org/wamblee/system/core/Scope.java 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); + } + } +} diff --git a/system/general/src/main/java/org/wamblee/system/core/ProvidedInterfaceImplementation.java b/system/general/src/main/java/org/wamblee/system/core/ProvidedInterfaceImplementation.java new file mode 100644 index 00000000..abeb70d5 --- /dev/null +++ b/system/general/src/main/java/org/wamblee/system/core/ProvidedInterfaceImplementation.java @@ -0,0 +1,53 @@ +/* + * 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; + +/** + * Represents a provided interface together with its implementation. + * + * @author Erik Brakkee + */ +class ProvidedInterfaceImplementation { + + private ProvidedInterface _provided; + private Object _implementation; + + /** + * Constructs the object. + * @param aProvided Provided interface. + * @param aImplementation Implementation. + */ + public ProvidedInterfaceImplementation(ProvidedInterface aProvided, Object aImplementation) { + _provided = aProvided; + _implementation = aImplementation; + } + + /** + * @return The provided interface. + */ + public ProvidedInterface getProvided() { + return _provided; + } + + /** + * @param Expected type of the implementation. + * @param aType Type of the implementation. + * @return Implementation. + */ + public T getImplementation(Class aType) { + return (T)_implementation; + } +} diff --git a/system/general/src/main/java/org/wamblee/system/core/Scope.java b/system/general/src/main/java/org/wamblee/system/core/Scope.java new file mode 100644 index 00000000..829435f6 --- /dev/null +++ b/system/general/src/main/java/org/wamblee/system/core/Scope.java @@ -0,0 +1,77 @@ +/* + * 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; + +/** + * A scope represents a set of running services and the runtime information for the + * started components and is (usually) the result of + * starting a container. + * + * @author Erik Brakkee + */ +public interface Scope { + + /** + * Gets the provided interfaces by this scope. + * @return Provided interfaces. + */ + ProvidedInterface[] getProvidedInterfaces(); + + /** + * Adds a key value pair to the scope. + * @param aKey Key + * @param aValue Value. + */ + void put(String aKey, Object aValue); + + /** + * Retrieves a value for the key. + * @param aKey Key. + * @return Value. + */ + Object get(String aKey); + + /** + * Adds the runtime of a started component. + * @param aComponent Component. + * @param aRuntime Runtime. + */ + void addRuntime(Component aComponent, Object aRuntime); + + /** + * Publishes an implementation of a provided interface. + * @param aComponent Component that provides the interface. + * @param aInterface Interface that is provided. + * @param aImplementation Implementation of the interface. + * @return Returns a unique id of the published interface. + */ + void publishInterface(ProvidedInterface aInterface, Object aImplementation); + + /** + * Retrieves an implementation of a provided interface. + * @param aProvided Provided interface. If it is null then null is returned. + * @param aType Type of implementation that is expected. + * @return Retrieved interface. + */ + T retrieveInterfaceImplementation(ProvidedInterface aProvided, Class aType ); + + /** + * Gets the runtime for a component. + * @param aComponent Component for which we want to get the runtime. + * @return Runtime. + */ + Object getRuntime(Component aComponent); +} -- 2.31.1