1 package org.apache.torque.om;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.sql.Types;
23 import java.util.ArrayList;
24 import java.util.List;
25
26 import org.apache.commons.lang.ObjectUtils;
27
28
29
30
31
32
33
34
35
36
37
38 public class ComboKey extends ObjectKey
39 {
40
41
42
43 private static final long serialVersionUID = -264927663211141894L;
44
45
46
47
48 public static final char SEPARATOR = ':';
49
50
51 public static final String SEPARATOR_STRING = ":";
52
53
54 private SimpleKey[] key;
55
56
57
58
59
60 public ComboKey()
61 {
62
63 }
64
65
66
67
68
69
70
71 public ComboKey(SimpleKey[] keys)
72 {
73 setValue(keys);
74 }
75
76
77
78
79
80
81
82 public ComboKey(String keys)
83 {
84 setValue(keys);
85 }
86
87
88
89
90
91
92 public void setValue(SimpleKey[] keys)
93 {
94 this.key = keys;
95 }
96
97
98
99
100
101
102
103 public void setValue(String keys)
104 {
105 int startPtr = 0;
106 int indexOfSep = keys.indexOf(SEPARATOR);
107 List<SimpleKey> tmpKeys = new ArrayList<SimpleKey>();
108 while (indexOfSep != -1)
109 {
110 if (indexOfSep == startPtr)
111 {
112 tmpKeys.add(null);
113 }
114 else
115 {
116 char keyType = keys.charAt(startPtr);
117 String keyString = keys.substring(startPtr + 1, indexOfSep);
118
119 SimpleKey newKey = null;
120 switch(keyType)
121 {
122 case 'N':
123 newKey = new NumberKey(keyString);
124 break;
125 case 'S':
126 newKey = new StringKey(keyString);
127 break;
128 case 'D':
129 try
130 {
131 newKey = new DateKey(keyString);
132 }
133 catch (NumberFormatException nfe)
134 {
135 newKey = new DateKey();
136 }
137 break;
138 default:
139
140 }
141 tmpKeys.add(newKey);
142 }
143 startPtr = indexOfSep + 1;
144 indexOfSep = keys.indexOf(SEPARATOR, startPtr);
145 }
146
147 this.key = new SimpleKey[tmpKeys.size()];
148 for (int i = 0; i < this.key.length; i++)
149 {
150 this.key[i] = tmpKeys.get(i);
151 }
152 }
153
154
155
156
157
158
159 public void setValue(ComboKey keys)
160 {
161 setValue((SimpleKey[]) keys.getValue());
162 }
163
164
165
166
167
168
169 public Object getValue()
170 {
171 return key;
172 }
173
174
175
176
177
178
179
180 public int getJdbcType()
181 {
182 return Types.ARRAY;
183 }
184
185
186
187
188
189
190
191
192 public boolean equals(Object keyObj)
193 {
194 boolean isEqual = false;
195
196 if (key != null)
197 {
198
199 isEqual = true;
200 SimpleKey[] keys = key;
201 for (int i = 0; i < keys.length && isEqual; i++)
202 {
203 isEqual &= keys[i] != null && keys[i].getValue() != null;
204 }
205
206 isEqual &= looseEquals(keyObj);
207 }
208
209 return isEqual;
210 }
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230 public boolean looseEquals(Object keyObj)
231 {
232 boolean isEqual = false;
233
234 if (key != null)
235 {
236
237
238
239
240 if (keyObj instanceof String)
241 {
242 isEqual = toString().equals(keyObj);
243 }
244
245
246 else if (keyObj instanceof ComboKey)
247 {
248 SimpleKey[] obj = (SimpleKey[])
249 ((ComboKey) keyObj).getValue();
250
251 SimpleKey[] keys1 = key;
252 SimpleKey[] keys2 = obj;
253 isEqual = keys1.length == keys2.length;
254 for (int i = 0; i < keys1.length && isEqual; i++)
255 {
256 isEqual &= ObjectUtils.equals(keys1[i], keys2[i]);
257 }
258 }
259 else if (keyObj instanceof SimpleKey[])
260 {
261 SimpleKey[] keys1 = key;
262 SimpleKey[] keys2 = (SimpleKey[]) keyObj;
263 isEqual = keys1.length == keys2.length;
264 for (int i = 0; i < keys1.length && isEqual; i++)
265 {
266 isEqual &= ObjectUtils.equals(keys1[i], keys2[i]);
267 }
268 }
269 }
270 return isEqual;
271 }
272
273
274
275
276
277
278 public void appendTo(StringBuffer sb)
279 {
280 if (key != null)
281 {
282 SimpleKey[] keys = key;
283 for (int i = 0; i < keys.length; i++)
284 {
285 if (keys[i] != null)
286 {
287 if (keys[i] instanceof StringKey)
288 {
289 sb.append("S");
290 }
291 else if (keys[i] instanceof NumberKey)
292 {
293 sb.append("N");
294 }
295 else if (keys[i] instanceof DateKey)
296 {
297 sb.append("D");
298 }
299 else
300 {
301
302 sb.append("U");
303 }
304 keys[i].appendTo(sb);
305 }
306
307 sb.append(SEPARATOR);
308 }
309 }
310 }
311
312
313
314
315
316
317
318
319 public int hashCode()
320 {
321 if (key == null)
322 {
323 return super.hashCode();
324 }
325
326 SimpleKey sk = key[0];
327 if (sk == null)
328 {
329 return super.hashCode();
330 }
331
332 return sk.hashCode();
333 }
334
335
336
337
338
339
340
341
342
343
344
345 public String toString()
346 {
347 StringBuffer sbuf = new StringBuffer();
348 appendTo(sbuf);
349 return sbuf.toString();
350 }
351 }