public V221OutputQuotedAssetSet GetPricingStructureV221(V221Header header, V221ProviderId provider, Guid requestId, string requestParams, string structureProperties) { IModuleInfo connection = null; _connectionIndex.Locked(connections => { if (!connections.TryGetValue(header.SessionId, out connection)) { throw new ApplicationException("Ignoring request from unknown client!"); } }); //var errors = new List<V221ErrorDetail>(); string step = "GetPricingStructureV221: unknown"; try { step = "GetPricingStructureV221: calling GetPricingStructure"; // run each provider request MDSProviderId defaultProvider = V221Helpers.ToProviderId(provider); MDSResult <QuotedAssetSet> result = _providers[(int)defaultProvider].GetPricingStructure( defaultProvider, connection, requestId, true, new NamedValueSet(requestParams), new NamedValueSet(structureProperties)); step = "GetPricingStructureV221: compressing"; return(new V221OutputQuotedAssetSet( CompressionHelper.CompressToBuffer(XmlSerializerHelper.SerializeToString(result)), null)); } catch (Exception excp) { Logger.LogError("Exception: step='{0}': {1}", step, excp); return(new V221OutputQuotedAssetSet(null, new V221ErrorDetail(excp))); } }
/// <summary> /// /// </summary> /// <param name="header"></param> /// <param name="v221Provider"></param> /// <param name="requestId"></param> /// <param name="requestParams"></param> /// <param name="zsQuotedAssetSet"></param> /// <returns></returns> public V221OutputQuotedAssetSet GetMarketQuotesV221(V221Header header, V221ProviderId v221Provider, Guid requestId, string requestParams, byte[] zsQuotedAssetSet) { IModuleInfo connection = null; _connectionIndex.Locked(connections => { if (!connections.TryGetValue(header.SessionId, out connection)) { throw new ApplicationException("Ignoring request from unknown client!"); } }); //var errors = new List<V221ErrorDetail>(); var result = new QuotedAssetSet(); string step = "GetMarketQuotesV221: unknown"; try { step = "GetMarketQuotesV221: decompressing"; // deserialise inputs var receivedRequest = XmlSerializerHelper.DeserializeFromString <QuotedAssetSet>(CompressionHelper.DecompressToString(zsQuotedAssetSet)); //debug dump request //this.Logger.LogDebug("Received: {0}", XmlSerializerHelper.SerializeToString<QuotedAssetSet>(receivedRequest)); // end debug step = "GetMarketQuotesV221: splitting"; // split request into provider-specific requests // build unique instrumentSet var instrumentMap = new Dictionary <string, Asset>(); foreach (Asset asset in receivedRequest.instrumentSet.Items) { string assetId = asset.id; instrumentMap[assetId.ToLower()] = asset; } // now split quotes based on provider preferences MDSProviderId defaultProvider = V221Helpers.ToProviderId(v221Provider); int providerCount = Enum.GetValues(typeof(MDSProviderId)).Length; var providerRequests = new RequestContainer[providerCount]; for (int i = 0; i < providerRequests.Length; i++) { providerRequests[i] = new RequestContainer(); } int requestedQuoteCount = 0; foreach (BasicAssetValuation valuation in receivedRequest.assetQuote) { string assetId = valuation.objectReference.href; if (!instrumentMap.TryGetValue(assetId.ToLower(), out var asset)) { throw new ApplicationException($"Cannot find asset '{assetId}' in instrument set"); } foreach (BasicQuotation quote in valuation.quote) { if (!quote.valueSpecified) { requestedQuoteCount++; MDSProviderId quoteProvider = ChooseProvider(quote.informationSource, _activeProviders, defaultProvider); RequestContainer requestContainer = providerRequests[(int)quoteProvider]; requestContainer.InstrumentMap[assetId.ToLower()] = asset; // merge the quotes if (!requestContainer.ValuationMap.TryGetValue(assetId.ToLower(), out var bav)) { // missing - create bav = new BasicAssetValuation { objectReference = new AnyAssetReference { href = assetId } }; requestContainer.ValuationMap[assetId.ToLower()] = bav; } // append the asset quotes var quotes = new List <BasicQuotation>(); if (bav.quote != null) { quotes.AddRange(bav.quote); } quotes.Add(quote); bav.quote = quotes.ToArray(); } } } if (requestedQuoteCount == 0) { throw new ApplicationException("No quotes requested!"); } step = "GetMarketQuotesV221: calling providers"; // run each provider request foreach (MDSProviderId activeProvider in _activeProviders) { RequestContainer requestContainer = providerRequests[(int)activeProvider]; if (requestContainer.InstrumentMap.Count > 0) { // request is not empty - call the MDS provider var types = new List <ItemsChoiceType19>(); foreach (var asset in requestContainer.InstrumentMap.Values) { var assetTypeFpML = AssetTypeConvertor.ParseEnumStringToFpML(asset.id);//TODO The id must contain the asset descriptor. types.Add(assetTypeFpML); } var instrumentSet = new InstrumentSet { Items = requestContainer.InstrumentMap.Values.ToArray(), ItemsElementName = types.ToArray() }; var providerRequest = new QuotedAssetSet { instrumentSet = instrumentSet, assetQuote = requestContainer.ValuationMap.Values.ToArray() }; step = "GetMarketQuotesV221: calling " + activeProvider.ToString(); QuotedAssetSet providerResult = _providers[(int)activeProvider].GetMarketQuotes( activeProvider, connection, requestId, true, new NamedValueSet(requestParams), providerRequest).Result; // combine provider-specific results result = result.Merge(providerResult, false, true, true); } } step = "GetMarketQuotesV221: compressing"; return(new V221OutputQuotedAssetSet( CompressionHelper.CompressToBuffer(XmlSerializerHelper.SerializeToString(result)), null)); } catch (Exception excp) { Logger.LogError("Exception: step='{0}': {1}", step, excp); return(new V221OutputQuotedAssetSet(null, new V221ErrorDetail(excp))); } }