Package com.opengamma.engine.cache

Source Code of com.opengamma.engine.cache.DefaultFudgeMessageStore

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

import java.io.ByteArrayOutputStream;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import org.fudgemsg.FudgeContext;
import org.fudgemsg.FudgeMsg;
import org.fudgemsg.wire.EncodedFudgeMsg;
import org.fudgemsg.wire.FudgeDataOutputStreamWriter;
import org.fudgemsg.wire.FudgeEncoded;

import com.opengamma.util.ArgumentChecker;

/**
* A default {@link FudgeMessageStore} implementation that serializes messages into and out
* of a {@link BinaryDataStore}.
*/
public class DefaultFudgeMessageStore implements FudgeMessageStore {

  private final BinaryDataStore _binaryData;
  private final FudgeContext _fudgeContext;

  public DefaultFudgeMessageStore(final BinaryDataStore binaryData, final FudgeContext fudgeContext) {
    ArgumentChecker.notNull(binaryData, "binaryData");
    _binaryData = binaryData;
    _fudgeContext = fudgeContext;
  }

  private BinaryDataStore getBinaryData() {
    return _binaryData;
  }

  private FudgeContext getFudgeContext() {
    return _fudgeContext;
  }

  @Override
  public void delete() {
    getBinaryData().delete();
  }

  @Override
  public FudgeMsg get(long identifier) {
    final byte[] data = getBinaryData().get(identifier);
    return (data != null) ? new EncodedFudgeMsg(data, getFudgeContext()) : null;
  }

  @Override
  public Map<Long, FudgeMsg> get(Collection<Long> identifiers) {
    final Map<Long, byte[]> dataValues = getBinaryData().get(identifiers);
    final Map<Long, FudgeMsg> resultValues = new HashMap<Long, FudgeMsg>();
    for (Map.Entry<Long, byte[]> data : dataValues.entrySet()) {
      resultValues.put(data.getKey(), new EncodedFudgeMsg(data.getValue(), getFudgeContext()));
    }
    return resultValues;
  }

  @Override
  public void put(long identifier, FudgeMsg dataMessage) {
    final byte[] data;
    if (dataMessage instanceof FudgeEncoded) {
      data = ((FudgeEncoded) dataMessage).getFudgeEncoded();
    } else {
      final ByteArrayOutputStream baos = new ByteArrayOutputStream();
      final FudgeDataOutputStreamWriter writer = new FudgeDataOutputStreamWriter(getFudgeContext(), baos);
      writer.writeFields(dataMessage);
      data = baos.toByteArray();
    }
    getBinaryData().put(identifier, data);
  }

  @Override
  public void put(Map<Long, FudgeMsg> dataMessages) {
    final Map<Long, byte[]> dataBytes = new HashMap<Long, byte[]>();
    ByteArrayOutputStream baos = null;
    FudgeDataOutputStreamWriter writer = null;
    for (Map.Entry<Long, FudgeMsg> dataMessage : dataMessages.entrySet()) {
      final byte[] data;
      if (dataMessage.getValue() instanceof FudgeEncoded) {
        data = ((FudgeEncoded) dataMessage.getValue()).getFudgeEncoded();
      } else {
        if (baos == null) {
          baos = new ByteArrayOutputStream();
          writer = new FudgeDataOutputStreamWriter(getFudgeContext(), baos);
        } else {
          baos.reset();
        }
        writer.writeFields(dataMessage.getValue());
        data = baos.toByteArray();
      }
      dataBytes.put(dataMessage.getKey(), data);
    }
    getBinaryData().put(dataBytes);
  }
}
TOP

Related Classes of com.opengamma.engine.cache.DefaultFudgeMessageStore

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.