You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by br...@apache.org on 2011/06/17 21:20:18 UTC

svn commit: r1136991 - /cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/tools/SSTableExport.java

Author: brandonwilliams
Date: Fri Jun 17 19:20:18 2011
New Revision: 1136991

URL: http://svn.apache.org/viewvc?rev=1136991&view=rev
Log:
Use jackson's ObjectMapper instead of hand-crafting json in sstable2json.
Patch by Pavel Yaskevich, reviewed by brandonwilliams for CASSANDRA-2780

Modified:
    cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/tools/SSTableExport.java

Modified: cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/tools/SSTableExport.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/tools/SSTableExport.java?rev=1136991&r1=1136990&r2=1136991&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/tools/SSTableExport.java (original)
+++ cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/tools/SSTableExport.java Fri Jun 17 19:20:18 2011
@@ -25,6 +25,7 @@ import java.nio.ByteBuffer;
 import java.util.*;
 
 import org.apache.cassandra.config.CFMetaData;
+import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.io.util.BufferedRandomAccessFile;
@@ -33,11 +34,11 @@ import org.apache.cassandra.service.Stor
 import org.apache.commons.cli.*;
 
 import org.apache.cassandra.config.ConfigurationException;
-import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.dht.IPartitioner;
 import org.apache.cassandra.io.sstable.*;
 import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.Pair;
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.map.ObjectMapper;
 
 import static org.apache.cassandra.utils.ByteBufferUtil.bytesToHex;
 import static org.apache.cassandra.utils.ByteBufferUtil.hexToBytes;
@@ -47,12 +48,12 @@ import static org.apache.cassandra.utils
  */
 public class SSTableExport
 {
-    // size of the columns page
-    private static final int PAGE_SIZE = 1000;
+    private static ObjectMapper jsonMapper = new ObjectMapper();
 
     private static final String KEY_OPTION = "k";
     private static final String EXCLUDEKEY_OPTION = "x";
     private static final String ENUMERATEKEYS_OPTION = "e";
+
     private static Options options;
     private static CommandLine cmd;
     
@@ -72,47 +73,36 @@ public class SSTableExport
 
         Option optEnumerate = new Option(ENUMERATEKEYS_OPTION, false, "enumerate keys only");
         options.addOption(optEnumerate);
-    }
 
-    /**
-     * Wraps given string into quotes
-     * @param val string to quote
-     * @return quoted string
-     */
-    private static String quote(String val)
-    {
-        return String.format("\"%s\"", escapeQuotes(val));
-    }
-
-    private static String escapeQuotes(String val)
-    {
-        return val.replace("\"", "\\\"");
+        // disabling auto close of the stream
+        jsonMapper.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false);
     }
 
     /**
      * JSON Hash Key serializer
-     * @param val value to set as a key
-     * @return JSON Hash key
+     *
+     * @param out The output steam to write data
+     * @param value value to set as a key
      */
-    private static String asKey(String val)
+    private static void writeKey(PrintStream out, String value)
     {
-        return String.format("%s: ", quote(val));
+        writeJSON(out, value);
+        out.print(": ");
     }
 
     /**
      * Serialize columns using given column iterator
+     *
      * @param columns column iterator
      * @param out output stream
      * @param comparator columns comparator
      * @param cfMetaData Column Family metadata (to get validator)
-     * @return pair of (number of columns serialized, last column serialized)
      */
     private static void serializeColumns(Iterator<IColumn> columns, PrintStream out, AbstractType comparator, CFMetaData cfMetaData)
     {
         while (columns.hasNext())
         {
-            IColumn column = columns.next();
-            serializeColumn(column, out, comparator, cfMetaData);
+            writeJSON(out, serializeColumn(columns.next(), comparator, cfMetaData));
 
             if (columns.hasNext())
                 out.print(", ");
@@ -121,47 +111,42 @@ public class SSTableExport
 
     /**
      * Serialize a given column to the JSON format
+     *
      * @param column column presentation
-     * @param out output stream
      * @param comparator columns comparator
      * @param cfMetaData Column Family metadata (to get validator)
+     *
+     * @return column as serialized list
      */
-    private static void serializeColumn(IColumn column, PrintStream out, AbstractType comparator, CFMetaData cfMetaData)
+    private static List<Object> serializeColumn(IColumn column, AbstractType comparator, CFMetaData cfMetaData)
     {
+        ArrayList<Object> serializedColumn = new ArrayList<Object>();
+
         ByteBuffer name = ByteBufferUtil.clone(column.name());
         ByteBuffer value = ByteBufferUtil.clone(column.value());
         AbstractType validator = cfMetaData.getValueValidator(name);
 
-        out.print("[");
-        out.print(quote(comparator.getString(name)));
-        out.print(", ");
-        out.print(quote(validator.getString(value)));
-        out.print(", ");
-        out.print(column.timestamp());
+        serializedColumn.add(comparator.getString(name));
+        serializedColumn.add(validator.getString(value));
+        serializedColumn.add(column.timestamp());
 
         if (column instanceof DeletedColumn)
         {
-            out.print(", ");
-            out.print("\"d\"");
+            serializedColumn.add("d");
         }
         else if (column instanceof ExpiringColumn)
         {
-            out.print(", ");
-            out.print("\"e\"");
-            out.print(", ");
-            out.print(((ExpiringColumn) column).getTimeToLive());
-            out.print(", ");
-            out.print(column.getLocalDeletionTime());
+            serializedColumn.add("e");
+            serializedColumn.add(((ExpiringColumn) column).getTimeToLive());
+            serializedColumn.add(column.getLocalDeletionTime());
         }
         else if (column instanceof CounterColumn)
         {
-            out.print(", ");
-            out.print("\"c\"");
-            out.print(", ");
-            out.print(((CounterColumn) column).timestampOfLastDelete());
+            serializedColumn.add("c");
+            serializedColumn.add(((CounterColumn) column).timestampOfLastDelete());
         }
 
-        out.print("]");
+        return serializedColumn;
     }
 
     /**
@@ -177,7 +162,7 @@ public class SSTableExport
         CFMetaData cfMetaData = columnFamily.metadata();
         AbstractType comparator = columnFamily.getComparator();
 
-        out.print(asKey(bytesToHex(key.key)));
+        writeKey(out, bytesToHex(key.key));
         out.print(isSuperCF ? "{" : "[");
 
         if (isSuperCF)
@@ -186,12 +171,12 @@ public class SSTableExport
             {
                 IColumn column = row.next();
 
-                out.print(asKey(comparator.getString(column.name())));
+                writeKey(out, comparator.getString(column.name()));
                 out.print("{");
-                out.print(asKey("deletedAt"));
+                writeKey(out, "deletedAt");
                 out.print(column.getMarkedForDeleteAt());
                 out.print(", ");
-                out.print(asKey("subColumns"));
+                writeKey(out, "subColumns");
                 out.print("[");
                 serializeColumns(column.getSubColumns().iterator(), out, columnFamily.getSubComparator(), cfMetaData);
                 out.print("]");
@@ -207,6 +192,7 @@ public class SSTableExport
         }
 
         out.print(isSuperCF ? "}" : "]");
+
     }
 
     /**
@@ -422,4 +408,16 @@ public class SSTableExport
 
         System.exit(0);
     }
+
+    private static void writeJSON(PrintStream out, Object value)
+    {
+        try
+        {
+            jsonMapper.writeValue(out, value);
+        }
+        catch (Exception e)
+        {
+            throw new RuntimeException(e.getMessage(), e);
+        }
+    }
 }