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  }