/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.util.fudgemsg;
import java.lang.reflect.Constructor;
import org.fudgemsg.FudgeMsg;
import org.fudgemsg.MutableFudgeMsg;
import org.fudgemsg.mapping.FudgeBuilder;
import org.fudgemsg.mapping.FudgeDeserializer;
import org.fudgemsg.mapping.FudgeSerializer;
import org.fudgemsg.mapping.GenericFudgeBuilderFor;
/**
* Fudge builder for {@code Exception}.
*/
@GenericFudgeBuilderFor(Exception.class)
public final class ExceptionFudgeBuilder extends AbstractFudgeBuilder implements FudgeBuilder<Exception> {
/** Field name. */
public static final String TYPE_FIELD_NAME = "type";
/** Field name. */
public static final String MESSAGE_FIELD_NAME = "message";
//-------------------------------------------------------------------------
@Override
public MutableFudgeMsg buildMessage(FudgeSerializer serializer, Exception object) {
final MutableFudgeMsg msg = serializer.newMessage();
toFudgeMsg(serializer, object, msg);
return msg;
}
public static MutableFudgeMsg toFudgeMsg(final FudgeSerializer serializer, final Exception object) {
if (object == null) {
return null;
}
final MutableFudgeMsg msg = serializer.newMessage();
toFudgeMsg(serializer, object, msg);
return msg;
}
public static void toFudgeMsg(final FudgeSerializer serializer, final Exception object, final MutableFudgeMsg msg) {
msg.add(TYPE_FIELD_NAME, object.getClass().getName());
msg.add(MESSAGE_FIELD_NAME, object.getMessage());
}
//-------------------------------------------------------------------------
@Override
public Exception buildObject(final FudgeDeserializer deserializer, final FudgeMsg msg) {
return fromFudgeMsg(deserializer, msg);
}
@SuppressWarnings("unchecked")
public static Exception fromFudgeMsg(final FudgeDeserializer deserializer, final FudgeMsg msg) {
if (msg == null) {
return null;
}
String type = msg.getString(TYPE_FIELD_NAME);
String message = msg.getString(MESSAGE_FIELD_NAME);
try {
Class<? extends Exception> exceptionType = (Class<? extends Exception>) Class.forName(type);
Constructor<? extends Exception> messageConstructor = exceptionType.getConstructor(String.class);
return messageConstructor.newInstance(message);
} catch (Exception e) {
return new Exception(message);
}
}
}