You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by da...@apache.org on 2018/10/08 02:30:45 UTC

[23/30] lucene-solr:jira/http2: use MapWriter._get()

use MapWriter._get()


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/14e6eb2c
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/14e6eb2c
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/14e6eb2c

Branch: refs/heads/jira/http2
Commit: 14e6eb2c2488a5983c4449da32757d1f3bf17ce0
Parents: 5fb384c
Author: Noble Paul <no...@apache.org>
Authored: Fri Oct 5 08:32:00 2018 +1000
Committer: Noble Paul <no...@apache.org>
Committed: Fri Oct 5 08:32:00 2018 +1000

----------------------------------------------------------------------
 .../org/apache/solr/cloud/TestCryptoKeys.java   |  13 +-
 .../apache/solr/core/TestDynamicLoading.java    |  22 +--
 .../apache/solr/core/TestSolrConfigHandler.java | 175 +++++++++----------
 .../apache/solr/handler/TestBlobHandler.java    |  45 ++---
 .../apache/solr/handler/TestConfigReload.java   |  19 +-
 .../handler/TestSolrConfigHandlerCloud.java     |   3 +-
 .../TestSolrConfigHandlerConcurrent.java        |  44 +++--
 .../apache/solr/common/LinkedHashMapWriter.java |  60 +++++++
 .../java/org/apache/solr/common/MapWriter.java  |  13 +-
 .../org/apache/solr/common/MapWriterMap.java    |  14 ++
 .../java/org/apache/solr/common/util/Utils.java |  16 +-
 11 files changed, 250 insertions(+), 174 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/14e6eb2c/solr/core/src/test/org/apache/solr/cloud/TestCryptoKeys.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestCryptoKeys.java b/solr/core/src/test/org/apache/solr/cloud/TestCryptoKeys.java
index b2044b1..146ad82 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestCryptoKeys.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestCryptoKeys.java
@@ -23,6 +23,7 @@ import java.util.Arrays;
 import java.util.Map;
 
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
+import org.apache.solr.common.LinkedHashMapWriter;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.core.MemClassLoader;
@@ -125,10 +126,10 @@ public class TestCryptoKeys extends AbstractFullDistribZkTestBase {
         Arrays.asList("overlay", "runtimeLib", blobName, "version"),
         1l, 10);
 
-    Map map = TestSolrConfigHandler.getRespMap("/runtime", client);
-    String s = (String) Utils.getObjectByPath(map, false, Arrays.asList("error", "msg"));
-    assertNotNull(TestBlobHandler.getAsString(map), s);
-    assertTrue(TestBlobHandler.getAsString(map), s.contains("should be signed with one of the keys in ZK /keys/exe"));
+    LinkedHashMapWriter map = TestSolrConfigHandler.getRespMap("/runtime", client);
+    String s = map._getStr( "error/msg",null);
+    assertNotNull(map.toString(), s);
+    assertTrue(map.toString(), s.contains("should be signed with one of the keys in ZK /keys/exe"));
 
     String wrongSig = "QKqHtd37QN02iMW9UEgvAO9g9qOOuG5vEBNkbUsN7noc2hhXKic/ABFIOYJA9PKw61mNX2EmNFXOcO3WClYdSw==";
 
