Skip to content

Commit b25cc24

Browse files
author
Brian Laub
committed
refactor DeadlineExpiredException to use nested subclass types
1 parent f9d3058 commit b25cc24

File tree

3 files changed

+49
-35
lines changed

3 files changed

+49
-35
lines changed

deadlines-api/src/main/java/com/palantir/deadlines/api/DeadlineExpiredException.java

Lines changed: 43 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -18,41 +18,60 @@
1818

1919
import com.palantir.logsafe.Arg;
2020
import com.palantir.logsafe.Safe;
21-
import com.palantir.logsafe.SafeArg;
2221
import com.palantir.logsafe.SafeLoggable;
2322
import java.util.List;
2423

2524
/**
2625
* Indicates that a deadline has expired.
2726
*/
28-
public final class DeadlineExpiredException extends RuntimeException implements SafeLoggable {
29-
private static final String MESSAGE = "A deadline for completing work has expired.";
30-
private final List<Arg<?>> args;
31-
private final boolean internal;
32-
33-
/**
34-
* Create a new DeadlineExpiredException.
35-
*
36-
* @param internal true if this is expiration was for an internally-sourced deadline (such as one assigned
37-
* internally by a server), or false if it was for a externally-sourced deadline (such as one provided by a
38-
* client in a request header)
39-
*/
40-
public DeadlineExpiredException(boolean internal) {
41-
this.args = List.of(SafeArg.of("internal", internal));
42-
this.internal = internal;
27+
public abstract class DeadlineExpiredException extends RuntimeException {
28+
private DeadlineExpiredException(String message) {
29+
super(message);
4330
}
4431

45-
@Override
46-
public @Safe String getLogMessage() {
47-
return MESSAGE;
32+
public static External external() {
33+
return new External();
4834
}
4935

50-
@Override
51-
public List<Arg<?>> getArgs() {
52-
return args;
36+
public static Internal internal() {
37+
return new Internal();
5338
}
5439

55-
public boolean isInternal() {
56-
return internal;
40+
public static final class External extends DeadlineExpiredException implements SafeLoggable {
41+
private static final String MESSAGE = "An externally provided deadline for completing work has expired.";
42+
private static final List<Arg<?>> ARGS = List.of();
43+
44+
private External() {
45+
super(MESSAGE);
46+
}
47+
48+
@Override
49+
public @Safe String getLogMessage() {
50+
return MESSAGE;
51+
}
52+
53+
@Override
54+
public List<Arg<?>> getArgs() {
55+
return ARGS;
56+
}
57+
}
58+
59+
public static final class Internal extends DeadlineExpiredException implements SafeLoggable {
60+
private static final String MESSAGE = "An internal deadline for completing work has expired.";
61+
private static final List<Arg<?>> ARGS = List.of();
62+
63+
private Internal() {
64+
super(MESSAGE);
65+
}
66+
67+
@Override
68+
public @Safe String getLogMessage() {
69+
return MESSAGE;
70+
}
71+
72+
@Override
73+
public List<Arg<?>> getArgs() {
74+
return ARGS;
75+
}
5776
}
5877
}

deadlines/src/main/java/com/palantir/deadlines/Deadlines.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,10 @@ private static void checkExpiration(long deadline, boolean internal) {
170170
// expired
171171
Expired_Cause cause = internal ? Expired_Cause.INTERNAL : Expired_Cause.EXTERNAL;
172172
metrics.expired(cause).mark();
173-
throw new DeadlineExpiredException(internal);
173+
if (internal) {
174+
throw DeadlineExpiredException.internal();
175+
}
176+
throw DeadlineExpiredException.external();
174177
}
175178
}
176179

deadlines/src/test/java/com/palantir/deadlines/DeadlinesTest.java

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -190,11 +190,7 @@ public void test_encode_to_request_expiration_external_deadline() {
190190
Map<String, String> outbound = new HashMap<>();
191191
assertThatThrownBy(() ->
192192
Deadlines.encodeToRequest(Duration.ofSeconds(10), outbound, DummyRequestEncoder.INSTANCE))
193-
.isInstanceOf(DeadlineExpiredException.class)
194-
.satisfies(t -> {
195-
DeadlineExpiredException exc = (DeadlineExpiredException) t;
196-
assertThat(exc.isInternal()).isFalse();
197-
});
193+
.isInstanceOf(DeadlineExpiredException.External.class);
198194

199195
assertThat(externalMeter.getCount()).isGreaterThan(originalExternalValue);
200196
assertThat(internalMeter.getCount()).isEqualTo(originalInternalValue);
@@ -226,11 +222,7 @@ public void test_encode_to_request_expiration_internal_deadline() {
226222
Map<String, String> outbound = new HashMap<>();
227223
assertThatThrownBy(() ->
228224
Deadlines.encodeToRequest(Duration.ofSeconds(10), outbound, DummyRequestEncoder.INSTANCE))
229-
.isInstanceOf(DeadlineExpiredException.class)
230-
.satisfies(t -> {
231-
DeadlineExpiredException exc = (DeadlineExpiredException) t;
232-
assertThat(exc.isInternal()).isTrue();
233-
});
225+
.isInstanceOf(DeadlineExpiredException.Internal.class);
234226

235227
assertThat(internalMeter.getCount()).isGreaterThan(originalInternalValue);
236228
assertThat(externalMeter.getCount()).isEqualTo(originalExternalValue);

0 commit comments

Comments
 (0)