package pl.piotrsukiennik.whowhen.shared.memcached; import net.spy.memcached.MemcachedClient; import net.spy.memcached.OperationTimeoutException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.util.concurrent.TimeUnit; /** * @author Piotr Sukiennik */ public class MemcachedClientWrapper { public static final int MAX_EXPIRATION = 3000; private static Log LOG = LogFactory.getLog( MemcachedClientWrapper.class ); private MemcachedClient memcachedClient; public MemcachedClientWrapper( MemcachedClient memcachedClient ) { this.memcachedClient = memcachedClient; } public <T> T get( String genericKey, Class<T> outputType ) { try{ return (T) memcachedClient.get( genericKey ); } catch ( IllegalStateException ex ){ if (LOG.isErrorEnabled()){ LOG.error( "Error while obtaining object",ex); } return null; } catch ( OperationTimeoutException ex ){ if (LOG.isErrorEnabled()){ LOG.error( "Error while obtaining object",ex); } return null; } } public <T> T get( MemcachedGenericKey<T> genericKey ) { try{ return (T) memcachedClient.get( genericKey.getKey() ); } catch ( IllegalStateException ex ){ if (LOG.isErrorEnabled()){ LOG.error( "Error while obtaining object",ex); } return null; } catch ( OperationTimeoutException ex ){ if (LOG.isErrorEnabled()){ LOG.error( "Error while obtaining object",ex); } return null; } } public <T> MemcachedGenericKey<T> put( String key, T object, int expirationMillis ) { MemcachedGenericKey<T> memcachedGenericKey = new MemcachedGenericKey<T>( key, "" ); memcachedGenericKey.setExpirationTimeMillis( System.currentTimeMillis() + expirationMillis ); memcachedClient.set( key, expirationMillis, object ); return memcachedGenericKey; } public <T> MemcachedGenericKey<T> put( String key, T object ) { return put( key, object, MAX_EXPIRATION ); } public <T> MemcachedGenericKey<T> put( String key, T object, int expiration, TimeUnit unit ) { long expirationMillis = unit.convert( expiration, TimeUnit.MILLISECONDS ); return put( key, object, (int) expirationMillis ); } public <T> T pop( MemcachedGenericKey<T> genericKey ) { T result = get( genericKey ); delete( genericKey ); return result; } public <T> void delete( MemcachedGenericKey<T> genericKey ) { genericKey.setExpirationTimeMillis( -1 ); memcachedClient.delete( genericKey.getKey() ); } }