Skip to content

Commit 9d11d40

Browse files
committed
DATAREDIS-719 - Polishing.
Fix generics for accepted Future, Supplier and Converter. Introduce generics for status responses. Add Javadoc, use synchronous API for exists call. Original pull request: #289.
1 parent 6353c5a commit 9d11d40

File tree

8 files changed

+230
-180
lines changed

8 files changed

+230
-180
lines changed

src/main/java/org/springframework/data/redis/connection/FutureResult.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626
* @author Jennifer Hickey
2727
* @author Christoph Strobl
2828
* @author Mark Paluch
29-
* @param <T> The data type of the object that holds the future result (usually of type Future)
29+
* @param <T> The data type of the object that holds the future result (usually type of the
30+
* {@link java.util.concurrent.Future} or response wrapper).
3031
*/
3132
public abstract class FutureResult<T> {
3233

@@ -36,7 +37,7 @@ public abstract class FutureResult<T> {
3637
private boolean status = false;
3738

3839
@SuppressWarnings("rawtypes") //
39-
protected @Nullable Converter converter;
40+
protected Converter converter;
4041

4142
/**
4243
* Create new {@link FutureResult} for given object actually holding the result itself.
@@ -70,7 +71,6 @@ public FutureResult(T resultHolder, @Nullable Converter converter) {
7071
* @param defaultConversionResult must not be {@literal null}.
7172
* @since 2.1
7273
*/
73-
@SuppressWarnings("rawtypes")
7474
public FutureResult(T resultHolder, @Nullable Converter converter, Supplier<?> defaultConversionResult) {
7575

7676
this.resultHolder = resultHolder;
@@ -99,7 +99,7 @@ public T getResultHolder() {
9999
public Object convert(@Nullable Object result) {
100100

101101
if (result == null) {
102-
return computeDefaultResult(result);
102+
return computeDefaultResult(null);
103103
}
104104

105105
return computeDefaultResult(converter.convert(result));
@@ -140,8 +140,8 @@ public void setStatus(boolean status) {
140140
/**
141141
* Indicate whether or not the actual result needs to be {@link #convert(Object) converted} before handing over.
142142
*
143-
* @return
143+
* @return {@literal true} if result conversion is required.
144144
* @since 2.1
145145
*/
146-
public abstract boolean seeksConversion();
146+
public abstract boolean conversionRequired();
147147
}

src/main/java/org/springframework/data/redis/connection/convert/TransactionResultConverter.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
package org.springframework.data.redis.connection.convert;
1717

1818
import java.util.ArrayList;
19-
import java.util.LinkedList;
2019
import java.util.List;
2120
import java.util.Queue;
2221

@@ -31,13 +30,13 @@
3130
*
3231
* @author Jennifer Hickey
3332
* @author Christoph Strobl
33+
* @author Mark Paluch
3434
* @param <T> The type of {@link FutureResult} of the individual tx operations
3535
*/
3636
public class TransactionResultConverter<T> implements Converter<List<Object>, List<Object>> {
3737

38-
private Queue<FutureResult<T>> txResults = new LinkedList<>();
39-
40-
private Converter<Exception, DataAccessException> exceptionConverter;
38+
private final Queue<FutureResult<T>> txResults;
39+
private final Converter<Exception, DataAccessException> exceptionConverter;
4140

4241
public TransactionResultConverter(Queue<FutureResult<T>> txResults,
4342
Converter<Exception, DataAccessException> exceptionConverter) {
@@ -71,7 +70,7 @@ public List<Object> convert(List<Object> execResults) {
7170
: new RedisSystemException("Error reading future result.", source);
7271
}
7372
if (!(futureResult.isStatus())) {
74-
convertedResults.add(futureResult.seeksConversion() ? futureResult.convert(result) : result);
73+
convertedResults.add(futureResult.conversionRequired() ? futureResult.convert(result) : result);
7574
}
7675
}
7776

src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,7 @@ private List<Object> convertPipelineResults() {
453453
Object data = result.get();
454454

455455
if (!result.isStatus()) {
456-
results.add(result.seeksConversion() ? result.convert(data) : data);
456+
results.add(result.conversionRequired() ? result.convert(data) : data);
457457
}
458458
} catch (JedisDataException e) {
459459
DataAccessException dataAccessException = convertJedisAccessException(e);
@@ -618,16 +618,16 @@ JedisResult newJedisResult(Response<?> response) {
618618
return JedisResultBuilder.forResponse(response).build();
619619
}
620620

621-
<T> JedisResult newJedisResult(Response<T> response, Converter<T, ?> converter) {
621+
<T, R> JedisResult newJedisResult(Response<T> response, Converter<T, R> converter) {
622622

623-
return JedisResultBuilder.forResponse(response).mappedWith(converter)
623+
return JedisResultBuilder.<T, R> forResponse(response).mappedWith(converter)
624624
.convertPipelineAndTxResults(convertPipelineAndTxResults).build();
625625
}
626626

627-
<T> JedisResult newJedisResult(Response<T> response, Converter<T, ?> converter, Supplier<?> defaultValue) {
627+
<T, R> JedisResult newJedisResult(Response<T> response, Converter<T, R> converter, Supplier<R> defaultValue) {
628628

629-
return JedisResultBuilder.forResponse(response).mappedWith(converter)
630-
.convertPipelineAndTxResults(convertPipelineAndTxResults).defaultNullTo(defaultValue).build();
629+
return JedisResultBuilder.<T, R> forResponse(response).mappedWith(converter)
630+
.convertPipelineAndTxResults(convertPipelineAndTxResults).mapNullTo(defaultValue).build();
631631
}
632632

633633
JedisStatusResult newStatusResult(Response<?> response) {

src/main/java/org/springframework/data/redis/connection/jedis/JedisResult.java

Lines changed: 56 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,23 @@
3030
* @author Jennifer Hickey
3131
* @author Christoph Strobl
3232
* @author Mark Paluch
33+
* @param <T> The data type of the object that holds the future result (usually of type Future).
34+
* @param <R> The data type of the result type.
3335
* @since 2.1
3436
*/
35-
class JedisResult<T, S> extends FutureResult<Response<?>> {
37+
class JedisResult<T, R> extends FutureResult<Response<?>> {
3638

3739
private final boolean convertPipelineAndTxResults;
3840

39-
<T> JedisResult(Response<T> resultHolder) {
41+
JedisResult(Response<T> resultHolder) {
4042
this(resultHolder, false, null);
4143
}
4244

43-
<T> JedisResult(Response<T> resultHolder, boolean convertPipelineAndTxResults, @Nullable Converter<T, ?> converter) {
44-
this(resultHolder, null, convertPipelineAndTxResults, converter);
45+
JedisResult(Response<T> resultHolder, boolean convertPipelineAndTxResults, @Nullable Converter<T, ?> converter) {
46+
this(resultHolder, () -> null, convertPipelineAndTxResults, converter);
4547
}
4648

47-
<T> JedisResult(Response<T> resultHolder, Supplier<S> defaultReturnValue, boolean convertPipelineAndTxResults,
49+
JedisResult(Response<T> resultHolder, Supplier<R> defaultReturnValue, boolean convertPipelineAndTxResults,
4850
@Nullable Converter<T, ?> converter) {
4951

5052
super(resultHolder, converter, defaultReturnValue);
@@ -58,25 +60,26 @@ <T> JedisResult(Response<T> resultHolder, Supplier<S> defaultReturnValue, boolea
5860
*/
5961
@Nullable
6062
@Override
63+
@SuppressWarnings("unchecked")
6164
public T get() {
6265
return (T) getResultHolder().get();
6366
}
6467

6568
/*
6669
* (non-Javadoc)
67-
* @see org.springframework.data.redis.connection.FutureResult#seeksConversion()
68-
* @return
70+
* @see org.springframework.data.redis.connection.FutureResult#conversionRequired()
6971
*/
70-
public boolean seeksConversion() {
71-
return convertPipelineAndTxResults && converter != null;
72+
public boolean conversionRequired() {
73+
return convertPipelineAndTxResults;
7274
}
7375

7476
/**
7577
* Jedis specific {@link FutureResult} implementation of a throw away status result.
7678
*/
77-
static class JedisStatusResult extends JedisResult {
79+
static class JedisStatusResult<T, R> extends JedisResult<T, R> {
7880

79-
<T> JedisStatusResult(Response<T> resultHolder, Converter<T, ?> converter) {
81+
@SuppressWarnings("unchecked")
82+
JedisStatusResult(Response<T> resultHolder, Converter<T, R> converter) {
8083

8184
super(resultHolder, false, converter);
8285
setStatus(true);
@@ -87,54 +90,77 @@ <T> JedisStatusResult(Response<T> resultHolder, Converter<T, ?> converter) {
8790
* Builder for constructing {@link JedisResult}.
8891
*
8992
* @param <T>
90-
* @param <S>
93+
* @param <R>
9194
* @since 2.1
9295
*/
93-
static class JedisResultBuilder<T, S> {
96+
static class JedisResultBuilder<T, R> {
9497

9598
private final Response<T> response;
96-
private Converter<T, ?> converter;
99+
private Converter<T, R> converter;
97100
private boolean convertPipelineAndTxResults = false;
98-
private Supplier<?> nullValueDefault = () -> null;
101+
private Supplier<R> nullValueDefault = () -> null;
99102

103+
@SuppressWarnings("unchecked")
100104
JedisResultBuilder(Response<T> response) {
101105

102106
this.response = response;
103-
this.converter = (source) -> source;
107+
this.converter = (source) -> (R) source;
104108
}
105109

106-
static <T> JedisResultBuilder<T, ?> forResponse(Response<T> response) {
110+
/**
111+
* Create a new {@link JedisResultBuilder} given {@link Response}.
112+
*
113+
* @param response must not be {@literal null}.
114+
* @param <T> native response type.
115+
* @param <R> resulting response type.
116+
* @return the new {@link JedisResultBuilder}.
117+
*/
118+
static <T, R> JedisResultBuilder<T, R> forResponse(Response<T> response) {
107119
return new JedisResultBuilder<>(response);
108120
}
109121

110-
<S> JedisResultBuilder<T, S> mappedWith(Converter<T, S> converter) {
122+
/**
123+
* Configure a {@link Converter} to convert between {@code T} and {@code R} types.
124+
*
125+
* @param converter must not be {@literal null}.
126+
* @return {@code this} builder.
127+
*/
128+
JedisResultBuilder<T, R> mappedWith(Converter<T, R> converter) {
111129

112130
this.converter = converter;
113-
return (JedisResultBuilder<T, S>) this;
114-
}
115-
116-
<S> JedisResultBuilder<T, S> defaultNullTo(S value) {
117-
return (defaultNullTo(() -> value));
131+
return this;
118132
}
119133

120-
<S> JedisResultBuilder<T, S> defaultNullTo(Supplier<S> value) {
134+
/**
135+
* Configure a {@link Supplier} to map {@literal null} responses to a different value.
136+
*
137+
* @param supplier must not be {@literal null}.
138+
* @return {@code this} builder.
139+
*/
140+
JedisResultBuilder<T, R> mapNullTo(Supplier<R> supplier) {
121141

122-
this.nullValueDefault = value;
123-
return (JedisResultBuilder<T, S>) this;
142+
this.nullValueDefault = supplier;
143+
return this;
124144
}
125145

126-
JedisResultBuilder<T, S> convertPipelineAndTxResults(boolean flag) {
146+
JedisResultBuilder<T, R> convertPipelineAndTxResults(boolean flag) {
127147

128148
convertPipelineAndTxResults = flag;
129149
return this;
130150
}
131151

132-
JedisResult<T, S> build() {
133-
return new JedisResult(response, nullValueDefault, convertPipelineAndTxResults, converter);
152+
/**
153+
* @return a new {@link JedisResult} wrapper with configuration applied from this builder.
154+
*/
155+
JedisResult<T, R> build() {
156+
return new JedisResult<>(response, nullValueDefault, convertPipelineAndTxResults, converter);
134157
}
135158

159+
/**
160+
* @return a new {@link JedisStatusResult} wrapper for status results with configuration applied from this builder.
161+
*/
136162
JedisStatusResult buildStatusResult() {
137-
return new JedisStatusResult(response, converter);
163+
return new JedisStatusResult<>(response, converter);
138164
}
139165
}
140166
}

0 commit comments

Comments
 (0)