com.opengamma.engine.calcnode.MutableExecutionLog.java Source code

Java tutorial

Introduction

Here is the source code for com.opengamma.engine.calcnode.MutableExecutionLog.java

Source

/**
 * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
 * 
 * Please see distribution for license.
 */
package com.opengamma.engine.calcnode;

import java.util.EnumSet;
import java.util.LinkedList;
import java.util.List;

import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.builder.ToStringStyle;

import com.opengamma.engine.view.ExecutionLog;
import com.opengamma.engine.view.ExecutionLogMode;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.log.LogEvent;
import com.opengamma.util.log.LogLevel;
import com.opengamma.util.log.SimpleLogEvent;

/**
 * Allows log events which occur during function execution to be collected.
 */
public class MutableExecutionLog implements ExecutionLog {

    private final ExecutionLogMode _logMode;
    private final EnumSet<LogLevel> _logLevels = EnumSet.noneOf(LogLevel.class);
    private final List<LogEvent> _events;

    private String _exceptionClass;
    private String _exceptionMessage;
    private String _exceptionStackTrace;

    public MutableExecutionLog(ExecutionLogMode logMode) {
        ArgumentChecker.notNull(logMode, "logMode");
        _events = logMode == ExecutionLogMode.FULL ? new LinkedList<LogEvent>() : null;
        _logMode = logMode;
    }

    public MutableExecutionLog(ExecutionLog copyFrom) {
        _logMode = ExecutionLogMode.FULL;
        _logLevels.addAll(copyFrom.getLogLevels());
        if (copyFrom.getEvents() != null) {
            _events = new LinkedList<LogEvent>(copyFrom.getEvents());
        } else {
            _events = new LinkedList<LogEvent>();
        }
        _exceptionClass = copyFrom.getExceptionClass();
        _exceptionMessage = copyFrom.getExceptionMessage();
        _exceptionStackTrace = copyFrom.getExceptionStackTrace();
    }

    public static ExecutionLog single(LogEvent logEvent, ExecutionLogMode logMode) {
        MutableExecutionLog log = new MutableExecutionLog(logMode);
        log.add(logEvent);
        return log;
    }

    //-------------------------------------------------------------------------
    public void add(LogEvent logEvent) {
        ArgumentChecker.notNull(logEvent, "logEvent");
        LogLevel level = logEvent.getLevel();
        _logLevels.add(level);
        if (_logMode == ExecutionLogMode.FULL) {
            _events.add(new SimpleLogEvent(level, logEvent.getMessage()));
        }
    }

    public void setException(Throwable exception) {
        _exceptionClass = exception.getClass().getName();
        _exceptionMessage = exception.getMessage();
        final StringBuilder buffer = new StringBuilder();
        for (StackTraceElement element : exception.getStackTrace()) {
            buffer.append(element.toString()).append("\n");
        }
        _exceptionStackTrace = buffer.toString();
        _logLevels.add(LogLevel.WARN);
    }

    public void setException(String exceptionClass, String exceptionMessage) {
        ArgumentChecker.notNull(exceptionClass, "exceptionClass");
        _exceptionClass = exceptionClass;
        _exceptionMessage = exceptionMessage;
        _exceptionStackTrace = null;
        _logLevels.add(LogLevel.WARN);
    }

    //-------------------------------------------------------------------------

    @Override
    public EnumSet<LogLevel> getLogLevels() {
        return EnumSet.copyOf(_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 _logLevels.isEmpty() && !hasException();
    }

    //-------------------------------------------------------------------------
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((_events == null) ? 0 : _events.hashCode());
        result = prime * result + ((_exceptionClass == null) ? 0 : _exceptionClass.hashCode());
        result = prime * result + ((_exceptionMessage == null) ? 0 : _exceptionMessage.hashCode());
        result = prime * result + ((_exceptionStackTrace == null) ? 0 : _exceptionStackTrace.hashCode());
        result = prime * result + ((_logLevels == null) ? 0 : _logLevels.hashCode());
        result = prime * result + ((_logMode == null) ? 0 : _logMode.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof MutableExecutionLog)) {
            return false;
        }
        MutableExecutionLog other = (MutableExecutionLog) obj;
        return ObjectUtils.equals(_events, other._events)
                && ObjectUtils.equals(_exceptionClass, other._exceptionClass)
                && ObjectUtils.equals(_exceptionMessage, other._exceptionMessage)
                && ObjectUtils.equals(_exceptionStackTrace, other._exceptionStackTrace)
                && ObjectUtils.equals(_logLevels, other._logLevels) && ObjectUtils.equals(_logMode, other._logMode);
    }

    @Override
    public String toString() {
        StringBuffer sb = new StringBuffer();
        ToStringStyle style = ToStringStyle.SHORT_PREFIX_STYLE;
        style.appendStart(sb, this);
        if (hasException()) {
            style.append(sb, "exception", getExceptionClass(), null);
        }
        if (!_logLevels.isEmpty()) {
            style.append(sb, "logLevels", _logLevels, null);
        }
        style.appendEnd(sb, this);
        return sb.toString();
    }

}