예제 #1
0
        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);
        }