/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.fudgemsg;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.fudgemsg.FudgeField;
import org.fudgemsg.FudgeMsg;
import org.fudgemsg.MutableFudgeMsg;
import org.fudgemsg.mapping.FudgeBuilder;
import org.fudgemsg.mapping.FudgeBuilderFor;
import org.fudgemsg.mapping.FudgeDeserializer;
import org.fudgemsg.mapping.FudgeSerializer;
import com.opengamma.financial.analytics.curve.exposure.ExposureFunctions;
import com.opengamma.id.ExternalId;
import com.opengamma.id.UniqueId;
import com.opengamma.id.UniqueIdFudgeBuilder;
/**
* Fudge builder for {@link ExposureFunctions}
*/
@FudgeBuilderFor(ExposureFunctions.class)
public class ExposureFunctionsBuilder implements FudgeBuilder<ExposureFunctions> {
/** The name field */
private static final String NAME_FIELD = "name";
/** The exposure function name field */
private static final String EXPOSURE_FUNCTION_FIELD = "exposureFunction";
/** The external id field */
private static final String EXTERNAL_ID_FIELD = "id";
/** The curve construction configuration name field */
private static final String CONFIGURATION_FIELD = "configuration";
/** The unique id field */
private static final String UNIQUE_ID_FIELD = "uniqueId";
@Override
public MutableFudgeMsg buildMessage(final FudgeSerializer serializer, final ExposureFunctions object) {
final MutableFudgeMsg message = serializer.newMessage();
message.add(null, 0, object.getClass().getName());
message.add(NAME_FIELD, object.getName());
for (final String exposureFunction : object.getExposureFunctions()) {
message.add(EXPOSURE_FUNCTION_FIELD, exposureFunction);
}
for (final Map.Entry<ExternalId, String> entry : object.getIdsToNames().entrySet()) {
serializer.addToMessage(message, EXTERNAL_ID_FIELD, null, entry.getKey());
message.add(CONFIGURATION_FIELD, entry.getValue());
}
if (object.getUniqueId() != null) {
message.add(UNIQUE_ID_FIELD, null, UniqueIdFudgeBuilder.toFudgeMsg(serializer, object.getUniqueId()));
}
return message;
}
@Override
public ExposureFunctions buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
final String name = message.getString(NAME_FIELD);
final List<String> exposureFunctions = new ArrayList<>();
final List<FudgeField> exposureFunctionsFields = message.getAllByName(EXPOSURE_FUNCTION_FIELD);
for (final FudgeField field : exposureFunctionsFields) {
exposureFunctions.add((String) field.getValue());
}
final Map<ExternalId, String> idsToNames = new HashMap<>();
final List<FudgeField> idsFields = message.getAllByName(EXTERNAL_ID_FIELD);
final List<FudgeField> namesFields = message.getAllByName(CONFIGURATION_FIELD);
final int n = idsFields.size();
if (namesFields.size() != n) {
throw new IllegalStateException("Should have one configuration name per external id");
}
for (int i = 0; i < n; i++) {
final ExternalId id = deserializer.fieldValueToObject(ExternalId.class, idsFields.get(i));
final String configuration = (String) namesFields.get(i).getValue();
idsToNames.put(id, configuration);
}
final ExposureFunctions functions = new ExposureFunctions(name, exposureFunctions, idsToNames);
final FudgeField uniqueId = message.getByName(UNIQUE_ID_FIELD);
if (uniqueId != null) {
functions.setUniqueId(deserializer.fieldValueToObject(UniqueId.class, uniqueId));
}
return functions;
}
}