@@ -146,8 +147,8 @@ public class TestCryptoKeys extends AbstractFullDistribZkTestBase {
 
     map = TestSolrConfigHandler.getRespMap("/runtime", client);
     s = (String) Utils.getObjectByPath(map, false, Arrays.asList("error", "msg"));
-    assertNotNull(TestBlobHandler.getAsString(map), s);//No key matched signature for jar
-    assertTrue(TestBlobHandler.getAsString(map), s.contains("No key matched signature for jar"));
+    assertNotNull(map.toString(), s);//No key matched signature for jar
+    assertTrue(map.toString(), s.contains("No key matched signature for jar"));
 
     String rightSig = "YkTQgOtvcM/H/5EQdABGl3wjjrPhonAGlouIx59vppBy2cZEofX3qX1yZu5sPNRmJisNXEuhHN2149dxeUmk2Q==";
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/14e6eb2c/solr/core/src/test/org/apache/solr/core/TestDynamicLoading.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/core/TestDynamicLoading.java b/solr/core/src/test/org/apache/solr/core/TestDynamicLoading.java
index 5e6f2a0..90d9afd 100644
--- a/solr/core/src/test/org/apache/solr/core/TestDynamicLoading.java
+++ b/solr/core/src/test/org/apache/solr/core/TestDynamicLoading.java
@@ -16,14 +16,6 @@
  */
 package org.apache.solr.core;
 
-import org.apache.solr.client.solrj.impl.HttpSolrClient;
-import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
-import org.apache.solr.handler.TestBlobHandler;
-import org.apache.solr.util.RestTestHarness;
-import org.apache.solr.util.SimplePostTool;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
@@ -34,6 +26,14 @@ import java.util.Map;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
+import org.apache.solr.client.solrj.impl.HttpSolrClient;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
+import org.apache.solr.handler.TestBlobHandler;
+import org.apache.solr.util.RestTestHarness;
+import org.apache.solr.util.SimplePostTool;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
 import static java.util.Arrays.asList;
 import static org.apache.solr.handler.TestSolrConfigHandlerCloud.compareValues;
 
@@ -86,8 +86,8 @@ public class TestDynamicLoading extends AbstractFullDistribZkTestBase {
 
     Map map = TestSolrConfigHandler.getRespMap("/test1", client);
 
-    assertNotNull(TestBlobHandler.getAsString(map), map = (Map) map.get("error"));
-    assertTrue(TestBlobHandler.getAsString(map), map.get("msg").toString().contains(".system collection not available"));
+    assertNotNull(map.toString(), map = (Map) map.get("error"));
+    assertTrue(map.toString(), map.get("msg").toString().contains(".system collection not available"));
 
 
     TestBlobHandler.createSystemCollection(getHttpSolrClient(baseURL, randomClient.getHttpClient()));
@@ -97,7 +97,7 @@ public class TestDynamicLoading extends AbstractFullDistribZkTestBase {
 
 
     assertNotNull(map = (Map) map.get("error"));
-    assertTrue("full output " + TestBlobHandler.getAsString(map), map.get("msg").toString().contains("no such blob or version available: colltest/1" ));
+    assertTrue("full output " + map, map.get("msg").toString().contains("no such blob or version available: colltest/1" ));
     payload = " {\n" +
         "  'set' : {'watched': {" +
         "                    'x':'X val',\n" +

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/14e6eb2c/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java b/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java
index 88286e0..a8de25e 100644
--- a/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java
+++ b/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java
@@ -20,8 +20,6 @@ import java.io.File;
 import java.io.IOException;
 import java.io.StringReader;
 import java.lang.invoke.MethodHandles;
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -34,11 +32,12 @@ import com.google.common.collect.ImmutableList;
 import org.apache.commons.io.FileUtils;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
+import org.apache.solr.common.LinkedHashMapWriter;
+import org.apache.solr.common.MapWriter;
 import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.common.util.ValidatingJsonMap;
 import org.apache.solr.handler.DumpRequestHandler;
-import org.apache.solr.handler.TestBlobHandler;
 import org.apache.solr.handler.TestSolrConfigHandlerConcurrent;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
@@ -55,8 +54,8 @@ import org.restlet.ext.servlet.ServerServlet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static java.util.Arrays.asList;
 import static org.apache.solr.common.util.Utils.getObjectByPath;
-import static org.apache.solr.handler.TestBlobHandler.getAsString;
 
 public class TestSolrConfigHandler extends RestTestBase {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -106,49 +105,46 @@ public class TestSolrConfigHandler extends RestTestBase {
 
   public void testProperty() throws Exception {
     RestTestHarness harness = restTestHarness;
-    Map confMap = getRespMap("/config", harness);
-    assertNotNull(getObjectByPath(confMap, false, Arrays.asList("config", "requestHandler", "/admin/luke")));
-    assertNotNull(getObjectByPath(confMap, false, Arrays.asList("config", "requestHandler", "/admin/system")));
-    assertNotNull(getObjectByPath(confMap, false, Arrays.asList("config", "requestHandler", "/admin/mbeans")));
-    assertNotNull(getObjectByPath(confMap, false, Arrays.asList("config", "requestHandler", "/admin/plugins")));
-    assertNotNull(getObjectByPath(confMap, false, Arrays.asList("config", "requestHandler", "/admin/threads")));
-    assertNotNull(getObjectByPath(confMap, false, Arrays.asList("config", "requestHandler", "/admin/properties")));
-    assertNotNull(getObjectByPath(confMap, false, Arrays.asList("config", "requestHandler", "/admin/logging")));
-    assertNotNull(getObjectByPath(confMap, false, Arrays.asList("config", "requestHandler", "/admin/file")));
-    assertNotNull(getObjectByPath(confMap, false, Arrays.asList("config", "requestHandler", "/admin/ping")));
+    MapWriter confMap = getRespMap("/config", harness);
+    assertNotNull(confMap._get(asList("config", "requestHandler", "/admin/luke"), null));
+    assertNotNull(confMap._get(asList("config", "requestHandler", "/admin/system"), null));
+    assertNotNull(confMap._get(asList("config", "requestHandler", "/admin/mbeans"), null));
+    assertNotNull(confMap._get(asList("config", "requestHandler", "/admin/plugins"), null));
+    assertNotNull(confMap._get(asList("config", "requestHandler", "/admin/threads"), null));
+    assertNotNull(confMap._get(asList("config", "requestHandler", "/admin/properties"), null));
+    assertNotNull(confMap._get(asList("config", "requestHandler", "/admin/logging"), null));
+    assertNotNull(confMap._get(asList("config", "requestHandler", "/admin/file"), null));
+    assertNotNull(confMap._get(asList("config", "requestHandler", "/admin/ping"), null));
 
     String payload = "{\n" +
         " 'set-property' : { 'updateHandler.autoCommit.maxDocs':100, 'updateHandler.autoCommit.maxTime':10 , 'requestDispatcher.requestParsers.addHttpRequestToContext':true} \n" +
         " }";
     runConfigCommand(harness, "/config", payload);
 
-    Map m = (Map) getRespMap("/config/overlay", harness).get("overlay");
-    Map props = (Map) m.get("props");
-    assertNotNull(props);
-    assertEquals("100", String.valueOf(getObjectByPath(props, true, ImmutableList.of("updateHandler", "autoCommit", "maxDocs"))));
-    assertEquals("10", String.valueOf(getObjectByPath(props, true, ImmutableList.of("updateHandler", "autoCommit", "maxTime"))));
+    MapWriter m = getRespMap("/config/overlay", harness);
+    MapWriter props =null;
+    assertEquals("100", m._getStr("overlay/props/updateHandler/autoCommit/maxDocs", null));
+    assertEquals("10", m._getStr("overlay/props/updateHandler/autoCommit/maxTime",null));
 
     m =  getRespMap("/config/updateHandler", harness);
-    assertNotNull(getObjectByPath(m, true, ImmutableList.of("config","updateHandler", "commitWithin", "softCommit")));
-    assertNotNull(getObjectByPath(m, true, ImmutableList.of("config","updateHandler", "autoCommit", "maxDocs")));
-    assertNotNull(getObjectByPath(m, true, ImmutableList.of("config","updateHandler", "autoCommit", "maxTime")));
+    assertNotNull(m._get("config/updateHandler/commitWithin/softCommit",null));
+    assertNotNull(m._get("config/updateHandler/autoCommit/maxDocs",null));
+    assertNotNull(m._get("config/updateHandler/autoCommit/maxTime",null));
 
-    m = (Map) getRespMap("/config", harness).get("config");
+    m =  getRespMap("/config", harness);
     assertNotNull(m);
 
-    assertEquals("100", String.valueOf(getObjectByPath(m, true, ImmutableList.of("updateHandler", "autoCommit", "maxDocs"))));
-    assertEquals("10", String.valueOf(getObjectByPath(m, true, ImmutableList.of("updateHandler", "autoCommit", "maxTime"))));
-    assertEquals("true", String.valueOf(getObjectByPath(m, true, ImmutableList.of("requestDispatcher", "requestParsers", "addHttpRequestToContext"))));
+    assertEquals("100", m._getStr("config/updateHandler/autoCommit/maxDocs",null));
+    assertEquals("10", m._getStr("config/updateHandler/autoCommit/maxTime",null));
+    assertEquals("true", m._getStr("config/requestDispatcher/requestParsers/addHttpRequestToContext",null));
     payload = "{\n" +
         " 'unset-property' :  'updateHandler.autoCommit.maxDocs'} \n" +
         " }";
     runConfigCommand(harness, "/config", payload);
 
-    m = (Map) getRespMap("/config/overlay", harness).get("overlay");
-    props = (Map) m.get("props");
-    assertNotNull(props);
-    assertNull(getObjectByPath(props, true, ImmutableList.of("updateHandler", "autoCommit", "maxDocs")));
-    assertEquals("10", String.valueOf(getObjectByPath(props, true, ImmutableList.of("updateHandler", "autoCommit", "maxTime"))));
+    m =  getRespMap("/config/overlay", harness);
+    assertNull(m._get("overlay/props/updateHandler/autoCommit/maxDocs",null));
+    assertEquals("10", m._getStr("overlay/props/updateHandler/autoCommit/maxTime",null));
   }
 
   public void testUserProp() throws Exception {
@@ -159,17 +155,14 @@ public class TestSolrConfigHandler extends RestTestBase {
         " }";
     runConfigCommand(harness, "/config", payload);
 
-    Map m = (Map) getRespMap("/config/overlay", harness).get("overlay");
-    Map props = (Map) m.get("userProps");
-    assertNotNull(props);
-    assertEquals(props.get("my.custom.variable.a"), "MODIFIEDA");
-    assertEquals(props.get("my.custom.variable.b"), "MODIFIEDB");
+    MapWriter m =  getRespMap("/config/overlay", harness);//.get("overlay");
+    assertEquals(m._get("overlay/userProps/my.custom.variable.a",null), "MODIFIEDA");
+    assertEquals(m._get("overlay/userProps/my.custom.variable.b",null), "MODIFIEDB");
 
-    m = (Map) getRespMap("/dump?json.nl=map&initArgs=true", harness).get("initArgs");
+    m = getRespMap("/dump?json.nl=map&initArgs=true", harness);//.get("initArgs");
 
-    m = (Map) m.get(PluginInfo.DEFAULTS);
-    assertEquals("MODIFIEDA", m.get("a"));
-    assertEquals("MODIFIEDB", m.get("b"));
+    assertEquals("MODIFIEDA", m._get("initArgs/defaults/a",null));
+    assertEquals("MODIFIEDB", m._get("initArgs/defaults/b",null));
 
   }
 
@@ -210,7 +203,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         testServerBaseUrl,
         "/config/overlay",
         cloudSolrClient,
-        Arrays.asList("overlay", "requestHandler", "/x", "startup"),
+        asList("overlay", "requestHandler", "/x", "startup"),
         "lazy",
         10);
 
@@ -224,7 +217,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         testServerBaseUrl,
         "/config/overlay",
         cloudSolrClient,
-        Arrays.asList("overlay", "requestHandler", "/x", "a"),
+        asList("overlay", "requestHandler", "/x", "a"),
         "b",
         10);
 
@@ -240,7 +233,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         testServerBaseUrl,
         "/config/overlay",
         cloudSolrClient,
-        Arrays.asList("overlay", "requestHandler", "/dump", "defaults", "c" ),
+        asList("overlay", "requestHandler", "/dump", "defaults", "c"),
         "C",
         10);
 
@@ -248,7 +241,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         testServerBaseUrl,
         "/x?getdefaults=true&json.nl=map",
         cloudSolrClient,
-        Arrays.asList("getdefaults", "def_a"),
+        asList("getdefaults", "def_a"),
         "def A val",
         10);
 
@@ -256,8 +249,8 @@ public class TestSolrConfigHandler extends RestTestBase {
         testServerBaseUrl,
         "/x?param=multival&json.nl=map",
         cloudSolrClient,
-        Arrays.asList("params", "multival"),
-        Arrays.asList("a", "b", "c"),
+        asList("params", "multival"),
+        asList("a", "b", "c"),
         10);
 
     payload = "{\n" +
@@ -270,7 +263,7 @@ public class TestSolrConfigHandler extends RestTestBase {
     while (TimeUnit.SECONDS.convert(System.nanoTime() - startTime, TimeUnit.NANOSECONDS) < maxTimeoutSeconds) {
       String uri = "/config/overlay";
       Map m = testServerBaseUrl == null ? getRespMap(uri, writeHarness) : TestSolrConfigHandlerConcurrent.getAsMap(testServerBaseUrl + uri, cloudSolrClient);
-      if (null == Utils.getObjectByPath(m, true, Arrays.asList("overlay", "requestHandler", "/x", "a"))) {
+      if (null == Utils.getObjectByPath(m, true, asList("overlay", "requestHandler", "/x", "a"))) {
         success = true;
         break;
       }
@@ -287,7 +280,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         testServerBaseUrl,
         "/config",
         cloudSolrClient,
-        Arrays.asList("config", "queryConverter", "qc", "class"),
+        asList("config", "queryConverter", "qc", "class"),
         "org.apache.solr.spelling.SpellingQueryConverter",
         10);
     payload = "{\n" +
@@ -298,7 +291,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         testServerBaseUrl,
         "/config",
         cloudSolrClient,
-        Arrays.asList("config", "queryConverter", "qc", "class"),
+        asList("config", "queryConverter", "qc", "class"),
         "org.apache.solr.spelling.SuggestQueryConverter",
         10);
 
@@ -310,7 +303,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         testServerBaseUrl,
         "/config",
         cloudSolrClient,
-        Arrays.asList("config", "queryConverter", "qc"),
+        asList("config", "queryConverter", "qc"),
         null,
         10);
 
@@ -322,7 +315,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         testServerBaseUrl,
         "/config",
         cloudSolrClient,
-        Arrays.asList("config", "searchComponent", "tc", "class"),
+        asList("config", "searchComponent", "tc", "class"),
         "org.apache.solr.handler.component.TermsComponent",
         10);
     payload = "{\n" +
@@ -333,7 +326,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         testServerBaseUrl,
         "/config",
         cloudSolrClient,
-        Arrays.asList("config", "searchComponent", "tc", "class"),
+        asList("config", "searchComponent", "tc", "class"),
         "org.apache.solr.handler.component.TermVectorComponent",
         10);
 
