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> <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); - } - } -}