]> review.fuel-infra Code Review - packages/trusty/mysql-wsrep-5.6.git/blob
eb6f58206b442f4372d89c8e39c4435399df896c
[packages/trusty/mysql-wsrep-5.6.git] /
1 /*
2    Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
3
4    This program is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; version 2 of the License.
7
8    This program is distributed in the hope that it will be useful,
9    but WITHOUT ANY WARRANTY; without even the implied warranty of
10    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11    GNU General Public License for more details.
12
13    You should have received a copy of the GNU General Public License
14    along with this program; if not, write to the Free Software
15    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
16 */
17
18 package com.mysql.clusterj.core.metadata;
19
20 import com.mysql.clusterj.core.spi.ValueHandler;
21 import com.mysql.clusterj.core.spi.DomainTypeHandler;
22 import com.mysql.clusterj.ClusterJUserException;
23 import com.mysql.clusterj.ColumnMetadata;
24 import com.mysql.clusterj.DynamicObjectDelegate;
25
26 import com.mysql.clusterj.core.CacheManager;
27 import com.mysql.clusterj.core.StateManager;
28 import com.mysql.clusterj.core.StoreManager;
29
30 import com.mysql.clusterj.core.util.I18NHelper;
31 import com.mysql.clusterj.core.util.Logger;
32 import com.mysql.clusterj.core.util.LoggerFactoryService;
33
34 import java.lang.reflect.InvocationHandler;
35 import java.lang.reflect.Method;
36
37 import java.math.BigDecimal;
38 import java.math.BigInteger;
39
40 import java.sql.Date;
41 import java.sql.Time;
42 import java.sql.Timestamp;
43 import java.util.BitSet;
44 import java.util.HashMap;
45 import java.util.Map;
46
47 public class InvocationHandlerImpl<T> implements InvocationHandler,
48         StateManager, ValueHandler, DynamicObjectDelegate {
49
50     /** My message translator */
51     static final I18NHelper local = I18NHelper.getInstance(InvocationHandlerImpl.class);
52
53     /** My logger */
54     static final Logger logger = LoggerFactoryService.getFactory().getInstance(InvocationHandlerImpl.class);
55
56     /** The properties of the instance. */
57     protected Object[] properties;
58
59     /** The number of fields */
60     protected int numberOfFields;
61
62     /** The types of the properties. */
63     protected Map<String, Class<?>> typemap = new HashMap<String, Class<?>>();
64
65     /** The DomainTypeHandlerImpl for this class. */
66     protected DomainTypeHandlerImpl<T> domainTypeHandler;
67
68     /** The modifiedFields bit for each field. */
69     BitSet modifiedFields;
70
71     /** Has this object been modified? */
72     boolean modified = false;
73
74     /** The proxy object this handler handles. */
75     private Object proxy;
76
77     /** The cache manager for object modification notifications. */
78     private CacheManager objectManager;
79
80     /** Has this object been found in the database? */
81     private Boolean found = null;
82
83     public InvocationHandlerImpl(DomainTypeHandlerImpl<T> domainTypeHandler) {
84         this.domainTypeHandler = domainTypeHandler;
85         numberOfFields = domainTypeHandler.getNumberOfFields();
86         properties = new Object[numberOfFields];
87         modifiedFields = new BitSet(numberOfFields);
88         domainTypeHandler.initializeNotPersistentFields(this);
89     }
90
91     public void setProxy(Object proxy) {
92         this.proxy = proxy;
93     }
94
95     public Object getProxy() {
96         return proxy;
97     }
98
99     public void setCacheManager(CacheManager manager) {
100         objectManager = manager;
101         resetModified();
102     }
103
104     public Object invoke(Object proxy, Method method, Object[] args)
105             throws Throwable {
106         String methodName = method.getName();
107         if (logger.isDetailEnabled()) logger.detail("invoke with Method: " + method.getName());
108         
109         String propertyHead = methodName.substring(3,4);
110         String propertyTail = methodName.substring(4);
111         String propertyName = propertyHead.toLowerCase() + propertyTail;
112         int fieldNumber;
113         if (methodName.startsWith("get")) {
114             if (logger.isDetailEnabled()) logger.detail("Property name: " + propertyName);
115             // get the field number from the name
116             fieldNumber = domainTypeHandler.getFieldNumber(propertyName);
117             if (logger.isDetailEnabled()) logger.detail(methodName + ": Returning field number " + fieldNumber
118                 + " value: " + properties[fieldNumber]);
119             return properties[fieldNumber];
120         } else if (methodName.startsWith("set")) {
121             if (logger.isDetailEnabled()) logger.detail("Property name: " + propertyName);
122             // get the field number from the name
123             fieldNumber = domainTypeHandler.getFieldNumber(propertyName);
124             // mark the field as modified
125             if (!modified && objectManager != null) {
126                 modified = true;
127                 objectManager.markModified(this);
128                 if (logger.isDetailEnabled()) logger.detail("modifying " + this);
129             }
130             modifiedFields.set(fieldNumber);
131             properties[fieldNumber] = args[0];
132         } else if ("toString".equals(methodName)) {
133             return(domainTypeHandler.getDomainClass().getName()
134                     + pkToString(domainTypeHandler));
135         } else if ("hashCode".equals(methodName)) {
136             return(this.hashCode());
137         } else {
138             throw new ClusterJUserException(
139                     local.message("ERR_Method_Name", methodName));
140         }
141         return null;
142     }
143
144     public void markModified(int fieldNumber) {
145         modifiedFields.set(fieldNumber);
146     }
147
148     public String pkToString(DomainTypeHandler<?> domainTypeHandler) {
149         StringBuffer sb = new StringBuffer(" key: [");
150         int[] keys = domainTypeHandler.getKeyFieldNumbers();
151         String separator = "";
152         for (int i: keys) {
153             sb.append(separator);
154             sb.append(properties[i]);
155             separator = ";";
156         }
157         sb.append("]");
158         return sb.toString();
159     }
160
161     /** Reset the modified flags
162      *
163      */
164     public void resetModified() {
165         modified = false;
166         modifiedFields.clear();
167     }
168
169     public boolean isNull(int fieldNumber) {
170         return properties[fieldNumber] == null;
171     }
172
173     public BigInteger bigIntegerValue(int fieldNumber) {
174         return (BigInteger) properties[fieldNumber];
175     }
176
177     public boolean booleanValue(int fieldNumber) {
178         return (Boolean) properties[fieldNumber];
179     }
180
181     public boolean[] booleansValue(int fieldNumber) {
182         return (boolean[]) properties[fieldNumber];
183     }
184
185     public byte[] bytesValue(int fieldNumber) {
186         return (byte[]) properties[fieldNumber];
187     }
188
189     public byte byteValue(int fieldNumber) {
190         return (Byte) properties[fieldNumber];
191     }
192
193     public Byte objectByteValue(int fieldNumber) {
194         return (Byte) properties[fieldNumber];
195     }
196
197     public java.util.Date javaUtilDateValue(int fieldNumber) {
198         return (java.util.Date) properties[fieldNumber];
199     }
200
201     public java.sql.Date javaSqlDateValue(int fieldNumber) {
202         return (java.sql.Date) properties[fieldNumber];
203     }
204
205     public java.sql.Time javaSqlTimeValue(int fieldNumber) {
206         return (java.sql.Time) properties[fieldNumber];
207     }
208
209     public java.sql.Timestamp javaSqlTimestampValue(int fieldNumber) {
210         return (java.sql.Timestamp) properties[fieldNumber];
211     }
212
213     public BigDecimal decimalValue(int fieldNumber) {
214         return (BigDecimal) properties[fieldNumber];
215     }
216
217     public double doubleValue(int fieldNumber) {
218         return (Double) properties[fieldNumber];
219     }
220
221     public float floatValue(int fieldNumber) {
222         return (Float) properties[fieldNumber];
223     }
224
225     public int intValue(int fieldNumber) {
226         if (logger.isDetailEnabled()) logger.detail("intValue: Returning field number " + fieldNumber
227                 + " value: " + properties[fieldNumber]);
228         return (Integer) properties[fieldNumber];
229     }
230
231     public Integer objectIntValue(int fieldNumber) {
232         return (Integer) properties[fieldNumber];
233     }
234
235     public long longValue(int fieldNumber) {
236         return (Long) properties[fieldNumber];
237     }
238
239     public short shortValue(int fieldNumber) {
240         return (Short) properties[fieldNumber];
241     }
242
243     public String stringValue(int fieldNumber) {
244         if (logger.isDetailEnabled()) logger.detail("stringValue: Returning field number " + fieldNumber
245                 + " value: " + properties[fieldNumber]);
246         return (String) properties[fieldNumber];
247     }
248
249     public void setValue(int fieldNumber, Object value) {
250         if (logger.isDetailEnabled()) logger.detail("setValue: Setting field number " + fieldNumber
251                 + " to value " + value);
252         properties[fieldNumber] = value;
253     }
254
255     public void flush(StoreManager stm) {
256         // ignore flush until deferred updates are supported
257     }
258
259     public boolean isModified(int fieldNumber) {
260         return modifiedFields.get(fieldNumber);
261     }
262
263     public BigInteger getBigInteger(int fieldNumber) {
264         return bigIntegerValue(fieldNumber);
265     }
266
267     public boolean getBoolean(int fieldNumber) {
268         return booleanValue(fieldNumber);
269     }
270
271     public boolean[] getBooleans(int fieldNumber) {
272         return booleansValue(fieldNumber);
273     }
274
275     public Boolean getObjectBoolean(int fieldNumber) {
276         return booleanValue(fieldNumber);
277     }
278
279     public byte getByte(int fieldNumber) {
280         return byteValue(fieldNumber);
281     }
282
283     public byte[] getBytes(int fieldNumber) {
284         return bytesValue(fieldNumber);
285     }
286
287     public short getShort(int fieldNumber) {
288         return shortValue(fieldNumber);
289     }
290
291     public int getInt(int fieldNumber) {
292         return intValue(fieldNumber);
293     }
294
295     public long getLong(int fieldNumber) {
296         return longValue(fieldNumber);
297     }
298
299     public float getFloat(int fieldNumber) {
300         return floatValue(fieldNumber);
301     }
302
303     public double getDouble(int fieldNumber) {
304         return doubleValue(fieldNumber);
305     }
306
307     public Byte getObjectByte(int fieldNumber) {
308         return (Byte)properties[fieldNumber];
309     }
310
311     public Short getObjectShort(int fieldNumber) {
312         return (Short)properties[fieldNumber];
313     }
314
315     public Integer getObjectInt(int fieldNumber) {
316        return (Integer)properties[fieldNumber];
317     }
318
319     public Long getObjectLong(int fieldNumber) {
320         return (Long)properties[fieldNumber];
321     }
322
323     public Float getObjectFloat(int fieldNumber) {
324         return (Float)properties[fieldNumber];
325     }
326
327     public Double getObjectDouble(int fieldNumber) {
328         return (Double)properties[fieldNumber];
329     }
330
331     public BigDecimal getBigDecimal(int fieldNumber) {
332         return (BigDecimal)properties[fieldNumber];
333     }
334
335     public String getString(int fieldNumber) {
336         return (String)properties[fieldNumber];
337     }
338
339     public Date getJavaSqlDate(int fieldNumber) {
340         return (java.sql.Date)properties[fieldNumber];
341     }
342
343     public java.util.Date getJavaUtilDate(int fieldNumber) {
344         return (java.util.Date)properties[fieldNumber];
345     }
346
347     public Time getJavaSqlTime(int fieldNumber) {
348         return (java.sql.Time)properties[fieldNumber];
349     }
350
351     public Timestamp getJavaSqlTimestamp(int fieldNumber) {
352         return (java.sql.Timestamp)properties[fieldNumber];
353     }
354
355     public void setBigInteger(int fieldNumber, BigInteger value) {
356         properties[fieldNumber] = value;
357     }
358
359     public void setBoolean(int fieldNumber, boolean b) {
360         properties[fieldNumber] = b;
361     }
362
363     public void setBooleans(int fieldNumber, boolean[] b) {
364         properties[fieldNumber] = b;
365     }
366
367     public void setByte(int fieldNumber, byte value) {
368         properties[fieldNumber] = value;
369     }
370
371     public void setBytes(int fieldNumber, byte[] value) {
372         properties[fieldNumber] = value;
373     }
374
375     public void setShort(int fieldNumber, short value) {
376         properties[fieldNumber] = value;
377     }
378
379     public void setInt(int fieldNumber, int value) {
380         properties[fieldNumber] = value;
381     }
382
383     public void setLong(int fieldNumber, long value) {
384         properties[fieldNumber] = value;
385     }
386
387     public void setFloat(int fieldNumber, float value) {
388         properties[fieldNumber] = value;
389     }
390
391     public void setDouble(int fieldNumber, double value) {
392         properties[fieldNumber] = value;
393     }
394
395     public void setObjectBoolean(int fieldNumber, Boolean value) {
396         properties[fieldNumber] = value;
397     }
398
399     public void setObjectByte(int fieldNumber, Byte value) {
400         properties[fieldNumber] = value;
401     }
402
403     public void setObjectShort(int fieldNumber, Short value) {
404         properties[fieldNumber] = value;
405     }
406
407     public void setObjectInt(int fieldNumber, Integer value) {
408         properties[fieldNumber] = value;
409     }
410
411     public void setObjectLong(int fieldNumber, Long value) {
412         properties[fieldNumber] = value;
413     }
414
415     public void setObjectFloat(int fieldNumber, Float value) {
416         properties[fieldNumber] = value;
417     }
418
419     public void setObjectDouble(int fieldNumber, Double value) {
420         properties[fieldNumber] = value;
421     }
422
423     public void setBigDecimal(int fieldNumber, BigDecimal value) {
424         properties[fieldNumber] = value;
425     }
426
427     public void setString(int fieldNumber, String value) {
428         properties[fieldNumber] = value;
429     }
430
431     public void setObject(int fieldNumber, Object value) {
432         properties[fieldNumber] = value;
433     }
434
435     public void setJavaSqlDate(int fieldNumber, java.sql.Date value) {
436         properties[fieldNumber] = value;
437     }
438
439     public void setJavaUtilDate(int fieldNumber, java.util.Date value) {
440         properties[fieldNumber] = value;
441     }
442
443     public void setJavaSqlTime(int fieldNumber, java.sql.Time value) {
444         properties[fieldNumber] = value;
445     }
446
447     public void setJavaSqlTimestamp(int fieldNumber, java.sql.Timestamp value) {
448         properties[fieldNumber] = value;
449     }
450
451     public Object get(int columnNumber) {
452         return properties[columnNumber];
453     }
454
455     public void set(int columnNumber, Object value) {
456         modifiedFields.set(columnNumber);
457         properties[columnNumber] = value;
458     }
459
460     public ColumnMetadata[] columnMetadata() {
461         return domainTypeHandler.columnMetadata();
462     }
463
464     public void found(Boolean found) {
465         this.found = found;
466     }
467
468     public Boolean found() {
469         return found;
470     }
471
472 }