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 }