View Javadoc

1   package org.sourceforge.jemm.database.memory;
2   
3   import java.util.Collections;
4   import java.util.HashSet;
5   import java.util.Set;
6   import java.util.concurrent.ConcurrentHashMap;
7   
8   import org.sourceforge.jemm.database.ClientId;
9   import org.sourceforge.jemm.database.ClientThreadId;
10  import org.sourceforge.jemm.database.components.ClientThreadIdRef;
11  import org.sourceforge.jemm.database.components.UserLockInfo;
12  import org.sourceforge.jemm.database.components.se.StorageEngineUserLockIF;
13  import org.sourceforge.jemm.types.ID;
14  import org.sourceforge.jemm.util.LockManager;
15  
16  public class UserLockIFImpl implements StorageEngineUserLockIF {
17  	
18  	ConcurrentHashMap<ID, UserLockInfo> locks = new ConcurrentHashMap<ID, UserLockInfo>();
19  	ConcurrentHashMap<ClientId,Set<ClientThreadIdRef>> clientLockRefs = 
20  		new ConcurrentHashMap<ClientId, Set<ClientThreadIdRef>>();
21  
22  	LockManager<ClientId> clientLocks = new LockManager<ClientId>();
23      
24  	
25  	@Override
26  	public UserLockInfo getLockInfo(ID id) {
27  		UserLockInfo lockInfo = locks.get(id);
28  		if(lockInfo == null) {
29  			lockInfo = new UserLockInfo(id);
30  			locks.put(id, lockInfo);
31  		}
32  		
33  		return lockInfo;
34  	}
35  
36  	@Override
37  	public void saveLockInfo(UserLockInfo info) {
38  		if(info.isUnused()) 
39  			locks.remove(info.getId());
40  	}
41  
42  	@Override
43  	public void clearAll() {
44  		locks.clear();
45  		clientLockRefs.clear();
46  	}
47  
48  	@Override
49  	public void addClientLockReference(ClientThreadId clientThreadId, ID objectId) {
50  		ClientId clientId = clientThreadId.getClientId();
51  		try {
52  			clientLocks.acquire(clientId);
53  		
54  			Set<ClientThreadIdRef> set = clientLockRefs.get(clientId);
55  			if(set == null) {
56  				set = new HashSet<ClientThreadIdRef>();
57  				clientLockRefs.put(clientId,set);
58  			}
59  			
60  			set.add(new ClientThreadIdRef(clientThreadId,objectId));
61  		} finally {
62  			clientLocks.release(clientId);
63  		}
64  	}
65  
66  	@Override
67  	public Set<ClientThreadIdRef> getClientLockSet(ClientId clientId) {
68  		try {
69  			clientLocks.acquire(clientId);
70  			Set<ClientThreadIdRef> set = clientLockRefs.get(clientId);
71  			if(set == null)
72  				return Collections.emptySet();
73  			else
74  				return Collections.unmodifiableSet(set);		
75  		} finally {
76  			clientLocks.release(clientId);
77  		}
78  	}
79  
80  	@Override
81  	public void removeClientLockReference(ClientThreadId clientThreadId, ID objectId) {
82  		ClientId clientId = clientThreadId.getClientId();
83  		try {
84  			clientLocks.acquire(clientId);
85  		
86  			Set<ClientThreadIdRef> set = clientLockRefs.get(clientId);
87  			if(set != null) {
88  				set.remove(new ClientThreadIdRef(clientThreadId,objectId));
89  				if(set.size() == 0)
90  					clientLockRefs.remove(clientId);
91  			}
92  		} finally {
93  			clientLocks.release(clientId);
94  		}
95  	}
96  }