package com.devicehive.json.adapters;
/*
* #%L
* DeviceHive Common Dao Interfaces
* %%
* Copyright (C) 2016 DataArt
* %%
* 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.
* #L%
*/
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Optional;
public class OptionalAdapterFactory implements TypeAdapterFactory {
@Override
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
if (!Optional.class.isAssignableFrom(type.getRawType())) {
return null;
}
ParameterizedType parameterizedType = (ParameterizedType) type.getType();
Type internalType = parameterizedType.getActualTypeArguments()[0];
/**
* Cast is checked since we check is the class assignable from type T
*/
@SuppressWarnings("unchecked")
TypeAdapter<T> result = (TypeAdapter<T>) new OptionalWrapperAdapter(gson, internalType);
return result;
}
private static class OptionalWrapperAdapter extends TypeAdapter<Optional<?>> {
private Type internalType;
private Gson gson;
private OptionalWrapperAdapter(Gson gson, Type internalType) {
this.gson = gson;
this.internalType = internalType;
}
@Override
public void write(JsonWriter out, Optional<?> value) throws IOException {
if (value != null && value.isPresent()) {
gson.toJson(value.get(), internalType, out);
} else {
out.nullValue();
}
}
@Override
public Optional<?> read(JsonReader in) throws IOException {
return Optional.ofNullable(gson.fromJson(in, internalType));
}
}
}