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() {}
}