In some cases, we may have to clone current SolrQueryRequest instances: we may want to send client solr request to multiple cores etc.
Copy SolrParms is easy. But how can we copy ContentStream? This code will not work: newReq.setContentStreams(oldReq.getContentStreams());.
As most types of streams can only be read once: for example HttpRequestContentStream: when we send data in a post request to Solr, the HttpRequestContentStream would contain the data.
If we clone current SolrQueryRequest objects to multiple instances, then only one instance can read the data, others will throw exception: stream close related exception.
To fix this, the key is to copy content from ContentStream to a StringStream first, a StringStream can be read multiple times.
The code looks like below:
Copy SolrParms is easy. But how can we copy ContentStream? This code will not work: newReq.setContentStreams(oldReq.getContentStreams());.
As most types of streams can only be read once: for example HttpRequestContentStream: when we send data in a post request to Solr, the HttpRequestContentStream would contain the data.
If we clone current SolrQueryRequest objects to multiple instances, then only one instance can read the data, others will throw exception: stream close related exception.
To fix this, the key is to copy content from ContentStream to a StringStream first, a StringStream can be read multiple times.
The code looks like below:
public static SolrQueryRequestBase cloneSolrRequest(SolrQueryRequest oldReq) throws IOException { SolrQueryRequestBase newReq = new LocalSolrQueryRequest(oldReq.getCore(), oldReq.getParams()); Iterable<ContentStream> iterable = oldReq.getContentStreams(); if (iterable != null) { Iterator<ContentStream> it = iterable.iterator(); List<ContentStream> newStreams = new ArrayList<ContentStream>(); while (it.hasNext()) { ContentStream oldStream = it.next(); if (oldStream instanceof StringStream) { newStreams.add(oldStream); } else { InputStream is = oldStream.getStream(); String streamContent = IOUtils.toString(is); StringStream sStr = new StringStream(streamContent); sStr.setContentType(oldStream.getContentType()); sStr.setName(oldStream.getName()); sStr.setSize(oldStream.getSize()); sStr.setSourceInfo(oldStream.getSourceInfo()); newStreams.add(sStr); } } newReq.setContentStreams(newStreams); } return newReq; }
SolrQueryRequest convertedReq = cloneSolrRequest(req); private SolrQueryRequestBase copyReqToCore(SolrQueryRequest oldStringStreamReq, SolrCore core) throws IOException { SolrQueryRequestBase newReq = new LocalSolrQueryRequest(core, oldStringStreamReq.getParams()); newReq.setContentStreams(oldStringStreamReq.getContentStreams()); return newReq; }