package org.nutz.weixin.at.impl;
import org.nutz.weixin.at.WxAccessToken;
import org.nutz.weixin.spi.WxAccessTokenStore;
public abstract class CacheableAccessTokenStore implements WxAccessTokenStore {
protected int timeout;
protected WxAccessToken at;
protected Object lock = new Object();
@Override
public WxAccessToken get() {
if (timeout > 0) {
synchronized (lock) {
if (timeout > 0 && at != null && (System.currentTimeMillis() / 1000 - at.getExpires()) < timeout)
return at;
}
}
WxAccessToken tmp = _getAccessToken();
if (timeout > 0) {
synchronized (lock) {
at = tmp;
}
}
return tmp;
}
protected abstract WxAccessToken _getAccessToken();
protected abstract void _saveAccessToken(String token, int time);
@Override
public void save(String token, int time, long lastCacheTimeMillis) {
_saveAccessToken(token, time);
if (time > 0) {
synchronized (lock) {
at = null;
get();
}
}
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
}