KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > terracotta > modules > iBatis_2_2_0 > object > applicator > IBatisAccessPlanApplicator


1 /*
2  * All content copyright (c) 2003-2006 Terracotta, Inc., except as may otherwise be noted in a separate copyright
3  * notice. All rights reserved.
4  */

5 package org.terracotta.modules.iBatis_2_2_0.object.applicator;
6
7 import com.tc.exception.TCNotSupportedMethodException;
8 import com.tc.exception.TCRuntimeException;
9 import com.tc.object.ClientObjectManager;
10 import com.tc.object.ObjectID;
11 import com.tc.object.TCObject;
12 import com.tc.object.TraversedReferences;
13 import com.tc.object.applicator.BaseApplicator;
14 import com.tc.object.dna.api.DNA;
15 import com.tc.object.dna.api.DNACursor;
16 import com.tc.object.dna.api.DNAWriter;
17 import com.tc.object.dna.api.PhysicalAction;
18 import com.tc.object.dna.impl.DNAEncoding;
19 import com.tc.object.tx.optimistic.OptimisticTransactionManager;
20 import com.tc.util.Assert;
21
22 import java.io.IOException JavaDoc;
23 import java.lang.reflect.Constructor JavaDoc;
24 import java.lang.reflect.Field JavaDoc;
25 import java.lang.reflect.InvocationTargetException JavaDoc;
26 import java.util.Map JavaDoc;
27
28 /**
29  * @author Antonio Si
30  */

31 public class IBatisAccessPlanApplicator extends BaseApplicator {
32   private static final String JavaDoc CLASSNAME_FIELD_NAME = "com.ibatis.sqlmap.engine.accessplan.BaseAccessPlan.className";
33   private static final String JavaDoc CLAZZ_FIELD_NAME = "com.ibatis.sqlmap.engine.accessplan.BaseAccessPlan.clazz";
34   private static final String JavaDoc PROPERTY_NAMES_FIELD_NAME = "com.ibatis.sqlmap.engine.accessplan.BaseAccessPlan.clazz.propertyNames";
35
36   public IBatisAccessPlanApplicator(DNAEncoding encoding) {
37     super(encoding);
38   }
39
40   public TraversedReferences getPortableObjects(Object JavaDoc pojo, TraversedReferences addTo) {
41     addTo.addAnonymousReference(getClazz(pojo));
42     addTo.addAnonymousReference(getPropertyNames(pojo));
43     return addTo;
44   }
45
46   private Object JavaDoc getClazz(Object JavaDoc pojo) {
47     //return get(pojo, "getGetters", new Class[] {}, new Object[] {});
48
return getField(pojo, "clazz");
49   }
50
51   private Object JavaDoc getPropertyNames(Object JavaDoc pojo) {
52     //return get(pojo, "getGetters", new Class[] {}, new Object[] {});
53
return getField(pojo, "propertyNames");
54   }
55
56   private Object JavaDoc getField(Object JavaDoc pojo, String JavaDoc fieldName) {
57     try {
58       Field JavaDoc field = pojo.getClass().getSuperclass().getDeclaredField(fieldName);
59       field.setAccessible(true);
60       return field.get(pojo);
61     } catch (IllegalArgumentException JavaDoc e) {
62       throw new TCRuntimeException(e);
63     } catch (IllegalAccessException JavaDoc e) {
64       throw new TCRuntimeException(e);
65     } catch (NoSuchFieldException JavaDoc e) {
66       throw new TCRuntimeException(e);
67     }
68   }
69
70   public void hydrate(ClientObjectManager objectManager, TCObject tcObject, DNA dna, Object JavaDoc po) throws IOException JavaDoc,
71       IllegalArgumentException JavaDoc, ClassNotFoundException JavaDoc {
72     //
73
}
74
75   public void dehydrate(ClientObjectManager objectManager, TCObject tcObject, DNAWriter writer, Object JavaDoc pojo) {
76     String JavaDoc className = pojo.getClass().getName();
77     writer.addPhysicalAction(CLASSNAME_FIELD_NAME, className);
78     
79     Class JavaDoc clazz = (Class JavaDoc)getClazz(pojo);
80     writer.addPhysicalAction(CLAZZ_FIELD_NAME, clazz);
81     
82     Object JavaDoc propertyNames = getPropertyNames(pojo);
83     Object JavaDoc dehydratablePropertyNames = getDehydratableObject(propertyNames, objectManager);
84     writer.addPhysicalAction(PROPERTY_NAMES_FIELD_NAME, dehydratablePropertyNames);
85   }
86
87   public Object JavaDoc getNewInstance(ClientObjectManager objectManager, DNA dna) throws IOException JavaDoc, ClassNotFoundException JavaDoc {
88     DNACursor cursor = dna.getCursor();
89     Assert.assertEquals(3, cursor.getActionCount());
90     
91     cursor.next(encoding);
92     PhysicalAction a = cursor.getPhysicalAction();
93     String JavaDoc className = (String JavaDoc)a.getObject();
94
95     cursor.next(encoding);
96     a = cursor.getPhysicalAction();
97     Class JavaDoc target = (Class JavaDoc) a.getObject();
98
99     cursor.next(encoding);
100     a = cursor.getPhysicalAction();
101     Object JavaDoc propertyNames = a.getObject();
102     propertyNames = objectManager.lookupObject((ObjectID) propertyNames);
103     
104     return create(target, className, propertyNames);
105   }
106
107   private Object JavaDoc create(Class JavaDoc target, String JavaDoc className, Object JavaDoc propertyNames) {
108     try {
109       Class JavaDoc clazz = target.getClassLoader().loadClass(className);
110       
111       Constructor JavaDoc c = clazz.getDeclaredConstructor(new Class JavaDoc[]{Class JavaDoc.class, String JavaDoc[].class});
112       c.setAccessible(true);
113       Object JavaDoc o = c.newInstance(new Object JavaDoc[]{target, propertyNames});
114       
115       return o;
116     } catch (NoSuchMethodException JavaDoc e) {
117       throw new TCRuntimeException(e);
118     } catch (IllegalArgumentException JavaDoc e) {
119       throw new TCRuntimeException(e);
120     } catch (IllegalAccessException JavaDoc e) {
121       throw new TCRuntimeException(e);
122     } catch (InvocationTargetException JavaDoc e) {
123       throw new TCRuntimeException(e);
124     } catch (ClassNotFoundException JavaDoc e) {
125       throw new TCRuntimeException(e);
126     } catch (InstantiationException JavaDoc e) {
127       throw new TCRuntimeException(e);
128     }
129   }
130
131   public Map JavaDoc connectedCopy(Object JavaDoc source, Object JavaDoc dest, Map JavaDoc visited, ClientObjectManager objectManager,
132                            OptimisticTransactionManager txManager) {
133     throw new TCNotSupportedMethodException();
134   }
135 }
136
Popular Tags