@@ -345,7 +338,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         testServerBaseUrl,
         "/config",
         cloudSolrClient,
-        Arrays.asList("config", "searchComponent", "tc"),
+        asList("config", "searchComponent", "tc"),
         null,
         10);
     //<valueSourceParser name="countUsage" class="org.apache.solr.core.CountUsageValueSourceParser"/>
@@ -357,7 +350,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         testServerBaseUrl,
         "/config",
         cloudSolrClient,
-        Arrays.asList("config", "valueSourceParser", "cu", "class"),
+        asList("config", "valueSourceParser", "cu", "class"),
         "org.apache.solr.core.CountUsageValueSourceParser",
         10);
     //  <valueSourceParser name="nvl" class="org.apache.solr.search.function.NvlValueSourceParser">
@@ -371,7 +364,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         testServerBaseUrl,
         "/config",
         cloudSolrClient,
-        Arrays.asList("config", "valueSourceParser", "cu", "class"),
+        asList("config", "valueSourceParser", "cu", "class"),
         "org.apache.solr.search.function.NvlValueSourceParser",
         10);
 
@@ -383,7 +376,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         testServerBaseUrl,
         "/config",
         cloudSolrClient,
-        Arrays.asList("config", "valueSourceParser", "cu"),
+        asList("config", "valueSourceParser", "cu"),
         null,
         10);
 //    <transformer name="mytrans2" class="org.apache.solr.response.transform.ValueAugmenterFactory" >
