/*
* Copyright 2012-2015, the original author or authors.
*
* 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.flipkart.aesop.serializer.serializers;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.core.serializer.support.SerializationFailedException;
import com.flipkart.aesop.serializer.model.UserPreferencesInfo;
import com.netflix.zeno.fastblob.record.schema.FastBlobSchema;
import com.netflix.zeno.fastblob.record.schema.FastBlobSchema.FieldType;
import com.netflix.zeno.serializer.NFDeserializationRecord;
import com.netflix.zeno.serializer.NFSerializationRecord;
import com.netflix.zeno.serializer.NFTypeSerializer;
import com.netflix.zeno.serializer.common.MapSerializer;
import com.netflix.zeno.serializer.common.StringSerializer;
/**
* The <code>UserPreferencesInfoSerializer</code> class is a sub-type of {@link NFTypeSerializer} for the root example model type {@link UserPreferencesInfo}
*
* @author Regunath B
* @version 1.0, 28 Feb 2014
*/
public class UserPreferencesInfoSerializer extends NFTypeSerializer<UserPreferencesInfo> {
/** The ObjectMapper to use for JSON (de)serialization of {@link UserPreferencesInfo#getValue()}*/
private ObjectMapper objectMapper = new ObjectMapper();
/**
* Constructor for this class
*/
public UserPreferencesInfoSerializer() {
super(UserPreferencesInfo.class.getName());
}
/**
* Creates a schema describing the type serialized by this serializer
* @see com.netflix.zeno.serializer.NFTypeSerializer#createSchema()
*/
protected FastBlobSchema createSchema() {
return schema(
field("id",FieldType.STRING),
field("preferences_name",FieldType.STRING),
field("value", "MapOfValue"),
field("version",FieldType.INT),
field("last_modified",FieldType.STRING)
);
}
/**
* Deserializes a UserPreferencesInfo instance from the specified NFDeserializationRecord
* @see com.netflix.zeno.serializer.NFTypeSerializer#doDeserialize(com.netflix.zeno.serializer.NFDeserializationRecord)
*/
protected UserPreferencesInfo doDeserialize(NFDeserializationRecord record) {
String id = deserializePrimitiveString(record, "id");
String preferences_name = deserializePrimitiveString(record, "preferences_name");
Map<String,String> valueAsStringMap = deserializeObject(record, "value");
Map<String,Object> value = new HashMap<String, Object>();
Iterator<String> iterator = valueAsStringMap.keySet().iterator();
while(iterator.hasNext()) {
String key = iterator.next();
try {
value.put(key, objectMapper.readValue(valueAsStringMap.get(key), Object.class));
} catch (Exception e) {
throw new SerializationFailedException("Serialization failed for userPreferencesInfo.getValue().get(key). Error is : " + e.getMessage(), e);
}
}
int version = deserializeInteger(record,"version");
String last_modified = deserializePrimitiveString(record, "last_modified");
return new UserPreferencesInfo(id, preferences_name,value,version, last_modified);
}
/**
* Serializes the specified UserPreferencesInfo object into the specified NFSerializationRecord
* @see com.netflix.zeno.serializer.NFTypeSerializer#doSerialize(java.lang.Object, com.netflix.zeno.serializer.NFSerializationRecord)
*/
public void doSerialize(UserPreferencesInfo userPreferencesInfo, NFSerializationRecord record) {
serializePrimitive(record, "id", userPreferencesInfo.getId());
serializePrimitive(record, "preferences_name", userPreferencesInfo.getPreferences_name());
if (userPreferencesInfo.getValue() != null) {
Map<String,String> valueAsStringMap = new HashMap<String, String>();
Iterator<String> iterator = userPreferencesInfo.getValue().keySet().iterator();
while(iterator.hasNext()) {
String key = iterator.next();
try {
valueAsStringMap.put(key, objectMapper.writer().writeValueAsString(userPreferencesInfo.getValue().get(key)));
} catch (Exception e) {
throw new SerializationFailedException("Serialization failed for userPreferencesInfo.getValue().get(key). Error is : " + e.getMessage(), e);
}
}
serializeObject(record, "value", valueAsStringMap);
}
serializePrimitive(record, "version", userPreferencesInfo.getVersion());
serializePrimitive(record, "last_modified", userPreferencesInfo.getLast_modified());
}
/**
* Returns a Collection of serializers required for referenced types
* @see com.netflix.zeno.serializer.NFTypeSerializer#requiredSubSerializers()
*/
public Collection<NFTypeSerializer<?>> requiredSubSerializers() {
return serializers(
new MapSerializer<String,String>("MapOfValue", new StringSerializer(), new StringSerializer())
);
}
}