/* * Copyright (C) 2016 TIBCO Jaspersoft Corporation. All rights reserved. * http://community.jaspersoft.com/project/mobile-sdk-android * * Unless you have purchased a commercial license agreement from TIBCO Jaspersoft, * the following license terms apply: * * This program is part of TIBCO Jaspersoft Mobile SDK for Android. * * TIBCO Jaspersoft Mobile SDK is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * TIBCO Jaspersoft Mobile SDK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with TIBCO Jaspersoft Mobile SDK for Android. If not, see * <http://www.gnu.org/licenses/lgpl>. */ package com.jaspersoft.android.sdk.network.entity.type; import com.google.gson.*; import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import com.jaspersoft.android.sdk.network.entity.dashboard.DashboardComponentCollection; import com.jaspersoft.android.sdk.network.entity.dashboard.InputControlDashboardComponent; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * @author Tom Koptel * @since 2.3 */ final class DashboardComponentTypeAdapterFactory implements TypeAdapterFactory { @Override @SuppressWarnings("unchecked") public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { if (type.getRawType() == DashboardComponentCollection.class) { return (TypeAdapter<T>) customizeMyClassAdapter(gson, (TypeToken<DashboardComponentCollection>) type); } return null; } private TypeAdapter<DashboardComponentCollection> customizeMyClassAdapter(final Gson gson, TypeToken<DashboardComponentCollection> type) { final TypeAdapter<DashboardComponentCollection> delegate = gson.getDelegateAdapter(this, type); final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class); return new TypeAdapter<DashboardComponentCollection>() { @Override public void write(JsonWriter out, DashboardComponentCollection value) throws IOException { delegate.toJsonTree(value); } @Override public DashboardComponentCollection read(JsonReader in) throws IOException { JsonElement tree = elementAdapter.read(in); return adaptComponent(tree, gson); } }; } private DashboardComponentCollection adaptComponent(JsonElement tree, Gson gson) { JsonArray array = tree.getAsJsonArray(); List<InputControlDashboardComponent> components = new ArrayList<>(array.size()); for (int i = 0, size = array.size(); i < size; i++) { JsonObject object = array.get(i).getAsJsonObject(); InputControlDashboardComponent component = getIcsComponent(gson, object); if (component != null) { components.add(component); } } return new DashboardComponentCollection(components); } private InputControlDashboardComponent getIcsComponent(Gson gson, JsonObject object) { String type = object.get("type").getAsString(); if ("inputControl".equals(type)) { return gson.fromJson(object, InputControlDashboardComponent.class); } return null; } }