1 package org.sourceforge.jemm.client;
2
3 import org.sourceforge.jemm.JEMMInternalException;
4 import org.sourceforge.jemm.client.events.LockTracer;
5 import org.sourceforge.jemm.client.events.StackTracer;
6 import org.sourceforge.jemm.lifecycle.ConstructorListener;
7 import org.sourceforge.jemm.lifecycle.LifecycleEvent;
8 import org.sourceforge.jemm.lifecycle.LockEvent;
9 import org.sourceforge.jemm.lifecycle.MethodEvent;
10 import org.sourceforge.jemm.lifecycle.MethodListener;
11 import org.sourceforge.jemm.lifecycle.TypeConstructorListener;
12 import org.sourceforge.jemm.util.ConstructorContext;
13 import org.sourceforge.jemm.util.ContextStack;
14 import org.sourceforge.jemm.util.JEMMObject;
15 import org.sourceforge.jemm.util.JEMMType;
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 public class LifecycleListenerImpl implements ConstructorListener,
60 MethodListener,TypeConstructorListener {
61
62 ObjectDatabase db;
63 ObjectDatabase whenLockedDB;
64
65 private JEMMObjectCreator objectCreator;
66 private StackTracer stackTracer;
67 private LockTracer lockTracer;
68
69 public LifecycleListenerImpl(ObjectDatabase db,StackTracer st, LockTracer lt) {
70 this.db = db;
71 this.whenLockedDB = new AlwaysRefreshObjectDatabase(db);
72
73 this.stackTracer = st;
74 this.lockTracer = lt;
75 }
76
77
78
79
80 @Override
81 public void preConstructor(String className) {
82 ContextStack.pushReference(new ConstructorContext(className));
83 }
84
85
86
87
88
89
90
91
92
93
94 @Override
95 public void beginConstructor(LifecycleEvent e) {
96 JEMMObject origin = e.getOrigin();
97
98 ConstructorContext cc = (ConstructorContext)ContextStack.peekReference();
99 cc.associateObject(origin);
100
101 objectCreator.initialise(origin);
102 }
103
104 public void setObjectCreator(JEMMObjectCreator creator) {
105 this.objectCreator = creator;
106 }
107
108 @Override public void typeConstructed(JEMMType typeInstance) {
109
110 objectCreator.initialise(typeInstance);
111 }
112
113
114
115
116 @Override
117 public void failedConstruction(LifecycleEvent e) {
118 ContextStack.popReference();
119 }
120
121
122
123
124
125
126
127 @Override
128 public void endConstructor(LifecycleEvent e) {
129 ConstructorContext context = (ConstructorContext)ContextStack.popReference();
130 ConstructorContext peekedContext = (ConstructorContext)ContextStack.peekReference();
131
132 JEMMObject origin = e.getOrigin();
133 if(context==null || context.getObject()!=origin)
134 throw new JEMMInternalException("ContextStack corrupted");
135
136 if(peekedContext!=null && !peekedContext.hasObject() && isParent(context.getClazz(),peekedContext.getClazz())) {
137
138 return;
139 }
140
141 ObjectAccessor oa = new ObjectAccessor(origin,db);
142 oa.finaliseAllFields();
143 db.synchroniseObject(origin);
144 }
145
146 private boolean isParent(String parent,String child) {
147 try {
148 Class<?> parentClass = Class.forName(parent);
149 Class<?> childClass = Class.forName(child);
150 return childClass.getSuperclass().equals(parentClass);
151 } catch (ClassNotFoundException e) {
152 throw new JEMMInternalException("Unable to convert to class " + e.getMessage());
153 }
154 }
155
156
157
158
159 @Override
160 public void beginLock(LockEvent e) {
161 lockTracer.beginLock(e.getOrigin(), e.getLock());
162 }
163
164
165
166
167 @Override
168 public void endLock(LockEvent e) {
169 lockTracer.endLock(e.getOrigin(), e.getLock());
170 }
171
172
173
174
175
176
177
178
179
180
181
182 @Override
183 public void entityEntered(MethodEvent e) {
184 stackTracer.enterMethod(e.getOrigin(), new Descriptor(e.getDescriptor()));
185 }
186
187
188
189
190
191
192
193
194
195
196 @Override
197 public void entityExited(MethodEvent e) {
198 stackTracer.exitMethod(e.getOrigin(), new Descriptor(e.getDescriptor()));
199 }
200
201 }