Author: davidb Date: Thu Nov 16 22:17:13 2017 New Revision: 1815518 URL: http://svn.apache.org/viewvc?rev=1815518&view=rev Log: Fix an issue with the converter Map Delegate.
Modified: felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/MapDelegate.java felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java Modified: felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/MapDelegate.java URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/MapDelegate.java?rev=1815518&r1=1815517&r2=1815518&view=diff ============================================================================== --- felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/MapDelegate.java (original) +++ felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/MapDelegate.java Thu Nov 16 22:17:13 2017 @@ -70,41 +70,45 @@ class MapDelegate<K, V> implements Map<K return keys.size(); } + @Override public boolean isEmpty() { return delegate.isEmpty(); } + @Override public boolean containsKey(Object key) { - return delegate.containsKey(key); + return keySet().contains(key); } + @Override public boolean containsValue(Object value) { - return delegate.containsValue(value); + return values().contains(value); } + @Override @SuppressWarnings("unchecked") public V get(Object key) { V val = null; - if (keySet().contains(key)) { + if (internalKeySet().contains(key)) { val = delegate.get(key); } if (val == null) { - key = findConvertedKey(keySet(), key); + key = findConvertedKey(internalKeySet(), key); val = delegate.get(key); } if (val == null) return null; else - return (V) getConvertedValue(val); + return (V) getConvertedValue(val); } - private Object getConvertedKey(Object key) { - return convertingImpl.convertMapKey(key); - } + private Object getConvertedKey(Object key) { + return convertingImpl.convertMapKey(key); + } - private Object getConvertedValue(Object val) { + private Object getConvertedValue(Object val) { return convertingImpl.convertMapValue(val); } @@ -118,33 +122,32 @@ class MapDelegate<K, V> implements Map<K Object c = convertingImpl.converter.convert(k).to(key.getClass()); if (c != null && c.equals(key)) return k; - -// Maybe the other way around too? -// Object c2 = facade.convertingImpl.converter.convert(key).to(k.getClass()); -// if (c2 != null && c2.equals(key)) -// return c2; } return key; } + @Override public V put(K key, V value) { cloneDelegate(); return delegate.put(key, value); } + @Override public V remove(Object key) { cloneDelegate(); return delegate.remove(key); } - public void putAll(Map<? extends K, ? extends V> m) { + @Override + public void putAll(Map< ? extends K, ? extends V> m) { cloneDelegate(); delegate.putAll(m); } + @Override public void clear() { delegate = new HashMap<>(); } @@ -153,17 +156,17 @@ class MapDelegate<K, V> implements Map<K return delegate.keySet(); } + @SuppressWarnings("unchecked") + @Override public Set<K> keySet() { Set<K> keys = new HashSet<>(); - Set<K> internalKeys = internalKeySet(); - for (Object key : internalKeys) { - @SuppressWarnings("unchecked") - K k = (K) findConvertedKey(internalKeys, key); - keys.add(k); + for (Object key : internalKeySet()) { + keys.add((K) getConvertedKey(key)); } return keys; } + @Override public Collection<V> values() { List<V> values = new ArrayList<>(); for (Map.Entry<K,V> entry : entrySet()) { @@ -172,83 +175,28 @@ class MapDelegate<K, V> implements Map<K return values; } + @Override @SuppressWarnings("unchecked") public Set<java.util.Map.Entry<K, V>> entrySet() { Set<Map.Entry<K,V>> result = new HashSet<>(); for (Map.Entry<?,?> entry : delegate.entrySet()) { K key = (K) findConvertedKey(internalKeySet(), entry.getKey()); - V val = (V) getConvertedValue(entry.getValue()); + V val = (V) getConvertedValue(entry.getValue()); result.add(new MapEntry<K,V>(key, val)); } return result; } + @Override public boolean equals(Object o) { return delegate.equals(o); } + @Override public int hashCode() { return delegate.hashCode(); } - /* This doesn't work in Java 7, do we need to do anything? - public V getOrDefault(Object key, V defaultValue) { - return delegate.getOrDefault(key, defaultValue); - } - - public void forEach(BiConsumer<? super K, ? super V> action) { - delegate.forEach(action); - } - - public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) { - cloneDelegate(); - - delegate.replaceAll(function); - } - - public V putIfAbsent(K key, V value) { - cloneDelegate(); - - return delegate.putIfAbsent(key, value); - } - - public boolean remove(Object key, Object value) { - cloneDelegate(); - - return delegate.remove(key, value); - } - - public boolean replace(K key, V oldValue, V newValue) { - cloneDelegate(); - - return delegate.replace(key, oldValue, newValue); - } - - public V replace(K key, V value) { - cloneDelegate(); - - return delegate.replace(key, value); - } - - public V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) { - return delegate.computeIfAbsent(key, mappingFunction); - } - - public V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) { - return delegate.computeIfPresent(key, remappingFunction); - } - - public V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) { - return delegate.compute(key, remappingFunction); - } - - public V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) { - cloneDelegate(); - - return delegate.merge(key, value, remappingFunction); - } -*/ - private void cloneDelegate() { delegate = new HashMap<>(delegate); } Modified: felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java?rev=1815518&r1=1815517&r2=1815518&view=diff ============================================================================== --- felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java (original) +++ felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java Thu Nov 16 22:17:13 2017 @@ -898,6 +898,11 @@ public class ConverterTest { Map<Character, Character> m = converter.convert(dto).to(new TypeReference<Map<Character, Character>>() {}); assertEquals(1, m.size()); assertEquals('v', (char) m.get('k')); + + assertTrue(m.containsKey('k')); + assertFalse(m.containsKey("key1")); + assertTrue(m.containsValue('v')); + assertFalse(m.containsValue("value1")); } @Test