diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/SolrRequest.java b/solr/solrj/src/java/org/apache/solr/client/solrj/SolrRequest.java index b5c3e16dcbc..bccf2edbfb2 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/SolrRequest.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/SolrRequest.java @@ -16,9 +16,6 @@ */ package org.apache.solr.client.solrj; -import org.apache.solr.common.params.SolrParams; -import org.apache.solr.common.util.ContentStream; - import java.io.IOException; import java.io.Serializable; import java.util.Arrays; @@ -27,6 +24,10 @@ import java.util.HashSet; import java.util.Set; import java.util.concurrent.TimeUnit; +import org.apache.solr.client.solrj.request.RequestWriter; +import org.apache.solr.common.params.SolrParams; +import org.apache.solr.common.util.ContentStream; + import static java.util.Collections.unmodifiableSet; /** @@ -155,6 +156,10 @@ public abstract class SolrRequest implements Serializabl public abstract Collection getContentStreams() throws IOException; + public RequestWriter.ContentWriter getContentWriter(String expectedType) { + return null; + } + /** * Create a new SolrResponse to hold the response from the server * @param client the {@link SolrClient} the request will be sent to diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/BinaryRequestWriter.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/BinaryRequestWriter.java index 4687fe36304..398571da204 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/BinaryRequestWriter.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/BinaryRequestWriter.java @@ -53,7 +53,7 @@ public class BinaryRequestWriter extends RequestWriter { } }; } else { - return null; + return req.getContentWriter("application/javabin"); } } diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/RequestWriter.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/RequestWriter.java index ef7f14d30b7..5521e29acb3 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/RequestWriter.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/RequestWriter.java @@ -70,7 +70,7 @@ public class RequestWriter { } }; } - return null; + return req.getContentWriter(ClientUtils.TEXT_XML); } public Collection getContentStreams(SolrRequest req) throws IOException { diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/V2Request.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/V2Request.java index c6a553826f6..8985c9c554a 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/V2Request.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/V2Request.java @@ -17,12 +17,10 @@ package org.apache.solr.client.solrj.request; -import java.io.ByteArrayInputStream; import java.io.IOException; -import java.io.InputStream; +import java.io.OutputStream; import java.nio.charset.StandardCharsets; import java.util.Collection; -import java.util.Collections; import java.util.concurrent.atomic.AtomicLong; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -33,7 +31,7 @@ import org.apache.solr.client.solrj.response.V2Response; import org.apache.solr.common.MapWriter; import org.apache.solr.common.params.SolrParams; import org.apache.solr.common.util.ContentStream; -import org.apache.solr.common.util.ContentStreamBase; +import org.apache.solr.common.util.JavaBinCodec; import org.apache.solr.common.util.Utils; public class V2Request extends SolrRequest implements MapWriter { @@ -63,23 +61,34 @@ public class V2Request extends SolrRequest implements MapWriter { } @Override - public Collection getContentStreams() throws IOException { + public RequestWriter.ContentWriter getContentWriter(String s) { if (v2Calls.get() != null) v2Calls.get().incrementAndGet(); - if (payload != null) { - return Collections.singleton(new ContentStreamBase() { - @Override - public InputStream getStream() throws IOException { - if(payload instanceof InputStream) return (InputStream) payload; - if (useBinary) return Utils.toJavabin(payload); - else return new ByteArrayInputStream(Utils.toJSON(payload)); + if (payload == null) return null; + return new RequestWriter.ContentWriter() { + @Override + public void write(OutputStream os) throws IOException { + if (payload instanceof String) { + os.write(((String) payload).getBytes(StandardCharsets.UTF_8)); + } else { + if (useBinary) { + new JavaBinCodec().marshal(payload, os); + } else { + byte[] b = Utils.toJSON(payload); + os.write(b); + } } + } - @Override - public String getContentType() { - return useBinary ? "application/javabin" : "application/json"; - } - }); - } + @Override + public String getContentType() { + if (payload instanceof String) return "application/json"; + return useBinary ? "application/javabin" : "application/json"; + } + }; + } + + @Override + public Collection getContentStreams() throws IOException { return null; } @@ -135,7 +144,7 @@ public class V2Request extends SolrRequest implements MapWriter { */ public Builder withPayload(String payload) { if (payload != null) { - this.payload = new ByteArrayInputStream(payload.getBytes(StandardCharsets.UTF_8)); + this.payload = payload; } return this; } diff --git a/solr/solrj/src/java/org/apache/solr/common/util/CommandOperation.java b/solr/solrj/src/java/org/apache/solr/common/util/CommandOperation.java index 561fb869232..277324affda 100644 --- a/solr/solrj/src/java/org/apache/solr/common/util/CommandOperation.java +++ b/solr/solrj/src/java/org/apache/solr/common/util/CommandOperation.java @@ -343,6 +343,7 @@ public class CommandOperation { } ArrayList ops = new ArrayList<>(); for (ContentStream stream : streams) { + if ("application/javabin".equals(stream.getContentType())) { ops.addAll(parse(stream.getStream(), singletonCommands)); } else {