diff --git a/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/JsonProcessor.java b/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/JsonProcessor.java index de726ddb7fb..edcc4bf3e0c 100644 --- a/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/JsonProcessor.java +++ b/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/JsonProcessor.java @@ -38,6 +38,7 @@ import org.elasticsearch.ingest.IngestDocument; import org.elasticsearch.ingest.Processor; import java.io.IOException; +import java.io.InputStream; import java.util.Map; import static org.elasticsearch.ingest.ConfigurationUtils.newConfigurationException; @@ -77,8 +78,9 @@ public final class JsonProcessor extends AbstractProcessor { public void execute(IngestDocument document) throws Exception { Object fieldValue = document.getFieldValue(field, Object.class); BytesReference bytesRef = (fieldValue == null) ? new BytesArray("null") : new BytesArray(fieldValue.toString()); - try (XContentParser parser = JsonXContent.jsonXContent - .createParser(NamedXContentRegistry.EMPTY, DeprecationHandler.THROW_UNSUPPORTED_OPERATION, bytesRef.streamInput())) { + try (InputStream stream = bytesRef.streamInput(); + XContentParser parser = JsonXContent.jsonXContent + .createParser(NamedXContentRegistry.EMPTY, DeprecationHandler.THROW_UNSUPPORTED_OPERATION, stream)) { XContentParser.Token token = parser.nextToken(); Object value = null; if (token == XContentParser.Token.VALUE_NULL) { diff --git a/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/ScriptProcessor.java b/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/ScriptProcessor.java index ac8c1e3528a..90bb1f3104b 100644 --- a/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/ScriptProcessor.java +++ b/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/ScriptProcessor.java @@ -36,6 +36,7 @@ import org.elasticsearch.script.Script; import org.elasticsearch.script.ScriptException; import org.elasticsearch.script.ScriptService; +import java.io.InputStream; import java.util.Arrays; import java.util.Map; @@ -97,21 +98,23 @@ public final class ScriptProcessor extends AbstractProcessor { @Override public ScriptProcessor create(Map registry, String processorTag, Map config) throws Exception { - XContentBuilder builder = XContentBuilder.builder(JsonXContent.jsonXContent).map(config); - XContentParser parser = XContentType.JSON.xContent().createParser(NamedXContentRegistry.EMPTY, - LoggingDeprecationHandler.INSTANCE, builder.bytes().streamInput()); - Script script = Script.parse(parser); + try (XContentBuilder builder = XContentBuilder.builder(JsonXContent.jsonXContent).map(config); + InputStream stream = builder.bytes().streamInput(); + XContentParser parser = XContentType.JSON.xContent().createParser(NamedXContentRegistry.EMPTY, + LoggingDeprecationHandler.INSTANCE, stream)) { + Script script = Script.parse(parser); - Arrays.asList("id", "source", "inline", "lang", "params", "options").forEach(config::remove); + Arrays.asList("id", "source", "inline", "lang", "params", "options").forEach(config::remove); - // verify script is able to be compiled before successfully creating processor. - try { - scriptService.compile(script, ExecutableScript.INGEST_CONTEXT); - } catch (ScriptException e) { - throw newConfigurationException(TYPE, processorTag, null, e); + // verify script is able to be compiled before successfully creating processor. + try { + scriptService.compile(script, ExecutableScript.INGEST_CONTEXT); + } catch (ScriptException e) { + throw newConfigurationException(TYPE, processorTag, null, e); + } + + return new ScriptProcessor(processorTag, script, scriptService); } - - return new ScriptProcessor(processorTag, script, scriptService); } } } diff --git a/modules/reindex/src/main/java/org/elasticsearch/index/reindex/RestReindexAction.java b/modules/reindex/src/main/java/org/elasticsearch/index/reindex/RestReindexAction.java index 06000d156f9..74008894392 100644 --- a/modules/reindex/src/main/java/org/elasticsearch/index/reindex/RestReindexAction.java +++ b/modules/reindex/src/main/java/org/elasticsearch/index/reindex/RestReindexAction.java @@ -41,6 +41,7 @@ import org.elasticsearch.rest.RestRequest; import org.elasticsearch.script.Script; import java.io.IOException; +import java.io.InputStream; import java.util.List; import java.util.Map; import java.util.regex.Matcher; @@ -74,8 +75,9 @@ public class RestReindexAction extends AbstractBaseReindexRestHandler im @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { if (source != null) { - builder.rawValue(new BytesArray(source).streamInput(), XContentType.JSON); + try (InputStream stream = new BytesArray(source).streamInput()) { + builder.rawValue(stream, XContentType.JSON); + } } else { builder.startObject().endObject(); } diff --git a/server/src/main/java/org/elasticsearch/action/bulk/BulkRequest.java b/server/src/main/java/org/elasticsearch/action/bulk/BulkRequest.java index 3a081c0ed3c..8a8353c731b 100644 --- a/server/src/main/java/org/elasticsearch/action/bulk/BulkRequest.java +++ b/server/src/main/java/org/elasticsearch/action/bulk/BulkRequest.java @@ -49,6 +49,7 @@ import org.elasticsearch.index.VersionType; import org.elasticsearch.search.fetch.subphase.FetchSourceContext; import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -305,9 +306,9 @@ public class BulkRequest extends ActionRequest implements CompositeIndicesReques // now parse the action // EMPTY is safe here because we never call namedObject - try (XContentParser parser = xContent - .createParser(NamedXContentRegistry.EMPTY, LoggingDeprecationHandler.INSTANCE, - data.slice(from, nextMarker - from).streamInput())) { + try (InputStream stream = data.slice(from, nextMarker - from).streamInput(); + XContentParser parser = xContent + .createParser(NamedXContentRegistry.EMPTY, LoggingDeprecationHandler.INSTANCE, stream)) { // move pointers from = nextMarker + 1; @@ -431,8 +432,9 @@ public class BulkRequest extends ActionRequest implements CompositeIndicesReques .routing(routing) .parent(parent); // EMPTY is safe here because we never call namedObject - try (XContentParser sliceParser = xContent.createParser(NamedXContentRegistry.EMPTY, - LoggingDeprecationHandler.INSTANCE, sliceTrimmingCarriageReturn(data, from, nextMarker, xContentType).streamInput())) { + try (InputStream dataStream = sliceTrimmingCarriageReturn(data, from, nextMarker, xContentType).streamInput(); + XContentParser sliceParser = xContent.createParser(NamedXContentRegistry.EMPTY, + LoggingDeprecationHandler.INSTANCE, dataStream)) { updateRequest.fromXContent(sliceParser); } if (fetchSourceContext != null) { diff --git a/server/src/main/java/org/elasticsearch/action/search/MultiSearchRequest.java b/server/src/main/java/org/elasticsearch/action/search/MultiSearchRequest.java index 1d9512f1c11..26e47f8232e 100644 --- a/server/src/main/java/org/elasticsearch/action/search/MultiSearchRequest.java +++ b/server/src/main/java/org/elasticsearch/action/search/MultiSearchRequest.java @@ -36,6 +36,7 @@ import org.elasticsearch.common.xcontent.XContentParser; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -207,9 +208,8 @@ public class MultiSearchRequest extends ActionRequest implements CompositeIndice IndicesOptions defaultOptions = SearchRequest.DEFAULT_INDICES_OPTIONS; // now parse the action if (nextMarker - from > 0) { - try (XContentParser parser = xContent - .createParser(registry, LoggingDeprecationHandler.INSTANCE, - data.slice(from, nextMarker - from).streamInput())) { + try (InputStream stream = data.slice(from, nextMarker - from).streamInput(); + XContentParser parser = xContent.createParser(registry, LoggingDeprecationHandler.INSTANCE, stream)) { Map source = parser.map(); for (Map.Entry entry : source.entrySet()) { Object value = entry.getValue(); @@ -245,7 +245,8 @@ public class MultiSearchRequest extends ActionRequest implements CompositeIndice break; } BytesReference bytes = data.slice(from, nextMarker - from); - try (XContentParser parser = xContent.createParser(registry, LoggingDeprecationHandler.INSTANCE, bytes.streamInput())) { + try (InputStream stream = bytes.streamInput(); + XContentParser parser = xContent.createParser(registry, LoggingDeprecationHandler.INSTANCE, stream)) { consumer.accept(searchRequest, parser); } // move pointers diff --git a/server/src/main/java/org/elasticsearch/action/termvectors/TermVectorsFields.java b/server/src/main/java/org/elasticsearch/action/termvectors/TermVectorsFields.java index 71742b17134..92086cdd97d 100644 --- a/server/src/main/java/org/elasticsearch/action/termvectors/TermVectorsFields.java +++ b/server/src/main/java/org/elasticsearch/action/termvectors/TermVectorsFields.java @@ -130,21 +130,21 @@ public final class TermVectorsFields extends Fields { * @param termVectors Stores the actual term vectors as a {@link BytesRef}. */ public TermVectorsFields(BytesReference headerRef, BytesReference termVectors) throws IOException { - StreamInput header = headerRef.streamInput(); - fieldMap = new ObjectLongHashMap<>(); - // here we read the header to fill the field offset map - String headerString = header.readString(); - assert headerString.equals("TV"); - int version = header.readInt(); - assert version == -1; - hasTermStatistic = header.readBoolean(); - hasFieldStatistic = header.readBoolean(); - hasScores = header.readBoolean(); - final int numFields = header.readVInt(); - for (int i = 0; i < numFields; i++) { - fieldMap.put((header.readString()), header.readVLong()); + try (StreamInput header = headerRef.streamInput()) { + fieldMap = new ObjectLongHashMap<>(); + // here we read the header to fill the field offset map + String headerString = header.readString(); + assert headerString.equals("TV"); + int version = header.readInt(); + assert version == -1; + hasTermStatistic = header.readBoolean(); + hasFieldStatistic = header.readBoolean(); + hasScores = header.readBoolean(); + final int numFields = header.readVInt(); + for (int i = 0; i < numFields; i++) { + fieldMap.put((header.readString()), header.readVLong()); + } } - header.close(); // reference to the term vector data this.termVectors = termVectors; } diff --git a/server/src/main/java/org/elasticsearch/common/xcontent/XContentBuilder.java b/server/src/main/java/org/elasticsearch/common/xcontent/XContentBuilder.java index 03c75d83312..9274bfbf345 100644 --- a/server/src/main/java/org/elasticsearch/common/xcontent/XContentBuilder.java +++ b/server/src/main/java/org/elasticsearch/common/xcontent/XContentBuilder.java @@ -987,7 +987,9 @@ public final class XContentBuilder implements Releasable, Flushable { */ @Deprecated public XContentBuilder rawField(String name, BytesReference value) throws IOException { - generator.writeRawField(name, value.streamInput()); + try (InputStream stream = value.streamInput()) { + generator.writeRawField(name, stream); + } return this; } @@ -995,7 +997,9 @@ public final class XContentBuilder implements Releasable, Flushable { * Writes a raw field with the given bytes as the value */ public XContentBuilder rawField(String name, BytesReference value, XContentType contentType) throws IOException { - generator.writeRawField(name, value.streamInput(), contentType); + try (InputStream stream = value.streamInput()) { + generator.writeRawField(name, stream, contentType); + } return this; } diff --git a/server/src/main/java/org/elasticsearch/common/xcontent/XContentHelper.java b/server/src/main/java/org/elasticsearch/common/xcontent/XContentHelper.java index f8b90c934f2..48f3685720f 100644 --- a/server/src/main/java/org/elasticsearch/common/xcontent/XContentHelper.java +++ b/server/src/main/java/org/elasticsearch/common/xcontent/XContentHelper.java @@ -106,7 +106,9 @@ public class XContentHelper { input = bytes.streamInput(); } contentType = xContentType != null ? xContentType : XContentFactory.xContentType(input); - return new Tuple<>(Objects.requireNonNull(contentType), convertToMap(XContentFactory.xContent(contentType), input, ordered)); + try (InputStream stream = input) { + return new Tuple<>(Objects.requireNonNull(contentType), convertToMap(XContentFactory.xContent(contentType), stream, ordered)); + } } catch (IOException e) { throw new ElasticsearchParseException("Failed to parse content to map", e); } @@ -163,8 +165,9 @@ public class XContentHelper { } // It is safe to use EMPTY here because this never uses namedObject - try (XContentParser parser = XContentFactory.xContent(xContentType).createParser(NamedXContentRegistry.EMPTY, - DeprecationHandler.THROW_UNSUPPORTED_OPERATION, bytes.streamInput())) { + try (InputStream stream = bytes.streamInput(); + XContentParser parser = XContentFactory.xContent(xContentType).createParser(NamedXContentRegistry.EMPTY, + DeprecationHandler.THROW_UNSUPPORTED_OPERATION, stream)) { parser.nextToken(); XContentBuilder builder = XContentFactory.jsonBuilder(); if (prettyPrint) { @@ -376,8 +379,9 @@ public class XContentHelper { public static void writeRawField(String field, BytesReference source, XContentBuilder builder, ToXContent.Params params) throws IOException { Compressor compressor = CompressorFactory.compressor(source); if (compressor != null) { - InputStream compressedStreamInput = compressor.streamInput(source.streamInput()); - builder.rawField(field, compressedStreamInput); + try (InputStream compressedStreamInput = compressor.streamInput(source.streamInput())) { + builder.rawField(field, compressedStreamInput); + } } else { builder.rawField(field, source); } @@ -392,8 +396,9 @@ public class XContentHelper { Objects.requireNonNull(xContentType); Compressor compressor = CompressorFactory.compressor(source); if (compressor != null) { - InputStream compressedStreamInput = compressor.streamInput(source.streamInput()); - builder.rawField(field, compressedStreamInput, xContentType); + try (InputStream compressedStreamInput = compressor.streamInput(source.streamInput())) { + builder.rawField(field, compressedStreamInput, xContentType); + } } else { builder.rawField(field, source, xContentType); } diff --git a/server/src/main/java/org/elasticsearch/index/query/functionscore/DecayFunctionBuilder.java b/server/src/main/java/org/elasticsearch/index/query/functionscore/DecayFunctionBuilder.java index 9bf9b289739..fd55cff0cce 100644 --- a/server/src/main/java/org/elasticsearch/index/query/functionscore/DecayFunctionBuilder.java +++ b/server/src/main/java/org/elasticsearch/index/query/functionscore/DecayFunctionBuilder.java @@ -53,6 +53,7 @@ import org.elasticsearch.index.query.QueryShardContext; import org.elasticsearch.search.MultiValueMode; import java.io.IOException; +import java.io.InputStream; import java.util.Objects; public abstract class DecayFunctionBuilder> extends ScoreFunctionBuilder { @@ -182,8 +183,9 @@ public abstract class DecayFunctionBuilder protected ScoreFunction doToFunction(QueryShardContext context) throws IOException { AbstractDistanceScoreFunction scoreFunction; // EMPTY is safe because parseVariable doesn't use namedObject - try (XContentParser parser = XContentFactory.xContent(functionBytes) - .createParser(NamedXContentRegistry.EMPTY, LoggingDeprecationHandler.INSTANCE, functionBytes.streamInput())) { + try (InputStream stream = functionBytes.streamInput(); + XContentParser parser = XContentFactory.xContent(functionBytes) + .createParser(NamedXContentRegistry.EMPTY, LoggingDeprecationHandler.INSTANCE, stream)) { scoreFunction = parseVariable(fieldName, parser, context, multiValueMode); } return scoreFunction; diff --git a/server/src/main/java/org/elasticsearch/rest/RestRequest.java b/server/src/main/java/org/elasticsearch/rest/RestRequest.java index bd3226d7a01..e5b3cfa67e5 100644 --- a/server/src/main/java/org/elasticsearch/rest/RestRequest.java +++ b/server/src/main/java/org/elasticsearch/rest/RestRequest.java @@ -37,6 +37,7 @@ import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentType; import java.io.IOException; +import java.io.InputStream; import java.net.SocketAddress; import java.util.Collections; import java.util.HashMap; @@ -385,8 +386,9 @@ public abstract class RestRequest implements ToXContent.Params { Tuple tuple = contentOrSourceParam(); BytesReference content = tuple.v2(); XContentType xContentType = tuple.v1(); - try (XContentParser parser = xContentType.xContent() - .createParser(xContentRegistry, LoggingDeprecationHandler.INSTANCE, content.streamInput())) { + try (InputStream stream = content.streamInput(); + XContentParser parser = xContentType.xContent() + .createParser(xContentRegistry, LoggingDeprecationHandler.INSTANCE, stream)) { withParser.accept(parser); } } else { diff --git a/server/src/main/java/org/elasticsearch/rest/action/document/RestGetSourceAction.java b/server/src/main/java/org/elasticsearch/rest/action/document/RestGetSourceAction.java index 5b48a4dd1c3..60c7e150dc7 100644 --- a/server/src/main/java/org/elasticsearch/rest/action/document/RestGetSourceAction.java +++ b/server/src/main/java/org/elasticsearch/rest/action/document/RestGetSourceAction.java @@ -36,6 +36,7 @@ import org.elasticsearch.rest.action.RestResponseListener; import org.elasticsearch.search.fetch.subphase.FetchSourceContext; import java.io.IOException; +import java.io.InputStream; import static org.elasticsearch.rest.RestRequest.Method.GET; import static org.elasticsearch.rest.RestRequest.Method.HEAD; @@ -84,7 +85,9 @@ public class RestGetSourceAction extends BaseRestHandler { return new BytesRestResponse(NOT_FOUND, builder); } else { final BytesReference source = response.getSourceInternal(); - builder.rawValue(source.streamInput(), XContentFactory.xContentType(source)); + try (InputStream stream = source.streamInput()) { + builder.rawValue(stream, XContentFactory.xContentType(source)); + } return new BytesRestResponse(OK, builder); } } diff --git a/server/src/main/java/org/elasticsearch/script/Script.java b/server/src/main/java/org/elasticsearch/script/Script.java index becc58d0da7..53b496ba138 100644 --- a/server/src/main/java/org/elasticsearch/script/Script.java +++ b/server/src/main/java/org/elasticsearch/script/Script.java @@ -40,6 +40,7 @@ import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.common.xcontent.json.JsonXContent; import java.io.IOException; +import java.io.InputStream; import java.io.UncheckedIOException; import java.util.Collections; import java.util.HashMap; @@ -282,8 +283,11 @@ public final class Script implements ToXContentObject, Writeable { builder.startObject(); settings.toXContent(builder, ToXContent.EMPTY_PARAMS); builder.endObject(); - return parse(JsonXContent.jsonXContent.createParser(NamedXContentRegistry.EMPTY, - LoggingDeprecationHandler.INSTANCE, builder.bytes().streamInput())); + try (InputStream stream = builder.bytes().streamInput(); + XContentParser parser = JsonXContent.jsonXContent.createParser(NamedXContentRegistry.EMPTY, + LoggingDeprecationHandler.INSTANCE, stream)) { + return parse(parser); + } } catch (IOException e) { // it should not happen since we are not actually reading from a stream but an in-memory byte[] throw new IllegalStateException(e); diff --git a/server/src/main/java/org/elasticsearch/script/StoredScriptSource.java b/server/src/main/java/org/elasticsearch/script/StoredScriptSource.java index 81b1b5575fe..f85ac50689d 100644 --- a/server/src/main/java/org/elasticsearch/script/StoredScriptSource.java +++ b/server/src/main/java/org/elasticsearch/script/StoredScriptSource.java @@ -43,6 +43,7 @@ import org.elasticsearch.common.xcontent.XContentParser.Token; import org.elasticsearch.common.xcontent.XContentType; import java.io.IOException; +import java.io.InputStream; import java.io.UncheckedIOException; import java.util.Collections; import java.util.HashMap; @@ -243,8 +244,9 @@ public class StoredScriptSource extends AbstractDiffable imp * @return The parsed {@link StoredScriptSource}. */ public static StoredScriptSource parse(BytesReference content, XContentType xContentType) { - try (XContentParser parser = xContentType.xContent() - .createParser(NamedXContentRegistry.EMPTY, LoggingDeprecationHandler.INSTANCE, content.streamInput())) { + try (InputStream stream = content.streamInput(); + XContentParser parser = xContentType.xContent() + .createParser(NamedXContentRegistry.EMPTY, LoggingDeprecationHandler.INSTANCE, stream)) { Token token = parser.nextToken(); if (token != Token.START_OBJECT) { diff --git a/server/src/main/java/org/elasticsearch/tasks/RawTaskStatus.java b/server/src/main/java/org/elasticsearch/tasks/RawTaskStatus.java index 49e6b9d296f..a6deb85c106 100644 --- a/server/src/main/java/org/elasticsearch/tasks/RawTaskStatus.java +++ b/server/src/main/java/org/elasticsearch/tasks/RawTaskStatus.java @@ -27,6 +27,7 @@ import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import java.io.IOException; +import java.io.InputStream; import java.util.Map; import static java.util.Objects.requireNonNull; @@ -58,7 +59,9 @@ public class RawTaskStatus implements Task.Status { @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - return builder.rawValue(status.streamInput(), XContentFactory.xContentType(status)); + try (InputStream stream = status.streamInput()) { + return builder.rawValue(stream, XContentFactory.xContentType(status)); + } } @Override