/*
* 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.UserAddressInfo;
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>UserAddressInfoSerializer</code> class is a sub-type of {@link NFTypeSerializer} for the root example model type {@link UserAddressInfo}
*
* @author Regunath B
* @version 1.0, 27 Feb 2014
*/
public class UserAddressInfoSerializer extends NFTypeSerializer<UserAddressInfo> {
/** The ObjectMapper to use for JSON (de)serialization of {@link UserAddressInfo#getPreferences()}*/
private ObjectMapper objectMapper = new ObjectMapper();
/**
* Constructor for this class
*/
public UserAddressInfoSerializer() {
super(UserAddressInfo.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("account_id",FieldType.STRING),
field("first_name",FieldType.STRING),
field("last_name",FieldType.STRING),
field("address_line1",FieldType.STRING),
field("address_line2",FieldType.STRING),
field("landmark",FieldType.STRING),
field("city",FieldType.STRING),
field("state",FieldType.STRING),
field("state_code",FieldType.STRING),
field("country",FieldType.STRING),
field("pincode",FieldType.STRING),
field("phone",FieldType.STRING),
field("guest",FieldType.BOOLEAN),
field("active",FieldType.BOOLEAN),
field("version",FieldType.INT),
field("creation_date",FieldType.STRING),
field("last_modified",FieldType.STRING),
field("creating_system",FieldType.STRING),
field("preferences", "MapOfPreferences")
);
}
/**
* Deserializes a UserAddressInfo instance from the specified NFDeserializationRecord
* @see com.netflix.zeno.serializer.NFTypeSerializer#doDeserialize(com.netflix.zeno.serializer.NFDeserializationRecord)
*/
protected UserAddressInfo doDeserialize(NFDeserializationRecord record) {
String id = deserializePrimitiveString(record, "id");
String account_id = deserializePrimitiveString(record, "account_id");
String first_name = deserializePrimitiveString(record, "first_name");
String last_name = deserializePrimitiveString(record, "last_name");
String address_line1 = deserializePrimitiveString(record, "address_line1");
String address_line2 = deserializePrimitiveString(record, "address_line2");
String landmark = deserializePrimitiveString(record, "landmark");
String city = deserializePrimitiveString(record, "city");
String state = deserializePrimitiveString(record, "state");
String state_code = deserializePrimitiveString(record, "id");
String country = deserializePrimitiveString(record, "country");
String pincode = deserializePrimitiveString(record, "pincode");
String phone = deserializePrimitiveString(record, "phone");
boolean guest = deserializeBoolean(record, "guest");
boolean active = deserializeBoolean(record, "active");
int version = deserializeInteger(record, "version");
String creation_date = deserializePrimitiveString(record, "creation_date");
String last_modified = deserializePrimitiveString(record, "last_modified");
String creating_system = deserializePrimitiveString(record, "creating_system");
Map<String,Object> preferences = deserializeObject(record, "preferences");
return new UserAddressInfo(id,account_id,first_name,last_name, address_line1, address_line2,landmark,city,state,state_code,
country,pincode,phone,guest,active,version,creation_date,last_modified,creating_system,preferences);
}
/**
* Serializes the specified UserAddressInfo object into the specified NFSerializationRecord
* @see com.netflix.zeno.serializer.NFTypeSerializer#doSerialize(java.lang.Object, com.netflix.zeno.serializer.NFSerializationRecord)
*/
public void doSerialize(UserAddressInfo userAddressInfo, NFSerializationRecord record) {
serializePrimitive(record, "id", userAddressInfo.getId());
serializePrimitive(record, "account_id", userAddressInfo.getAccount_id());
serializeObject(record, "preferences", userAddressInfo.getPreferences());
serializePrimitive(record, "first_name", userAddressInfo.getFirst_name());
serializePrimitive(record, "last_name", userAddressInfo.getLast_name());
serializePrimitive(record, "address_line1", userAddressInfo.getAddress_line1());
serializePrimitive(record, "address_line2", userAddressInfo.getAddress_line2());
serializePrimitive(record, "landmark", userAddressInfo.getLandmark());
serializePrimitive(record, "city", userAddressInfo.getCity());
serializePrimitive(record, "state", userAddressInfo.getState());
serializePrimitive(record, "state_code", userAddressInfo.getState_code());
serializePrimitive(record, "country", userAddressInfo.getCountry());
serializePrimitive(record, "pincode", userAddressInfo.getPincode());
serializePrimitive(record, "phone", userAddressInfo.getPhone());
serializePrimitive(record, "guest", userAddressInfo.isGuest());
serializePrimitive(record, "active", userAddressInfo.isActive());
serializePrimitive(record, "version", userAddressInfo.getVersion());
serializePrimitive(record, "creation_date", userAddressInfo.getCreation_date());
serializePrimitive(record, "last_modified", userAddressInfo.getLast_modified());
serializePrimitive(record, "creating_system", userAddressInfo.getCreating_system());
if (userAddressInfo.getPreferences() != null) {
Map<String,String> preferencesAsStringMap = new HashMap<String, String>();
Iterator<String> iterator = userAddressInfo.getPreferences().keySet().iterator();
while(iterator.hasNext()) {
String key = iterator.next();
try {
preferencesAsStringMap.put(key, objectMapper.writer().writeValueAsString(userAddressInfo.getPreferences().get(key)));
} catch (Exception e) {
throw new SerializationFailedException("Serialization failed for userAddressInfo.getPreferences().get(key). Error is : " + e.getMessage(), e);
}
}
serializeObject(record, "preferences", preferencesAsStringMap);
}
}
/**
* 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>("MapOfPreferences", new StringSerializer(), new StringSerializer())
);
}
}