Mercurial Hosting > luan
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 } |