MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
InvocationHandlerImpl.java
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,
49 
51  static final I18NHelper local = I18NHelper.getInstance(InvocationHandlerImpl.class);
52 
54  static final Logger logger = LoggerFactoryService.getFactory().getInstance(InvocationHandlerImpl.class);
55 
57  protected Object[] properties;
58 
60  protected int numberOfFields;
61 
63  protected Map<String, Class<?>> typemap = new HashMap<String, Class<?>>();
64 
67 
69  BitSet modifiedFields;
70 
72  boolean modified = false;
73 
75  private Object proxy;
76 
78  private CacheManager objectManager;
79 
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 
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 }