1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.math.util;
18
19 import java.io.Serializable;
20 import java.util.Collection;
21 import java.util.HashMap;
22 import java.util.Map;
23 import java.util.Set;
24
25 import org.apache.commons.math.MathException;
26
27
28
29
30
31
32
33
34 public class TransformerMap implements NumberTransformer, Serializable {
35
36
37 private static final long serialVersionUID = 4605318041528645258L;
38
39
40
41
42 private NumberTransformer defaultTransformer = null;
43
44
45
46
47 private Map<Class<?>, NumberTransformer> map = null;
48
49
50
51
52 public TransformerMap() {
53 map = new HashMap<Class<?>, NumberTransformer>();
54 defaultTransformer = new DefaultTransformer();
55 }
56
57
58
59
60
61
62 public boolean containsClass(Class<?> key) {
63 return map.containsKey(key);
64 }
65
66
67
68
69
70
71 public boolean containsTransformer(NumberTransformer value) {
72 return map.containsValue(value);
73 }
74
75
76
77
78
79
80
81 public NumberTransformer getTransformer(Class<?> key) {
82 return map.get(key);
83 }
84
85
86
87
88
89
90
91
92
93 public NumberTransformer putTransformer(Class<?> key, NumberTransformer transformer) {
94 return map.put(key, transformer);
95 }
96
97
98
99
100
101
102
103 public NumberTransformer removeTransformer(Class<?> key) {
104 return map.remove(key);
105 }
106
107
108
109
110 public void clear() {
111 map.clear();
112 }
113
114
115
116
117
118 public Set<Class<?>> classes() {
119 return map.keySet();
120 }
121
122
123
124
125
126
127 public Collection<NumberTransformer> transformers() {
128 return map.values();
129 }
130
131
132
133
134
135
136
137
138
139
140 public double transform(Object o) throws MathException {
141 double value = Double.NaN;
142
143 if (o instanceof Number || o instanceof String) {
144 value = defaultTransformer.transform(o);
145 } else {
146 NumberTransformer trans = getTransformer(o.getClass());
147 if (trans != null) {
148 value = trans.transform(o);
149 }
150 }
151
152 return value;
153 }
154
155
156 @Override
157 public boolean equals(Object other) {
158 if (this == other) {
159 return true;
160 }
161 if (other == null) {
162 return false;
163 }
164 try {
165 TransformerMap rhs = (TransformerMap) other;
166 if (! defaultTransformer.equals(rhs.defaultTransformer)) {
167 return false;
168 }
169 if (map.size() != rhs.map.size()) {
170 return false;
171 }
172 for (Map.Entry<Class<?>, NumberTransformer> entry : map.entrySet()) {
173 if (! entry.getValue().equals(rhs.map.get(entry.getKey()))) {
174 return false;
175 }
176 }
177 return true;
178 } catch (ClassCastException cce) {
179 return false;
180 }
181 }
182
183
184 @Override
185 public int hashCode() {
186 int hash = defaultTransformer.hashCode();
187 for (NumberTransformer t : map.values()) {
188 hash = hash * 31 + t.hashCode();
189 }
190 return hash;
191 }
192
193 }