| /* | 
|  * Copyright (C) 2010 Google Inc. | 
|  * | 
|  * 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 cn.emay.sdk.util.json.gson.internal; | 
|   | 
| import java.io.EOFException; | 
| import java.io.IOException; | 
| import java.io.Writer; | 
|   | 
| import cn.emay.sdk.util.json.gson.JsonElement; | 
| import cn.emay.sdk.util.json.gson.JsonIOException; | 
| import cn.emay.sdk.util.json.gson.JsonNull; | 
| import cn.emay.sdk.util.json.gson.JsonParseException; | 
| import cn.emay.sdk.util.json.gson.JsonSyntaxException; | 
| import cn.emay.sdk.util.json.gson.internal.bind.TypeAdapters; | 
| import cn.emay.sdk.util.json.gson.stream.JsonReader; | 
| import cn.emay.sdk.util.json.gson.stream.JsonWriter; | 
| import cn.emay.sdk.util.json.gson.stream.MalformedJsonException; | 
|   | 
| /** | 
|  * Reads and writes GSON parse trees over streams. | 
|  */ | 
| public final class Streams { | 
|     private Streams() { | 
|         throw new UnsupportedOperationException(); | 
|     } | 
|   | 
|     /** | 
|      * Takes a reader in any state and returns the next value as a JsonElement. | 
|      */ | 
|     public static JsonElement parse(JsonReader reader) throws JsonParseException { | 
|         boolean isEmpty = true; | 
|         try { | 
|             reader.peek(); | 
|             isEmpty = false; | 
|             return TypeAdapters.JSON_ELEMENT.read(reader); | 
|         } catch (EOFException e) { | 
|             /* | 
|              * For compatibility with JSON 1.5 and earlier, we return a JsonNull for empty | 
|              * documents instead of throwing. | 
|              */ | 
|             if (isEmpty) { | 
|                 return JsonNull.INSTANCE; | 
|             } | 
|             // The stream ended prematurely so it is likely a syntax error. | 
|             throw new JsonSyntaxException(e); | 
|         } catch (MalformedJsonException e) { | 
|             throw new JsonSyntaxException(e); | 
|         } catch (IOException e) { | 
|             throw new JsonIOException(e); | 
|         } catch (NumberFormatException e) { | 
|             throw new JsonSyntaxException(e); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * Writes the JSON element to the writer, recursively. | 
|      */ | 
|     public static void write(JsonElement element, JsonWriter writer) throws IOException { | 
|         TypeAdapters.JSON_ELEMENT.write(writer, element); | 
|     } | 
|   | 
|     @SuppressWarnings("resource") | 
|     public static Writer writerForAppendable(Appendable appendable) { | 
|         return appendable instanceof Writer ? (Writer) appendable : new AppendableWriter(appendable); | 
|     } | 
|   | 
|     /** | 
|      * Adapts an {@link Appendable} so it can be passed anywhere a {@link Writer} is | 
|      * used. | 
|      */ | 
|     private static final class AppendableWriter extends Writer { | 
|         private final Appendable appendable; | 
|         private final CurrentWrite currentWrite = new CurrentWrite(); | 
|   | 
|         AppendableWriter(Appendable appendable) { | 
|             this.appendable = appendable; | 
|         } | 
|   | 
|         @Override | 
|         public void write(char[] chars, int offset, int length) throws IOException { | 
|             currentWrite.chars = chars; | 
|             appendable.append(currentWrite, offset, offset + length); | 
|         } | 
|   | 
|         @Override | 
|         public void write(int i) throws IOException { | 
|             appendable.append((char) i); | 
|         } | 
|   | 
|         @Override | 
|         public void flush() { | 
|         } | 
|   | 
|         @Override | 
|         public void close() { | 
|         } | 
|   | 
|         /** | 
|          * A mutable char sequence pointing at a single char[]. | 
|          */ | 
|         static class CurrentWrite implements CharSequence { | 
|             char[] chars; | 
|   | 
|             public int length() { | 
|                 return chars.length; | 
|             } | 
|   | 
|             public char charAt(int i) { | 
|                 return chars[i]; | 
|             } | 
|   | 
|             public CharSequence subSequence(int start, int end) { | 
|                 return new String(chars, start, end - start); | 
|             } | 
|         } | 
|     } | 
|   | 
| } |