@@ -397,7 +390,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         testServerBaseUrl,
         "/config",
         cloudSolrClient,
-        Arrays.asList("config", "transformer", "mytrans", "class"),
+        asList("config", "transformer", "mytrans", "class"),
         "org.apache.solr.response.transform.ValueAugmenterFactory",
         10);
 
@@ -409,7 +402,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         testServerBaseUrl,
         "/config",
         cloudSolrClient,
-        Arrays.asList("config", "transformer", "mytrans", "value"),
+        asList("config", "transformer", "mytrans", "value"),
         "6",
         10);
 
@@ -422,12 +415,12 @@ public class TestSolrConfigHandler extends RestTestBase {
         testServerBaseUrl,
         "/config",
         cloudSolrClient,
-        Arrays.asList("config", "transformer", "mytrans"),
+        asList("config", "transformer", "mytrans"),
         null,
         10);
 
-    List l = (List) Utils.getObjectByPath(map, false, Arrays.asList("config", "initParams"));
-    assertNotNull("no object /config/initParams : "+ TestBlobHandler.getAsString(map) , l);
+    List l = (List) Utils.getObjectByPath(map, false, asList("config", "initParams"));
+    assertNotNull("no object /config/initParams : "+ map , l);
     assertEquals( 2, l.size());
     assertEquals( "val", ((Map)l.get(1)).get("key") );
 
@@ -449,7 +442,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         testServerBaseUrl,
         "/config",
         cloudSolrClient,
-        Arrays.asList("config", "searchComponent","myspellcheck", "spellchecker", "class"),
+        asList("config", "searchComponent", "myspellcheck", "spellchecker", "class"),
         "solr.DirectSolrSpellChecker",
         10);
 
@@ -467,7 +460,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         testServerBaseUrl,
         "/config",
         cloudSolrClient,
-        Arrays.asList("config", "requestHandler","/dump100", "class"),
+        asList("config", "requestHandler", "/dump100", "class"),
         "org.apache.solr.handler.DumpRequestHandler",
         10);
 
@@ -490,7 +483,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         testServerBaseUrl,
         "/config/overlay",
         cloudSolrClient,
-        Arrays.asList("overlay", "requestHandler", "/dump101", "startup"),
+        asList("overlay", "requestHandler", "/dump101", "startup"),
         "lazy",
         10);
 
@@ -503,7 +496,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         testServerBaseUrl,
         "/config/overlay",
         cloudSolrClient,
-        Arrays.asList("overlay", "cache", "lfuCacheDecayFalse", "class"),
+        asList("overlay", "cache", "lfuCacheDecayFalse", "class"),
         "solr.search.LFUCache",
         10);
     assertEquals("solr.search.LRUCache",getObjectByPath(map, true, ImmutableList.of("overlay", "cache", "perSegFilter", "class")));
@@ -555,7 +548,7 @@ public class TestSolrConfigHandler extends RestTestBase {
     }
   }
 
-  public static Map testForResponseElement(RestTestHarness harness,
+  public static LinkedHashMapWriter testForResponseElement(RestTestHarness harness,
                                            String testServerBaseUrl,
                                            String uri,
                                            CloudSolrClient cloudSolrClient, List<String> jsonPath,
@@ -564,7 +557,7 @@ public class TestSolrConfigHandler extends RestTestBase {
 
     boolean success = false;
     long startTime = System.nanoTime();
-    Map m = null;
+    LinkedHashMapWriter m = null;
 
     while (TimeUnit.SECONDS.convert(System.nanoTime() - startTime, TimeUnit.NANOSECONDS) < maxTimeoutSeconds) {
       try {
@@ -592,7 +585,7 @@ public class TestSolrConfigHandler extends RestTestBase {
       Thread.sleep(100);
 
     }
-    assertTrue(StrUtils.formatString("Could not get expected value  ''{0}'' for path ''{1}'' full output: {2},  from server:  {3}", expected, StrUtils.join(jsonPath, '/'), getAsString(m), testServerBaseUrl), success);
+    assertTrue(StrUtils.formatString("Could not get expected value  ''{0}'' for path ''{1}'' full output: {2},  from server:  {3}", expected, StrUtils.join(jsonPath, '/'), m.toString(), testServerBaseUrl), success);
 
     return m;
   }
@@ -614,7 +607,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         null,
         "/config/params",
         null,
-        Arrays.asList("response", "params", "x", "a"),
+        asList("response", "params", "x", "a"),
         "A val",
         10);
 
@@ -623,7 +616,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         null,
         "/config/params",
         null,
-        Arrays.asList("response", "params", "x", "b"),
+        asList("response", "params", "x", "b"),
         "B val",
         10);
 
@@ -638,7 +631,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         null,
         "/config/overlay",
         null,
-        Arrays.asList("overlay", "requestHandler", "/d", "name"),
+        asList("overlay", "requestHandler", "/d", "name"),
         "/d",
         10);
 
@@ -646,14 +639,14 @@ public class TestSolrConfigHandler extends RestTestBase {
         null,
         "/d?useParams=x",
         null,
-        Arrays.asList("params", "a"),
+        asList("params", "a"),
         "A val",
         5);
     TestSolrConfigHandler.testForResponseElement(harness,
         null,
         "/d?useParams=x&a=fomrequest",
         null,
-        Arrays.asList("params", "a"),
+        asList("params", "a"),
         "fomrequest",
         5);
 
@@ -667,7 +660,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         null,
         "/config/overlay",
         null,
-        Arrays.asList("overlay", "requestHandler", "/dump1", "name"),
+        asList("overlay", "requestHandler", "/dump1", "name"),
         "/dump1",
         10);
 
