/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.cache; import org.fudgemsg.FudgeContext; import org.fudgemsg.FudgeMsgEnvelope; import org.fudgemsg.MutableFudgeMsg; import org.fudgemsg.mapping.FudgeDeserializer; import org.fudgemsg.mapping.FudgeSerializer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.opengamma.engine.cache.msg.CacheMessage; import com.opengamma.engine.cache.msg.CacheMessageVisitor; import com.opengamma.transport.FudgeConnection; import com.opengamma.transport.FudgeConnectionReceiver; import com.opengamma.transport.FudgeConnectionStateListener; import com.opengamma.transport.FudgeMessageReceiver; /** * Composite server class for dispatching calls to a {@link IdentifierMapServer} and * {@link FudgeMessageStoreServer} within the same JVM. */ public class ViewComputationCacheServer implements FudgeConnectionReceiver, FudgeConnectionStateListener { private static final Logger s_logger = LoggerFactory.getLogger(ViewComputationCacheServer.class); private final IdentifierMapServer _identifierMap; private final FudgeMessageStoreServer _binaryDataStore; public ViewComputationCacheServer(final IdentifierMapServer identifierMap, final FudgeMessageStoreServer binaryDataStore) { _identifierMap = identifierMap; _binaryDataStore = binaryDataStore; } public ViewComputationCacheServer(final DefaultViewComputationCacheSource cacheSource) { this(new IdentifierMapServer(cacheSource.getIdentifierMap()), new FudgeMessageStoreServer(cacheSource)); } protected IdentifierMapServer getIdentifierMap() { return _identifierMap; } protected FudgeMessageStoreServer getBinaryDataStore() { return _binaryDataStore; } private class MessageHandler extends CacheMessageVisitor implements FudgeMessageReceiver { private final FudgeConnection _connection; private final CacheMessageVisitor _binaryDataStore; public MessageHandler(final FudgeConnection connection) { _connection = connection; _binaryDataStore = ViewComputationCacheServer.this.getBinaryDataStore().onNewConnection(connection); } private CacheMessageVisitor getBinaryDataStore() { return _binaryDataStore; } private FudgeConnection getConnection() { return _connection; } @Override protected <T extends CacheMessage> T visitUnexpectedMessage(final CacheMessage message) { s_logger.warn("Unexpected message - {}", message); return null; } @SuppressWarnings("unchecked") @Override protected <T extends CacheMessage> T visitBinaryDataStoreMessage(final CacheMessage message) { return (T) message.accept(getBinaryDataStore()); } @SuppressWarnings("unchecked") @Override protected <T extends CacheMessage> T visitIdentifierMapMessage(final CacheMessage message) { return (T) message.accept(getIdentifierMap()); } @Override public void messageReceived(final FudgeContext context, final FudgeMsgEnvelope message) { final FudgeDeserializer deserializer = new FudgeDeserializer(context); final CacheMessage request = deserializer.fudgeMsgToObject(CacheMessage.class, message.getMessage()); CacheMessage response = request.accept(this); if (response == null) { if (request.getCorrelationId() != null) { response = new CacheMessage(); } } if (response != null) { response.setCorrelationId(request.getCorrelationId()); final FudgeSerializer sctx = new FudgeSerializer(context); final MutableFudgeMsg responseMsg = sctx.objectToFudgeMsg(response); // We have only one response type for each request, so don't really need the headers // FudgeSerializer.addClassHeader(responseMsg, response.getClass(), CacheMessage.class); getConnection().getFudgeMessageSender().send(responseMsg); } } }; @Override public void connectionReceived(final FudgeContext fudgeContext, final FudgeMsgEnvelope message, final FudgeConnection connection) { connection.setConnectionStateListener(this); final MessageHandler handler = new MessageHandler(connection); handler.messageReceived(fudgeContext, message); connection.setFudgeMessageReceiver(handler); } @Override public void connectionFailed(final FudgeConnection connection, Exception cause) { getBinaryDataStore().onDroppedConnection(connection); } @Override public void connectionReset(final FudgeConnection connection) { // Shouldn't happen } }