private async Task <IDictionary <string, string> > ProcessAsync( IEnumerable <string> dtmis, bool async, ModelDependencyResolution dependencyResolution, CancellationToken cancellationToken) { var processedModels = new Dictionary <string, string>(); Queue <string> toProcessModels = PrepareWork(dtmis); while (toProcessModels.Count != 0) { cancellationToken.ThrowIfCancellationRequested(); string targetDtmi = toProcessModels.Dequeue(); if (processedModels.ContainsKey(targetDtmi)) { ModelsRepositoryEventSource.Instance.SkippingPreprocessedDtmi(targetDtmi); continue; } ModelsRepositoryEventSource.Instance.ProcessingDtmi(targetDtmi); FetchResult result = async ? await FetchAsync(targetDtmi, dependencyResolution, cancellationToken).ConfigureAwait(false) : Fetch(targetDtmi, dependencyResolution, cancellationToken); if (result.FromExpanded) { Dictionary <string, string> expanded = new ModelQuery(result.Definition).ListToDict(); foreach (KeyValuePair <string, string> kvp in expanded) { if (!processedModels.ContainsKey(kvp.Key)) { processedModels.Add(kvp.Key, kvp.Value); } } continue; } ModelMetadata metadata = new ModelQuery(result.Definition).ParseModel(); if (dependencyResolution >= ModelDependencyResolution.Enabled) { IList <string> dependencies = metadata.Dependencies; if (dependencies.Count > 0) { ModelsRepositoryEventSource.Instance.DiscoveredDependencies(string.Join("\", \"", dependencies)); } foreach (string dep in dependencies) { toProcessModels.Enqueue(dep); } } string parsedDtmi = metadata.Id; if (!parsedDtmi.Equals(targetDtmi, StringComparison.Ordinal)) { ModelsRepositoryEventSource.Instance.IncorrectDtmiCasing(targetDtmi, parsedDtmi); string formatErrorMsg = $"{string.Format(CultureInfo.InvariantCulture, StandardStrings.GenericGetModelsError, targetDtmi)} " + string.Format(CultureInfo.InvariantCulture, StandardStrings.IncorrectDtmiCasing, targetDtmi, parsedDtmi); throw new RequestFailedException(formatErrorMsg, new FormatException(formatErrorMsg)); } processedModels.Add(targetDtmi, result.Definition); } return(processedModels); }
public async Task <IDictionary <string, string> > ProcessAsync(IEnumerable <string> dtmis, CancellationToken cancellationToken) { Dictionary <string, string> processedModels = new Dictionary <string, string>(); Queue <string> toProcessModels = new Queue <string>(); foreach (string dtmi in dtmis) { if (!DtmiConventions.IsDtmi(dtmi)) { ResolverEventSource.Shared.InvalidDtmiInput(dtmi); string invalidArgMsg = string.Format(StandardStrings.InvalidDtmiFormat, dtmi); throw new ResolverException(dtmi, invalidArgMsg, new ArgumentException(invalidArgMsg)); } toProcessModels.Enqueue(dtmi); } while (toProcessModels.Count != 0 && !cancellationToken.IsCancellationRequested) { string targetDtmi = toProcessModels.Dequeue(); if (processedModels.ContainsKey(targetDtmi)) { ResolverEventSource.Shared.SkippingPreprocessedDtmi(targetDtmi); continue; } ResolverEventSource.Shared.ProcessingDtmi(targetDtmi); FetchResult result = await FetchAsync(targetDtmi, cancellationToken); if (result.FromExpanded) { Dictionary <string, string> expanded = await new ModelQuery(result.Definition).ListToDictAsync(); foreach (KeyValuePair <string, string> kvp in expanded) { if (!processedModels.ContainsKey(kvp.Key)) { processedModels.Add(kvp.Key, kvp.Value); } } continue; } ModelMetadata metadata = new ModelQuery(result.Definition).GetMetadata(); if (ClientOptions.DependencyResolution >= DependencyResolutionOption.Enabled) { IList <string> dependencies = metadata.Dependencies; if (dependencies.Count > 0) { ResolverEventSource.Shared.DiscoveredDependencies(string.Join("\", \"", dependencies)); } foreach (string dep in dependencies) { toProcessModels.Enqueue(dep); } } string parsedDtmi = metadata.Id; if (!parsedDtmi.Equals(targetDtmi, StringComparison.Ordinal)) { ResolverEventSource.Shared.IncorrectDtmiCasing(targetDtmi, parsedDtmi); string formatErrorMsg = string.Format(StandardStrings.IncorrectDtmiCasing, targetDtmi, parsedDtmi); throw new ResolverException(targetDtmi, formatErrorMsg, new FormatException(formatErrorMsg)); } processedModels.Add(targetDtmi, result.Definition); } return(processedModels); }