Mercurial Hosting > nabble
view src/nabble/view/lib/Cache.java @ 0:7ecd1a4ef557
add content
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 21 Mar 2019 19:15:52 -0600 |
parents | |
children |
line wrap: on
line source
/* Copyright (C) 2001 Franklin Schmidt <frank@gustos.com> */ package nabble.view.lib; import fschmidt.db.Listener; import fschmidt.util.servlet.HttpCache; import fschmidt.util.servlet.JtpContext; import nabble.model.FileUpload; import nabble.model.Message; import nabble.model.ModelHome; import nabble.model.Executors; import nabble.model.Node; import nabble.model.Site; import nabble.model.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.HashSet; import java.util.Set; import java.util.concurrent.TimeUnit; public final class Cache { private static final Logger logger = LoggerFactory.getLogger(Cache.class); private static final int nodeEvent = 1; private static final int descendantChangeEvent = 2; // private static final int topicEvent = 3; // private static final int postEvent = 4; // private static final int skinEvent = 5; // private static final int activityEvent = 6; private static final int regularEvent = 7; private static final int nodeFileEvent = 9; // private static final int forumFileEvent = 10; // private static final int topicRootEvent = 11; private static final int userFileEvent = 12; private static final int siteChangeEvent = 13; private static final int newUserEvent = 14; private static final int groupChangeEvent = 15; private static String event(int type,long id) { return Integer.toString(type) + ':' + Long.toString(id); } private static String event(int type,long id1,long id2) { return Integer.toString(type) + ':' + Long.toString(id1) + ':' + Long.toString(id2); } public static String descendantChangeEvent(Node node) { return event(descendantChangeEvent,node.getSite().getId(),node.getId()); } public static String nodeChangeEvent(Node node) { return event(nodeEvent,node.getSite().getId(),node.getId()); } public static String nodeFileChangeEvent(Node node) { return event(nodeFileEvent,node.getSite().getId(),node.getId()); } public static String userFileChangeEvent(User user) { return event(userFileEvent,user.getSite().getId(), user.getId()); } public static String siteChangeEvent(Site site) { return event(siteChangeEvent, site.getId()); } public static String newUserEvent(Site site) { return event(newUserEvent, site.getId()); } public static String groupChangeEvent(Site site) { return event(groupChangeEvent, site.getId()); } static { ModelHome.addDescendantChangeListener(new Listener<Node>() { public void event(Node node) { uncache( Cache.descendantChangeEvent(node) ); } } ); ModelHome.addNodeChangeListener(new Listener<Node>() { public void event(Node node) { uncache( Cache.nodeChangeEvent(node) ); } } ); FileUpload.addFileUpdateListener(new Listener<Message.Source>() { public void event(Message.Source src) { char type = src.getMessageSourceType().getCode(); switch(type) { case 't': return; case 'a': // for now -fschmidt uncache( Cache.userFileChangeEvent(((Message.AvatarSource)src).getUser()) ); return; case 'n': uncache( Cache.nodeFileChangeEvent((Node)src) ); return; case 's': uncache( Cache.siteChangeEvent((Site)src) ); return; default: throw new RuntimeException("type = '"+type+"'"); } } } ); ModelHome.addSiteChangeListener(new Listener<Site>() { public void event(Site site) { uncache( Cache.siteChangeEvent(site) ); } } ); ModelHome.addUserInsertListener(new Listener<User>() { public void event(User user) { uncache( Cache.newUserEvent(user.getSite()) ); } } ); Permissions.addGroupChangeListener(new Listener<Site>() { public void event(Site site) { uncache( Cache.newUserEvent(site) ); } } ); Permissions.addPermissionChangeListener(new Listener<Site>() { public void event(Site site) { uncache( Cache.siteChangeEvent(site) ); } } ); } public static void uncache(String event) { HttpCache cache = MyJtpServlet.getJtpContextNotNull().getHttpCache(); if( cache != null ) cache.modified(event); } private static Set<Long> secondSet = new HashSet<Long>(); public static synchronized String regularEvent(long seconds) { final String event = event(regularEvent,seconds); if( secondSet.add(seconds) ) { Executors.scheduleWithFixedDelay(new Runnable(){public void run(){ JtpContext context = MyJtpServlet.getJtpContext(); if( context != null ) { HttpCache cache = context.getHttpCache(); if( cache != null ) { cache.modified(event); } } }},seconds,seconds,TimeUnit.SECONDS); } return event; } private static final long secondsPerDay = 60*60*24; public static final String dailyEvent = regularEvent(secondsPerDay); static void init() {} }