1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.collections4.multimap;
18
19 import java.util.Iterator;
20 import java.util.Map;
21
22 import org.apache.commons.collections4.CollectionUtils;
23 import org.apache.commons.collections4.FluentIterable;
24 import org.apache.commons.collections4.MultiValuedMap;
25 import org.apache.commons.collections4.Transformer;
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 public class TransformedMultiValuedMap<K, V> extends AbstractMultiValuedMapDecorator<K, V> {
44
45
46 private static final long serialVersionUID = 20150612L;
47
48
49 private final Transformer<? super K, ? extends K> keyTransformer;
50
51
52 private final Transformer<? super V, ? extends V> valueTransformer;
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 public static <K, V> TransformedMultiValuedMap<K, V> transformingMap(final MultiValuedMap<K, V> map,
70 final Transformer<? super K, ? extends K> keyTransformer,
71 final Transformer<? super V, ? extends V> valueTransformer) {
72 return new TransformedMultiValuedMap<>(map, keyTransformer, valueTransformer);
73 }
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91 public static <K, V> TransformedMultiValuedMap<K, V> transformedMap(final MultiValuedMap<K, V> map,
92 final Transformer<? super K, ? extends K> keyTransformer,
93 final Transformer<? super V, ? extends V> valueTransformer) {
94 final TransformedMultiValuedMap<K, V> decorated =
95 new TransformedMultiValuedMap<>(map, keyTransformer, valueTransformer);
96 if (!map.isEmpty()) {
97 final MultiValuedMap<K, V> mapCopy = new ArrayListValuedHashMap<>(map);
98 decorated.clear();
99 decorated.putAll(mapCopy);
100 }
101 return decorated;
102 }
103
104
105
106
107
108
109
110
111
112
113
114
115
116 protected TransformedMultiValuedMap(final MultiValuedMap<K, V> map,
117 final Transformer<? super K, ? extends K> keyTransformer,
118 final Transformer<? super V, ? extends V> valueTransformer) {
119 super(map);
120 this.keyTransformer = keyTransformer;
121 this.valueTransformer = valueTransformer;
122 }
123
124
125
126
127
128
129
130
131
132 protected K transformKey(final K object) {
133 if (keyTransformer == null) {
134 return object;
135 }
136 return keyTransformer.transform(object);
137 }
138
139
140
141
142
143
144
145
146
147 protected V transformValue(final V object) {
148 if (valueTransformer == null) {
149 return object;
150 }
151 return valueTransformer.transform(object);
152 }
153
154 @Override
155 public boolean put(final K key, final V value) {
156 return decorated().put(transformKey(key), transformValue(value));
157 }
158
159 @Override
160 public boolean putAll(final K key, final Iterable<? extends V> values) {
161 if (values == null) {
162 throw new NullPointerException("Values must not be null.");
163 }
164
165 final Iterable<V> transformedValues = FluentIterable.of(values).transform(valueTransformer);
166 final Iterator<? extends V> it = transformedValues.iterator();
167 return it.hasNext() && CollectionUtils.addAll(decorated().get(transformKey(key)), it);
168 }
169
170 @Override
171 public boolean putAll(final Map<? extends K, ? extends V> map) {
172 if (map == null) {
173 throw new NullPointerException("Map must not be null.");
174 }
175 boolean changed = false;
176 for (final Map.Entry<? extends K, ? extends V> entry : map.entrySet()) {
177 changed |= put(entry.getKey(), entry.getValue());
178 }
179 return changed;
180 }
181
182 @Override
183 public boolean putAll(final MultiValuedMap<? extends K, ? extends V> map) {
184 if (map == null) {
185 throw new NullPointerException("Map must not be null.");
186 }
187 boolean changed = false;
188 for (final Map.Entry<? extends K, ? extends V> entry : map.entries()) {
189 changed |= put(entry.getKey(), entry.getValue());
190 }
191 return changed;
192 }
193
194 }