/*
* Copyright 2011 Edmunds.com, 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.edmunds.etm.common.impl;
import org.apache.commons.lang.Validate;
import org.apache.thrift.TBase;
import org.apache.thrift.TDeserializer;
import org.apache.thrift.TException;
import org.apache.thrift.TSerializer;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.springframework.stereotype.Component;
import java.io.IOException;
/**
* Provides serialization and deserialization of Thrift objects.
*
* @author Ryan Holmes
*/
@Component
public class ObjectSerializer {
TSerializer serializer = new TSerializer(new TBinaryProtocol.Factory());
private TDeserializer deserializer = new TDeserializer(new TBinaryProtocol.Factory());
/**
* Reads a value object from a byte array.
*
* @param src the byte array to read
* @param valueType the value object's Java class
* @param <T> value type
* @return deserialized object
* @throws java.io.IOException if deserialization failed
*/
public <T extends TBase> T readValue(byte[] src, Class<T> valueType) throws IOException {
Validate.notNull(src, "Source byte array is null");
Validate.notNull(valueType, "Value type is null");
T value;
try {
value = valueType.newInstance();
} catch (Exception e) {
String message = String.format("Unable to instantiate object of type %s", valueType.toString());
throw new IllegalArgumentException(message, e);
}
try {
deserializer.deserialize(value, src);
} catch (TException e) {
throw new IOException(e);
}
return value;
}
/**
* Writes a value object to a byte array.
*
* @param value the value object to write
* @return serialized byte array
* @throws java.io.IOException if serialization fails
*/
public byte[] writeValue(TBase value) throws IOException {
Validate.notNull(value, "Value object is null");
byte[] bytes;
try {
bytes = serializer.serialize(value);
} catch (TException e) {
throw new IOException(e);
}
return bytes;
}
}