package com.mossle.user.avatar;
import java.util.HashSet;
import java.util.Set;
import javax.activation.DataSource;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.cache.Cache;
import javax.cache.CacheManager;
import com.mossle.core.store.ByteArrayDataSource;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class AvatarCache {
private static Logger logger = LoggerFactory.getLogger(AvatarCache.class);
private CacheManager cacheManager;
private Cache<String, byte[]> dataCache;
private Cache<String, Set<String>> aliasCache;
@PostConstruct
public void init() {
this.dataCache = cacheManager.getCache("avatar");
this.aliasCache = cacheManager.getCache("avatar-alias");
}
public DataSource getDataSource(String userId, int width) {
String key = userId + ":" + width;
byte[] bytes = this.dataCache.get(key);
if (bytes == null) {
return null;
}
return new ByteArrayDataSource(bytes);
}
public void updateDataSource(String userId, int width, DataSource dataSource) {
try {
String key = userId + ":" + width;
byte[] bytes = IOUtils.toByteArray(dataSource.getInputStream());
Set<String> aliasValue = this.aliasCache.get(userId);
if (aliasValue == null) {
aliasValue = new HashSet<String>();
this.aliasCache.put(userId, aliasValue);
}
aliasValue.add(key);
this.dataCache.put(key, bytes);
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
}
}
public void removeDataSource(String userId) {
Set<String> aliasValue = this.aliasCache.get(userId);
if (aliasValue == null) {
return;
}
for (String alias : aliasValue) {
this.dataCache.remove(alias);
}
}
@Resource
public void setCacheManager(CacheManager cacheManager) {
this.cacheManager = cacheManager;
}
}