1 package org.sourceforge.jemm.client.events;
2
3 import java.util.HashMap;
4 import java.util.Map;
5
6 import org.sourceforge.jemm.JEMMInternalException;
7 import org.sourceforge.jemm.client.Descriptor;
8
9
10
11
12
13
14
15
16
17
18 public class EntitiesContext implements StackTracer{
19 Map<Object,EntityContext> entities;
20 MethodContextListener listener;
21
22 LockTracer lockTracer;
23
24
25
26
27
28
29 public EntitiesContext(LockTracer lockTracer, MethodContextListener listener) {
30 entities = new HashMap<Object,EntityContext>();
31 this.lockTracer = lockTracer;
32 this.listener = listener;
33 }
34
35
36
37
38
39
40
41
42
43
44
45 public void enterMethod(Object entity, Descriptor method) {
46 boolean created = false;
47 boolean locked = false;
48 synchronized(this) {
49 EntityContext ec = null;
50
51 if(entities.containsKey(entity)) {
52 ec = entities.get(entity);
53 } else {
54 ec = new EntityContext(entity);
55 entities.put(entity,ec);
56 created = true;
57 }
58 ec.add(method);
59
60 locked = lockTracer.currentTreadHasAnyLock();
61 }
62
63 if(created) {
64 listener.entityEntered(new EntityEvent(entity,EntityEventType.ENTER));
65 listener.methodEntered(new MethodEvent(entity,method,MethodEventType.ENTER,locked));
66 } else {
67 listener.methodEntered(new MethodEvent(entity,method,MethodEventType.ENTER,locked));
68 }
69 }
70
71
72
73
74
75
76
77
78 public synchronized boolean isMethodEntered(Object entity, Descriptor method) {
79 EntityContext ec = entities.get(entity);
80 if(ec!=null) {
81 return ec.has(method);
82 }
83 return false;
84 }
85
86
87
88
89
90
91
92 public synchronized boolean isEntityEntered(Object entity) {
93 EntityContext ec = entities.get(entity);
94 if(ec!=null) {
95 return ec.hasAny();
96 }
97 return false;
98 }
99
100
101
102
103
104
105
106
107
108
109 public void exitMethod(Object entity,Descriptor method) {
110 EntityContext ec = null;
111 boolean stillEntered= false;
112 boolean locked;
113 synchronized(this) {
114 if(!entities.containsKey(entity))
115 throw new JEMMInternalException("No context for the entity exists " + entity);
116
117 ec = entities.get(entity);
118 ec.remove(method);
119 stillEntered = ec.hasAny();
120 if(!stillEntered)
121 entities.remove(entity);
122
123 locked = lockTracer.currentTreadHasAnyLock();
124 }
125 if(stillEntered) {
126 listener.methodExited(new MethodEvent(entity,method,MethodEventType.EXIT,locked));
127 } else {
128 listener.methodExited(new MethodEvent(entity,method,MethodEventType.EXIT,locked));
129 listener.entityExited(new EntityEvent(entity,EntityEventType.EXIT));
130 }
131 }
132 }