____ _ _______ __
/ __ \ | /| / / __/ |/ /
/ /_/ / |/ |/ / _// /
\____/|__/|__/___/_||_/
owenclave / app/src/main/java/io/nekohasekai/sagernet/fmt/gson/JsonLazyAdapter.java
/******************************************************************************
* *
* Copyright (C) 2021 by nekohasekai *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program 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 General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see . *
* *
******************************************************************************/
package io.nekohasekai.sagernet.fmt.gson;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;
public class JsonLazyAdapter extends TypeAdapter> {
private final Gson gson;
private final Class> clazz;
public JsonLazyAdapter(Gson gson, Class> clazz) {
this.gson = gson;
this.clazz = clazz;
}
@Override
public void write(JsonWriter out, JsonLazyInterface value) throws IOException {
if (value == null) {
out.nullValue();
} else {
gson.getAdapter(value.type.getValue()).write(out, value.getValue());
}
}
@Override
public JsonLazyInterface read(JsonReader in) throws IOException {
if (in.peek() == JsonToken.NULL) {
in.nextNull();
return null;
}
try {
JsonLazyInterface instance = clazz.newInstance();
instance.gson = gson;
instance.content = gson.getAdapter(JsonElement.class).read(in);
return instance;
} catch (Exception e) {
if (e instanceof IOException) {
throw ((IOException) e);
} else {
throw new IOException(e);
}
}
}
}