Skip to content

Commit 70df64c

Browse files
committed
Add message member to DocumentException toString
Fixes #815
1 parent 55df462 commit 70df64c

2 files changed

Lines changed: 72 additions & 1 deletion

File tree

client/dynamic-client/src/main/java/software/amazon/smithy/java/dynamicclient/DocumentException.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import software.amazon.smithy.java.dynamicschemas.SchemaConverter;
1515
import software.amazon.smithy.java.dynamicschemas.StructDocument;
1616
import software.amazon.smithy.model.shapes.ShapeId;
17+
import software.amazon.smithy.model.shapes.ShapeType;
1718

1819
/**
1920
* A {@link ModeledException} that provides access to the contents of the exception as a document.
@@ -23,10 +24,25 @@ public final class DocumentException extends ModeledException {
2324
private final StructDocument document;
2425

2526
DocumentException(Schema schema, String message, StructDocument document) {
26-
super(schema, message);
27+
super(schema, createMessage(message, document));
2728
this.document = document;
2829
}
2930

31+
// Inject the "message" member into the exception message if we can find it, and it isn't there already.
32+
private static String createMessage(String message, StructDocument document) {
33+
var messageMember = document.getMember("message");
34+
if (messageMember == null) {
35+
messageMember = document.getMember("Message");
36+
}
37+
if (messageMember != null && messageMember.isType(ShapeType.STRING)) {
38+
var messageMemberValue = messageMember.asString();
39+
if (!message.contains(messageMemberValue)) {
40+
message = message + ": " + messageMemberValue;
41+
}
42+
}
43+
return message;
44+
}
45+
3046
@Override
3147
public void serialize(ShapeSerializer encoder) {
3248
document.serialize(encoder);
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package software.amazon.smithy.java.dynamicclient;
7+
8+
import static org.hamcrest.MatcherAssert.assertThat;
9+
import static org.hamcrest.Matchers.endsWith;
10+
11+
import java.util.Map;
12+
import org.junit.jupiter.api.Test;
13+
import software.amazon.smithy.java.core.schema.Schema;
14+
import software.amazon.smithy.java.core.serde.document.Document;
15+
import software.amazon.smithy.java.dynamicschemas.StructDocument;
16+
import software.amazon.smithy.model.shapes.ShapeId;
17+
import software.amazon.smithy.model.traits.ErrorTrait;
18+
19+
public class DocumentExceptionTest {
20+
21+
private static final Schema SCHEMA = Schema.structureBuilder(ShapeId.from("foo#Error"), new ErrorTrait("client"))
22+
.putMember("message", Schema.createString(ShapeId.from("foo#Str")))
23+
.build();
24+
25+
@Test
26+
public void addsMessageWhenFound() {
27+
var ex = new DocumentException(SCHEMA,
28+
"hello: oh my!",
29+
StructDocument.of(SCHEMA,
30+
Document.of(Map.of(
31+
"message",
32+
Document.of("oh my!")))));
33+
34+
assertThat(ex.toString(), endsWith("hello: oh my!"));
35+
}
36+
37+
@Test
38+
public void doesNotAddMessageTwice() {
39+
var ex = new DocumentException(SCHEMA,
40+
"hello: oh my!",
41+
StructDocument.of(SCHEMA,
42+
Document.of(Map.of(
43+
"message",
44+
Document.of("oh my!")))));
45+
46+
assertThat(ex.toString(), endsWith("hello: oh my!"));
47+
}
48+
49+
@Test
50+
public void addsNothingWhenNoMessage() {
51+
var ex = new DocumentException(SCHEMA, "hello", StructDocument.of(SCHEMA, Document.of(Map.of())));
52+
53+
assertThat(ex.toString(), endsWith("hello"));
54+
}
55+
}

0 commit comments

Comments
 (0)