NIHVIVO-719 Begin refactoring, to try to figure out why the thread isn't shutting down. Pull the ServletContextListener into a separate inner class.

This commit is contained in:
jeb228 2011-01-28 21:45:47 +00:00
parent c39c066b72
commit bad03c9955
2 changed files with 52 additions and 44 deletions

View file

@ -171,7 +171,7 @@
</listener> </listener>
<listener> <listener>
<listener-class>edu.cornell.mannlib.vitro.webapp.dao.jena.VClassGroupCache</listener-class> <listener-class>edu.cornell.mannlib.vitro.webapp.dao.jena.VClassGroupCache$Setup</listener-class>
</listener> </listener>
<!-- <!--

View file

@ -33,26 +33,29 @@ import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilterUtils;
import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilters; import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilters;
import edu.cornell.mannlib.vitro.webapp.flags.PortalFlag; import edu.cornell.mannlib.vitro.webapp.flags.PortalFlag;
public class VClassGroupCache implements ServletContextListener{ public class VClassGroupCache{
/* This is the cache of VClassGroups. It is a portal id to list of VClassGroups */
private transient ConcurrentHashMap<Integer, List<VClassGroup>> _groupListMap;
private transient ConcurrentLinkedQueue<String> _rebuildQueue;
private RebuildGroupCacheThread _cacheRebuildThread;
private ServletContext context;
private static final Log log = LogFactory.getLog(VClassGroupCache.class); private static final Log log = LogFactory.getLog(VClassGroupCache.class);
private static boolean ORDER_BY_DISPLAYRANK = true; private static final String ATTRIBUTE_NAME = "VClassGroupCache";
private static boolean INCLUDE_UNINSTANTIATED = true;
private static boolean INCLUDE_INDIVIDUAL_COUNT = true; private static final boolean ORDER_BY_DISPLAYRANK = true;
private static final boolean INCLUDE_UNINSTANTIATED = true;
public VClassGroupCache(){} private static final boolean INCLUDE_INDIVIDUAL_COUNT = true;
/** /**
* Use getVClassGroupCache(ServletContext) to get a VClassGroupCache. * Use getVClassGroupCache(ServletContext) to get a VClassGroupCache.
*/ */
public static VClassGroupCache getVClassGroupCache(ServletContext sc){
return (VClassGroupCache) sc.getAttribute(ATTRIBUTE_NAME);
}
/* This is the cache of VClassGroups. It is a portal id to list of VClassGroups */
private final ConcurrentHashMap<Integer, List<VClassGroup>> _groupListMap;
private final ConcurrentLinkedQueue<String> _rebuildQueue;
private final RebuildGroupCacheThread _cacheRebuildThread;
private final ServletContext context;
private VClassGroupCache(ServletContext context) { private VClassGroupCache(ServletContext context) {
this.context = context; this.context = context;
this._groupListMap = new ConcurrentHashMap<Integer, List<VClassGroup>>(); this._groupListMap = new ConcurrentHashMap<Integer, List<VClassGroup>>();
@ -71,10 +74,6 @@ public class VClassGroupCache implements ServletContextListener{
_cacheRebuildThread.informOfQueueChange(); _cacheRebuildThread.informOfQueueChange();
} }
public static VClassGroupCache getVClassGroupCache(ServletContext sc){
return (VClassGroupCache) sc.getAttribute("VClassGroupCache");
}
public List<VClassGroup> getGroups( int portalId ){ public List<VClassGroup> getGroups( int portalId ){
return getGroups(getVCGDao(),portalId ); return getGroups(getVCGDao(),portalId );
} }
@ -94,7 +93,7 @@ public class VClassGroupCache implements ServletContextListener{
} }
public void clearGroupCache(){ public void clearGroupCache(){
_groupListMap = new ConcurrentHashMap<Integer, List<VClassGroup>>(); _groupListMap.clear();
} }
@ -254,8 +253,24 @@ public class VClassGroupCache implements ServletContextListener{
return groups; return groups;
} }
private void requestStop() {
_cacheRebuildThread.kill();
}
protected VClassGroupDao getVCGDao(){
if( context == null ){
log.error("Context was not set for VClassGroupCache");
return null;
}
WebappDaoFactory wdf =(WebappDaoFactory)context.getAttribute("webappDaoFactory");
if( wdf == null ){
log.error("Cannot get webappDaoFactory from context");
return null;
}else
return wdf.getVClassGroupDao();
}
protected static String REBUILD_EVERY_PORTAL ="Rebuild every portal.";
/* ****************** Jena Model Change Listener***************************** */ /* ****************** Jena Model Change Listener***************************** */
private class VClassGroupCacheChangeListener extends StatementListener { private class VClassGroupCacheChangeListener extends StatementListener {
@ -348,29 +363,22 @@ public class VClassGroupCache implements ServletContextListener{
} }
} }
protected VClassGroupDao getVCGDao(){ /* ******************** ServletContextListener **************** */
if( context == null ){ public static class Setup implements ServletContextListener {
log.error("Context was not set for VClassGroupCache"); @Override
return null; public void contextInitialized(ServletContextEvent sce) {
ServletContext servletContext = sce.getServletContext();
servletContext.setAttribute(ATTRIBUTE_NAME, new VClassGroupCache(servletContext) );
} }
WebappDaoFactory wdf =(WebappDaoFactory)context.getAttribute("webappDaoFactory");
if( wdf == null ){
log.error("Cannot get webappDaoFactory from context");
return null;
}else
return wdf.getVClassGroupDao();
}
protected static String REBUILD_EVERY_PORTAL ="Rebuild every portal.";
@Override @Override
public void contextDestroyed(ServletContextEvent arg0) { public void contextDestroyed(ServletContextEvent sce) {
if( _cacheRebuildThread != null ) ServletContext servletContext = sce.getServletContext();
_cacheRebuildThread.kill(); Object o = servletContext.getAttribute(ATTRIBUTE_NAME);
} if (o instanceof VClassGroupCache) {
VClassGroupCache cache = (VClassGroupCache) o;
@Override cache.requestStop();
public void contextInitialized(ServletContextEvent arg0) { }
arg0.getServletContext().setAttribute("VClassGroupCache", new VClassGroupCache(arg0.getServletContext()) ); }
} }
} }