Revert "GEODE-2142: Removal of non-compliant org.json implementation."

This reverts commit b3ec80bc72fee3a40da297945a85d8df6c2a6460.


Project: http://git-wip-us.apache.org/repos/asf/geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/0805036e
Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/0805036e
Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/0805036e

Branch: refs/heads/develop
Commit: 0805036e81756e3d843f3227e94927a520a07946
Parents: 1253d78
Author: Udo Kohlmeyer <ukohlme...@pivotal.io>
Authored: Fri Feb 17 13:57:54 2017 -0800
Committer: Udo Kohlmeyer <ukohlme...@pivotal.io>
Committed: Fri Feb 17 13:57:54 2017 -0800

----------------------------------------------------------------------
 .../geode/management/internal/cli/CliUtil.java  |   42 +
 .../internal/cli/commands/ConfigCommands.java   |    3 +-
 ...xportImportClusterConfigurationCommands.java |    2 +-
 .../cli/functions/ExportConfigFunction.java     |    4 +-
 .../internal/cli/json/GfJsonObject.java         |   54 +-
 .../internal/cli/result/AbstractResultData.java |   56 +-
 .../cli/result/CompositeResultData.java         |   46 +
 .../internal/cli/result/ResultBuilder.java      |   30 +
 .../cli/commands/CliCommandTestBase.java        |    6 +-
 geode-json/src/main/java/org/json/CDL.java      |  272 +++
 geode-json/src/main/java/org/json/Cookie.java   |  162 ++
 .../src/main/java/org/json/CookieList.java      |   87 +
 geode-json/src/main/java/org/json/HTTP.java     |  185 ++
 .../src/main/java/org/json/HTTPTokener.java     |   77 +
 geode-json/src/main/java/org/json/JSON.java     |  116 --
 .../src/main/java/org/json/JSONArray.java       | 1587 +++++++-------
 .../src/main/java/org/json/JSONException.java   |   71 +-
 geode-json/src/main/java/org/json/JSONML.java   |  454 ++++
 .../src/main/java/org/json/JSONObject.java      | 1952 +++++++++++-------
 .../src/main/java/org/json/JSONString.java      |   17 +-
 .../src/main/java/org/json/JSONStringer.java    |  531 +----
 .../src/main/java/org/json/JSONTokener.java     | 1013 ++++-----
 .../src/main/java/org/json/JSONWriter.java      |  321 +++
 geode-json/src/main/java/org/json/XML.java      |  504 +++++
 .../src/main/java/org/json/XMLTokener.java      |  362 ++++
 25 files changed, 5196 insertions(+), 2758 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/geode/blob/0805036e/geode-core/src/main/java/org/apache/geode/management/internal/cli/CliUtil.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/CliUtil.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/CliUtil.java
index a505001..8525b58 100755
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/CliUtil.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/CliUtil.java
@@ -440,6 +440,11 @@ public class CliUtil {
 
       compressedDataLength = compresser.deflate(buffer);
       totalCompressedDataLength += compressedDataLength;
+      // System.out.println(compressedDataLength);
+      // System.out.println("uc: b "+buffer.length);
+      // System.out.println("uc: r "+result.length);
+      // System.out.println("uc: nr "+newResult.length);
+      // System.out.println();
       System.arraycopy(buffer, 0, newResult, result.length, buffer.length);
       result = newResult;
     } while (compressedDataLength != 0);
@@ -495,6 +500,43 @@ public class CliUtil {
     }
   }
 
+  public static void main(String[] args) {
+    try {
+      byte[][] filesToBytes =
+          filesToBytes(new String[] 
{"/export/abhishek1/work/aspenmm/GFTryouts/test.json"});
+
+      System.out.println(filesToBytes[1].length);
+
+      DeflaterInflaterData compressBytes = compressBytes(filesToBytes[1]);
+      System.out.println(compressBytes);
+
+      DeflaterInflaterData uncompressBytes =
+          uncompressBytes(compressBytes.data, compressBytes.dataLength);
+      System.out.println(uncompressBytes);
+
+      System.out.println(new String(uncompressBytes.getData()));
+    } catch (FileNotFoundException e) {
+      e.printStackTrace();
+    } catch (IOException e) {
+      e.printStackTrace();
+    } catch (DataFormatException e) {
+      e.printStackTrace();
+    }
+  }
+
+  public static void main1(String[] args) {
+    try {
+      byte[][] fileToBytes = filesToBytes(new String[] 
{"../dumped/source/lib"});
+
+      bytesToFiles(fileToBytes, "../dumped/dest/lib/", true);
+
+    } catch (FileNotFoundException e) {
+      e.printStackTrace();
+    } catch (IOException e) {
+      e.printStackTrace();
+    }
+  }
+
   public static boolean contains(Object[] array, Object object) {
     boolean contains = false;
 

http://git-wip-us.apache.org/repos/asf/geode/blob/0805036e/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ConfigCommands.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ConfigCommands.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ConfigCommands.java
index 283f09d..12a0a64 100644
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ConfigCommands.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ConfigCommands.java
@@ -234,8 +234,7 @@ public class ConfigCommands extends AbstractCommandsSupport 
{
               false);
         }
       }
