View Javadoc

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   * The main entry point for all JEMMObject operations once they have been
14   * decoded from the events.
15   * 
16   * @author Paul
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  	 * Finalize the object state completely and synchronize to the database.
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  	 * Initialise the objects used by the method.
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  	 * Synchronize the state to the database.
65  	 */
66  	@Override
67  	public void methodExited(MethodEvent m) {
68  	}
69  
70  	/**
71  	 * Acquires the lock for an object
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  	 * Release the lock for an object
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  }