/src/AddIns/Misc/PackageManagement/Project/Src/RecentPackageRepository.cs

https://github.com/ajadex/SharpDevelop · C# · 187 lines · 142 code · 28 blank · 17 comment · 5 complexity · 707781505e565aad946ad9d013c9774f MD5 · raw file

  1. // Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
  2. //
  3. // Permission is hereby granted, free of charge, to any person obtaining a copy of this
  4. // software and associated documentation files (the "Software"), to deal in the Software
  5. // without restriction, including without limitation the rights to use, copy, modify, merge,
  6. // publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
  7. // to whom the Software is furnished to do so, subject to the following conditions:
  8. //
  9. // The above copyright notice and this permission notice shall be included in all copies or
  10. // substantial portions of the Software.
  11. //
  12. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
  13. // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  14. // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
  15. // FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  16. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  17. // DEALINGS IN THE SOFTWARE.
  18. using System;
  19. using System.Collections.Generic;
  20. using System.Linq;
  21. using NuGet;
  22. namespace ICSharpCode.PackageManagement
  23. {
  24. public class RecentPackageRepository : IRecentPackageRepository
  25. {
  26. public const int DefaultMaximumPackagesCount = 20;
  27. List<IPackage> packages = new List<IPackage>();
  28. int maximumPackagesCount = DefaultMaximumPackagesCount;
  29. IList<RecentPackageInfo> savedRecentPackages;
  30. IPackageRepository aggregateRepository;
  31. IPackageManagementEvents packageManagementEvents;
  32. public RecentPackageRepository(
  33. IList<RecentPackageInfo> recentPackages,
  34. IPackageRepository aggregateRepository,
  35. IPackageManagementEvents packageManagementEvents)
  36. {
  37. this.savedRecentPackages = recentPackages;
  38. this.aggregateRepository = aggregateRepository;
  39. this.packageManagementEvents = packageManagementEvents;
  40. this.packageManagementEvents.ParentPackageInstalled += ParentPackageInstalled;
  41. }
  42. void ParentPackageInstalled(object sender, ParentPackageOperationEventArgs e)
  43. {
  44. AddPackage(e.Package);
  45. }
  46. public string Source {
  47. get { return "RecentPackages"; }
  48. }
  49. public void AddPackage(IPackage package)
  50. {
  51. RemovePackageIfAlreadyAdded(package);
  52. AddPackageAtBeginning(package);
  53. RemoveLastPackageIfCurrentPackageCountExceedsMaximum();
  54. UpdateRecentPackagesInOptions();
  55. }
  56. void RemovePackageIfAlreadyAdded(IPackage package)
  57. {
  58. int index = FindPackage(package);
  59. if (index >= 0) {
  60. packages.RemoveAt(index);
  61. }
  62. }
  63. int FindPackage(IPackage package)
  64. {
  65. return packages.FindIndex(p => PackageEqualityComparer.IdAndVersion.Equals(package, p));
  66. }
  67. void AddPackageAtBeginning(IPackage package)
  68. {
  69. packages.Insert(0, package);
  70. }
  71. void RemoveLastPackageIfCurrentPackageCountExceedsMaximum()
  72. {
  73. if (packages.Count > maximumPackagesCount) {
  74. RemoveLastPackage();
  75. }
  76. }
  77. void RemoveLastPackage()
  78. {
  79. packages.RemoveAt(packages.Count - 1);
  80. }
  81. void UpdateRecentPackagesInOptions()
  82. {
  83. savedRecentPackages.Clear();
  84. savedRecentPackages.AddRange(GetRecentPackagesInfo());
  85. }
  86. List<RecentPackageInfo> GetRecentPackagesInfo()
  87. {
  88. List<RecentPackageInfo> allRecentPackages = new List<RecentPackageInfo>();
  89. foreach (IPackage package in packages) {
  90. var recentPackageInfo = new RecentPackageInfo(package);
  91. allRecentPackages.Add(recentPackageInfo);
  92. }
  93. return allRecentPackages;
  94. }
  95. public void RemovePackage(IPackage package)
  96. {
  97. }
  98. public IQueryable<IPackage> GetPackages()
  99. {
  100. UpdatePackages();
  101. return packages.AsQueryable();
  102. }
  103. void UpdatePackages()
  104. {
  105. if (!HasRecentPackagesBeenRead() && HasRecentPackages) {
  106. IEnumerable<IPackage> recentPackages = GetRecentPackages();
  107. packages.AddRange(recentPackages);
  108. }
  109. }
  110. bool HasRecentPackagesBeenRead()
  111. {
  112. return packages.Count > 0;
  113. }
  114. public bool HasRecentPackages {
  115. get { return savedRecentPackages.Count > 0; }
  116. }
  117. IEnumerable<IPackage> GetRecentPackages()
  118. {
  119. IEnumerable<IPackage> recentPackages = GetRecentPackagesFilteredById();
  120. return GetRecentPackagesFilteredByVersion(recentPackages);
  121. }
  122. IEnumerable<IPackage> GetRecentPackagesFilteredById()
  123. {
  124. IEnumerable<string> recentPackageIds = GetRecentPackageIds();
  125. return aggregateRepository.FindPackages(recentPackageIds);
  126. }
  127. IEnumerable<string> GetRecentPackageIds()
  128. {
  129. foreach (RecentPackageInfo recentPackageInfo in savedRecentPackages) {
  130. yield return recentPackageInfo.Id;
  131. }
  132. }
  133. IEnumerable<IPackage> GetRecentPackagesFilteredByVersion(IEnumerable<IPackage> recentPackages)
  134. {
  135. List<IPackage> filteredRecentPackages = new List<IPackage>();
  136. foreach (IPackage recentPackage in recentPackages) {
  137. foreach (RecentPackageInfo savedRecentPackageInfo in savedRecentPackages) {
  138. if (savedRecentPackageInfo.IsMatch(recentPackage)) {
  139. filteredRecentPackages.Add(recentPackage);
  140. }
  141. }
  142. }
  143. return filteredRecentPackages;
  144. }
  145. public int MaximumPackagesCount {
  146. get { return maximumPackagesCount; }
  147. set { maximumPackagesCount = value; }
  148. }
  149. public void Clear()
  150. {
  151. packages.Clear();
  152. UpdateRecentPackagesInOptions();
  153. }
  154. public bool SupportsPrereleasePackages {
  155. get { return false; }
  156. }
  157. public PackageSaveModes PackageSaveMode { get; set; }
  158. }
  159. }