diff --git a/src/main/java/net/spy/memcached/ArcusClientPool.java b/src/main/java/net/spy/memcached/ArcusClientPool.java index 5b307a4bf..f2f7ff660 100644 --- a/src/main/java/net/spy/memcached/ArcusClientPool.java +++ b/src/main/java/net/spy/memcached/ArcusClientPool.java @@ -234,12 +234,12 @@ public GetFuture asyncGet(String key) { } @Override - public OperationFuture> asyncGets(String key, Transcoder tc) { + public GetFuture> asyncGets(String key, Transcoder tc) { return this.getClient().asyncGets(key, tc); } @Override - public OperationFuture> asyncGets(String key) { + public GetFuture> asyncGets(String key) { return this.getClient().asyncGets(key); } diff --git a/src/main/java/net/spy/memcached/MemcachedClient.java b/src/main/java/net/spy/memcached/MemcachedClient.java index a4887897c..54a46b221 100644 --- a/src/main/java/net/spy/memcached/MemcachedClient.java +++ b/src/main/java/net/spy/memcached/MemcachedClient.java @@ -51,7 +51,9 @@ import net.spy.memcached.internal.GetFuture; import net.spy.memcached.internal.OperationFuture; import net.spy.memcached.internal.SingleElementInfiniteIterator; +import net.spy.memcached.internal.result.CASGetResultImpl; import net.spy.memcached.internal.result.GetResult; +import net.spy.memcached.internal.result.GetResultImpl; import net.spy.memcached.ops.CASOperationStatus; import net.spy.memcached.ops.CancelledOperationStatus; import net.spy.memcached.ops.ConcatenationType; @@ -892,7 +894,7 @@ public GetFuture asyncGet(final String key, final Transcoder tc) { Operation op = opFact.get(key, new GetOperation.Callback() { - private final GetResult result = new GetResult(tc); + private final GetResultImpl result = new GetResultImpl(tc); public void receivedStatus(OperationStatus status) { future.set(result, status); @@ -935,16 +937,15 @@ public GetFuture asyncGet(final String key) { * @throws IllegalStateException in the rare circumstance where queue * is too full to accept any more requests */ - public OperationFuture> asyncGets(final String key, + public GetFuture> asyncGets(final String key, final Transcoder tc) { final CountDownLatch latch = new CountDownLatch(1); - final OperationFuture> rv = - new OperationFuture>(latch, operationTimeout); + final GetFuture> rv = new GetFuture>(latch, operationTimeout); Operation op = opFact.gets(key, new GetsOperation.Callback() { - private CASValue val = null; + private GetResult> val = null; public void receivedStatus(OperationStatus status) { rv.set(val, status); @@ -953,8 +954,7 @@ public void receivedStatus(OperationStatus status) { public void gotData(String k, int flags, long cas, byte[] data) { assert key.equals(k) : "Wrong key returned"; assert cas > 0 : "CAS was less than zero: " + cas; - val = new CASValue(cas, tc.decode( - new CachedData(flags, data, tc.getMaxSize()))); + val = new CASGetResultImpl(cas, new CachedData(flags, data, tc.getMaxSize()), tc); } public void complete() { @@ -975,7 +975,7 @@ public void complete() { * @throws IllegalStateException in the rare circumstance where queue * is too full to accept any more requests */ - public OperationFuture> asyncGets(final String key) { + public GetFuture> asyncGets(final String key) { return asyncGets(key, transcoder); } @@ -992,7 +992,7 @@ public OperationFuture> asyncGets(final String key) { * is too full to accept any more requests */ public CASValue gets(String key, Transcoder tc) { - OperationFuture> future = asyncGets(key, tc); + GetFuture> future = asyncGets(key, tc); try { return future.get(operationTimeout, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { diff --git a/src/main/java/net/spy/memcached/internal/result/CASGetResultImpl.java b/src/main/java/net/spy/memcached/internal/result/CASGetResultImpl.java new file mode 100644 index 000000000..ce79f9449 --- /dev/null +++ b/src/main/java/net/spy/memcached/internal/result/CASGetResultImpl.java @@ -0,0 +1,28 @@ +package net.spy.memcached.internal.result; + +import net.spy.memcached.CASValue; +import net.spy.memcached.CachedData; +import net.spy.memcached.transcoders.Transcoder; + +public class CASGetResultImpl implements GetResult> { + + private final long cas; + private final CachedData cachedData; + private final Transcoder transcoder; + private volatile CASValue decodedValue = null; + + public CASGetResultImpl(long cas, CachedData cachedData, Transcoder transcoder) { + this.cas = cas; + this.cachedData = cachedData; + this.transcoder = transcoder; + } + + @Override + public CASValue getDecodedValue() { + if (decodedValue == null) { + decodedValue = new CASValue(cas, transcoder.decode(cachedData)); + } + + return decodedValue; + } +} diff --git a/src/main/java/net/spy/memcached/internal/result/GetResult.java b/src/main/java/net/spy/memcached/internal/result/GetResult.java index ff54c9d6f..f901fb424 100644 --- a/src/main/java/net/spy/memcached/internal/result/GetResult.java +++ b/src/main/java/net/spy/memcached/internal/result/GetResult.java @@ -1,31 +1,5 @@ package net.spy.memcached.internal.result; -import net.spy.memcached.CachedData; -import net.spy.memcached.transcoders.Transcoder; - -public final class GetResult { - private final Transcoder transcoder; - - private volatile CachedData cachedData = null; - private volatile T decodedValue = null; - - public GetResult(Transcoder transcoder) { - this.transcoder = transcoder; - } - - public void setCachedData(CachedData cachedData) { - this.cachedData = cachedData; - } - - public T getDecodedValue() { - if (cachedData == null) { - return null; - } - - if (decodedValue == null) { - decodedValue = transcoder.decode(cachedData); - } - - return decodedValue; - } +public interface GetResult { + T getDecodedValue(); } diff --git a/src/main/java/net/spy/memcached/internal/result/GetResultImpl.java b/src/main/java/net/spy/memcached/internal/result/GetResultImpl.java new file mode 100644 index 000000000..d1471abf2 --- /dev/null +++ b/src/main/java/net/spy/memcached/internal/result/GetResultImpl.java @@ -0,0 +1,30 @@ +package net.spy.memcached.internal.result; + +import net.spy.memcached.CachedData; +import net.spy.memcached.transcoders.Transcoder; + +public class GetResultImpl implements GetResult { + private final Transcoder transcoder; + protected volatile CachedData cachedData = null; + protected volatile T decodedValue = null; + + public GetResultImpl(Transcoder transcoder) { + this.transcoder = transcoder; + } + + public void setCachedData(CachedData cachedData) { + this.cachedData = cachedData; + } + + public T getDecodedValue() { + if (cachedData == null) { + return null; + } + + if (decodedValue == null) { + decodedValue = transcoder.decode(cachedData); + } + + return decodedValue; + } +}