/** * 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); } }