/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.livedata.client; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import org.fudgemsg.FudgeContext; import org.fudgemsg.FudgeMsg; import org.fudgemsg.FudgeMsgEnvelope; import org.fudgemsg.mapping.FudgeDeserializer; import org.fudgemsg.mapping.FudgeSerializer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.livedata.LiveDataSpecification; import com.opengamma.livedata.msg.ResolveRequest; import com.opengamma.livedata.msg.ResolveResponse; import com.opengamma.transport.FudgeMessageReceiver; import com.opengamma.transport.FudgeRequestSender; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.fudgemsg.OpenGammaFudgeContext; /** * Maps client LiveData IDs to server LiveData IDs by contacting a remote LiveData server. * */ public class DistributedSpecificationResolver { private static final long TIMEOUT_MS = 5 * 60 * 100L; private static final Logger s_logger = LoggerFactory.getLogger(DistributedSpecificationResolver.class); private final FudgeRequestSender _requestSender; private final FudgeContext _fudgeContext; public DistributedSpecificationResolver(FudgeRequestSender requestSender) { this(requestSender, OpenGammaFudgeContext.getInstance()); } public DistributedSpecificationResolver(FudgeRequestSender requestSender, FudgeContext fudgeContext) { ArgumentChecker.notNull(requestSender, "Request Sender"); ArgumentChecker.notNull(fudgeContext, "Fudge Context"); _requestSender = requestSender; _fudgeContext = fudgeContext; } public LiveDataSpecification resolve( LiveDataSpecification spec) { s_logger.info("Sending message to resolve ", spec); ResolveRequest resolveRequest = new ResolveRequest(spec); FudgeMsg requestMessage = resolveRequest.toFudgeMsg(new FudgeSerializer(_fudgeContext)); final AtomicBoolean responseReceived = new AtomicBoolean(false); final AtomicReference<LiveDataSpecification> resolved = new AtomicReference<LiveDataSpecification>(); _requestSender.sendRequest(requestMessage, new FudgeMessageReceiver() { @Override public void messageReceived(FudgeContext fudgeContext, FudgeMsgEnvelope msgEnvelope) { FudgeMsg msg = msgEnvelope.getMessage(); ResolveResponse response = ResolveResponse.fromFudgeMsg(new FudgeDeserializer(_fudgeContext), msg); resolved.set(response.getResolvedSpecification()); responseReceived.set(true); } }); long start = System.currentTimeMillis(); while (!responseReceived.get()) { try { Thread.sleep(100L); } catch (InterruptedException e) { Thread.interrupted(); } if ((System.currentTimeMillis() - start) >= TIMEOUT_MS) { throw new OpenGammaRuntimeException("Timeout. Waited for specification resolution response for " + TIMEOUT_MS + " with no response."); } } return resolved.get(); } }