(no commit message)
authorErik Brakkee <erik@brakkee.org>
Sat, 12 Apr 2008 20:20:31 +0000 (20:20 +0000)
committerErik Brakkee <erik@brakkee.org>
Sat, 12 Apr 2008 20:20:31 +0000 (20:20 +0000)
system/general/src/main/java/org/wamblee/system/core/DefaultScope.java [new file with mode: 0644]
system/general/src/main/java/org/wamblee/system/core/ProvidedInterfaceImplementation.java [new file with mode: 0644]
system/general/src/main/java/org/wamblee/system/core/Scope.java [new file with mode: 0644]

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 (file)
index 0000000..8b0c88e
--- /dev/null
@@ -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<Scope> _parents;
+       private int _count;
+       private Map<String, Object> _properties;
+       private Map<String, Object> _runtimes;
+       private Map<String, ProvidedInterfaceImplementation> _provided;
+       private ProvidedInterface[] _externallyProvided;
+
+       public DefaultScope(ProvidedInterface[] aExternallyProvided) {
+               this(aExternallyProvided, new ArrayList<Scope>());
+       }
+
+       public DefaultScope(ProvidedInterface[] aExternallyProvided, Scope aParent) {
+               this(aExternallyProvided, Arrays.asList(new Scope[] { aParent }));
+       }
+
+       public DefaultScope(ProvidedInterface[] aExternallyProvided,
+                       List<Scope> aParent) {
+               _parents = new ArrayList<Scope>(aParent);
+               _count = 0;
+               _properties = new TreeMap<String, Object>();
+               _runtimes = new TreeMap<String, Object>();
+               _provided = new TreeMap<String, ProvidedInterfaceImplementation>();
+               _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> T retrieveInterfaceImplementation(ProvidedInterface aInterface,
+                       Class<T> 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 (file)
index 0000000..abeb70d
--- /dev/null
@@ -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 <T> Expected type of the implementation. 
+        * @param aType Type of the implementation. 
+        * @return Implementation. 
+        */
+       public <T> T getImplementation(Class<T> 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 (file)
index 0000000..829435f
--- /dev/null
@@ -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> T retrieveInterfaceImplementation(ProvidedInterface aProvided, Class<T> aType );
+
+       /**
+        * Gets the runtime for a component.  
+        * @param aComponent Component for which we want to get the runtime.  
+        * @return Runtime.  
+        */
+       Object getRuntime(Component aComponent); 
+}