#develop (short for SharpDevelop) is a free IDE for .NET programming languages.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

113 lines
3.5 KiB

// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using NuGet;
namespace ICSharpCode.PackageManagement
{
public class PackageRepositoryCache : IPackageRepositoryCache
{
ISharpDevelopPackageRepositoryFactory factory;
RegisteredPackageSources registeredPackageSources;
IList<RecentPackageInfo> recentPackages;
IRecentPackageRepository recentPackageRepository;
ConcurrentDictionary<PackageSource, IPackageRepository> repositories =
new ConcurrentDictionary<PackageSource, IPackageRepository>();
public PackageRepositoryCache(
ISharpDevelopPackageRepositoryFactory factory,
RegisteredPackageSources registeredPackageSources,
IList<RecentPackageInfo> recentPackages)
{
this.factory = factory;
this.registeredPackageSources = registeredPackageSources;
this.recentPackages = recentPackages;
}
public PackageRepositoryCache(
RegisteredPackageSources registeredPackageSources,
IList<RecentPackageInfo> recentPackages)
: this(
new SharpDevelopPackageRepositoryFactory(),
registeredPackageSources,
recentPackages)
{
}
public IPackageRepository CreateRepository(PackageSource packageSource)
{
IPackageRepository repository = GetExistingRepository(packageSource);
if (repository != null) {
return repository;
}
return CreateNewCachedRepository(packageSource);
}
IPackageRepository GetExistingRepository(PackageSource packageSource)
{
IPackageRepository repository = null;
if (repositories.TryGetValue(packageSource, out repository)) {
return repository;
}
return null;
}
IPackageRepository CreateNewCachedRepository(PackageSource packageSource)
{
IPackageRepository repository = factory.CreateRepository(packageSource);
repositories.TryAdd(packageSource, repository);
return repository;
}
public ISharedPackageRepository CreateSharedRepository(IPackagePathResolver pathResolver, IFileSystem fileSystem)
{
return factory.CreateSharedRepository(pathResolver, fileSystem);
}
public IPackageRepository CreateAggregateRepository()
{
IEnumerable<IPackageRepository> allRepositories = CreateAllRepositories();
return CreateAggregateRepository(allRepositories);
}
IEnumerable<IPackageRepository> CreateAllRepositories()
{
foreach (PackageSource source in registeredPackageSources) {
yield return CreateRepository(source);
}
}
public IPackageRepository CreateAggregateRepository(IEnumerable<IPackageRepository> repositories)
{
return factory.CreateAggregateRepository(repositories);
}
public IRecentPackageRepository RecentPackageRepository {
get {
CreateRecentPackageRepository();
return recentPackageRepository;
}
}
void CreateRecentPackageRepository()
{
if (recentPackageRepository == null) {
IPackageRepository aggregateRepository = CreateAggregateRepository();
CreateRecentPackageRepository(recentPackages, aggregateRepository);
}
}
public IRecentPackageRepository CreateRecentPackageRepository(
IList<RecentPackageInfo> recentPackages,
IPackageRepository aggregateRepository)
{
if (recentPackageRepository == null) {
recentPackageRepository = factory.CreateRecentPackageRepository(recentPackages, aggregateRepository);
}
return recentPackageRepository;
}
}
}