Skip to content

Commit 0104881

Browse files
author
Carter Kozak
committed
tidy up
1 parent 93913a7 commit 0104881

File tree

2 files changed

+77
-10
lines changed

2 files changed

+77
-10
lines changed

errors/src/main/java/com/palantir/conjure/java/api/errors/QosReasons.java

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,22 @@ public final class QosReasons {
2727
private static final String DUE_TO_HEADER = "Qos-Due-To";
2828
private static final String RETRY_HINT_HEADER = "Qos-Retry-Hint";
2929

30+
private static final String DUE_TO_CUSTOM_HEADER_VALUE = "custom";
31+
private static final String RETRY_HINT_PROPAGATE_HEADER_VALUE = "propagate";
32+
3033
public static <T> void encodeToResponse(
3134
QosReason reason, T response, QosResponseEncodingAdapter<? super T> adapter) {
32-
reason.dueTo().ifPresent(dueTo -> adapter.setHeader(response, DUE_TO_HEADER, dueTo.name()));
33-
reason.retryHint().ifPresent(retryHint -> adapter.setHeader(response, RETRY_HINT_HEADER, retryHint.name()));
35+
// Likely hot path, avoid ifPresent lambda
36+
if (reason.dueTo().isPresent()) {
37+
adapter.setHeader(
38+
response, DUE_TO_HEADER, toHeaderValue(reason.dueTo().get()));
39+
}
40+
if (reason.retryHint().isPresent()) {
41+
adapter.setHeader(
42+
response,
43+
RETRY_HINT_HEADER,
44+
toHeaderValue(reason.retryHint().get()));
45+
}
3446
}
3547

3648
public static <T> QosReason parseFromResponse(T response, QosResponseDecodingAdapter<? super T> adapter) {
@@ -41,8 +53,8 @@ public static <T> QosReason parseFromResponse(T response, QosResponseDecodingAda
4153
}
4254
return QosReason.builder()
4355
.reason(CLIENT_REASON)
44-
.dueTo(maybeDueTo.flatMap(value -> parse(DueTo.class, value)))
45-
.retryHint(maybeRetryHint.flatMap(value -> parse(RetryHint.class, value)))
56+
.dueTo(maybeDueTo.flatMap(QosReasons::parseDueTo))
57+
.retryHint(maybeRetryHint.flatMap(QosReasons::parseRetryHint))
4658
.build();
4759
}
4860

@@ -54,12 +66,34 @@ public interface QosResponseDecodingAdapter<RESPONSE> {
5466
Optional<String> getFirstHeader(RESPONSE response, String headerName);
5567
}
5668

57-
private static <T extends Enum<T>> Optional<T> parse(Class<T> type, String value) {
58-
try {
59-
return Optional.of(Enum.valueOf(type, value));
60-
} catch (IllegalArgumentException ignored) {
61-
return Optional.empty();
69+
// VisibleForTesting
70+
static Optional<DueTo> parseDueTo(String dueTo) {
71+
if (DUE_TO_CUSTOM_HEADER_VALUE.equalsIgnoreCase(dueTo)) {
72+
return Optional.of(DueTo.CUSTOM);
73+
}
74+
return Optional.empty();
75+
}
76+
77+
// VisibleForTesting
78+
static Optional<RetryHint> parseRetryHint(String retryHint) {
79+
if (RETRY_HINT_PROPAGATE_HEADER_VALUE.equalsIgnoreCase(retryHint)) {
80+
return Optional.of(RetryHint.PROPAGATE);
6281
}
82+
return Optional.empty();
83+
}
84+
85+
// VisibleForTesting
86+
static String toHeaderValue(DueTo dueTo) {
87+
return switch (dueTo) {
88+
case CUSTOM -> DUE_TO_CUSTOM_HEADER_VALUE;
89+
};
90+
}
91+
92+
// VisibleForTesting
93+
static String toHeaderValue(RetryHint retryHint) {
94+
return switch (retryHint) {
95+
case PROPAGATE -> RETRY_HINT_PROPAGATE_HEADER_VALUE;
96+
};
6397
}
6498

6599
private QosReasons() {}

errors/src/test/java/com/palantir/conjure/java/api/errors/QosReasonsTest.java

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.util.HashMap;
2525
import java.util.Map;
2626
import java.util.Optional;
27+
import org.assertj.core.api.SoftAssertions;
2728
import org.junit.jupiter.api.Test;
2829

2930
class QosReasonsTest {
@@ -45,7 +46,7 @@ public void testReasonWithFields() {
4546
.retryHint(RetryHint.PROPAGATE)
4647
.build();
4748
QosReasons.encodeToResponse(reason, headers, Encoder.INSTANCE);
48-
assertThat(headers).isEqualTo(ImmutableMap.of("Qos-Due-To", "CUSTOM", "Qos-Retry-Hint", "PROPAGATE"));
49+
assertThat(headers).isEqualTo(ImmutableMap.of("Qos-Due-To", "custom", "Qos-Retry-Hint", "propagate"));
4950
}
5051

5152
@Test
@@ -66,6 +67,38 @@ public void testRoundTrip() {
6667
.build());
6768
}
6869

70+
@Test
71+
public void dueToRoundTrip() {
72+
SoftAssertions softly = new SoftAssertions();
73+
for (DueTo expected : DueTo.values()) {
74+
Optional<DueTo> actual = QosReasons.parseDueTo(QosReasons.toHeaderValue(expected));
75+
softly.assertThat(actual).hasValue(expected);
76+
}
77+
softly.assertAll();
78+
}
79+
80+
@Test
81+
public void dueToCaseSensitivity() {
82+
assertThat(QosReasons.parseDueTo("custom")).hasValue(DueTo.CUSTOM);
83+
assertThat(QosReasons.parseDueTo("CUSTOM")).hasValue(DueTo.CUSTOM);
84+
}
85+
86+
@Test
87+
public void retryHintRoundTrip() {
88+
SoftAssertions softly = new SoftAssertions();
89+
for (RetryHint expected : RetryHint.values()) {
90+
Optional<RetryHint> actual = QosReasons.parseRetryHint(QosReasons.toHeaderValue(expected));
91+
softly.assertThat(actual).hasValue(expected);
92+
}
93+
softly.assertAll();
94+
}
95+
96+
@Test
97+
public void retryHintCaseSensitivity() {
98+
assertThat(QosReasons.parseRetryHint("propagate")).hasValue(RetryHint.PROPAGATE);
99+
assertThat(QosReasons.parseRetryHint("PROPAGATE")).hasValue(RetryHint.PROPAGATE);
100+
}
101+
69102
private enum Encoder implements QosReasons.QosResponseEncodingAdapter<Map<String, String>> {
70103
INSTANCE;
71104

0 commit comments

Comments
 (0)