/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.fudgemsg;
import org.fudgemsg.FudgeField;
import org.fudgemsg.FudgeMsg;
import org.fudgemsg.MutableFudgeMsg;
import org.fudgemsg.mapping.FudgeBuilderFor;
import org.fudgemsg.mapping.FudgeDeserializer;
import org.fudgemsg.mapping.FudgeObjectBuilder;
import org.fudgemsg.mapping.FudgeSerializer;
import org.fudgemsg.types.IndicatorType;
import org.fudgemsg.wire.types.FudgeWireType;
import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.analytics.util.serialization.InvokedSerializedForm;
import com.opengamma.util.ClassUtils;
/**
* Fudge builders for alternative serialized forms of objects.
*/
/* package */final class SerializedForm {
private SerializedForm() {
}
/**
* Fudge builder for {@link InvokedSerializedForm}
*/
@FudgeBuilderFor(InvokedSerializedForm.class)
public static final class InvokedSerializedFormBuilder extends AbstractFudgeMessageBuilder<InvokedSerializedForm> implements FudgeObjectBuilder<Object> {
@Override
protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final InvokedSerializedForm object) {
if (object.getOuterClass() != null) {
message.add(null, null, object.getOuterClass().getName());
} else {
serializer.addToMessageWithClassHeaders(message, null, null, substituteObject(object.getOuterInstance()));
}
if (object.getParameters().length == 0) {
message.add(object.getMethod(), null, IndicatorType.INSTANCE);
} else {
final MutableFudgeMsg parameters = serializer.newMessage();
for (final Object parameter : object.getParameters()) {
serializer.addToMessageWithClassHeaders(parameters, null, null, substituteObject(parameter));
}
message.add(object.getMethod(), null, parameters);
}
}
@Override
public Object buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
Object outer = null;
String method = null;
Object[] parameters = null;
for (final FudgeField field : message) {
if (field.getName() == null) {
if (field.getOrdinal() == null) {
if (field.getValue() instanceof String) {
outer = ClassUtils.loadClassRuntime((String) field.getValue());
} else {
outer = deserializer.fieldValueToObject(field);
}
}
} else {
switch (field.getType().getTypeId()) {
case FudgeWireType.SUB_MESSAGE_TYPE_ID: {
if (method != null) {
throw new IllegalStateException("Parameters already set from " + method);
}
method = field.getName();
final FudgeMsg params = (FudgeMsg) field.getValue();
parameters = new Object[params.getNumFields()];
int i = 0;
for (final FudgeField param : params) {
parameters[i++] = deserializer.fieldValueToObject(param);
}
break;
}
case FudgeWireType.INDICATOR_TYPE_ID:
method = field.getName();
break;
}
}
}
if (outer == null) {
throw new IllegalArgumentException("Message did not contain an outer object");
}
if (method == null) {
throw new IllegalArgumentException("Message did not contain an invocation reference");
}
final InvokedSerializedForm isr;
if (parameters != null) {
isr = new InvokedSerializedForm(outer, method, parameters);
} else {
isr = new InvokedSerializedForm(outer, method);
}
return isr.readReplace();
}
}
}