package hprose.example.invokehandler.cache;
import hprose.common.HproseContext;
import hprose.common.InvokeHandler;
import hprose.common.NextInvokeHandler;
import hprose.util.concurrent.Promise;
import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class CacheHandler implements InvokeHandler {
private final Map<String, Map<String, Promise<Object>>> cache = new ConcurrentHashMap<>();
@Override
public Promise<Object> handle(String name, Object[] args, HproseContext context, NextInvokeHandler next) {
if (context.getBoolean("cache")) {
String key = Arrays.deepToString(args);
if (cache.containsKey(name)) {
if (cache.get(name).containsKey(key)) {
return cache.get(name).get(key);
}
}
else {
cache.put(name, new ConcurrentHashMap<>());
}
Promise<Object> result = next.handle(name, args, context);
cache.get(name).put(key, result);
return result;
}
return next.handle(name, args, context);
}
}