View Javadoc

1   package org.sourceforge.jemm.client;
2   
3   import java.util.concurrent.ConcurrentHashMap;
4   import java.util.concurrent.ConcurrentMap;
5   
6   import org.sourceforge.jemm.database.ClassId;
7   import org.sourceforge.jemm.database.ClassInfo;
8   import org.sourceforge.jemm.database.ClientId;
9   import org.sourceforge.jemm.database.Database;
10  import org.sourceforge.jemm.database.EnumId;
11  import org.sourceforge.jemm.database.EnumInfo;
12  import org.sourceforge.jemm.database.StructureModifiedException;
13  
14  /**
15   * An ObjectDatabase which caches calls to register and classinfo
16   * since they are effectively static for the lifetime of the client.
17   * 
18   * @author Paul Keeble
19   *
20   */
21  public class RegistrationCache extends DelegatingDatabase implements Database {
22  	ConcurrentMap<Object,Object> cache;
23  	
24  	public RegistrationCache(Database database) {
25  		super(database);
26  		cache = new ConcurrentHashMap<Object,Object>();
27  	}
28  
29      public ClassId registerClass(ClientId clientId, ClassInfo classInfo) throws StructureModifiedException {
30      	ClassId id = (ClassId)cache.get(classInfo);
31      	if(id!=null)
32      		return id;
33      	
34      	id = super.registerClass(clientId,classInfo);
35      	cache.put(classInfo, id);
36      	return id;
37      }
38      
39      public EnumId registerEnum(ClientId clientId,EnumInfo enumInfo) throws StructureModifiedException {
40      	EnumId id = (EnumId)cache.get(enumInfo);
41      	if(id!=null)
42      		return id;
43      	
44      	id = super.registerEnum(clientId,enumInfo);
45      	cache.put(enumInfo,id);
46      	return id;
47      }
48      
49      public ClassInfo getClassInfo(ClientId clientId, ClassId classId) {
50      	ClassInfo ci = (ClassInfo)cache.get(classId);
51      	if(ci!=null)
52      		return ci;
53      	ci = super.getClassInfo(clientId,classId);
54      	cache.put(classId, ci);
55      	return ci;
56      }
57      
58      public EnumInfo getEnumInfo(ClientId clientId, EnumId enumId) {
59      	EnumInfo ei = (EnumInfo)cache.get(enumId);
60      	if(ei!=null)
61      		return ei;
62      	ei = super.getEnumInfo(clientId,enumId);
63      	cache.put(enumId, ei);
64      	return ei;
65      }
66      
67      public int cacheCount() {
68      	return cache.size();
69      }
70  }