/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.livedata.server;
import org.fudgemsg.FudgeMsg;
import com.opengamma.id.ExternalId;
import com.opengamma.livedata.LiveDataSpecification;
import com.opengamma.livedata.normalization.NormalizationRuleSet;
import com.opengamma.util.ArgumentChecker;
/**
* Describes how market data should be distributed to clients.
* <p>
* This includes:
* <ul>
* <li>The format of the data (normalization)
* <li>The destination of the data (JMS topic name)
* </ul>
*/
public class DistributionSpecification {
/**
* The market data that is being distributed, such as AAPL equity.
*/
private final ExternalId _marketDataId;
/**
* The JMS topic it's published to.
*/
private final String _jmsTopic;
/**
* The format it's distributed in.
*/
private final NormalizationRuleSet _normalizationRuleSet;
/**
* Creates a specification.
*
* @param marketDataId the external identifier, such as the ticker, not null
* @param normalizationRuleSet the rule set describing the data format, not null
* @param jmsTopic the JMS topic, not null
*/
public DistributionSpecification(ExternalId marketDataId, NormalizationRuleSet normalizationRuleSet, String jmsTopic) {
ArgumentChecker.notNull(marketDataId, "marketDataId");
ArgumentChecker.notNull(normalizationRuleSet, "normalizationRuleSet");
ArgumentChecker.notNull(jmsTopic, "jmsTopic");
_marketDataId = marketDataId;
_normalizationRuleSet = normalizationRuleSet;
_jmsTopic = jmsTopic;
}
//-------------------------------------------------------------------------
/**
* Gets the external identifier of the data, such as the ticker.
*
* @return the external identifier, not null
*/
public ExternalId getMarketDataId() {
return _marketDataId;
}
/**
* Gets the format that the data should be sent to the client.
*
* @return the data format, not null
*/
public NormalizationRuleSet getNormalizationRuleSet() {
return _normalizationRuleSet;
}
/**
* Gets the JMS topic.
*
* @return the JMS topic, not null
*/
public String getJmsTopic() {
return _jmsTopic;
}
//-------------------------------------------------------------------------
/**
* Converts this specification to a {@code LiveDataSpecification}.
*
* @return the live data specification, not null
*/
public LiveDataSpecification getFullyQualifiedLiveDataSpecification() {
return new LiveDataSpecification(_normalizationRuleSet.getId(), _marketDataId);
}
/**
* Checks if the specified live data specification matches this specification.
*
* @param liveDataSpec the specification to compare to, not null
* @return true if equal
*/
public boolean matches(LiveDataSpecification liveDataSpec) {
return getFullyQualifiedLiveDataSpecification().equals(liveDataSpec);
}
//-------------------------------------------------------------------------
/**
* Gets the normalized message using an empty history store.
*
* @param msg the message received from underlying market data API in its native format
* @param securityUniqueId the data provider's unique ID of the security, not null
* @return the normalized message, calculated assuming there is no market data history
*/
public FudgeMsg getNormalizedMessage(FudgeMsg msg, String securityUniqueId) {
FieldHistoryStore history = new FieldHistoryStore();
return getNormalizedMessage(msg, securityUniqueId, history);
}
/**
* Gets a normalized message.
*
* @param msg the message received from underlying market data API in its native format.
* @param securityUniqueId the data provider's unique security ID
* @param history the history of field values
* @return the normalized message, null if in the process of normalization,
* the message became empty and therefore should not be sent.
*/
public FudgeMsg getNormalizedMessage(FudgeMsg msg, String securityUniqueId, FieldHistoryStore history) {
FudgeMsg normalizedMsg = _normalizationRuleSet.getNormalizedMessage(msg, securityUniqueId, history);
if (normalizedMsg == null) {
return null;
}
if (normalizedMsg.getNumFields() == 0) {
return null;
}
return normalizedMsg;
}
//-------------------------------------------------------------------------
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof DistributionSpecification) {
DistributionSpecification other = (DistributionSpecification) obj;
return _marketDataId.equals(other._marketDataId) &&
_normalizationRuleSet.equals(other._normalizationRuleSet) &&
_jmsTopic.equals(other._jmsTopic);
}
return false;
}
@Override
public int hashCode() {
return _marketDataId.hashCode() ^ _normalizationRuleSet.hashCode();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("DistributionSpecification[");
sb.append(_jmsTopic);
sb.append(":").append(_normalizationRuleSet.getId());
sb.append("]");
return sb.toString();
}
}