public async Task GetDependency(string packageId, string version, string framework, string fxversion, string profile, bool hasDependencies)
        {
            NuGetController controller = new NuGetController();
            var             result     = await controller.GetDependencies(packageId, version, "nuget", framework, fxversion, profile, 2) as JsonResult;

            D3DependencyChild ob = result.Data as D3DependencyChild;

            if (hasDependencies)
            {
                Assert.NotNull(ob.children);
            }
            else
            {
                Assert.NotNull(ob);
            }
        }
        private async Task DoSearch(NuGetFactory factory, D3DependencyChild current,
                                    int maxLevel,
                                    PackageIdentity package, NuGetFramework fx)
        {
            if (current.Level > maxLevel)
            {
                return;
            }

            // same package may be traversed multiple times, so we can cache it
            // don't cache the tree as depth may change for the same package
            SourcePackageDependencyInfo packageDependencyInfo = await CacheResolvePackage(factory, package, fx);

            if (packageDependencyInfo.Dependencies.Any())
            {
                if (current.children == null)
                {
                    current.children = new List <D3DependencyChild>();
                }

                foreach (var dependency in packageDependencyInfo.Dependencies)
                {
                    // unlikely that the version of a particular dependency will change in 30 minutes
                    // so we can cache it
                    IEnumerable <NuGetVersion> allVersions = await CacheGetAllVersionsOfDependency(factory, dependency);

                    if (allVersions.Any())
                    {
                        var bestMatch = dependency.VersionRange.FindBestMatch(allVersions);

                        var child = new D3DependencyChild
                        {
                            key     = dependency.Id,
                            version = bestMatch.Version.ToString(),
                            parent  = current.key,
                            Level   = current.Level + 1
                        };

                        current.children.Add(child);

                        var nextPackage = new PackageIdentity(child.key, bestMatch);
                        await DoSearch(factory, child, maxLevel, nextPackage, fx);
                    }
                }
            }
        }
        public async Task <D3DependencyChild> ViewDependencies(string packageID, string packageVersion, string source,
                                                               string framework, string frameworkVersion, string frameworkProfile, int maxLevel = 3)
        {
            if (string.IsNullOrEmpty(packageID))
            {
                throw new ArgumentNullException("packageID");
            }

            if (string.IsNullOrEmpty(packageVersion))
            {
                throw new ArgumentNullException("packageVersion");
            }

            if (string.IsNullOrEmpty(source))
            {
                throw new ArgumentNullException("source");
            }

            if (string.IsNullOrEmpty(framework))
            {
                throw new ArgumentNullException("framework");
            }

            if (string.IsNullOrEmpty(frameworkVersion))
            {
                throw new ArgumentNullException("frameworkVersion");
            }

            var             factory = new NuGetFactory(source);
            NuGetFramework  fx      = new NuGetFramework(framework, Version.Parse(frameworkVersion), frameworkProfile);
            PackageIdentity package = new PackageIdentity(packageID, NuGetVersion.Parse(packageVersion));
            var             root    = new D3DependencyChild
            {
                key     = packageID,
                version = packageVersion,
                Level   = 0
            };

            await DoSearch(factory, root, maxLevel, package, fx);

            return(root);
        }
        public virtual async Task <ActionResult> GetDependencies(string PackageID, string PackageVersion,
                                                                 string Source, string Framework, string FrameworkVersion, string FrameworkProfile, int MaxLevel = 3)
        {
            Trace.TraceInformation("[NuGet.GetDependencies] Package: " + PackageID + " Source: " + Source + " Version: " + PackageVersion
                                   + " FX: " + FrameworkProfile + " MaxLevel:" + MaxLevel);

            if (string.IsNullOrEmpty(PackageID))
            {
                throw new UserActionException("Package Name is required to view dependencies", "CON.NUGET.GD1", new ArgumentNullException("PackageID"));
            }

            if (string.IsNullOrEmpty(PackageVersion))
            {
                throw new UserActionException("Package Version is required to view dependencies", "CON.NUGET.GD2", new ArgumentNullException("PackageVersion"));
            }

            if (string.IsNullOrEmpty(Source))
            {
                throw new UserActionException("Nuget Source is required to view dependencies", "CON.NUGET.GD3", new ArgumentNullException("Source"));
            }

            if (string.IsNullOrEmpty(Framework))
            {
                throw new UserActionException("Framework is required to analyze", "CON.NUGET.GD4", new ArgumentNullException("Framework"));
            }

            if (string.IsNullOrEmpty(FrameworkVersion))
            {
                throw new UserActionException("Framework Version is required to analyze", "CON.NUGET.GD5", new ArgumentNullException("FrameworkVersion"));
            }

            if (MaxLevel > 4)
            {
                MaxLevel = 4;
            }

            D3DependencyChild model = await _cache.ViewDependencies(PackageID, PackageVersion, Source, Framework, FrameworkVersion, FrameworkProfile, MaxLevel);

            return(Json(model));
        }