/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.integration.marketdata.manipulator.dsl;
import java.util.Set;
import java.util.regex.Pattern;
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.google.common.collect.Sets;
@FudgeBuilderFor(VolatilitySurfaceSelector.class)
public class VolatilitySurfaceSelectorFudgeBuilder implements FudgeBuilder<VolatilitySurfaceSelector> {
/** Field name for Fudge message. */
private static final String CALC_CONFIG_NAMES = "calcConfigNames";
/** Field name for Fudge message. */
private static final String NAMES = "names";
/** Field name for Fudge message. */
private static final String INSTRUMENT_TYPES = "instrumentTypes";
/** Field name for Fudge message. */
private static final String QUOTE_TYPES = "quoteTypes";
/** Field name for Fudge message. */
private static final String QUOTE_UNITS = "quoteUnits";
/** Field name for Fudge message. */
private static final String NAME_MATCH_PATTERN = "nameMatchPattern";
/** Field name for Fudge message. */
private static final String NAME_LIKE_PATTERN = "nameLikePattern";
@Override
public MutableFudgeMsg buildMessage(FudgeSerializer serializer, VolatilitySurfaceSelector selector) {
MutableFudgeMsg msg = serializer.newMessage();
addSetToMessage(serializer, msg, CALC_CONFIG_NAMES, selector.getCalcConfigNames());
addSetToMessage(serializer, msg, NAMES, selector.getNames());
addSetToMessage(serializer, msg, INSTRUMENT_TYPES, selector.getInstrumentTypes());
addSetToMessage(serializer, msg, QUOTE_TYPES, selector.getQuoteTypes());
addSetToMessage(serializer, msg, QUOTE_UNITS, selector.getQuoteUnits());
if (selector.getNameMatchPattern() != null) {
serializer.addToMessage(msg, NAME_MATCH_PATTERN, null, selector.getNameMatchPattern().pattern());
}
if (selector.getNameLikePattern() != null) {
serializer.addToMessage(msg, NAME_LIKE_PATTERN, null, selector.getNameLikePattern().pattern());
}
return msg;
}
@Override
public VolatilitySurfaceSelector buildObject(FudgeDeserializer deserializer, FudgeMsg msg) {
Set<String> calcConfigNames = buildStringSet(deserializer, msg.getMessage(CALC_CONFIG_NAMES));
Set<String> names = buildStringSet(deserializer, msg.getMessage(NAMES));
Set<String> instrumentTypes = buildStringSet(deserializer, msg.getMessage(INSTRUMENT_TYPES));
Set<String> quoteTypes = buildStringSet(deserializer, msg.getMessage(QUOTE_TYPES));
Set<String> quoteUnits = buildStringSet(deserializer, msg.getMessage(QUOTE_UNITS));
Pattern nameMatchPattern;
if (msg.hasField(NAME_MATCH_PATTERN)) {
String nameMatchStr = deserializer.fieldValueToObject(String.class, msg.getByName(NAME_MATCH_PATTERN));
nameMatchPattern = Pattern.compile(nameMatchStr);
} else {
nameMatchPattern = null;
}
Pattern nameLikePattern;
if (msg.hasField(NAME_LIKE_PATTERN)) {
String nameLikeStr = deserializer.fieldValueToObject(String.class, msg.getByName(NAME_LIKE_PATTERN));
nameLikePattern = Pattern.compile(nameLikeStr);
} else {
nameLikePattern = null;
}
return new VolatilitySurfaceSelector(calcConfigNames, names, nameMatchPattern, nameLikePattern, instrumentTypes, quoteTypes, quoteUnits);
}
private void addSetToMessage(FudgeSerializer serializer, MutableFudgeMsg msg, String fieldName, Set<String> strs) {
if (strs == null) {
return;
}
MutableFudgeMsg setMsg = serializer.newMessage();
for (String str : strs) {
serializer.addToMessage(setMsg, null, null, str);
}
serializer.addToMessage(msg, fieldName, null, setMsg);
}
private Set<String> buildStringSet(FudgeDeserializer deserializer, FudgeMsg msg) {
if (msg == null) {
return null;
}
Set<String> strs = Sets.newHashSet();
for (FudgeField field : msg) {
strs.add(deserializer.fieldValueToObject(String.class, field));
}
return strs;
}
}