/*
* 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.
*/
package com.smartandroid.sa.json;
import java.io.IOException;
import java.lang.reflect.Type;
import com.smartandroid.sa.json.internal.Streams;
import com.smartandroid.sa.json.internal.bind.MiniGson;
import com.smartandroid.sa.json.internal.bind.TypeAdapter;
import com.smartandroid.sa.json.reflect.TypeToken;
import com.smartandroid.sa.json.stream.JsonReader;
import com.smartandroid.sa.json.stream.JsonWriter;
final class GsonToMiniGsonTypeAdapter implements TypeAdapter.Factory {
private final ParameterizedTypeHandlerMap<JsonSerializer<?>> serializers;
private final ParameterizedTypeHandlerMap<JsonDeserializer<?>> deserializers;
private final boolean serializeNulls;
GsonToMiniGsonTypeAdapter(
ParameterizedTypeHandlerMap<JsonSerializer<?>> serializers,
ParameterizedTypeHandlerMap<JsonDeserializer<?>> deserializers,
boolean serializeNulls) {
this.serializers = serializers;
this.deserializers = deserializers;
this.serializeNulls = serializeNulls;
}
public <T> TypeAdapter<T> create(final MiniGson miniGson, TypeToken<T> type) {
final Type typeOfT = type.getType();
final JsonSerializer serializer = serializers.getHandlerFor(typeOfT,
false);
final JsonDeserializer deserializer = deserializers.getHandlerFor(
typeOfT, false);
if (serializer == null && deserializer == null) {
return null;
}
return new TypeAdapter() {
@Override
public Object read(JsonReader reader) throws IOException {
if (deserializer == null) {
// TODO: handle if deserializer is null
throw new UnsupportedOperationException();
}
return deserializer.deserialize(Streams.parse(reader), typeOfT,
createDeserializationContext(miniGson));
}
@Override
public void write(JsonWriter writer, Object value)
throws IOException {
if (serializer == null) {
// TODO: handle if serializer is null
throw new UnsupportedOperationException();
}
if (value == null) {
writer.nullValue();
return;
}
JsonElement element = serializer.serialize(value, typeOfT,
createSerializationContext(miniGson));
Streams.write(element, serializeNulls, writer);
}
};
}
public JsonSerializationContext createSerializationContext(
final MiniGson miniGson) {
return new JsonSerializationContext() {
@Override
JsonElement serialize(Object src, Type typeOfSrc,
boolean preserveType, boolean defaultOnly) {
TypeToken typeToken = TypeToken.get(typeOfSrc);
return miniGson.getAdapter(typeToken).toJsonElement(src);
}
};
}
public JsonDeserializationContext createDeserializationContext(
final MiniGson miniGson) {
return new JsonDeserializationContext() {
@Override
public <T> T deserialize(JsonElement json, Type typeOfT)
throws JsonParseException {
TypeToken typeToken = TypeToken.get(typeOfT);
return (T) miniGson.getAdapter(typeToken).fromJsonElement(json);
}
};
}
}