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.defaults.DefaultPicoContainer; 014 import org.picocontainer.defaults.InstanceComponentAdapter; 015 016 import java.util.Collection; 017 import java.util.Collections; 018 import java.util.HashSet; 019 import java.util.Iterator; 020 import java.util.Map; 021 import java.util.Set; 022 023 024 public class PicoMap implements Map { 025 026 private final MutablePicoContainer mutablePicoContainer; 027 028 public PicoMap(MutablePicoContainer mutablePicoContainer) { 029 this.mutablePicoContainer = mutablePicoContainer; 030 } 031 032 public PicoMap() { 033 mutablePicoContainer = new DefaultPicoContainer(); 034 } 035 036 public int size() { 037 return mutablePicoContainer.getComponentAdapters().size(); 038 } 039 040 public boolean isEmpty() { 041 return mutablePicoContainer.getComponentAdapters().size() == 0; 042 } 043 044 public boolean containsKey(Object o) { 045 if (o instanceof Class) { 046 return mutablePicoContainer.getComponentInstanceOfType((Class)o) != null; 047 } else { 048 return mutablePicoContainer.getComponentInstance(o) != null; 049 } 050 } 051 052 public boolean containsValue(Object o) { 053 return false; 054 } 055 056 public Object get(Object o) { 057 if (o instanceof Class) { 058 return mutablePicoContainer.getComponentInstanceOfType((Class)o); 059 } else { 060 return mutablePicoContainer.getComponentInstance(o); 061 } 062 } 063 064 public Object put(Object o, Object o1) { 065 Object object = remove(o); 066 if (o1 instanceof Class) { 067 mutablePicoContainer.registerComponentImplementation(o, (Class)o1); 068 } else { 069 mutablePicoContainer.registerComponentInstance(o, o1); 070 } 071 return object; 072 } 073 074 public Object remove(Object o) { 075 ComponentAdapter adapter = mutablePicoContainer.unregisterComponent(o); 076 if (adapter != null) { 077 // if previously an instance was registered, return it, otherwise return the type 078 return adapter instanceof InstanceComponentAdapter ? adapter 079 .getComponentInstance(mutablePicoContainer) : adapter 080 .getComponentImplementation(); 081 } else { 082 return null; 083 } 084 } 085 086 public void putAll(Map map) { 087 for (final Iterator iter = map.entrySet().iterator(); iter.hasNext();) { 088 final Map.Entry entry = (Map.Entry)iter.next(); 089 put(entry.getKey(), entry.getValue()); 090 } 091 } 092 093 public void clear() { 094 Set adapters = keySet(); 095 for (final Iterator iter = adapters.iterator(); iter.hasNext();) { 096 mutablePicoContainer.unregisterComponent(iter.next()); 097 } 098 } 099 100 public Set keySet() { 101 Set set = new HashSet(); 102 Collection adapters = mutablePicoContainer.getComponentAdapters(); 103 for (final Iterator iter = adapters.iterator(); iter.hasNext();) { 104 final ComponentAdapter adapter = (ComponentAdapter)iter.next(); 105 set.add(adapter.getComponentKey()); 106 } 107 return Collections.unmodifiableSet(set); 108 } 109 110 public Collection values() { 111 return Collections.unmodifiableCollection(mutablePicoContainer.getComponentInstances()); 112 } 113 114 public Set entrySet() { 115 Set set = new HashSet(); 116 Collection adapters = mutablePicoContainer.getComponentAdapters(); 117 for (final Iterator iter = adapters.iterator(); iter.hasNext();) { 118 final Object key = ((ComponentAdapter)iter.next()).getComponentKey(); 119 final Object component = mutablePicoContainer.getComponentInstance(key); 120 set.add(new Map.Entry() { 121 public Object getKey() { 122 return key; 123 } 124 125 public Object getValue() { 126 return component; 127 } 128 129 public Object setValue(Object value) { 130 throw new UnsupportedOperationException("Cannot set component"); 131 } 132 }); 133 } 134 return Collections.unmodifiableSet(set); 135 } 136 }