public IList <Package> SearchPackages(IEnumerable <PackageURL> inCoords) { var result = new List <Package>(inCoords.Count()); List <PackageURL> useCoords = new List <PackageURL>(); foreach (PackageURL purl in inCoords) { Package cachedPkg = (Package)cache[purl.ToString()]; if (cachedPkg != null) { long now = DateTime.UtcNow.Ticks / TimeSpan.TicksPerSecond; long diff = now - cachedPkg.CachedAt; if (diff < cacheExpiration) { result.Add(cachedPkg); } else { useCoords.Add(purl); } } else { useCoords.Add(purl); } } IEnumerable <PackageURL> useEnumerable = useCoords; while (useEnumerable.Any()) { var request = new RestRequest(Method.POST); ComponentReport report = new ComponentReport(); report.coordinates = useEnumerable.Select(x => x.ToString()); request.Resource = "component-report"; request.RequestFormat = DataFormat.Json; request.OnBeforeDeserialization = BeforeSerialization; request.AddBody(report); var response = Execute <PackageResponse>(request); if (response.ResponseStatus == ResponseStatus.Error) { throw new ApiClientTransportException(response.ErrorMessage, response.ErrorException); } foreach (Package pkg in response.Data) { pkg.CachedAt = DateTime.UtcNow.Ticks / TimeSpan.TicksPerSecond; cache[pkg.Coordinates] = pkg; result.Add(pkg); } useEnumerable = useEnumerable.Skip(this._pageSize); } return(result); }
public IList <Package> SearchPackages(IEnumerable <PackageURL> inCoords) { var result = new List <Package>(inCoords.Count()); List <PackageURL> useCoords = new List <PackageURL>(); foreach (PackageURL purl in inCoords) { if (cache.Contains(purl.ToString())) { string json = (string)cache[purl.ToString()]; Package cachedPkg = null; try { cachedPkg = JsonConvert.DeserializeObject <Package>(json); long now = DateTime.UtcNow.Ticks / TimeSpan.TicksPerSecond; long diff = now - cachedPkg.CachedAt; if (diff < cacheExpiration) { result.Add(cachedPkg); } else { cache.Remove(purl.ToString()); useCoords.Add(purl); } } catch (Exception e) { logger.LogDebug($"An error ocurred deserializing {purl.ToString()} package from cache: {e.Message}."); logger.LogInformation($"Skipping cache entry for package {purl.ToString()}."); useCoords.Add(purl); continue; } } else { useCoords.Add(purl); } } IEnumerable <PackageURL> useEnum = useCoords; List <List <PackageURL> > batches = Split(useEnum, _pageSize); foreach (List <PackageURL> batch in batches) { var request = new RestRequest(Method.POST); JsonSerializer serializer = new JsonSerializer(); serializer.NullValueHandling = NullValueHandling.Ignore; ComponentReport report = new ComponentReport(); report.coordinates = batch.Select(x => x.ToString()); request.Resource = "component-report"; request.RequestFormat = DataFormat.Json; request.OnBeforeDeserialization = BeforeSerialization; request.AddBody(report); logger.LogDebug("OSS Index request for " + report.coordinates.Count() + " packages..."); var response = Execute <PackageResponse>(request); if (response.ResponseStatus == ResponseStatus.Error) { throw new ApiClientTransportException(response.ErrorMessage, response.ErrorException); } foreach (Package pkg in response.Data) { try { pkg.CachedAt = DateTime.UtcNow.Ticks / TimeSpan.TicksPerSecond; using (StringWriter sw = new StringWriter()) using (JsonWriter writer = new JsonTextWriter(sw)) { serializer.Serialize(writer, pkg); cache[pkg.Coordinates] = sw.ToString(); } result.Add(pkg); } catch (Exception e) { logger.LogDebug($"An error occurred deserializing response data for package {pkg.Name}."); logger.LogInformation($"Skipping results for package {pkg.Name}."); continue; } } } return(result); }