You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by no...@apache.org on 2019/03/04 19:12:06 UTC

[lucene-solr] branch master updated: SOLR-13285: Updates with enum fields and javabin cause ClassCastException

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

noble pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git


The following commit(s) were added to refs/heads/master by this push:
     new 7771d7b  SOLR-13285: Updates with enum fields and javabin cause ClassCastException
7771d7b is described below

commit 7771d7bb844fdc7a3e6132a3d5b141c379a811e4
Author: Noble Paul <no...@apache.org>
AuthorDate: Tue Mar 5 06:11:50 2019 +1100

    SOLR-13285: Updates with enum fields and javabin cause ClassCastException
---
 solr/CHANGES.txt                                   |  2 ++
 .../org/apache/solr/common/util/JavaBinCodec.java  |  4 +++-
 .../apache/solr/common/util/TestJavaBinCodec.java  | 22 ++++++++++++++++++++++
 3 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index e67a9d1..29a41fd 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -92,6 +92,8 @@ Bug Fixes
 * SOLR-9882: 500 error code on breaching timeAllowed by core and distributed (fsv) search, 
   old and json facets (Mikhail Khludnev)
 
+* SOLR-13285: Updates with enum fields and javabin cause ClassCastException (noble)
+
 Improvements
 ----------------------
 * SOLR-12999: Index replication could delete segments before downloading segments from master if there is not enough
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java b/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java
index 4295d25..434e2f9 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java
@@ -53,6 +53,8 @@ import org.noggit.CharArr;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.apache.solr.common.util.ByteArrayUtf8CharSequence.convertCharSeq;
+
 /**
  * Defines a space-efficient serialization/deserialization format for transferring data.
  * <p>
@@ -818,7 +820,7 @@ public class JavaBinCodec implements PushWriter {
    */
   public EnumFieldValue readEnumFieldValue(DataInputInputStream dis) throws IOException {
     Integer intValue = (Integer) readVal(dis);
-    String stringValue = (String) readVal(dis);
+    String stringValue = (String) convertCharSeq (readVal(dis));
     return new EnumFieldValue(intValue, stringValue);
   }
   
diff --git a/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java b/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java
index 6717375..0e0ad88 100644
--- a/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java
+++ b/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java
@@ -65,6 +65,20 @@ public class TestJavaBinCodec extends SolrTestCaseJ4 {
     }
   }
 
+  public void testReadAsCharSeq() throws Exception {
+    List<Object> types = new ArrayList<>();
+    SolrInputDocument idoc = new SolrInputDocument();
+    idoc.addField("foo", "bar");
+    idoc.addField("foos", Arrays.asList("bar1","bar2"));
+    idoc.addField("enumf", new EnumFieldValue(1, "foo"));
+    types.add(idoc);
+    compareObjects(
+        (List) getObject(getBytes(types, true)),
+        (List) types
+    );
+
+  }
+
   public static SolrDocument generateSolrDocumentWithChildDocs() {
     SolrDocument parentDocument = new SolrDocument();
     parentDocument.addField("id", "1");
@@ -284,6 +298,14 @@ public class TestJavaBinCodec extends SolrTestCaseJ4 {
     }
   }
 
+  private static byte[] getBytes(Object o, boolean readAsCharSeq) throws IOException {
+    try (JavaBinCodec javabin = new JavaBinCodec(); ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
+      javabin.readStringAsCharSeq = readAsCharSeq;
+      javabin.marshal(o, baos);
+      return baos.toByteArray();
+    }
+  }
+
   private static Object getObject(byte[] bytes) throws IOException {
     try (JavaBinCodec jbc = new JavaBinCodec()) {
       return jbc.unmarshal(new ByteArrayInputStream(bytes));