From 6f8507e74b1d7a68d050b3b868ff167d620d3383 Mon Sep 17 00:00:00 2001 From: Armin Braun Date: Wed, 6 Oct 2021 10:39:03 +0200 Subject: [PATCH 1/4] Speed up toXContent Collection Serialization in some Spots Found this when benchmarking large cluster states. When serializing collections we'd mostly not take any advantage of what we know about the collection contents (like we do in `StreamOutput`). This PR adds a couple of helpers to the x-content-builder similar to what we have on `StreamOutput` to allow for faster serializing by avoiding the writer lookup and some self-reference checks. --- .../client/GeoIpStatsResponse.java | 2 +- .../ccr/PutAutoFollowPatternRequest.java | 4 +- .../client/enrich/PutPolicyRequest.java | 4 +- .../indices/PutIndexTemplateRequest.java | 2 +- .../client/ml/EvaluateDataFrameRequest.java | 2 +- .../client/ml/GetDatafeedRequest.java | 2 +- .../client/ml/GetJobRequest.java | 2 +- .../client/ml/UpdateFilterRequest.java | 4 +- .../client/ml/calendars/Calendar.java | 2 +- .../common/xcontent/XContentBuilder.java | 71 +++++++++++++++++++ .../indices/resolve/ResolveIndexAction.java | 6 +- .../post/SimulateIndexTemplateResponse.java | 2 +- .../action/fieldcaps/FieldCapabilities.java | 2 +- .../fieldcaps/FieldCapabilitiesFailure.java | 2 +- .../fieldcaps/FieldCapabilitiesResponse.java | 4 +- .../coordination/CoordinationMetadata.java | 2 +- .../metadata/ComposableIndexTemplate.java | 4 +- .../cluster/metadata/DataStream.java | 2 +- .../cluster/metadata/DataStreamAlias.java | 2 +- .../cluster/metadata/IndexMetadata.java | 3 +- .../metadata/IndexTemplateMetadata.java | 2 +- .../cluster/metadata/ItemUsage.java | 6 +- .../cluster/metadata/Manifest.java | 2 +- .../cluster/routing/UnassignedInfo.java | 2 +- .../common/settings/Setting.java | 2 +- .../repositories/RepositoryData.java | 6 +- .../BucketSortPipelineAggregationBuilder.java | 2 +- .../search/builder/SearchSourceBuilder.java | 2 +- .../core/action/DataStreamsStatsAction.java | 2 +- .../core/action/GetDataStreamAction.java | 2 +- .../core/action/ReloadAnalyzersResponse.java | 4 +- .../ilm/IndexLifecycleFeatureSetUsage.java | 2 +- .../core/ilm/IndexLifecycleMetadata.java | 2 +- .../core/ilm/WaitForFollowShardTasksStep.java | 2 +- .../RemoveIndexLifecyclePolicyAction.java | 2 +- .../core/rollup/action/RollableIndexCaps.java | 2 +- .../core/rollup/action/RollupJobCaps.java | 2 +- .../xpack/core/rollup/job/MetricConfig.java | 2 +- .../xpack/rollup/action/RollupIndexCaps.java | 2 +- .../actions/email/EmailActionTests.java | 3 +- 40 files changed, 121 insertions(+), 54 deletions(-) diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/GeoIpStatsResponse.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/GeoIpStatsResponse.java index 625c3aee775cf..3721e002836c9 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/GeoIpStatsResponse.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/GeoIpStatsResponse.java @@ -156,7 +156,7 @@ public Map getDatabases() { @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); - builder.field("files_in_temp", filesInTemp); + builder.stringListField("files_in_temp", filesInTemp); builder.field("databases", databases.entrySet().stream() .sorted(Map.Entry.comparingByKey()) .map(Map.Entry::getValue) diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/ccr/PutAutoFollowPatternRequest.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ccr/PutAutoFollowPatternRequest.java index b11b20db6963b..4c95a804904bb 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/ccr/PutAutoFollowPatternRequest.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ccr/PutAutoFollowPatternRequest.java @@ -74,9 +74,9 @@ public void setFollowIndexNamePattern(String followIndexNamePattern) { public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); builder.field(PutFollowRequest.REMOTE_CLUSTER_FIELD.getPreferredName(), remoteCluster); - builder.field(LEADER_PATTERNS_FIELD.getPreferredName(), leaderIndexPatterns); + builder.stringListField(LEADER_PATTERNS_FIELD.getPreferredName(), leaderIndexPatterns); if (leaderIndexExclusionPatterns.isEmpty() == false) { - builder.field(LEADER_EXCLUSION_PATTERNS_FIELD.getPreferredName(), leaderIndexExclusionPatterns); + builder.stringListField(LEADER_EXCLUSION_PATTERNS_FIELD.getPreferredName(), leaderIndexExclusionPatterns); } if (followIndexNamePattern != null) { builder.field(FOLLOW_PATTERN_FIELD.getPreferredName(), followIndexNamePattern); diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/enrich/PutPolicyRequest.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/enrich/PutPolicyRequest.java index 19e816b5bed75..d98d126ada428 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/enrich/PutPolicyRequest.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/enrich/PutPolicyRequest.java @@ -96,12 +96,12 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws { builder.startObject(type); { - builder.field(NamedPolicy.INDICES_FIELD.getPreferredName(), indices); + builder.stringListField(NamedPolicy.INDICES_FIELD.getPreferredName(), indices); if (query != null) { builder.field(NamedPolicy.QUERY_FIELD.getPreferredName(), asMap(query, XContentType.JSON)); } builder.field(NamedPolicy.MATCH_FIELD_FIELD.getPreferredName(), matchField); - builder.field(NamedPolicy.ENRICH_FIELDS_FIELD.getPreferredName(), enrichFields); + builder.stringListField(NamedPolicy.ENRICH_FIELDS_FIELD.getPreferredName(), enrichFields); } builder.endObject(); } diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/indices/PutIndexTemplateRequest.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/indices/PutIndexTemplateRequest.java index 1fabdb6229f1a..b2eea60b4471d 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/indices/PutIndexTemplateRequest.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/indices/PutIndexTemplateRequest.java @@ -401,7 +401,7 @@ public final PutIndexTemplateRequest masterNodeTimeout(String timeout) { @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - builder.field("index_patterns", indexPatterns); + builder.stringListField("index_patterns", indexPatterns); builder.field("order", order); if (version != null) { builder.field("version", version); diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/EvaluateDataFrameRequest.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/EvaluateDataFrameRequest.java index e1be003e87979..003bd58b0231b 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/EvaluateDataFrameRequest.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/EvaluateDataFrameRequest.java @@ -118,7 +118,7 @@ public Optional validate() { @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); - builder.array(INDEX.getPreferredName(), indices.toArray()); + builder.stringListField(INDEX.getPreferredName(), indices); if (queryConfig != null) { builder.field(QUERY.getPreferredName(), queryConfig.getQuery()); } diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetDatafeedRequest.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetDatafeedRequest.java index 1028ab00b3abd..8b8de4a1eb903 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetDatafeedRequest.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetDatafeedRequest.java @@ -133,7 +133,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws builder.startObject(); if (datafeedIds.isEmpty() == false) { - builder.field(DATAFEED_IDS.getPreferredName(), datafeedIds); + builder.stringListField(DATAFEED_IDS.getPreferredName(), datafeedIds); } if (allowNoMatch != null) { diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetJobRequest.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetJobRequest.java index 87a2d6cdd8da1..5ff9a9c608e4d 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetJobRequest.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/GetJobRequest.java @@ -133,7 +133,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws builder.startObject(); if (jobIds.isEmpty() == false) { - builder.field(JOB_IDS.getPreferredName(), jobIds); + builder.stringListField(JOB_IDS.getPreferredName(), jobIds); } if (allowNoMatch != null) { diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/UpdateFilterRequest.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/UpdateFilterRequest.java index ed07b27f4fb90..0aadf67cff615 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/UpdateFilterRequest.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/UpdateFilterRequest.java @@ -102,10 +102,10 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws builder.field(MlFilter.DESCRIPTION.getPreferredName(), description); } if (addItems != null) { - builder.field(ADD_ITEMS.getPreferredName(), addItems); + builder.stringListField(ADD_ITEMS.getPreferredName(), addItems); } if (removeItems != null) { - builder.field(REMOVE_ITEMS.getPreferredName(), removeItems); + builder.stringListField(REMOVE_ITEMS.getPreferredName(), removeItems); } builder.endObject(); return builder; diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/calendars/Calendar.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/calendars/Calendar.java index 487fc825e610c..8d79d4686e3d4 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/calendars/Calendar.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/calendars/Calendar.java @@ -75,7 +75,7 @@ public String getDescription() { public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); builder.field(ID.getPreferredName(), id); - builder.field(JOB_IDS.getPreferredName(), jobIds); + builder.stringListField(JOB_IDS.getPreferredName(), jobIds); if (description != null) { builder.field(DESCRIPTION.getPreferredName(), description); } diff --git a/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/XContentBuilder.java b/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/XContentBuilder.java index 4c464a1de2cd3..4b8c28195e17e 100644 --- a/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/XContentBuilder.java +++ b/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/XContentBuilder.java @@ -25,8 +25,10 @@ import java.util.Arrays; import java.util.Base64; import java.util.Calendar; +import java.util.Collection; import java.util.Collections; import java.util.Date; +import java.util.EnumSet; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.IdentityHashMap; @@ -844,6 +846,13 @@ public XContentBuilder value(Path value) throws IOException { // typed methods over this. ////////////////////////////////// + public XContentBuilder field(String name, Enum value) throws IOException { + if (value == null) { + return nullValue(); + } + return field(name).value(value.toString()); + } + public XContentBuilder field(String name, Object value) throws IOException { return field(name).value(value); } @@ -929,6 +938,32 @@ public XContentBuilder map(Map values) throws IOException { return map(values, true, true); } + public XContentBuilder stringStringMap(String name, Map values) throws IOException { + field(name); + if (values == null) { + return nullValue(); + } + startObject(); + for (Map.Entry value : values.entrySet()) { + field(value.getKey()); + value(value.getValue()); + } + return endObject(); + } + + public XContentBuilder xContentValuesMap(String name, Map values) throws IOException { + field(name); + if (values == null) { + return nullValue(); + } + startObject(); + for (Map.Entry value : values.entrySet()) { + field(value.getKey()); + value(value.getValue()); + } + return endObject(); + } + /** writes a map without the start object and end object headers */ public XContentBuilder mapContents(Map values) throws IOException { return map(values, true, false); @@ -959,6 +994,42 @@ private XContentBuilder map(Map values, boolean ensureNoSelfReference return this; } + public XContentBuilder stringListField(String name, Collection values) throws IOException { + startArray(name); + for (String value : values) { + value(value); + } + endArray(); + return this; + } + + public XContentBuilder xContentList(String name, Collection values) throws IOException { + startArray(name); + for (ToXContent value : values) { + value(value); + } + endArray(); + return this; + } + + public XContentBuilder xContentList(String name, ToXContent... values) throws IOException { + startArray(name); + for (ToXContent value : values) { + value(value); + } + endArray(); + return this; + } + + public XContentBuilder enumSet(String name, EnumSet values) throws IOException { + startArray(name); + for (Enum value : values) { + value(value); + } + endArray(); + return this; + } + public XContentBuilder field(String name, Iterable values) throws IOException { return field(name).value(values); } diff --git a/server/src/main/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexAction.java b/server/src/main/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexAction.java index 5143e6c9dab42..9a111642f01d4 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexAction.java +++ b/server/src/main/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexAction.java @@ -405,9 +405,9 @@ public void writeTo(StreamOutput out) throws IOException { @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); - builder.field(INDICES_FIELD.getPreferredName(), indices); - builder.field(ALIASES_FIELD.getPreferredName(), aliases); - builder.field(DATA_STREAMS_FIELD.getPreferredName(), dataStreams); + builder.xContentList(INDICES_FIELD.getPreferredName(), indices); + builder.xContentList(ALIASES_FIELD.getPreferredName(), aliases); + builder.xContentList(DATA_STREAMS_FIELD.getPreferredName(), dataStreams); builder.endObject(); return builder; } diff --git a/server/src/main/java/org/elasticsearch/action/admin/indices/template/post/SimulateIndexTemplateResponse.java b/server/src/main/java/org/elasticsearch/action/admin/indices/template/post/SimulateIndexTemplateResponse.java index 1e2484a88bbc6..6f8a561199184 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/indices/template/post/SimulateIndexTemplateResponse.java +++ b/server/src/main/java/org/elasticsearch/action/admin/indices/template/post/SimulateIndexTemplateResponse.java @@ -87,7 +87,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws for (Map.Entry> entry : overlappingTemplates.entrySet()) { builder.startObject(); builder.field(NAME.getPreferredName(), entry.getKey()); - builder.field(INDEX_PATTERNS.getPreferredName(), entry.getValue()); + builder.stringListField(INDEX_PATTERNS.getPreferredName(), entry.getValue()); builder.endObject(); } builder.endArray(); diff --git a/server/src/main/java/org/elasticsearch/action/fieldcaps/FieldCapabilities.java b/server/src/main/java/org/elasticsearch/action/fieldcaps/FieldCapabilities.java index 048a0e4898154..09d84740337ca 100644 --- a/server/src/main/java/org/elasticsearch/action/fieldcaps/FieldCapabilities.java +++ b/server/src/main/java/org/elasticsearch/action/fieldcaps/FieldCapabilities.java @@ -140,7 +140,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws for (Map.Entry> entry : entries) { List values = new ArrayList<>(entry.getValue()); values.sort(String::compareTo); // provide predictable order - builder.field(entry.getKey(), values); + builder.stringListField(entry.getKey(), values); } builder.endObject(); } diff --git a/server/src/main/java/org/elasticsearch/action/fieldcaps/FieldCapabilitiesFailure.java b/server/src/main/java/org/elasticsearch/action/fieldcaps/FieldCapabilitiesFailure.java index d91a963775c77..c436a6ef59413 100644 --- a/server/src/main/java/org/elasticsearch/action/fieldcaps/FieldCapabilitiesFailure.java +++ b/server/src/main/java/org/elasticsearch/action/fieldcaps/FieldCapabilitiesFailure.java @@ -46,7 +46,7 @@ public FieldCapabilitiesFailure(StreamInput in) throws IOException { public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); { - builder.field(INDICES_FIELD.getPreferredName(), indices); + builder.stringListField(INDICES_FIELD.getPreferredName(), indices); builder.startObject(FAILURE_FIELD.getPreferredName()); { ElasticsearchException.generateFailureXContent(builder, params, exception, true); diff --git a/server/src/main/java/org/elasticsearch/action/fieldcaps/FieldCapabilitiesResponse.java b/server/src/main/java/org/elasticsearch/action/fieldcaps/FieldCapabilitiesResponse.java index 4cb626607224c..8442e707b74d6 100644 --- a/server/src/main/java/org/elasticsearch/action/fieldcaps/FieldCapabilitiesResponse.java +++ b/server/src/main/java/org/elasticsearch/action/fieldcaps/FieldCapabilitiesResponse.java @@ -151,11 +151,11 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws throw new IllegalStateException("cannot serialize non-merged response"); } builder.startObject(); - builder.field(INDICES_FIELD.getPreferredName(), indices); + builder.array(INDICES_FIELD.getPreferredName(), indices); builder.field(FIELDS_FIELD.getPreferredName(), responseMap); if (this.failures.size() > 0) { builder.field(FAILED_INDICES_FIELD.getPreferredName(), getFailedIndices().length); - builder.field(FAILURES_FIELD.getPreferredName(), failures); + builder.xContentList(FAILURES_FIELD.getPreferredName(), failures); } builder.endObject(); return builder; diff --git a/server/src/main/java/org/elasticsearch/cluster/coordination/CoordinationMetadata.java b/server/src/main/java/org/elasticsearch/cluster/coordination/CoordinationMetadata.java index b7cb9371414f8..5065342558282 100644 --- a/server/src/main/java/org/elasticsearch/cluster/coordination/CoordinationMetadata.java +++ b/server/src/main/java/org/elasticsearch/cluster/coordination/CoordinationMetadata.java @@ -115,7 +115,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws .field(TERM_PARSE_FIELD.getPreferredName(), term) .field(LAST_COMMITTED_CONFIGURATION_FIELD.getPreferredName(), lastCommittedConfiguration) .field(LAST_ACCEPTED_CONFIGURATION_FIELD.getPreferredName(), lastAcceptedConfiguration) - .field(VOTING_CONFIG_EXCLUSIONS_FIELD.getPreferredName(), votingConfigExclusions); + .xContentList(VOTING_CONFIG_EXCLUSIONS_FIELD.getPreferredName(), votingConfigExclusions); } public static CoordinationMetadata fromXContent(XContentParser parser) throws IOException { diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/ComposableIndexTemplate.java b/server/src/main/java/org/elasticsearch/cluster/metadata/ComposableIndexTemplate.java index 0f76a98bfd17f..99dc022ab6992 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/ComposableIndexTemplate.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/ComposableIndexTemplate.java @@ -199,12 +199,12 @@ public void writeTo(StreamOutput out) throws IOException { @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); - builder.field(INDEX_PATTERNS.getPreferredName(), this.indexPatterns); + builder.stringListField(INDEX_PATTERNS.getPreferredName(), this.indexPatterns); if (this.template != null) { builder.field(TEMPLATE.getPreferredName(), this.template); } if (this.componentTemplates != null) { - builder.field(COMPOSED_OF.getPreferredName(), this.componentTemplates); + builder.stringListField(COMPOSED_OF.getPreferredName(), this.componentTemplates); } if (this.priority != null) { builder.field(PRIORITY.getPreferredName(), priority); diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/DataStream.java b/server/src/main/java/org/elasticsearch/cluster/metadata/DataStream.java index d6e074f481635..2c826074b43a3 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/DataStream.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/DataStream.java @@ -401,7 +401,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws builder.startObject(); builder.field(NAME_FIELD.getPreferredName(), name); builder.field(TIMESTAMP_FIELD_FIELD.getPreferredName(), timeStampField); - builder.field(INDICES_FIELD.getPreferredName(), indices); + builder.xContentList(INDICES_FIELD.getPreferredName(), indices); builder.field(GENERATION_FIELD.getPreferredName(), generation); if (metadata != null) { builder.field(METADATA_FIELD.getPreferredName(), metadata); diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/DataStreamAlias.java b/server/src/main/java/org/elasticsearch/cluster/metadata/DataStreamAlias.java index 5cc4555cb18ed..1276ccddda69f 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/DataStreamAlias.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/DataStreamAlias.java @@ -275,7 +275,7 @@ public static DataStreamAlias fromXContent(XContentParser parser) throws IOExcep @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(name); - builder.field(DATA_STREAMS_FIELD.getPreferredName(), dataStreams); + builder.stringListField(DATA_STREAMS_FIELD.getPreferredName(), dataStreams); if (writeDataStream != null) { builder.field(WRITE_DATA_STREAM_FIELD.getPreferredName(), writeDataStream); } diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetadata.java b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetadata.java index 98f8dea776ace..022771ccd9ca1 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetadata.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetadata.java @@ -1396,8 +1396,7 @@ public static void toXContent(IndexMetadata indexMetadata, XContentBuilder build } for (ObjectObjectCursor cursor : indexMetadata.customData) { - builder.field(cursor.key); - builder.map(cursor.value); + builder.stringStringMap(cursor.key, cursor.value); } if (context != Metadata.XContentContext.API) { diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexTemplateMetadata.java b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexTemplateMetadata.java index 60a1473e97fe0..785fa69e5adee 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexTemplateMetadata.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexTemplateMetadata.java @@ -377,7 +377,7 @@ private static void toInnerXContent(IndexTemplateMetadata indexTemplateMetadata, if (indexTemplateMetadata.version() != null) { builder.field("version", indexTemplateMetadata.version()); } - builder.field("index_patterns", indexTemplateMetadata.patterns()); + builder.stringListField("index_patterns", indexTemplateMetadata.patterns()); builder.startObject("settings"); indexTemplateMetadata.settings().toXContent(builder, params); diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/ItemUsage.java b/server/src/main/java/org/elasticsearch/cluster/metadata/ItemUsage.java index 993ae141e3466..8d3008b6ca162 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/ItemUsage.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/ItemUsage.java @@ -77,13 +77,13 @@ public Set getComposableTemplates() { public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); if (this.indices != null) { - builder.field("indices", this.indices); + builder.stringListField("indices", this.indices); } if (this.dataStreams != null) { - builder.field("data_streams", this.dataStreams); + builder.stringListField("data_streams", this.dataStreams); } if (this.composableTemplates != null) { - builder.field("composable_templates", this.composableTemplates); + builder.stringListField("composable_templates", this.composableTemplates); } builder.endObject(); return builder; diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/Manifest.java b/server/src/main/java/org/elasticsearch/cluster/metadata/Manifest.java index c7640b61ba4fd..d13c56dbb8252 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/Manifest.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/Manifest.java @@ -135,7 +135,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws builder.field(CURRENT_TERM_PARSE_FIELD.getPreferredName(), currentTerm); builder.field(CLUSTER_STATE_VERSION_PARSE_FIELD.getPreferredName(), clusterStateVersion); builder.field(GENERATION_PARSE_FIELD.getPreferredName(), globalGeneration); - builder.array(INDEX_GENERATIONS_PARSE_FIELD.getPreferredName(), indexEntryList().toArray()); + builder.xContentList(INDEX_GENERATIONS_PARSE_FIELD.getPreferredName(), indexEntryList()); return builder; } diff --git a/server/src/main/java/org/elasticsearch/cluster/routing/UnassignedInfo.java b/server/src/main/java/org/elasticsearch/cluster/routing/UnassignedInfo.java index bc36fb5abfc3f..aaa22320d1a7f 100644 --- a/server/src/main/java/org/elasticsearch/cluster/routing/UnassignedInfo.java +++ b/server/src/main/java/org/elasticsearch/cluster/routing/UnassignedInfo.java @@ -515,7 +515,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws builder.field("failed_attempts", failedAllocations); } if (failedNodeIds.isEmpty() == false) { - builder.field("failed_nodes", failedNodeIds); + builder.stringListField("failed_nodes", failedNodeIds); } builder.field("delayed", delayed); String details = getDetails(); diff --git a/server/src/main/java/org/elasticsearch/common/settings/Setting.java b/server/src/main/java/org/elasticsearch/common/settings/Setting.java index e8a2144e9e4a5..01d75211e3ed1 100644 --- a/server/src/main/java/org/elasticsearch/common/settings/Setting.java +++ b/server/src/main/java/org/elasticsearch/common/settings/Setting.java @@ -572,7 +572,7 @@ public final boolean match(String toTest) { public final XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); builder.field("key", getKey()); - builder.field("properties", properties); + builder.enumSet("properties", properties); builder.field("is_group_setting", isGroupSetting()); builder.field("default", defaultValue.apply(Settings.EMPTY)); builder.endObject(); diff --git a/server/src/main/java/org/elasticsearch/repositories/RepositoryData.java b/server/src/main/java/org/elasticsearch/repositories/RepositoryData.java index 0a41ccace73be..43de0e37030d8 100644 --- a/server/src/main/java/org/elasticsearch/repositories/RepositoryData.java +++ b/server/src/main/java/org/elasticsearch/repositories/RepositoryData.java @@ -743,11 +743,7 @@ public XContentBuilder snapshotsToXContent(final XContentBuilder builder, final } builder.endArray(); if (shouldWriteShardGens) { - builder.startArray(SHARD_GENERATIONS); - for (ShardGeneration gen : shardGenerations.getGens(indexId)) { - builder.value(gen); - } - builder.endArray(); + builder.xContentList(SHARD_GENERATIONS, shardGenerations.getGens(indexId)); } builder.endObject(); } diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/pipeline/BucketSortPipelineAggregationBuilder.java b/server/src/main/java/org/elasticsearch/search/aggregations/pipeline/BucketSortPipelineAggregationBuilder.java index 7684e0d4484ba..2c1a4a0e95967 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/pipeline/BucketSortPipelineAggregationBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/pipeline/BucketSortPipelineAggregationBuilder.java @@ -149,7 +149,7 @@ protected void validate(ValidationContext context) { @Override protected XContentBuilder internalXContent(XContentBuilder builder, Params params) throws IOException { - builder.field(SearchSourceBuilder.SORT_FIELD.getPreferredName(), sorts); + builder.xContentList(SearchSourceBuilder.SORT_FIELD.getPreferredName(), sorts); builder.field(FROM.getPreferredName(), from); if (size != null) { builder.field(SIZE.getPreferredName(), size); diff --git a/server/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java b/server/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java index 360e6e41925aa..2d77f1a438f15 100644 --- a/server/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java @@ -1425,7 +1425,7 @@ public XContentBuilder innerToXContent(XContentBuilder builder, Params params) t } if (stats != null) { - builder.field(STATS_FIELD.getPreferredName(), stats); + builder.stringListField(STATS_FIELD.getPreferredName(), stats); } if (extBuilders != null && extBuilders.isEmpty() == false) { diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/action/DataStreamsStatsAction.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/action/DataStreamsStatsAction.java index ba03c56f2598a..ef7a56c830e5c 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/action/DataStreamsStatsAction.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/action/DataStreamsStatsAction.java @@ -83,7 +83,7 @@ protected void addCustomXContentFields(XContentBuilder builder, Params params) t builder.field("data_stream_count", dataStreamCount); builder.field("backing_indices", backingIndices); builder.humanReadableField("total_store_size_bytes", "total_store_size", totalStoreSize); - builder.array("data_streams", (Object[]) dataStreams); + builder.xContentList("data_streams", dataStreams); } public int getDataStreamCount() { diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/action/GetDataStreamAction.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/action/GetDataStreamAction.java index c1c6d7c98fe2c..317a062be1e25 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/action/GetDataStreamAction.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/action/GetDataStreamAction.java @@ -169,7 +169,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws builder.startObject(); builder.field(DataStream.NAME_FIELD.getPreferredName(), dataStream.getName()); builder.field(DataStream.TIMESTAMP_FIELD_FIELD.getPreferredName(), dataStream.getTimeStampField()); - builder.field(DataStream.INDICES_FIELD.getPreferredName(), dataStream.getIndices()); + builder.xContentList(DataStream.INDICES_FIELD.getPreferredName(), dataStream.getIndices()); builder.field(DataStream.GENERATION_FIELD.getPreferredName(), dataStream.getGeneration()); if (dataStream.getMetadata() != null) { builder.field(DataStream.METADATA_FIELD.getPreferredName(), dataStream.getMetadata()); diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/action/ReloadAnalyzersResponse.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/action/ReloadAnalyzersResponse.java index 957bd27183182..654aac16ccbe2 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/action/ReloadAnalyzersResponse.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/action/ReloadAnalyzersResponse.java @@ -66,8 +66,8 @@ protected void addCustomXContentFields(XContentBuilder builder, Params params) t builder.startObject(); ReloadDetails value = indexDetails.getValue(); builder.field(INDEX_FIELD.getPreferredName(), value.getIndexName()); - builder.field(RELOADED_ANALYZERS_FIELD.getPreferredName(), value.getReloadedAnalyzers()); - builder.field(RELOADED_NODE_IDS_FIELD.getPreferredName(), value.getReloadedIndicesNodes()); + builder.stringListField(RELOADED_ANALYZERS_FIELD.getPreferredName(), value.getReloadedAnalyzers()); + builder.stringListField(RELOADED_NODE_IDS_FIELD.getPreferredName(), value.getReloadedIndicesNodes()); builder.endObject(); } builder.endArray(); diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/IndexLifecycleFeatureSetUsage.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/IndexLifecycleFeatureSetUsage.java index 26e544915b7fc..ee118827932ca 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/IndexLifecycleFeatureSetUsage.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/IndexLifecycleFeatureSetUsage.java @@ -64,7 +64,7 @@ public IndexLifecycleFeatureSetUsage(List policyStats) { protected void innerXContent(XContentBuilder builder, Params params) throws IOException { if (policyStats != null) { builder.field("policy_count", policyStats.size()); - builder.field("policy_stats", policyStats); + builder.xContentList("policy_stats", policyStats); } } diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/IndexLifecycleMetadata.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/IndexLifecycleMetadata.java index d36e61535efd2..fa3f2efe0de21 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/IndexLifecycleMetadata.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/IndexLifecycleMetadata.java @@ -95,7 +95,7 @@ public Diff diff(Custom previousState) { @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - builder.field(POLICIES_FIELD.getPreferredName(), policyMetadatas); + builder.xContentValuesMap(POLICIES_FIELD.getPreferredName(), policyMetadatas); builder.field(OPERATION_MODE_FIELD.getPreferredName(), operationMode); return builder; } diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/WaitForFollowShardTasksStep.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/WaitForFollowShardTasksStep.java index 3ca6166187af7..85860ff41ee78 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/WaitForFollowShardTasksStep.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/WaitForFollowShardTasksStep.java @@ -94,7 +94,7 @@ List getShardFollowTaskInfos() { @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); - builder.field(SHARD_FOLLOW_TASKS.getPreferredName(), shardFollowTaskInfos); + builder.xContentList(SHARD_FOLLOW_TASKS.getPreferredName(), shardFollowTaskInfos); String message; if (shardFollowTaskInfos.size() > 0) { message = "Waiting for [" + shardFollowTaskInfos.size() + "] shard follow tasks to be in sync"; diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/action/RemoveIndexLifecyclePolicyAction.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/action/RemoveIndexLifecyclePolicyAction.java index 1dcf205ca79c9..e9987b2dff8aa 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/action/RemoveIndexLifecyclePolicyAction.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/action/RemoveIndexLifecyclePolicyAction.java @@ -72,7 +72,7 @@ public boolean hasFailures() { public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); builder.field(HAS_FAILURES_FIELD.getPreferredName(), hasFailures()); - builder.field(FAILED_INDEXES_FIELD.getPreferredName(), failedIndexes); + builder.stringListField(FAILED_INDEXES_FIELD.getPreferredName(), failedIndexes); builder.endObject(); return builder; } diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/rollup/action/RollableIndexCaps.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/rollup/action/RollableIndexCaps.java index 50f1746c32fb2..e73bfe9d32d80 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/rollup/action/RollableIndexCaps.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/rollup/action/RollableIndexCaps.java @@ -64,7 +64,7 @@ public void writeTo(StreamOutput out) throws IOException { public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(indexName); { - builder.field(ROLLUP_JOBS.getPreferredName(), jobCaps); + builder.xContentList(ROLLUP_JOBS.getPreferredName(), jobCaps); } builder.endObject(); return builder; diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/rollup/action/RollupJobCaps.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/rollup/action/RollupJobCaps.java index ea87eb0b1ca12..4de41df47050f 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/rollup/action/RollupJobCaps.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/rollup/action/RollupJobCaps.java @@ -107,7 +107,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws builder.startObject(FIELDS.getPreferredName()); { for (Map.Entry fieldCap : fieldCapLookup.entrySet()) { - builder.array(fieldCap.getKey(), fieldCap.getValue()); + builder.xContentList(fieldCap.getKey(), fieldCap.getValue()); } } builder.endObject(); diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/rollup/job/MetricConfig.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/rollup/job/MetricConfig.java index e1109f948e167..7d705e71cbc66 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/rollup/job/MetricConfig.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/rollup/job/MetricConfig.java @@ -139,7 +139,7 @@ public XContentBuilder toXContent(final XContentBuilder builder, final Params pa builder.startObject(); { builder.field(FIELD, field); - builder.field(METRICS, metrics); + builder.stringListField(METRICS, metrics); } return builder.endObject(); } diff --git a/x-pack/plugin/rollup/src/main/java/org/elasticsearch/xpack/rollup/action/RollupIndexCaps.java b/x-pack/plugin/rollup/src/main/java/org/elasticsearch/xpack/rollup/action/RollupIndexCaps.java index 390743f0584d8..ca55aa2ea5284 100644 --- a/x-pack/plugin/rollup/src/main/java/org/elasticsearch/xpack/rollup/action/RollupIndexCaps.java +++ b/x-pack/plugin/rollup/src/main/java/org/elasticsearch/xpack/rollup/action/RollupIndexCaps.java @@ -184,7 +184,7 @@ public void writeTo(StreamOutput out) throws IOException { @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(rollupIndexName); - builder.field(ROLLUP_JOBS.getPreferredName(), jobCaps); + builder.xContentList(ROLLUP_JOBS.getPreferredName(), jobCaps); builder.endObject(); return builder; } diff --git a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/actions/email/EmailActionTests.java b/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/actions/email/EmailActionTests.java index 7fe8c83136144..5783aa6cdb38c 100644 --- a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/actions/email/EmailActionTests.java +++ b/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/actions/email/EmailActionTests.java @@ -15,6 +15,7 @@ import org.elasticsearch.common.settings.ClusterSettings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.ToXContent; +import org.elasticsearch.common.xcontent.ToXContentObject; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.json.JsonXContent; @@ -211,7 +212,7 @@ public void testParser() throws Exception { .field("from", "from@domain") .field("priority", priority.name()); if (dataAttachment != null) { - builder.field("attach_data", dataAttachment); + builder.field("attach_data", (ToXContentObject) dataAttachment); } else if (randomBoolean()) { dataAttachment = org.elasticsearch.xpack.watcher.notification.email.DataAttachment.DEFAULT; builder.field("attach_data", true); From ef34e750cc4fa5d4d10045e3368c691a18e0e1c9 Mon Sep 17 00:00:00 2001 From: Armin Braun Date: Wed, 6 Oct 2021 11:08:02 +0200 Subject: [PATCH 2/4] nicer --- .../common/xcontent/XContentBuilder.java | 86 +++++++++---------- .../action/fieldcaps/FieldCapabilities.java | 6 +- .../action/get/MultiGetRequest.java | 2 +- .../transport/TransportInfo.java | 2 +- .../xpack/core/ilm/AllocateAction.java | 6 +- .../core/ilm/LifecyclePolicyMetadata.java | 2 +- .../elasticsearch/xpack/core/ilm/Phase.java | 2 +- .../core/security/authz/RoleDescriptor.java | 4 +- .../xpack/ilm/history/ILMHistoryItem.java | 2 +- .../rollup/v2/TransportRollupAction.java | 2 +- .../audit/logfile/LoggingAuditTrail.java | 2 +- 11 files changed, 58 insertions(+), 58 deletions(-) diff --git a/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/XContentBuilder.java b/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/XContentBuilder.java index 4b8c28195e17e..735de36807d95 100644 --- a/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/XContentBuilder.java +++ b/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/XContentBuilder.java @@ -846,13 +846,6 @@ public XContentBuilder value(Path value) throws IOException { // typed methods over this. ////////////////////////////////// - public XContentBuilder field(String name, Enum value) throws IOException { - if (value == null) { - return nullValue(); - } - return field(name).value(value.toString()); - } - public XContentBuilder field(String name, Object value) throws IOException { return field(name).value(value); } @@ -930,6 +923,42 @@ private XContentBuilder value(ToXContent value, ToXContent.Params params) throws // Maps & Iterable ////////////////////////////////// + public XContentBuilder stringListField(String name, Collection values) throws IOException { + startArray(name); + for (String value : values) { + value(value); + } + endArray(); + return this; + } + + public XContentBuilder xContentList(String name, Collection values) throws IOException { + startArray(name); + for (ToXContent value : values) { + value(value); + } + endArray(); + return this; + } + + public XContentBuilder xContentList(String name, ToXContent... values) throws IOException { + startArray(name); + for (ToXContent value : values) { + value(value); + } + endArray(); + return this; + } + + public XContentBuilder enumSet(String name, EnumSet values) throws IOException { + startArray(name); + for (Enum value : values) { + value(value); + } + endArray(); + return this; + } + public XContentBuilder field(String name, Map values) throws IOException { return field(name).map(values); } @@ -994,42 +1023,6 @@ private XContentBuilder map(Map values, boolean ensureNoSelfReference return this; } - public XContentBuilder stringListField(String name, Collection values) throws IOException { - startArray(name); - for (String value : values) { - value(value); - } - endArray(); - return this; - } - - public XContentBuilder xContentList(String name, Collection values) throws IOException { - startArray(name); - for (ToXContent value : values) { - value(value); - } - endArray(); - return this; - } - - public XContentBuilder xContentList(String name, ToXContent... values) throws IOException { - startArray(name); - for (ToXContent value : values) { - value(value); - } - endArray(); - return this; - } - - public XContentBuilder enumSet(String name, EnumSet values) throws IOException { - startArray(name); - for (Enum value : values) { - value(value); - } - endArray(); - return this; - } - public XContentBuilder field(String name, Iterable values) throws IOException { return field(name).value(values); } @@ -1097,6 +1090,13 @@ public XContentBuilder percentageField(String rawFieldName, String readableField return this; } + public XContentBuilder field(String name, Enum value) throws IOException { + if (value == null) { + return nullValue(); + } + return field(name).value(value.toString()); + } + //////////////////////////////////////////////////////////////////////////// // Raw fields ////////////////////////////////// diff --git a/server/src/main/java/org/elasticsearch/action/fieldcaps/FieldCapabilities.java b/server/src/main/java/org/elasticsearch/action/fieldcaps/FieldCapabilities.java index 09d84740337ca..14e9e70428651 100644 --- a/server/src/main/java/org/elasticsearch/action/fieldcaps/FieldCapabilities.java +++ b/server/src/main/java/org/elasticsearch/action/fieldcaps/FieldCapabilities.java @@ -125,13 +125,13 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws builder.field(SEARCHABLE_FIELD.getPreferredName(), isSearchable); builder.field(AGGREGATABLE_FIELD.getPreferredName(), isAggregatable); if (indices != null) { - builder.field(INDICES_FIELD.getPreferredName(), indices); + builder.array(INDICES_FIELD.getPreferredName(), indices); } if (nonSearchableIndices != null) { - builder.field(NON_SEARCHABLE_INDICES_FIELD.getPreferredName(), nonSearchableIndices); + builder.array(NON_SEARCHABLE_INDICES_FIELD.getPreferredName(), nonSearchableIndices); } if (nonAggregatableIndices != null) { - builder.field(NON_AGGREGATABLE_INDICES_FIELD.getPreferredName(), nonAggregatableIndices); + builder.array(NON_AGGREGATABLE_INDICES_FIELD.getPreferredName(), nonAggregatableIndices); } if (meta.isEmpty() == false) { builder.startObject("meta"); diff --git a/server/src/main/java/org/elasticsearch/action/get/MultiGetRequest.java b/server/src/main/java/org/elasticsearch/action/get/MultiGetRequest.java index f0736230ee133..52bbab56dd96c 100644 --- a/server/src/main/java/org/elasticsearch/action/get/MultiGetRequest.java +++ b/server/src/main/java/org/elasticsearch/action/get/MultiGetRequest.java @@ -192,7 +192,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws builder.field(INDEX.getPreferredName(), index); builder.field(ID.getPreferredName(), id); builder.field(ROUTING.getPreferredName(), routing); - builder.field(STORED_FIELDS.getPreferredName(), storedFields); + builder.array(STORED_FIELDS.getPreferredName(), storedFields); builder.field(VERSION.getPreferredName(), version); builder.field(VERSION_TYPE.getPreferredName(), VersionType.toString(versionType)); builder.field(SOURCE.getPreferredName(), fetchSourceContext); diff --git a/server/src/main/java/org/elasticsearch/transport/TransportInfo.java b/server/src/main/java/org/elasticsearch/transport/TransportInfo.java index e952a563d333d..4608f4c116a12 100644 --- a/server/src/main/java/org/elasticsearch/transport/TransportInfo.java +++ b/server/src/main/java/org/elasticsearch/transport/TransportInfo.java @@ -102,7 +102,7 @@ private String formatPublishAddressString(String propertyName, TransportAddress @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(Fields.TRANSPORT); - builder.array(Fields.BOUND_ADDRESS, (Object[]) address.boundAddresses()); + builder.xContentList(Fields.BOUND_ADDRESS, address.boundAddresses()); builder.field(Fields.PUBLISH_ADDRESS, formatPublishAddressString("transport.publish_address", address.publishAddress())); builder.startObject(Fields.PROFILES); if (profileAddresses != null && profileAddresses.size() > 0) { diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/AllocateAction.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/AllocateAction.java index 0154d55de91cd..1472197b8136e 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/AllocateAction.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/AllocateAction.java @@ -143,9 +143,9 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws if (totalShardsPerNode != null) { builder.field(TOTAL_SHARDS_PER_NODE_FIELD.getPreferredName(), totalShardsPerNode); } - builder.field(INCLUDE_FIELD.getPreferredName(), include); - builder.field(EXCLUDE_FIELD.getPreferredName(), exclude); - builder.field(REQUIRE_FIELD.getPreferredName(), require); + builder.stringStringMap(INCLUDE_FIELD.getPreferredName(), include); + builder.stringStringMap(EXCLUDE_FIELD.getPreferredName(), exclude); + builder.stringStringMap(REQUIRE_FIELD.getPreferredName(), require); builder.endObject(); return builder; } diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/LifecyclePolicyMetadata.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/LifecyclePolicyMetadata.java index 79ea7fb235ecc..407bca34b68ad 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/LifecyclePolicyMetadata.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/LifecyclePolicyMetadata.java @@ -101,7 +101,7 @@ public String getModifiedDateString() { public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); builder.field(POLICY.getPreferredName(), policy); - builder.field(HEADERS.getPreferredName(), headers); + builder.stringStringMap(HEADERS.getPreferredName(), headers); builder.field(VERSION.getPreferredName(), version); builder.field(MODIFIED_DATE.getPreferredName(), modifiedDate); builder.field(MODIFIED_DATE_STRING.getPreferredName(), getModifiedDateString()); diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/Phase.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/Phase.java index c1c8d489fd1b1..faadc712218cb 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/Phase.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/Phase.java @@ -148,7 +148,7 @@ public Map getActions() { public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); builder.field(MIN_AGE.getPreferredName(), minimumAge.getStringRep()); - builder.field(ACTIONS_FIELD.getPreferredName(), actions); + builder.xContentValuesMap(ACTIONS_FIELD.getPreferredName(), actions); builder.endObject(); return builder; } diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/security/authz/RoleDescriptor.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/security/authz/RoleDescriptor.java index ae214c5c5f88c..5bf5693232bdb 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/security/authz/RoleDescriptor.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/security/authz/RoleDescriptor.java @@ -246,8 +246,8 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params, boolea builder.field(Fields.GLOBAL.getPreferredName()); ConfigurableClusterPrivileges.toXContent(builder, params, Arrays.asList(configurableClusterPrivileges)); } - builder.array(Fields.INDICES.getPreferredName(), (Object[]) indicesPrivileges); - builder.array(Fields.APPLICATIONS.getPreferredName(), (Object[]) applicationPrivileges); + builder.xContentList(Fields.INDICES.getPreferredName(), indicesPrivileges); + builder.xContentList(Fields.APPLICATIONS.getPreferredName(), applicationPrivileges); if (runAs != null) { builder.array(Fields.RUN_AS.getPreferredName(), runAs); } diff --git a/x-pack/plugin/ilm/src/main/java/org/elasticsearch/xpack/ilm/history/ILMHistoryItem.java b/x-pack/plugin/ilm/src/main/java/org/elasticsearch/xpack/ilm/history/ILMHistoryItem.java index 70e80973e67b4..fb9fe22921e29 100644 --- a/x-pack/plugin/ilm/src/main/java/org/elasticsearch/xpack/ilm/history/ILMHistoryItem.java +++ b/x-pack/plugin/ilm/src/main/java/org/elasticsearch/xpack/ilm/history/ILMHistoryItem.java @@ -82,7 +82,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws } builder.field(SUCCESS.getPreferredName(), success); if (executionState != null) { - builder.field(EXECUTION_STATE.getPreferredName(), executionState.asMap()); + builder.stringStringMap(EXECUTION_STATE.getPreferredName(), executionState.asMap()); } if (errorDetails != null) { builder.field(ERROR.getPreferredName(), errorDetails); diff --git a/x-pack/plugin/rollup/src/main/java/org/elasticsearch/xpack/rollup/v2/TransportRollupAction.java b/x-pack/plugin/rollup/src/main/java/org/elasticsearch/xpack/rollup/v2/TransportRollupAction.java index eceb906ccb4f0..31d1125a91fa2 100644 --- a/x-pack/plugin/rollup/src/main/java/org/elasticsearch/xpack/rollup/v2/TransportRollupAction.java +++ b/x-pack/plugin/rollup/src/main/java/org/elasticsearch/xpack/rollup/v2/TransportRollupAction.java @@ -316,7 +316,7 @@ private static XContentBuilder getProperties(XContentBuilder builder, RollupActi String defaultMetric = metrics.contains("value_count") ? "value_count" : metrics.get(0); builder.startObject(metricConfig.getField()) .field("type", AggregateDoubleMetricFieldMapper.CONTENT_TYPE) - .array(AggregateDoubleMetricFieldMapper.Names.METRICS, metrics.toArray()) + .stringListField(AggregateDoubleMetricFieldMapper.Names.METRICS, metrics) .field(AggregateDoubleMetricFieldMapper.Names.DEFAULT_METRIC, defaultMetric) .endObject(); } diff --git a/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/audit/logfile/LoggingAuditTrail.java b/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/audit/logfile/LoggingAuditTrail.java index 3fa2c5a047f84..6ebfacfad0481 100644 --- a/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/audit/logfile/LoggingAuditTrail.java +++ b/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/audit/logfile/LoggingAuditTrail.java @@ -1067,7 +1067,7 @@ private void withRoleDescriptor(XContentBuilder builder, RoleDescriptor roleDesc } builder.endArray(); // the toXContent method of the {@code RoleDescriptor.ApplicationResourcePrivileges) does a good job - builder.array(RoleDescriptor.Fields.APPLICATIONS.getPreferredName(), (Object[]) roleDescriptor.getApplicationPrivileges()); + builder.xContentList(RoleDescriptor.Fields.APPLICATIONS.getPreferredName(), roleDescriptor.getApplicationPrivileges()); builder.array(RoleDescriptor.Fields.RUN_AS.getPreferredName(), roleDescriptor.getRunAs()); if (roleDescriptor.getMetadata() != null && false == roleDescriptor.getMetadata().isEmpty()) { // JSON building for the metadata might fail when encountering unknown class types. From 219f9f713e778fcd870b04e847a90e7188ad1bd3 Mon Sep 17 00:00:00 2001 From: Armin Braun Date: Wed, 6 Oct 2021 11:15:37 +0200 Subject: [PATCH 3/4] fix --- .../org/elasticsearch/common/xcontent/XContentBuilder.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/XContentBuilder.java b/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/XContentBuilder.java index 735de36807d95..a934ec5dd6013 100644 --- a/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/XContentBuilder.java +++ b/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/XContentBuilder.java @@ -1091,10 +1091,8 @@ public XContentBuilder percentageField(String rawFieldName, String readableField } public XContentBuilder field(String name, Enum value) throws IOException { - if (value == null) { - return nullValue(); - } - return field(name).value(value.toString()); + field(name); + return value(value == null ? null : value.toString()); } //////////////////////////////////////////////////////////////////////////// From 055260472a4b16ea20f1fa10dfb3efa0434745ef Mon Sep 17 00:00:00 2001 From: Armin Braun Date: Wed, 6 Oct 2021 13:08:01 +0200 Subject: [PATCH 4/4] null checks --- .../common/xcontent/XContentBuilder.java | 24 +++++++++++++++---- .../cluster/metadata/DataStreamMetadata.java | 6 +---- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/XContentBuilder.java b/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/XContentBuilder.java index a934ec5dd6013..a9c62a646d3be 100644 --- a/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/XContentBuilder.java +++ b/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/XContentBuilder.java @@ -924,7 +924,11 @@ private XContentBuilder value(ToXContent value, ToXContent.Params params) throws ////////////////////////////////// public XContentBuilder stringListField(String name, Collection values) throws IOException { - startArray(name); + field(name); + if (values == null) { + return nullValue(); + } + startArray(); for (String value : values) { value(value); } @@ -933,7 +937,11 @@ public XContentBuilder stringListField(String name, Collection values) t } public XContentBuilder xContentList(String name, Collection values) throws IOException { - startArray(name); + field(name); + if (values == null) { + return nullValue(); + } + startArray(); for (ToXContent value : values) { value(value); } @@ -942,7 +950,11 @@ public XContentBuilder xContentList(String name, Collection values) throws IOException { - startArray(name); + field(name); + if (values == null) { + return nullValue(); + } + startArray(); for (Enum value : values) { value(value); } diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/DataStreamMetadata.java b/server/src/main/java/org/elasticsearch/cluster/metadata/DataStreamMetadata.java index 611e7a78e7064..d3df1a692f16e 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/DataStreamMetadata.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/DataStreamMetadata.java @@ -121,11 +121,7 @@ public static DataStreamMetadata fromXContent(XContentParser parser) throws IOEx @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - builder.startObject(DATA_STREAM.getPreferredName()); - for (Map.Entry dataStream : dataStreams.entrySet()) { - builder.field(dataStream.getKey(), dataStream.getValue()); - } - builder.endObject(); + builder.xContentValuesMap(DATA_STREAM.getPreferredName(), dataStreams); builder.startObject(DATA_STREAM_ALIASES.getPreferredName()); for (Map.Entry dataStream : dataStreamAliases.entrySet()) { dataStream.getValue().toXContent(builder, params);