-      Result result = ResultBuilder.buildResult(infoData);
-      return result;
+      return ResultBuilder.buildResult(infoData);
     } catch (VirtualMachineError e) {
       SystemFailure.initiateFailure(e);
       throw e;

http://git-wip-us.apache.org/repos/asf/geode/blob/0805036e/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ExportImportClusterConfigurationCommands.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ExportImportClusterConfigurationCommands.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ExportImportClusterConfigurationCommands.java
index 7485d9f..e94af4f 100644
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ExportImportClusterConfigurationCommands.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ExportImportClusterConfigurationCommands.java
@@ -75,7 +75,6 @@ public class ExportImportClusterConfigurationCommands extends 
AbstractCommandsSu
   public Result exportSharedConfig(@CliOption(key = 
{CliStrings.EXPORT_SHARED_CONFIG__FILE},
       mandatory = true, help = CliStrings.EXPORT_SHARED_CONFIG__FILE__HELP) 
String zipFileName) {
 
-    System.err.println("Out 1");
     InternalLocator locator = InternalLocator.getLocator();
     if (!locator.isSharedConfigurationRunning()) {
       return 
ResultBuilder.createGemFireErrorResult(CliStrings.SHARED_CONFIGURATION_NOT_STARTED);
@@ -100,6 +99,7 @@ public class ExportImportClusterConfigurationCommands 
extends AbstractCommandsSu
         sc.writeConfigToFile(config);
       }
       ZipUtils.zipDirectory(sc.getSharedConfigurationDirPath(), 
zipFile.getCanonicalPath());
+
       InfoResultData infoData = ResultBuilder.createInfoResultData();
       byte[] byteData = FileUtils.readFileToByteArray(zipFile);
       infoData.addAsFile(zipFileName, byteData, 
InfoResultData.FILE_TYPE_BINARY,

http://git-wip-us.apache.org/repos/asf/geode/blob/0805036e/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ExportConfigFunction.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ExportConfigFunction.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ExportConfigFunction.java
index 64bc374..49e27b0 100644
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ExportConfigFunction.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ExportConfigFunction.java
@@ -93,10 +93,12 @@ public class ExportConfigFunction implements Function, 
InternalEntity {
               .append(lineSeparator);
         }
       }
+
       CliFunctionResult result = new CliFunctionResult(memberId,
           new String[] {xmlWriter.toString(), propStringBuf.toString()});
-      System.err.println("ExportConfigFunction.execute CLI function result: 
"+result);
+
       context.getResultSender().lastResult(result);
+
     } catch (CacheClosedException cce) {
       CliFunctionResult result = new CliFunctionResult(memberId, false, null);
       context.getResultSender().lastResult(result);

http://git-wip-us.apache.org/repos/asf/geode/blob/0805036e/geode-core/src/main/java/org/apache/geode/management/internal/cli/json/GfJsonObject.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/json/GfJsonObject.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/json/GfJsonObject.java
index 9137f72..69666ff 100644
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/json/GfJsonObject.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/json/GfJsonObject.java
@@ -49,6 +49,22 @@ public class GfJsonObject {
       this.jsonObject = (JSONObject) bean;
     } else {
       this.jsonObject = new JSONObject(bean);
+      // If we want to print out the values of the primitive arrays and report 
back
+      // Class klass = bean.getClass();
+      // if(klass.isArray() && klass.getComponentType().isPrimitive()){
+      // String str = "";
+      // int length = Array.getLength(bean);
+      // for (int i = 0; i < length; i++) {
+      // if(i==0)
+      // str += (Array.get(bean, i));
+      // else
+      // str +=(","+Array.get(bean, i));
+      // }
+      // try {
+      // this.jsonObject.put("Value", str);
+      // } catch (JSONException ignore) {
+      // }
+      // }
     }
     if (checkCyclicDep) {
       JSONObject.cyclicDepChkEnabled.set(false);
@@ -72,9 +88,9 @@ public class GfJsonObject {
     }
   }
 
-//  public GfJsonObject(Object bean, String[] paramNames) {
-//    this.jsonObject = new JSONObject(bean, paramNames);
-//  }
+  public GfJsonObject(Object bean, String[] paramNames) {
+    this.jsonObject = new JSONObject(bean, paramNames);
+  }
 
   /**
    * 
@@ -237,21 +253,21 @@ public class GfJsonObject {
     return this;
   }
 
-//  /**
-//   *
-//   * @param key
-//   * @param value
-//   * @return this GfJsonObject
-//   * @throws GfJsonException if the key is a duplicate
-//   */
-//  public GfJsonObject putOnce(String key, Object value) throws 
GfJsonException {
-//    try {
-//      jsonObject.putOnce(key, value);
-//    } catch (JSONException e) {
-//      throw new GfJsonException(e.getMessage());
-//    }
-//    return this;
-//  }
+  /**
+   * 
+   * @param key
+   * @param value
+   * @return this GfJsonObject
+   * @throws GfJsonException if the key is a duplicate
+   */
+  public GfJsonObject putOnce(String key, Object value) throws GfJsonException 
{
+    try {
+      jsonObject.putOnce(key, value);
+    } catch (JSONException e) {
+      throw new GfJsonException(e.getMessage());
+    }
+    return this;
+  }
 
   /**
    * 
@@ -346,7 +362,7 @@ public class GfJsonObject {
     }
   }
 
-  private Object extractInternalForGfJsonOrReturnSame(Object value) {
+  private static Object extractInternalForGfJsonOrReturnSame(Object value) {
     Object returnedValue = value;
     if (value instanceof GfJsonObject) {
       returnedValue = ((GfJsonObject) value).getInternalJsonObject();

http://git-wip-us.apache.org/repos/asf/geode/blob/0805036e/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/AbstractResultData.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/AbstractResultData.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/AbstractResultData.java
index 81ab511..e08d9b7 100644
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/AbstractResultData.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/AbstractResultData.java
@@ -20,10 +20,7 @@ import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.FileWriter;
 import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.nio.charset.Charset;
 import java.text.MessageFormat;
-import java.util.Base64;
 import java.util.zip.DataFormatException;
 
 import org.apache.geode.management.cli.Result.Status;
@@ -154,10 +151,26 @@ public abstract class AbstractResultData implements 
ResultData {
     if (addTimeStampToName) {
       fileName = addTimeStampBeforeLastDot(fileName);
     }
-    return addAsFile(fileName, bytes, fileType, message);
+    return addAsFile(fileName.getBytes(), bytes, fileType, message);
   }
 
-  private ResultData addAsFile(String fileName, byte[] data, int fileType, 
String message) {
+  public ResultData addByteDataFromFileFile(String filePath, int fileType, 
String message,
+      boolean addTimeStampToName) throws FileNotFoundException, IOException {
+    byte[][] filesToBytes = CliUtil.filesToBytes(new String[] {filePath});
+
+    byte[] bytes = filesToBytes[0];
+    if (addTimeStampToName) {
+      String fileName = new String(filesToBytes[0]);
+      fileName = addTimeStampBeforeLastDot(fileName);
+      bytes = fileName.getBytes();
+    }
+    return addAsFile(bytes, filesToBytes[1], fileType, message);
+  }
+
+  private ResultData addAsFile(byte[] fileName, byte[] data, int fileType, 
String message) {
+    // System.out.println("fileType :: "+fileType);
+    // System.out.println("FILE_TYPE_BINARY :: "+FILE_TYPE_BINARY);
+    // System.out.println("FILE_TYPE_TEXT :: "+FILE_TYPE_TEXT);
     if (fileType != FILE_TYPE_BINARY && fileType != FILE_TYPE_TEXT) {
       throw new IllegalArgumentException("Unsupported file type is 
specified.");
     }
@@ -173,12 +186,14 @@ public abstract class AbstractResultData implements 
ResultData {
 
       sectionData.put(FILE_NAME_FIELD, fileName);
       sectionData.put(FILE_TYPE_FIELD, fileType);
-      sectionData.put(FILE_MESSAGE, message);
-      DeflaterInflaterData deflaterInflaterData = CliUtil.compressBytes(data);
-      sectionData.put(FILE_DATA_FIELD, 
Base64.getEncoder().encodeToString(deflaterInflaterData.getData()));
-      sectionData.put(DATA_LENGTH_FIELD,deflaterInflaterData.getDataLength());
+      sectionData.put(FILE_MESSAGE, message.getBytes());
+      sectionData.putAsJSONObject(FILE_DATA_FIELD, 
CliUtil.compressBytes(data));
+      // System.out.println(data);
+      // sectionData.put(FILE_DATA_FIELD, Base64.encodeBytes(data, 
Base64.GZIP));
     } catch (GfJsonException e) {
       throw new ResultDataException(e.getMessage());
+      // } catch (IOException e) {
+      // e.printStackTrace();
     }
     return this;
   }
@@ -208,30 +223,29 @@ public abstract class AbstractResultData implements 
ResultData {
 
       // build file name
       byte[] fileNameBytes = null;
-      String fileName = null;
       GfJsonArray fileNameJsonBytes = object.getJSONArray(FILE_NAME_FIELD);
       if (fileNameJsonBytes != null) { // if in gfsh
         fileNameBytes = GfJsonArray.toByteArray(fileNameJsonBytes);
-        fileName = new String(fileNameBytes);
       } else { // if on member
-        fileName = (String) object.get(FILE_NAME_FIELD);
+        fileNameBytes = (byte[]) object.get(FILE_NAME_FIELD);
       }
+      String fileName = new String(fileNameBytes);
 
       // build file message
       byte[] fileMessageBytes = null;
-      String fileMessage = null;
       GfJsonArray fileMessageJsonBytes = object.getJSONArray(FILE_MESSAGE);
       if (fileMessageJsonBytes != null) { // if in gfsh
         fileMessageBytes = GfJsonArray.toByteArray(fileMessageJsonBytes);
-        fileMessage = new String(fileMessageBytes);
       } else { // if on member
-        fileMessage = (String) object.get(FILE_MESSAGE);
+        fileMessageBytes = (byte[]) object.get(FILE_MESSAGE);
       }
+      String fileMessage = new String(fileMessageBytes);
 
-      String fileDataString = (String) object.get(FILE_DATA_FIELD);
-      int fileDataLength = (int) object.get(DATA_LENGTH_FIELD);
-      byte[] byteArray = Base64.getDecoder().decode(fileDataString);
-      byte[] uncompressBytes = 
CliUtil.uncompressBytes(byteArray,fileDataLength).getData();
+      GfJsonObject fileDataBytes = object.getJSONObject(FILE_DATA_FIELD);
+      byte[] byteArray = 
GfJsonArray.toByteArray(fileDataBytes.getJSONArray(DATA_FIELD));
+      int dataLength = fileDataBytes.getInt(DATA_LENGTH_FIELD);
+      DeflaterInflaterData uncompressBytes = 
CliUtil.uncompressBytes(byteArray, dataLength);
+      byte[] uncompressed = uncompressBytes.getData();
 
       boolean isGfshVM = CliUtil.isGfshVM();
       File fileToDumpData = new File(fileName);
@@ -285,13 +299,13 @@ public abstract class AbstractResultData implements 
ResultData {
       if (fileType == FILE_TYPE_TEXT) {
         FileWriter fw = new FileWriter(fileToDumpData);
         BufferedWriter bw = new BufferedWriter(fw);
-        bw.write(new String(uncompressBytes));
+        bw.write(new String(uncompressed));
         bw.flush();
         fw.flush();
         fw.close();
       } else if (fileType == FILE_TYPE_BINARY) {
         FileOutputStream fos = new FileOutputStream(fileToDumpData);
-        fos.write(uncompressBytes);
+        fos.write(uncompressed);
         fos.flush();
         fos.close();
       }

http://git-wip-us.apache.org/repos/asf/geode/blob/0805036e/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/CompositeResultData.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/CompositeResultData.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/CompositeResultData.java
index c1db133..7d0d23b 100644
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/CompositeResultData.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/CompositeResultData.java
@@ -324,4 +324,50 @@ public class CompositeResultData extends 
AbstractResultData {
     // }
   }
 
+  public static void main(String[] args) {
+    CompositeResultData crd = new CompositeResultData();
+
+    SectionResultData r1Section = crd.addSection("R1");
+    r1Section.addData("Region", "R1").addData("IsPartitioned", 
false).addData("IsPersistent", true)
+        .addData("Disk Store", "DiskStore1").addData("Group", "Group1");
+    TabularResultData r1Table = r1Section.addTable("R1Members");
+    r1Table.accumulate("Member Id", "host1(3467):12435:12423")
+        .accumulate("PrimaryEntryCount", 20000).accumulate("BackupEntryCount", 
20000)
+        .accumulate("Memory(MB)", "100").accumulate("NumOfCopies", 1);
+    r1Table.accumulate("Member Id", "host3(5756):57665:90923")
+        .accumulate("PrimaryEntryCount", 25000).accumulate("BackupEntryCount", 
10000)
+        .accumulate("Memory(MB)", "200").accumulate("NumOfCopies", 1);
+
+    SectionResultData r3Section = crd.addSection("R3");
+    r3Section.addData("Region", "R3").addData("IsPartitioned", 
true).addData("IsPersistent", true)
+        .addData("Disk Store", "DiskStore2").addData("Group", "Group2")
+        .addData("ColocatedWith", "-");
+    SectionResultData r3SubSection = r3Section.addSection("R3Config");
+    r3SubSection.addData("Configuration", "");
+    r3SubSection.addData("Config1", "abcd");
+    r3SubSection.addData("Config2", "abcde");
+    r3SubSection.addData("Config3", "abcdfg");
+    TabularResultData r3Table = r3Section.addTable("R3Members");
+    r3Table.accumulate("Member Id", "host1(3467):12435:12423")
+        .accumulate("PrimaryEntryCount", 20000).accumulate("BackupEntryCount", 
20000)
+        .accumulate("Memory(MB)", "100").accumulate("NumOfCopies", 1)
+        .accumulate("NumOfBuckets", 100);
+    r3Table.accumulate("Member Id", "host2(3353):23545:14723")
+        .accumulate("PrimaryEntryCount", 20000).accumulate("BackupEntryCount", 
20000)
+        .accumulate("Memory(MB)", "100").accumulate("NumOfCopies", 1)
+        .accumulate("NumOfBuckets", 100);
+    r3Table.accumulate("Member Id", "host3(5756):57665:90923")
+        .accumulate("PrimaryEntryCount", 25000).accumulate("BackupEntryCount", 
10000)
+        .accumulate("Memory(MB)", "200").accumulate("NumOfCopies", 1)
+        .accumulate("NumOfBuckets", 100);
+
+    try {
+      System.out.println(crd.getGfJsonObject().toIndentedString(/* 2 */0));
+
+    } catch (GfJsonException e) {
+      e.printStackTrace();
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/geode/blob/0805036e/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/ResultBuilder.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/ResultBuilder.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/ResultBuilder.java
index 9bd2bf9..06060a4 100755
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/ResultBuilder.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/ResultBuilder.java
@@ -301,6 +301,12 @@ public class ResultBuilder {
         }
 
         @Override
+        public ResultData addByteDataFromFileFile(String filePath, int 
fileType, String message,
+            boolean addTimeStampToName) throws FileNotFoundException, 
IOException {
+          throw new UnsupportedOperationException("This is read only result 
data");
+        }
+
+        @Override
         public TabularResultData accumulate(String accumulateFor, Object 
value) {
           throw new UnsupportedOperationException("This is read only result 
data");
         }
@@ -320,6 +326,12 @@ public class ResultBuilder {
         }
 
         @Override
+        public ResultData addByteDataFromFileFile(String filePath, int 
fileType, String message,
+            boolean addTimeStampToName) throws FileNotFoundException, 
IOException {
+          throw new UnsupportedOperationException("This is read only result 
data");
+        }
+
+        @Override
         public ErrorResultData addLine(String line) {
           throw new UnsupportedOperationException("This is read only result 
data");
         }
@@ -339,6 +351,12 @@ public class ResultBuilder {
         }
 
         @Override
+        public ResultData addByteDataFromFileFile(String filePath, int 
fileType, String message,
+            boolean addTimeStampToName) throws FileNotFoundException, 
IOException {
+          throw new UnsupportedOperationException("This is read only result 
data");
+        }
+
+        @Override
         public ErrorResultData addLine(String line) {
           throw new UnsupportedOperationException("This is read only result 
data");
         }
@@ -363,6 +381,12 @@ public class ResultBuilder {
         }
 
         @Override
+        public ResultData addByteDataFromFileFile(String filePath, int 
fileType, String message,
+            boolean addTimeStampToName) throws FileNotFoundException, 
IOException {
+          throw new UnsupportedOperationException("This is read only result 
data");
+        }
+
+        @Override
         public SectionResultData addSection() {
           throw new UnsupportedOperationException("This is read only result 
data");
         }
@@ -392,6 +416,12 @@ public class ResultBuilder {
         }
 
         @Override
+        public ResultData addByteDataFromFileFile(String filePath, int 
fileType, String message,
+            boolean addTimeStampToName) throws FileNotFoundException, 
IOException {
+          throw new UnsupportedOperationException("This is read only result 
data");
+        }
+
+        @Override
         public ObjectResultData<CliJsonSerializable> addCollection(
             Collection<CliJsonSerializable> infoBeans) {
           throw new UnsupportedOperationException("This is read only result 
data");

http://git-wip-us.apache.org/repos/asf/geode/blob/0805036e/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CliCommandTestBase.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CliCommandTestBase.java
 
b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CliCommandTestBase.java
index 239810b..21426d6 100644
--- 
a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CliCommandTestBase.java
+++ 
b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CliCommandTestBase.java
@@ -360,11 +360,7 @@ public abstract class CliCommandTestBase extends 
JUnit4CacheTestCase {
 
     CommandResult result = null;
     try {
-      Object result1 = shell.getResult();
-      if (result1 instanceof String) {
-        System.err.println("result1 = " + result1);
-      }
-      result = (CommandResult) result1; // TODO: this can result in 
ClassCastException if
+      result = (CommandResult) shell.getResult(); // TODO: this can result in 
ClassCastException if
                                                   // command resulted in error
     } catch (InterruptedException ex) {
       error("shell received InterruptedException");

http://git-wip-us.apache.org/repos/asf/geode/blob/0805036e/geode-json/src/main/java/org/json/CDL.java
----------------------------------------------------------------------
diff --git a/geode-json/src/main/java/org/json/CDL.java 
b/geode-json/src/main/java/org/json/CDL.java
new file mode 100755
index 0000000..d78935b
--- /dev/null
+++ b/geode-json/src/main/java/org/json/CDL.java
@@ -0,0 +1,272 @@
+package org.json;
+
+/*
+ * Copyright (c) 2002 JSON.org
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a 
copy of this software and
+ * associated documentation files (the "Software"), to deal in the Software 
without restriction,
+ * including without limitation the rights to use, copy, modify, merge, 
publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to 
whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in 
all copies or
+ * substantial portions of the Software.
+ * 
+ * The Software shall be used for Good, not Evil.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 
PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 
OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 
THE SOFTWARE.
+ */
+
+/**
+ * This provides static methods to convert comma delimited text into a 
JSONArray, and to covert a
+ * JSONArray into comma delimited text. Comma delimited text is a very popular 
format for data
+ * interchange. It is understood by most database, spreadsheet, and organizer 
programs.
+ * <p>
+ * Each row of text represents a row in a table or a data record. Each row 
ends with a NEWLINE
+ * character. Each row contains one or more values. Values are separated by 
commas. A value can
+ * contain any character except for comma, unless is is wrapped in single 
quotes or double quotes.
+ * <p>
+ * The first row usually contains the names of the columns.
+ * <p>
+ * A comma delimited list can be converted into a JSONArray of JSONObjects. 
The names for the
+ * elements in the JSONObjects can be taken from the names in the first row.
+ * 
+ * @author JSON.org
+ * @version 2010-12-24
+ */
+public class CDL {
+
+  /**
+   * Get the next value. The value can be wrapped in quotes. The value can be 
empty.
+   * 
+   * @param x A JSONTokener of the source text.
+   * @return The value string, or null if empty.
+   * @throws JSONException if the quoted string is badly formed.
+   */
+  private static String getValue(JSONTokener x) throws JSONException {
+    char c;
+    char q;
+    StringBuffer sb;
+    do {
+      c = x.next();
+    } while (c == ' ' || c == '\t');
+    switch (c) {
+      case 0:
+        return null;
+      case '"':
+      case '\'':
+        q = c;
+        sb = new StringBuffer();
+        for (;;) {
+          c = x.next();
+          if (c == q) {
+            break;
+          }
+          if (c == 0 || c == '\n' || c == '\r') {
+            throw x.syntaxError("Missing close quote '" + q + "'.");
+          }
+          sb.append(c);
+        }
+        return sb.toString();
+      case ',':
+        x.back();
+        return "";
+      default:
+        x.back();
+        return x.nextTo(',');
+    }
+  }
+
+  /**
+   * Produce a JSONArray of strings from a row of comma delimited values.
+   * 
+   * @param x A JSONTokener of the source text.
+   * @return A JSONArray of strings.
+   * @throws JSONException
+   */
+  public static JSONArray rowToJSONArray(JSONTokener x) throws JSONException {
+    JSONArray ja = new JSONArray();
+    for (;;) {
+      String value = getValue(x);
+      char c = x.next();
+      if (value == null || (ja.length() == 0 && value.length() == 0 && c != 
',')) {
+        return null;
+      }
+      ja.put(value);
+      for (;;) {
+        if (c == ',') {
+          break;
+        }
+        if (c != ' ') {
+          if (c == '\n' || c == '\r' || c == 0) {
+            return ja;
+          }
+          throw x.syntaxError("Bad character '" + c + "' (" + (int) c + ").");
+        }
+        c = x.next();
+      }
+    }
+  }
+
+  /**
+   * Produce a JSONObject from a row of comma delimited text, using a parallel 
JSONArray of strings
+   * to provides the names of the elements.
+   * 
+   * @param names A JSONArray of names. This is commonly obtained from the 
first row of a comma
+   *        delimited text file using the rowToJSONArray method.
+   * @param x A JSONTokener of the source text.
+   * @return A JSONObject combining the names and values.
+   * @throws JSONException
+   */
+  public static JSONObject rowToJSONObject(JSONArray names, JSONTokener x) 
throws JSONException {
+    JSONArray ja = rowToJSONArray(x);
+    return ja != null ? ja.toJSONObject(names) : null;
+  }
+
+  /**
+   * Produce a comma delimited text row from a JSONArray. Values containing 
the comma character will
+   * be quoted. Troublesome characters may be removed.
+   * 
+   * @param ja A JSONArray of strings.
+   * @return A string ending in NEWLINE.
+   */
+  public static String rowToString(JSONArray ja) {
+    StringBuffer sb = new StringBuffer();
+    for (int i = 0; i < ja.length(); i += 1) {
+      if (i > 0) {
+        sb.append(',');
+      }
+      Object object = ja.opt(i);
+      if (object != null) {
+        String string = object.toString();
+        if (string.length() > 0 && (string.indexOf(',') >= 0 || 
string.indexOf('\n') >= 0
+            || string.indexOf('\r') >= 0 || string.indexOf(0) >= 0 || 
string.charAt(0) == '"')) {
+          sb.append('"');
+          int length = string.length();
+          for (int j = 0; j < length; j += 1) {
+            char c = string.charAt(j);
+            if (c >= ' ' && c != '"') {
+              sb.append(c);
+            }
+          }
+          sb.append('"');
+        } else {
+          sb.append(string);
+        }
+      }
+    }
+    sb.append('\n');
+    return sb.toString();
+  }
+
+  /**
+   * Produce a JSONArray of JSONObjects from a comma delimited text string, 
using the first row as a
+   * source of names.
+   * 
+   * @param string The comma delimited text.
+   * @return A JSONArray of JSONObjects.
+   * @throws JSONException
+   */
+  public static JSONArray toJSONArray(String string) throws JSONException {
+    return toJSONArray(new JSONTokener(string));
+  }
+
+  /**
+   * Produce a JSONArray of JSONObjects from a comma delimited text string, 
using the first row as a
+   * source of names.
+   * 
+   * @param x The JSONTokener containing the comma delimited text.
+   * @return A JSONArray of JSONObjects.
+   * @throws JSONException
+   */
+  public static JSONArray toJSONArray(JSONTokener x) throws JSONException {
+    return toJSONArray(rowToJSONArray(x), x);
+  }
+
+  /**
+   * Produce a JSONArray of JSONObjects from a comma delimited text string 
using a supplied
+   * JSONArray as the source of element names.
+   * 
+   * @param names A JSONArray of strings.
+   * @param string The comma delimited text.
+   * @return A JSONArray of JSONObjects.
+   * @throws JSONException
+   */
+  public static JSONArray toJSONArray(JSONArray names, String string) throws 
JSONException {
+    return toJSONArray(names, new JSONTokener(string));
+  }
+
+  /**
+   * Produce a JSONArray of JSONObjects from a comma delimited text string 
using a supplied
+   * JSONArray as the source of element names.
+   * 
+   * @param names A JSONArray of strings.
+   * @param x A JSONTokener of the source text.
+   * @return A JSONArray of JSONObjects.
+   * @throws JSONException
+   */
+  public static JSONArray toJSONArray(JSONArray names, JSONTokener x) throws 
JSONException {
+    if (names == null || names.length() == 0) {
+      return null;
+    }
+    JSONArray ja = new JSONArray();
+    for (;;) {
+      JSONObject jo = rowToJSONObject(names, x);
+      if (jo == null) {
+        break;
+      }
+      ja.put(jo);
+    }
+    if (ja.length() == 0) {
+      return null;
+    }
+    return ja;
+  }
+
+
+  /**
+   * Produce a comma delimited text from a JSONArray of JSONObjects. The first 
row will be a list of
+   * names obtained by inspecting the first JSONObject.
+   * 
+   * @param ja A JSONArray of JSONObjects.
+   * @return A comma delimited text.
+   * @throws JSONException
+   */
+  public static String toString(JSONArray ja) throws JSONException {
+    JSONObject jo = ja.optJSONObject(0);
+    if (jo != null) {
+      JSONArray names = jo.names();
+      if (names != null) {
+        return rowToString(names) + toString(names, ja);
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Produce a comma delimited text from a JSONArray of JSONObjects using a 
provided list of names.
+   * The list of names is not included in the output.
+   * 
+   * @param names A JSONArray of strings.
+   * @param ja A JSONArray of JSONObjects.
+   * @return A comma delimited text.
+   * @throws JSONException
+   */
+  public static String toString(JSONArray names, JSONArray ja) throws 
JSONException {
+    if (names == null || names.length() == 0) {
+      return null;
+    }
+    StringBuffer sb = new StringBuffer();
+    for (int i = 0; i < ja.length(); i += 1) {
+      JSONObject jo = ja.optJSONObject(i);
+      if (jo != null) {
+        sb.append(rowToString(jo.toJSONArray(names)));
+      }
+    }
+    return sb.toString();
+  }
+}

http://git-wip-us.apache.org/repos/asf/geode/blob/0805036e/geode-json/src/main/java/org/json/Cookie.java
----------------------------------------------------------------------
diff --git a/geode-json/src/main/java/org/json/Cookie.java 
b/geode-json/src/main/java/org/json/Cookie.java
new file mode 100755
index 0000000..21f88d8
--- /dev/null
+++ b/geode-json/src/main/java/org/json/Cookie.java
@@ -0,0 +1,162 @@
+package org.json;
+
+/*
+ * Copyright (c) 2002 JSON.org
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a 
copy of this software and
+ * associated documentation files (the "Software"), to deal in the Software 
without restriction,
+ * including without limitation the rights to use, copy, modify, merge, 
publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to 
whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in 
all copies or
+ * substantial portions of the Software.
+ * 
+ * The Software shall be used for Good, not Evil.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 
PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 
OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 
THE SOFTWARE.
+ */
+
+/**
+ * Convert a web browser cookie specification to a JSONObject and back. JSON 
and Cookies are both
+ * notations for name/value pairs.
+ * 
+ * @author JSON.org
+ * @version 2010-12-24
+ */
+public class Cookie {
+
+  /**
+   * Produce a copy of a string in which the characters '+', '%', '=', ';' and 
control characters
+   * are replaced with "%hh". This is a gentle form of URL encoding, 
attempting to cause as little
+   * distortion to the string as possible. The characters '=' and ';' are meta 
characters in
+   * cookies. By convention, they are escaped using the URL-encoding. This is 
only a convention, not
+   * a standard. Often, cookies are expected to have encoded values. We encode 
'=' and ';' because
+   * we must. We encode '%' and '+' because they are meta characters in URL 
encoding.
+   * 
+   * @param string The source string.
+   * @return The escaped result.
+   */
+  public static String escape(String string) {
+    char c;
+    String s = string.trim();
+    StringBuffer sb = new StringBuffer();
+    int length = s.length();
+    for (int i = 0; i < length; i += 1) {
+      c = s.charAt(i);
+      if (c < ' ' || c == '+' || c == '%' || c == '=' || c == ';') {
+        sb.append('%');
+        sb.append(Character.forDigit((char) ((c >>> 4) & 0x0f), 16));
+        sb.append(Character.forDigit((char) (c & 0x0f), 16));
+      } else {
+        sb.append(c);
+      }
+    }
+    return sb.toString();
+  }
+
+
+  /**
+   * Convert a cookie specification string into a JSONObject. The string will 
contain a name value
+   * pair separated by '='. The name and the value will be unescaped, possibly 
converting '+' and
+   * '%' sequences. The cookie properties may follow, separated by ';', also 
represented as
+   * name=value (except the secure property, which does not have a value). The 
name will be stored
+   * under the key "name", and the value will be stored under the key "value". 
This method does not
+   * do checking or validation of the parameters. It only converts the cookie 
string into a
+   * JSONObject.
+   * 
+   * @param string The cookie specification string.
+   * @return A JSONObject containing "name", "value", and possibly other 
members.
+   * @throws JSONException
+   */
+  public static JSONObject toJSONObject(String string) throws JSONException {
+    String name;
+    JSONObject jo = new JSONObject();
+    Object value;
+    JSONTokener x = new JSONTokener(string);
+    jo.put("name", x.nextTo('='));
+    x.next('=');
+    jo.put("value", x.nextTo(';'));
+    x.next();
+    while (x.more()) {
+      name = unescape(x.nextTo("=;"));
+      if (x.next() != '=') {
+        if (name.equals("secure")) {
+          value = Boolean.TRUE;
+        } else {
+          throw x.syntaxError("Missing '=' in cookie parameter.");
+        }
+      } else {
+        value = unescape(x.nextTo(';'));
+        x.next();
+      }
+      jo.put(name, value);
+    }
+    return jo;
+  }
+
+
+  /**
+   * Convert a JSONObject into a cookie specification string. The JSONObject 
must contain "name" and
+   * "value" members. If the JSONObject contains "expires", "domain", "path", 
or "secure" members,
+   * they will be appended to the cookie specification string. All other 
members are ignored.
+   * 
+   * @param jo A JSONObject
+   * @return A cookie specification string
+   * @throws JSONException
+   */
+  public static String toString(JSONObject jo) throws JSONException {
+    StringBuffer sb = new StringBuffer();
+
+    sb.append(escape(jo.getString("name")));
+    sb.append("=");
+    sb.append(escape(jo.getString("value")));
+    if (jo.has("expires")) {
+      sb.append(";expires=");
+      sb.append(jo.getString("expires"));
+    }
+    if (jo.has("domain")) {
+      sb.append(";domain=");
+      sb.append(escape(jo.getString("domain")));
+    }
+    if (jo.has("path")) {
+      sb.append(";path=");
+      sb.append(escape(jo.getString("path")));
+    }
+    if (jo.optBoolean("secure")) {
+      sb.append(";secure");
+    }
+    return sb.toString();
+  }
+
+  /**
+   * Convert <code>%</code><i>hh</i> sequences to single characters, and 
convert plus to space.
+   * 
+   * @param string A string that may contain 
<code>+</code>&nbsp;<small>(plus)</small> and
+   *        <code>%</code><i>hh</i> sequences.
+   * @return The unescaped string.
+   */
+  public static String unescape(String string) {
+    int length = string.length();
+    StringBuffer sb = new StringBuffer();
+    for (int i = 0; i < length; ++i) {
+      char c = string.charAt(i);
+      if (c == '+') {
+        c = ' ';
+      } else if (c == '%' && i + 2 < length) {
+        int d = JSONTokener.dehexchar(string.charAt(i + 1));
+        int e = JSONTokener.dehexchar(string.charAt(i + 2));
+        if (d >= 0 && e >= 0) {
+          c = (char) (d * 16 + e);
+          i += 2;
+        }
+      }
+      sb.append(c);
+    }
+    return sb.toString();
+  }
+}

http://git-wip-us.apache.org/repos/asf/geode/blob/0805036e/geode-json/src/main/java/org/json/CookieList.java
----------------------------------------------------------------------
diff --git a/geode-json/src/main/java/org/json/CookieList.java 
b/geode-json/src/main/java/org/json/CookieList.java
new file mode 100755
index 0000000..35e1a97
--- /dev/null
+++ b/geode-json/src/main/java/org/json/CookieList.java
@@ -0,0 +1,87 @@
+package org.json;
+
+/*
+ * Copyright (c) 2002 JSON.org
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a 
copy of this software and
+ * associated documentation files (the "Software"), to deal in the Software 
without restriction,
+ * including without limitation the rights to use, copy, modify, merge, 
publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to 
whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in 
all copies or
+ * substantial portions of the Software.
+ * 
+ * The Software shall be used for Good, not Evil.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 
PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 
OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 
THE SOFTWARE.
+ */
+
+import java.util.Iterator;
+
+/**
+ * Convert a web browser cookie list string to a JSONObject and back.
+ * 
+ * @author JSON.org
+ * @version 2010-12-24
+ */
+public class CookieList {
+
+  /**
+   * Convert a cookie list into a JSONObject. A cookie list is a sequence of 
name/value pairs. The
+   * names are separated from the values by '='. The pairs are separated by 
';'. The names and the
+   * values will be unescaped, possibly converting '+' and '%' sequences.
+   *
+   * To add a cookie to a cooklist, 
cookielistJSONObject.put(cookieJSONObject.getString("name"),
+   * cookieJSONObject.getString("value"));
+   * 
+   * @param string A cookie list string
+   * @return A JSONObject
+   * @throws JSONException
+   */
+  public static JSONObject toJSONObject(String string) throws JSONException {
+    JSONObject jo = new JSONObject();
+    JSONTokener x = new JSONTokener(string);
+    while (x.more()) {
+      String name = Cookie.unescape(x.nextTo('='));
+      x.next('=');
+      jo.put(name, Cookie.unescape(x.nextTo(';')));
+      x.next();
+    }
+    return jo;
+  }
+
+
+  /**
+   * Convert a JSONObject into a cookie list. A cookie list is a sequence of 
name/value pairs. The
+   * names are separated from the values by '='. The pairs are separated by 
';'. The characters '%',
+   * '+', '=', and ';' in the names and values are replaced by "%hh".
+   * 
+   * @param jo A JSONObject
+   * @return A cookie list string
+   * @throws JSONException
+   */
+  public static String toString(JSONObject jo) throws JSONException {
+    boolean b = false;
+    Iterator keys = jo.keys();
+    String string;
+    StringBuffer sb = new StringBuffer();
+    while (keys.hasNext()) {
+      string = keys.next().toString();
+      if (!jo.isNull(string)) {
+        if (b) {
+          sb.append(';');
+        }
+        sb.append(Cookie.escape(string));
+        sb.append("=");
+        sb.append(Cookie.escape(jo.getString(string)));
+        b = true;
+      }
+    }
+    return sb.toString();
+  }
+}

http://git-wip-us.apache.org/repos/asf/geode/blob/0805036e/geode-json/src/main/java/org/json/HTTP.java
----------------------------------------------------------------------
diff --git a/geode-json/src/main/java/org/json/HTTP.java 
b/geode-json/src/main/java/org/json/HTTP.java
new file mode 100755
index 0000000..1e815aa
--- /dev/null
+++ b/geode-json/src/main/java/org/json/HTTP.java
@@ -0,0 +1,185 @@
+package org.json;
+
+/*
+ * Copyright (c) 2002 JSON.org
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a 
copy of this software and
+ * associated documentation files (the "Software"), to deal in the Software 
without restriction,
+ * including without limitation the rights to use, copy, modify, merge, 
publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to 
whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in 
all copies or
+ * substantial portions of the Software.
+ * 
+ * The Software shall be used for Good, not Evil.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 
PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 
OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 
THE SOFTWARE.
+ */
+
+import java.util.Iterator;
+
+/**
+ * Convert an HTTP header to a JSONObject and back.
+ * 
+ * @author JSON.org
+ * @version 2010-12-24
+ */
+public class HTTP {
+
+  /** Carriage return/line feed. */
+  public static final String CRLF = "\r\n";
+
+  /**
+   * Convert an HTTP header string into a JSONObject. It can be a request 
header or a response
+   * header. A request header will contain
+   * 
+   * <pre>
+   * {
+   *    Method: "POST" (for example),
+   *    "Request-URI": "/" (for example),
+   *    "HTTP-Version": "HTTP/1.1" (for example)
+   * }
+   * </pre>
+   * 
+   * A response header will contain
+   * 
+   * <pre>
+   * {
+   *    "HTTP-Version": "HTTP/1.1" (for example),
+   *    "Status-Code": "200" (for example),
+   *    "Reason-Phrase": "OK" (for example)
+   * }
+   * </pre>
+   * 
+   * In addition, the other parameters in the header will be captured, using 
the HTTP field names as
+   * JSON names, so that
+   * 
+   * <pre>
+   *    Date: Sun, 26 May 2002 18:06:04 GMT
+   *    Cookie: Q=q2=PPEAsg--; B=677gi6ouf29bn&b=2&f=s
+   *    Cache-Control: no-cache
+   * </pre>
+   * 
+   * become
+   * 
+   * <pre>
+   * {...
+   *    Date: "Sun, 26 May 2002 18:06:04 GMT",
+   *    Cookie: "Q=q2=PPEAsg--; B=677gi6ouf29bn&b=2&f=s",
+   *    "Cache-Control": "no-cache",
+   * ...}
+   * </pre>
+   * 
+   * It does no further checking or conversion. It does not parse dates. It 
does not do '%'
+   * transforms on URLs.
+   * 
+   * @param string An HTTP header string.
+   * @return A JSONObject containing the elements and attributes of the XML 
string.
+   * @throws JSONException
+   */
+  public static JSONObject toJSONObject(String string) throws JSONException {
+    JSONObject jo = new JSONObject();
+    HTTPTokener x = new HTTPTokener(string);
+    String token;
+
+    token = x.nextToken();
+    if (token.toUpperCase().startsWith("HTTP")) {
+
+      // Response
+
+      jo.put("HTTP-Version", token);
+      jo.put("Status-Code", x.nextToken());
+      jo.put("Reason-Phrase", x.nextTo('\0'));
+      x.next();
+
+    } else {
+
+      // Request
+
+      jo.put("Method", token);
+      jo.put("Request-URI", x.nextToken());
+      jo.put("HTTP-Version", x.nextToken());
+    }
+
+    // Fields
+
+    while (x.more()) {
+      String name = x.nextTo(':');
+      x.next(':');
+      jo.put(name, x.nextTo('\0'));
+      x.next();
+    }
+    return jo;
+  }
+
+
+  /**
+   * Convert a JSONObject into an HTTP header. A request header must contain
+   * 
+   * <pre>
+   * {
+   *    Method: "POST" (for example),
+   *    "Request-URI": "/" (for example),
+   *    "HTTP-Version": "HTTP/1.1" (for example)
+   * }
+   * </pre>
+   * 
+   * A response header must contain
+   * 
+   * <pre>
+   * {
+   *    "HTTP-Version": "HTTP/1.1" (for example),
+   *    "Status-Code": "200" (for example),
+   *    "Reason-Phrase": "OK" (for example)
+   * }
+   * </pre>
+   * 
+   * Any other members of the JSONObject will be output as HTTP fields. The 
result will end with two
+   * CRLF pairs.
+   * 
+   * @param jo A JSONObject
+   * @return An HTTP header string.
+   * @throws JSONException if the object does not contain enough information.
+   */
+  public static String toString(JSONObject jo) throws JSONException {
+    Iterator keys = jo.keys();
+    String string;
+    StringBuffer sb = new StringBuffer();
+    if (jo.has("Status-Code") && jo.has("Reason-Phrase")) {
+      sb.append(jo.getString("HTTP-Version"));
+      sb.append(' ');
+      sb.append(jo.getString("Status-Code"));
+      sb.append(' ');
+      sb.append(jo.getString("Reason-Phrase"));
+    } else if (jo.has("Method") && jo.has("Request-URI")) {
+      sb.append(jo.getString("Method"));
+      sb.append(' ');
+      sb.append('"');
+      sb.append(jo.getString("Request-URI"));
+      sb.append('"');
+      sb.append(' ');
+      sb.append(jo.getString("HTTP-Version"));
+    } else {
+      throw new JSONException("Not enough material for an HTTP header.");
+    }
+    sb.append(CRLF);
+    while (keys.hasNext()) {
+      string = keys.next().toString();
+      if (!"HTTP-Version".equals(string) && !"Status-Code".equals(string)
+          && !"Reason-Phrase".equals(string) && !"Method".equals(string)
+          && !"Request-URI".equals(string) && !jo.isNull(string)) {
+        sb.append(string);
+        sb.append(": ");
+        sb.append(jo.getString(string));
+        sb.append(CRLF);
+      }
+    }
+    sb.append(CRLF);
+    return sb.toString();
+  }
+}

http://git-wip-us.apache.org/repos/asf/geode/blob/0805036e/geode-json/src/main/java/org/json/HTTPTokener.java
----------------------------------------------------------------------
diff --git a/geode-json/src/main/java/org/json/HTTPTokener.java 
b/geode-json/src/main/java/org/json/HTTPTokener.java
new file mode 100755
index 0000000..72c9b88
--- /dev/null
+++ b/geode-json/src/main/java/org/json/HTTPTokener.java
@@ -0,0 +1,77 @@
+package org.json;
+
+/*
+ * Copyright (c) 2002 JSON.org
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a 
copy of this software and
+ * associated documentation files (the "Software"), to deal in the Software 
without restriction,
+ * including without limitation the rights to use, copy, modify, merge, 
publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to 
whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in 
all copies or
+ * substantial portions of the Software.
+ * 
+ * The Software shall be used for Good, not Evil.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 
PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 
OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 
THE SOFTWARE.
+ */
+
+/**
+ * The HTTPTokener extends the JSONTokener to provide additional methods for 
the parsing of HTTP
+ * headers.
+ * 
+ * @author JSON.org
+ * @version 2010-12-24
+ */
+public class HTTPTokener extends JSONTokener {
+
+  /**
+   * Construct an HTTPTokener from a string.
+   * 
+   * @param string A source string.
+   */
+  public HTTPTokener(String string) {
+    super(string);
+  }
+
+
+  /**
+   * Get the next token or string. This is used in parsing HTTP headers.
+   * 
+   * @throws JSONException
+   * @return A String.
+   */
+  public String nextToken() throws JSONException {
+    char c;
+    char q;
+    StringBuffer sb = new StringBuffer();
+    do {
+      c = next();
+    } while (Character.isWhitespace(c));
+    if (c == '"' || c == '\'') {
+      q = c;
+      for (;;) {
+        c = next();
+        if (c < ' ') {
+          throw syntaxError("Unterminated string.");
+        }
+        if (c == q) {
+          return sb.toString();
+        }
+        sb.append(c);
+      }
+    }
+    for (;;) {
+      if (c == 0 || Character.isWhitespace(c)) {
+        return sb.toString();
+      }
+      sb.append(c);
+      c = next();
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/geode/blob/0805036e/geode-json/src/main/java/org/json/JSON.java
----------------------------------------------------------------------
diff --git a/geode-json/src/main/java/org/json/JSON.java 
b/geode-json/src/main/java/org/json/JSON.java
deleted file mode 100755
index 1b32e69..0000000
--- a/geode-json/src/main/java/org/json/JSON.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed 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.json;
-
-class JSON {
-    /**
-     * Returns the input if it is a JSON-permissible value; throws otherwise.
-     */
-    static double checkDouble(double d) throws JSONException {
-        if (Double.isInfinite(d) || Double.isNaN(d)) {
-            throw new JSONException("Forbidden numeric value: " + d);
-        }
-        return d;
-    }
-
-    static Boolean toBoolean(Object value) {
-        if (value instanceof Boolean) {
-            return (Boolean) value;
-        } else if (value instanceof String) {
-            String stringValue = (String) value;
-            if ("true".equalsIgnoreCase(stringValue)) {
-                return true;
-            } else if ("false".equalsIgnoreCase(stringValue)) {
-                return false;
-            }
-        }
-        return null;
-    }
-
-    static Double toDouble(Object value) {
-        if (value instanceof Double) {
-            return (Double) value;
-        } else if (value instanceof Number) {
-            return ((Number) value).doubleValue();
-        } else if (value instanceof String) {
-            try {
-                return Double.valueOf((String) value);
-            } catch (NumberFormatException ignored) {
-            }
-        }
-        return null;
-    }
-
-    static Integer toInteger(Object value) {
-        if (value instanceof Integer) {
-            return (Integer) value;
-        } else if (value instanceof Number) {
-            return ((Number) value).intValue();
-        } else if (value instanceof String) {
-            try {
-                return (int) Double.parseDouble((String) value);
-            } catch (NumberFormatException ignored) {
-            }
-        }
-        return null;
-    }
-
-    static Long toLong(Object value) {
-        if (value instanceof Long) {
-            return (Long) value;
-        } else if (value instanceof Number) {
-            return ((Number) value).longValue();
-        } else if (value instanceof String) {
-            try {
-                return (long) Double.parseDouble((String) value);
-            } catch (NumberFormatException ignored) {
-            }
-        }
-        return null;
-    }
-
-    static String toString(Object value) {
-        if (value instanceof String) {
-            return (String) value;
-        } else if (value != null) {
-            return String.valueOf(value);
-        }
-        return null;
-    }
-
-    public static JSONException typeMismatch(Object indexOrName, Object actual,
-            String requiredType) throws JSONException {
-        if (actual == null) {
-            throw new JSONException("Value at " + indexOrName + " is null.");
-        } else {
-            throw new JSONException("Value " + actual + " at " + indexOrName
-                    + " of type " + actual.getClass().getName()
-                    + " cannot be converted to " + requiredType);
-        }
-    }
-
-    public static JSONException typeMismatch(Object actual, String 
requiredType)
-            throws JSONException {
-        if (actual == null) {
-            throw new JSONException("Value is null.");
-        } else {
-            throw new JSONException("Value " + actual
-                    + " of type " + actual.getClass().getName()
-                    + " cannot be converted to " + requiredType);
-        }
-    }
-}

Reply via email to