comparison src/goodjava/util/CaseInsensitiveMap.java @ 1607:fa066aaa068c

nginx caching
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 30 Apr 2021 20:23:28 -0600
parents
children
comparison
equal deleted inserted replaced
1606:7c7f28c724e8 1607:fa066aaa068c
1 package goodjava.util;
2
3 import java.util.Map;
4 import java.util.AbstractMap;
5 import java.util.Set;
6 import java.util.AbstractSet;
7 import java.util.Iterator;
8
9
10 public final class CaseInsensitiveMap<V> extends AbstractMap<String,V> {
11
12 public static final class Value<V> {
13 private final String s;
14 private final V v;
15
16 private Value(String s,V v) {
17 this.s = s;
18 this.v = v;
19 }
20 }
21
22 private final Map<String,Value<V>> map;
23
24 public CaseInsensitiveMap(Map<String,Value<V>> map) {
25 this.map = map;
26 }
27
28 @Override public int size() {
29 return map.size();
30 }
31
32 @Override public boolean isEmpty() {
33 return map.isEmpty();
34 }
35
36 @Override public boolean containsKey(Object key) {
37 if( !(key instanceof String) )
38 return false;
39 String s = (String)key;
40 return map.containsKey(s.toLowerCase());
41 }
42
43 @Override public V get(Object key) {
44 if( !(key instanceof String) )
45 return null;
46 String s = (String)key;
47 Value<V> val = map.get(s.toLowerCase());
48 return val==null ? null : val.v;
49 }
50
51 @Override public V put(String key,V value) {
52 Value<V> val = map.put( key.toLowerCase(), new Value<V>(key,value) );
53 return val==null ? null : val.v;
54 }
55
56 @Override public V remove(Object key) {
57 if( !(key instanceof String) )
58 return null;
59 String s = (String)key;
60 Value<V> val = map.remove(s.toLowerCase());
61 return val==null ? null : val.v;
62 }
63
64 @Override public void clear() {
65 map.clear();
66 }
67
68 @Override public Set<Map.Entry<String,V>> entrySet() {
69 return new MySet();
70 }
71
72 private class MySet extends AbstractSet<Map.Entry<String,V>> {
73
74 @Override public int size() {
75 return CaseInsensitiveMap.this.size();
76 }
77
78 @Override public Iterator<Map.Entry<String,V>> iterator() {
79 return new MyIterator();
80 }
81 }
82
83 private class MyIterator implements Iterator<Map.Entry<String,V>> {
84 final Iterator<Map.Entry<String,Value<V>>> iter = map.entrySet().iterator();
85
86 @Override public Map.Entry<String,V> next() {
87 Value<V> val = iter.next().getValue();
88 return new AbstractMap.SimpleImmutableEntry<String,V>( val.s, val.v );
89 }
90
91 @Override public boolean hasNext() {
92 return iter.hasNext();
93 }
94
95 @Override public void remove() {
96 iter.remove();
97 }
98 }
99 }