/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.fudgemsg; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; import org.fudgemsg.FudgeField; 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; import org.fudgemsg.types.IndicatorType; import org.fudgemsg.wire.types.FudgeWireType; import com.opengamma.engine.view.ExecutionLog; import com.opengamma.util.log.LogEvent; import com.opengamma.util.log.LogLevel; /** * Fudge message builder for {@link ExecutionLog}. */ @GenericFudgeBuilderFor(ExecutionLog.class) public class ExecutionLogFudgeBuilder implements FudgeBuilder<ExecutionLog> { private static final String LOG_EVENTS_COLLECTED_FIELD_NAME = "logEventsCollected"; private static final String LOG_EVENT_FIELD_NAME = "logEvent"; private static final String LOG_LEVEL_FIELD_NAME = "logLevel"; private static final String EXCEPTION_CLASS_FIELD_NAME = "exceptionClass"; private static final String EXCEPTION_MESSAGE_FIELD_NAME = "exceptionMessage"; private static final String EXCEPTION_STACK_TRACE_FIELD_NAME = "exceptionStackTrace"; @Override public MutableFudgeMsg buildMessage(FudgeSerializer serializer, ExecutionLog object) { MutableFudgeMsg msg = serializer.newMessage(); if (object.getEvents() != null) { msg.add(LOG_EVENTS_COLLECTED_FIELD_NAME, null, FudgeWireType.INDICATOR, IndicatorType.INSTANCE); for (LogEvent event : object.getEvents()) { serializer.addToMessage(msg, LOG_EVENT_FIELD_NAME, null, event); } } if (!object.getLogLevels().isEmpty()) { for (LogLevel logLevel : object.getLogLevels()) { serializer.addToMessage(msg, LOG_LEVEL_FIELD_NAME, null, logLevel.name()); } } if (object.getExceptionClass() != null) { serializer.addToMessage(msg, EXCEPTION_CLASS_FIELD_NAME, null, object.getExceptionClass()); } if (object.getExceptionMessage() != null) { serializer.addToMessage(msg, EXCEPTION_MESSAGE_FIELD_NAME, null, object.getExceptionMessage()); } if (object.getExceptionStackTrace() != null) { serializer.addToMessage(msg, EXCEPTION_STACK_TRACE_FIELD_NAME, null, object.getExceptionStackTrace()); } return msg; } @Override public ExecutionLog buildObject(FudgeDeserializer deserializer, FudgeMsg message) { final boolean logEventsCollected = message.hasField(LOG_EVENTS_COLLECTED_FIELD_NAME); final List<LogEvent> events; if (logEventsCollected) { events = new ArrayList<LogEvent>(); for (FudgeField eventField : message.getAllByName(LOG_EVENT_FIELD_NAME)) { events.add(deserializer.fieldValueToObject(LogEvent.class, eventField)); } } else { events = null; } final EnumSet<LogLevel> logLevels = EnumSet.noneOf(LogLevel.class); for (FudgeField levelField : message.getAllByName(LOG_LEVEL_FIELD_NAME)) { logLevels.add(LogLevel.valueOf((String) levelField.getValue())); } final String exceptionClass = message.getString(EXCEPTION_CLASS_FIELD_NAME); final String exceptionMessage = message.getString(EXCEPTION_MESSAGE_FIELD_NAME); final String exceptionStackTrace = message.getString(EXCEPTION_STACK_TRACE_FIELD_NAME); return new ExecutionLog() { @Override public EnumSet<LogLevel> getLogLevels() { return logLevels; } @Override public List<LogEvent> getEvents() { return events; } @Override public boolean hasException() { return getExceptionClass() != null; } @Override public String getExceptionClass() { return exceptionClass; } @Override public String getExceptionMessage() { return exceptionMessage; } @Override public String getExceptionStackTrace() { return exceptionStackTrace; } @Override public boolean isEmpty() { return getLogLevels().isEmpty() && !hasException(); } }; } }