/*
- * Copyright 2008 the original author or authors.
+ * Copyright 2005-2010 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.
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.TreeMap;
+/**
+ *
+ * @author $author$
+ * @version $Revision$
+ */
public class DefaultScope implements Scope {
+ private List<Scope> parents;
+
+ private Map<String, Object> properties;
+
+ private Map<String, Object> runtimes;
+
+ private Map<ProvidedInterface, ProvidedInterfaceImplementation> provided;
+
+ private List<ProvidedInterface> externallyProvided;
+
+ /**
+ * Creates a new DefaultScope object.
+ *
+ */
+ public DefaultScope(List<ProvidedInterface> aExternallyProvided) {
+ this(aExternallyProvided.toArray(new ProvidedInterface[0]));
+ }
+
+ /**
+ * Creates a new DefaultScope object.
+ *
+ */
+ public DefaultScope(ProvidedInterface[] aExternallyProvided) {
+ this(aExternallyProvided, new ArrayList<Scope>());
+ }
+
+ /**
+ * Creates a new DefaultScope object.
+ *
+ */
+ public DefaultScope(ProvidedInterface[] aExternallyProvided, Scope aParent) {
+ this(aExternallyProvided, Arrays.asList(new Scope[] { aParent }));
+ }
+
+ /**
+ * Creates a new DefaultScope object.
+ *
+ */
+ public DefaultScope(ProvidedInterface[] aExternallyProvided,
+ List<Scope> aParent) {
+ parents = new ArrayList<Scope>(aParent);
+ properties = new HashMap<String, Object>();
+ runtimes = new HashMap<String, Object>();
+ provided = new HashMap<ProvidedInterface, ProvidedInterfaceImplementation>();
+ externallyProvided = new ArrayList<ProvidedInterface>();
+ externallyProvided.addAll(Arrays.asList(aExternallyProvided));
+ }
+
+ @Override
+ public List<ProvidedInterface> getProvidedInterfaces() {
+ return Collections.unmodifiableList(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.getName(), aRuntime);
+ }
+
+ @Override
+ public Object getRuntime(Component aComponent) {
+ return runtimes.get(aComponent.getName());
+ }
+
+ @Override
+ public Object getRuntime(String aName) {
+ return runtimes.get(aName);
+ }
+
+ @Override
+ synchronized public void publishInterface(ProvidedInterface aInterface,
+ Object aImplementation) {
+ provided.put(aInterface, new ProvidedInterfaceImplementation(
+ aInterface, aImplementation));
+ }
+
+ @Override
+ public <T> T getInterfaceImplementation(ProvidedInterface aInterface,
+ Class<T> aType) {
+ if (aInterface == null) {
+ return null;
+ }
+
+ ProvidedInterfaceImplementation providedIntf = provided.get(aInterface);
+
+ if (providedIntf == null) {
+ for (Scope parent : parents) {
+ T impl = parent.getInterfaceImplementation(aInterface, aType);
+
+ if (impl != null) {
+ return impl;
+ }
+ }
- 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);
- }
- }
+ return null;
+ }
+ return providedIntf.getImplementation(aType);
+ }
}