package com.datascience.datastoring.adapters.kv;
import com.datascience.datastoring.Constants;
import net.spy.memcached.MemcachedClient;
import org.apache.log4j.Logger;
import java.io.IOException;
import java.util.Properties;
/**
* @Author: artur
*/
public class MemcachedDBKVStorage implements IKVStorage<String> {
private static Logger logger = Logger.getLogger(MemcachedDBKVStorage.class);
protected IKVStorage<String> storage;
protected MemcachedClient client;
protected String prefix;
protected int expirationTime;
public MemcachedDBKVStorage(MemcachedClient memcachedClient, IKVStorage<String> wrapped, String prefix, Properties properties) throws IOException {
client = memcachedClient;
this.prefix = prefix;
this.expirationTime = Integer.parseInt(properties.getProperty(Constants.MEMCACHE_EXPIRATION_TIME));
this.storage = wrapped;
}
private String prepareKey(String key){
return prefix + "_" + key;
}
@Override
public void put(String key, String value) throws Exception {
storage.put(key, value);
client.set(prepareKey(key), expirationTime, value);
}
@Override
public String get(String key) throws Exception {
Object memObj = client.get(prepareKey(key));
if (memObj != null){
return (String) memObj;
}
else {
String value = storage.get(key);
if (value != null)
put(key, value);
return value;
}
}
@Override
public void remove(String key) throws Exception {
client.delete(prepareKey(key));
storage.remove(key);
}
@Override
public boolean contains(String key) throws Exception {
return client.get(prepareKey(key)) != null || storage.contains(key);
}
@Override
public void shutdown() throws Exception {
storage.shutdown();
}
}