package com.delect.motiver.server.cache;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.sf.jsr107cache.Cache;
import net.sf.jsr107cache.CacheException;
import net.sf.jsr107cache.CacheFactory;
import net.sf.jsr107cache.CacheManager;
import com.delect.motiver.server.jdo.Circle;
import com.delect.motiver.server.jdo.UserOpenid;
import com.delect.motiver.server.service.MyServiceImpl;
import com.google.appengine.api.memcache.jsr107cache.GCacheFactory;
import com.prodeagle.java.counters.Counter;
public class UserCache {
private final static boolean CACHE_ON = true;
private final static int CACHE_EXPIRE_SECONDS = 604800;
/**
* Logger for this class
*/
private static final Logger logger = Logger.getLogger(UserCache.class.getName());
private static final String PREFIX_CIRCLE = "uc_ci";
private static final String PREFIX_USER = "uc_us";
private static Cache cache;
private static UserCache userCache;
public static UserCache getInstance() {
if(cache == null) {
try {
Map props = new HashMap();
props.put(GCacheFactory.EXPIRATION_DELTA, CACHE_EXPIRE_SECONDS);
CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory();
cache = cacheFactory.createCache(props);
} catch (CacheException e) {
logger.log(Level.SEVERE, "Error loading cache", e);
}
}
if(userCache == null) {
userCache = new UserCache();
}
return userCache;
}
public void addCircle(Circle circle) {
if(cache == null || !CACHE_ON) {
return;
}
if(logger.isLoggable(Level.FINE)) {
logger.log(Level.FINE, "Saving permission circle: "+circle);
}
StringBuilder builder = MyServiceImpl.getStringBuilder();
builder.append(PREFIX_CIRCLE);
builder.append("_");
builder.append(circle.getTarget());
builder.append("_");
builder.append(circle.getUid());
builder.append("_");
builder.append(circle.getFriendId());
cache.put(builder.toString(), circle);
}
public void removeCircle(Circle circle) {
if(cache == null || !CACHE_ON) {
return;
}
if(logger.isLoggable(Level.FINE)) {
logger.log(Level.FINE, "Removing permission circle: "+circle);
}
StringBuilder builder = MyServiceImpl.getStringBuilder();
builder.append(PREFIX_CIRCLE);
builder.append("_");
builder.append(circle.getTarget());
builder.append("_");
builder.append(circle.getUid());
builder.append("_");
builder.append(circle.getFriendId());
cache.remove(builder.toString());
}
public Circle getCircle(int target, String uid, String friendUid) {
if(cache == null || !CACHE_ON) {
return null;
}
StringBuilder builder = MyServiceImpl.getStringBuilder();
builder.append(PREFIX_CIRCLE);
builder.append("_");
builder.append(target);
builder.append("_");
builder.append(uid);
builder.append("_");
builder.append(friendUid);
Object obj = cache.get(builder.toString());
Circle c = null;
if(obj != null && obj instanceof Circle) {
c = (Circle)obj;
}
if(logger.isLoggable(Level.FINE)) {
logger.log(Level.FINE, "Loaded permission circle ("+target+", "+uid+", "+friendUid+"): "+c);
}
return c;
}
public UserOpenid getUser(String uid) {
if(cache == null || !CACHE_ON) {
return null;
}
if(logger.isLoggable(Level.FINE)) {
logger.log(Level.FINE, "Loading user ("+uid+")");
}
StringBuilder builder = MyServiceImpl.getStringBuilder();
builder.append(PREFIX_USER);
builder.append(uid);
Object obj = cache.get(builder.toString());
UserOpenid t = null;
if(obj != null && obj instanceof UserOpenid) {
//prodeagle counter
Counter.increment("Cache.User");
t = (UserOpenid)obj;
}
if(logger.isLoggable(Level.FINE)) {
logger.log(Level.FINE, "Loaded user: "+t);
}
return t;
}
public void setUser(UserOpenid user) {
if(cache == null || !CACHE_ON) {
return;
}
if(logger.isLoggable(Level.FINE)) {
logger.log(Level.FINE, "Saving user: "+user);
}
StringBuilder builder = MyServiceImpl.getStringBuilder();
builder.append(PREFIX_USER);
builder.append(user.getUid());
cache.put(builder.toString(), user);
}
public void removeUser(String userId) {
if(cache == null || !CACHE_ON) {
return;
}
if(logger.isLoggable(Level.FINE)) {
logger.log(Level.FINE, "Removing user, ID: "+userId);
}
StringBuilder builder = MyServiceImpl.getStringBuilder();
builder.append(PREFIX_USER);
builder.append(userId);
cache.remove(builder.toString());
}
}