package railo.runtime.cache.eh.remote;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import javax.xml.rpc.ServiceException;
import railo.commons.io.cache.CacheEntry;
import railo.loader.engine.CFMLEngineFactory;
import railo.runtime.cache.CacheSupport;
import railo.runtime.cache.eh.remote.rest.RESTClient;
import railo.runtime.cache.eh.remote.rest.sax.CacheConfiguration;
import railo.runtime.cache.eh.remote.soap.Element;
import railo.runtime.cache.eh.remote.soap.SoapClient;
import railo.runtime.config.Config;
import railo.runtime.config.ConfigWeb;
import railo.runtime.exp.PageException;
import railo.runtime.type.Struct;
import railo.runtime.type.util.KeyConstants;
import railo.runtime.util.Cast;
public class EHCacheRemote extends CacheSupport {
private URL url;
private String name;
private RESTClient rest;
private SoapClient soap;
public EHCacheRemote() {
}
public static void init(ConfigWeb config,String[] cacheNames,Struct[] arguments) {
}
public void init(Config config,String name, Struct arguments) throws IOException {
Cast caster = CFMLEngineFactory.getInstance().getCastUtil();
String strUrl=null;
try {
strUrl=caster.toString(arguments.get("url"));
this.name=caster.toString(arguments.get("remoteCacheName"));
} catch (PageException e) {
throw new IOException(e.getMessage());
}
if(!strUrl.endsWith("/")){
strUrl=strUrl+"/";
}
this.url=new URL(strUrl);
this.rest=new RESTClient(new URL(url.toExternalForm()+"rest/"));
this.soap=new SoapClient(new URL(url.toExternalForm()+"soap/EhcacheWebServiceEndpoint?wsdl"));
}
@Override
public boolean contains(String key) {
try {
return rest.contains(name, key);
} catch (IOException e) {
return false;
}
}
@Override
public List keys() {
try {
return soap.getKeysWithExpiryCheck(name);
}
catch (Throwable t) {
throw new RuntimeException(t);
}
}
public CacheEntry getQuiet(String key) throws IOException {
try {
return soap.getQuiet(name, key);
}
catch (ServiceException e) {
throw new IOException(e.getMessage());
}
}
public CacheEntry getQuiet(String key,CacheEntry defaultValue) {
try {
return soap.getQuiet(name, key);
}
catch (Throwable t) {
return defaultValue;
}
}
public CacheEntry getCacheEntry(String key) throws IOException {
try {
return soap.get(name, key);
}
catch (ServiceException e) {
throw new IOException(e.getMessage());
}
}
public CacheEntry getCacheEntry(String key,CacheEntry defaultValue) {
try {
return soap.get(name, key);
}
catch (Throwable t) {
return defaultValue;
}
}
public Struct getCustomInfo() {
Struct info=super.getCustomInfo();
try {
CacheConfiguration conf = rest.getMeta(name).getCacheConfiguration();
info.setEL("disk_expiry_thread_interval", new Double(conf.getDiskExpiryThreadIntervalSeconds()));
info.setEL("disk_spool_buffer_size", new Double(conf.getDiskSpoolBufferSize()));
info.setEL("max_elements_in_memory", new Double(conf.getMaxElementsInMemory()));
info.setEL("max_elements_on_disk", new Double(conf.getMaxElementsOnDisk()));
info.setEL("time_to_idle", new Double(conf.getTimeToIdleSeconds()));
info.setEL("time_to_live", new Double(conf.getTimeToLiveSeconds()));
info.setEL(KeyConstants._name, conf.getName());
}
catch(Throwable t){
//print.printST(t);
}
return info;
}
public long hitCount() {
// TODO Auto-generated method stub
return 0;
}
public long missCount() {
// TODO Auto-generated method stub
return 0;
}
public void put(String key, Object value, Long idleTime, Long liveTime) {
Boolean eternal = idleTime==null && liveTime==null?Boolean.TRUE:Boolean.FALSE;
Integer idle = idleTime==null?null:new Integer((int)idleTime.longValue()/1000);
Integer live = liveTime==null?null:new Integer((int)liveTime.longValue()/1000);
try {
Element el = new Element();
el.setKey(key);
// TODO make text/plain for string
el.setMimeType("application/x-java-serialized-object");
el.setValue(Converter.toBytes(value));
el.setEternal(eternal);
el.setTimeToIdleSeconds(idle);
el.setTimeToLiveSeconds(live);
soap.put(name,el);
} catch (Throwable t) {
throw new RuntimeException(t);
}
}
@Override
public boolean remove(String key) {
try {
return soap.remove(name, key);
}
catch (Exception e) {
return false;
}
}
}