001 /*****************************************************************************
002 * Copyright (c) PicoContainer Organization. All rights reserved. *
003 * ------------------------------------------------------------------------- *
004 * The software in this package is published under the terms of the BSD *
005 * style license a copy of which has been included with this distribution in *
006 * the LICENSE.txt file. *
007 * *
008 *****************************************************************************/
009 package org.picocontainer.gems.util;
010
011 import org.picocontainer.ComponentAdapter;
012 import org.picocontainer.MutablePicoContainer;
013 import org.picocontainer.adapters.InstanceAdapter;
014 import org.picocontainer.DefaultPicoContainer;
015
016 import java.util.Collection;
017 import java.util.Collections;
018 import java.util.HashSet;
019 import java.util.Map;
020 import java.util.Set;
021
022
023 public class PicoMap implements Map {
024
025 private final MutablePicoContainer mutablePicoContainer;
026
027 public PicoMap(final MutablePicoContainer mutablePicoContainer) {
028 this.mutablePicoContainer = mutablePicoContainer;
029 }
030
031 public PicoMap() {
032 mutablePicoContainer = new DefaultPicoContainer();
033 }
034
035 public int size() {
036 return mutablePicoContainer.getComponentAdapters().size();
037 }
038
039 public boolean isEmpty() {
040 return mutablePicoContainer.getComponentAdapters().size() == 0;
041 }
042
043 public boolean containsKey(final Object o) {
044 if (o instanceof Class) {
045 return mutablePicoContainer.getComponent((Class<?>)o) != null;
046 } else {
047 return mutablePicoContainer.getComponent(o) != null;
048 }
049 }
050
051 public boolean containsValue(final Object o) {
052 return false;
053 }
054
055 public Object get(final Object o) {
056 if (o instanceof Class) {
057 return mutablePicoContainer.getComponent((Class<?>)o);
058 } else {
059 return mutablePicoContainer.getComponent(o);
060 }
061 }
062
063 public Object put(final Object o, final Object o1) {
064 Object object = remove(o);
065 mutablePicoContainer.addComponent(o, o1);
066 return object;
067 }
068
069 public Object remove(final Object o) {
070 ComponentAdapter adapter = mutablePicoContainer.removeComponent(o);
071 if (adapter != null) {
072 // if previously an instance was registered, return it, otherwise return the type
073 return adapter instanceof InstanceAdapter ? adapter
074 .getComponentInstance(mutablePicoContainer, ComponentAdapter.NOTHING.class) : adapter
075 .getComponentImplementation();
076 } else {
077 return null;
078 }
079 }
080
081 public void putAll(final Map map) {
082 for (Object o : map.entrySet()) {
083 final Entry entry = (Entry) o;
084 put(entry.getKey(), entry.getValue());
085 }
086 }
087
088 public void clear() {
089 Set adapters = keySet();
090 for (Object adapter : adapters) {
091 mutablePicoContainer.removeComponent(adapter);
092 }
093 }
094
095 public Set keySet() {
096 Set<Object> set = new HashSet<Object>();
097 Collection<ComponentAdapter<?>> adapters = mutablePicoContainer.getComponentAdapters();
098 for (final ComponentAdapter<?> adapter : adapters) {
099 set.add(adapter.getComponentKey());
100 }
101 return Collections.unmodifiableSet(set);
102 }
103
104 @SuppressWarnings({ "unchecked" })
105 public Collection values() {
106 return Collections.unmodifiableCollection(mutablePicoContainer.getComponents());
107 }
108
109 public Set entrySet() {
110 Set<Entry> set = new HashSet<Entry>();
111 Collection<ComponentAdapter<?>> adapters = mutablePicoContainer.getComponentAdapters();
112 for (ComponentAdapter<?> adapter : adapters) {
113 final Object key = adapter.getComponentKey();
114 final Object component = mutablePicoContainer.getComponent(key);
115 set.add(new Entry() {
116 public Object getKey() {
117 return key;
118 }
119
120 public Object getValue() {
121 return component;
122 }
123
124 public Object setValue(final Object value) {
125 throw new UnsupportedOperationException("Cannot set addComponent");
126 }
127 });
128 }
129 return Collections.unmodifiableSet(set);
130 }
131 }