package railo.runtime.cache.eh.remote.soap; import java.net.MalformedURLException; import java.net.URL; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.xml.namespace.QName; import javax.xml.rpc.ParameterMode; import javax.xml.rpc.ServiceException; import javax.xml.rpc.encoding.TypeMapping; import org.apache.axis.Constants; import org.apache.axis.client.Call; import org.apache.axis.client.Service; import org.apache.axis.encoding.ser.BeanDeserializerFactory; import org.apache.axis.encoding.ser.BeanSerializerFactory; import railo.commons.io.cache.CacheEntry; import railo.loader.engine.CFMLEngineFactory; import railo.runtime.cache.eh.remote.Converter; import railo.runtime.cache.eh.remote.rest.RESTClient; import railo.runtime.net.rpc.TypeMappingUtil; import railo.runtime.util.Cast; public class SoapClient { //private static QName bool2 = Constants.XSD_BOOLEAN;//new QName("http://www.w3.org/2001/XMLSchema", "boolean"); private static QName string2 = Constants.XSD_STRING;//new QName("http://www.w3.org/2001/XMLSchema", "string"); private static QName element = new QName("http://soap.server.ehcache.sf.net/", "element"); private static QName cache = new QName("http://soap.server.ehcache.sf.net/", "cache"); private static QName cacheConfiguration = new QName("http://soap.server.ehcache.sf.net/", "cacheConfiguration"); private String endpoint; public SoapClient(URL endpoint) { this.endpoint=endpoint.toExternalForm(); } public static void main(String [] args) throws Exception { RESTClient.main(null); SoapClient client = new SoapClient(new URL("http://localhost:8181/soap/EhcacheWebServiceEndpoint?wsdl")); Element e = new Element(); e.setEternal(Boolean.TRUE); e.setExpirationDate(new Long(new Date().getTime()+1000000)); e.setKey("lami"); e.setMimeType("application/x-java-serialized-object"); e.setValue(Converter.toBytes("Lama")); e.setTimeToIdleSeconds(new Integer(10000)); e.setTimeToLiveSeconds(new Integer(10000)); //e.setResourceUri(resourceUri); client.put("susi", e); client.putQuiet("susi", e); } public Cache getCache(String cacheName) throws Exception { Service service = new Service(); TypeMapping tm = service.getTypeMappingRegistry().getDefaultTypeMapping(); TypeMappingUtil.registerBeanTypeMapping(tm, CacheConfiguration.class, cacheConfiguration); TypeMappingUtil.registerBeanTypeMapping(tm, Cache.class, cache); Call call = (Call) service.createCall(); call.registerTypeMapping( Cache.class, cache, BeanSerializerFactory.class, BeanDeserializerFactory.class); call.registerTypeMapping( CacheConfiguration.class, cacheConfiguration, BeanSerializerFactory.class, BeanDeserializerFactory.class); call.setTargetEndpointAddress( new java.net.URL(endpoint) ); call.setOperationName(new QName("http://soap.server.ehcache.sf.net/", "getCache")); call.addParameter("arg0", Constants.XSD_STRING, String.class, ParameterMode.IN); call.setReturnClass(Element.class); call.setReturnQName(cache); //Object ret = call.invoke( new Object[] { } ); return (Cache) call.invoke( new Object[] {cacheName } ); } public List getKeysWithExpiryCheck(String cacheName) throws MalformedURLException, RemoteException, ServiceException { Object raw=getKeysWithExpiryCheckRaw(cacheName); if(raw==null) return new ArrayList(); else if(raw instanceof String) { List list=new ArrayList(); list.add(raw); return list; } else if(raw instanceof List) { return (List) raw; } Cast caster = CFMLEngineFactory.getInstance().getCastUtil(); return caster.toList(raw,null); } private Object getKeysWithExpiryCheckRaw(String cacheName) throws MalformedURLException, RemoteException, ServiceException { Service service = new Service(); Call call = (Call) service.createCall(); QName any = new QName("http://www.w3.org/2001/XMLSchema", "anyType[0,unbounded]"); QName string = new QName("http://www.w3.org/2001/XMLSchema", "string"); call.setTargetEndpointAddress( new java.net.URL(endpoint) ); call.setOperationName(new QName("http://soap.server.ehcache.sf.net/", "getKeysWithExpiryCheck")); call.addParameter("arg0", string, String.class, ParameterMode.IN); call.setReturnType(any); return call.invoke( new Object[] {cacheName } ); } public CacheEntry get(String cacheName,String key) throws MalformedURLException, RemoteException, ServiceException { return _get(cacheName, "get", key); } public CacheEntry getQuiet(String cacheName,String key) throws MalformedURLException, RemoteException, ServiceException { return _get(cacheName, "getQuiet", key); } private CacheEntry _get(String cacheName,String method,String key) throws ServiceException, MalformedURLException, RemoteException { Service service = new Service(); Call call = (Call) service.createCall(); call.registerTypeMapping( Element.class, element, BeanSerializerFactory.class, BeanDeserializerFactory.class); call.setTargetEndpointAddress( new java.net.URL(endpoint) ); call.setOperationName(new QName("http://soap.server.ehcache.sf.net/", method)); call.addParameter("arg0", Constants.XSD_STRING, String.class, ParameterMode.IN); call.addParameter("arg1", Constants.XSD_STRING, String.class, ParameterMode.IN); call.setReturnClass(Element.class); call.setReturnQName(element); return new SoapCacheEntry((Element) call.invoke( new Object[] {cacheName,key } )); } public boolean remove(String cacheName,String key) throws MalformedURLException, RemoteException, ServiceException { return _remove(cacheName, "remove", key); } public boolean removeQuiet(String cacheName,String key) throws MalformedURLException, RemoteException, ServiceException { return _remove(cacheName, "removeQuiet", key); } private boolean _remove(String cacheName,String method,String key) throws ServiceException, MalformedURLException, RemoteException { Service service = new Service(); Call call = (Call) service.createCall(); call.registerTypeMapping( Element.class, element, BeanSerializerFactory.class, BeanDeserializerFactory.class); call.setTargetEndpointAddress( new java.net.URL(endpoint) ); call.setOperationName(new QName("http://soap.server.ehcache.sf.net/", method)); call.addParameter("arg0", Constants.XSD_STRING, String.class, ParameterMode.IN); call.addParameter("arg1", Constants.XSD_STRING, String.class, ParameterMode.IN); call.setReturnClass(boolean.class); call.setReturnQName(Constants.XSD_BOOLEAN); return ((Boolean)call.invoke( new Object[] {cacheName,key } )).booleanValue(); } public void put(String cacheName,Element element) throws MalformedURLException, RemoteException, ServiceException { _put(cacheName, "put", element); } public void putQuiet(String cacheName,Element element) throws MalformedURLException, RemoteException, ServiceException { _put(cacheName, "putQuiet", element); } private void _put(String cacheName,String method,Element el) throws ServiceException, MalformedURLException, RemoteException { Service service = new Service(); Call call = (Call) service.createCall(); el.setResourceUri(endpoint); call.registerTypeMapping( Element.class, element, BeanSerializerFactory.class, BeanDeserializerFactory.class); call.setTargetEndpointAddress( new java.net.URL(endpoint) ); call.setOperationName(new QName("http://soap.server.ehcache.sf.net/", method)); call.addParameter("arg0", Constants.XSD_STRING, String.class, ParameterMode.IN); call.addParameter("arg1", element, Element.class, ParameterMode.IN); call.setReturnType(Constants.XSD_ANYSIMPLETYPE); call.invoke( new Object[] {cacheName,el } ); //call.invokeOneWay(new Object[] {cacheName,el } ); } }