diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7b63940ec9c17..1aa51cec11987 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -93,6 +93,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
- Make Span exporter configurable ([#8620](https://github.com/opensearch-project/OpenSearch/issues/8620))
- Change InternalSignificantTerms to sum shard-level superset counts only in final reduce ([#8735](https://github.com/opensearch-project/OpenSearch/pull/8735))
- Exclude 'benchmarks' from codecov report ([#8805](https://github.com/opensearch-project/OpenSearch/pull/8805))
+- [Refactor] MediaTypeParser to MediaTypeParserRegistry ([#8636](https://github.com/opensearch-project/OpenSearch/pull/8636))
### Deprecated
diff --git a/client/client-benchmark-noop-api-plugin/src/main/java/org/opensearch/plugin/noop/action/bulk/RestNoopBulkAction.java b/client/client-benchmark-noop-api-plugin/src/main/java/org/opensearch/plugin/noop/action/bulk/RestNoopBulkAction.java
index 6a75837f8a0fd..332e089ad9e76 100644
--- a/client/client-benchmark-noop-api-plugin/src/main/java/org/opensearch/plugin/noop/action/bulk/RestNoopBulkAction.java
+++ b/client/client-benchmark-noop-api-plugin/src/main/java/org/opensearch/plugin/noop/action/bulk/RestNoopBulkAction.java
@@ -99,7 +99,7 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC
defaultPipeline,
defaultRequireAlias,
true,
- request.getXContentType()
+ request.getMediaType()
);
// short circuit the call to the transport layer
diff --git a/client/rest-high-level/src/main/java/org/opensearch/client/RequestConverters.java b/client/rest-high-level/src/main/java/org/opensearch/client/RequestConverters.java
index f3fbadf07d304..d23a5976fada6 100644
--- a/client/rest-high-level/src/main/java/org/opensearch/client/RequestConverters.java
+++ b/client/rest-high-level/src/main/java/org/opensearch/client/RequestConverters.java
@@ -157,7 +157,7 @@ static Request bulk(BulkRequest bulkRequest) throws IOException {
// Bulk API only supports newline delimited JSON or Smile. Before executing
// the bulk, we need to check that all requests have the same content-type
// and this content-type is supported by the Bulk API.
- XContentType bulkContentType = null;
+ MediaType bulkContentType = null;
for (int i = 0; i < bulkRequest.numberOfActions(); i++) {
DocWriteRequest> action = bulkRequest.requests().get(i);
@@ -245,7 +245,7 @@ static Request bulk(BulkRequest bulkRequest) throws IOException {
if (opType == DocWriteRequest.OpType.INDEX || opType == DocWriteRequest.OpType.CREATE) {
IndexRequest indexRequest = (IndexRequest) action;
BytesReference indexSource = indexRequest.source();
- XContentType indexXContentType = indexRequest.getContentType();
+ MediaType mediaType = indexRequest.getContentType();
try (
XContentParser parser = XContentHelper.createParser(
@@ -257,7 +257,7 @@ static Request bulk(BulkRequest bulkRequest) throws IOException {
NamedXContentRegistry.EMPTY,
DeprecationHandler.THROW_UNSUPPORTED_OPERATION,
indexSource,
- indexXContentType
+ mediaType
)
) {
try (XContentBuilder builder = XContentBuilder.builder(bulkContentType.xContent())) {
@@ -266,7 +266,7 @@ static Request bulk(BulkRequest bulkRequest) throws IOException {
}
}
} else if (opType == DocWriteRequest.OpType.UPDATE) {
- source = XContentHelper.toXContent((UpdateRequest) action, bulkContentType, false).toBytesRef();
+ source = XContentHelper.toXContent((UpdateRequest) action, bulkContentType, ToXContent.EMPTY_PARAMS, false).toBytesRef();
}
if (source != null) {
@@ -392,30 +392,30 @@ static Request update(UpdateRequest updateRequest) throws IOException {
// set for the partial document and the upsert document. This client
// only accepts update requests that have the same content types set
// for both doc and upsert.
- XContentType xContentType = null;
+ MediaType mediaType = null;
if (updateRequest.doc() != null) {
- xContentType = updateRequest.doc().getContentType();
+ mediaType = updateRequest.doc().getContentType();
}
if (updateRequest.upsertRequest() != null) {
- XContentType upsertContentType = updateRequest.upsertRequest().getContentType();
- if ((xContentType != null) && (xContentType != upsertContentType)) {
+ MediaType upsertContentType = updateRequest.upsertRequest().getContentType();
+ if ((mediaType != null) && (mediaType != upsertContentType)) {
throw new IllegalStateException(
"Update request cannot have different content types for doc ["
- + xContentType
+ + mediaType
+ "]"
+ " and upsert ["
+ upsertContentType
+ "] documents"
);
} else {
- xContentType = upsertContentType;
+ mediaType = upsertContentType;
}
}
- if (xContentType == null) {
- xContentType = Requests.INDEX_CONTENT_TYPE;
+ if (mediaType == null) {
+ mediaType = Requests.INDEX_CONTENT_TYPE;
}
request.addParameters(parameters.asMap());
- request.setEntity(createEntity(updateRequest, xContentType));
+ request.setEntity(createEntity(updateRequest, mediaType));
return request;
}
@@ -816,14 +816,13 @@ static Request deleteScript(DeleteStoredScriptRequest deleteStoredScriptRequest)
return request;
}
- static HttpEntity createEntity(ToXContent toXContent, XContentType xContentType) throws IOException {
- return createEntity(toXContent, xContentType, ToXContent.EMPTY_PARAMS);
+ static HttpEntity createEntity(ToXContent toXContent, MediaType mediaType) throws IOException {
+ return createEntity(toXContent, mediaType, ToXContent.EMPTY_PARAMS);
}
- static HttpEntity createEntity(ToXContent toXContent, XContentType xContentType, ToXContent.Params toXContentParams)
- throws IOException {
- BytesRef source = XContentHelper.toXContent(toXContent, xContentType, toXContentParams, false).toBytesRef();
- return new ByteArrayEntity(source.bytes, source.offset, source.length, createContentType(xContentType));
+ static HttpEntity createEntity(ToXContent toXContent, MediaType mediaType, ToXContent.Params toXContentParams) throws IOException {
+ BytesRef source = XContentHelper.toXContent(toXContent, mediaType, toXContentParams, false).toBytesRef();
+ return new ByteArrayEntity(source.bytes, source.offset, source.length, createContentType(mediaType));
}
static String endpoint(String index, String id) {
@@ -868,20 +867,6 @@ static String endpoint(String[] indices, String endpoint, String type) {
return new EndpointBuilder().addCommaSeparatedPathParts(indices).addPathPartAsIs(endpoint).addPathPart(type).build();
}
- /**
- * Returns a {@link ContentType} from a given {@link XContentType}.
- *
- * @param xContentType the {@link XContentType}
- * @return the {@link ContentType}
- *
- * @deprecated use {@link #createContentType(MediaType)} instead
- */
- @Deprecated
- @SuppressForbidden(reason = "Only allowed place to convert a XContentType to a ContentType")
- public static ContentType createContentType(final XContentType xContentType) {
- return ContentType.create(xContentType.mediaTypeWithoutParameters(), (Charset) null);
- }
-
/**
* Returns a {@link ContentType} from a given {@link XContentType}.
*
@@ -1265,8 +1250,8 @@ Params withWaitForEvents(Priority waitForEvents) {
*
* @return the {@link IndexRequest}'s content type
*/
- static XContentType enforceSameContentType(IndexRequest indexRequest, @Nullable XContentType xContentType) {
- XContentType requestContentType = indexRequest.getContentType();
+ static MediaType enforceSameContentType(IndexRequest indexRequest, @Nullable MediaType mediaType) {
+ MediaType requestContentType = indexRequest.getContentType();
if (requestContentType != XContentType.JSON && requestContentType != XContentType.SMILE) {
throw new IllegalArgumentException(
"Unsupported content-type found for request with content-type ["
@@ -1274,19 +1259,19 @@ static XContentType enforceSameContentType(IndexRequest indexRequest, @Nullable
+ "], only JSON and SMILE are supported"
);
}
- if (xContentType == null) {
+ if (mediaType == null) {
return requestContentType;
}
- if (requestContentType != xContentType) {
+ if (requestContentType != mediaType) {
throw new IllegalArgumentException(
"Mismatching content-type found for request with content-type ["
+ requestContentType
+ "], previous requests have content-type ["
- + xContentType
+ + mediaType
+ "]"
);
}
- return xContentType;
+ return mediaType;
}
/**
diff --git a/client/rest-high-level/src/main/java/org/opensearch/client/RestHighLevelClient.java b/client/rest-high-level/src/main/java/org/opensearch/client/RestHighLevelClient.java
index 9574d4b17819d..1ff5c81c4a0e3 100644
--- a/client/rest-high-level/src/main/java/org/opensearch/client/RestHighLevelClient.java
+++ b/client/rest-high-level/src/main/java/org/opensearch/client/RestHighLevelClient.java
@@ -88,9 +88,9 @@
import org.opensearch.core.ParseField;
import org.opensearch.core.xcontent.ContextParser;
import org.opensearch.core.xcontent.DeprecationHandler;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.NamedXContentRegistry;
import org.opensearch.core.xcontent.XContentParser;
-import org.opensearch.common.xcontent.XContentType;
import org.opensearch.index.rankeval.RankEvalRequest;
import org.opensearch.index.rankeval.RankEvalResponse;
import org.opensearch.index.reindex.BulkByScrollResponse;
@@ -2227,11 +2227,11 @@ protected final Resp parseEntity(final HttpEntity entity, final CheckedFu
if (entity.getContentType() == null) {
throw new IllegalStateException("OpenSearch didn't return the [Content-Type] header, unable to parse response body");
}
- XContentType xContentType = XContentType.fromMediaType(entity.getContentType());
- if (xContentType == null) {
+ MediaType medaiType = MediaType.fromMediaType(entity.getContentType());
+ if (medaiType == null) {
throw new IllegalStateException("Unsupported Content-Type: " + entity.getContentType());
}
- try (XContentParser parser = xContentType.xContent().createParser(registry, DEPRECATION_HANDLER, entity.getContent())) {
+ try (XContentParser parser = medaiType.xContent().createParser(registry, DEPRECATION_HANDLER, entity.getContent())) {
return entityParser.apply(parser);
}
}
diff --git a/client/rest-high-level/src/main/java/org/opensearch/client/indices/CreateIndexRequest.java b/client/rest-high-level/src/main/java/org/opensearch/client/indices/CreateIndexRequest.java
index 3ed41684b090e..3405e7e81e122 100644
--- a/client/rest-high-level/src/main/java/org/opensearch/client/indices/CreateIndexRequest.java
+++ b/client/rest-high-level/src/main/java/org/opensearch/client/indices/CreateIndexRequest.java
@@ -44,10 +44,10 @@
import org.opensearch.common.settings.Settings;
import org.opensearch.common.xcontent.XContentFactory;
import org.opensearch.common.xcontent.XContentHelper;
-import org.opensearch.common.xcontent.XContentType;
import org.opensearch.core.ParseField;
import org.opensearch.core.xcontent.DeprecationHandler;
import org.opensearch.core.xcontent.MediaType;
+import org.opensearch.core.xcontent.MediaTypeParserRegistry;
import org.opensearch.core.xcontent.NamedXContentRegistry;
import org.opensearch.core.xcontent.ToXContentObject;
import org.opensearch.core.xcontent.XContentBuilder;
@@ -77,7 +77,7 @@ public class CreateIndexRequest extends TimedRequest implements Validatable, ToX
private Settings settings = EMPTY_SETTINGS;
private BytesReference mappings;
- private XContentType mappingsXContentType;
+ private MediaType mappingsMediaType;
private final Set aliases = new HashSet<>();
@@ -123,17 +123,6 @@ public CreateIndexRequest settings(Settings settings) {
return this;
}
- /**
- * The settings to create the index with (either json or yaml format)
- *
- * @deprecated use {@link #settings(String source, MediaType mediaType)} instead
- */
- @Deprecated
- public CreateIndexRequest settings(String source, XContentType xContentType) {
- this.settings = Settings.builder().loadFromSource(source, xContentType).build();
- return this;
- }
-
/**
* The settings to create the index with (either json or yaml format)
*/
@@ -162,23 +151,8 @@ public BytesReference mappings() {
return mappings;
}
- public XContentType mappingsXContentType() {
- return mappingsXContentType;
- }
-
- /**
- * Adds mapping that will be added when the index gets created.
- *
- * Note that the definition should *not* be nested under a type name.
- *
- * @param source The mapping source
- * @param xContentType The content type of the source
- *
- * @deprecated use {@link #mapping(String source, MediaType mediaType)} instead
- */
- @Deprecated
- public CreateIndexRequest mapping(String source, XContentType xContentType) {
- return mapping(new BytesArray(source), xContentType);
+ public MediaType mappingsMediaType() {
+ return mappingsMediaType;
}
/**
@@ -213,7 +187,7 @@ public CreateIndexRequest mapping(XContentBuilder source) {
*/
public CreateIndexRequest mapping(Map source) {
try {
- XContentBuilder builder = XContentFactory.contentBuilder(XContentType.JSON);
+ XContentBuilder builder = XContentFactory.contentBuilder(MediaTypeParserRegistry.getDefaultMediaType());
builder.map(source);
return mapping(BytesReference.bytes(builder), builder.contentType());
} catch (IOException e) {
@@ -221,24 +195,6 @@ public CreateIndexRequest mapping(Map source) {
}
}
- /**
- * Adds mapping that will be added when the index gets created.
- *
- * Note that the definition should *not* be nested under a type name.
- *
- * @param source The mapping source
- * @param xContentType the content type of the mapping source
- *
- * @deprecated use {@link #mapping(BytesReference source, MediaType mediaType)} instead
- */
- @Deprecated
- public CreateIndexRequest mapping(BytesReference source, XContentType xContentType) {
- Objects.requireNonNull(xContentType);
- mappings = source;
- mappingsXContentType = xContentType;
- return this;
- }
-
/**
* Adds mapping that will be added when the index gets created.
*
@@ -250,7 +206,7 @@ public CreateIndexRequest mapping(BytesReference source, XContentType xContentTy
public CreateIndexRequest mapping(BytesReference source, MediaType mediaType) {
Objects.requireNonNull(mediaType);
mappings = source;
- mappingsXContentType = XContentType.fromMediaType(mediaType);
+ mappingsMediaType = mediaType;
return this;
}
@@ -278,16 +234,6 @@ public CreateIndexRequest aliases(XContentBuilder source) {
return aliases(BytesReference.bytes(source), source.contentType());
}
- /**
- * Sets the aliases that will be associated with the index when it gets created
- *
- * @deprecated use {@link #aliases(String, MediaType)} instead
- */
- @Deprecated
- public CreateIndexRequest aliases(String source, XContentType contentType) {
- return aliases(new BytesArray(source), contentType);
- }
-
/**
* Sets the aliases that will be associated with the index when it gets created
*/
@@ -295,16 +241,6 @@ public CreateIndexRequest aliases(String source, MediaType mediaType) {
return aliases(new BytesArray(source), mediaType);
}
- /**
- * Sets the aliases that will be associated with the index when it gets created
- *
- * @deprecated use {@link #aliases(BytesReference source, MediaType contentType)} instead
- */
- @Deprecated
- public CreateIndexRequest aliases(BytesReference source, XContentType contentType) {
- return aliases(source, (MediaType) contentType);
- }
-
/**
* Sets the aliases that will be associated with the index when it gets created
*/
@@ -345,18 +281,6 @@ public CreateIndexRequest aliases(Collection aliases) {
return this;
}
- /**
- * Sets the settings and mappings as a single source.
- *
- * Note that the mapping definition should *not* be nested under a type name.
- *
- * @deprecated use {@link #source(String, MediaType)} instead
- */
- @Deprecated
- public CreateIndexRequest source(String source, XContentType xContentType) {
- return source(new BytesArray(source), xContentType);
- }
-
/**
* Sets the settings and mappings as a single source.
*
@@ -375,20 +299,6 @@ public CreateIndexRequest source(XContentBuilder source) {
return source(BytesReference.bytes(source), source.contentType());
}
- /**
- * Sets the settings and mappings as a single source.
- *
- * Note that the mapping definition should *not* be nested under a type name.
- *
- * @deprecated use {@link #source(BytesReference, MediaType)} instead
- */
- @Deprecated
- public CreateIndexRequest source(BytesReference source, XContentType xContentType) {
- Objects.requireNonNull(xContentType);
- source(XContentHelper.convertToMap(source, false, xContentType).v2());
- return this;
- }
-
/**
* Sets the settings and mappings as a single source.
*
@@ -458,7 +368,7 @@ public XContentBuilder innerToXContent(XContentBuilder builder, Params params) t
if (mappings != null) {
try (InputStream stream = mappings.streamInput()) {
- builder.rawField(MAPPINGS.getPreferredName(), stream, mappingsXContentType);
+ builder.rawField(MAPPINGS.getPreferredName(), stream, mappingsMediaType);
}
}
diff --git a/client/rest-high-level/src/main/java/org/opensearch/client/indices/PutMappingRequest.java b/client/rest-high-level/src/main/java/org/opensearch/client/indices/PutMappingRequest.java
index a2237efaed25f..d17dc54713789 100644
--- a/client/rest-high-level/src/main/java/org/opensearch/client/indices/PutMappingRequest.java
+++ b/client/rest-high-level/src/main/java/org/opensearch/client/indices/PutMappingRequest.java
@@ -39,8 +39,8 @@
import org.opensearch.core.common.bytes.BytesArray;
import org.opensearch.core.common.bytes.BytesReference;
import org.opensearch.common.xcontent.XContentFactory;
-import org.opensearch.common.xcontent.XContentType;
import org.opensearch.core.xcontent.MediaType;
+import org.opensearch.core.xcontent.MediaTypeParserRegistry;
import org.opensearch.core.xcontent.ToXContent;
import org.opensearch.core.xcontent.ToXContentObject;
import org.opensearch.core.xcontent.XContentBuilder;
@@ -98,17 +98,7 @@ public BytesReference source() {
}
/**
- * The {@link XContentType} of the mapping source.
- *
- * @deprecated use {@link #mediaType()} instead
- */
- @Deprecated
- public XContentType xContentType() {
- return XContentType.fromMediaType(mediaType);
- }
-
- /**
- * The {@link XContentType} of the mapping source.
+ * The {@link MediaType} of the mapping source.
*/
public MediaType mediaType() {
return mediaType;
@@ -121,7 +111,7 @@ public MediaType mediaType() {
*/
public PutMappingRequest source(Map mappingSource) {
try {
- XContentBuilder builder = XContentFactory.contentBuilder(XContentType.JSON);
+ XContentBuilder builder = XContentFactory.contentBuilder(MediaTypeParserRegistry.getDefaultMediaType());
builder.map(mappingSource);
return source(builder);
} catch (IOException e) {
@@ -129,20 +119,6 @@ public PutMappingRequest source(Map mappingSource) {
}
}
- /**
- * The mapping source definition.
- *
- * Note that the definition should *not* be nested under a type name.
- *
- * @deprecated use {@link #source(String, MediaType)} instead
- */
- @Deprecated
- public PutMappingRequest source(String mappingSource, XContentType xContentType) {
- this.source = new BytesArray(mappingSource);
- this.mediaType = xContentType;
- return this;
- }
-
/**
* The mapping source definition.
*
@@ -165,20 +141,6 @@ public PutMappingRequest source(XContentBuilder builder) {
return this;
}
- /**
- * The mapping source definition.
- *
- * Note that the definition should *not* be nested under a type name.
- *
- * @deprecated use {@link #source(BytesReference, MediaType)} instead
- */
- @Deprecated
- public PutMappingRequest source(BytesReference source, XContentType xContentType) {
- this.source = source;
- this.mediaType = xContentType;
- return this;
- }
-
/**
* The mapping source definition.
*
diff --git a/client/rest-high-level/src/test/java/org/opensearch/client/IngestClientIT.java b/client/rest-high-level/src/test/java/org/opensearch/client/IngestClientIT.java
index 84cd2fb8b20dd..e3c8197dc2c90 100644
--- a/client/rest-high-level/src/test/java/org/opensearch/client/IngestClientIT.java
+++ b/client/rest-high-level/src/test/java/org/opensearch/client/IngestClientIT.java
@@ -161,10 +161,7 @@ private void testSimulatePipeline(boolean isVerbose, boolean isFailure) throws I
}
builder.endObject();
- SimulatePipelineRequest request = new SimulatePipelineRequest(
- BytesReference.bytes(builder),
- XContentType.fromMediaType(builder.contentType())
- );
+ SimulatePipelineRequest request = new SimulatePipelineRequest(BytesReference.bytes(builder), builder.contentType());
request.setVerbose(isVerbose);
SimulatePipelineResponse response = execute(
request,
diff --git a/client/rest-high-level/src/test/java/org/opensearch/client/RequestConvertersTests.java b/client/rest-high-level/src/test/java/org/opensearch/client/RequestConvertersTests.java
index ee6aeeeacf633..15a99b3e91685 100644
--- a/client/rest-high-level/src/test/java/org/opensearch/client/RequestConvertersTests.java
+++ b/client/rest-high-level/src/test/java/org/opensearch/client/RequestConvertersTests.java
@@ -76,6 +76,7 @@
import org.opensearch.common.xcontent.XContentType;
import org.opensearch.common.xcontent.json.JsonXContent;
import org.opensearch.core.common.Strings;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.ToXContent;
import org.opensearch.core.xcontent.XContentBuilder;
import org.opensearch.core.xcontent.XContentParser;
@@ -809,7 +810,7 @@ public void testUpdate() throws IOException {
UpdateRequest parsedUpdateRequest = new UpdateRequest();
- XContentType entityContentType = XContentType.fromMediaType(entity.getContentType());
+ MediaType entityContentType = MediaType.fromMediaType(entity.getContentType());
try (XContentParser parser = createParser(entityContentType.xContent(), entity.getContent())) {
parsedUpdateRequest.fromXContent(parser);
}
diff --git a/client/rest-high-level/src/test/java/org/opensearch/client/indices/CreateIndexRequestTests.java b/client/rest-high-level/src/test/java/org/opensearch/client/indices/CreateIndexRequestTests.java
index 1ac5ff06d5624..0cfbd8c29fe43 100644
--- a/client/rest-high-level/src/test/java/org/opensearch/client/indices/CreateIndexRequestTests.java
+++ b/client/rest-high-level/src/test/java/org/opensearch/client/indices/CreateIndexRequestTests.java
@@ -69,8 +69,8 @@ private void assertMappingsEqual(CreateIndexRequest expected, CreateIndexRequest
} else {
assertNotNull(actual.mappings());
try (
- XContentParser expectedJson = createParser(expected.mappingsXContentType().xContent(), expected.mappings());
- XContentParser actualJson = createParser(actual.mappingsXContentType().xContent(), actual.mappings())
+ XContentParser expectedJson = createParser(expected.mappingsMediaType().xContent(), expected.mappings());
+ XContentParser actualJson = createParser(actual.mappingsMediaType().xContent(), actual.mappings())
) {
assertEquals(expectedJson.map(), actualJson.map());
} catch (IOException e) {
diff --git a/libs/core/src/main/java/org/opensearch/core/common/io/stream/StreamInput.java b/libs/core/src/main/java/org/opensearch/core/common/io/stream/StreamInput.java
index 24795204c6dc8..1d7321bf2c6de 100644
--- a/libs/core/src/main/java/org/opensearch/core/common/io/stream/StreamInput.java
+++ b/libs/core/src/main/java/org/opensearch/core/common/io/stream/StreamInput.java
@@ -53,6 +53,8 @@
import org.opensearch.common.unit.TimeValue;
import org.opensearch.core.common.Strings;
import org.opensearch.core.concurrency.OpenSearchRejectedExecutionException;
+import org.opensearch.core.xcontent.MediaType;
+import org.opensearch.core.xcontent.MediaTypeParserRegistry;
import java.io.ByteArrayInputStream;
import java.io.EOFException;
@@ -344,6 +346,10 @@ public BigInteger readBigInteger() throws IOException {
return new BigInteger(readString());
}
+ public MediaType readMediaType() throws IOException {
+ return MediaTypeParserRegistry.fromMediaType(readString());
+ }
+
@Nullable
public Text readOptionalText() throws IOException {
int length = readInt();
diff --git a/libs/core/src/main/java/org/opensearch/core/xcontent/MediaType.java b/libs/core/src/main/java/org/opensearch/core/xcontent/MediaType.java
index 82d16315f6527..c1409e551e47d 100644
--- a/libs/core/src/main/java/org/opensearch/core/xcontent/MediaType.java
+++ b/libs/core/src/main/java/org/opensearch/core/xcontent/MediaType.java
@@ -32,12 +32,16 @@
package org.opensearch.core.xcontent;
+import org.opensearch.core.common.io.stream.Writeable;
+
+import java.util.Locale;
+
/**
* Abstracts a Media Type and a format parameter.
* Media types are used as values on Content-Type and Accept headers
* format is an URL parameter, specifies response media type.
*/
-public interface MediaType {
+public interface MediaType extends Writeable {
/**
* Returns a type part of a MediaType
* i.e. application for application/json
@@ -70,4 +74,41 @@ default String mediaType() {
}
String mediaTypeWithoutParameters();
+
+ /**
+ * Accepts a format string, which is most of the time is equivalent to {@link MediaType#subtype()}
+ * and attempts to match the value to an {@link MediaType}.
+ * The comparisons are done in lower case format.
+ * This method will return {@code null} if no match is found
+ */
+ static MediaType fromFormat(String mediaType) {
+ return MediaTypeParserRegistry.fromFormat(mediaType);
+ }
+
+ /**
+ * Attempts to match the given media type with the known {@link MediaType} values. This match is done in a case-insensitive manner.
+ * The provided media type can optionally has parameters.
+ * This method is suitable for parsing of the {@code Content-Type} and {@code Accept} HTTP headers.
+ * This method will return {@code null} if no match is found
+ */
+ static MediaType fromMediaType(String mediaTypeHeaderValue) {
+ mediaTypeHeaderValue = removeVersionInMediaType(mediaTypeHeaderValue);
+ return MediaTypeParserRegistry.fromMediaType(mediaTypeHeaderValue);
+ }
+
+ /**
+ * Clients compatible with ES 7.x might start sending media types with versioned media type
+ * in a form of application/vnd.elasticsearch+json;compatible-with=7.
+ * This has to be removed in order to be used in 7.x server.
+ * The same client connecting using that media type will be able to communicate with ES 8 thanks to compatible API.
+ * @param mediaType - a media type used on Content-Type header, might contain versioned media type.
+ *
+ * @return a media type string without
+ */
+ private static String removeVersionInMediaType(String mediaType) {
+ if (mediaType != null && (mediaType = mediaType.toLowerCase(Locale.ROOT)).contains("vnd.opensearch")) {
+ return mediaType.replaceAll("vnd.opensearch\\+", "").replaceAll("\\s*;\\s*compatible-with=\\d+", "");
+ }
+ return mediaType;
+ }
}
diff --git a/libs/core/src/main/java/org/opensearch/core/xcontent/MediaTypeParser.java b/libs/core/src/main/java/org/opensearch/core/xcontent/MediaTypeParserRegistry.java
similarity index 53%
rename from libs/core/src/main/java/org/opensearch/core/xcontent/MediaTypeParser.java
rename to libs/core/src/main/java/org/opensearch/core/xcontent/MediaTypeParserRegistry.java
index cce95e7b4d6b1..62a26b4458b09 100644
--- a/libs/core/src/main/java/org/opensearch/core/xcontent/MediaTypeParser.java
+++ b/libs/core/src/main/java/org/opensearch/core/xcontent/MediaTypeParserRegistry.java
@@ -41,40 +41,52 @@
*
* @opensearch.internal
*/
-public class MediaTypeParser {
- private final Map formatToMediaType;
- private final Map typeWithSubtypeToMediaType;
-
- public MediaTypeParser(T[] acceptedMediaTypes) {
- this(acceptedMediaTypes, Map.of());
- }
-
- public MediaTypeParser(T[] acceptedMediaTypes, Map additionalMediaTypes) {
- final int size = acceptedMediaTypes.length + additionalMediaTypes.size();
- Map formatMap = new HashMap<>(size);
- Map typeMap = new HashMap<>(size);
- for (T mediaType : acceptedMediaTypes) {
+public final class MediaTypeParserRegistry {
+ private static Map formatToMediaType = Map.of();
+ private static Map typeWithSubtypeToMediaType = Map.of();
+
+ // Default mediaType singleton
+ private static MediaType DEFAULT_MEDIA_TYPE;
+
+ public static void register(MediaType[] acceptedMediaTypes, Map additionalMediaTypes) {
+ // ensures the map is not overwritten:
+ Map typeMap = new HashMap<>(typeWithSubtypeToMediaType);
+ Map formatMap = new HashMap<>(formatToMediaType);
+ for (MediaType mediaType : acceptedMediaTypes) {
+ if (formatMap.containsKey(mediaType.format())) {
+ throw new IllegalArgumentException("unable to register mediaType: [" + mediaType.format() + "]. Type already exists.");
+ }
typeMap.put(mediaType.typeWithSubtype(), mediaType);
formatMap.put(mediaType.format(), mediaType);
}
- for (Map.Entry entry : additionalMediaTypes.entrySet()) {
- String typeWithSubtype = entry.getKey();
- T mediaType = entry.getValue();
+ for (Map.Entry entry : additionalMediaTypes.entrySet()) {
+ String typeWithSubtype = entry.getKey().toLowerCase(Locale.ROOT);
+ if (typeMap.containsKey(typeWithSubtype)) {
+ throw new IllegalArgumentException(
+ "unable to register mediaType: ["
+ + entry.getKey()
+ + "]. "
+ + "Type already exists and is mapped to: [."
+ + entry.getValue().format()
+ + "]"
+ );
+ }
- typeMap.put(typeWithSubtype.toLowerCase(Locale.ROOT), mediaType);
- formatMap.put(mediaType.format(), mediaType);
+ MediaType mediaType = entry.getValue();
+ typeMap.put(typeWithSubtype, mediaType);
+ formatMap.putIfAbsent(mediaType.format(), mediaType); // ignore if the additional type mapping already exists
}
- this.formatToMediaType = Map.copyOf(formatMap);
- this.typeWithSubtypeToMediaType = Map.copyOf(typeMap);
+ formatToMediaType = Map.copyOf(formatMap);
+ typeWithSubtypeToMediaType = Map.copyOf(typeMap);
}
- public T fromMediaType(String mediaType) {
+ public static MediaType fromMediaType(String mediaType) {
ParsedMediaType parsedMediaType = parseMediaType(mediaType);
return parsedMediaType != null ? parsedMediaType.getMediaType() : null;
}
- public T fromFormat(String format) {
+ public static MediaType fromFormat(String format) {
if (format == null) {
return null;
}
@@ -86,7 +98,7 @@ public T fromFormat(String format) {
* @param headerValue a header value from Accept or Content-Type
* @return a parsed media-type
*/
- public ParsedMediaType parseMediaType(String headerValue) {
+ public static ParsedMediaType parseMediaType(String headerValue) {
if (headerValue != null) {
String[] split = headerValue.toLowerCase(Locale.ROOT).split(";");
@@ -94,8 +106,8 @@ public ParsedMediaType parseMediaType(String headerValue) {
if (typeSubtype.length == 2) {
String type = typeSubtype[0];
String subtype = typeSubtype[1];
- T xContentType = typeWithSubtypeToMediaType.get(type + "/" + subtype);
- if (xContentType != null) {
+ MediaType mediaType = typeWithSubtypeToMediaType.get(type + "/" + subtype);
+ if (mediaType != null) {
Map parameters = new HashMap<>();
for (int i = 1; i < split.length; i++) {
// spaces are allowed between parameters, but not between '=' sign
@@ -105,7 +117,7 @@ public ParsedMediaType parseMediaType(String headerValue) {
}
parameters.put(keyValueParam[0], keyValueParam[1]);
}
- return new ParsedMediaType(xContentType, parameters);
+ return new ParsedMediaType(mediaType, parameters);
}
}
@@ -113,23 +125,23 @@ public ParsedMediaType parseMediaType(String headerValue) {
return null;
}
- private boolean hasSpaces(String s) {
+ private static boolean hasSpaces(String s) {
return s.trim().equals(s) == false;
}
/**
* A media type object that contains all the information provided on a Content-Type or Accept header
*/
- public class ParsedMediaType {
+ public static class ParsedMediaType {
private final Map parameters;
- private final T mediaType;
+ private final MediaType mediaType;
- public ParsedMediaType(T mediaType, Map parameters) {
+ public ParsedMediaType(MediaType mediaType, Map parameters) {
this.parameters = parameters;
this.mediaType = mediaType;
}
- public T getMediaType() {
+ public MediaType getMediaType() {
return mediaType;
}
@@ -137,4 +149,18 @@ public Map getParameters() {
return parameters;
}
}
+
+ public static void setDefaultMediaType(final MediaType mediaType) {
+ if (DEFAULT_MEDIA_TYPE != null) {
+ throw new RuntimeException(
+ "unable to reset the default media type from current default [" + DEFAULT_MEDIA_TYPE + "] to [" + mediaType + "]"
+ );
+ } else {
+ DEFAULT_MEDIA_TYPE = mediaType;
+ }
+ }
+
+ public static MediaType getDefaultMediaType() {
+ return DEFAULT_MEDIA_TYPE;
+ }
}
diff --git a/libs/x-content/src/main/java/org/opensearch/common/xcontent/XContentFactory.java b/libs/x-content/src/main/java/org/opensearch/common/xcontent/XContentFactory.java
index 94ac264546dbb..76a2046dd768a 100644
--- a/libs/x-content/src/main/java/org/opensearch/common/xcontent/XContentFactory.java
+++ b/libs/x-content/src/main/java/org/opensearch/common/xcontent/XContentFactory.java
@@ -113,7 +113,7 @@ public static XContentBuilder cborBuilder(OutputStream os) throws IOException {
/**
* Constructs a xcontent builder that will output the result into the provided output stream.
*/
- public static XContentBuilder contentBuilder(XContentType type, OutputStream outputStream) throws IOException {
+ public static XContentBuilder contentBuilder(MediaType type, OutputStream outputStream) throws IOException {
if (type == XContentType.JSON) {
return jsonBuilder(outputStream);
} else if (type == XContentType.SMILE) {
@@ -131,7 +131,7 @@ public static XContentBuilder contentBuilder(XContentType type, OutputStream out
*/
public static XContentBuilder contentBuilder(MediaType type) throws IOException {
if (type instanceof XContentType) {
- return contentBuilder(XContentType.fromMediaType(type));
+ return contentBuilder((XContentType) (type));
}
throw new IllegalArgumentException("Content type [" + type.getClass().getName() + "] not supported");
}
diff --git a/libs/x-content/src/main/java/org/opensearch/common/xcontent/XContentType.java b/libs/x-content/src/main/java/org/opensearch/common/xcontent/XContentType.java
index b3a8f5e27635d..023caa49e1f39 100644
--- a/libs/x-content/src/main/java/org/opensearch/common/xcontent/XContentType.java
+++ b/libs/x-content/src/main/java/org/opensearch/common/xcontent/XContentType.java
@@ -36,11 +36,12 @@
import org.opensearch.common.xcontent.json.JsonXContent;
import org.opensearch.common.xcontent.smile.SmileXContent;
import org.opensearch.common.xcontent.yaml.YamlXContent;
+import org.opensearch.core.common.io.stream.StreamOutput;
import org.opensearch.core.xcontent.MediaType;
-import org.opensearch.core.xcontent.MediaTypeParser;
+import org.opensearch.core.xcontent.MediaTypeParserRegistry;
import org.opensearch.core.xcontent.XContent;
-import java.util.Locale;
+import java.io.IOException;
import java.util.Map;
/**
@@ -130,53 +131,9 @@ public XContent xContent() {
}
};
- /** a parser of media types */
- private static final MediaTypeParser MEDIA_TYPE_PARSER = new MediaTypeParser<>(
- XContentType.values(),
- Map.of("application/*", JSON, "application/x-ndjson", JSON)
- );
-
- /** gets the {@link MediaTypeParser} singleton for use outside class */
- @SuppressWarnings("rawtypes")
- public static MediaTypeParser getMediaTypeParser() {
- return MEDIA_TYPE_PARSER;
- }
-
- /**
- * Accepts a format string, which is most of the time is equivalent to {@link XContentType#subtype()}
- * and attempts to match the value to an {@link XContentType}.
- * The comparisons are done in lower case format.
- * This method will return {@code null} if no match is found
- */
- public static XContentType fromFormat(String mediaType) {
- return MEDIA_TYPE_PARSER.fromFormat(mediaType);
- }
-
- /**
- * Attempts to match the given media type with the known {@link XContentType} values. This match is done in a case-insensitive manner.
- * The provided media type can optionally has parameters.
- * This method is suitable for parsing of the {@code Content-Type} and {@code Accept} HTTP headers.
- * This method will return {@code null} if no match is found
- */
- public static XContentType fromMediaType(String mediaTypeHeaderValue) {
- mediaTypeHeaderValue = removeVersionInMediaType(mediaTypeHeaderValue);
- return MEDIA_TYPE_PARSER.fromMediaType(mediaTypeHeaderValue);
- }
-
- /**
- * Clients compatible with ES 7.x might start sending media types with versioned media type
- * in a form of application/vnd.elasticsearch+json;compatible-with=7.
- * This has to be removed in order to be used in 7.x server.
- * The same client connecting using that media type will be able to communicate with ES 8 thanks to compatible API.
- * @param mediaType - a media type used on Content-Type header, might contain versioned media type.
- *
- * @return a media type string without
- */
- private static String removeVersionInMediaType(String mediaType) {
- if (mediaType != null && (mediaType = mediaType.toLowerCase(Locale.ROOT)).contains("vnd.opensearch")) {
- return mediaType.replaceAll("vnd.opensearch\\+", "").replaceAll("\\s*;\\s*compatible-with=\\d+", "");
- }
- return mediaType;
+ static {
+ /** a parser of media types */
+ MediaTypeParserRegistry.register(XContentType.values(), Map.of("application/*", JSON, "application/x-ndjson", JSON));
}
private int index;
@@ -199,12 +156,8 @@ public String format() {
return subtype();
}
- /** Converts from a {@link MediaType} to an explicit {@link XContentType} */
- public static XContentType fromMediaType(MediaType mediaType) {
- if (mediaType instanceof XContentType) {
- return (XContentType) mediaType;
- } else {
- return mediaType != null ? MEDIA_TYPE_PARSER.fromMediaType(mediaType.mediaTypeWithoutParameters()) : null;
- }
+ @Override
+ public void writeTo(StreamOutput output) throws IOException {
+ output.writeString(this.mediaType());
}
}
diff --git a/libs/x-content/src/test/java/org/opensearch/common/xcontent/MediaTypeParserTests.java b/libs/x-content/src/test/java/org/opensearch/common/xcontent/MediaTypeParserTests.java
index f5616f2159f77..15492b7351984 100644
--- a/libs/x-content/src/test/java/org/opensearch/common/xcontent/MediaTypeParserTests.java
+++ b/libs/x-content/src/test/java/org/opensearch/common/xcontent/MediaTypeParserTests.java
@@ -32,7 +32,7 @@
package org.opensearch.common.xcontent;
-import org.opensearch.core.xcontent.MediaTypeParser;
+import org.opensearch.core.xcontent.MediaTypeParserRegistry;
import org.opensearch.test.OpenSearchTestCase;
import java.util.Collections;
@@ -44,42 +44,42 @@
public class MediaTypeParserTests extends OpenSearchTestCase {
- @SuppressWarnings("unchecked")
- MediaTypeParser mediaTypeParser = XContentType.getMediaTypeParser();
-
public void testJsonWithParameters() throws Exception {
String mediaType = "application/json";
- assertThat(mediaTypeParser.parseMediaType(mediaType).getParameters(), equalTo(Collections.emptyMap()));
- assertThat(mediaTypeParser.parseMediaType(mediaType + ";").getParameters(), equalTo(Collections.emptyMap()));
- assertThat(mediaTypeParser.parseMediaType(mediaType + "; charset=UTF-8").getParameters(), equalTo(Map.of("charset", "utf-8")));
+ assertThat(MediaTypeParserRegistry.parseMediaType(mediaType).getParameters(), equalTo(Collections.emptyMap()));
+ assertThat(MediaTypeParserRegistry.parseMediaType(mediaType + ";").getParameters(), equalTo(Collections.emptyMap()));
+ assertThat(
+ MediaTypeParserRegistry.parseMediaType(mediaType + "; charset=UTF-8").getParameters(),
+ equalTo(Map.of("charset", "utf-8"))
+ );
assertThat(
- mediaTypeParser.parseMediaType(mediaType + "; custom=123;charset=UTF-8").getParameters(),
+ MediaTypeParserRegistry.parseMediaType(mediaType + "; custom=123;charset=UTF-8").getParameters(),
equalTo(Map.of("charset", "utf-8", "custom", "123"))
);
}
public void testWhiteSpaceInTypeSubtype() {
String mediaType = " application/json ";
- assertThat(mediaTypeParser.parseMediaType(mediaType).getMediaType(), equalTo(XContentType.JSON));
+ assertThat(MediaTypeParserRegistry.parseMediaType(mediaType).getMediaType(), equalTo(XContentType.JSON));
assertThat(
- mediaTypeParser.parseMediaType(mediaType + "; custom=123; charset=UTF-8").getParameters(),
+ MediaTypeParserRegistry.parseMediaType(mediaType + "; custom=123; charset=UTF-8").getParameters(),
equalTo(Map.of("charset", "utf-8", "custom", "123"))
);
assertThat(
- mediaTypeParser.parseMediaType(mediaType + "; custom=123;\n charset=UTF-8").getParameters(),
+ MediaTypeParserRegistry.parseMediaType(mediaType + "; custom=123;\n charset=UTF-8").getParameters(),
equalTo(Map.of("charset", "utf-8", "custom", "123"))
);
mediaType = " application / json ";
- assertThat(mediaTypeParser.parseMediaType(mediaType), is(nullValue()));
+ assertThat(MediaTypeParserRegistry.parseMediaType(mediaType), is(nullValue()));
}
public void testInvalidParameters() {
String mediaType = "application/json";
- assertThat(mediaTypeParser.parseMediaType(mediaType + "; keyvalueNoEqualsSign"), is(nullValue()));
+ assertThat(MediaTypeParserRegistry.parseMediaType(mediaType + "; keyvalueNoEqualsSign"), is(nullValue()));
- assertThat(mediaTypeParser.parseMediaType(mediaType + "; key = value"), is(nullValue()));
- assertThat(mediaTypeParser.parseMediaType(mediaType + "; key="), is(nullValue()));
+ assertThat(MediaTypeParserRegistry.parseMediaType(mediaType + "; key = value"), is(nullValue()));
+ assertThat(MediaTypeParserRegistry.parseMediaType(mediaType + "; key="), is(nullValue()));
}
}
diff --git a/modules/lang-painless/src/main/java/org/opensearch/painless/action/PainlessExecuteAction.java b/modules/lang-painless/src/main/java/org/opensearch/painless/action/PainlessExecuteAction.java
index faae24083eeca..9a2c8c1f0aa55 100644
--- a/modules/lang-painless/src/main/java/org/opensearch/painless/action/PainlessExecuteAction.java
+++ b/modules/lang-painless/src/main/java/org/opensearch/painless/action/PainlessExecuteAction.java
@@ -65,9 +65,9 @@
import org.opensearch.core.common.io.stream.Writeable;
import org.opensearch.common.xcontent.LoggingDeprecationHandler;
import org.opensearch.common.xcontent.XContentHelper;
-import org.opensearch.common.xcontent.XContentType;
import org.opensearch.core.ParseField;
import org.opensearch.core.xcontent.ConstructingObjectParser;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.NamedXContentRegistry;
import org.opensearch.core.xcontent.ToXContentObject;
import org.opensearch.core.xcontent.XContentBuilder;
@@ -178,11 +178,11 @@ static class ContextSetup implements Writeable, ToXContentObject {
private final BytesReference document;
private final QueryBuilder query;
- private XContentType xContentType;
+ private MediaType mediaType;
static ContextSetup parse(XContentParser parser, Void context) throws IOException {
ContextSetup contextSetup = PARSER.parse(parser, null);
- contextSetup.setXContentType(XContentType.fromMediaType(parser.contentType()));
+ contextSetup.setXContentType(parser.contentType());
return contextSetup;
}
@@ -195,9 +195,9 @@ static ContextSetup parse(XContentParser parser, Void context) throws IOExceptio
ContextSetup(StreamInput in) throws IOException {
index = in.readOptionalString();
document = in.readOptionalBytesReference();
- String xContentType = in.readOptionalString();
- if (xContentType != null) {
- this.xContentType = XContentType.fromMediaType(xContentType);
+ String mediaType = in.readOptionalString();
+ if (mediaType != null) {
+ this.mediaType = MediaType.fromMediaType(mediaType);
}
query = in.readOptionalNamedWriteable(QueryBuilder.class);
}
@@ -214,12 +214,12 @@ public QueryBuilder getQuery() {
return query;
}
- public XContentType getXContentType() {
- return xContentType;
+ public MediaType getXContentType() {
+ return mediaType;
}
- public void setXContentType(XContentType xContentType) {
- this.xContentType = xContentType;
+ public void setXContentType(MediaType mediaType) {
+ this.mediaType = mediaType;
}
@Override
@@ -230,19 +230,19 @@ public boolean equals(Object o) {
return Objects.equals(index, that.index)
&& Objects.equals(document, that.document)
&& Objects.equals(query, that.query)
- && Objects.equals(xContentType, that.xContentType);
+ && Objects.equals(mediaType, that.mediaType);
}
@Override
public int hashCode() {
- return Objects.hash(index, document, query, xContentType);
+ return Objects.hash(index, document, query, mediaType);
}
@Override
public void writeTo(StreamOutput out) throws IOException {
out.writeOptionalString(index);
out.writeOptionalBytesReference(document);
- out.writeOptionalString(xContentType != null ? xContentType.mediaTypeWithoutParameters() : null);
+ out.writeOptionalString(mediaType != null ? mediaType.mediaTypeWithoutParameters() : null);
out.writeOptionalNamedWriteable(query);
}
@@ -257,7 +257,7 @@ public String toString() {
+ ", query="
+ query
+ ", xContentType="
- + xContentType
+ + mediaType
+ '}';
}
@@ -275,7 +275,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
NamedXContentRegistry.EMPTY,
LoggingDeprecationHandler.INSTANCE,
document,
- xContentType
+ mediaType
)
) {
builder.generator().copyCurrentStructure(parser);
@@ -594,8 +594,8 @@ private static Response prepareRamIndex(
try (IndexWriter indexWriter = new IndexWriter(directory, new IndexWriterConfig(defaultAnalyzer))) {
String index = indexService.index().getName();
BytesReference document = request.contextSetup.document;
- XContentType xContentType = request.contextSetup.xContentType;
- SourceToParse sourceToParse = new SourceToParse(index, "_id", document, xContentType);
+ MediaType mediaType = request.contextSetup.mediaType;
+ SourceToParse sourceToParse = new SourceToParse(index, "_id", document, mediaType);
ParsedDocument parsedDocument = indexService.mapperService().documentMapper().parse(sourceToParse);
indexWriter.addDocuments(parsedDocument.docs());
try (IndexReader indexReader = DirectoryReader.open(indexWriter)) {
diff --git a/modules/reindex/src/main/java/org/opensearch/index/reindex/Reindexer.java b/modules/reindex/src/main/java/org/opensearch/index/reindex/Reindexer.java
index ba974d248ac9b..cb07e593f8155 100644
--- a/modules/reindex/src/main/java/org/opensearch/index/reindex/Reindexer.java
+++ b/modules/reindex/src/main/java/org/opensearch/index/reindex/Reindexer.java
@@ -61,10 +61,10 @@
import org.opensearch.common.lucene.uid.Versions;
import org.opensearch.core.common.Strings;
import org.opensearch.core.xcontent.DeprecationHandler;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.NamedXContentRegistry;
import org.opensearch.core.xcontent.XContentBuilder;
import org.opensearch.core.xcontent.XContentParser;
-import org.opensearch.common.xcontent.XContentType;
import org.opensearch.index.VersionType;
import org.opensearch.index.mapper.VersionFieldMapper;
import org.opensearch.index.reindex.remote.RemoteScrollableHitSource;
@@ -378,27 +378,24 @@ protected RequestWrapper buildRequest(ScrollableHitSource.Hit doc)
index.id(doc.getId());
// the source xcontent type and destination could be different
- final XContentType sourceXContentType = doc.getXContentType();
- final XContentType mainRequestXContentType = mainRequest.getDestination().getContentType();
- if (mainRequestXContentType != null && doc.getXContentType() != mainRequestXContentType) {
+ final MediaType sourceMediaType = doc.getMediaType();
+ final MediaType mainRequestMediaType = mainRequest.getDestination().getContentType();
+ if (mainRequestMediaType != null && doc.getMediaType() != mainRequestMediaType) {
// we need to convert
try (
InputStream stream = doc.getSource().streamInput();
- XContentParser parser = sourceXContentType.xContent()
+ XContentParser parser = sourceMediaType.xContent()
.createParser(NamedXContentRegistry.EMPTY, DeprecationHandler.THROW_UNSUPPORTED_OPERATION, stream);
- XContentBuilder builder = XContentBuilder.builder(mainRequestXContentType.xContent())
+ XContentBuilder builder = XContentBuilder.builder(mainRequestMediaType.xContent())
) {
parser.nextToken();
builder.copyCurrentStructure(parser);
index.source(BytesReference.bytes(builder), builder.contentType());
} catch (IOException e) {
- throw new UncheckedIOException(
- "failed to convert hit from " + sourceXContentType + " to " + mainRequestXContentType,
- e
- );
+ throw new UncheckedIOException("failed to convert hit from " + sourceMediaType + " to " + mainRequestMediaType, e);
}
} else {
- index.source(doc.getSource(), doc.getXContentType());
+ index.source(doc.getSource(), doc.getMediaType());
}
/*
diff --git a/modules/reindex/src/main/java/org/opensearch/index/reindex/TransportUpdateByQueryAction.java b/modules/reindex/src/main/java/org/opensearch/index/reindex/TransportUpdateByQueryAction.java
index 5297723ab3687..1ea9ec5fb7beb 100644
--- a/modules/reindex/src/main/java/org/opensearch/index/reindex/TransportUpdateByQueryAction.java
+++ b/modules/reindex/src/main/java/org/opensearch/index/reindex/TransportUpdateByQueryAction.java
@@ -138,7 +138,7 @@ protected RequestWrapper buildRequest(ScrollableHitSource.Hit doc)
IndexRequest index = new IndexRequest();
index.index(doc.getIndex());
index.id(doc.getId());
- index.source(doc.getSource(), doc.getXContentType());
+ index.source(doc.getSource(), doc.getMediaType());
index.setIfSeqNo(doc.getSeqNo());
index.setIfPrimaryTerm(doc.getPrimaryTerm());
index.setPipeline(mainRequest.getPipeline());
diff --git a/modules/reindex/src/main/java/org/opensearch/index/reindex/remote/RemoteResponseParsers.java b/modules/reindex/src/main/java/org/opensearch/index/reindex/remote/RemoteResponseParsers.java
index 3d606b6b77c44..aaca04641d76a 100644
--- a/modules/reindex/src/main/java/org/opensearch/index/reindex/remote/RemoteResponseParsers.java
+++ b/modules/reindex/src/main/java/org/opensearch/index/reindex/remote/RemoteResponseParsers.java
@@ -41,12 +41,12 @@
import org.opensearch.common.collect.Tuple;
import org.opensearch.core.concurrency.OpenSearchRejectedExecutionException;
import org.opensearch.core.xcontent.ConstructingObjectParser;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.ObjectParser;
import org.opensearch.core.xcontent.ObjectParser.ValueType;
import org.opensearch.core.xcontent.XContentBuilder;
import org.opensearch.core.xcontent.XContentLocation;
import org.opensearch.core.xcontent.XContentParser;
-import org.opensearch.common.xcontent.XContentType;
import org.opensearch.index.reindex.ScrollableHitSource.BasicHit;
import org.opensearch.index.reindex.ScrollableHitSource.Hit;
import org.opensearch.index.reindex.ScrollableHitSource.Response;
@@ -72,7 +72,7 @@ private RemoteResponseParsers() {}
/**
* Parser for an individual {@code hit} element.
*/
- public static final ConstructingObjectParser HIT_PARSER = new ConstructingObjectParser<>("hit", true, a -> {
+ public static final ConstructingObjectParser HIT_PARSER = new ConstructingObjectParser<>("hit", true, a -> {
int i = 0;
String index = (String) a[i++];
String id = (String) a[i++];
@@ -106,7 +106,7 @@ private RemoteResponseParsers() {}
class Fields {
String routing;
}
- ObjectParser fieldsParser = new ObjectParser<>("fields", Fields::new);
+ ObjectParser fieldsParser = new ObjectParser<>("fields", Fields::new);
HIT_PARSER.declareObject((hit, fields) -> { hit.setRouting(fields.routing); }, fieldsParser, new ParseField("fields"));
fieldsParser.declareString((fields, routing) -> fields.routing = routing, routingField);
fieldsParser.declareLong((fields, ttl) -> {}, ttlField); // ignore ttls since they have been removed
@@ -116,7 +116,7 @@ class Fields {
/**
* Parser for the {@code hits} element. Parsed to an array of {@code [total (Long), hits (List)]}.
*/
- public static final ConstructingObjectParser HITS_PARSER = new ConstructingObjectParser<>("hits", true, a -> a);
+ public static final ConstructingObjectParser HITS_PARSER = new ConstructingObjectParser<>("hits", true, a -> a);
static {
HITS_PARSER.declareField(constructorArg(), (p, c) -> {
if (p.currentToken() == XContentParser.Token.START_OBJECT) {
@@ -184,7 +184,7 @@ class Fields {
SHARDS_PARSER.declareObjectArray(optionalConstructorArg(), SEARCH_FAILURE_PARSER, new ParseField("failures"));
}
- public static final ConstructingObjectParser RESPONSE_PARSER = new ConstructingObjectParser<>(
+ public static final ConstructingObjectParser RESPONSE_PARSER = new ConstructingObjectParser<>(
"search_response",
true,
a -> {
@@ -296,13 +296,13 @@ public void setCausedBy(Throwable causedBy) {
/**
* Parses the main action to return just the {@linkplain Version} that it returns. We throw everything else out.
*/
- public static final ConstructingObjectParser MAIN_ACTION_PARSER = new ConstructingObjectParser<>(
+ public static final ConstructingObjectParser MAIN_ACTION_PARSER = new ConstructingObjectParser<>(
"/",
true,
a -> (Version) a[0]
);
static {
- ConstructingObjectParser versionParser = new ConstructingObjectParser<>(
+ ConstructingObjectParser versionParser = new ConstructingObjectParser<>(
"version",
true,
a -> a[0] == null
diff --git a/modules/reindex/src/main/java/org/opensearch/index/reindex/remote/RemoteScrollableHitSource.java b/modules/reindex/src/main/java/org/opensearch/index/reindex/remote/RemoteScrollableHitSource.java
index 39d3adcd82ad5..3c305c2a8239d 100644
--- a/modules/reindex/src/main/java/org/opensearch/index/reindex/remote/RemoteScrollableHitSource.java
+++ b/modules/reindex/src/main/java/org/opensearch/index/reindex/remote/RemoteScrollableHitSource.java
@@ -55,10 +55,10 @@
import org.opensearch.common.util.concurrent.ThreadContext;
import org.opensearch.common.xcontent.LoggingDeprecationHandler;
import org.opensearch.core.common.Strings;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.NamedXContentRegistry;
import org.opensearch.core.xcontent.XContentParseException;
import org.opensearch.core.xcontent.XContentParser;
-import org.opensearch.common.xcontent.XContentType;
import org.opensearch.index.reindex.RejectAwareActionListener;
import org.opensearch.index.reindex.ScrollableHitSource;
import org.opensearch.core.rest.RestStatus;
@@ -182,7 +182,7 @@ protected void cleanup(Runnable onCompletion) {
private void execute(
Request request,
- BiFunction parser,
+ BiFunction parser,
RejectAwareActionListener super T> listener
) {
// Preserve the thread context so headers survive after the call
@@ -198,12 +198,12 @@ public void onSuccess(org.opensearch.client.Response response) {
try {
HttpEntity responseEntity = response.getEntity();
InputStream content = responseEntity.getContent();
- XContentType xContentType = null;
+ MediaType mediaType = null;
if (responseEntity.getContentType() != null) {
final String mimeType = ContentType.parse(responseEntity.getContentType()).getMimeType();
- xContentType = XContentType.fromMediaType(mimeType);
+ mediaType = MediaType.fromMediaType(mimeType);
}
- if (xContentType == null) {
+ if (mediaType == null) {
try {
logger.debug("Response didn't include Content-Type: " + bodyMessage(response.getEntity()));
throw new OpenSearchException(
@@ -217,10 +217,10 @@ public void onSuccess(org.opensearch.client.Response response) {
}
// EMPTY is safe here because we don't call namedObject
try (
- XContentParser xContentParser = xContentType.xContent()
+ XContentParser xContentParser = mediaType.xContent()
.createParser(NamedXContentRegistry.EMPTY, LoggingDeprecationHandler.INSTANCE, content)
) {
- parsedResponse = parser.apply(xContentParser, xContentType);
+ parsedResponse = parser.apply(xContentParser, mediaType);
} catch (XContentParseException e) {
/* Because we're streaming the response we can't get a copy of it here. The best we can do is hint that it
* is totally wrong and we're probably not talking to Elasticsearch. */
diff --git a/modules/reindex/src/test/java/org/opensearch/index/reindex/RestReindexActionTests.java b/modules/reindex/src/test/java/org/opensearch/index/reindex/RestReindexActionTests.java
index 2946544a8f901..651ccd47df7bd 100644
--- a/modules/reindex/src/test/java/org/opensearch/index/reindex/RestReindexActionTests.java
+++ b/modules/reindex/src/test/java/org/opensearch/index/reindex/RestReindexActionTests.java
@@ -74,7 +74,7 @@ public void testPipelineQueryParameterIsError() throws IOException {
body.endObject();
}
body.endObject();
- request.withContent(BytesReference.bytes(body), XContentType.fromMediaType(body.contentType()));
+ request.withContent(BytesReference.bytes(body), body.contentType());
}
request.withParams(singletonMap("pipeline", "doesn't matter"));
Exception e = expectThrows(
diff --git a/server/src/internalClusterTest/java/org/opensearch/search/geo/GeoFilterIT.java b/server/src/internalClusterTest/java/org/opensearch/search/geo/GeoFilterIT.java
index 7f306b3ee550f..bb14ed1ea5578 100644
--- a/server/src/internalClusterTest/java/org/opensearch/search/geo/GeoFilterIT.java
+++ b/server/src/internalClusterTest/java/org/opensearch/search/geo/GeoFilterIT.java
@@ -406,9 +406,7 @@ public void testBulk() throws Exception {
.endObject();
client().admin().indices().prepareCreate("countries").setSettings(settings).setMapping(xContentBuilder).get();
- BulkResponse bulk = client().prepareBulk()
- .add(bulkAction, 0, bulkAction.length, null, XContentType.fromMediaType(xContentBuilder.contentType()))
- .get();
+ BulkResponse bulk = client().prepareBulk().add(bulkAction, 0, bulkAction.length, null, xContentBuilder.contentType()).get();
for (BulkItemResponse item : bulk.getItems()) {
assertFalse("unable to index data", item.isFailed());
diff --git a/server/src/main/java/org/opensearch/action/admin/cluster/storedscripts/PutStoredScriptRequest.java b/server/src/main/java/org/opensearch/action/admin/cluster/storedscripts/PutStoredScriptRequest.java
index ecfcd6310dd0a..761373a001ffe 100644
--- a/server/src/main/java/org/opensearch/action/admin/cluster/storedscripts/PutStoredScriptRequest.java
+++ b/server/src/main/java/org/opensearch/action/admin/cluster/storedscripts/PutStoredScriptRequest.java
@@ -32,12 +32,14 @@
package org.opensearch.action.admin.cluster.storedscripts;
+import org.opensearch.Version;
import org.opensearch.action.ActionRequestValidationException;
import org.opensearch.action.support.master.AcknowledgedRequest;
import org.opensearch.core.common.bytes.BytesReference;
import org.opensearch.core.common.io.stream.StreamInput;
import org.opensearch.core.common.io.stream.StreamOutput;
import org.opensearch.core.common.Strings;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.ToXContentFragment;
import org.opensearch.core.xcontent.XContentBuilder;
import org.opensearch.common.xcontent.XContentHelper;
@@ -59,14 +61,18 @@ public class PutStoredScriptRequest extends AcknowledgedRequest indexRequestConsumer,
Consumer updateRequestConsumer,
Consumer deleteRequestConsumer
) throws IOException {
- XContent xContent = xContentType.xContent();
+ XContent xContent = mediaType.xContent();
int line = 0;
int from = 0;
byte marker = xContent.streamSeparator();
@@ -312,7 +313,7 @@ public void parse(
.setPipeline(pipeline)
.setIfSeqNo(ifSeqNo)
.setIfPrimaryTerm(ifPrimaryTerm)
- .source(sliceTrimmingCarriageReturn(data, from, nextMarker, xContentType), xContentType)
+ .source(sliceTrimmingCarriageReturn(data, from, nextMarker, mediaType), mediaType)
.setRequireAlias(requireAlias)
);
} else {
@@ -325,7 +326,7 @@ public void parse(
.setPipeline(pipeline)
.setIfSeqNo(ifSeqNo)
.setIfPrimaryTerm(ifPrimaryTerm)
- .source(sliceTrimmingCarriageReturn(data, from, nextMarker, xContentType), xContentType)
+ .source(sliceTrimmingCarriageReturn(data, from, nextMarker, mediaType), mediaType)
.setRequireAlias(requireAlias)
);
}
@@ -339,7 +340,7 @@ public void parse(
.setPipeline(pipeline)
.setIfSeqNo(ifSeqNo)
.setIfPrimaryTerm(ifPrimaryTerm)
- .source(sliceTrimmingCarriageReturn(data, from, nextMarker, xContentType), xContentType)
+ .source(sliceTrimmingCarriageReturn(data, from, nextMarker, mediaType), mediaType)
.setRequireAlias(requireAlias)
);
} else if ("update".equals(action)) {
@@ -358,7 +359,7 @@ public void parse(
.routing(routing);
try (
XContentParser sliceParser = createParser(
- sliceTrimmingCarriageReturn(data, from, nextMarker, xContentType),
+ sliceTrimmingCarriageReturn(data, from, nextMarker, mediaType),
xContent
)
) {
diff --git a/server/src/main/java/org/opensearch/action/bulk/TransportShardBulkAction.java b/server/src/main/java/org/opensearch/action/bulk/TransportShardBulkAction.java
index 0b675fd9125fa..140c1320daa91 100644
--- a/server/src/main/java/org/opensearch/action/bulk/TransportShardBulkAction.java
+++ b/server/src/main/java/org/opensearch/action/bulk/TransportShardBulkAction.java
@@ -78,8 +78,8 @@
import org.opensearch.common.util.FeatureFlags;
import org.opensearch.common.util.concurrent.AbstractRunnable;
import org.opensearch.common.xcontent.XContentHelper;
-import org.opensearch.common.xcontent.XContentType;
import org.opensearch.common.lease.Releasable;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.ToXContent;
import org.opensearch.index.IndexingPressureService;
import org.opensearch.index.SegmentReplicationPressureService;
@@ -752,7 +752,7 @@ static BulkItemResponse processUpdateResponse(
if (updateRequest.fetchSource() != null && updateRequest.fetchSource().fetchSource()) {
final BytesReference indexSourceAsBytes = updateIndexRequest.source();
- final Tuple> sourceAndContent = XContentHelper.convertToMap(
+ final Tuple extends MediaType, Map> sourceAndContent = XContentHelper.convertToMap(
indexSourceAsBytes,
true,
updateIndexRequest.getContentType()
diff --git a/server/src/main/java/org/opensearch/action/index/IndexRequest.java b/server/src/main/java/org/opensearch/action/index/IndexRequest.java
index 86ba13dedfa06..d686f0b460634 100644
--- a/server/src/main/java/org/opensearch/action/index/IndexRequest.java
+++ b/server/src/main/java/org/opensearch/action/index/IndexRequest.java
@@ -78,10 +78,10 @@
* created using {@link org.opensearch.client.Requests#indexRequest(String)}.
*
* The index requires the {@link #index()}, {@link #id(String)} and
- * {@link #source(byte[], XContentType)} to be set.
+ * {@link #source(byte[], MediaType)} to be set.
*
- * The source (content to index) can be set in its bytes form using ({@link #source(byte[], XContentType)}),
- * its string form ({@link #source(String, XContentType)}) or using a {@link XContentBuilder}
+ * The source (content to index) can be set in its bytes form using ({@link #source(byte[], MediaType)}),
+ * its string form ({@link #source(String, MediaType)}) or using a {@link XContentBuilder}
* ({@link #source(XContentBuilder)}).
*
* If the {@link #id(String)} is not set, it will be automatically generated.
@@ -116,7 +116,7 @@ public class IndexRequest extends ReplicatedWriteRequest implement
private long version = Versions.MATCH_ANY;
private VersionType versionType = VersionType.INTERNAL;
- private XContentType contentType;
+ private MediaType contentType;
private String pipeline;
private String finalPipeline;
@@ -159,7 +159,11 @@ public IndexRequest(@Nullable ShardId shardId, StreamInput in) throws IOExceptio
isRetry = in.readBoolean();
autoGeneratedTimestamp = in.readLong();
if (in.readBoolean()) {
- contentType = in.readEnum(XContentType.class);
+ if (in.getVersion().onOrAfter(Version.V_3_0_0)) {
+ contentType = in.readMediaType();
+ } else {
+ contentType = in.readEnum(XContentType.class);
+ }
} else {
contentType = null;
}
@@ -174,7 +178,7 @@ public IndexRequest() {
/**
* Constructs a new index request against the specific index. The
- * {@link #source(byte[], XContentType)} must be set.
+ * {@link #source(byte[], MediaType)} must be set.
*/
public IndexRequest(String index) {
super(NO_SHARD_ID);
@@ -249,7 +253,7 @@ public IndicesOptions indicesOptions() {
* The content type. This will be used when generating a document from user provided objects like Maps and when parsing the
* source at index time
*/
- public XContentType getContentType() {
+ public MediaType getContentType() {
return contentType;
}
@@ -372,7 +376,7 @@ public IndexRequest source(Map source) throws OpenSearchGenerationExc
*
* @param source The map to index
*/
- public IndexRequest source(Map source, XContentType contentType) throws OpenSearchGenerationException {
+ public IndexRequest source(Map source, MediaType contentType) throws OpenSearchGenerationException {
try {
XContentBuilder builder = XContentFactory.contentBuilder(contentType);
builder.map(source);
@@ -386,10 +390,10 @@ public IndexRequest source(Map source, XContentType contentType) thro
* Sets the document source to index.
*
* Note, its preferable to either set it using {@link #source(XContentBuilder)}
- * or using the {@link #source(byte[], XContentType)}.
+ * or using the {@link #source(byte[], MediaType)}.
*/
- public IndexRequest source(String source, XContentType xContentType) {
- return source(new BytesArray(source), xContentType);
+ public IndexRequest source(String source, MediaType mediaType) {
+ return source(new BytesArray(source), mediaType);
}
/**
@@ -419,7 +423,7 @@ public IndexRequest source(Object... source) {
* valid String representation.
*
*/
- public IndexRequest source(XContentType xContentType, Object... source) {
+ public IndexRequest source(MediaType mediaType, Object... source) {
if (source.length % 2 != 0) {
throw new IllegalArgumentException("The number of object passed must be even but was [" + source.length + "]");
}
@@ -430,7 +434,7 @@ public IndexRequest source(XContentType xContentType, Object... source) {
);
}
try {
- XContentBuilder builder = XContentFactory.contentBuilder(xContentType);
+ XContentBuilder builder = XContentFactory.contentBuilder(mediaType);
builder.startObject();
for (int i = 0; i < source.length; i++) {
builder.field(source[i++].toString(), source[i]);
@@ -447,27 +451,28 @@ public IndexRequest source(XContentType xContentType, Object... source) {
*/
public IndexRequest source(BytesReference source, MediaType mediaType) {
this.source = Objects.requireNonNull(source);
- this.contentType = XContentType.fromMediaType(Objects.requireNonNull(mediaType));
+ this.contentType = Objects.requireNonNull(mediaType);
return this;
}
/**
* Sets the document to index in bytes form.
*/
- public IndexRequest source(byte[] source, XContentType xContentType) {
- return source(source, 0, source.length, xContentType);
+ public IndexRequest source(byte[] source, MediaType mediaType) {
+ return source(source, 0, source.length, mediaType);
}
/**
* Sets the document to index in bytes form (assumed to be safe to be used from different
* threads).
*
- * @param source The source to index
- * @param offset The offset in the byte array
- * @param length The length of the data
+ * @param source The source to index
+ * @param offset The offset in the byte array
+ * @param length The length of the data
+ * @param mediaType The data format over the wire
*/
- public IndexRequest source(byte[] source, int offset, int length, XContentType xContentType) {
- return source(new BytesArray(source, offset, length), xContentType);
+ public IndexRequest source(byte[] source, int offset, int length, MediaType mediaType) {
+ return source(new BytesArray(source, offset, length), mediaType);
}
/**
@@ -665,7 +670,11 @@ private void writeBody(StreamOutput out) throws IOException {
out.writeLong(autoGeneratedTimestamp);
if (contentType != null) {
out.writeBoolean(true);
- out.writeEnum(contentType);
+ if (out.getVersion().onOrAfter(Version.V_3_0_0)) {
+ contentType.writeTo(out);
+ } else {
+ out.writeEnum((XContentType) contentType);
+ }
} else {
out.writeBoolean(false);
}
diff --git a/server/src/main/java/org/opensearch/action/ingest/PutPipelineRequest.java b/server/src/main/java/org/opensearch/action/ingest/PutPipelineRequest.java
index a3067fe0ba160..7a88f817c70bf 100644
--- a/server/src/main/java/org/opensearch/action/ingest/PutPipelineRequest.java
+++ b/server/src/main/java/org/opensearch/action/ingest/PutPipelineRequest.java
@@ -32,12 +32,13 @@
package org.opensearch.action.ingest;
+import org.opensearch.Version;
import org.opensearch.action.ActionRequestValidationException;
import org.opensearch.action.support.master.AcknowledgedRequest;
+import org.opensearch.common.xcontent.XContentType;
import org.opensearch.core.common.bytes.BytesReference;
import org.opensearch.core.common.io.stream.StreamInput;
import org.opensearch.core.common.io.stream.StreamOutput;
-import org.opensearch.common.xcontent.XContentType;
import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.ToXContentObject;
import org.opensearch.core.xcontent.XContentBuilder;
@@ -54,19 +55,7 @@ public class PutPipelineRequest extends AcknowledgedRequest
private String id;
private BytesReference source;
- private XContentType xContentType;
-
- /**
- * Create a new pipeline request with the id and source along with the content type of the source
- *
- * @deprecated use {@link #PutPipelineRequest(String, BytesReference, MediaType)} instead
- */
- @Deprecated
- public PutPipelineRequest(String id, BytesReference source, XContentType xContentType) {
- this.id = Objects.requireNonNull(id);
- this.source = Objects.requireNonNull(source);
- this.xContentType = Objects.requireNonNull(xContentType);
- }
+ private MediaType mediaType;
/**
* Create a new pipeline request with the id and source along with the content type of the source
@@ -74,17 +63,18 @@ public PutPipelineRequest(String id, BytesReference source, XContentType xConten
public PutPipelineRequest(String id, BytesReference source, MediaType mediaType) {
this.id = Objects.requireNonNull(id);
this.source = Objects.requireNonNull(source);
- if (mediaType instanceof XContentType == false) {
- throw new IllegalArgumentException("PutPipelineRequest found unsupported media type [" + mediaType.getClass().getName() + "]");
- }
- this.xContentType = XContentType.fromMediaType(Objects.requireNonNull(mediaType));
+ this.mediaType = Objects.requireNonNull(mediaType);
}
public PutPipelineRequest(StreamInput in) throws IOException {
super(in);
id = in.readString();
source = in.readBytesReference();
- xContentType = in.readEnum(XContentType.class);
+ if (in.getVersion().onOrAfter(Version.V_3_0_0)) {
+ mediaType = in.readMediaType();
+ } else {
+ mediaType = in.readEnum(XContentType.class);
+ }
}
PutPipelineRequest() {}
@@ -102,8 +92,8 @@ public BytesReference getSource() {
return source;
}
- public XContentType getXContentType() {
- return xContentType;
+ public MediaType getMediaType() {
+ return mediaType;
}
@Override
@@ -111,13 +101,17 @@ public void writeTo(StreamOutput out) throws IOException {
super.writeTo(out);
out.writeString(id);
out.writeBytesReference(source);
- out.writeEnum(xContentType);
+ if (out.getVersion().onOrAfter(Version.V_3_0_0)) {
+ mediaType.writeTo(out);
+ } else {
+ out.writeEnum((XContentType) mediaType);
+ }
}
@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
if (source != null) {
- builder.rawValue(source.streamInput(), xContentType);
+ builder.rawValue(source.streamInput(), mediaType);
} else {
builder.startObject().endObject();
}
diff --git a/server/src/main/java/org/opensearch/action/ingest/SimulatePipelineRequest.java b/server/src/main/java/org/opensearch/action/ingest/SimulatePipelineRequest.java
index 31f71e5720daa..1ac441a1afe64 100644
--- a/server/src/main/java/org/opensearch/action/ingest/SimulatePipelineRequest.java
+++ b/server/src/main/java/org/opensearch/action/ingest/SimulatePipelineRequest.java
@@ -32,15 +32,17 @@
package org.opensearch.action.ingest;
+import org.opensearch.Version;
import org.opensearch.action.ActionRequest;
import org.opensearch.action.ActionRequestValidationException;
import org.opensearch.core.common.bytes.BytesReference;
import org.opensearch.core.common.io.stream.StreamInput;
import org.opensearch.core.common.io.stream.StreamOutput;
import org.opensearch.common.logging.DeprecationLogger;
+import org.opensearch.common.xcontent.XContentType;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.ToXContentObject;
import org.opensearch.core.xcontent.XContentBuilder;
-import org.opensearch.common.xcontent.XContentType;
import org.opensearch.index.VersionType;
import org.opensearch.ingest.ConfigurationUtils;
import org.opensearch.ingest.IngestDocument;
@@ -66,14 +68,14 @@ public class SimulatePipelineRequest extends ActionRequest implements ToXContent
private String id;
private boolean verbose;
private BytesReference source;
- private XContentType xContentType;
+ private MediaType mediaType;
/**
* Creates a new request with the given source and its content type
*/
- public SimulatePipelineRequest(BytesReference source, XContentType xContentType) {
+ public SimulatePipelineRequest(BytesReference source, MediaType mediaType) {
this.source = Objects.requireNonNull(source);
- this.xContentType = Objects.requireNonNull(xContentType);
+ this.mediaType = Objects.requireNonNull(mediaType);
}
SimulatePipelineRequest() {}
@@ -83,7 +85,11 @@ public SimulatePipelineRequest(BytesReference source, XContentType xContentType)
id = in.readOptionalString();
verbose = in.readBoolean();
source = in.readBytesReference();
- xContentType = in.readEnum(XContentType.class);
+ if (in.getVersion().onOrAfter(Version.V_3_0_0)) {
+ mediaType = in.readMediaType();
+ } else {
+ mediaType = in.readEnum(XContentType.class);
+ }
}
@Override
@@ -111,8 +117,8 @@ public BytesReference getSource() {
return source;
}
- public XContentType getXContentType() {
- return xContentType;
+ public MediaType getXContentType() {
+ return mediaType;
}
@Override
@@ -121,12 +127,16 @@ public void writeTo(StreamOutput out) throws IOException {
out.writeOptionalString(id);
out.writeBoolean(verbose);
out.writeBytesReference(source);
- out.writeEnum(xContentType);
+ if (out.getVersion().onOrAfter(Version.V_3_0_0)) {
+ mediaType.writeTo(out);
+ } else {
+ out.writeEnum((XContentType) mediaType);
+ }
}
@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
- builder.rawValue(source.streamInput(), xContentType);
+ builder.rawValue(source.streamInput(), mediaType);
return builder;
}
diff --git a/server/src/main/java/org/opensearch/action/search/PutSearchPipelineRequest.java b/server/src/main/java/org/opensearch/action/search/PutSearchPipelineRequest.java
index 822d1f2320c9b..d32aab0c8a561 100644
--- a/server/src/main/java/org/opensearch/action/search/PutSearchPipelineRequest.java
+++ b/server/src/main/java/org/opensearch/action/search/PutSearchPipelineRequest.java
@@ -8,6 +8,7 @@
package org.opensearch.action.search;
+import org.opensearch.Version;
import org.opensearch.action.ActionRequestValidationException;
import org.opensearch.action.support.master.AcknowledgedRequest;
import org.opensearch.core.common.bytes.BytesReference;
@@ -29,7 +30,7 @@
public class PutSearchPipelineRequest extends AcknowledgedRequest implements ToXContentObject {
private String id;
private BytesReference source;
- private XContentType xContentType;
+ private MediaType mediaType;
public PutSearchPipelineRequest(String id, BytesReference source, MediaType mediaType) {
this.id = Objects.requireNonNull(id);
@@ -39,14 +40,18 @@ public PutSearchPipelineRequest(String id, BytesReference source, MediaType medi
PutSearchPipelineRequest.class.getSimpleName() + " found unsupported media type [" + mediaType.getClass().getName() + "]"
);
}
- this.xContentType = XContentType.fromMediaType(Objects.requireNonNull(mediaType));
+ this.mediaType = Objects.requireNonNull(mediaType);
}
public PutSearchPipelineRequest(StreamInput in) throws IOException {
super(in);
id = in.readString();
source = in.readBytesReference();
- xContentType = in.readEnum(XContentType.class);
+ if (in.getVersion().onOrAfter(Version.V_3_0_0)) {
+ mediaType = in.readMediaType();
+ } else {
+ mediaType = in.readEnum(XContentType.class);
+ }
}
@Override
@@ -62,8 +67,8 @@ public BytesReference getSource() {
return source;
}
- public XContentType getXContentType() {
- return xContentType;
+ public MediaType getMediaType() {
+ return mediaType;
}
@Override
@@ -71,13 +76,17 @@ public void writeTo(StreamOutput out) throws IOException {
super.writeTo(out);
out.writeString(id);
out.writeBytesReference(source);
- out.writeEnum(xContentType);
+ if (out.getVersion().onOrAfter(Version.V_3_0_0)) {
+ mediaType.writeTo(out);
+ } else {
+ out.writeEnum((XContentType) mediaType);
+ }
}
@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
if (source != null) {
- builder.rawValue(source.streamInput(), xContentType);
+ builder.rawValue(source.streamInput(), mediaType);
} else {
builder.startObject().endObject();
}
diff --git a/server/src/main/java/org/opensearch/action/termvectors/TermVectorsRequest.java b/server/src/main/java/org/opensearch/action/termvectors/TermVectorsRequest.java
index d33882fc1d53d..71200b05d70ad 100644
--- a/server/src/main/java/org/opensearch/action/termvectors/TermVectorsRequest.java
+++ b/server/src/main/java/org/opensearch/action/termvectors/TermVectorsRequest.java
@@ -40,6 +40,7 @@
import org.opensearch.action.get.MultiGetRequest;
import org.opensearch.action.support.single.shard.SingleShardRequest;
import org.opensearch.common.Nullable;
+import org.opensearch.common.xcontent.XContentType;
import org.opensearch.core.ParseField;
import org.opensearch.core.common.bytes.BytesArray;
import org.opensearch.core.common.bytes.BytesReference;
@@ -51,7 +52,6 @@
import org.opensearch.core.xcontent.XContentBuilder;
import org.opensearch.common.xcontent.XContentHelper;
import org.opensearch.core.xcontent.XContentParser;
-import org.opensearch.common.xcontent.XContentType;
import org.opensearch.index.VersionType;
import org.opensearch.index.mapper.MapperService;
@@ -94,7 +94,7 @@ public class TermVectorsRequest extends SingleShardRequest i
private BytesReference doc;
- private XContentType xContentType;
+ private MediaType mediaType;
private String routing;
@@ -186,7 +186,11 @@ public TermVectorsRequest() {}
if (in.readBoolean()) {
doc = in.readBytesReference();
- xContentType = in.readEnum(XContentType.class);
+ if (in.getVersion().onOrAfter(Version.V_3_0_0)) {
+ mediaType = in.readMediaType();
+ } else {
+ mediaType = in.readEnum(XContentType.class);
+ }
}
routing = in.readOptionalString();
preference = in.readOptionalString();
@@ -235,7 +239,7 @@ public TermVectorsRequest(TermVectorsRequest other) {
this.id = other.id();
if (other.doc != null) {
this.doc = new BytesArray(other.doc().toBytesRef(), true);
- this.xContentType = other.xContentType;
+ this.mediaType = other.mediaType;
}
this.flagsEnum = other.getFlags().clone();
this.preference = other.preference();
@@ -285,8 +289,8 @@ public BytesReference doc() {
return doc;
}
- public XContentType xContentType() {
- return xContentType;
+ public MediaType xContentType() {
+ return mediaType;
}
/**
@@ -308,13 +312,13 @@ public TermVectorsRequest doc(BytesReference doc, boolean generateRandomId) {
/**
* Sets an artificial document from which term vectors are requested for.
*/
- public TermVectorsRequest doc(BytesReference doc, boolean generateRandomId, MediaType xContentType) {
+ public TermVectorsRequest doc(BytesReference doc, boolean generateRandomId, MediaType mediaType) {
// assign a random id to this artificial document, for routing
if (generateRandomId) {
this.id(String.valueOf(randomInt.getAndAdd(1)));
}
this.doc = doc;
- this.xContentType = XContentType.fromMediaType(xContentType);
+ this.mediaType = mediaType;
return this;
}
@@ -534,7 +538,11 @@ public void writeTo(StreamOutput out) throws IOException {
out.writeBoolean(doc != null);
if (doc != null) {
out.writeBytesReference(doc);
- out.writeEnum(xContentType);
+ if (out.getVersion().onOrAfter(Version.V_3_0_0)) {
+ mediaType.writeTo(out);
+ } else {
+ out.writeEnum((XContentType) mediaType);
+ }
}
out.writeOptionalString(routing);
out.writeOptionalString(preference);
diff --git a/server/src/main/java/org/opensearch/action/update/TransportUpdateAction.java b/server/src/main/java/org/opensearch/action/update/TransportUpdateAction.java
index d20d5e229a4c7..95433bc42c2d3 100644
--- a/server/src/main/java/org/opensearch/action/update/TransportUpdateAction.java
+++ b/server/src/main/java/org/opensearch/action/update/TransportUpdateAction.java
@@ -61,7 +61,7 @@
import org.opensearch.core.common.io.stream.NotSerializableExceptionWrapper;
import org.opensearch.core.common.io.stream.StreamInput;
import org.opensearch.common.xcontent.XContentHelper;
-import org.opensearch.common.xcontent.XContentType;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.index.IndexNotFoundException;
import org.opensearch.index.IndexService;
import org.opensearch.index.engine.VersionConflictEngineException;
@@ -238,7 +238,7 @@ protected void shardOperation(final UpdateRequest request, final ActionListener<
response.getResult()
);
if (request.fetchSource() != null && request.fetchSource().fetchSource()) {
- Tuple> sourceAndContent = XContentHelper.convertToMap(
+ Tuple extends MediaType, Map> sourceAndContent = XContentHelper.convertToMap(
upsertSourceBytes,
true,
upsertRequest.getContentType()
diff --git a/server/src/main/java/org/opensearch/action/update/UpdateHelper.java b/server/src/main/java/org/opensearch/action/update/UpdateHelper.java
index e3aa4f1161ac7..a5568a838f21f 100644
--- a/server/src/main/java/org/opensearch/action/update/UpdateHelper.java
+++ b/server/src/main/java/org/opensearch/action/update/UpdateHelper.java
@@ -40,10 +40,11 @@
import org.opensearch.action.index.IndexRequest;
import org.opensearch.client.Requests;
import org.opensearch.common.Nullable;
-import org.opensearch.core.common.bytes.BytesReference;
import org.opensearch.common.collect.Tuple;
import org.opensearch.common.io.stream.BytesStreamOutput;
+import org.opensearch.core.common.bytes.BytesReference;
import org.opensearch.core.common.io.stream.Writeable;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.XContentBuilder;
import org.opensearch.common.xcontent.XContentHelper;
import org.opensearch.common.xcontent.XContentType;
@@ -352,7 +353,7 @@ public static GetResult extractGetResult(
long primaryTerm,
long version,
final Map source,
- XContentType sourceContentType,
+ MediaType sourceContentType,
@Nullable final BytesReference sourceAsBytes
) {
if (request.fetchSource() == null || request.fetchSource().fetchSource() == false) {
diff --git a/server/src/main/java/org/opensearch/action/update/UpdateRequest.java b/server/src/main/java/org/opensearch/action/update/UpdateRequest.java
index 8f529ec855d9b..44454630ff24d 100644
--- a/server/src/main/java/org/opensearch/action/update/UpdateRequest.java
+++ b/server/src/main/java/org/opensearch/action/update/UpdateRequest.java
@@ -48,6 +48,7 @@
import org.opensearch.common.xcontent.LoggingDeprecationHandler;
import org.opensearch.core.ParseField;
import org.opensearch.core.common.Strings;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.NamedXContentRegistry;
import org.opensearch.core.xcontent.ObjectParser;
import org.opensearch.core.xcontent.ToXContentObject;
@@ -922,13 +923,13 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
builder.field("doc_as_upsert", docAsUpsert);
}
if (doc != null) {
- XContentType xContentType = doc.getContentType();
+ MediaType mediaType = doc.getContentType();
try (
XContentParser parser = XContentHelper.createParser(
NamedXContentRegistry.EMPTY,
LoggingDeprecationHandler.INSTANCE,
doc.source(),
- xContentType
+ mediaType
)
) {
builder.field("doc");
@@ -945,13 +946,13 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
builder.field("script", script);
}
if (upsertRequest != null) {
- XContentType xContentType = upsertRequest.getContentType();
+ MediaType mediaType = upsertRequest.getContentType();
try (
XContentParser parser = XContentHelper.createParser(
NamedXContentRegistry.EMPTY,
LoggingDeprecationHandler.INSTANCE,
upsertRequest.source(),
- xContentType
+ mediaType
)
) {
builder.field("upsert");
diff --git a/server/src/main/java/org/opensearch/common/xcontent/XContentHelper.java b/server/src/main/java/org/opensearch/common/xcontent/XContentHelper.java
index cfe8008a4adca..ae1fb0724fd9e 100644
--- a/server/src/main/java/org/opensearch/common/xcontent/XContentHelper.java
+++ b/server/src/main/java/org/opensearch/common/xcontent/XContentHelper.java
@@ -497,6 +497,7 @@ public static void writeRawField(String field, BytesReference source, XContentTy
* {@link XContentType}. Wraps the output into a new anonymous object according to the value returned
* by the {@link ToXContent#isFragment()} method returns.
*/
+ @Deprecated
public static BytesReference toXContent(ToXContent toXContent, XContentType xContentType, boolean humanReadable) throws IOException {
return toXContent(toXContent, xContentType, ToXContent.EMPTY_PARAMS, humanReadable);
}
diff --git a/server/src/main/java/org/opensearch/extensions/rest/ExtensionRestRequest.java b/server/src/main/java/org/opensearch/extensions/rest/ExtensionRestRequest.java
index 0992345735176..e6df6e964a31b 100644
--- a/server/src/main/java/org/opensearch/extensions/rest/ExtensionRestRequest.java
+++ b/server/src/main/java/org/opensearch/extensions/rest/ExtensionRestRequest.java
@@ -9,13 +9,15 @@
package org.opensearch.extensions.rest;
import org.opensearch.OpenSearchParseException;
+import org.opensearch.Version;
+import org.opensearch.common.xcontent.LoggingDeprecationHandler;
+import org.opensearch.common.xcontent.XContentType;
import org.opensearch.core.common.bytes.BytesReference;
import org.opensearch.core.common.io.stream.StreamInput;
import org.opensearch.core.common.io.stream.StreamOutput;
-import org.opensearch.common.xcontent.LoggingDeprecationHandler;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.NamedXContentRegistry;
import org.opensearch.core.xcontent.XContentParser;
-import org.opensearch.common.xcontent.XContentType;
import org.opensearch.rest.RestRequest;
import org.opensearch.rest.RestRequest.Method;
import org.opensearch.transport.TransportRequest;
@@ -42,7 +44,7 @@ public class ExtensionRestRequest extends TransportRequest {
private String path;
private Map params;
private Map> headers;
- private XContentType xContentType = null;
+ private MediaType mediaType = null;
private BytesReference content;
// The owner of this request object
// Will be replaced with PrincipalIdentifierToken class from feature/identity
@@ -56,15 +58,15 @@ public class ExtensionRestRequest extends TransportRequest {
/**
* This object can be instantiated given method, uri, params, content and identifier
*
- * @param method of type {@link Method}
- * @param uri the REST uri string (excluding the query)
- * @param path the REST path
- * @param params the REST params
- * @param headers the REST headers
- * @param xContentType the content type, or null for plain text or no content
- * @param content the REST request content
+ * @param method of type {@link Method}
+ * @param uri the REST uri string (excluding the query)
+ * @param path the REST path
+ * @param params the REST params
+ * @param headers the REST headers
+ * @param mediaType the content type, or null for plain text or no content
+ * @param content the REST request content
* @param principalIdentifier the owner of this request
- * @param httpVersion the REST HTTP protocol version
+ * @param httpVersion the REST HTTP protocol version
*/
public ExtensionRestRequest(
Method method,
@@ -72,7 +74,7 @@ public ExtensionRestRequest(
String path,
Map params,
Map> headers,
- XContentType xContentType,
+ MediaType mediaType,
BytesReference content,
String principalIdentifier,
HttpRequest.HttpVersion httpVersion
@@ -82,7 +84,7 @@ public ExtensionRestRequest(
this.path = path;
this.params = params;
this.headers = headers;
- this.xContentType = xContentType;
+ this.mediaType = mediaType;
this.content = content;
this.principalIdentifierToken = principalIdentifier;
this.httpVersion = httpVersion;
@@ -102,7 +104,11 @@ public ExtensionRestRequest(StreamInput in) throws IOException {
params = in.readMap(StreamInput::readString, StreamInput::readString);
headers = in.readMap(StreamInput::readString, StreamInput::readStringList);
if (in.readBoolean()) {
- xContentType = in.readEnum(XContentType.class);
+ if (in.getVersion().onOrAfter(Version.V_3_0_0)) {
+ mediaType = in.readMediaType();
+ } else {
+ mediaType = in.readEnum(XContentType.class);
+ }
}
content = in.readBytesReference();
principalIdentifierToken = in.readString();
@@ -117,9 +123,13 @@ public void writeTo(StreamOutput out) throws IOException {
out.writeString(path);
out.writeMap(params, StreamOutput::writeString, StreamOutput::writeString);
out.writeMap(headers, StreamOutput::writeString, StreamOutput::writeStringCollection);
- out.writeBoolean(xContentType != null);
- if (xContentType != null) {
- out.writeEnum(xContentType);
+ out.writeBoolean(mediaType != null);
+ if (mediaType != null) {
+ if (out.getVersion().onOrAfter(Version.V_3_0_0)) {
+ mediaType.writeTo(out);
+ } else {
+ out.writeEnum((XContentType) mediaType);
+ }
}
out.writeBytesReference(content);
out.writeString(principalIdentifierToken);
@@ -237,8 +247,8 @@ public Map> headers() {
*
* @return the content type of the {@link #content()}, or null if the context is plain text or if there is no content.
*/
- public XContentType getXContentType() {
- return xContentType;
+ public MediaType getXContentType() {
+ return mediaType;
}
/**
@@ -311,7 +321,7 @@ public String toString() {
+ ", headers="
+ headers.toString()
+ ", xContentType="
- + xContentType
+ + mediaType
+ ", contentLength="
+ content.length()
+ ", requester="
@@ -331,7 +341,7 @@ public boolean equals(Object obj) {
&& Objects.equals(path, that.path)
&& Objects.equals(params, that.params)
&& Objects.equals(headers, that.headers)
- && Objects.equals(xContentType, that.xContentType)
+ && Objects.equals(mediaType, that.mediaType)
&& Objects.equals(content, that.content)
&& Objects.equals(principalIdentifierToken, that.principalIdentifierToken)
&& Objects.equals(httpVersion, that.httpVersion);
@@ -339,6 +349,6 @@ public boolean equals(Object obj) {
@Override
public int hashCode() {
- return Objects.hash(method, uri, path, params, headers, xContentType, content, principalIdentifierToken, httpVersion);
+ return Objects.hash(method, uri, path, params, headers, mediaType, content, principalIdentifierToken, httpVersion);
}
}
diff --git a/server/src/main/java/org/opensearch/extensions/rest/RestInitializeExtensionAction.java b/server/src/main/java/org/opensearch/extensions/rest/RestInitializeExtensionAction.java
index 2a3ad63379556..4b622b841a040 100644
--- a/server/src/main/java/org/opensearch/extensions/rest/RestInitializeExtensionAction.java
+++ b/server/src/main/java/org/opensearch/extensions/rest/RestInitializeExtensionAction.java
@@ -80,7 +80,7 @@ public RestChannelConsumer prepareRequest(RestRequest request, NodeClient client
Tuple extends MediaType, Map> unreadExtensionTuple = XContentHelper.convertToMap(
request.content(),
false,
- request.getXContentType().xContent().mediaType()
+ request.getMediaType().xContent().mediaType()
);
Map extensionMap = unreadExtensionTuple.v2();
diff --git a/server/src/main/java/org/opensearch/extensions/rest/RestSendToExtensionAction.java b/server/src/main/java/org/opensearch/extensions/rest/RestSendToExtensionAction.java
index e20a3c6b2814c..a96e87b0200cc 100644
--- a/server/src/main/java/org/opensearch/extensions/rest/RestSendToExtensionAction.java
+++ b/server/src/main/java/org/opensearch/extensions/rest/RestSendToExtensionAction.java
@@ -14,7 +14,7 @@
import org.opensearch.client.node.NodeClient;
import org.opensearch.core.common.bytes.BytesReference;
import org.opensearch.core.common.io.stream.StreamInput;
-import org.opensearch.common.xcontent.XContentType;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.extensions.DiscoveryExtensionNode;
import org.opensearch.extensions.ExtensionsManager;
import org.opensearch.rest.BaseRestHandler;
@@ -181,7 +181,7 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC
String uri = httpRequest.uri();
Map params = request.params();
Map> headers = request.getHeaders();
- XContentType contentType = request.getXContentType();
+ MediaType contentType = request.getMediaType();
BytesReference content = request.content();
HttpRequest.HttpVersion httpVersion = httpRequest.protocolVersion();
diff --git a/server/src/main/java/org/opensearch/index/IndexingSlowLog.java b/server/src/main/java/org/opensearch/index/IndexingSlowLog.java
index 87605969feb6a..86c5d4542e5fa 100644
--- a/server/src/main/java/org/opensearch/index/IndexingSlowLog.java
+++ b/server/src/main/java/org/opensearch/index/IndexingSlowLog.java
@@ -244,7 +244,7 @@ private static Map prepareMap(
return map;
}
try {
- String source = XContentHelper.convertToJson(doc.source(), reformat, doc.getXContentType());
+ String source = XContentHelper.convertToJson(doc.source(), reformat, doc.getMediaType());
String trim = Strings.cleanTruncate(source, maxSourceCharsToLog).trim();
StringBuilder sb = new StringBuilder(trim);
StringBuilders.escapeJson(sb, 0);
@@ -279,7 +279,7 @@ private static String message(Index index, ParsedDocument doc, long tookInNanos,
return sb.toString();
}
try {
- String source = XContentHelper.convertToJson(doc.source(), reformat, doc.getXContentType());
+ String source = XContentHelper.convertToJson(doc.source(), reformat, doc.getMediaType());
sb.append(", source[").append(Strings.cleanTruncate(source, maxSourceCharsToLog).trim()).append("]");
} catch (IOException e) {
sb.append(", source[_failed_to_convert_[").append(e.getMessage()).append("]]");
diff --git a/server/src/main/java/org/opensearch/index/mapper/DocumentParser.java b/server/src/main/java/org/opensearch/index/mapper/DocumentParser.java
index c5ee5be491095..f276d6ee2e579 100644
--- a/server/src/main/java/org/opensearch/index/mapper/DocumentParser.java
+++ b/server/src/main/java/org/opensearch/index/mapper/DocumentParser.java
@@ -43,8 +43,8 @@
import org.opensearch.common.xcontent.LoggingDeprecationHandler;
import org.opensearch.common.xcontent.XContentHelper;
import org.opensearch.core.common.Strings;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.XContentParser;
-import org.opensearch.common.xcontent.XContentType;
import org.opensearch.index.IndexSettings;
import org.opensearch.index.mapper.DynamicTemplate.XContentFieldType;
@@ -77,14 +77,14 @@ final class DocumentParser {
ParsedDocument parseDocument(SourceToParse source, MetadataFieldMapper[] metadataFieldsMappers) throws MapperParsingException {
final Mapping mapping = docMapper.mapping();
final ParseContext.InternalParseContext context;
- final XContentType xContentType = source.getXContentType();
+ final MediaType mediaType = source.getMediaType();
try (
XContentParser parser = XContentHelper.createParser(
docMapperParser.getXContentRegistry(),
LoggingDeprecationHandler.INSTANCE,
source.source(),
- xContentType
+ mediaType
)
) {
context = new ParseContext.InternalParseContext(indexSettings, docMapperParser, docMapper, source, parser);
@@ -183,7 +183,7 @@ private static ParsedDocument parsedDocument(SourceToParse source, ParseContext.
source.routing(),
context.docs(),
context.sourceToParse().source(),
- context.sourceToParse().getXContentType(),
+ context.sourceToParse().getMediaType(),
update
);
}
diff --git a/server/src/main/java/org/opensearch/index/mapper/ParsedDocument.java b/server/src/main/java/org/opensearch/index/mapper/ParsedDocument.java
index 46f0352976408..1084c08cdf32c 100644
--- a/server/src/main/java/org/opensearch/index/mapper/ParsedDocument.java
+++ b/server/src/main/java/org/opensearch/index/mapper/ParsedDocument.java
@@ -35,6 +35,7 @@
import org.apache.lucene.document.Field;
import org.opensearch.core.common.bytes.BytesReference;
import org.opensearch.common.xcontent.XContentType;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.index.mapper.ParseContext.Document;
import org.opensearch.index.mapper.MapperService.MergeReason;
@@ -57,7 +58,7 @@ public class ParsedDocument {
private final List documents;
private BytesReference source;
- private XContentType xContentType;
+ private MediaType mediaType;
private Mapping dynamicMappingsUpdate;
@@ -68,7 +69,7 @@ public ParsedDocument(
String routing,
List documents,
BytesReference source,
- XContentType xContentType,
+ MediaType mediaType,
Mapping dynamicMappingsUpdate
) {
this.version = version;
@@ -78,7 +79,7 @@ public ParsedDocument(
this.documents = documents;
this.source = source;
this.dynamicMappingsUpdate = dynamicMappingsUpdate;
- this.xContentType = xContentType;
+ this.mediaType = mediaType;
}
public String id() {
@@ -122,13 +123,13 @@ public BytesReference source() {
return this.source;
}
- public XContentType getXContentType() {
- return this.xContentType;
+ public MediaType getMediaType() {
+ return this.mediaType;
}
public void setSource(BytesReference source, XContentType xContentType) {
this.source = source;
- this.xContentType = xContentType;
+ this.mediaType = xContentType;
}
/**
diff --git a/server/src/main/java/org/opensearch/index/mapper/SourceFieldMapper.java b/server/src/main/java/org/opensearch/index/mapper/SourceFieldMapper.java
index 95e71f168c2ca..ad467d045b7e4 100644
--- a/server/src/main/java/org/opensearch/index/mapper/SourceFieldMapper.java
+++ b/server/src/main/java/org/opensearch/index/mapper/SourceFieldMapper.java
@@ -45,9 +45,9 @@
import org.opensearch.common.util.CollectionUtils;
import org.opensearch.common.xcontent.XContentFactory;
import org.opensearch.common.xcontent.XContentHelper;
-import org.opensearch.common.xcontent.XContentType;
import org.opensearch.common.xcontent.support.XContentMapValues;
import org.opensearch.core.common.Strings;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.XContentBuilder;
import org.opensearch.index.query.QueryShardContext;
import org.opensearch.index.query.QueryShardException;
@@ -202,7 +202,7 @@ public boolean isComplete() {
@Override
public void preParse(ParseContext context) throws IOException {
BytesReference originalSource = context.sourceToParse().source();
- XContentType contentType = context.sourceToParse().getXContentType();
+ MediaType contentType = context.sourceToParse().getMediaType();
final BytesReference adaptedSource = applyFilters(originalSource, contentType);
if (adaptedSource != null) {
@@ -219,15 +219,15 @@ public void preParse(ParseContext context) throws IOException {
}
@Nullable
- public BytesReference applyFilters(@Nullable BytesReference originalSource, @Nullable XContentType contentType) throws IOException {
+ public BytesReference applyFilters(@Nullable BytesReference originalSource, @Nullable MediaType contentType) throws IOException {
if (enabled && originalSource != null) {
// Percolate and tv APIs may not set the source and that is ok, because these APIs will not index any data
if (filter != null) {
// we don't update the context source if we filter, we want to keep it as is...
- Tuple> mapTuple = XContentHelper.convertToMap(originalSource, true, contentType);
+ Tuple extends MediaType, Map> mapTuple = XContentHelper.convertToMap(originalSource, true, contentType);
Map filteredSource = filter.apply(mapTuple.v2());
BytesStreamOutput bStream = new BytesStreamOutput();
- XContentType actualContentType = mapTuple.v1();
+ MediaType actualContentType = mapTuple.v1();
XContentBuilder builder = XContentFactory.contentBuilder(actualContentType, bStream).map(filteredSource);
builder.close();
return bStream.bytes();
diff --git a/server/src/main/java/org/opensearch/index/mapper/SourceToParse.java b/server/src/main/java/org/opensearch/index/mapper/SourceToParse.java
index 085e258c5501e..2b24a380c8bb6 100644
--- a/server/src/main/java/org/opensearch/index/mapper/SourceToParse.java
+++ b/server/src/main/java/org/opensearch/index/mapper/SourceToParse.java
@@ -37,7 +37,7 @@
import org.opensearch.common.Nullable;
import org.opensearch.core.common.bytes.BytesArray;
import org.opensearch.core.common.bytes.BytesReference;
-import org.opensearch.common.xcontent.XContentType;
+import org.opensearch.core.xcontent.MediaType;
/**
* Stores the document source
@@ -54,20 +54,20 @@ public class SourceToParse {
private final @Nullable String routing;
- private final XContentType xContentType;
+ private final MediaType mediaType;
- public SourceToParse(String index, String id, BytesReference source, XContentType xContentType, @Nullable String routing) {
+ public SourceToParse(String index, String id, BytesReference source, MediaType mediaType, @Nullable String routing) {
this.index = Objects.requireNonNull(index);
this.id = Objects.requireNonNull(id);
// we always convert back to byte array, since we store it and Field only supports bytes..
// so, we might as well do it here, and improve the performance of working with direct byte arrays
this.source = new BytesArray(Objects.requireNonNull(source).toBytesRef());
- this.xContentType = Objects.requireNonNull(xContentType);
+ this.mediaType = Objects.requireNonNull(mediaType);
this.routing = routing;
}
- public SourceToParse(String index, String id, BytesReference source, XContentType xContentType) {
- this(index, id, source, xContentType, null);
+ public SourceToParse(String index, String id, BytesReference source, MediaType mediaType) {
+ this(index, id, source, mediaType, null);
}
public BytesReference source() {
@@ -86,8 +86,8 @@ public String id() {
return this.routing;
}
- public XContentType getXContentType() {
- return this.xContentType;
+ public MediaType getMediaType() {
+ return this.mediaType;
}
/**
diff --git a/server/src/main/java/org/opensearch/index/query/MoreLikeThisQueryBuilder.java b/server/src/main/java/org/opensearch/index/query/MoreLikeThisQueryBuilder.java
index 36b74c95c3200..7287634ecfacb 100644
--- a/server/src/main/java/org/opensearch/index/query/MoreLikeThisQueryBuilder.java
+++ b/server/src/main/java/org/opensearch/index/query/MoreLikeThisQueryBuilder.java
@@ -58,6 +58,7 @@
import org.opensearch.common.lucene.search.MoreLikeThisQuery;
import org.opensearch.common.lucene.search.XMoreLikeThis;
import org.opensearch.common.lucene.uid.Versions;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.ToXContentObject;
import org.opensearch.core.xcontent.XContentBuilder;
import org.opensearch.common.xcontent.XContentFactory;
@@ -170,7 +171,7 @@ public static final class Item implements ToXContentObject, Writeable {
private String index;
private String id;
private BytesReference doc;
- private XContentType xContentType;
+ private MediaType mediaType;
private String[] fields;
private Map perFieldAnalyzer;
private String routing;
@@ -187,7 +188,7 @@ public Item() {}
this.id = copy.id;
this.routing = copy.routing;
this.doc = copy.doc;
- this.xContentType = copy.xContentType;
+ this.mediaType = copy.mediaType;
this.fields = copy.fields;
this.perFieldAnalyzer = copy.perFieldAnalyzer;
this.version = copy.version;
@@ -220,7 +221,7 @@ public Item(@Nullable String index, XContentBuilder doc) {
}
this.index = index;
this.doc = BytesReference.bytes(doc);
- this.xContentType = XContentType.fromMediaType(doc.contentType());
+ this.mediaType = doc.contentType();
}
/**
@@ -234,7 +235,11 @@ public Item(@Nullable String index, XContentBuilder doc) {
}
if (in.readBoolean()) {
doc = (BytesReference) in.readGenericValue();
- xContentType = in.readEnum(XContentType.class);
+ if (in.getVersion().onOrAfter(Version.V_3_0_0)) {
+ mediaType = in.readMediaType();
+ } else {
+ mediaType = in.readEnum(XContentType.class);
+ }
} else {
id = in.readString();
}
@@ -255,7 +260,11 @@ public void writeTo(StreamOutput out) throws IOException {
out.writeBoolean(doc != null);
if (doc != null) {
out.writeGenericValue(doc);
- out.writeEnum(xContentType);
+ if (out.getVersion().onOrAfter(Version.V_3_0_0)) {
+ mediaType.writeTo(out);
+ } else {
+ out.writeEnum((XContentType) mediaType);
+ }
} else {
out.writeString(id);
}
@@ -331,8 +340,8 @@ public Item versionType(VersionType versionType) {
return this;
}
- XContentType xContentType() {
- return xContentType;
+ MediaType mediaType() {
+ return mediaType;
}
/**
@@ -351,7 +360,7 @@ TermVectorsRequest toTermVectorsRequest() {
.termStatistics(false);
// for artificial docs to make sure that the id has changed in the item too
if (doc != null) {
- termVectorsRequest.doc(doc, true, xContentType);
+ termVectorsRequest.doc(doc, true, mediaType);
this.id = termVectorsRequest.id();
}
return termVectorsRequest;
@@ -373,7 +382,7 @@ public static Item parse(XContentParser parser, Item item) throws IOException {
item.id = parser.text();
} else if (DOC.match(currentFieldName, parser.getDeprecationHandler())) {
item.doc = BytesReference.bytes(jsonBuilder().copyCurrentStructure(parser));
- item.xContentType = XContentType.JSON;
+ item.mediaType = XContentType.JSON;
} else if (FIELDS.match(currentFieldName, parser.getDeprecationHandler())) {
if (token == XContentParser.Token.START_ARRAY) {
List fields = new ArrayList<>();
@@ -419,7 +428,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
}
if (this.doc != null) {
try (InputStream stream = this.doc.streamInput()) {
- builder.rawField(DOC.getPreferredName(), stream, xContentType);
+ builder.rawField(DOC.getPreferredName(), stream, mediaType);
}
}
if (this.fields != null) {
diff --git a/server/src/main/java/org/opensearch/index/reindex/ClientScrollableHitSource.java b/server/src/main/java/org/opensearch/index/reindex/ClientScrollableHitSource.java
index 998427c27c1f6..b3ed0079ff4c2 100644
--- a/server/src/main/java/org/opensearch/index/reindex/ClientScrollableHitSource.java
+++ b/server/src/main/java/org/opensearch/index/reindex/ClientScrollableHitSource.java
@@ -50,7 +50,7 @@
import org.opensearch.common.unit.TimeValue;
import org.opensearch.core.concurrency.OpenSearchRejectedExecutionException;
import org.opensearch.common.xcontent.XContentHelper;
-import org.opensearch.common.xcontent.XContentType;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.index.mapper.RoutingFieldMapper;
import org.opensearch.search.SearchHit;
import org.opensearch.threadpool.ThreadPool;
@@ -209,7 +209,7 @@ public BytesReference getSource() {
}
@Override
- public XContentType getXContentType() {
+ public MediaType getMediaType() {
return XContentHelper.xContentType(source);
}
diff --git a/server/src/main/java/org/opensearch/index/reindex/ScrollableHitSource.java b/server/src/main/java/org/opensearch/index/reindex/ScrollableHitSource.java
index a4047507fcde1..47e882fc04127 100644
--- a/server/src/main/java/org/opensearch/index/reindex/ScrollableHitSource.java
+++ b/server/src/main/java/org/opensearch/index/reindex/ScrollableHitSource.java
@@ -46,6 +46,7 @@
import org.opensearch.core.common.io.stream.StreamOutput;
import org.opensearch.core.common.io.stream.Writeable;
import org.opensearch.common.unit.TimeValue;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.ToXContentObject;
import org.opensearch.core.xcontent.XContentBuilder;
import org.opensearch.common.xcontent.XContentType;
@@ -296,7 +297,7 @@ public interface Hit {
* The content type of the hit source. Returns null if the source didn't come back from the search.
*/
@Nullable
- XContentType getXContentType();
+ MediaType getMediaType();
/**
* The routing on the hit if there is any or null if there isn't.
@@ -316,7 +317,7 @@ public static class BasicHit implements Hit {
private final long version;
private BytesReference source;
- private XContentType xContentType;
+ private MediaType mediaType;
private String routing;
private long seqNo;
private long primaryTerm;
@@ -358,13 +359,13 @@ public BytesReference getSource() {
}
@Override
- public XContentType getXContentType() {
- return xContentType;
+ public MediaType getMediaType() {
+ return mediaType;
}
- public BasicHit setSource(BytesReference source, XContentType xContentType) {
+ public BasicHit setSource(BytesReference source, MediaType mediaType) {
this.source = source;
- this.xContentType = xContentType;
+ this.mediaType = mediaType;
return this;
}
diff --git a/server/src/main/java/org/opensearch/index/shard/IndexShard.java b/server/src/main/java/org/opensearch/index/shard/IndexShard.java
index fbb2df7f9640a..0d8a54147d65e 100644
--- a/server/src/main/java/org/opensearch/index/shard/IndexShard.java
+++ b/server/src/main/java/org/opensearch/index/shard/IndexShard.java
@@ -43,7 +43,6 @@
import org.apache.lucene.index.LeafReader;
import org.apache.lucene.index.SegmentInfos;
import org.apache.lucene.index.Term;
-import org.apache.lucene.index.IndexFileNames;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.QueryCachingPolicy;
import org.apache.lucene.search.ReferenceManager;
@@ -948,7 +947,7 @@ public Engine.IndexResult applyIndexOperationOnReplica(
if (indexSettings.isSegRepEnabled()) {
Engine.Index index = new Engine.Index(
new Term(IdFieldMapper.NAME, Uid.encodeId(id)),
- new ParsedDocument(null, null, id, null, null, sourceToParse.source(), sourceToParse.getXContentType(), null),
+ new ParsedDocument(null, null, id, null, null, sourceToParse.source(), sourceToParse.getMediaType(), null),
seqNo,
opPrimaryTerm,
version,
diff --git a/server/src/main/java/org/opensearch/index/termvectors/TermVectorsService.java b/server/src/main/java/org/opensearch/index/termvectors/TermVectorsService.java
index 3314b2e8d2c8c..0e9d7c2f14113 100644
--- a/server/src/main/java/org/opensearch/index/termvectors/TermVectorsService.java
+++ b/server/src/main/java/org/opensearch/index/termvectors/TermVectorsService.java
@@ -50,9 +50,9 @@
import org.opensearch.common.document.DocumentField;
import org.opensearch.common.lucene.uid.VersionsAndSeqNoResolver.DocIdAndVersion;
import org.opensearch.common.xcontent.XContentHelper;
-import org.opensearch.common.xcontent.XContentType;
import org.opensearch.common.xcontent.support.XContentMapValues;
import org.opensearch.core.common.Strings;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.index.engine.Engine;
import org.opensearch.index.get.GetResult;
import org.opensearch.index.mapper.DocumentMapperForType;
@@ -390,13 +390,13 @@ private static ParsedDocument parseDocument(
IndexShard indexShard,
String index,
BytesReference doc,
- XContentType xContentType,
+ MediaType mediaType,
String routing
) {
MapperService mapperService = indexShard.mapperService();
DocumentMapperForType docMapper = mapperService.documentMapperWithAutoCreate();
ParsedDocument parsedDocument = docMapper.getDocumentMapper()
- .parse(new SourceToParse(index, "_id_for_tv_api", doc, xContentType, routing));
+ .parse(new SourceToParse(index, "_id_for_tv_api", doc, mediaType, routing));
if (docMapper.getMapping() != null) {
parsedDocument.addDynamicMappingsUpdate(docMapper.getMapping());
}
diff --git a/server/src/main/java/org/opensearch/ingest/IngestService.java b/server/src/main/java/org/opensearch/ingest/IngestService.java
index 0984046ca3077..52ced9c051d14 100644
--- a/server/src/main/java/org/opensearch/ingest/IngestService.java
+++ b/server/src/main/java/org/opensearch/ingest/IngestService.java
@@ -474,7 +474,7 @@ public static ClusterState innerPut(PutPipelineRequest request, ClusterState cur
pipelines = new HashMap<>();
}
- pipelines.put(request.getId(), new PipelineConfiguration(request.getId(), request.getSource(), request.getXContentType()));
+ pipelines.put(request.getId(), new PipelineConfiguration(request.getId(), request.getSource(), request.getMediaType()));
ClusterState.Builder newState = ClusterState.builder(currentState);
newState.metadata(
Metadata.builder(currentState.getMetadata()).putCustom(IngestMetadata.TYPE, new IngestMetadata(pipelines)).build()
@@ -487,7 +487,7 @@ void validatePipeline(Map ingestInfos, PutPipelineReq
throw new IllegalStateException("Ingest info is empty");
}
- Map pipelineConfig = XContentHelper.convertToMap(request.getSource(), false, request.getXContentType()).v2();
+ Map pipelineConfig = XContentHelper.convertToMap(request.getSource(), false, request.getMediaType()).v2();
Pipeline pipeline = Pipeline.create(request.getId(), pipelineConfig, processorFactories, scriptService);
List exceptions = new ArrayList<>();
for (Processor processor : pipeline.flattenAllProcessors()) {
diff --git a/server/src/main/java/org/opensearch/ingest/PipelineConfiguration.java b/server/src/main/java/org/opensearch/ingest/PipelineConfiguration.java
index 08a3708ae60ae..04892e4653065 100644
--- a/server/src/main/java/org/opensearch/ingest/PipelineConfiguration.java
+++ b/server/src/main/java/org/opensearch/ingest/PipelineConfiguration.java
@@ -32,6 +32,7 @@
package org.opensearch.ingest;
+import org.opensearch.Version;
import org.opensearch.cluster.AbstractDiffable;
import org.opensearch.cluster.Diff;
import org.opensearch.core.ParseField;
@@ -77,7 +78,7 @@ private static class Builder {
private String id;
private BytesReference config;
- private XContentType xContentType;
+ private MediaType mediaType;
void setId(String id) {
this.id = id;
@@ -88,11 +89,11 @@ void setConfig(BytesReference config, MediaType mediaType) {
throw new IllegalArgumentException("PipelineConfiguration does not support media type [" + mediaType.getClass() + "]");
}
this.config = config;
- this.xContentType = XContentType.fromMediaType(mediaType);
+ this.mediaType = mediaType;
}
PipelineConfiguration build() {
- return new PipelineConfiguration(id, config, xContentType);
+ return new PipelineConfiguration(id, config, mediaType);
}
}
@@ -101,16 +102,12 @@ PipelineConfiguration build() {
// and the way the map of maps config is read requires a deep copy (it removes instead of gets entries to check for unused options)
// also the get pipeline api just directly returns this to the caller
private final BytesReference config;
- private final XContentType xContentType;
+ private final MediaType mediaType;
- public PipelineConfiguration(String id, BytesReference config, XContentType xContentType) {
+ public PipelineConfiguration(String id, BytesReference config, MediaType mediaType) {
this.id = Objects.requireNonNull(id);
this.config = Objects.requireNonNull(config);
- this.xContentType = Objects.requireNonNull(xContentType);
- }
-
- public PipelineConfiguration(String id, BytesReference config, MediaType mediaType) {
- this(id, config, XContentType.fromMediaType(mediaType));
+ this.mediaType = Objects.requireNonNull(mediaType);
}
public String getId() {
@@ -118,12 +115,12 @@ public String getId() {
}
public Map getConfigAsMap() {
- return XContentHelper.convertToMap(config, true, xContentType).v2();
+ return XContentHelper.convertToMap(config, true, mediaType).v2();
}
// pkg-private for tests
- XContentType getXContentType() {
- return xContentType;
+ MediaType getMediaType() {
+ return mediaType;
}
// pkg-private for tests
@@ -141,7 +138,11 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
}
public static PipelineConfiguration readFrom(StreamInput in) throws IOException {
- return new PipelineConfiguration(in.readString(), in.readBytesReference(), in.readEnum(XContentType.class));
+ return new PipelineConfiguration(
+ in.readString(),
+ in.readBytesReference(),
+ in.getVersion().onOrAfter(Version.V_3_0_0) ? in.readMediaType() : in.readEnum(XContentType.class)
+ );
}
public static Diff readDiffFrom(StreamInput in) throws IOException {
@@ -157,7 +158,11 @@ public String toString() {
public void writeTo(StreamOutput out) throws IOException {
out.writeString(id);
out.writeBytesReference(config);
- out.writeEnum(xContentType);
+ if (out.getVersion().onOrAfter(Version.V_3_0_0)) {
+ mediaType.writeTo(out);
+ } else {
+ out.writeEnum((XContentType) mediaType);
+ }
}
@Override
diff --git a/server/src/main/java/org/opensearch/rest/AbstractRestChannel.java b/server/src/main/java/org/opensearch/rest/AbstractRestChannel.java
index 2fc6ef86df603..dcee6500325b9 100644
--- a/server/src/main/java/org/opensearch/rest/AbstractRestChannel.java
+++ b/server/src/main/java/org/opensearch/rest/AbstractRestChannel.java
@@ -35,9 +35,10 @@
import org.opensearch.common.io.Streams;
import org.opensearch.common.io.stream.BytesStreamOutput;
import org.opensearch.core.common.Strings;
+import org.opensearch.core.xcontent.MediaType;
+import org.opensearch.core.xcontent.MediaTypeParserRegistry;
import org.opensearch.core.xcontent.XContentBuilder;
import org.opensearch.common.xcontent.XContentFactory;
-import org.opensearch.common.xcontent.XContentType;
import java.io.IOException;
import java.io.OutputStream;
@@ -86,43 +87,40 @@ protected AbstractRestChannel(RestRequest request, boolean detailedErrorsEnabled
@Override
public XContentBuilder newBuilder() throws IOException {
- return newBuilder(request.getXContentType(), true);
+ return newBuilder(request.getMediaType(), true);
}
@Override
public XContentBuilder newErrorBuilder() throws IOException {
// Disable filtering when building error responses
- return newBuilder(request.getXContentType(), false);
+ return newBuilder(request.getMediaType(), false);
}
/**
* Creates a new {@link XContentBuilder} for a response to be sent using this channel. The builder's type is determined by the following
- * logic. If the request has a format parameter that will be used to attempt to map to an {@link XContentType}. If there is no format
- * parameter, the HTTP Accept header is checked to see if it can be matched to a {@link XContentType}. If this first attempt to map
+ * logic. If the request has a format parameter that will be used to attempt to map to an {@link MediaType}. If there is no format
+ * parameter, the HTTP Accept header is checked to see if it can be matched to a {@link MediaType}. If this first attempt to map
* fails, the request content type will be used if the value is not {@code null}; if the value is {@code null} the output format falls
* back to JSON.
*/
@Override
- public XContentBuilder newBuilder(@Nullable XContentType requestContentType, boolean useFiltering) throws IOException {
+ public XContentBuilder newBuilder(@Nullable MediaType requestContentType, boolean useFiltering) throws IOException {
return newBuilder(requestContentType, null, useFiltering);
}
/**
* Creates a new {@link XContentBuilder} for a response to be sent using this channel. The builder's type can be sent as a parameter,
- * through {@code responseContentType} or it can fallback to {@link #newBuilder(XContentType, boolean)} logic if the sent type value
+ * through {@code responseContentType} or it can fallback to {@link #newBuilder(MediaType, boolean)} logic if the sent type value
* is {@code null}.
*/
@Override
- public XContentBuilder newBuilder(
- @Nullable XContentType requestContentType,
- @Nullable XContentType responseContentType,
- boolean useFiltering
- ) throws IOException {
+ public XContentBuilder newBuilder(@Nullable MediaType requestContentType, @Nullable MediaType responseContentType, boolean useFiltering)
+ throws IOException {
if (responseContentType == null) {
// TODO should format vs acceptHeader always be the same, do we allow overriding?
- responseContentType = XContentType.fromFormat(format);
+ responseContentType = MediaType.fromFormat(format);
if (responseContentType == null) {
- responseContentType = XContentType.fromMediaType(acceptHeader);
+ responseContentType = MediaType.fromMediaType(acceptHeader);
}
}
// try to determine the response content type from the media type or the format query string parameter, with the format parameter
@@ -134,7 +132,7 @@ public XContentBuilder newBuilder(
responseContentType = requestContentType;
} else {
// default to JSON output when all else fails
- responseContentType = XContentType.JSON;
+ responseContentType = MediaTypeParserRegistry.getDefaultMediaType();
}
}
diff --git a/server/src/main/java/org/opensearch/rest/RestChannel.java b/server/src/main/java/org/opensearch/rest/RestChannel.java
index 6e9e1559ce104..b8ce3e92e0098 100644
--- a/server/src/main/java/org/opensearch/rest/RestChannel.java
+++ b/server/src/main/java/org/opensearch/rest/RestChannel.java
@@ -34,8 +34,8 @@
import org.opensearch.common.Nullable;
import org.opensearch.common.io.stream.BytesStreamOutput;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.XContentBuilder;
-import org.opensearch.common.xcontent.XContentType;
import java.io.IOException;
@@ -50,9 +50,9 @@ public interface RestChannel {
XContentBuilder newErrorBuilder() throws IOException;
- XContentBuilder newBuilder(@Nullable XContentType xContentType, boolean useFiltering) throws IOException;
+ XContentBuilder newBuilder(@Nullable MediaType mediaType, boolean useFiltering) throws IOException;
- XContentBuilder newBuilder(@Nullable XContentType xContentType, @Nullable XContentType responseContentType, boolean useFiltering)
+ XContentBuilder newBuilder(@Nullable MediaType mediaType, @Nullable MediaType responseContentType, boolean useFiltering)
throws IOException;
BytesStreamOutput bytesOutput();
diff --git a/server/src/main/java/org/opensearch/rest/RestController.java b/server/src/main/java/org/opensearch/rest/RestController.java
index 87d1542102f91..a2938810db1c2 100644
--- a/server/src/main/java/org/opensearch/rest/RestController.java
+++ b/server/src/main/java/org/opensearch/rest/RestController.java
@@ -47,6 +47,7 @@
import org.opensearch.common.util.concurrent.ThreadContext;
import org.opensearch.core.common.Strings;
import org.opensearch.core.rest.RestStatus;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.XContentBuilder;
import org.opensearch.common.util.FeatureFlags;
import org.opensearch.common.xcontent.XContentType;
@@ -282,17 +283,17 @@ public void dispatchBadRequest(final RestChannel channel, final ThreadContext th
private void dispatchRequest(RestRequest request, RestChannel channel, RestHandler handler) throws Exception {
final int contentLength = request.content().length();
if (contentLength > 0) {
- final XContentType xContentType = request.getXContentType();
- if (xContentType == null) {
+ final MediaType mediaType = request.getMediaType();
+ if (mediaType == null) {
sendContentTypeErrorMessage(request.getAllHeaderValues("Content-Type"), channel);
return;
}
- if (handler.supportsContentStream() && xContentType != XContentType.JSON && xContentType != XContentType.SMILE) {
+ if (handler.supportsContentStream() && mediaType != XContentType.JSON && mediaType != XContentType.SMILE) {
channel.sendResponse(
BytesRestResponse.createSimpleErrorResponse(
channel,
RestStatus.NOT_ACCEPTABLE,
- "Content-Type [" + xContentType + "] does not support stream parsing. Use JSON or SMILE instead"
+ "Content-Type [" + mediaType + "] does not support stream parsing. Use JSON or SMILE instead"
)
);
return;
@@ -592,14 +593,13 @@ public XContentBuilder newErrorBuilder() throws IOException {
}
@Override
- public XContentBuilder newBuilder(@Nullable XContentType xContentType, boolean useFiltering) throws IOException {
- return delegate.newBuilder(xContentType, useFiltering);
+ public XContentBuilder newBuilder(@Nullable MediaType mediaType, boolean useFiltering) throws IOException {
+ return delegate.newBuilder(mediaType, useFiltering);
}
@Override
- public XContentBuilder newBuilder(XContentType xContentType, XContentType responseContentType, boolean useFiltering)
- throws IOException {
- return delegate.newBuilder(xContentType, responseContentType, useFiltering);
+ public XContentBuilder newBuilder(MediaType mediaType, MediaType responseContentType, boolean useFiltering) throws IOException {
+ return delegate.newBuilder(mediaType, responseContentType, useFiltering);
}
@Override
diff --git a/server/src/main/java/org/opensearch/rest/RestRequest.java b/server/src/main/java/org/opensearch/rest/RestRequest.java
index 653720391d6a3..7382701b6f787 100644
--- a/server/src/main/java/org/opensearch/rest/RestRequest.java
+++ b/server/src/main/java/org/opensearch/rest/RestRequest.java
@@ -44,6 +44,7 @@
import org.opensearch.common.unit.ByteSizeValue;
import org.opensearch.common.unit.TimeValue;
import org.opensearch.common.xcontent.LoggingDeprecationHandler;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.NamedXContentRegistry;
import org.opensearch.core.xcontent.ToXContent;
import org.opensearch.core.xcontent.XContentParser;
@@ -84,7 +85,7 @@ public class RestRequest implements ToXContent.Params {
private final Map> headers;
private final String rawPath;
private final Set consumedParams = new HashSet<>();
- private final SetOnce xContentType = new SetOnce<>();
+ private final SetOnce mediaType = new SetOnce<>();
private final HttpChannel httpChannel;
private HttpRequest httpRequest;
@@ -117,14 +118,14 @@ private RestRequest(
HttpChannel httpChannel,
long requestId
) {
- final XContentType xContentType;
+ final MediaType xContentType;
try {
xContentType = parseContentType(headers.get("Content-Type"));
} catch (final IllegalArgumentException e) {
throw new ContentTypeHeaderException(e);
}
if (xContentType != null) {
- this.xContentType.set(xContentType);
+ this.mediaType.set(xContentType);
}
this.xContentRegistry = xContentRegistry;
this.httpRequest = httpRequest;
@@ -295,7 +296,7 @@ protected BytesReference content(final boolean contentConsumed) {
public final BytesReference requiredContent() {
if (hasContent() == false) {
throw new OpenSearchParseException("request body is required");
- } else if (xContentType.get() == null) {
+ } else if (mediaType.get() == null) {
throw new IllegalStateException("unknown content type");
}
return content();
@@ -340,8 +341,8 @@ public final long getRequestId() {
* a request without a valid {@code Content-Type} header, a request without content ({@link #hasContent()}, or a plain text request
*/
@Nullable
- public final XContentType getXContentType() {
- return xContentType.get();
+ public final MediaType getMediaType() {
+ return mediaType.get();
}
public HttpChannel getHttpChannel() {
@@ -486,7 +487,7 @@ public NamedXContentRegistry getXContentRegistry() {
*/
public final XContentParser contentParser() throws IOException {
BytesReference content = requiredContent(); // will throw exception if body or content type missing
- return xContentType.get().xContent().createParser(xContentRegistry, LoggingDeprecationHandler.INSTANCE, content.streamInput());
+ return mediaType.get().xContent().createParser(xContentRegistry, LoggingDeprecationHandler.INSTANCE, content.streamInput());
}
/**
@@ -514,7 +515,7 @@ public final boolean hasContentOrSourceParam() {
* if you need to handle the absence request content gracefully.
*/
public final XContentParser contentOrSourceParamParser() throws IOException {
- Tuple tuple = contentOrSourceParam();
+ Tuple tuple = contentOrSourceParam();
return tuple.v1().xContent().createParser(xContentRegistry, LoggingDeprecationHandler.INSTANCE, tuple.v2().streamInput());
}
@@ -525,12 +526,12 @@ public final XContentParser contentOrSourceParamParser() throws IOException {
*/
public final void withContentOrSourceParamParserOrNull(CheckedConsumer withParser) throws IOException {
if (hasContentOrSourceParam()) {
- Tuple tuple = contentOrSourceParam();
+ Tuple tuple = contentOrSourceParam();
BytesReference content = tuple.v2();
- XContentType xContentType = tuple.v1();
+ MediaType mediaType = tuple.v1();
try (
InputStream stream = content.streamInput();
- XContentParser parser = xContentType.xContent().createParser(xContentRegistry, LoggingDeprecationHandler.INSTANCE, stream)
+ XContentParser parser = mediaType.xContent().createParser(xContentRegistry, LoggingDeprecationHandler.INSTANCE, stream)
) {
withParser.accept(parser);
}
@@ -543,11 +544,11 @@ public final void withContentOrSourceParamParserOrNull(CheckedConsumer contentOrSourceParam() {
+ public final Tuple contentOrSourceParam() {
if (hasContentOrSourceParam() == false) {
throw new OpenSearchParseException("request body or source parameter is required");
} else if (hasContent()) {
- return new Tuple<>(xContentType.get(), requiredContent());
+ return new Tuple<>(mediaType.get(), requiredContent());
}
String source = param("source");
String typeParam = param("source_content_type");
@@ -555,18 +556,18 @@ public final Tuple contentOrSourceParam() {
throw new IllegalStateException("source and source_content_type parameters are required");
}
BytesArray bytes = new BytesArray(source);
- final XContentType xContentType = parseContentType(Collections.singletonList(typeParam));
- if (xContentType == null) {
+ final MediaType mediaType = parseContentType(Collections.singletonList(typeParam));
+ if (mediaType == null) {
throw new IllegalStateException("Unknown value for source_content_type [" + typeParam + "]");
}
- return new Tuple<>(xContentType, bytes);
+ return new Tuple<>(mediaType, bytes);
}
/**
* Parses the given content type string for the media type. This method currently ignores parameters.
*/
// TODO stop ignoring parameters such as charset...
- public static XContentType parseContentType(List header) {
+ public static MediaType parseContentType(List header) {
if (header == null || header.isEmpty()) {
return null;
} else if (header.size() > 1) {
@@ -580,7 +581,7 @@ public static XContentType parseContentType(List header) {
if (splitMediaType.length == 2
&& TCHAR_PATTERN.matcher(splitMediaType[0]).matches()
&& TCHAR_PATTERN.matcher(splitMediaType[1].trim()).matches()) {
- return XContentType.fromMediaType(elements[0]);
+ return MediaType.fromMediaType(elements[0]);
} else {
throw new IllegalArgumentException("invalid Content-Type header [" + rawContentType + "]");
}
diff --git a/server/src/main/java/org/opensearch/rest/action/admin/cluster/RestPutStoredScriptAction.java b/server/src/main/java/org/opensearch/rest/action/admin/cluster/RestPutStoredScriptAction.java
index 28381af769a51..47ab7ae585039 100644
--- a/server/src/main/java/org/opensearch/rest/action/admin/cluster/RestPutStoredScriptAction.java
+++ b/server/src/main/java/org/opensearch/rest/action/admin/cluster/RestPutStoredScriptAction.java
@@ -35,7 +35,7 @@
import org.opensearch.client.node.NodeClient;
import org.opensearch.core.common.bytes.BytesReference;
import org.opensearch.common.logging.DeprecationLogger;
-import org.opensearch.common.xcontent.XContentType;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.rest.BaseRestHandler;
import org.opensearch.rest.RestRequest;
import org.opensearch.rest.action.RestToXContentListener;
@@ -80,10 +80,10 @@ public RestChannelConsumer prepareRequest(RestRequest request, NodeClient client
String id = request.param("id");
String context = request.param("context");
BytesReference content = request.requiredContent();
- XContentType xContentType = request.getXContentType();
- StoredScriptSource source = StoredScriptSource.parse(content, xContentType);
+ MediaType mediaType = request.getMediaType();
+ StoredScriptSource source = StoredScriptSource.parse(content, mediaType);
- PutStoredScriptRequest putRequest = new PutStoredScriptRequest(id, context, content, request.getXContentType(), source);
+ PutStoredScriptRequest putRequest = new PutStoredScriptRequest(id, context, content, request.getMediaType(), source);
putRequest.clusterManagerNodeTimeout(request.paramAsTime("cluster_manager_timeout", putRequest.clusterManagerNodeTimeout()));
parseDeprecatedMasterTimeoutParameter(putRequest, request, deprecationLogger, getName());
putRequest.timeout(request.paramAsTime("timeout", putRequest.timeout()));
diff --git a/server/src/main/java/org/opensearch/rest/action/admin/indices/RestCreateIndexAction.java b/server/src/main/java/org/opensearch/rest/action/admin/indices/RestCreateIndexAction.java
index e7335eee89c5a..d987e8fe63506 100644
--- a/server/src/main/java/org/opensearch/rest/action/admin/indices/RestCreateIndexAction.java
+++ b/server/src/main/java/org/opensearch/rest/action/admin/indices/RestCreateIndexAction.java
@@ -76,7 +76,7 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC
CreateIndexRequest createIndexRequest = new CreateIndexRequest(request.param("index"));
if (request.hasContent()) {
- Map sourceAsMap = XContentHelper.convertToMap(request.requiredContent(), false, request.getXContentType()).v2();
+ Map sourceAsMap = XContentHelper.convertToMap(request.requiredContent(), false, request.getMediaType()).v2();
sourceAsMap = prepareMappings(sourceAsMap);
createIndexRequest.source(sourceAsMap, LoggingDeprecationHandler.INSTANCE);
}
diff --git a/server/src/main/java/org/opensearch/rest/action/admin/indices/RestPutIndexTemplateAction.java b/server/src/main/java/org/opensearch/rest/action/admin/indices/RestPutIndexTemplateAction.java
index 86b0111e4b064..dde9f470161b9 100644
--- a/server/src/main/java/org/opensearch/rest/action/admin/indices/RestPutIndexTemplateAction.java
+++ b/server/src/main/java/org/opensearch/rest/action/admin/indices/RestPutIndexTemplateAction.java
@@ -88,7 +88,7 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC
putRequest.create(request.paramAsBoolean("create", false));
putRequest.cause(request.param("cause", ""));
- Map sourceAsMap = XContentHelper.convertToMap(request.requiredContent(), false, request.getXContentType()).v2();
+ Map sourceAsMap = XContentHelper.convertToMap(request.requiredContent(), false, request.getMediaType()).v2();
sourceAsMap = RestCreateIndexAction.prepareMappings(sourceAsMap);
putRequest.source(sourceAsMap);
diff --git a/server/src/main/java/org/opensearch/rest/action/admin/indices/RestPutMappingAction.java b/server/src/main/java/org/opensearch/rest/action/admin/indices/RestPutMappingAction.java
index fd293dceb4cc1..8fdf000139d89 100644
--- a/server/src/main/java/org/opensearch/rest/action/admin/indices/RestPutMappingAction.java
+++ b/server/src/main/java/org/opensearch/rest/action/admin/indices/RestPutMappingAction.java
@@ -83,7 +83,7 @@ public String getName() {
public RestChannelConsumer prepareRequest(final RestRequest request, final NodeClient client) throws IOException {
PutMappingRequest putMappingRequest = putMappingRequest(Strings.splitStringByCommaToArray(request.param("index")));
- Map sourceAsMap = XContentHelper.convertToMap(request.requiredContent(), false, request.getXContentType()).v2();
+ Map sourceAsMap = XContentHelper.convertToMap(request.requiredContent(), false, request.getMediaType()).v2();
if (MapperService.isMappingSourceTyped(MapperService.SINGLE_MAPPING_NAME, sourceAsMap)) {
throw new IllegalArgumentException("Types cannot be provided in put mapping requests");
diff --git a/server/src/main/java/org/opensearch/rest/action/cat/RestTable.java b/server/src/main/java/org/opensearch/rest/action/cat/RestTable.java
index 556928d4685a0..6a5d4e40eb452 100644
--- a/server/src/main/java/org/opensearch/rest/action/cat/RestTable.java
+++ b/server/src/main/java/org/opensearch/rest/action/cat/RestTable.java
@@ -42,8 +42,8 @@
import org.opensearch.common.unit.SizeValue;
import org.opensearch.common.unit.TimeValue;
import org.opensearch.core.common.Strings;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.XContentBuilder;
-import org.opensearch.common.xcontent.XContentType;
import org.opensearch.rest.BytesRestResponse;
import org.opensearch.rest.RestChannel;
import org.opensearch.rest.RestRequest;
@@ -69,18 +69,18 @@ public class RestTable {
public static RestResponse buildResponse(Table table, RestChannel channel) throws Exception {
RestRequest request = channel.request();
- XContentType xContentType = getXContentType(request);
+ MediaType xContentType = getXContentType(request);
if (xContentType != null) {
return buildXContentBuilder(table, channel);
}
return buildTextPlainResponse(table, channel);
}
- private static XContentType getXContentType(RestRequest request) {
+ private static MediaType getXContentType(RestRequest request) {
if (request.hasParam("format")) {
- return XContentType.fromFormat(request.param("format"));
+ return MediaType.fromFormat(request.param("format"));
}
- return XContentType.fromMediaType(request.header("Accept"));
+ return MediaType.fromMediaType(request.header("Accept"));
}
public static RestResponse buildXContentBuilder(Table table, RestChannel channel) throws Exception {
diff --git a/server/src/main/java/org/opensearch/rest/action/document/RestBulkAction.java b/server/src/main/java/org/opensearch/rest/action/document/RestBulkAction.java
index 3fc02db0a8365..b046146707885 100644
--- a/server/src/main/java/org/opensearch/rest/action/document/RestBulkAction.java
+++ b/server/src/main/java/org/opensearch/rest/action/document/RestBulkAction.java
@@ -105,7 +105,7 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC
defaultPipeline,
defaultRequireAlias,
allowExplicitIndex,
- request.getXContentType()
+ request.getMediaType()
);
return channel -> client.bulk(bulkRequest, new RestStatusToXContentListener<>(channel));
diff --git a/server/src/main/java/org/opensearch/rest/action/document/RestGetSourceAction.java b/server/src/main/java/org/opensearch/rest/action/document/RestGetSourceAction.java
index 7247067755721..b4abe449e027f 100644
--- a/server/src/main/java/org/opensearch/rest/action/document/RestGetSourceAction.java
+++ b/server/src/main/java/org/opensearch/rest/action/document/RestGetSourceAction.java
@@ -108,7 +108,7 @@ static class RestGetSourceResponseListener extends RestResponseListener sourceTuple = restRequest.contentOrSourceParam();
+ Tuple sourceTuple = restRequest.contentOrSourceParam();
PutPipelineRequest request = new PutPipelineRequest(restRequest.param("id"), sourceTuple.v2(), sourceTuple.v1());
request.clusterManagerNodeTimeout(restRequest.paramAsTime("cluster_manager_timeout", request.clusterManagerNodeTimeout()));
parseDeprecatedMasterTimeoutParameter(request, restRequest, deprecationLogger, getName());
diff --git a/server/src/main/java/org/opensearch/rest/action/ingest/RestSimulatePipelineAction.java b/server/src/main/java/org/opensearch/rest/action/ingest/RestSimulatePipelineAction.java
index ec8cc2c00e65a..1aa2c11e3f05e 100644
--- a/server/src/main/java/org/opensearch/rest/action/ingest/RestSimulatePipelineAction.java
+++ b/server/src/main/java/org/opensearch/rest/action/ingest/RestSimulatePipelineAction.java
@@ -36,7 +36,7 @@
import org.opensearch.client.node.NodeClient;
import org.opensearch.core.common.bytes.BytesReference;
import org.opensearch.common.collect.Tuple;
-import org.opensearch.common.xcontent.XContentType;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.rest.BaseRestHandler;
import org.opensearch.rest.RestRequest;
import org.opensearch.rest.action.RestToXContentListener;
@@ -75,7 +75,7 @@ public String getName() {
@Override
public RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient client) throws IOException {
- Tuple sourceTuple = restRequest.contentOrSourceParam();
+ Tuple sourceTuple = restRequest.contentOrSourceParam();
SimulatePipelineRequest request = new SimulatePipelineRequest(sourceTuple.v2(), sourceTuple.v1());
request.setId(restRequest.param("id"));
request.setVerbose(restRequest.paramAsBoolean("verbose", false));
diff --git a/server/src/main/java/org/opensearch/rest/action/search/RestMultiSearchAction.java b/server/src/main/java/org/opensearch/rest/action/search/RestMultiSearchAction.java
index 189b1e93e6444..5be5a54edddf5 100644
--- a/server/src/main/java/org/opensearch/rest/action/search/RestMultiSearchAction.java
+++ b/server/src/main/java/org/opensearch/rest/action/search/RestMultiSearchAction.java
@@ -45,9 +45,9 @@
import org.opensearch.common.settings.Settings;
import org.opensearch.common.unit.TimeValue;
import org.opensearch.core.common.Strings;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.XContent;
import org.opensearch.core.xcontent.XContentParser;
-import org.opensearch.common.xcontent.XContentType;
import org.opensearch.rest.BaseRestHandler;
import org.opensearch.rest.RestRequest;
import org.opensearch.rest.action.RestCancellableNodeClient;
@@ -190,7 +190,7 @@ public static void parseMultiLineRequest(
boolean ccsMinimizeRoundtrips = request.paramAsBoolean("ccs_minimize_roundtrips", true);
String routing = request.param("routing");
- final Tuple sourceTuple = request.contentOrSourceParam();
+ final Tuple sourceTuple = request.contentOrSourceParam();
final XContent xContent = sourceTuple.v1().xContent();
final BytesReference data = sourceTuple.v2();
MultiSearchRequest.readMultiLineFormat(
diff --git a/server/src/main/java/org/opensearch/rest/action/search/RestPutSearchPipelineAction.java b/server/src/main/java/org/opensearch/rest/action/search/RestPutSearchPipelineAction.java
index 2f398a6bea9ff..73eead1b91d57 100644
--- a/server/src/main/java/org/opensearch/rest/action/search/RestPutSearchPipelineAction.java
+++ b/server/src/main/java/org/opensearch/rest/action/search/RestPutSearchPipelineAction.java
@@ -12,7 +12,7 @@
import org.opensearch.client.node.NodeClient;
import org.opensearch.core.common.bytes.BytesReference;
import org.opensearch.common.collect.Tuple;
-import org.opensearch.common.xcontent.XContentType;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.rest.BaseRestHandler;
import org.opensearch.rest.RestRequest;
import org.opensearch.rest.action.RestToXContentListener;
@@ -40,7 +40,7 @@ public List routes() {
@Override
protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient client) throws IOException {
- Tuple sourceTuple = restRequest.contentOrSourceParam();
+ Tuple sourceTuple = restRequest.contentOrSourceParam();
PutSearchPipelineRequest request = new PutSearchPipelineRequest(restRequest.param("id"), sourceTuple.v2(), sourceTuple.v1());
request.clusterManagerNodeTimeout(restRequest.paramAsTime("cluster_manager_timeout", request.clusterManagerNodeTimeout()));
request.timeout(restRequest.paramAsTime("timeout", request.timeout()));
diff --git a/server/src/main/java/org/opensearch/script/StoredScriptSource.java b/server/src/main/java/org/opensearch/script/StoredScriptSource.java
index 1d6f2b8e4ccea..9d3af9e4c9caf 100644
--- a/server/src/main/java/org/opensearch/script/StoredScriptSource.java
+++ b/server/src/main/java/org/opensearch/script/StoredScriptSource.java
@@ -44,6 +44,7 @@
import org.opensearch.core.common.io.stream.Writeable;
import org.opensearch.common.logging.DeprecationLogger;
import org.opensearch.common.xcontent.LoggingDeprecationHandler;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.NamedXContentRegistry;
import org.opensearch.core.xcontent.ObjectParser;
import org.opensearch.core.xcontent.ObjectParser.ValueType;
@@ -197,71 +198,72 @@ private StoredScriptSource build(boolean ignoreEmpty) {
/**
* This will parse XContent into a {@link StoredScriptSource}. The following formats can be parsed:
- *
+ *
* The simple script format with no compiler options or user-defined params:
- *
+ *
* Example:
* {@code
* {"script": "return Math.log(doc.popularity) * 100;"}
* }
- *
+ *
* The above format requires the lang to be specified using the deprecated stored script namespace
* (as a url parameter during a put request). See {@link ScriptMetadata} for more information about
* the stored script namespaces.
- *
+ *
* The complex script format using the new stored script namespace
* where lang and source are required but options is optional:
- *
+ *
* {@code
* {
- * "script" : {
- * "lang" : "",
- * "source" : "",
- * "options" : {
- * "option0" : "",
- * "option1" : "",
- * ...
- * }
- * }
+ * "script" : {
+ * "lang" : "",
+ * "source" : "",
+ * "options" : {
+ * "option0" : "",
+ * "option1" : "",
+ * ...
* }
* }
- *
+ * }
+ * }
+ *
* Example:
* {@code
* {
- * "script": {
- * "lang" : "painless",
- * "source" : "return Math.log(doc.popularity) * params.multiplier"
- * }
+ * "script": {
+ * "lang" : "painless",
+ * "source" : "return Math.log(doc.popularity) * params.multiplier"
* }
* }
- *
+ * }
+ *
* The use of "source" may also be substituted with "code" for backcompat with 5.3 to 5.5 format. For example:
- *
+ *
* {@code
* {
- * "script" : {
- * "lang" : "",
- * "code" : "",
- * "options" : {
- * "option0" : "",
- * "option1" : "",
- * ...
- * }
- * }
+ * "script" : {
+ * "lang" : "",
+ * "code" : "",
+ * "options" : {
+ * "option0" : "",
+ * "option1" : "",
+ * ...
* }
* }
- *
+ * }
+ * }
+ *
* Note that the "source" parameter can also handle template parsing including from
* a complex JSON object.
*
- * @param content The content from the request to be parsed as described above.
- * @return The parsed {@link StoredScriptSource}.
+ * @param content The content from the request to be parsed as described above.
+ * @param mediaType The media type of the request
+ * @return The parsed {@link StoredScriptSource}.
*/
- public static StoredScriptSource parse(BytesReference content, XContentType xContentType) {
+ public static StoredScriptSource parse(BytesReference content, MediaType mediaType) {
try (
InputStream stream = content.streamInput();
- XContentParser parser = xContentType.xContent()
+ XContentParser parser = mediaType.xContent()
.createParser(NamedXContentRegistry.EMPTY, LoggingDeprecationHandler.INSTANCE, stream)
) {
Token token = parser.nextToken();
diff --git a/server/src/main/java/org/opensearch/search/fetch/FetchPhase.java b/server/src/main/java/org/opensearch/search/fetch/FetchPhase.java
index b82764c38f747..97a6093ea39d1 100644
--- a/server/src/main/java/org/opensearch/search/fetch/FetchPhase.java
+++ b/server/src/main/java/org/opensearch/search/fetch/FetchPhase.java
@@ -52,6 +52,7 @@
import org.opensearch.common.xcontent.XContentHelper;
import org.opensearch.common.xcontent.XContentType;
import org.opensearch.common.xcontent.support.XContentMapValues;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.index.IndexSettings;
import org.opensearch.index.fieldvisitor.CustomFieldsVisitor;
import org.opensearch.index.fieldvisitor.FieldsVisitor;
@@ -377,7 +378,7 @@ private HitContext prepareNestedHitContext(
String rootId;
Map rootSourceAsMap = null;
- XContentType rootSourceContentType = null;
+ MediaType rootSourceContentType = null;
int nestedDocId = nestedTopDocId - subReaderContext.docBase;
diff --git a/server/src/main/java/org/opensearch/search/lookup/SourceLookup.java b/server/src/main/java/org/opensearch/search/lookup/SourceLookup.java
index 1d4a424550c12..1341fc0fdabb3 100644
--- a/server/src/main/java/org/opensearch/search/lookup/SourceLookup.java
+++ b/server/src/main/java/org/opensearch/search/lookup/SourceLookup.java
@@ -75,8 +75,8 @@ public Map source() {
return source;
}
- public XContentType sourceContentType() {
- return XContentType.fromMediaType(sourceContentType);
+ public MediaType sourceContentType() {
+ return sourceContentType;
}
public int docId() {
@@ -155,7 +155,7 @@ public void setSource(BytesReference source) {
this.sourceAsBytes = source;
}
- public void setSourceContentType(XContentType sourceContentType) {
+ public void setSourceContentType(MediaType sourceContentType) {
this.sourceContentType = sourceContentType;
}
diff --git a/server/src/main/java/org/opensearch/search/pipeline/PipelineConfiguration.java b/server/src/main/java/org/opensearch/search/pipeline/PipelineConfiguration.java
index 512e400c54784..b4f6549c83390 100644
--- a/server/src/main/java/org/opensearch/search/pipeline/PipelineConfiguration.java
+++ b/server/src/main/java/org/opensearch/search/pipeline/PipelineConfiguration.java
@@ -8,6 +8,7 @@
package org.opensearch.search.pipeline;
+import org.opensearch.Version;
import org.opensearch.cluster.AbstractDiffable;
import org.opensearch.cluster.Diff;
import org.opensearch.common.Strings;
@@ -56,7 +57,7 @@ private static class Builder {
private String id;
private BytesReference config;
- private XContentType xContentType;
+ private MediaType mediaType;
void setId(String id) {
this.id = id;
@@ -67,11 +68,11 @@ void setConfig(BytesReference config, MediaType mediaType) {
throw new IllegalArgumentException("PipelineConfiguration does not support media type [" + mediaType.getClass() + "]");
}
this.config = config;
- this.xContentType = XContentType.fromMediaType(mediaType);
+ this.mediaType = mediaType;
}
PipelineConfiguration build() {
- return new PipelineConfiguration(id, config, xContentType);
+ return new PipelineConfiguration(id, config, mediaType);
}
}
@@ -80,16 +81,12 @@ PipelineConfiguration build() {
// and the way the map of maps config is read requires a deep copy (it removes instead of gets entries to check for unused options)
// also the get pipeline api just directly returns this to the caller
private final BytesReference config;
- private final XContentType xContentType;
+ private final MediaType mediaType;
- public PipelineConfiguration(String id, BytesReference config, XContentType xContentType) {
+ public PipelineConfiguration(String id, BytesReference config, MediaType mediaType) {
this.id = Objects.requireNonNull(id);
this.config = Objects.requireNonNull(config);
- this.xContentType = Objects.requireNonNull(xContentType);
- }
-
- public PipelineConfiguration(String id, BytesReference config, MediaType mediaType) {
- this(id, config, XContentType.fromMediaType(mediaType));
+ this.mediaType = Objects.requireNonNull(mediaType);
}
public String getId() {
@@ -97,12 +94,12 @@ public String getId() {
}
public Map getConfigAsMap() {
- return XContentHelper.convertToMap(config, true, xContentType).v2();
+ return XContentHelper.convertToMap(config, true, mediaType).v2();
}
// pkg-private for tests
- XContentType getXContentType() {
- return xContentType;
+ MediaType getMediaType() {
+ return mediaType;
}
// pkg-private for tests
@@ -120,7 +117,11 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
}
public static PipelineConfiguration readFrom(StreamInput in) throws IOException {
- return new PipelineConfiguration(in.readString(), in.readBytesReference(), in.readEnum(XContentType.class));
+ return new PipelineConfiguration(
+ in.readString(),
+ in.readBytesReference(),
+ in.getVersion().onOrAfter(Version.V_3_0_0) ? in.readMediaType() : in.readEnum(XContentType.class)
+ );
}
public static Diff readDiffFrom(StreamInput in) throws IOException {
@@ -136,7 +137,11 @@ public String toString() {
public void writeTo(StreamOutput out) throws IOException {
out.writeString(id);
out.writeBytesReference(config);
- out.writeEnum(xContentType);
+ if (out.getVersion().onOrAfter(Version.V_3_0_0)) {
+ mediaType.writeTo(out);
+ } else {
+ out.writeEnum((XContentType) mediaType);
+ }
}
@Override
diff --git a/server/src/main/java/org/opensearch/search/pipeline/SearchPipelineService.java b/server/src/main/java/org/opensearch/search/pipeline/SearchPipelineService.java
index 7384b494d71fc..1066d836e5183 100644
--- a/server/src/main/java/org/opensearch/search/pipeline/SearchPipelineService.java
+++ b/server/src/main/java/org/opensearch/search/pipeline/SearchPipelineService.java
@@ -259,7 +259,7 @@ static ClusterState innerPut(PutSearchPipelineRequest request, ClusterState curr
} else {
pipelines = new HashMap<>();
}
- pipelines.put(request.getId(), new PipelineConfiguration(request.getId(), request.getSource(), request.getXContentType()));
+ pipelines.put(request.getId(), new PipelineConfiguration(request.getId(), request.getSource(), request.getMediaType()));
ClusterState.Builder newState = ClusterState.builder(currentState);
newState.metadata(
Metadata.builder(currentState.getMetadata())
@@ -273,7 +273,7 @@ void validatePipeline(Map searchPipelineInfos
if (searchPipelineInfos.isEmpty()) {
throw new IllegalStateException("Search pipeline info is empty");
}
- Map pipelineConfig = XContentHelper.convertToMap(request.getSource(), false, request.getXContentType()).v2();
+ Map pipelineConfig = XContentHelper.convertToMap(request.getSource(), false, request.getMediaType()).v2();
Pipeline pipeline = PipelineWithMetrics.create(
request.getId(),
pipelineConfig,
diff --git a/server/src/main/java/org/opensearch/transport/TransportService.java b/server/src/main/java/org/opensearch/transport/TransportService.java
index c2163ae1d490a..b8d7d130e846b 100644
--- a/server/src/main/java/org/opensearch/transport/TransportService.java
+++ b/server/src/main/java/org/opensearch/transport/TransportService.java
@@ -59,8 +59,10 @@
import org.opensearch.common.util.concurrent.ThreadContext;
import org.opensearch.common.util.io.IOUtils;
import org.opensearch.common.lease.Releasable;
+import org.opensearch.common.xcontent.XContentType;
import org.opensearch.core.common.Strings;
import org.opensearch.core.concurrency.OpenSearchRejectedExecutionException;
+import org.opensearch.core.xcontent.MediaTypeParserRegistry;
import org.opensearch.node.NodeClosedException;
import org.opensearch.node.ReportingService;
import org.opensearch.tasks.Task;
@@ -169,7 +171,10 @@ public void close() {}
* over the {@link StreamOutput} and {@link StreamInput} wire
*/
Streamables.registerStreamables();
+ /** Registers OpenSearch server specific exceptions (exceptions outside of core library) */
OpenSearchServerException.registerExceptions();
+ // set the default media type to JSON (fallback if a media type is not specified)
+ MediaTypeParserRegistry.setDefaultMediaType(XContentType.JSON);
}
/** does nothing. easy way to ensure class is loaded so the above static block is called to register the streamables */
diff --git a/server/src/test/java/org/opensearch/action/admin/cluster/reroute/ClusterRerouteRequestTests.java b/server/src/test/java/org/opensearch/action/admin/cluster/reroute/ClusterRerouteRequestTests.java
index 6ba7961ccecf3..e92096f139d17 100644
--- a/server/src/test/java/org/opensearch/action/admin/cluster/reroute/ClusterRerouteRequestTests.java
+++ b/server/src/test/java/org/opensearch/action/admin/cluster/reroute/ClusterRerouteRequestTests.java
@@ -244,7 +244,7 @@ private RestRequest toRestRequest(ClusterRerouteRequest original) throws IOExcep
FakeRestRequest.Builder requestBuilder = new FakeRestRequest.Builder(xContentRegistry());
requestBuilder.withParams(params);
if (hasBody) {
- requestBuilder.withContent(BytesReference.bytes(builder), XContentType.fromMediaType(builder.contentType()));
+ requestBuilder.withContent(BytesReference.bytes(builder), builder.contentType());
}
return requestBuilder.build();
}
diff --git a/server/src/test/java/org/opensearch/action/admin/cluster/storedscripts/PutStoredScriptRequestTests.java b/server/src/test/java/org/opensearch/action/admin/cluster/storedscripts/PutStoredScriptRequestTests.java
index 2eb6fa504baf2..cfdd776e60832 100644
--- a/server/src/test/java/org/opensearch/action/admin/cluster/storedscripts/PutStoredScriptRequestTests.java
+++ b/server/src/test/java/org/opensearch/action/admin/cluster/storedscripts/PutStoredScriptRequestTests.java
@@ -56,13 +56,13 @@ public void testSerialization() throws IOException {
new StoredScriptSource("foo", "bar", Collections.emptyMap())
);
- assertEquals(XContentType.JSON, storedScriptRequest.xContentType());
+ assertEquals(XContentType.JSON, storedScriptRequest.mediaType());
try (BytesStreamOutput output = new BytesStreamOutput()) {
storedScriptRequest.writeTo(output);
try (StreamInput in = output.bytes().streamInput()) {
PutStoredScriptRequest serialized = new PutStoredScriptRequest(in);
- assertEquals(XContentType.JSON, serialized.xContentType());
+ assertEquals(XContentType.JSON, serialized.mediaType());
assertEquals(storedScriptRequest.id(), serialized.id());
assertEquals(storedScriptRequest.context(), serialized.context());
}
diff --git a/server/src/test/java/org/opensearch/action/ingest/PutPipelineRequestTests.java b/server/src/test/java/org/opensearch/action/ingest/PutPipelineRequestTests.java
index a86257fd741c0..336ec67546dc5 100644
--- a/server/src/test/java/org/opensearch/action/ingest/PutPipelineRequestTests.java
+++ b/server/src/test/java/org/opensearch/action/ingest/PutPipelineRequestTests.java
@@ -49,14 +49,14 @@ public class PutPipelineRequestTests extends OpenSearchTestCase {
public void testSerializationWithXContent() throws IOException {
PutPipelineRequest request = new PutPipelineRequest("1", new BytesArray("{}".getBytes(StandardCharsets.UTF_8)), XContentType.JSON);
- assertEquals(XContentType.JSON, request.getXContentType());
+ assertEquals(XContentType.JSON, request.getMediaType());
BytesStreamOutput output = new BytesStreamOutput();
request.writeTo(output);
StreamInput in = StreamInput.wrap(output.bytes().toBytesRef().bytes);
PutPipelineRequest serialized = new PutPipelineRequest(in);
- assertEquals(XContentType.JSON, serialized.getXContentType());
+ assertEquals(XContentType.JSON, serialized.getMediaType());
assertEquals("{}", serialized.getSource().utf8ToString());
}
diff --git a/server/src/test/java/org/opensearch/common/xcontent/XContentTypeTests.java b/server/src/test/java/org/opensearch/common/xcontent/XContentTypeTests.java
index 53607f432bbd5..8c53d7edebca8 100644
--- a/server/src/test/java/org/opensearch/common/xcontent/XContentTypeTests.java
+++ b/server/src/test/java/org/opensearch/common/xcontent/XContentTypeTests.java
@@ -44,81 +44,80 @@ public class XContentTypeTests extends OpenSearchTestCase {
public void testFromJson() throws Exception {
String mediaType = "application/json";
XContentType expectedXContentType = XContentType.JSON;
- assertThat(XContentType.fromMediaType(mediaType), equalTo(expectedXContentType));
- assertThat(XContentType.fromMediaType(mediaType + ";"), equalTo(expectedXContentType));
- assertThat(XContentType.fromMediaType(mediaType + "; charset=UTF-8"), equalTo(expectedXContentType));
+ assertThat(MediaType.fromMediaType(mediaType), equalTo(expectedXContentType));
+ assertThat(MediaType.fromMediaType(mediaType + ";"), equalTo(expectedXContentType));
+ assertThat(MediaType.fromMediaType(mediaType + "; charset=UTF-8"), equalTo(expectedXContentType));
}
public void testFromNdJson() throws Exception {
String mediaType = "application/x-ndjson";
XContentType expectedXContentType = XContentType.JSON;
- assertThat(XContentType.fromMediaType(mediaType), equalTo(expectedXContentType));
- assertThat(XContentType.fromMediaType(mediaType + ";"), equalTo(expectedXContentType));
- assertThat(XContentType.fromMediaType(mediaType + "; charset=UTF-8"), equalTo(expectedXContentType));
+ assertThat(MediaType.fromMediaType(mediaType), equalTo(expectedXContentType));
+ assertThat(MediaType.fromMediaType(mediaType + ";"), equalTo(expectedXContentType));
+ assertThat(MediaType.fromMediaType(mediaType + "; charset=UTF-8"), equalTo(expectedXContentType));
}
public void testFromJsonUppercase() throws Exception {
String mediaType = "application/json".toUpperCase(Locale.ROOT);
XContentType expectedXContentType = XContentType.JSON;
- assertThat(XContentType.fromMediaType(mediaType), equalTo(expectedXContentType));
- assertThat(XContentType.fromMediaType(mediaType + ";"), equalTo(expectedXContentType));
- assertThat(XContentType.fromMediaType(mediaType + "; charset=UTF-8"), equalTo(expectedXContentType));
+ assertThat(MediaType.fromMediaType(mediaType), equalTo(expectedXContentType));
+ assertThat(MediaType.fromMediaType(mediaType + ";"), equalTo(expectedXContentType));
+ assertThat(MediaType.fromMediaType(mediaType + "; charset=UTF-8"), equalTo(expectedXContentType));
}
public void testFromYaml() throws Exception {
String mediaType = "application/yaml";
XContentType expectedXContentType = XContentType.YAML;
- assertThat(XContentType.fromMediaType(mediaType), equalTo(expectedXContentType));
- assertThat(XContentType.fromMediaType(mediaType + ";"), equalTo(expectedXContentType));
- assertThat(XContentType.fromMediaType(mediaType + "; charset=UTF-8"), equalTo(expectedXContentType));
+ assertThat(MediaType.fromMediaType(mediaType), equalTo(expectedXContentType));
+ assertThat(MediaType.fromMediaType(mediaType + ";"), equalTo(expectedXContentType));
+ assertThat(MediaType.fromMediaType(mediaType + "; charset=UTF-8"), equalTo(expectedXContentType));
}
public void testFromSmile() throws Exception {
String mediaType = "application/smile";
XContentType expectedXContentType = XContentType.SMILE;
- assertThat(XContentType.fromMediaType(mediaType), equalTo(expectedXContentType));
- assertThat(XContentType.fromMediaType(mediaType + ";"), equalTo(expectedXContentType));
+ assertThat(MediaType.fromMediaType(mediaType), equalTo(expectedXContentType));
+ assertThat(MediaType.fromMediaType(mediaType + ";"), equalTo(expectedXContentType));
}
public void testFromCbor() throws Exception {
String mediaType = "application/cbor";
XContentType expectedXContentType = XContentType.CBOR;
- assertThat(XContentType.fromMediaType(mediaType), equalTo(expectedXContentType));
- assertThat(XContentType.fromMediaType(mediaType + ";"), equalTo(expectedXContentType));
+ assertThat(MediaType.fromMediaType(mediaType), equalTo(expectedXContentType));
+ assertThat(MediaType.fromMediaType(mediaType + ";"), equalTo(expectedXContentType));
}
public void testFromWildcard() throws Exception {
String mediaType = "application/*";
XContentType expectedXContentType = XContentType.JSON;
- assertThat(XContentType.fromMediaType(mediaType), equalTo(expectedXContentType));
- assertThat(XContentType.fromMediaType(mediaType + ";"), equalTo(expectedXContentType));
+ assertThat(MediaType.fromMediaType(mediaType), equalTo(expectedXContentType));
+ assertThat(MediaType.fromMediaType(mediaType + ";"), equalTo(expectedXContentType));
}
public void testFromWildcardUppercase() throws Exception {
String mediaType = "APPLICATION/*";
XContentType expectedXContentType = XContentType.JSON;
- assertThat(XContentType.fromMediaType(mediaType), equalTo(expectedXContentType));
- assertThat(XContentType.fromMediaType(mediaType + ";"), equalTo(expectedXContentType));
+ assertThat(MediaType.fromMediaType(mediaType), equalTo(expectedXContentType));
+ assertThat(MediaType.fromMediaType(mediaType + ";"), equalTo(expectedXContentType));
}
public void testFromRubbish() throws Exception {
- assertThat(XContentType.fromMediaType((String) null), nullValue());
- assertThat(XContentType.fromMediaType((MediaType) null), nullValue());
- assertThat(XContentType.fromMediaType(""), nullValue());
- assertThat(XContentType.fromMediaType("text/plain"), nullValue());
- assertThat(XContentType.fromMediaType("gobbly;goop"), nullValue());
+ assertThat(MediaType.fromMediaType(null), nullValue());
+ assertThat(MediaType.fromMediaType(""), nullValue());
+ assertThat(MediaType.fromMediaType("text/plain"), nullValue());
+ assertThat(MediaType.fromMediaType("gobbly;goop"), nullValue());
}
public void testVersionedMediaType() throws Exception {
- assertThat(XContentType.fromMediaType("application/vnd.opensearch+json;compatible-with=7"), equalTo(XContentType.JSON));
- assertThat(XContentType.fromMediaType("application/vnd.opensearch+yaml;compatible-with=7"), equalTo(XContentType.YAML));
- assertThat(XContentType.fromMediaType("application/vnd.opensearch+cbor;compatible-with=7"), equalTo(XContentType.CBOR));
- assertThat(XContentType.fromMediaType("application/vnd.opensearch+smile;compatible-with=7"), equalTo(XContentType.SMILE));
+ assertThat(MediaType.fromMediaType("application/vnd.opensearch+json;compatible-with=7"), equalTo(XContentType.JSON));
+ assertThat(MediaType.fromMediaType("application/vnd.opensearch+yaml;compatible-with=7"), equalTo(XContentType.YAML));
+ assertThat(MediaType.fromMediaType("application/vnd.opensearch+cbor;compatible-with=7"), equalTo(XContentType.CBOR));
+ assertThat(MediaType.fromMediaType("application/vnd.opensearch+smile;compatible-with=7"), equalTo(XContentType.SMILE));
- assertThat(XContentType.fromMediaType("application/vnd.opensearch+json ;compatible-with=7"), equalTo(XContentType.JSON));
+ assertThat(MediaType.fromMediaType("application/vnd.opensearch+json ;compatible-with=7"), equalTo(XContentType.JSON));
String mthv = "application/vnd.opensearch+json ;compatible-with=7;charset=utf-8";
- assertThat(XContentType.fromMediaType(mthv), equalTo(XContentType.JSON));
- assertThat(XContentType.fromMediaType(mthv.toUpperCase(Locale.ROOT)), equalTo(XContentType.JSON));
+ assertThat(MediaType.fromMediaType(mthv), equalTo(XContentType.JSON));
+ assertThat(MediaType.fromMediaType(mthv.toUpperCase(Locale.ROOT)), equalTo(XContentType.JSON));
}
}
diff --git a/server/src/test/java/org/opensearch/index/mapper/DynamicMappingTests.java b/server/src/test/java/org/opensearch/index/mapper/DynamicMappingTests.java
index 365d3738f4022..0e04e57a290b6 100644
--- a/server/src/test/java/org/opensearch/index/mapper/DynamicMappingTests.java
+++ b/server/src/test/java/org/opensearch/index/mapper/DynamicMappingTests.java
@@ -367,9 +367,7 @@ private void doTestDefaultFloatingPointMappings(DocumentMapper mapper, XContentB
.field("quux", "3.2") // float detected through numeric detection
.endObject()
);
- ParsedDocument parsedDocument = mapper.parse(
- new SourceToParse("index", "id", source, XContentType.fromMediaType(builder.contentType()))
- );
+ ParsedDocument parsedDocument = mapper.parse(new SourceToParse("index", "id", source, builder.contentType()));
Mapping update = parsedDocument.dynamicMappingsUpdate();
assertNotNull(update);
assertThat(((FieldMapper) update.root().getMapper("foo")).fieldType().typeName(), equalTo("float"));
diff --git a/server/src/test/java/org/opensearch/ingest/PipelineConfigurationTests.java b/server/src/test/java/org/opensearch/ingest/PipelineConfigurationTests.java
index 51ebd1b1f7ad5..aed08c2d1875a 100644
--- a/server/src/test/java/org/opensearch/ingest/PipelineConfigurationTests.java
+++ b/server/src/test/java/org/opensearch/ingest/PipelineConfigurationTests.java
@@ -58,13 +58,13 @@ public void testSerialization() throws IOException {
new BytesArray("{}".getBytes(StandardCharsets.UTF_8)),
XContentType.JSON
);
- assertEquals(XContentType.JSON, configuration.getXContentType());
+ assertEquals(XContentType.JSON, configuration.getMediaType());
BytesStreamOutput out = new BytesStreamOutput();
configuration.writeTo(out);
StreamInput in = StreamInput.wrap(out.bytes().toBytesRef().bytes);
PipelineConfiguration serialized = PipelineConfiguration.readFrom(in);
- assertEquals(XContentType.JSON, serialized.getXContentType());
+ assertEquals(XContentType.JSON, serialized.getMediaType());
assertEquals("{}", serialized.getConfig().utf8ToString());
}
@@ -83,8 +83,8 @@ public void testParser() throws IOException {
XContentParser xContentParser = xContentType.xContent()
.createParser(NamedXContentRegistry.EMPTY, DeprecationHandler.THROW_UNSUPPORTED_OPERATION, bytes.streamInput());
PipelineConfiguration parsed = parser.parse(xContentParser, null);
- assertEquals(xContentType, parsed.getXContentType());
- assertEquals("{}", XContentHelper.convertToJson(parsed.getConfig(), false, parsed.getXContentType()));
+ assertEquals(xContentType, parsed.getMediaType());
+ assertEquals("{}", XContentHelper.convertToJson(parsed.getConfig(), false, parsed.getMediaType()));
assertEquals("1", parsed.getId());
}
diff --git a/server/src/test/java/org/opensearch/rest/RestRequestTests.java b/server/src/test/java/org/opensearch/rest/RestRequestTests.java
index 15066362555ef..97350824dd1e4 100644
--- a/server/src/test/java/org/opensearch/rest/RestRequestTests.java
+++ b/server/src/test/java/org/opensearch/rest/RestRequestTests.java
@@ -203,12 +203,12 @@ public void testContentTypeParsing() {
Map> map = new HashMap<>();
map.put("Content-Type", Collections.singletonList(xContentType.mediaType()));
RestRequest restRequest = contentRestRequest("", Collections.emptyMap(), map);
- assertEquals(xContentType, restRequest.getXContentType());
+ assertEquals(xContentType, restRequest.getMediaType());
map = new HashMap<>();
map.put("Content-Type", Collections.singletonList(xContentType.mediaTypeWithoutParameters()));
restRequest = contentRestRequest("", Collections.emptyMap(), map);
- assertEquals(xContentType, restRequest.getXContentType());
+ assertEquals(xContentType, restRequest.getMediaType());
}
}
@@ -221,7 +221,7 @@ public void testPlainTextSupport() {
Collections.singletonList(randomFrom("text/plain", "text/plain; charset=utf-8", "text/plain;charset=utf-8"))
)
);
- assertNull(restRequest.getXContentType());
+ assertNull(restRequest.getMediaType());
}
public void testMalformedContentTypeHeader() {
@@ -237,7 +237,7 @@ public void testMalformedContentTypeHeader() {
public void testNoContentTypeHeader() {
RestRequest contentRestRequest = contentRestRequest("", Collections.emptyMap(), Collections.emptyMap());
- assertNull(contentRestRequest.getXContentType());
+ assertNull(contentRestRequest.getMediaType());
}
public void testMultipleContentTypeHeaders() {
diff --git a/server/src/test/java/org/opensearch/script/ScriptMetadataTests.java b/server/src/test/java/org/opensearch/script/ScriptMetadataTests.java
index bcab5dc7b776a..83e7a3712a9ad 100644
--- a/server/src/test/java/org/opensearch/script/ScriptMetadataTests.java
+++ b/server/src/test/java/org/opensearch/script/ScriptMetadataTests.java
@@ -36,6 +36,7 @@
import org.opensearch.core.common.bytes.BytesReference;
import org.opensearch.core.common.io.stream.Writeable;
import org.opensearch.core.xcontent.DeprecationHandler;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.NamedXContentRegistry;
import org.opensearch.core.xcontent.XContentBuilder;
import org.opensearch.common.xcontent.XContentFactory;
@@ -130,13 +131,13 @@ public void testGetScript() throws Exception {
.endObject()
.endObject()
.endObject();
- XContentType xContentType = XContentType.fromMediaType(sourceBuilder.contentType());
- builder.storeScript("source_template", StoredScriptSource.parse(BytesReference.bytes(sourceBuilder), xContentType));
+ MediaType mediaType = sourceBuilder.contentType();
+ builder.storeScript("source_template", StoredScriptSource.parse(BytesReference.bytes(sourceBuilder), mediaType));
sourceBuilder = XContentFactory.jsonBuilder();
- xContentType = XContentType.fromMediaType(sourceBuilder.contentType());
+ mediaType = sourceBuilder.contentType();
sourceBuilder.startObject().startObject("script").field("lang", "_lang").field("source", "_source").endObject().endObject();
- builder.storeScript("script", StoredScriptSource.parse(BytesReference.bytes(sourceBuilder), xContentType));
+ builder.storeScript("script", StoredScriptSource.parse(BytesReference.bytes(sourceBuilder), mediaType));
ScriptMetadata scriptMetadata = builder.build();
assertEquals("_source", scriptMetadata.getStoredScript("script").getSource());
@@ -303,7 +304,7 @@ private ScriptMetadata randomScriptMetadata(XContentType sourceContentType, int
.endObject();
builder.storeScript(
randomAlphaOfLength(i + 1),
- StoredScriptSource.parse(BytesReference.bytes(sourceBuilder), XContentType.fromMediaType(sourceBuilder.contentType()))
+ StoredScriptSource.parse(BytesReference.bytes(sourceBuilder), sourceBuilder.contentType())
);
}
return builder.build();
diff --git a/test/framework/src/main/java/org/opensearch/test/RandomObjects.java b/test/framework/src/main/java/org/opensearch/test/RandomObjects.java
index e81f0df9a5ac4..a328e6778dfaf 100644
--- a/test/framework/src/main/java/org/opensearch/test/RandomObjects.java
+++ b/test/framework/src/main/java/org/opensearch/test/RandomObjects.java
@@ -98,7 +98,7 @@ public static Tuple, List> randomStoredFieldValues(Random r
List originalValues = randomStoredFieldValues(random, numValues);
List expectedParsedValues = new ArrayList<>(numValues);
for (Object originalValue : originalValues) {
- expectedParsedValues.add(getExpectedParsedValue(XContentType.fromMediaType(mediaType), originalValue));
+ expectedParsedValues.add(getExpectedParsedValue(mediaType, originalValue));
}
return Tuple.tuple(originalValues, expectedParsedValues);
}
@@ -154,15 +154,15 @@ private static List randomStoredFieldValues(Random random, int numValues
* Generates values based on what can get printed out. Stored fields values are retrieved from lucene and converted via
* {@link org.opensearch.index.mapper.MappedFieldType#valueForDisplay(Object)} to either strings, numbers or booleans.
*/
- public static Object getExpectedParsedValue(XContentType xContentType, Object value) {
+ public static Object getExpectedParsedValue(MediaType mediaType, Object value) {
if (value instanceof BytesArray) {
- if (xContentType == XContentType.JSON) {
+ if (mediaType == XContentType.JSON) {
// JSON writes base64 format
return Base64.getEncoder().encodeToString(((BytesArray) value).toBytesRef().bytes);
}
}
if (value instanceof Float) {
- if (xContentType == XContentType.CBOR || xContentType == XContentType.SMILE) {
+ if (mediaType == XContentType.CBOR || mediaType == XContentType.SMILE) {
// with binary content types we pass back the object as is
return value;
}
diff --git a/test/framework/src/main/java/org/opensearch/test/rest/FakeRestRequest.java b/test/framework/src/main/java/org/opensearch/test/rest/FakeRestRequest.java
index 375768ed12cc4..2bbaf8c80dfa4 100644
--- a/test/framework/src/main/java/org/opensearch/test/rest/FakeRestRequest.java
+++ b/test/framework/src/main/java/org/opensearch/test/rest/FakeRestRequest.java
@@ -35,8 +35,8 @@
import org.opensearch.action.ActionListener;
import org.opensearch.core.common.bytes.BytesArray;
import org.opensearch.core.common.bytes.BytesReference;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.NamedXContentRegistry;
-import org.opensearch.common.xcontent.XContentType;
import org.opensearch.http.HttpChannel;
import org.opensearch.http.HttpRequest;
import org.opensearch.http.HttpResponse;
@@ -231,10 +231,10 @@ public Builder withParams(Map params) {
return this;
}
- public Builder withContent(BytesReference content, XContentType xContentType) {
+ public Builder withContent(BytesReference content, MediaType mediaType) {
this.content = content;
- if (xContentType != null) {
- headers.put("Content-Type", Collections.singletonList(xContentType.mediaType()));
+ if (mediaType != null) {
+ headers.put("Content-Type", Collections.singletonList(mediaType.mediaType()));
}
return this;
}
diff --git a/test/framework/src/main/java/org/opensearch/test/rest/OpenSearchRestTestCase.java b/test/framework/src/main/java/org/opensearch/test/rest/OpenSearchRestTestCase.java
index 512369fdfe8a1..6d3c2eaa972e6 100644
--- a/test/framework/src/main/java/org/opensearch/test/rest/OpenSearchRestTestCase.java
+++ b/test/framework/src/main/java/org/opensearch/test/rest/OpenSearchRestTestCase.java
@@ -66,6 +66,7 @@
import org.opensearch.common.unit.TimeValue;
import org.opensearch.common.util.concurrent.ThreadContext;
import org.opensearch.core.xcontent.DeprecationHandler;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.NamedXContentRegistry;
import org.opensearch.core.xcontent.XContentBuilder;
import org.opensearch.common.xcontent.XContentHelper;
@@ -143,10 +144,10 @@ public abstract class OpenSearchRestTestCase extends OpenSearchTestCase {
* Convert the entity from a {@link Response} into a map of maps.
*/
public static Map entityAsMap(Response response) throws IOException {
- XContentType xContentType = XContentType.fromMediaType(response.getEntity().getContentType());
+ MediaType mediaType = MediaType.fromMediaType(response.getEntity().getContentType());
// EMPTY and THROW are fine here because `.map` doesn't use named x content or deprecation
try (
- XContentParser parser = xContentType.xContent()
+ XContentParser parser = mediaType.xContent()
.createParser(
NamedXContentRegistry.EMPTY,
DeprecationHandler.THROW_UNSUPPORTED_OPERATION,
@@ -161,10 +162,10 @@ public static Map entityAsMap(Response response) throws IOExcept
* Convert the entity from a {@link Response} into a list of maps.
*/
public static List entityAsList(Response response) throws IOException {
- XContentType xContentType = XContentType.fromMediaType(response.getEntity().getContentType());
+ MediaType mediaType = MediaType.fromMediaType(response.getEntity().getContentType());
// EMPTY and THROW are fine here because `.map` doesn't use named x content or deprecation
try (
- XContentParser parser = xContentType.xContent()
+ XContentParser parser = mediaType.xContent()
.createParser(
NamedXContentRegistry.EMPTY,
DeprecationHandler.THROW_UNSUPPORTED_OPERATION,
@@ -1074,7 +1075,7 @@ protected static Map getAsMap(final String endpoint) throws IOEx
}
protected static Map responseAsMap(Response response) throws IOException {
- XContentType entityContentType = XContentType.fromMediaType(response.getEntity().getContentType());
+ MediaType entityContentType = MediaType.fromMediaType(response.getEntity().getContentType());
Map responseEntity = XContentHelper.convertToMap(
entityContentType.xContent(),
response.getEntity().getContent(),
diff --git a/test/framework/src/main/java/org/opensearch/test/rest/yaml/ClientYamlTestExecutionContext.java b/test/framework/src/main/java/org/opensearch/test/rest/yaml/ClientYamlTestExecutionContext.java
index cb460f17cbec0..635dc49ff5166 100644
--- a/test/framework/src/main/java/org/opensearch/test/rest/yaml/ClientYamlTestExecutionContext.java
+++ b/test/framework/src/main/java/org/opensearch/test/rest/yaml/ClientYamlTestExecutionContext.java
@@ -41,6 +41,7 @@
import org.apache.lucene.util.BytesRef;
import org.opensearch.Version;
import org.opensearch.client.NodeSelector;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.common.bytes.BytesReference;
import org.opensearch.core.xcontent.XContentBuilder;
import org.opensearch.common.xcontent.XContentFactory;
@@ -138,20 +139,20 @@ private HttpEntity createEntity(List> bodies, Map bytesRefList = new ArrayList<>(bodies.size());
int totalBytesLength = 0;
for (Map body : bodies) {
- BytesRef bytesRef = bodyAsBytesRef(body, xContentType);
+ BytesRef bytesRef = bodyAsBytesRef(body, mediaType);
bytesRefList.add(bytesRef);
totalBytesLength += bytesRef.length - bytesRef.offset + 1;
}
@@ -161,20 +162,20 @@ private HttpEntity createEntity(List> bodies, Map headers, XContentType[] supportedContentTypes) {
- XContentType xContentType = null;
+ private MediaType getContentType(Map headers, XContentType[] supportedContentTypes) {
+ MediaType mediaType = null;
String contentType = headers.get("Content-Type");
if (contentType != null) {
- xContentType = XContentType.fromMediaType(contentType);
+ mediaType = MediaType.fromMediaType(contentType);
}
- if (xContentType != null) {
- return xContentType;
+ if (mediaType != null) {
+ return mediaType;
}
if (randomizeContentType) {
return RandomizedTest.randomFrom(supportedContentTypes);
@@ -182,9 +183,9 @@ private XContentType getContentType(Map headers, XContentType[]
return XContentType.JSON;
}
- private BytesRef bodyAsBytesRef(Map bodyAsMap, XContentType xContentType) throws IOException {
+ private BytesRef bodyAsBytesRef(Map bodyAsMap, MediaType mediaType) throws IOException {
Map finalBodyAsMap = stash.replaceStashedValues(bodyAsMap);
- try (XContentBuilder builder = XContentFactory.contentBuilder(xContentType)) {
+ try (XContentBuilder builder = XContentFactory.contentBuilder(mediaType)) {
return BytesReference.bytes(builder.map(finalBodyAsMap)).toBytesRef();
}
}
diff --git a/test/framework/src/main/java/org/opensearch/test/rest/yaml/ClientYamlTestResponse.java b/test/framework/src/main/java/org/opensearch/test/rest/yaml/ClientYamlTestResponse.java
index 5c6190ab860b2..0f14461eb0f86 100644
--- a/test/framework/src/main/java/org/opensearch/test/rest/yaml/ClientYamlTestResponse.java
+++ b/test/framework/src/main/java/org/opensearch/test/rest/yaml/ClientYamlTestResponse.java
@@ -38,6 +38,7 @@
import org.opensearch.common.Strings;
import org.opensearch.core.common.bytes.BytesArray;
import org.opensearch.common.xcontent.LoggingDeprecationHandler;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.NamedXContentRegistry;
import org.opensearch.core.xcontent.XContentBuilder;
import org.opensearch.common.xcontent.XContentFactory;
@@ -58,7 +59,7 @@ public class ClientYamlTestResponse {
private final Response response;
private final byte[] body;
- private final XContentType bodyContentType;
+ private final MediaType bodyContentType;
private ObjectPath parsedResponse;
private String bodyAsString;
@@ -66,7 +67,7 @@ public ClientYamlTestResponse(Response response) throws IOException {
this.response = response;
if (response.getEntity() != null) {
String contentType = response.getHeader("Content-Type");
- this.bodyContentType = XContentType.fromMediaType(contentType);
+ this.bodyContentType = MediaType.fromMediaType(contentType);
try {
byte[] bytes = EntityUtils.toByteArray(response.getEntity());
// skip parsing if we got text back (e.g. if we called _cat apis)
diff --git a/test/framework/src/main/java/org/opensearch/test/rest/yaml/ObjectPath.java b/test/framework/src/main/java/org/opensearch/test/rest/yaml/ObjectPath.java
index 8b62f0d0a9783..6c1510f8ca60a 100644
--- a/test/framework/src/main/java/org/opensearch/test/rest/yaml/ObjectPath.java
+++ b/test/framework/src/main/java/org/opensearch/test/rest/yaml/ObjectPath.java
@@ -36,11 +36,11 @@
import org.opensearch.core.common.bytes.BytesArray;
import org.opensearch.core.common.bytes.BytesReference;
import org.opensearch.core.xcontent.DeprecationHandler;
+import org.opensearch.core.xcontent.MediaType;
import org.opensearch.core.xcontent.NamedXContentRegistry;
import org.opensearch.core.xcontent.XContent;
import org.opensearch.core.xcontent.XContentBuilder;
import org.opensearch.core.xcontent.XContentParser;
-import org.opensearch.common.xcontent.XContentType;
import java.io.IOException;
import java.util.ArrayList;
@@ -57,8 +57,8 @@ public class ObjectPath {
public static ObjectPath createFromResponse(Response response) throws IOException {
byte[] bytes = EntityUtils.toByteArray(response.getEntity());
String contentType = response.getHeader("Content-Type");
- XContentType xContentType = XContentType.fromMediaType(contentType);
- return ObjectPath.createFromXContent(xContentType.xContent(), new BytesArray(bytes));
+ MediaType mediaType = MediaType.fromMediaType(contentType);
+ return ObjectPath.createFromXContent(mediaType.xContent(), new BytesArray(bytes));
}
public static ObjectPath createFromXContent(XContent xContent, BytesReference input) throws IOException {