/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.fudgemsg;
import java.util.Arrays;
import java.util.Collection;
import java.util.EnumSet;
import org.apache.commons.lang.BooleanUtils;
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.engine.view.execution.ExecutionOptions;
import com.opengamma.engine.view.execution.ViewCycleExecutionOptions;
import com.opengamma.engine.view.execution.ViewCycleExecutionSequence;
import com.opengamma.engine.view.execution.ViewExecutionFlags;
import com.opengamma.util.tuple.Pair;
import com.opengamma.util.tuple.Pairs;
/**
* Fudge message builder for {@link ExecutionOptions}
*/
@FudgeBuilderFor(ExecutionOptions.class)
public class ExecutionOptionsFudgeBuilder implements FudgeBuilder<ExecutionOptions> {
private static final String EXECUTION_SEQUENCE_FIELD = "executionSequence";
private static final String AWAIT_MARKET_DATA_FIELD = "awaitMarketData";
private static final String TRIGGER_CYCLE_ON_LIVE_DATA_CHANGED_FIELD = "liveDataTriggerEnabled";
private static final String TRIGGER_CYCLE_ON_TIME_ELAPSED_FIELD = "timeElapsedTriggerEnabled";
private static final String RUN_AS_FAST_AS_POSSIBLE_FIELD = "runAsFastAsPossible";
private static final String COMPILE_ONLY_FIELD = "compileOnly";
private static final String FETCH_MARKET_DATA_ONLY_FIELD = "fetchMarketDataOnly";
private static final String SKIP_CYCLE_ON_NO_MARKET_DATA_FIELD = "skipCycleOnNoMarketData";
private static final String WAIT_FOR_INITIAL_TRIGGER_FIELD = "waitForInitialTrigger";
private static final String MAX_SUCCESSIVE_DELTA_CYCLES_FIELD = "maxSuccessiveDeltaCycles";
private static final String MARKET_DATA_TIMEOUT_MILLIS_FIELD = "marketDataTimeoutMillis";
private static final String DEFAULT_EXECUTION_OPTIONS_FIELD = "defaultExecutionOptions";
private static final String BATCH_FIELD = "batch";
private static final Collection<Pair<String, ViewExecutionFlags>> s_flags = Arrays.<Pair<String, ViewExecutionFlags>>asList(
Pairs.of(AWAIT_MARKET_DATA_FIELD, ViewExecutionFlags.AWAIT_MARKET_DATA),
Pairs.of(TRIGGER_CYCLE_ON_LIVE_DATA_CHANGED_FIELD, ViewExecutionFlags.TRIGGER_CYCLE_ON_MARKET_DATA_CHANGED),
Pairs.of(TRIGGER_CYCLE_ON_TIME_ELAPSED_FIELD, ViewExecutionFlags.TRIGGER_CYCLE_ON_TIME_ELAPSED),
Pairs.of(RUN_AS_FAST_AS_POSSIBLE_FIELD, ViewExecutionFlags.RUN_AS_FAST_AS_POSSIBLE),
Pairs.of(COMPILE_ONLY_FIELD, ViewExecutionFlags.COMPILE_ONLY),
Pairs.of(FETCH_MARKET_DATA_ONLY_FIELD, ViewExecutionFlags.FETCH_MARKET_DATA_ONLY),
Pairs.of(SKIP_CYCLE_ON_NO_MARKET_DATA_FIELD, ViewExecutionFlags.SKIP_CYCLE_ON_NO_MARKET_DATA),
Pairs.of(WAIT_FOR_INITIAL_TRIGGER_FIELD, ViewExecutionFlags.WAIT_FOR_INITIAL_TRIGGER),
Pairs.of(BATCH_FIELD, ViewExecutionFlags.BATCH));
@Override
public MutableFudgeMsg buildMessage(FudgeSerializer serializer, ExecutionOptions object) {
MutableFudgeMsg msg = serializer.newMessage();
serializer.addToMessageWithClassHeaders(msg, EXECUTION_SEQUENCE_FIELD, null, object.getExecutionSequence());
for (Pair<String, ViewExecutionFlags> flags : s_flags) {
if (object.getFlags().contains(flags.getSecond())) {
msg.add(flags.getFirst(), Boolean.TRUE);
}
}
if (object.getMaxSuccessiveDeltaCycles() != null) {
msg.add(MAX_SUCCESSIVE_DELTA_CYCLES_FIELD, object.getMaxSuccessiveDeltaCycles());
}
if (object.getMarketDataTimeoutMillis() != null) {
msg.add(MARKET_DATA_TIMEOUT_MILLIS_FIELD, object.getMarketDataTimeoutMillis());
}
serializer.addToMessage(msg, DEFAULT_EXECUTION_OPTIONS_FIELD, null, object.getDefaultExecutionOptions());
return msg;
}
@Override
public ExecutionOptions buildObject(FudgeDeserializer deserializer, FudgeMsg message) {
ViewCycleExecutionSequence executionSequence = deserializer.fudgeMsgToObject(ViewCycleExecutionSequence.class, message.getMessage(EXECUTION_SEQUENCE_FIELD));
EnumSet<ViewExecutionFlags> flags = EnumSet.noneOf(ViewExecutionFlags.class);
for (Pair<String, ViewExecutionFlags> flagField : s_flags) {
if (BooleanUtils.isTrue(message.getBoolean(flagField.getFirst()))) {
flags.add(flagField.getSecond());
}
}
Integer maxSuccessiveDeltaCycles = null;
if (message.hasField(MAX_SUCCESSIVE_DELTA_CYCLES_FIELD)) {
maxSuccessiveDeltaCycles = message.getInt(MAX_SUCCESSIVE_DELTA_CYCLES_FIELD);
}
Long marketDataTimeoutMillis = null;
if (message.hasField(MARKET_DATA_TIMEOUT_MILLIS_FIELD)) {
marketDataTimeoutMillis = message.getLong(MARKET_DATA_TIMEOUT_MILLIS_FIELD);
}
FudgeField defaultExecutionOptionsField = message.getByName(DEFAULT_EXECUTION_OPTIONS_FIELD);
ViewCycleExecutionOptions defaultExecutionOptions = defaultExecutionOptionsField != null ?
deserializer.fieldValueToObject(ViewCycleExecutionOptions.class, defaultExecutionOptionsField) : null;
return new ExecutionOptions(executionSequence, flags, maxSuccessiveDeltaCycles, marketDataTimeoutMillis, defaultExecutionOptions);
}
}