Skip to content

Commit 0ac62a8

Browse files
committed
Update after Luca review (2)
1 parent 5ac4801 commit 0ac62a8

File tree

2 files changed

+36
-30
lines changed

2 files changed

+36
-30
lines changed

core/src/main/java/org/elasticsearch/ElasticsearchException.java

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -405,20 +405,19 @@ public static ElasticsearchException fromXContent(XContentParser parser) throws
405405
}
406406

407407
private static ElasticsearchException innerFromXContent(XContentParser parser) throws IOException {
408+
XContentParser.Token token = parser.currentToken();
409+
ensureExpectedToken(XContentParser.Token.FIELD_NAME, token, parser::getTokenLocation);
410+
408411
String type = null, reason = null, stack = null;
409412
ElasticsearchException cause = null;
410413
Map<String, List<String>> metadata = new HashMap<>();
411414
Map<String, List<String>> headers = new HashMap<>();
412415

413-
XContentParser.Token token = parser.currentToken();
414-
String currentFieldName = parser.currentName();
415-
do {
416-
if (token == XContentParser.Token.FIELD_NAME) {
417-
currentFieldName = parser.currentName();
418-
token = parser.nextToken();
419-
}
416+
for (; token == XContentParser.Token.FIELD_NAME; token = parser.nextToken()) {
417+
String currentFieldName = parser.currentName();
418+
token = parser.nextToken();
420419

421-
if (token != null && token.isValue()) {
420+
if (token.isValue()) {
422421
if (TYPE.equals(currentFieldName)) {
423422
type = parser.text();
424423
} else if (REASON.equals(currentFieldName)) {
@@ -432,18 +431,25 @@ private static ElasticsearchException innerFromXContent(XContentParser parser) t
432431
if (CAUSED_BY.equals(currentFieldName)) {
433432
cause = fromXContent(parser);
434433
} else if (HEADER.equals(currentFieldName)) {
435-
Map<String, Object> headerMap = parser.map();
436-
if (headerMap != null) {
437-
for (Map.Entry<String, Object> header : headerMap.entrySet()) {
438-
List<String> values = headers.getOrDefault(header.getKey(), new ArrayList<>());
439-
if (header.getValue() instanceof Iterable) {
440-
for (Object value : (Iterable) header.getValue()) {
441-
values.add(String.valueOf(value));
434+
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
435+
if (token == XContentParser.Token.FIELD_NAME) {
436+
currentFieldName = parser.currentName();
437+
} else {
438+
List<String> values = headers.getOrDefault(currentFieldName, new ArrayList<>());
439+
if (token.isValue() || token == XContentParser.Token.VALUE_NULL) {
440+
values.add(parser.textOrNull());
441+
} else if (token == XContentParser.Token.START_ARRAY) {
442+
while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) {
443+
if (token.isValue() || token == XContentParser.Token.VALUE_NULL) {
444+
values.add(parser.textOrNull());
445+
} else {
446+
parser.skipChildren();
447+
}
442448
}
443-
} else {
444-
values.add(String.valueOf(header.getValue()));
449+
} else if (token == XContentParser.Token.START_ARRAY) {
450+
parser.skipChildren();
445451
}
446-
headers.put(header.getKey(), values);
452+
headers.put(currentFieldName, values);
447453
}
448454
}
449455
} else {
@@ -470,7 +476,7 @@ private static ElasticsearchException innerFromXContent(XContentParser parser) t
470476
metadata.put(currentFieldName, values);
471477
}
472478
}
473-
} while ((token = parser.nextToken()) == XContentParser.Token.FIELD_NAME);
479+
}
474480

475481
StringBuilder message = new StringBuilder("Elasticsearch exception [");
476482
message.append(TYPE).append('=').append(type).append(", ");

core/src/test/java/org/elasticsearch/ElasticsearchExceptionTests.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,7 @@ public void testThrowableToAndFromXContent() throws IOException {
543543
assertNotNull(parsedException);
544544

545545
ElasticsearchException expected = exceptions.v2();
546-
while (expected != null) {
546+
do {
547547
assertEquals(expected.getMessage(), parsedException.getMessage());
548548
assertEquals(expected.getHeaders(), parsedException.getHeaders());
549549
assertEquals(expected.getMetadata(), parsedException.getMetadata());
@@ -555,7 +555,7 @@ public void testThrowableToAndFromXContent() throws IOException {
555555
if (expected == null) {
556556
assertNull(parsedException);
557557
}
558-
}
558+
} while (expected != null);
559559
}
560560

561561
/**
@@ -633,10 +633,11 @@ private static Tuple<Throwable, ElasticsearchException> randomExceptions() {
633633
}
634634

635635
if (actual instanceof ElasticsearchException) {
636+
ElasticsearchException actualException = (ElasticsearchException) actual;
636637
if (randomBoolean()) {
637-
Map<String, List<String>> randomHeaders = new HashMap<>();
638-
639638
int nbHeaders = randomIntBetween(1, 5);
639+
Map<String, List<String>> randomHeaders = new HashMap<>(nbHeaders);
640+
640641
for (int i = 0; i < nbHeaders; i++) {
641642
List<String> values = new ArrayList<>();
642643

@@ -648,15 +649,15 @@ private static Tuple<Throwable, ElasticsearchException> randomExceptions() {
648649
}
649650

650651
for (Map.Entry<String, List<String>> entry : randomHeaders.entrySet()) {
651-
((ElasticsearchException) actual).addHeader(entry.getKey(), entry.getValue());
652+
actualException.addHeader(entry.getKey(), entry.getValue());
652653
expected.addHeader(entry.getKey(), entry.getValue());
653654
}
654655
}
655656

656657
if (randomBoolean()) {
657-
Map<String, List<String>> randomMetadata = new HashMap<>();
658-
659658
int nbMetadata = randomIntBetween(1, 5);
659+
Map<String, List<String>> randomMetadata = new HashMap<>(nbMetadata);
660+
660661
for (int i = 0; i < nbMetadata; i++) {
661662
List<String> values = new ArrayList<>();
662663

@@ -668,7 +669,7 @@ private static Tuple<Throwable, ElasticsearchException> randomExceptions() {
668669
}
669670

670671
for (Map.Entry<String, List<String>> entry : randomMetadata.entrySet()) {
671-
((ElasticsearchException) actual).addMetadata(entry.getKey(), entry.getValue());
672+
actualException.addMetadata(entry.getKey(), entry.getValue());
672673
expected.addMetadata(entry.getKey(), entry.getValue());
673674
}
674675
}
@@ -679,13 +680,12 @@ private static Tuple<Throwable, ElasticsearchException> randomExceptions() {
679680
String resourceType = "type_" + i;
680681
String[] resourceIds = null;
681682
if (frequently()) {
682-
resourceIds = new String[randomIntBetween(0, 3)];
683+
resourceIds = new String[randomIntBetween(1, 3)];
683684
for (int j = 0; j < resourceIds.length; j++) {
684685
resourceIds[j] = frequently() ? randomAsciiOfLength(5) : null;
685686
}
686687
}
687-
688-
((ElasticsearchException) actual).setResources(resourceType, resourceIds);
688+
actualException.setResources(resourceType, resourceIds);
689689
expected.setResources(resourceType, resourceIds);
690690
}
691691
}

0 commit comments

Comments
 (0)