You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by yo...@apache.org on 2011/12/07 05:20:49 UTC

svn commit: r1211292 - in /lucene/dev/branches/solrcloud/solr: core/ core/src/java/org/apache/solr/cloud/ core/src/test/org/apache/solr/cloud/ lib/ solrj/src/java/org/apache/solr/common/cloud/

Author: yonik
Date: Wed Dec  7 04:20:49 2011
New Revision: 1211292

URL: http://svn.apache.org/viewvc?rev=1211292&view=rev
Log:
use interface to support json serialization

Added:
    lucene/dev/branches/solrcloud/solr/lib/apache-solr-noggit-r1211150.jar   (with props)
Removed:
    lucene/dev/branches/solrcloud/solr/lib/apache-solr-noggit-r1209632.jar
Modified:
    lucene/dev/branches/solrcloud/solr/core/build.xml
    lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/NodeStateWatcher.java
    lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/Overseer.java
    lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/ZkController.java
    lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/AbstractZkTestCase.java
    lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/CloudStateTest.java
    lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/CloudStateUpdateTest.java
    lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
    lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java
    lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/ZkNodePropsTest.java
    lucene/dev/branches/solrcloud/solr/lib/apache-solr-noggit-pom.xml.template
    lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CloudState.java
    lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CloudStateUtility.java
    lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CoreAssignment.java
    lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CoreState.java
    lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/Slice.java
    lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java
    lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java

Modified: lucene/dev/branches/solrcloud/solr/core/build.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/core/build.xml?rev=1211292&r1=1211291&r2=1211292&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/core/build.xml (original)
+++ lucene/dev/branches/solrcloud/solr/core/build.xml Wed Dec  7 04:20:49 2011
@@ -27,6 +27,6 @@
                                  jar.file="${common-solr.dir}/lib/commons-csv-1.0-SNAPSHOT-r966014.jar" />
 
     <m2-deploy-with-pom-template pom.xml="${common-solr.dir}/lib/apache-solr-noggit-pom.xml.template"
-                                 jar.file="${common-solr.dir}/lib/apache-solr-noggit-r1209632.jar" />
+                                 jar.file="${common-solr.dir}/lib/apache-solr-noggit-r12111502.jar" />
   </target>
 </project>