@@ -676,7 +669,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         null,
         "/dump1",
         null,
-        Arrays.asList("params", "a"),
+        asList("params", "a"),
         "A val",
         5);
 
@@ -697,7 +690,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         null,
         "/config/params",
         null,
-        Arrays.asList("response", "params", "y", "c"),
+        asList("response", "params", "y", "c"),
         "CY val",
         10);
 
@@ -705,7 +698,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         null,
         "/dump1?useParams=y",
         null,
-        Arrays.asList("params", "c"),
+        asList("params", "c"),
         "CY val",
         5);
 
@@ -715,7 +708,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         null,
         "/dump1?useParams=y",
         null,
-        Arrays.asList("params", "b"),
+        asList("params", "b"),
         "BY val",
         5);
 
@@ -724,7 +717,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         null,
         "/dump1?useParams=y",
         null,
-        Arrays.asList("params", "a"),
+        asList("params", "a"),
         "A val",
         5);
 
@@ -733,8 +726,8 @@ public class TestSolrConfigHandler extends RestTestBase {
         null,
         "/dump1?useParams=y",
         null,
-        Arrays.asList("params", "d"),
-        Arrays.asList("val 1", "val 2"),
+        asList("params", "d"),
+        asList("val 1", "val 2"),
         5);
 
     payload = " {\n" +
@@ -754,7 +747,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         null,
         "/config/params",
         null,
-        Arrays.asList("response", "params", "y", "c"),
+        asList("response", "params", "y", "c"),
         "CY val modified",
         10);
 
@@ -763,7 +756,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         null,
         "/config/params",
         null,
-        Arrays.asList("response", "params", "y", "e"),
+        asList("response", "params", "y", "e"),
         "EY val",
         10);
 
@@ -782,7 +775,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         null,
         "/config/params",
         null,
-        Arrays.asList("response", "params", "y", "p"),
+        asList("response", "params", "y", "p"),
         "P val",
         10);
 
@@ -791,7 +784,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         null,
         "/config/params",
         null,
-        Arrays.asList("response", "params", "y", "c"),
+        asList("response", "params", "y", "c"),
         null,
         10);
     payload = " {'delete' : 'y'}";
@@ -801,7 +794,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         null,
         "/config/params",
         null,
-        Arrays.asList("response", "params", "y", "p"),
+        asList("response", "params", "y", "p"),
         null,
         10);
 
@@ -829,7 +822,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         null,
         "/config/overlay",
         null,
-        Arrays.asList("overlay", "requestHandler", "aRequestHandler", "class"),
+        asList("overlay", "requestHandler", "aRequestHandler", "class"),
         "org.apache.solr.handler.DumpRequestHandler",
         10);
     RESTfulServerProvider oldProvider = restTestHarness.getServerProvider();
