1 package com.atlassian.user.impl.hibernate;
2
3 import net.sf.hibernate.SessionFactory;
4
5 import com.atlassian.cache.Cache;
6 import com.atlassian.cache.CacheFactory;
7 import com.atlassian.user.ExternalEntity;
8
9 public class CachingExternalEntityDAO extends DefaultExternalEntityDAO
10 {
11 private CacheFactory cacheFactory;
12
13 public CachingExternalEntityDAO(SessionFactory sessionFactory, CacheFactory cacheFactory)
14 {
15 super(sessionFactory);
16 this.cacheFactory = cacheFactory;
17 }
18
19 public ExternalEntity getExternalEntity(final String externalEntityName)
20 {
21 Long id = (Long) getCache().get(externalEntityName);
22 if (id != null)
23 return (ExternalEntity) getHibernateTemplate().get(DefaultHibernateExternalEntity.class, id);
24
25 ExternalEntity externalEntity = super.getExternalEntity(externalEntityName);
26 if (externalEntity != null)
27 cacheEntity(externalEntityName, externalEntity);
28
29 return externalEntity;
30 }
31
32 public void removeExternalEntity(final String externalEntityName)
33 {
34 getCache().remove(externalEntityName);
35 super.removeExternalEntity(externalEntityName);
36 }
37
38 public ExternalEntity createExternalEntity(String externalEntityName)
39 {
40 ExternalEntity entity = super.createExternalEntity(externalEntityName);
41 cacheEntity(externalEntityName, entity);
42 return entity;
43 }
44
45 private Cache getCache()
46 {
47 return cacheFactory.getCache(this.getClass().getName() + ".externalEntityName");
48 }
49
50 private void cacheEntity(String externalEntityName, ExternalEntity entity)
51 {
52 getCache().put(externalEntityName, new Long(entity.getId()));
53 }
54 }