1 package org.sourceforge.jemm.client;
2
3 import org.sourceforge.jemm.client.events.EntityEvent;
4 import org.sourceforge.jemm.client.events.LockContextListener;
5 import org.sourceforge.jemm.client.events.LockEvent;
6 import org.sourceforge.jemm.client.events.MethodContextListener;
7 import org.sourceforge.jemm.client.events.MethodEvent;
8 import org.sourceforge.jemm.database.ClientId;
9 import org.sourceforge.jemm.database.ClientThreadId;
10 import org.sourceforge.jemm.util.JEMMObject;
11
12
13
14
15
16
17
18
19 public class ObjectOperationsFacade implements MethodContextListener, LockContextListener{
20 private static final ClientId clientId = new ClientId("CLIENT");
21
22 ObjectDatabase db;
23 ObjectDatabase whenLockedDB;
24
25 public ObjectOperationsFacade(ObjectDatabase db) {
26 this.db =db;
27 this.whenLockedDB = new AlwaysRefreshObjectDatabase(db);
28 }
29
30 @Override
31 public void entityEntered(EntityEvent e) {
32 }
33
34
35
36
37 @Override
38 public void entityExited(EntityEvent e) {
39 JEMMObject entity = (JEMMObject)e.getEntity();
40 ObjectAccessor oa = createObjectAccessor(entity,false);
41 oa.finaliseAllFields();
42 db.synchroniseObject(entity);
43 }
44
45 private ObjectAccessor createObjectAccessor(JEMMObject origin,boolean inLock) {
46 if(inLock)
47 return new ObjectAccessor(origin,whenLockedDB);
48 return new ObjectAccessor(origin,db);
49 }
50
51
52
53
54 @Override
55 public void methodEntered(MethodEvent m) {
56 JEMMObject entity = (JEMMObject)m.getEntity();
57 Descriptor methodDescriptor = m.getMethod();
58
59 ObjectAccessor oa = createObjectAccessor(entity,m.hasLock());
60 oa.initialiseAllFields(methodDescriptor);
61 }
62
63
64
65
66 @Override
67 public void methodExited(MethodEvent m) {
68 }
69
70
71
72
73 @Override
74 public void acquire(LockEvent e) {
75 JEMMObject source = (JEMMObject)e.getSource();
76 JEMMObject lock = (JEMMObject)e.getLock();
77 db.acquireLock(getThreadId(), new Entity(lock).getID());
78 db.refreshObject(source);
79 }
80
81 private ClientThreadId getThreadId() {
82 long threadId = Thread.currentThread().getId();
83 return new ClientThreadId(clientId,Long.toString(threadId));
84 }
85
86
87
88
89 @Override
90 public void release(LockEvent e) {
91 JEMMObject source = (JEMMObject)e.getSource();
92 JEMMObject lock = (JEMMObject)e.getLock();
93
94 db.synchroniseObject(source);
95 db.releaseLock(getThreadId(), new Entity(lock).getID());
96
97 }
98
99 }