This is an automated email from the ASF dual-hosted git repository.

psalagnac pushed a commit to branch branch_9x
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/branch_9x by this push:
     new f1050ff766d SOLR-17518: Deprecate UpdateRequest.getXml() and replace 
it with XMLRequestWriter (#3200)
f1050ff766d is described below

commit f1050ff766d6a0f30fe2784d70684faec346a70c
Author: Pierre Salagnac <[email protected]>
AuthorDate: Tue Feb 25 11:11:47 2025 +0100

    SOLR-17518: Deprecate UpdateRequest.getXml() and replace it with 
XMLRequestWriter (#3200)
---
 solr/CHANGES.txt                                   |   2 +
 .../client/solrj/embedded/EmbeddedSolrServer.java  |   5 +-
 .../org/apache/solr/update/AddBlockUpdateTest.java |   9 +-
 .../client/solrj/impl/BinaryRequestWriter.java     |   2 +-
 .../solr/client/solrj/impl/XMLRequestWriter.java   | 213 +++++++++++++++++++++
 .../solr/client/solrj/request/RequestWriter.java   |  56 ++----
 .../solr/client/solrj/request/UpdateRequest.java   | 147 ++------------
 .../apache/solr/client/solrj/util/ClientUtils.java |  10 -
 .../solr/client/solrj/SolrExampleXMLTest.java      |   4 +-
 .../apache/solr/client/solrj/TestBatchUpdate.java  |   4 +-
 .../solr/client/solrj/TestSolrJErrorHandling.java  |   4 +-
 .../embedded/SolrExampleStreamingHttp2Test.java    |   4 +-
 .../solrj/embedded/SolrExampleStreamingTest.java   |   4 +-
 .../solrj/embedded/SolrExampleXMLHttp2Test.java    |   4 +-
 .../client/solrj/impl/BasicHttpSolrClientTest.java |   3 +-
 .../client/solrj/impl/Http2SolrClientTest.java     |   3 +-
 .../client/solrj/impl/HttpJdkSolrClientTest.java   |   3 +-
 .../solr/client/solrj/util/ClientUtilsTest.java    |   4 +-
 18 files changed, 265 insertions(+), 216 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index c590f48c296..1a6269e8f2e 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -101,6 +101,8 @@ Other Changes
 
 * SOLR-17670: Fix unnecessary memory allocation caused by a large reRankDocs 
param. (JiaBao Gao)
 
+* SOLR-17518: Deprecate UpdateRequest.getXml() and replace it with 
XMLRequestWriter. (Pierre Salagnac)
+
 ==================  9.8.0 ==================
 New Features
 ---------------------
diff --git 
a/solr/core/src/java/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java
 
b/solr/core/src/java/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java
index 3583f773718..45aaea07d1d 100644
--- 
a/solr/core/src/java/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java
+++ 
b/solr/core/src/java/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java
@@ -38,6 +38,7 @@ import org.apache.solr.client.solrj.StreamingResponseCallback;
 import org.apache.solr.client.solrj.impl.BinaryRequestWriter;
 import org.apache.solr.client.solrj.impl.BinaryResponseParser;
 import org.apache.solr.client.solrj.impl.InputStreamResponseParser;
+import org.apache.solr.client.solrj.impl.XMLRequestWriter;
 import org.apache.solr.client.solrj.request.ContentStreamUpdateRequest;
 import org.apache.solr.client.solrj.request.RequestWriter;
 import org.apache.solr.common.SolrDocument;
@@ -78,8 +79,8 @@ public class EmbeddedSolrServer extends SolrClient {
 
   @SuppressWarnings("ImmutableEnumChecker")
   public enum RequestWriterSupplier {
-    JavaBin(() -> new BinaryRequestWriter()),
-    XML(() -> new RequestWriter());
+    JavaBin(BinaryRequestWriter::new),
+    XML(XMLRequestWriter::new);
 
     private final Supplier<RequestWriter> supplier;
 
diff --git a/solr/core/src/test/org/apache/solr/update/AddBlockUpdateTest.java 
b/solr/core/src/test/org/apache/solr/update/AddBlockUpdateTest.java
index 3bd24035767..7e630773725 100644
--- a/solr/core/src/test/org/apache/solr/update/AddBlockUpdateTest.java
+++ b/solr/core/src/test/org/apache/solr/update/AddBlockUpdateTest.java
@@ -54,6 +54,7 @@ import org.apache.lucene.search.join.QueryBitSetProducer;
 import org.apache.lucene.search.join.ScoreMode;
 import org.apache.lucene.search.join.ToParentBlockJoinQuery;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.client.solrj.impl.XMLRequestWriter;
 import org.apache.solr.client.solrj.request.RequestWriter;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.common.SolrException;
@@ -451,7 +452,7 @@ public class AddBlockUpdateTest extends SolrTestCaseJ4 {
     Collections.shuffle(docs, random());
     req.add(docs);
 
-    RequestWriter requestWriter = new RequestWriter();
+    RequestWriter requestWriter = new XMLRequestWriter();
     OutputStream os = new ByteArrayOutputStream();
     requestWriter.write(req, os);
     assertBlockU(os.toString());
@@ -518,7 +519,7 @@ public class AddBlockUpdateTest extends SolrTestCaseJ4 {
     Collections.shuffle(docs, random());
     req.add(docs);
 
-    RequestWriter requestWriter = new RequestWriter();
+    RequestWriter requestWriter = new XMLRequestWriter();
     OutputStream os = new ByteArrayOutputStream();
     requestWriter.write(req, os);
     assertBlockU(os.toString());
@@ -704,7 +705,7 @@ public class AddBlockUpdateTest extends SolrTestCaseJ4 {
     Collections.shuffle(docs, random());
     req.add(docs);
 
-    RequestWriter requestWriter = new RequestWriter();
+    RequestWriter requestWriter = new XMLRequestWriter();
     OutputStream os = new ByteArrayOutputStream();
     requestWriter.write(req, os);
     assertBlockU(os.toString());
@@ -807,7 +808,7 @@ public class AddBlockUpdateTest extends SolrTestCaseJ4 {
     Collections.shuffle(docs, random());
     req.add(docs);
 
-    RequestWriter requestWriter = new RequestWriter();
+    RequestWriter requestWriter = new XMLRequestWriter();
     OutputStream os = new ByteArrayOutputStream();
     requestWriter.write(req, os);
     assertBlockU(os.toString());
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 0dcdba37599..7e8d3feb9c8 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
@@ -63,7 +63,7 @@ public class BinaryRequestWriter extends RequestWriter {
       if (isEmpty(updateRequest)) return null;
       throw new RuntimeException("This Should not happen");
     } else {
-      return super.getContentStreams(req);
+      return req.getContentStreams();
     }
   }
 
diff --git 
a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/XMLRequestWriter.java 
b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/XMLRequestWriter.java
new file mode 100644
index 00000000000..f3e48a31640
--- /dev/null
+++ 
b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/XMLRequestWriter.java
@@ -0,0 +1,213 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.solr.client.solrj.impl;
+
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import org.apache.solr.client.solrj.SolrRequest;
+import org.apache.solr.client.solrj.request.RequestWriter;
+import org.apache.solr.client.solrj.request.UpdateRequest;
+import org.apache.solr.client.solrj.util.ClientUtils;
+import org.apache.solr.common.SolrInputDocument;
+import org.apache.solr.common.params.ShardParams;
+import org.apache.solr.common.util.ContentStream;
+import org.apache.solr.common.util.XML;
+
+public class XMLRequestWriter extends RequestWriter {
+
+  @Override
+  public RequestWriter.ContentWriter getContentWriter(SolrRequest<?> req) {
+    if (req instanceof UpdateRequest) {
+      UpdateRequest updateRequest = (UpdateRequest) req;
+      if (isEmpty(updateRequest)) return null;
+      return new RequestWriter.ContentWriter() {
+        @Override
+        public void write(OutputStream os) throws IOException {
+          OutputStreamWriter writer = new OutputStreamWriter(os, 
StandardCharsets.UTF_8);
+          writeXML(updateRequest, writer);
+          writer.flush();
+        }
+
+        @Override
+        public String getContentType() {
+          return ClientUtils.TEXT_XML;
+        }
+      };
+    }
+    return req.getContentWriter(ClientUtils.TEXT_XML);
+  }
+
+  @Override
+  public Collection<ContentStream> getContentStreams(SolrRequest<?> req) 
throws IOException {
+    if (req instanceof UpdateRequest) {
+      return null;
+    }
+    return req.getContentStreams();
+  }
+
+  @Override
+  public void write(SolrRequest<?> request, OutputStream os) throws 
IOException {
+    if (request instanceof UpdateRequest) {
+      UpdateRequest updateRequest = (UpdateRequest) request;
+      BufferedWriter writer =
+          new BufferedWriter(new OutputStreamWriter(os, 
StandardCharsets.UTF_8));
+      writeXML(updateRequest, writer);
+      writer.flush();
+    }
+  }
+
+  @Override
+  public String getUpdateContentType() {
+    return ClientUtils.TEXT_XML;
+  }
+
+  public void writeXML(UpdateRequest request, Writer writer) throws 
IOException {
+    List<Map<SolrInputDocument, Map<String, Object>>> getDocLists = 
getDocLists(request);
+
+    for (Map<SolrInputDocument, Map<String, Object>> docs : getDocLists) {
+
+      if (docs != null && !docs.isEmpty()) {
+        Map.Entry<SolrInputDocument, Map<String, Object>> firstDoc =
+            docs.entrySet().iterator().next();
+        Map<String, Object> map = firstDoc.getValue();
+        Integer cw = null;
+        Boolean ow = null;
+        if (map != null) {
+          cw = (Integer) firstDoc.getValue().get(UpdateRequest.COMMIT_WITHIN);
+          ow = (Boolean) firstDoc.getValue().get(UpdateRequest.OVERWRITE);
+        }
+        if (ow == null) ow = true;
+        int commitWithin = (cw != null && cw != -1) ? cw : 
request.getCommitWithin();
+        boolean overwrite = ow;
+        if (commitWithin > -1 || overwrite != true) {
+          writer.write(
+              "<add commitWithin=\"" + commitWithin + "\" " + "overwrite=\"" + 
overwrite + "\">");
+        } else {
+          writer.write("<add>");
+        }
+
+        Set<Map.Entry<SolrInputDocument, Map<String, Object>>> entries = 
docs.entrySet();
+        for (Map.Entry<SolrInputDocument, Map<String, Object>> entry : 
entries) {
+          ClientUtils.writeXML(entry.getKey(), writer);
+        }
+
+        writer.write("</add>");
+      }
+    }
+
+    // Add the delete commands
+    Map<String, Map<String, Object>> deleteById = request.getDeleteByIdMap();
+    List<String> deleteQuery = request.getDeleteQuery();
+    boolean hasDeleteById = deleteById != null && !deleteById.isEmpty();
+    boolean hasDeleteByQuery = deleteQuery != null && !deleteQuery.isEmpty();
+    if (hasDeleteById || hasDeleteByQuery) {
+      if (request.getCommitWithin() > 0) {
+        writer
+            .append("<delete commitWithin=\"")
+            .append(String.valueOf(request.getCommitWithin()))
+            .append("\">");
+      } else {
+        writer.append("<delete>");
+      }
+      if (hasDeleteById) {
+        for (Map.Entry<String, Map<String, Object>> entry : 
deleteById.entrySet()) {
+          writer.append("<id");
+          Map<String, Object> map = entry.getValue();
+          if (map != null) {
+            Long version = (Long) map.get(UpdateRequest.VER);
+            String route = (String) map.get(ShardParams._ROUTE_);
+            if (version != null) {
+              writer.append(" 
version=\"").append(String.valueOf(version)).append('"');
+            }
+
+            if (route != null) {
+              writer.append(" _route_=\"").append(route).append('"');
+            }
+          }
+          writer.append(">");
+
+          XML.escapeCharData(entry.getKey(), writer);
+          writer.append("</id>");
+        }
+      }
+      if (hasDeleteByQuery) {
+        for (String q : deleteQuery) {
+          writer.append("<query>");
+          XML.escapeCharData(q, writer);
+          writer.append("</query>");
+        }
+      }
+      writer.append("</delete>");
+    }
+  }
+
+  private List<Map<SolrInputDocument, Map<String, Object>>> 
getDocLists(UpdateRequest request) {
+    List<Map<SolrInputDocument, Map<String, Object>>> docLists = new 
ArrayList<>();
+    Map<SolrInputDocument, Map<String, Object>> docList = null;
+    if (request.getDocumentsMap() != null) {
+
+      Boolean lastOverwrite = true;
+      Integer lastCommitWithin = -1;
+
+      Map<SolrInputDocument, Map<String, Object>> documents = 
request.getDocumentsMap();
+      for (Map.Entry<SolrInputDocument, Map<String, Object>> entry : 
documents.entrySet()) {
+        Map<String, Object> map = entry.getValue();
+        Boolean overwrite = null;
+        Integer commitWithin = null;
+        if (map != null) {
+          overwrite = (Boolean) entry.getValue().get(UpdateRequest.OVERWRITE);
+          commitWithin = (Integer) 
entry.getValue().get(UpdateRequest.COMMIT_WITHIN);
+        }
+        if (!Objects.equals(overwrite, lastOverwrite)
+            || !Objects.equals(commitWithin, lastCommitWithin)
+            || docLists.isEmpty()) {
+          docList = new LinkedHashMap<>();
+          docLists.add(docList);
+        }
+        docList.put(entry.getKey(), entry.getValue());
+        lastCommitWithin = commitWithin;
+        lastOverwrite = overwrite;
+      }
+    }
+
+    Iterator<SolrInputDocument> docIterator = request.getDocIterator();
+    if (docIterator != null) {
+      docList = new LinkedHashMap<>();
+      docLists.add(docList);
+      while (docIterator.hasNext()) {
+        SolrInputDocument doc = docIterator.next();
+        if (doc != null) {
+          docList.put(doc, null);
+        }
+      }
+    }
+
+    return docLists;
+  }
+}
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 e15c750f308..9c606a92b04 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
@@ -16,16 +16,13 @@
  */
 package org.apache.solr.client.solrj.request;
 
-import java.io.BufferedWriter;
 import java.io.IOException;
 import java.io.OutputStream;
-import java.io.OutputStreamWriter;
 import java.nio.charset.StandardCharsets;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import org.apache.solr.client.solrj.SolrRequest;
-import org.apache.solr.client.solrj.util.ClientUtils;
 import org.apache.solr.common.util.ContentStream;
 
 /**
@@ -36,7 +33,7 @@ import org.apache.solr.common.util.ContentStream;
  *
  * @since solr 1.4
  */
-public class RequestWriter {
+public abstract class RequestWriter {
 
   public interface ContentWriter {
 
@@ -46,41 +43,20 @@ public class RequestWriter {
   }
 
   /**
-   * Use this to do a push writing instead of pull. If this method returns 
null {@link
-   * 
org.apache.solr.client.solrj.request.RequestWriter#getContentStreams(SolrRequest)}
 is invoked
-   * to do a pull write.
+   * To be implemented by subclasses to serialize update requests into the 
appropriate format.
+   *
+   * <p>If this method returns null, {@link
+   * 
org.apache.solr.client.solrj.request.RequestWriter#getContentStreams(SolrRequest)}
 is then
+   * invoked to get content.
    */
-  public ContentWriter getContentWriter(SolrRequest<?> req) {
-    if (req instanceof UpdateRequest) {
-      UpdateRequest updateRequest = (UpdateRequest) req;
-      if (isEmpty(updateRequest)) return null;
-      return new ContentWriter() {
-        @Override
-        public void write(OutputStream os) throws IOException {
-          OutputStreamWriter writer = new OutputStreamWriter(os, 
StandardCharsets.UTF_8);
-          updateRequest.writeXML(writer);
-          writer.flush();
-        }
-
-        @Override
-        public String getContentType() {
-          return ClientUtils.TEXT_XML;
-        }
-      };
-    }
-    return req.getContentWriter(ClientUtils.TEXT_XML);
-  }
+  public abstract ContentWriter getContentWriter(SolrRequest<?> req);
 
   /**
    * @deprecated Use {@link #getContentWriter(SolrRequest)}.
    */
   @Deprecated
-  public Collection<ContentStream> getContentStreams(SolrRequest<?> req) 
throws IOException {
-    if (req instanceof UpdateRequest) {
-      return null;
-    }
-    return req.getContentStreams();
-  }
+  public abstract Collection<ContentStream> getContentStreams(SolrRequest<?> 
req)
+      throws IOException;
 
   protected boolean isEmpty(UpdateRequest updateRequest) {
     return isNull(updateRequest.getDocuments())
@@ -94,19 +70,9 @@ public class RequestWriter {
     return req.getPath();
   }
 
-  public void write(SolrRequest<?> request, OutputStream os) throws 
IOException {
-    if (request instanceof UpdateRequest) {
-      UpdateRequest updateRequest = (UpdateRequest) request;
-      BufferedWriter writer =
-          new BufferedWriter(new OutputStreamWriter(os, 
StandardCharsets.UTF_8));
-      updateRequest.writeXML(writer);
-      writer.flush();
-    }
-  }
+  public abstract void write(SolrRequest<?> request, OutputStream os) throws 
IOException;
 
-  public String getUpdateContentType() {
-    return ClientUtils.TEXT_XML;
-  }
+  public abstract String getUpdateContentType();
 
   public static class StringPayloadContentWriter implements ContentWriter {
     public final String payload;
diff --git 
a/solr/solrj/src/java/org/apache/solr/client/solrj/request/UpdateRequest.java 
b/solr/solrj/src/java/org/apache/solr/client/solrj/request/UpdateRequest.java
index 53ca9bf5cc1..8aaf122a2b3 100644
--- 
a/solr/solrj/src/java/org/apache/solr/client/solrj/request/UpdateRequest.java
+++ 
b/solr/solrj/src/java/org/apache/solr/client/solrj/request/UpdateRequest.java
@@ -34,6 +34,7 @@ import java.util.Set;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.LBSolrClient;
+import org.apache.solr.client.solrj.impl.XMLRequestWriter;
 import org.apache.solr.client.solrj.response.UpdateResponse;
 import org.apache.solr.client.solrj.util.ClientUtils;
 import org.apache.solr.common.SolrInputDocument;
@@ -44,7 +45,6 @@ import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.UpdateParams;
 import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.ContentStream;
-import org.apache.solr.common.util.XML;
 
 /**
  * @since solr 1.3
@@ -70,9 +70,6 @@ public class UpdateRequest extends AbstractUpdateRequest {
     super(METHOD.POST, url);
   }
 
-  // 
---------------------------------------------------------------------------
-  // 
---------------------------------------------------------------------------
-
   /** clear the pending documents and delete commands */
   public void clear() {
     if (documents != null) {
@@ -86,9 +83,6 @@ public class UpdateRequest extends AbstractUpdateRequest {
     }
   }
 
-  // 
---------------------------------------------------------------------------
-  // 
---------------------------------------------------------------------------
-
   /**
    * Add a SolrInputDocument to this request
    *
@@ -354,14 +348,19 @@ public class UpdateRequest extends AbstractUpdateRequest {
     this.deleteQuery = deleteQuery;
   }
 
-  // --------------------------------------------------------------------------
-  // --------------------------------------------------------------------------
-
+  /**
+   * @deprecated Method will be removed in Solr 10.0. Use {@link 
XMLRequestWriter} instead.
+   */
+  @Deprecated(since = "9.9")
   @Override
   public Collection<ContentStream> getContentStreams() throws IOException {
     return ClientUtils.toContentStreams(getXML(), ClientUtils.TEXT_XML);
   }
 
+  /**
+   * @deprecated Method will be removed in Solr 10.0. Use {@link 
XMLRequestWriter} instead.
+   */
+  @Deprecated(since = "9.9")
   public String getXML() throws IOException {
     StringWriter writer = new StringWriter();
     writeXML(writer);
@@ -369,139 +368,19 @@ public class UpdateRequest extends AbstractUpdateRequest 
{
 
     // If action is COMMIT or OPTIMIZE, it is sent with params
     String xml = writer.toString();
-    // System.out.println( "SEND:"+xml );
     return (xml.length() > 0) ? xml : null;
   }
 
-  private List<Map<SolrInputDocument, Map<String, Object>>> getDocLists(
-      Map<SolrInputDocument, Map<String, Object>> documents) {
-    List<Map<SolrInputDocument, Map<String, Object>>> docLists = new 
ArrayList<>();
-    Map<SolrInputDocument, Map<String, Object>> docList = null;
-    if (this.documents != null) {
-
-      Boolean lastOverwrite = true;
-      Integer lastCommitWithin = -1;
-
-      Set<Entry<SolrInputDocument, Map<String, Object>>> entries = 
this.documents.entrySet();
-      for (Entry<SolrInputDocument, Map<String, Object>> entry : entries) {
-        Map<String, Object> map = entry.getValue();
-        Boolean overwrite = null;
-        Integer commitWithin = null;
-        if (map != null) {
-          overwrite = (Boolean) entry.getValue().get(OVERWRITE);
-          commitWithin = (Integer) entry.getValue().get(COMMIT_WITHIN);
-        }
-        if (!Objects.equals(overwrite, lastOverwrite)
-            || !Objects.equals(commitWithin, lastCommitWithin)
-            || docLists.isEmpty()) {
-          docList = new LinkedHashMap<>();
-          docLists.add(docList);
-        }
-        docList.put(entry.getKey(), entry.getValue());
-        lastCommitWithin = commitWithin;
-        lastOverwrite = overwrite;
-      }
-    }
-
-    if (docIterator != null) {
-      docList = new LinkedHashMap<>();
-      docLists.add(docList);
-      while (docIterator.hasNext()) {
-        SolrInputDocument doc = docIterator.next();
-        if (doc != null) {
-          docList.put(doc, null);
-        }
-      }
-    }
-
-    return docLists;
-  }
-
   /**
-   * @since solr 1.4
+   * @deprecated Method will be removed in Solr 10.0. Use {@link 
XMLRequestWriter} instead.
    */
+  @Deprecated(since = "9.9")
   public UpdateRequest writeXML(Writer writer) throws IOException {
-    List<Map<SolrInputDocument, Map<String, Object>>> getDocLists = 
getDocLists(documents);
-
-    for (Map<SolrInputDocument, Map<String, Object>> docs : getDocLists) {
-
-      if ((docs != null && docs.size() > 0)) {
-        Entry<SolrInputDocument, Map<String, Object>> firstDoc = 
docs.entrySet().iterator().next();
-        Map<String, Object> map = firstDoc.getValue();
-        Integer cw = null;
-        Boolean ow = null;
-        if (map != null) {
-          cw = (Integer) firstDoc.getValue().get(COMMIT_WITHIN);
-          ow = (Boolean) firstDoc.getValue().get(OVERWRITE);
-        }
-        if (ow == null) ow = true;
-        int commitWithin = (cw != null && cw != -1) ? cw : this.commitWithin;
-        boolean overwrite = ow;
-        if (commitWithin > -1 || overwrite != true) {
-          writer.write(
-              "<add commitWithin=\"" + commitWithin + "\" " + "overwrite=\"" + 
overwrite + "\">");
-        } else {
-          writer.write("<add>");
-        }
-
-        Set<Entry<SolrInputDocument, Map<String, Object>>> entries = 
docs.entrySet();
-        for (Entry<SolrInputDocument, Map<String, Object>> entry : entries) {
-          ClientUtils.writeXML(entry.getKey(), writer);
-        }
-
-        writer.write("</add>");
-      }
-    }
-
-    // Add the delete commands
-    boolean deleteI = deleteById != null && deleteById.size() > 0;
-    boolean deleteQ = deleteQuery != null && deleteQuery.size() > 0;
-    if (deleteI || deleteQ) {
-      if (commitWithin > 0) {
-        writer.append("<delete 
commitWithin=\"").append(String.valueOf(commitWithin)).append("\">");
-      } else {
-        writer.append("<delete>");
-      }
-      if (deleteI) {
-        for (Map.Entry<String, Map<String, Object>> entry : 
deleteById.entrySet()) {
-          writer.append("<id");
-          Map<String, Object> map = entry.getValue();
-          if (map != null) {
-            Long version = (Long) map.get(VER);
-            String route = (String) map.get(_ROUTE_);
-            if (version != null) {
-              writer.append(" 
version=\"").append(String.valueOf(version)).append('"');
-            }
-
-            if (route != null) {
-              writer.append(" _route_=\"").append(route).append('"');
-            }
-          }
-          writer.append(">");
-
-          XML.escapeCharData(entry.getKey(), writer);
-          writer.append("</id>");
-        }
-      }
-      if (deleteQ) {
-        for (String q : deleteQuery) {
-          writer.append("<query>");
-          XML.escapeCharData(q, writer);
-          writer.append("</query>");
-        }
-      }
-      writer.append("</delete>");
-    }
+    XMLRequestWriter requestWriter = new XMLRequestWriter();
+    requestWriter.writeXML(this, writer);
     return this;
   }
 
-  // --------------------------------------------------------------------------
-  // --------------------------------------------------------------------------
-
-  // --------------------------------------------------------------------------
-  //
-  // --------------------------------------------------------------------------
-
   public List<SolrInputDocument> getDocuments() {
     if (documents == null) return null;
     List<SolrInputDocument> docs = new ArrayList<>(documents.size());
diff --git 
a/solr/solrj/src/java/org/apache/solr/client/solrj/util/ClientUtils.java 
b/solr/solrj/src/java/org/apache/solr/client/solrj/util/ClientUtils.java
index 82ecb5c68a6..83193f4af78 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/util/ClientUtils.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/util/ClientUtils.java
@@ -17,7 +17,6 @@
 package org.apache.solr.client.solrj.util;
 
 import java.io.IOException;
-import java.io.StringWriter;
 import java.io.Writer;
 import java.net.MalformedURLException;
 import java.net.URI;
@@ -212,15 +211,6 @@ public class ClientUtils {
     }
   }
 
-  public static String toXML(SolrInputDocument doc) {
-    StringWriter str = new StringWriter();
-    try {
-      writeXML(doc, str);
-    } catch (Exception ex) {
-    }
-    return str.toString();
-  }
-
   // 
---------------------------------------------------------------------------------------
 
   /**
diff --git 
a/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleXMLTest.java 
b/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleXMLTest.java
index ae392fd11ed..befaad61dbb 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleXMLTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleXMLTest.java
@@ -18,8 +18,8 @@ package org.apache.solr.client.solrj;
 
 import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
+import org.apache.solr.client.solrj.impl.XMLRequestWriter;
 import org.apache.solr.client.solrj.impl.XMLResponseParser;
-import org.apache.solr.client.solrj.request.RequestWriter;
 import org.junit.BeforeClass;
 
 /**
@@ -38,7 +38,7 @@ public class SolrExampleXMLTest extends SolrExampleTests {
     return new HttpSolrClient.Builder(getBaseUrl())
         .withDefaultCollection(DEFAULT_TEST_CORENAME)
         .allowMultiPartPost(random().nextBoolean())
-        .withRequestWriter(new RequestWriter())
+        .withRequestWriter(new XMLRequestWriter())
         .withResponseParser(new XMLResponseParser())
         .build();
   }
diff --git 
a/solr/solrj/src/test/org/apache/solr/client/solrj/TestBatchUpdate.java 
b/solr/solrj/src/test/org/apache/solr/client/solrj/TestBatchUpdate.java
index 9343d76bc36..30a1212c38d 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/TestBatchUpdate.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/TestBatchUpdate.java
@@ -23,7 +23,7 @@ import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
 import org.apache.solr.client.solrj.beans.Field;
 import org.apache.solr.client.solrj.impl.BinaryRequestWriter;
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
-import org.apache.solr.client.solrj.request.RequestWriter;
+import org.apache.solr.client.solrj.impl.XMLRequestWriter;
 import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.common.SolrInputDocument;
 import org.junit.BeforeClass;
@@ -49,7 +49,7 @@ public class TestBatchUpdate extends SolrJettyTestBase {
     try (SolrClient client =
         new HttpSolrClient.Builder(getBaseUrl())
             .withDefaultCollection(DEFAULT_TEST_CORENAME)
-            .withRequestWriter(new RequestWriter())
+            .withRequestWriter(new XMLRequestWriter())
             .build()) {
       client.deleteByQuery("*:*"); // delete everything!
       doIt(client);
diff --git 
a/solr/solrj/src/test/org/apache/solr/client/solrj/TestSolrJErrorHandling.java 
b/solr/solrj/src/test/org/apache/solr/client/solrj/TestSolrJErrorHandling.java
index 68ba3e42606..28f9033e94c 100644
--- 
a/solr/solrj/src/test/org/apache/solr/client/solrj/TestSolrJErrorHandling.java
+++ 
b/solr/solrj/src/test/org/apache/solr/client/solrj/TestSolrJErrorHandling.java
@@ -40,7 +40,7 @@ import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
 import org.apache.solr.client.solrj.impl.BaseHttpSolrClient;
 import org.apache.solr.client.solrj.impl.BinaryRequestWriter;
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
-import org.apache.solr.client.solrj.request.RequestWriter;
+import org.apache.solr.client.solrj.impl.XMLRequestWriter;
 import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.common.SolrInputDocument;
 import org.junit.BeforeClass;
@@ -105,7 +105,7 @@ public class TestSolrJErrorHandling extends 
SolrJettyTestBase {
     try (SolrClient client =
         new HttpSolrClient.Builder(getBaseUrl())
             .withDefaultCollection(DEFAULT_TEST_CORENAME)
-            .withRequestWriter(new RequestWriter())
+            .withRequestWriter(new XMLRequestWriter())
             .build()) {
       client.deleteByQuery("*:*"); // delete everything!
       doIt(client);
diff --git 
a/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingHttp2Test.java
 
b/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingHttp2Test.java
index 7c20c53254f..00087381f1f 100644
--- 
a/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingHttp2Test.java
+++ 
b/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingHttp2Test.java
@@ -25,9 +25,9 @@ import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrExampleTests;
 import org.apache.solr.client.solrj.impl.ConcurrentUpdateHttp2SolrClient;
 import org.apache.solr.client.solrj.impl.Http2SolrClient;
+import org.apache.solr.client.solrj.impl.XMLRequestWriter;
 import org.apache.solr.client.solrj.impl.XMLResponseParser;
 import org.apache.solr.client.solrj.request.AbstractUpdateRequest;
-import org.apache.solr.client.solrj.request.RequestWriter;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.common.SolrInputDocument;
 import org.junit.BeforeClass;
@@ -49,7 +49,7 @@ public class SolrExampleStreamingHttp2Test extends 
SolrExampleTests {
     // smaller queue size hits locks more often
     Http2SolrClient solrClient =
         new Http2SolrClient.Builder()
-            .withRequestWriter(new RequestWriter())
+            .withRequestWriter(new XMLRequestWriter())
             .withResponseParser(new XMLResponseParser())
             .build();
     ConcurrentUpdateHttp2SolrClient concurrentClient =
diff --git 
a/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingTest.java
 
b/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingTest.java
index 616782a10ea..294d3034c84 100644
--- 
a/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingTest.java
+++ 
b/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingTest.java
@@ -23,9 +23,9 @@ import java.util.List;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrExampleTests;
 import org.apache.solr.client.solrj.impl.ConcurrentUpdateSolrClient;
+import org.apache.solr.client.solrj.impl.XMLRequestWriter;
 import org.apache.solr.client.solrj.impl.XMLResponseParser;
 import org.apache.solr.client.solrj.request.AbstractUpdateRequest;
-import org.apache.solr.client.solrj.request.RequestWriter;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.common.SolrInputDocument;
 import org.junit.BeforeClass;
@@ -49,7 +49,7 @@ public class SolrExampleStreamingTest extends 
SolrExampleTests {
         .withQueueSize(2)
         .withThreadCount(5)
         .withResponseParser(new XMLResponseParser())
-        .withRequestWriter(new RequestWriter())
+        .withRequestWriter(new XMLRequestWriter())
         .build();
   }
 
diff --git 
a/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleXMLHttp2Test.java
 
b/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleXMLHttp2Test.java
index 1f0201716ef..765c2b33573 100644
--- 
a/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleXMLHttp2Test.java
+++ 
b/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleXMLHttp2Test.java
@@ -21,8 +21,8 @@ import java.util.concurrent.TimeUnit;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrExampleTests;
 import org.apache.solr.client.solrj.impl.Http2SolrClient;
+import org.apache.solr.client.solrj.impl.XMLRequestWriter;
 import org.apache.solr.client.solrj.impl.XMLResponseParser;
-import org.apache.solr.client.solrj.request.RequestWriter;
 import org.junit.BeforeClass;
 
 /**
@@ -42,7 +42,7 @@ public class SolrExampleXMLHttp2Test extends SolrExampleTests 
{
         new Http2SolrClient.Builder(getBaseUrl())
             .withDefaultCollection(DEFAULT_TEST_CORENAME)
             .withConnectionTimeout(DEFAULT_CONNECTION_TIMEOUT, 
TimeUnit.MILLISECONDS)
-            .withRequestWriter(new RequestWriter())
+            .withRequestWriter(new XMLRequestWriter())
             .withResponseParser(new XMLResponseParser())
             .build();
     return client;
diff --git 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/BasicHttpSolrClientTest.java
 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/BasicHttpSolrClientTest.java
index 98ea89a8d24..0e36df1bbd5 100644
--- 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/BasicHttpSolrClientTest.java
+++ 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/BasicHttpSolrClientTest.java
@@ -60,7 +60,6 @@ import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrRequest.METHOD;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.request.QueryRequest;
-import org.apache.solr.client.solrj.request.RequestWriter;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.common.SolrException;
@@ -521,7 +520,7 @@ public class BasicHttpSolrClientTest extends 
SolrJettyTestBase {
     // XML response and writer
     try (HttpSolrClient client =
         new HttpSolrClient.Builder(getBaseUrl())
-            .withRequestWriter(new RequestWriter())
+            .withRequestWriter(new XMLRequestWriter())
             .withResponseParser(new XMLResponseParser())
             .build()) {
       UpdateRequest req = new UpdateRequest();
diff --git 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/Http2SolrClientTest.java
 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/Http2SolrClientTest.java
index 07c96e85c81..24825bf33c3 100644
--- 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/Http2SolrClientTest.java
+++ 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/Http2SolrClientTest.java
@@ -30,7 +30,6 @@ import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.request.QueryRequest;
-import org.apache.solr.client.solrj.request.RequestWriter;
 import org.apache.solr.client.solrj.request.SolrPing;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.CommonParams;
@@ -294,7 +293,7 @@ public class Http2SolrClientTest extends 
HttpSolrClientTestBase {
     try (Http2SolrClient client =
         new Http2SolrClient.Builder(url)
             .withDefaultCollection(DEFAULT_CORE)
-            .withRequestWriter(new RequestWriter())
+            .withRequestWriter(new XMLRequestWriter())
             .withResponseParser(new XMLResponseParser())
             .build()) {
       testUpdate(client, WT.XML, "application/xml; charset=UTF-8", 
MUST_ENCODE);
diff --git 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpJdkSolrClientTest.java
 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpJdkSolrClientTest.java
index 4dec7a47068..3c32ccfe7e9 100644
--- 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpJdkSolrClientTest.java
+++ 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpJdkSolrClientTest.java
@@ -47,7 +47,6 @@ import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.request.QueryRequest;
-import org.apache.solr.client.solrj.request.RequestWriter;
 import org.apache.solr.client.solrj.response.SolrPingResponse;
 import org.apache.solr.client.solrj.util.Cancellable;
 import org.apache.solr.common.params.CommonParams;
@@ -422,7 +421,7 @@ public class HttpJdkSolrClientTest extends 
HttpSolrClientTestBase {
 
     try (HttpJdkSolrClient client =
         builder(url)
-            .withRequestWriter(new RequestWriter())
+            .withRequestWriter(new XMLRequestWriter())
             .withResponseParser(new XMLResponseParser())
             .useHttp1_1(http11)
             .build()) {
diff --git 
a/solr/solrj/src/test/org/apache/solr/client/solrj/util/ClientUtilsTest.java 
b/solr/solrj/src/test/org/apache/solr/client/solrj/util/ClientUtilsTest.java
index 407fffa2454..1a7bf353994 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/util/ClientUtilsTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/util/ClientUtilsTest.java
@@ -17,10 +17,10 @@
 package org.apache.solr.client.solrj.util;
 
 import org.apache.solr.SolrTestCase;
+import org.apache.solr.client.solrj.impl.XMLRequestWriter;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.HealthCheckRequest;
 import org.apache.solr.client.solrj.request.QueryRequest;
-import org.apache.solr.client.solrj.request.RequestWriter;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.client.solrj.request.V2Request;
 import org.junit.Test;
@@ -56,7 +56,7 @@ public class ClientUtilsTest extends SolrTestCase {
 
   @Test
   public void testUrlBuilding() throws Exception {
-    final var rw = new RequestWriter();
+    final var rw = new XMLRequestWriter();
     // Simple case, non-collection request
     {
       final var request = new HealthCheckRequest();


Reply via email to