1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.ini4j;
17
18 import java.util.Map;
19 import java.util.SortedMap;
20 import java.util.TreeMap;
21
22 public class CommonMultiMap<K, V> extends BasicMultiMap<K, V> implements CommentedMap<K, V>
23 {
24 private static final long serialVersionUID = 3012579878005541746L;
25 private static final String SEPARATOR = ";#;";
26 private static final String FIRST_CATEGORY = "";
27 private static final String LAST_CATEGORY = "zzzzzzzzzzzzzzzzzzzzzz";
28 private static final String META_COMMENT = "comment";
29 private SortedMap<String, Object> _meta;
30
31 @Override public String getComment(Object key)
32 {
33 return (String) getMeta(META_COMMENT, key);
34 }
35
36 @Override public void clear()
37 {
38 super.clear();
39 if (_meta != null)
40 {
41 _meta.clear();
42 }
43 }
44
45 @SuppressWarnings("unchecked")
46 @Override public void putAll(Map<? extends K, ? extends V> map)
47 {
48 super.putAll(map);
49 if (map instanceof CommonMultiMap)
50 {
51 Map<String, String> meta = ((CommonMultiMap) map)._meta;
52
53 if (meta != null)
54 {
55 meta().putAll(meta);
56 }
57 }
58 }
59
60 @Override public String putComment(K key, String comment)
61 {
62 return (String) putMeta(META_COMMENT, key, comment);
63 }
64
65 @Override public V remove(Object key)
66 {
67 V ret = super.remove(key);
68
69 removeMeta(key);
70
71 return ret;
72 }
73
74 @Override public V remove(Object key, int index)
75 {
76 V ret = super.remove(key, index);
77
78 if (length(key) == 0)
79 {
80 removeMeta(key);
81 }
82
83 return ret;
84 }
85
86 @Override public String removeComment(Object key)
87 {
88 return (String) removeMeta(META_COMMENT, key);
89 }
90
91 Object getMeta(String category, Object key)
92 {
93 return (_meta == null) ? null : _meta.get(makeKey(category, key));
94 }
95
96 Object putMeta(String category, K key, Object value)
97 {
98 return meta().put(makeKey(category, key), value);
99 }
100
101 void removeMeta(Object key)
102 {
103 if (_meta != null)
104 {
105 _meta.subMap(makeKey(FIRST_CATEGORY, key), makeKey(LAST_CATEGORY, key)).clear();
106 }
107 }
108
109 Object removeMeta(String category, Object key)
110 {
111 return (_meta == null) ? null : _meta.remove(makeKey(category, key));
112 }
113
114 private String makeKey(String category, Object key)
115 {
116 StringBuilder buff = new StringBuilder();
117
118 buff.append(String.valueOf(key));
119 buff.append(SEPARATOR);
120 buff.append(category);
121
122 return buff.toString();
123 }
124
125 private Map<String, Object> meta()
126 {
127 if (_meta == null)
128 {
129 _meta = new TreeMap<String, Object>();
130 }
131
132 return _meta;
133 }
134 }