Modified: lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/NodeStateWatcher.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/NodeStateWatcher.java?rev=1211292&r1=1211291&r2=1211292&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/NodeStateWatcher.java (original)
+++ lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/NodeStateWatcher.java Wed Dec  7 04:20:49 2011
@@ -89,7 +89,7 @@ public class NodeStateWatcher implements
   void processStateChange(byte[] data) {
     if (data != null) {
       try {
-        CoreState[] states = CoreState.fromBytes(data);
+        CoreState[] states = CoreState.load(data);
         List<CoreState> stateList = Arrays.asList(states);
         
         // get new cores:

Modified: lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/Overseer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/Overseer.java?rev=1211292&r1=1211291&r2=1211292&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/Overseer.java (original)
+++ lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/Overseer.java Wed Dec  7 04:20:49 2011
@@ -415,7 +415,7 @@ public class Overseer implements NodeSta
     }
     
     //serialize
-    byte[] content = CoreAssignment.tobytes(assignments.toArray(new CoreAssignment[assignments.size()]));
+    byte[] content = ZkStateReader.toJSON(assignments);
     try {
       zkClient.setData("/node_assignments/" + node, content);
     } catch (InterruptedException e) {

Modified: lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/ZkController.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/ZkController.java?rev=1211292&r1=1211291&r2=1211292&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/ZkController.java (original)
+++ lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/cloud/ZkController.java Wed Dec  7 04:20:49 2011
@@ -491,7 +491,7 @@ public final class ZkController {
 
     ZkNodeProps zkProps = new ZkNodeProps(props);
 
-    ElectionContext context = new ShardLeaderElectionContext(shardId, collection, shardZkNodeName, zkProps.store());
+    ElectionContext context = new ShardLeaderElectionContext(shardId, collection, shardZkNodeName, ZkStateReader.toJSON(zkProps));
     
     leaderElector.setup(context);
     // leader election
@@ -772,7 +772,7 @@ public final class ZkController {
           
           collectionProps.put("num_shards", Integer.toString(numShards));
           ZkNodeProps zkProps = new ZkNodeProps(collectionProps);
-          zkClient.makePath(collectionPath, zkProps.store(), CreateMode.PERSISTENT, null, true);
+          zkClient.makePath(collectionPath, ZkStateReader.toJSON(zkProps), CreateMode.PERSISTENT, null, true);
           try {
             // shards_lock node
             if (!zkClient.exists(ZkStateReader.COLLECTIONS_ZKNODE + "/" + collection + "/shards_lock")) {
@@ -829,12 +829,8 @@ public final class ZkController {
       log.info("publishing node state:" + coreStates.values());
       zkClient.setData(
           nodePath,
-          CoreState.tobytes(coreStates.values().toArray(
-              new CoreState[coreStates.size()])));
-    } catch (IOException e) {
-      throw new ZooKeeperException(
-          SolrException.ErrorCode.SERVER_ERROR,
-          "could not publish node state", e);
+          ZkStateReader.toJSON(coreStates.values()));
+
     } catch (KeeperException e) {
       throw new ZooKeeperException(
           SolrException.ErrorCode.SERVER_ERROR,
@@ -879,7 +875,7 @@ public final class ZkController {
     }
 
     HashMap<String, CoreAssignment> newAssignments = new HashMap<String, CoreAssignment>();
-    CoreAssignment[] assignments2 = CoreAssignment.fromBytes(assignments);
+    CoreAssignment[] assignments2 = CoreAssignment.load(assignments);
     
     for (CoreAssignment assignment : assignments2) {
       newAssignments.put(assignment.getCoreName(), assignment);

Modified: lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/AbstractZkTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/AbstractZkTestCase.java?rev=1211292&r1=1211291&r2=1211292&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/AbstractZkTestCase.java (original)
+++ lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/AbstractZkTestCase.java Wed Dec  7 04:20:49 2011
@@ -25,6 +25,7 @@ import java.util.Map;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkNodeProps;
+import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.core.SolrConfig;
 import org.apache.zookeeper.CreateMode;
 import org.junit.AfterClass;
@@ -78,10 +79,10 @@ public abstract class AbstractZkTestCase
     Map<String,String> props = new HashMap<String,String>();
     props.put("configName", "conf1");
     ZkNodeProps zkProps = new ZkNodeProps(props);
-    zkClient.makePath("/collections/collection1", zkProps.store(), CreateMode.PERSISTENT);
+    zkClient.makePath("/collections/collection1", ZkStateReader.toJSON(zkProps), CreateMode.PERSISTENT);
     zkClient.makePath("/collections/collection1/shards", CreateMode.PERSISTENT);
 
-    zkClient.makePath("/collections/control_collection", zkProps.store(), CreateMode.PERSISTENT);
+    zkClient.makePath("/collections/control_collection", ZkStateReader.toJSON(zkProps), CreateMode.PERSISTENT);
     zkClient.makePath("/collections/control_collection/shards", CreateMode.PERSISTENT);
 
     putConfig(zkClient, config);

Modified: lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/CloudStateTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/CloudStateTest.java?rev=1211292&r1=1211291&r2=1211292&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/CloudStateTest.java (original)
+++ lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/CloudStateTest.java Wed Dec  7 04:20:49 2011
@@ -26,6 +26,7 @@ import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.cloud.CloudState;
 import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.cloud.ZkNodeProps;
+import org.apache.solr.common.cloud.ZkStateReader;
 import org.junit.Test;
 
 public class CloudStateTest extends SolrTestCaseJ4 {
@@ -52,7 +53,7 @@ public class CloudStateTest extends Solr
     collectionStates.put("collection2", slices);
     
     CloudState cloudState = new CloudState(liveNodes, collectionStates);
-    byte[] bytes = CloudState.store(cloudState);
+    byte[] bytes = ZkStateReader.toJSON(cloudState);
     
     CloudState loadedCloudState = CloudState.load(bytes, liveNodes);
     

Modified: lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/CloudStateUpdateTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/CloudStateUpdateTest.java?rev=1211292&r1=1211291&r2=1211292&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/CloudStateUpdateTest.java (original)
+++ lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/CloudStateUpdateTest.java Wed Dec  7 04:20:49 2011
@@ -23,10 +23,7 @@ import java.util.Map;
 import java.util.Set;
 
 import org.apache.solr.SolrTestCaseJ4;
-import org.apache.solr.common.cloud.CloudState;
-import org.apache.solr.common.cloud.Slice;
-import org.apache.solr.common.cloud.SolrZkClient;
-import org.apache.solr.common.cloud.ZkNodeProps;
+import org.apache.solr.common.cloud.*;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.CoreContainer.Initializer;
 import org.apache.solr.core.CoreDescriptor;
@@ -143,7 +140,7 @@ public class CloudStateUpdateTest extend
     ZkNodeProps zkProps2 = new ZkNodeProps(props2);
     
     SolrZkClient zkClient = new SolrZkClient(zkServer.getZkAddress(), AbstractZkTestCase.TIMEOUT);
-    zkClient.makePath("/collections/testcore", zkProps2.store(), CreateMode.PERSISTENT);
+    zkClient.makePath("/collections/testcore", ZkStateReader.toJSON(zkProps2), CreateMode.PERSISTENT);
     zkClient.makePath("/collections/testcore/shards", CreateMode.PERSISTENT);
     zkClient.close();
     

Modified: lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java?rev=1211292&r1=1211291&r2=1211292&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java (original)
+++ lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java Wed Dec  7 04:20:49 2011
@@ -8,6 +8,7 @@ import java.util.Map;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkNodeProps;
+import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.core.CoreDescriptor;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -63,10 +64,10 @@ public class OverseerTest extends SolrTe
    
       props.put("num_shards", "3");
       ZkNodeProps zkProps = new ZkNodeProps(props);
-      zkClient.makePath("/collections/collection1", zkProps.store());
+      zkClient.makePath("/collections/collection1", ZkStateReader.toJSON(zkProps));
       props.put("num_shards", "1");
       zkProps = new ZkNodeProps(props);
-      zkClient.makePath("/collections/collection2", zkProps.store());
+      zkClient.makePath("/collections/collection2", ZkStateReader.toJSON(zkProps));
       ZkNodeProps z = new ZkNodeProps(props);
       
       CoreDescriptor desc = new CoreDescriptor(null, "core1", "");

Modified: lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java?rev=1211292&r1=1211291&r2=1211292&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java (original)
+++ lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java Wed Dec  7 04:20:49 2011
@@ -65,7 +65,7 @@ public class ZkControllerTest extends So
       Map<String,String> props = new HashMap<String,String>();
       props.put("configName", actualConfigName);
       ZkNodeProps zkProps = new ZkNodeProps(props);
-      zkClient.makePath(ZkStateReader.COLLECTIONS_ZKNODE + "/" + COLLECTION_NAME , zkProps.store(), CreateMode.PERSISTENT);
+      zkClient.makePath(ZkStateReader.COLLECTIONS_ZKNODE + "/" + COLLECTION_NAME , ZkStateReader.toJSON(zkProps), CreateMode.PERSISTENT);
 
       if (DEBUG) {
         zkClient.printLayoutToStdOut();

Modified: lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/ZkNodePropsTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/ZkNodePropsTest.java?rev=1211292&r1=1211291&r2=1211292&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/ZkNodePropsTest.java (original)
+++ lucene/dev/branches/solrcloud/solr/core/src/test/org/apache/solr/cloud/ZkNodePropsTest.java Wed Dec  7 04:20:49 2011
@@ -23,6 +23,7 @@ import java.util.Map;
 
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.cloud.ZkNodeProps;
+import org.apache.solr.common.cloud.ZkStateReader;
 import org.junit.Test;
 
 public class ZkNodePropsTest extends SolrTestCaseJ4 {
@@ -38,7 +39,7 @@ public class ZkNodePropsTest extends Sol
     props.put("prop6", "value6");
     
     ZkNodeProps zkProps = new ZkNodeProps(props);
-    byte[] bytes = zkProps.store();
+    byte[] bytes = ZkStateReader.toJSON(zkProps);
     
     ZkNodeProps props2 = ZkNodeProps.load(bytes);
     assertEquals("value1", props2.get("prop1"));

Modified: lucene/dev/branches/solrcloud/solr/lib/apache-solr-noggit-pom.xml.template
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/lib/apache-solr-noggit-pom.xml.template?rev=1211292&r1=1211291&r2=1211292&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/lib/apache-solr-noggit-pom.xml.template (original)
+++ lucene/dev/branches/solrcloud/solr/lib/apache-solr-noggit-pom.xml.template Wed Dec  7 04:20:49 2011
@@ -31,6 +31,6 @@
   <artifactId>solr-noggit</artifactId>
   <name>Solr Specific Noggit</name>
   <version>@version@</version>
-  <description>Solr Specific Noggit r1209632</description>
+  <description>Solr Specific Noggit r12111502</description>
   <packaging>jar</packaging>
 </project>

Added: lucene/dev/branches/solrcloud/solr/lib/apache-solr-noggit-r1211150.jar
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/lib/apache-solr-noggit-r1211150.jar?rev=1211292&view=auto
==============================================================================
Binary file - no diff available.

Modified: lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CloudState.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CloudState.java?rev=1211292&r1=1211291&r2=1211292&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CloudState.java (original)
+++ lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CloudState.java Wed Dec  7 04:20:49 2011
@@ -18,21 +18,15 @@ package org.apache.solr.common.cloud;
  */
 
 import java.io.IOException;
-import java.io.InputStreamReader;
 import java.util.*;
 
-import org.apache.lucene.util.BytesRef;
-import org.apache.lucene.util.CharsRef;
-import org.apache.lucene.util.UnicodeUtil;
 import org.apache.noggit.*;
-import org.apache.solr.common.cloud.CoreAssignment;
-import org.apache.solr.common.cloud.CoreState;
 import org.apache.zookeeper.KeeperException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 // quasi immutable :(
-public class CloudState {
+public class CloudState implements JSONWriter.Writable {
 	protected static Logger log = LoggerFactory.getLogger(CloudState.class);
 	private final Map<String, Map<String,Slice>> collectionStates;  // Map<collectionName, Map<sliceName,Slice>>
 	private final Set<String> liveNodes;
@@ -121,7 +115,7 @@ public class CloudState {
       return new CloudState(liveNodes, Collections.<String, Map<String,Slice>>emptyMap());
     }
     
-    LinkedHashMap<String, Object> stateMap = (LinkedHashMap<String, Object>) fromJSON(bytes);
+    LinkedHashMap<String, Object> stateMap = (LinkedHashMap<String, Object>) ZkStateReader.fromJSON(bytes);
     HashMap<String,Map<String, Slice>> state = new HashMap<String,Map<String,Slice>>();
 
     for(String collectionName: stateMap.keySet()){
@@ -141,112 +135,10 @@ public class CloudState {
     return new CloudState(liveNodes, state);
 	}
 
-  private static class CloudJSONWriter extends JSONWriter {
-    public CloudJSONWriter(CharArr out, int indent) {
-      super(out, indent);
-    }
-    @Override
-    public void handleUnknownClass(Object o) {
-      if (o instanceof Slice) {
-        setIndentSize(2); // this is big enough, we currently always want indenting
-        write( ((Slice)o).getShards() );
-      } else if (o instanceof ZkNodeProps) {
-        write( ((ZkNodeProps) o).getProperties() );
-      } else if (o instanceof CloudState) {
-        setIndentSize(2); // this is big enough, we currently always want indenting
-        write( ((CloudState)o).getCollectionStates() );
-      } else if (o instanceof CoreAssignment) {
-        write(((CoreAssignment) o).getProperties());
-      } else if (o instanceof CoreState) {
-        write(((CoreState) o).getProperties());
-      } else {
-        super.handleUnknownClass(o);
-      }
-    }
-  }
-
-  public static byte[] store(CloudState state)
-      throws IOException {
-    return toJSON(state);
+  @Override
+  public void write(JSONWriter jsonWriter) {
+    jsonWriter.write(collectionStates);
   }
 
-  // convenience methods... should these go somewhere else?
 
-  public static byte[] toJSON(Object o) {
-    CharArr out = new CharArr();
-    new CloudJSONWriter(out, 2).write(o); // indentation by default
-    return toUTF8(out);
-  }
-
-  public static byte[] toUTF8(CharArr out) {
-    BytesRef br = new BytesRef(out);
-    return Arrays.copyOf(br.bytes, br.length);
-  }
-
-  public static Object fromJSON(byte[] utf8) {
-    // convert directly from bytes to chars
-    // and parse directly from that instead of going through
-    // intermediate strings or readers
-    CharsRef chars = new CharsRef();
-    UnicodeUtil.UTF8toUTF16(utf8, 0, utf8.length, chars);   // TODO: this method currently oversizes the array
-    JSONParser parser = new JSONParser(chars.chars, chars.offset, chars.length);
-    try {
-      return ObjectBuilder.getVal(parser);
-    } catch (IOException e) {
-      throw new RuntimeException(e); // should never happen w/o using real IO
-    }
-  }
-
-  public static byte[] store0(CloudState state)
-      throws IOException {
-    CharArr out = new CharArr();
-    out.append(JSONUtil.OBJECT_START);
-    int collCount = state.getCollections().size();
-
-    for (String collectionName : state.getCollections()) {
-      JSONUtil.writeString(collectionName, 0, collectionName.length(), out);
-      out.append(JSONUtil.NAME_SEPARATOR);
-      Map<String, Slice> slices = state.getSlices(collectionName);
-      out.append(JSONUtil.OBJECT_START);
-      int sliceCount = slices.keySet().size();
-      for(String sliceName: slices.keySet()) {
-        JSONUtil.writeString(sliceName, 0, sliceName.length(), out);
-        out.append(JSONUtil.NAME_SEPARATOR);
-        Slice slice = slices.get(sliceName);
-        Map<String, ZkNodeProps> shards = slice.getShards();
-        out.append(JSONUtil.OBJECT_START);
-        int shardCount = shards.keySet().size();
-        for(String shardName: shards.keySet()) {
-          ZkNodeProps props = shards.get(shardName);
-          JSONUtil.writeString(shardName, 0, shardName.length(), out);
-          out.append(JSONUtil.NAME_SEPARATOR);
-          out.append(JSONUtil.OBJECT_START);
-          int propCount = props.keySet().size();
-          for(String key: props.keySet()) {
-            JSONUtil.writeString(key, 0, key.length(), out);
-            out.append(JSONUtil.NAME_SEPARATOR);
-            JSONUtil.writeString(props.get(key), 0, props.get(key).length(), out);
-            if (--propCount != 0) {
-              out.append(JSONUtil.VALUE_SEPARATOR);
-            }
-          }
-          out.append(JSONUtil.OBJECT_END);
-          if (--shardCount != 0) {
-            out.append(JSONUtil.VALUE_SEPARATOR);
-          }
-        }
-        out.append(JSONUtil.OBJECT_END);
-        if (--sliceCount != 0) {
-          out.append(JSONUtil.VALUE_SEPARATOR);
-        }
-
-      }
-      out.append(JSONUtil.OBJECT_END);
-      if (--collCount != 0) {
-        out.append(JSONUtil.VALUE_SEPARATOR);
-      }
-    }
-    out.append(JSONUtil.OBJECT_END);
-    return new String(out.getArray()).getBytes("utf-8");
-  }
 }

Modified: lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CloudStateUtility.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CloudStateUtility.java?rev=1211292&r1=1211291&r2=1211292&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CloudStateUtility.java (original)
+++ lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CloudStateUtility.java Wed Dec  7 04:20:49 2011
@@ -19,7 +19,7 @@ public class CloudStateUtility {
   
   public static void create(CloudState state, SolrZkClient zkClient) throws UnsupportedEncodingException, KeeperException, InterruptedException, IOException {
     zkClient.create(ZkStateReader.CLUSTER_STATE,
-        CloudState.store(state), Ids.OPEN_ACL_UNSAFE,
+        ZkStateReader.toJSON(state), Ids.OPEN_ACL_UNSAFE,
         CreateMode.PERSISTENT);
   }
 
@@ -36,7 +36,7 @@ public class CloudStateUtility {
   
   public static void update(SolrZkClient zkClient, CloudState state, Stat stat) throws KeeperException, InterruptedException, IOException {
     zkClient.setData(ZkStateReader.CLUSTER_STATE,
-        CloudState.store(state));
+        ZkStateReader.toJSON(state));
   }
 
 }
\ No newline at end of file

Modified: lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CoreAssignment.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CoreAssignment.java?rev=1211292&r1=1211291&r2=1211292&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CoreAssignment.java (original)
+++ lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CoreAssignment.java Wed Dec  7 04:20:49 2011
@@ -17,10 +17,12 @@ package org.apache.solr.common.cloud;
  * the License.
  */
 
+import org.apache.noggit.JSONWriter;
+
 import java.io.IOException;
 import java.util.*;
 
-public class CoreAssignment {
+public class CoreAssignment implements JSONWriter.Writable {
 
   private static String COLLECTION="_collection";
   private static String CORE="_core";
@@ -51,12 +53,13 @@ public class CoreAssignment {
     return properties.get(COLLECTION);
   }
 
-  public static byte[] tobytes(CoreAssignment... assignments) throws IOException {
-    return CloudState.toJSON(assignments);
+  @Override
+  public void write(JSONWriter jsonWriter) {
+    jsonWriter.write(properties);
   }
   
-  public static CoreAssignment[] fromBytes(byte[] bytes) throws IOException {
-    List<Map<String, String>> stateMaps = (List<Map<String, String>>) CloudState.fromJSON(bytes);
+  public static CoreAssignment[] load(byte[] bytes) throws IOException {
+    List<Map<String, String>> stateMaps = (List<Map<String, String>>) ZkStateReader.fromJSON(bytes);
 
     CoreAssignment[] states = new CoreAssignment[stateMaps.size()];
     int i = 0;
@@ -81,5 +84,5 @@ public class CoreAssignment {
   public String toString() {
     return "coll:" + getCollectionName() + " core:" + getCoreName() + " props:" + properties;
   }
-  
+
 }

Modified: lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CoreState.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CoreState.java?rev=1211292&r1=1211291&r2=1211292&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CoreState.java (original)
+++ lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/CoreState.java Wed Dec  7 04:20:49 2011
@@ -17,10 +17,12 @@ package org.apache.solr.common.cloud;
  * the License.
  */
 
+import org.apache.noggit.JSONWriter;
+
 import java.io.IOException;
 import java.util.*;
 
-public class CoreState {
+public class CoreState implements JSONWriter.Writable {
   private static String COLLECTION="_collection";
   private static String CORE="_core";
 
@@ -50,12 +52,14 @@ public class CoreState {
     return properties;
   }
 
-  public static byte[] tobytes(CoreState... states) throws IOException {
-    return CloudState.toJSON(states);
+  @Override
+  public void write(JSONWriter jsonWriter) {
+    jsonWriter.write(properties);
   }
-  
-  public static CoreState[] fromBytes(byte[] bytes) throws IOException {
-    List<Map<String, String>> stateMaps = (List<Map<String, String>>) CloudState.fromJSON(bytes);
+
+
+  public static CoreState[] load(byte[] bytes) throws IOException {
+    List<Map<String, String>> stateMaps = (List<Map<String, String>>) ZkStateReader.fromJSON(bytes);
 
     CoreState[] states = new CoreState[stateMaps.size()];
     int i = 0;
@@ -80,5 +84,5 @@ public class CoreState {
   public String toString() {
     return "coll:" + getCollectionName() + " core:" + getCoreName() + " props:" + properties;
   }
-  
+
 }

Modified: lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/Slice.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/Slice.java?rev=1211292&r1=1211291&r2=1211292&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/Slice.java (original)
+++ lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/Slice.java Wed Dec  7 04:20:49 2011
@@ -17,12 +17,14 @@ package org.apache.solr.common.cloud;
  * limitations under the License.
  */
 
+import org.apache.noggit.JSONWriter;
+
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
 // immutable
-public class Slice {
+public class Slice implements JSONWriter.Writable {
   private final Map<String,ZkNodeProps> shards;
   private final String name;
 
@@ -53,4 +55,8 @@ public class Slice {
     return "Slice [shards=" + shards + ", name=" + name + "]";
   }
 
+  @Override
+  public void write(JSONWriter jsonWriter) {
+    jsonWriter.write(shards);
+  }
 }

Modified: lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java?rev=1211292&r1=1211291&r2=1211292&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java (original)
+++ lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java Wed Dec  7 04:20:49 2011
@@ -24,11 +24,10 @@ import java.util.Map;
 import java.util.Set;
 import java.util.Map.Entry;
 
-import org.apache.noggit.JSONUtil;
-import org.apache.noggit.ObjectBuilder;
+import org.apache.noggit.JSONWriter;
 
 // Immutable
-public class ZkNodeProps  {
+public class ZkNodeProps implements JSONWriter.Writable {
 
   private final Map<String,String> propMap;
 
@@ -55,12 +54,13 @@ public class ZkNodeProps  {
   }
 
   public static ZkNodeProps load(byte[] bytes) throws IOException {
-    Map<String, String> props = (Map<String, String>) CloudState.fromJSON(bytes);
+    Map<String, String> props = (Map<String, String>) ZkStateReader.fromJSON(bytes);
     return new ZkNodeProps(props);
   }
 
-  public byte[] store() throws IOException {
-    return CloudState.toJSON(propMap);
+  @Override
+  public void write(JSONWriter jsonWriter) {
+    jsonWriter.write(propMap);
   }
   
   public String get(String key) {

Modified: lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java?rev=1211292&r1=1211291&r2=1211292&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java (original)
+++ lucene/dev/branches/solrcloud/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java Wed Dec  7 04:20:49 2011
@@ -18,6 +18,7 @@ package org.apache.solr.common.cloud;
  */
 
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -27,6 +28,13 @@ import java.util.concurrent.ThreadFactor
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
+import org.apache.lucene.util.BytesRef;
+import org.apache.lucene.util.CharsRef;
+import org.apache.lucene.util.UnicodeUtil;
+import org.apache.noggit.CharArr;
+import org.apache.noggit.JSONParser;
+import org.apache.noggit.JSONWriter;
+import org.apache.noggit.ObjectBuilder;
 import org.apache.solr.common.SolrException;
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException;
@@ -57,6 +65,34 @@ public class ZkStateReader {
 
   public static final String LEADER_ELECT_ZKNODE = "/leader_elect";
 
+  //
+  // convenience methods... should these go somewhere else?
+  //
+  public static byte[] toJSON(Object o) {
+    CharArr out = new CharArr();
+    new JSONWriter(out, 2).write(o); // indentation by default
+    return toUTF8(out);
+  }
+
+  public static byte[] toUTF8(CharArr out) {
+    BytesRef br = new BytesRef(out);
+    return Arrays.copyOf(br.bytes, br.length);
+  }
+
+  public static Object fromJSON(byte[] utf8) {
+    // convert directly from bytes to chars
+    // and parse directly from that instead of going through
+    // intermediate strings or readers
+    CharsRef chars = new CharsRef();
+    UnicodeUtil.UTF8toUTF16(utf8, 0, utf8.length, chars);   // TODO: this method currently oversizes the array
+    JSONParser parser = new JSONParser(chars.chars, chars.offset, chars.length);
+    try {
+      return ObjectBuilder.getVal(parser);
+    } catch (IOException e) {
+      throw new RuntimeException(e); // should never happen w/o using real IO
+    }
+  }
+
 
   private static class ZKTF implements ThreadFactory {
     private static ThreadGroup tg = new ThreadGroup("ZkStateReader");