Java tutorial
package TestGenerator.ArgumentCache; /** * Created by NatchaS on 10/7/16. */ /* * Copyright (C) 2011 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. */ import java.io.IOException; import java.lang.reflect.Array; import java.lang.reflect.GenericArrayType; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.IllegalFormatCodePointException; import java.util.List; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import com.google.gson.TypeAdapter; import com.google.gson.TypeAdapterFactory; import com.google.gson.internal.$Gson$Types; import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; /** * Adapt an array of objects. */ public final class UniversalArrayTypeAdapter<E> extends TypeAdapter<Object> { public static final TypeAdapterFactory FACTORY = new TypeAdapterFactory() { @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) { Type type = typeToken.getType(); if (!(type instanceof GenericArrayType || type instanceof Class && ((Class<?>) type).isArray())) { return null; } Type componentType = $Gson$Types.getArrayComponentType(type); TypeAdapter<?> componentTypeAdapter = gson.getAdapter(TypeToken.get(componentType)); TypeAdapter<JsonElement> jsonElementTypeAdapter = gson.getAdapter(JsonElement.class); return new UniversalArrayTypeAdapter(gson, componentTypeAdapter, $Gson$Types.getRawType(componentType), jsonElementTypeAdapter); } }; private final Class<E> componentType; private final TypeAdapter<E> componentTypeAdapter; private final TypeAdapter<JsonElement> jsonElementAdapter; private final Gson context; public UniversalArrayTypeAdapter(Gson context, TypeAdapter<E> componentTypeAdapter, Class<E> componentType, TypeAdapter<JsonElement> jsonElementTypeAdapter) { this.componentTypeAdapter = new UniversalTypeAdapterRuntimeTypeWrapper<E>(context, componentTypeAdapter, componentType); this.context = context; this.componentType = componentType; jsonElementAdapter = jsonElementTypeAdapter; } @SuppressWarnings("unchecked") @Override public void write(JsonWriter out, Object array) throws IOException { out.setLenient(true); if (array == null) { out.nullValue(); return; } out.beginArray(); for (int i = 0, length = Array.getLength(array); i < length; i++) { E value = (E) Array.get(array, i); componentTypeAdapter.write(out, value); } out.endArray(); } @Override public Object read(JsonReader in) throws IOException { if (in.peek() == JsonToken.NULL) { in.nextNull(); return null; } List<E> list = new ArrayList<E>(); in.beginArray(); while (in.hasNext()) { // E instance = componentTypeAdapter.read(in); // old code replacing below block E instance = null; JsonElement je = this.jsonElementAdapter.read(in); if (je.isJsonObject() && je.getAsJsonObject().has(UniversalTypeAdapterFactory.class_token)) { try { Class clazz = Class.forName( je.getAsJsonObject().get(UniversalTypeAdapterFactory.class_token).getAsString()); TypeAdapter newAdapter = context.getAdapter(clazz); instance = (E) newAdapter.fromJsonTree(je); } catch (ClassNotFoundException e) { e.printStackTrace(); } } else { instance = componentTypeAdapter.fromJsonTree(je); } list.add(instance); } in.endArray(); Object array = Array.newInstance(componentType, list.size()); for (int i = 0; i < list.size(); i++) { Array.set(array, i, list.get(i)); } return array; } }