@@ -840,7 +833,7 @@ public class TestSolrConfigHandler extends RestTestBase {
         null,
         "/something/part1_Value/fixed/part2_Value?urlTemplateValues=part1&urlTemplateValues=part2",
         null,
-        Arrays.asList("urlTemplateValues"),
+        asList("urlTemplateValues"),
         new ValidatingJsonMap.PredicateWithErrMsg() {
           @Override
           public String test(Object o) {
@@ -863,13 +856,13 @@ public class TestSolrConfigHandler extends RestTestBase {
   }
 
 
-  public static Map getRespMap(String path, RestTestHarness restHarness) throws Exception {
+  public static LinkedHashMapWriter getRespMap(String path, RestTestHarness restHarness) throws Exception {
     String response = restHarness.query(path);
     try {
-      return (Map) ObjectBuilder.getVal(new JSONParser(new StringReader(response)));
+      return (LinkedHashMapWriter) Utils.MAPWRITEROBJBUILDER.apply(Utils.getJSONParser(new StringReader(response))).getVal();
     } catch (JSONParser.ParseException e) {
       log.error(response);
-      return Collections.emptyMap();
+      return new LinkedHashMapWriter();
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/14e6eb2c/solr/core/src/test/org/apache/solr/handler/TestBlobHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/TestBlobHandler.java b/solr/core/src/test/org/apache/solr/handler/TestBlobHandler.java
index 737e16e..62fd8c0 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestBlobHandler.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestBlobHandler.java
@@ -21,7 +21,6 @@ import java.io.StringReader;
 import java.lang.invoke.MethodHandles;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -39,11 +38,11 @@ import org.apache.solr.client.solrj.impl.HttpSolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.response.CollectionAdminResponse;
 import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
+import org.apache.solr.common.MapWriter;
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.util.StrUtils;
-import org.apache.solr.common.util.Utils;
 import org.apache.solr.util.RTimer;
 import org.apache.solr.util.SimplePostTool;
 import org.junit.Test;
@@ -52,7 +51,7 @@ import org.noggit.ObjectBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.apache.solr.common.util.Utils.getObjectByPath;
+import static java.util.Arrays.asList;
 
 public class TestBlobHandler extends AbstractFullDistribZkTestBase {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -71,21 +70,21 @@ public class TestBlobHandler extends AbstractFullDistribZkTestBase {
 
       String baseUrl = replica.getStr(ZkStateReader.BASE_URL_PROP);
       String url = baseUrl + "/.system/config/requestHandler";
-      Map map = TestSolrConfigHandlerConcurrent.getAsMap(url, cloudClient);
+      MapWriter map = TestSolrConfigHandlerConcurrent.getAsMap(url, cloudClient);
       assertNotNull(map);
-      assertEquals("solr.BlobHandler", getObjectByPath(map, true, Arrays.asList(
+      assertEquals("solr.BlobHandler", map._get(asList(
           "config",
           "requestHandler",
           "/blob",
-          "class")));
+          "class"),null));
       map = TestSolrConfigHandlerConcurrent.getAsMap(baseUrl + "/.system/schema/fields/blob", cloudClient);
       assertNotNull(map);
-      assertEquals("blob", getObjectByPath(map, true, Arrays.asList(
+      assertEquals("blob", map._get(asList(
           "field",
-          "name")));
-      assertEquals("bytes", getObjectByPath(map, true, Arrays.asList(
+          "name"),null));
+      assertEquals("bytes", map._get( asList(
           "field",
-          "type")));
+          "type"),null));
 
       checkBlobPost(baseUrl, cloudClient);
     }
@@ -93,7 +92,7 @@ public class TestBlobHandler extends AbstractFullDistribZkTestBase {
 
   static void checkBlobPost(String baseUrl, CloudSolrClient cloudClient) throws Exception {
     String url;
-    Map map;
+    MapWriter map;
     byte[] bytarr = new byte[1024];
     for (int i = 0; i < bytarr.length; i++) bytarr[i] = (byte) (i % 127);
     byte[] bytarr2 = new byte[2048];
@@ -104,11 +103,7 @@ public class TestBlobHandler extends AbstractFullDistribZkTestBase {
 
     url = baseUrl + "/.system/blob/test/1";
     map = TestSolrConfigHandlerConcurrent.getAsMap(url, cloudClient);
-    List l = (List) Utils.getObjectByPath(map, false, Arrays.asList("response", "docs"));
-    assertNotNull("" + map, l);
-    assertTrue("" + map, l.size() > 0);
-    map = (Map) l.get(0);
-    assertEquals("" + bytarr.length, String.valueOf(map.get("size")));
+    assertEquals("" + bytarr.length, map._getStr("response/docs[0]/size",null));
 
     compareInputAndOutput(baseUrl + "/.system/blob/test?wt=filestream", bytarr2, cloudClient);
     compareInputAndOutput(baseUrl + "/.system/blob/test/1?wt=filestream", bytarr, cloudClient);
@@ -126,30 +121,24 @@ public class TestBlobHandler extends AbstractFullDistribZkTestBase {
     postData(cloudClient, baseUrl, blobName, bytes);
 
     String url;
-    Map map = null;
+    MapWriter map = null;
     List l;
     final RTimer timer = new RTimer();
     int i = 0;
     for (; i < 150; i++) {//15 secs
       url = baseUrl + "/.system/blob/" + blobName;
       map = TestSolrConfigHandlerConcurrent.getAsMap(url, cloudClient);
-      String numFound = String.valueOf(Utils.getObjectByPath(map, false, Arrays.asList("response", "numFound")));
+      String numFound = map._getStr(asList("response", "numFound"),null);
       if (!("" + count).equals(numFound)) {
         Thread.sleep(100);
         continue;
       }
-      l = (List) Utils.getObjectByPath(map, false, Arrays.asList("response", "docs"));
-      assertNotNull(l);
-      map = (Map) l.get(0);
-      assertEquals("" + bytes.limit(), String.valueOf(map.get("size")));
+
+      assertEquals("" + bytes.limit(), map._getStr("response/docs[0]/size",null));
       return;
     }
     fail(StrUtils.formatString("Could not successfully add blob after {0} attempts. Expecting {1} items. time elapsed {2}  output  for url is {3}",
-        i, count, timer.getTime(), getAsString(map)));
-  }
-
-  public static String getAsString(Map map) {
-    return new String(Utils.toJSON(map), StandardCharsets.UTF_8);
+        i, count, timer.getTime(), map.toString()));
   }
 
   static void compareInputAndOutput(String url, byte[] bytarr, CloudSolrClient cloudClient) throws IOException {
@@ -182,7 +171,7 @@ public class TestBlobHandler extends AbstractFullDistribZkTestBase {
       try {
         response = EntityUtils.toString(entity, StandardCharsets.UTF_8);
         Map m = (Map) ObjectBuilder.getVal(new JSONParser(new StringReader(response)));
-        assertFalse("Error in posting blob " + getAsString(m), m.containsKey("error"));
+        assertFalse("Error in posting blob " + m.toString(), m.containsKey("error"));
       } catch (JSONParser.ParseException e) {
         log.error("$ERROR$", response, e);
         fail();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/14e6eb2c/solr/core/src/test/org/apache/solr/handler/TestConfigReload.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/TestConfigReload.java b/solr/core/src/test/org/apache/solr/handler/TestConfigReload.java
index bac990c..f95d14e 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestConfigReload.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestConfigReload.java
@@ -16,22 +16,20 @@
  */
 package org.apache.solr.handler;
 
-import static java.util.Arrays.asList;
-import static org.apache.solr.common.util.Utils.getObjectByPath;
-
 import java.io.StringReader;
 import java.lang.invoke.MethodHandles;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.http.HttpEntity;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.util.EntityUtils;
 import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
+import org.apache.solr.common.LinkedHashMapWriter;
+import org.apache.solr.common.MapWriter;
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Slice;
@@ -39,16 +37,17 @@ import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkConfigManager;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.util.StrUtils;
+import org.apache.solr.common.util.Utils;
 import org.apache.solr.core.SolrConfig;
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.data.Stat;
 import org.junit.Test;
-import org.noggit.JSONParser;
-import org.noggit.ObjectBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static java.util.Arrays.asList;
+
 public class TestConfigReload extends AbstractFullDistribZkTestBase {
 
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -100,8 +99,8 @@ public class TestConfigReload extends AbstractFullDistribZkTestBase {
     while ( TimeUnit.SECONDS.convert(System.nanoTime() - startTime, TimeUnit.NANOSECONDS) < maxTimeoutSeconds){
       Thread.sleep(50);
       for (String url : urls) {
-        Map respMap = getAsMap(url+uri);
-        if(String.valueOf(newVersion).equals(String.valueOf( getObjectByPath(respMap, true, asList(name, "znodeVersion"))))){
+        MapWriter respMap = getAsMap(url + uri);
+        if (String.valueOf(newVersion).equals(respMap._getStr(asList(name, "znodeVersion"), null))) {
           succeeded.add(url);
         }
       }
@@ -111,13 +110,13 @@ public class TestConfigReload extends AbstractFullDistribZkTestBase {
     assertEquals(StrUtils.formatString("tried these servers {0} succeeded only in {1} ", urls, succeeded) , urls.size(), succeeded.size());
   }
 
-  private  Map getAsMap(String uri) throws Exception {
+  private LinkedHashMapWriter getAsMap(String uri) throws Exception {
     HttpGet get = new HttpGet(uri) ;
     HttpEntity entity = null;
     try {
       entity = cloudClient.getLbClient().getHttpClient().execute(get).getEntity();
       String response = EntityUtils.toString(entity, StandardCharsets.UTF_8);
-      return (Map) ObjectBuilder.getVal(new JSONParser(new StringReader(response)));
+      return (LinkedHashMapWriter) Utils.MAPWRITEROBJBUILDER.apply(Utils.getJSONParser(new StringReader(response))).getVal();
     } finally {
       EntityUtils.consumeQuietly(entity);
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/14e6eb2c/solr/core/src/test/org/apache/solr/handler/TestSolrConfigHandlerCloud.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/TestSolrConfigHandlerCloud.java b/solr/core/src/test/org/apache/solr/handler/TestSolrConfigHandlerCloud.java
index 944fa65..76957b8 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestSolrConfigHandlerCloud.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestSolrConfigHandlerCloud.java
@@ -39,7 +39,6 @@ import org.apache.solr.util.RestTestHarness;
 import org.junit.Test;
 
 import static java.util.Arrays.asList;
-import static org.apache.solr.handler.TestBlobHandler.getAsString;
 
 public class TestSolrConfigHandlerCloud extends AbstractFullDistribZkTestBase {
 
@@ -266,7 +265,7 @@ public class TestSolrConfigHandlerCloud extends AbstractFullDistribZkTestBase {
 
   public static void compareValues(Map result, Object expected, List<String> jsonPath) {
     Object val = Utils.getObjectByPath(result, false, jsonPath);
-    assertTrue(StrUtils.formatString("Could not get expected value  {0} for path {1} full output {2}", expected, jsonPath, getAsString(result)),
+    assertTrue(StrUtils.formatString("Could not get expected value  {0} for path {1} full output {2}", expected, jsonPath, result.toString()),
         expected instanceof Predicate ?
             ((Predicate)expected ).test(val) :
             Objects.equals(expected, val)

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/14e6eb2c/solr/core/src/test/org/apache/solr/handler/TestSolrConfigHandlerConcurrent.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/TestSolrConfigHandlerConcurrent.java b/solr/core/src/test/org/apache/solr/handler/TestSolrConfigHandlerConcurrent.java
index 8af461b..6aa4e1f 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestSolrConfigHandlerConcurrent.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestSolrConfigHandlerConcurrent.java
@@ -16,10 +16,6 @@
  */
 package org.apache.solr.handler;
 
-import static java.util.Arrays.asList;
-import static org.apache.solr.common.util.Utils.getObjectByPath;
-import static org.noggit.ObjectBuilder.getVal;
-
 import java.io.StringReader;
 import java.lang.invoke.MethodHandles;
 import java.nio.charset.StandardCharsets;
@@ -36,6 +32,8 @@ import org.apache.http.util.EntityUtils;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
+import org.apache.solr.common.LinkedHashMapWriter;
+import org.apache.solr.common.MapWriter;
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Slice;
@@ -45,10 +43,12 @@ import org.apache.solr.common.util.Utils;
 import org.apache.solr.util.RestTestHarness;
 import org.junit.Test;
 import org.noggit.JSONParser;
-import org.noggit.ObjectBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static java.util.Arrays.asList;
+import static org.noggit.ObjectBuilder.getVal;
+
 
 public class TestSolrConfigHandlerConcurrent extends AbstractFullDistribZkTestBase {
 
@@ -67,18 +67,15 @@ public class TestSolrConfigHandlerConcurrent extends AbstractFullDistribZkTestBa
       final Map.Entry e = (Map.Entry) o;
       if (e.getValue() instanceof Map) {
         Map value = (Map) e.getValue();
-        Thread t = new Thread() {
-          @Override
-          public void run() {
-            try {
-              List<String> errs = new ArrayList<>();
-              collectErrors.add(errs);
-              invokeBulkCall((String)e.getKey() , errs, value);
-            } catch (Exception e) {
-              e.printStackTrace();
-            }
+        Thread t = new Thread(() -> {
+          try {
+            List<String> errs = new ArrayList<>();
+            collectErrors.add(errs);
+            invokeBulkCall((String)e.getKey() , errs, value);
+          } catch (Exception e1) {
+            e1.printStackTrace();
           }
-        };
+        });
         threads.add(t);
         t.start();
       }
@@ -155,22 +152,21 @@ public class TestSolrConfigHandlerConcurrent extends AbstractFullDistribZkTestBa
       while ( TimeUnit.SECONDS.convert(System.nanoTime() - startTime, TimeUnit.NANOSECONDS) < maxTimeoutSeconds) {
         Thread.sleep(100);
         errmessages.clear();
-        Map respMap = getAsMap(url+"/config/overlay", cloudClient);
-        Map m = (Map) respMap.get("overlay");
-        if(m!= null) m = (Map) m.get("props");
+        MapWriter respMap = getAsMap(url + "/config/overlay", cloudClient);
+        MapWriter m = (MapWriter) respMap._get("overlay/props", null);
         if(m == null) {
           errmessages.add(StrUtils.formatString("overlay does not exist for cache: {0} , iteration: {1} response {2} ", cacheName, i, respMap.toString()));
           continue;
         }
 
 
-        Object o = getObjectByPath(m, true, asList("query", cacheName, "size"));
+        Object o = m._get(asList("query", cacheName, "size"), null);
         if(!val1.equals(o.toString())) errmessages.add(StrUtils.formatString("'size' property not set, expected = {0}, actual {1}", val1, o));
 
-        o = getObjectByPath(m, true, asList("query", cacheName, "initialSize"));
+        o = m._get(asList("query", cacheName, "initialSize"), null);
         if(!val2.equals(o.toString())) errmessages.add(StrUtils.formatString("'initialSize' property not set, expected = {0}, actual {1}", val2, o));
 
-        o = getObjectByPath(m, true, asList("query", cacheName, "autowarmCount"));
+        o = m._get(asList("query", cacheName, "autowarmCount"), null);
         if(!val3.equals(o.toString())) errmessages.add(StrUtils.formatString("'autowarmCount' property not set, expected = {0}, actual {1}", val3, o));
         if(errmessages.isEmpty()) break;
       }
@@ -182,14 +178,14 @@ public class TestSolrConfigHandlerConcurrent extends AbstractFullDistribZkTestBa
 
   }
 
-  public static Map getAsMap(String uri, CloudSolrClient cloudClient) throws Exception {
+  public static LinkedHashMapWriter getAsMap(String uri, CloudSolrClient cloudClient) throws Exception {
     HttpGet get = new HttpGet(uri) ;
     HttpEntity entity = null;
     try {
       entity = cloudClient.getLbClient().getHttpClient().execute(get).getEntity();
       String response = EntityUtils.toString(entity, StandardCharsets.UTF_8);
       try {
-        return (Map) ObjectBuilder.getVal(new JSONParser(new StringReader(response)));
+        return (LinkedHashMapWriter) Utils.MAPWRITEROBJBUILDER.apply(new JSONParser(new StringReader(response))).getVal();
       } catch (JSONParser.ParseException e) {
         log.error(response,e);
         throw e;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/14e6eb2c/solr/solrj/src/java/org/apache/solr/common/LinkedHashMapWriter.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/LinkedHashMapWriter.java b/solr/solrj/src/java/org/apache/solr/common/LinkedHashMapWriter.java
new file mode 100644
index 0000000..fe43400
--- /dev/null
+++ b/solr/solrj/src/java/org/apache/solr/common/LinkedHashMapWriter.java
@@ -0,0 +1,60 @@
+/*
+ * 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.common;
+
+import java.io.IOException;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+public class LinkedHashMapWriter<V> extends LinkedHashMap<String, V> implements MapWriter {
+
+  public LinkedHashMapWriter(int initialCapacity) {
+    super(initialCapacity);
+  }
+
+  public LinkedHashMapWriter() {
+    super();
+  }
+
+  public LinkedHashMapWriter(Map<? extends String, ? extends V> m) {
+    super(m);
+  }
+
+  @Override
+  public void writeMap(EntryWriter ew) throws IOException {
+    forEach((k, v) -> ew.putNoEx(k, v));
+  }
+
+  @Override
+  public Object _get(String path, Object def) {
+    if (path.indexOf('/') == -1) return getOrDefault(path, (V) def);
+    return MapWriter.super._get(path, def);
+  }
+
+  @Override
+  public Object _get(List<String> path, Object def) {
+    if (path.size() == 1) return getOrDefault(path.get(0), (V) def);
+    return MapWriter.super._get(path, def);
+  }
+
+  @Override
+  public String toString() {
+    return jsonStr();
+  }
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/14e6eb2c/solr/solrj/src/java/org/apache/solr/common/MapWriter.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/MapWriter.java b/solr/solrj/src/java/org/apache/solr/common/MapWriter.java
index 3256b6a..9edd630 100644
--- a/solr/solrj/src/java/org/apache/solr/common/MapWriter.java
+++ b/solr/solrj/src/java/org/apache/solr/common/MapWriter.java
@@ -44,7 +44,7 @@ public interface MapWriter extends MapSerializable {
     try {
       writeMap(new EntryWriter() {
         @Override
-        public EntryWriter put(String k, Object v) throws IOException {
+        public EntryWriter put(String k, Object v) {
           if (v instanceof MapWriter) v = ((MapWriter) v).toMap(new LinkedHashMap<>());
           if (v instanceof IteratorWriter) v = ((IteratorWriter) v).toList(new ArrayList<>());
           if (v instanceof Iterable) {
@@ -92,6 +92,11 @@ public interface MapWriter extends MapSerializable {
     return v == null ? def : v;
   }
 
+  default String _getStr(String path, String def) {
+    Object v = Utils.getObjectByPath(this, false, path);
+    return v == null ? def : String.valueOf(v);
+  }
+
   default void _forEachEntry(String path, BiConsumer fun) {
     Utils.forEachMapEntry(this, path, fun);
   }
@@ -115,6 +120,12 @@ public interface MapWriter extends MapSerializable {
     Object v = Utils.getObjectByPath(this, false, path);
     return v == null ? def : v;
   }
+
+  default String _getStr(List<String> path, String def) {
+    Object v = Utils.getObjectByPath(this, false, path);
+    return v == null ? def : String.valueOf(v);
+  }
+
   /**
    * An interface to push one entry at a time to the output.
    * The order of the keys is not defined, but we assume they are distinct -- don't call {@code put} more than once

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/14e6eb2c/solr/solrj/src/java/org/apache/solr/common/MapWriterMap.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/MapWriterMap.java b/solr/solrj/src/java/org/apache/solr/common/MapWriterMap.java
index f6580b2..e0dd0ac 100644
--- a/solr/solrj/src/java/org/apache/solr/common/MapWriterMap.java
+++ b/solr/solrj/src/java/org/apache/solr/common/MapWriterMap.java
@@ -18,6 +18,7 @@
 package org.apache.solr.common;
 
 import java.io.IOException;
+import java.util.List;
 import java.util.Map;
 
 public class MapWriterMap implements MapWriter {
@@ -33,6 +34,19 @@ public class MapWriterMap implements MapWriter {
   }
 
   @Override
+  public Object _get(String path, Object def) {
+    if (path.indexOf('/') == -1) return delegate.getOrDefault(path, def);
+    return MapWriter.super._get(path, def);
+  }
+
+  @Override
+  public Object _get(List<String> path, Object def) {
+    if (path.size() == 1) return delegate.getOrDefault(path.get(0), def);
+    return MapWriter.super._get(path, def);
+  }
+
+
+  @Override
   public Map toMap(Map<String, Object> map) {
     return delegate;
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/14e6eb2c/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/Utils.java b/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
index ac3f120..095ef57 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
@@ -55,6 +55,7 @@ import org.apache.solr.client.solrj.cloud.DistribStateManager;
 import org.apache.solr.client.solrj.cloud.autoscaling.VersionedData;
 import org.apache.solr.client.solrj.impl.BinaryRequestWriter;
 import org.apache.solr.common.IteratorWriter;
+import org.apache.solr.common.LinkedHashMapWriter;
 import org.apache.solr.common.MapWriter;
 import org.apache.solr.common.MapWriterMap;
 import org.apache.solr.common.SolrException;
@@ -241,7 +242,7 @@ public class Utils {
         JSONParser.ALLOW_MISSING_COLON_COMMA_BEFORE_OBJECT |
         JSONParser.OPTIONAL_OUTER_BRACES);
     try {
-      return ObjectBuilder.getVal(parser);
+      return STANDARDOBJBUILDER.apply(parser).getVal(parser);
     } catch (IOException e) {
       throw new RuntimeException(e); // should never happen w/o using real IO
     }
@@ -279,6 +280,18 @@ public class Utils {
       throw new RuntimeException(e);
     }
   };
+  public static final Function<JSONParser, ObjectBuilder> MAPWRITEROBJBUILDER = jsonParser -> {
+    try {
+      return new ObjectBuilder(jsonParser){
+        @Override
+        public Object newObject() {
+          return new LinkedHashMapWriter();
+        }
+      };
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+  };
 
   public static Object fromJSON(InputStream is, Function<JSONParser, ObjectBuilder> objBuilderProvider) {
     try {
@@ -675,4 +688,5 @@ public class Utils {
     }
     return def;
   }
+
 }