1 package org.sourceforge.jemm.client;
2
3 import java.lang.reflect.Field;
4 import java.util.HashMap;
5 import java.util.Map;
6
7 import org.sourceforge.jemm.JEMMInternalException;
8 import org.sourceforge.jemm.client.types.FieldAccessor;
9 import org.sourceforge.jemm.client.types.FieldAccessorChooser;
10 import org.sourceforge.jemm.client.types.FieldTypeAccessorChooser;
11 import org.sourceforge.jemm.database.FieldInfo;
12 import org.sourceforge.jemm.database.FieldType;
13 import org.sourceforge.jemm.lifecycle.AttributeUse;
14 import org.sourceforge.jemm.lifecycle.MethodListener;
15 import org.sourceforge.jemm.lifecycle.ShadowUserObject;
16 import org.sourceforge.jemm.lifecycle.ShadowUserObjectImpl;
17 import org.sourceforge.jemm.types.ID;
18 import org.sourceforge.jemm.util.JEMMObject;
19
20
21
22
23
24
25
26
27 public class ObjectAccessor {
28 public static final int DEFAULT_VERSION = 0;
29
30 JEMMObject obj;
31 FieldAccessorChooser accessorFactory;
32
33
34
35
36
37
38 public ObjectAccessor(JEMMObject obj,ObjectSource database) {
39 this.obj = obj;
40 this.accessorFactory = new FieldTypeAccessorChooser(database,new Entity(obj));
41 }
42
43
44
45
46
47
48
49
50
51 public void create(ID id, MethodListener ml) {
52
53 ShadowUserObject so = new ShadowUserObjectImpl(obj, ml, id,
54 DEFAULT_VERSION);
55
56 Entity e = new Entity(obj);
57 e.setShadowObject(so);
58 initialiseObjectFields();
59 }
60
61 public boolean isCreated() {
62 Entity e = new Entity(obj);
63 return e.getShadowObject()!=null;
64 }
65
66 private void initialiseObjectFields() {
67 FieldIterator it = new FieldIterator(obj.getClass(),new JEMMObjectFilter());
68 for(Field field : it) {
69 setField(field.getDeclaringClass(),field.getName(),null);
70 initialiseField(field.getDeclaringClass(), field.getName());
71 }
72 }
73
74
75
76
77
78
79
80
81
82
83
84
85
86 public void setField(Class<?> declaringClass, String name, Object value) {
87 FieldKey fKey = new FieldKey(declaringClass,name);
88
89 FieldAccessor fAccessor = accessorFactory.create(fKey);
90 fAccessor.setField(fKey, value);
91
92 }
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107 public Object getField(Class<?> declaringClass,String name) {
108
109 FieldKey fKey = new FieldKey(declaringClass,name);
110
111 FieldAccessor fAccessor = accessorFactory.create(fKey);
112 return fAccessor.getField(fKey);
113
114 }
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129 public void initialiseField(String declaringClass, String fieldName) {
130 try {
131 initialiseField(Class.forName(declaringClass),fieldName);
132 } catch (ClassNotFoundException e) {
133 throw new JEMMInternalException("Programming error, class not found:" + declaringClass,e);
134 }
135 }
136
137 public void initialiseField(Class<?> declaringClass,String fieldName) {
138 FieldKey fKey = new FieldKey(declaringClass,fieldName);
139
140 FieldAccessor fAccessor = accessorFactory.create(fKey);
141 fAccessor.initialise(fKey);
142 }
143
144 public boolean isInitialised(Class<?> declaringClass,String fieldName) {
145 return new Entity(obj).getShadowData().
146 isFieldInitialised(declaringClass, FieldType.OBJECT, fieldName);
147 }
148
149 public void initialiseAllFields(Descriptor methodDescriptor) {
150 try {
151 Entity e = new Entity(obj);
152 AttributeUse[] attribs = e.methodUses(methodDescriptor);
153 for(AttributeUse at : attribs) {
154 initialiseField(at.clazz(),at.name());
155 }
156 } catch (Exception e) {
157 throw new RuntimeException(e);
158 }
159 }
160
161
162
163
164
165
166
167
168
169
170 public void finaliseField(Class<?> declaringClass,String fieldName) {
171 try {
172 Field f = declaringClass.getDeclaredField(fieldName);
173 finaliseField(f);
174 } catch (Exception e) {
175 throw new RuntimeException(e);
176 }
177
178 }
179
180 public void finaliseField(Field f) {
181 if(f.getType().isPrimitive())
182 return;
183 FieldKey fKey = new FieldKey(f.getDeclaringClass(),f.getName());
184 FieldAccessor fAccessor = accessorFactory.create(fKey);
185 fAccessor.finalize(fKey);
186
187 }
188
189 public void finaliseAllFields() {
190 FieldIterator it = new FieldIterator(obj.getClass(),new JEMMObjectFilter());
191 while(it.hasNext()) {
192 Field f = it.next();
193 finaliseField(f);
194 }
195 new Entity(obj).getShadowUserObject().getData().clearInitialisations();
196 }
197
198
199
200
201
202
203
204
205 public Map<FieldInfo,Object> getAllFieldsMap() {
206 Map<FieldInfo,Object> results = new HashMap<FieldInfo,Object>();
207
208 FieldFilter allButShadowUserObject = new AllStoredFieldsFilter();
209 FieldIterator it = new FieldIterator(obj.getClass(),allButShadowUserObject);
210
211 for(Field f : it) {
212 FieldInfo key = new FieldInfo(f.getName(),f.getDeclaringClass(),FieldType.convert(f.getType()));
213 FieldKey fKey = new FieldKey(f.getDeclaringClass(),f.getName());
214
215 FieldAccessor accessor = accessorFactory.create(fKey);
216
217 Object value = accessor.getFieldRaw(fKey);
218 results.put(key, value);
219 }
220 return results;
221 }
222
223
224
225
226
227
228
229
230 public Map<FieldKey,ID> getUninitialisedObjectFields() {
231 Map<FieldKey,ID> result = new HashMap<FieldKey,ID>();
232
233 FieldFilter filter = new JEMMObjectFilter();
234 FieldIterator it = new FieldIterator(obj.getClass(),filter);
235
236 for(Field f : it) {
237 Entity e = new Entity(obj);
238 if(!e.getShadowData().isFieldInitialised(f.getDeclaringClass(), FieldType.OBJECT, f.getName())) {
239 FieldKey fKey = new FieldKey(f.getDeclaringClass(),f.getName());
240 FieldAccessor accessor = accessorFactory.create(fKey);
241 result.put(fKey,(ID)accessor.getFieldRaw(fKey));
242 }
243 }
244
245 return result;
246 }
247
248
249
250
251
252
253
254 public Map<FieldKey,JEMMObject> getInitialisedObjectFields() {
255 Map<FieldKey,JEMMObject> result = new HashMap<FieldKey,JEMMObject>();
256
257 FieldFilter filter = new JEMMObjectFilter();
258 FieldIterator it = new FieldIterator(obj.getClass(),filter);
259
260 for(Field f : it) {
261 Entity e = new Entity(obj);
262 if(e.getShadowData().isFieldInitialised(f.getDeclaringClass(), FieldType.OBJECT, f.getName())) {
263 FieldKey fKey = new FieldKey(f.getDeclaringClass(),f.getName());
264 FieldAccessor accessor = accessorFactory.create(fKey);
265 result.put(fKey,(JEMMObject)accessor.getField(fKey));
266 }
267 }
268
269 return result;
270 }
271 }