From bf08cf7dc703bba261d918d7db28c05bad0ea88f Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Mon, 26 Sep 2011 14:59:33 -0700 Subject: [PATCH] Including Renaud's fixes to package updates --HG-- branch : 1.x --- .../Controllers/GalleryUpdatesController.cs | 9 +++-- .../Models/UpdatePackageEntry.cs | 1 + .../Services/PackageUpdateManager.cs | 40 +++++++++---------- .../Services/PackagingSourceManager.cs | 40 ++++++++++++------- .../ViewModels/PackagingListViewModel.cs | 2 + .../GalleryUpdates/ModulesUpdates.cshtml | 2 +- .../Views/GalleryUpdates/ThemesUpdates.cshtml | 4 ++ 7 files changed, 58 insertions(+), 40 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/GalleryUpdatesController.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/GalleryUpdatesController.cs index 371572ed6..6a559ab06 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/GalleryUpdatesController.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/GalleryUpdatesController.cs @@ -67,7 +67,8 @@ namespace Orchard.Packaging.Controllers { public ActionResult ReloadUpdates(string returnUrl) { _packageUpdateService.TriggerRefresh(); - + _backgroundPackageUpdateStatus.Value = null; + Services.Notifier.Warning(T("The feed has been notified for update. It might take a few minutes before the updates are displayed.")); return this.RedirectLocal(returnUrl); @@ -97,8 +98,9 @@ namespace Orchard.Packaging.Controllers { IEnumerable updatedPackages = _backgroundPackageUpdateStatus.Value.Entries .Where(updatePackageEntry => - updatePackageEntry.ExtensionsDescriptor.ExtensionType.Equals(extensionType) && - updatePackageEntry.NewVersionToInstall != null); + updatePackageEntry.ExtensionsDescriptor.ExtensionType.Equals(extensionType) && + updatePackageEntry.NewVersionToInstall != null) + .ToList(); int totalItemCount = updatedPackages.Count(); @@ -107,6 +109,7 @@ namespace Orchard.Packaging.Controllers { } return View(view, new PackagingListViewModel { + LastUpdateCheckUtc = _backgroundPackageUpdateStatus.Value.DateTimeUtc, Entries = updatedPackages, Pager = Shape.Pager(pager).TotalItemCount(totalItemCount) }); diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Models/UpdatePackageEntry.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Models/UpdatePackageEntry.cs index 9ee31ba6e..e685c55f3 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Models/UpdatePackageEntry.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Models/UpdatePackageEntry.cs @@ -5,6 +5,7 @@ using Orchard.Environment.Extensions.Models; namespace Orchard.Packaging.Models { public class PackagesStatusResult { + public DateTime DateTimeUtc { get; set; } public IEnumerable Entries { get; set; } public IEnumerable Errors { get; set; } } diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageUpdateManager.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageUpdateManager.cs index 45ba4e613..b94f58239 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageUpdateManager.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageUpdateManager.cs @@ -49,6 +49,7 @@ namespace Orchard.Packaging.Services { foreach (var source in sources) { var sourceResult = GetPackages(source); + result.DateTimeUtc = sourceResult.DateTimeUtc; result.Entries = result.Entries.Concat(sourceResult.Entries); result.Errors = result.Errors.Concat(sourceResult.Errors); } @@ -61,28 +62,25 @@ namespace Orchard.Packaging.Services { } private PackagesStatusResult GetPackages(PackagingSource packagingSource) { - // Refresh every time 5 minutes AND signal was triggered (not or, otherwise the request would go every 5 minutes, whatever) - // Signal is triggered when the Modules page is displayed - return _cacheManager.Get(packagingSource.FeedUrl, ctx1 => { - ctx1.Monitor(_clock.When(TimeSpan.FromMinutes(5))); + // Refresh every 23 hours or when signal was triggered + return _cacheManager.Get(packagingSource.FeedUrl, ctx => { + ctx.Monitor(_clock.When(TimeSpan.FromMinutes(60 * 23))); + ctx.Monitor(_signals.When("PackageUpdateService")); - return _cacheManager.Get(packagingSource.FeedUrl, ctx2 => { - ctx2.Monitor(_signals.When("PackageUpdateService")); - - // We cache exception because we are calling on a network feed, and failure may - // take quite some time. - var result = new PackagesStatusResult { - Entries = new List(), - Errors = new List() - }; - try { - result.Entries = GetPackagesWorker(packagingSource); - } - catch (Exception e) { - result.Errors = new[] { e }; - } - return result; - }); + // We cache exception because we are calling on a network feed, and failure may + // take quite some time. + var result = new PackagesStatusResult { + DateTimeUtc = _clock.UtcNow, + Entries = new List(), + Errors = new List() + }; + try { + result.Entries = GetPackagesWorker(packagingSource); + } + catch (Exception e) { + result.Errors = new[] { e }; + } + return result; }); } diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackagingSourceManager.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackagingSourceManager.cs index 5adc82fbb..5963b1e5f 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackagingSourceManager.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Services/PackagingSourceManager.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net; using Orchard.Data; using Orchard.Environment.Extensions; using Orchard.Localization; @@ -43,7 +44,7 @@ namespace Orchard.Packaging.Services { /// The feed url. /// The feed identifier. public int AddSource(string feedTitle, string feedUrl) { - PackagingSource packagingSource = new PackagingSource { FeedTitle = feedTitle, FeedUrl = feedUrl }; + var packagingSource = new PackagingSource { FeedTitle = feedTitle, FeedUrl = feedUrl }; _packagingSourceRecordRepository.Create(packagingSource); @@ -70,20 +71,29 @@ namespace Orchard.Packaging.Services { /// The list of extensions. public IEnumerable GetExtensionList(bool includeScreenshots, PackagingSource packagingSource = null, Func, IQueryable> query = null) { return (packagingSource == null ? GetSources() : new[] {packagingSource}) - .SelectMany( - source => { - var galleryFeedContext = new GalleryFeedContext(new Uri(source.FeedUrl)) { IgnoreMissingProperties = true }; - IQueryable packages = includeScreenshots - ? galleryFeedContext.Packages.Expand("Screenshots") - : galleryFeedContext.Packages; - - if (query != null) { - packages = query(packages); - } + .SelectMany(source => GetExtensionListFromSource(includeScreenshots, packagingSource, query, source)); + } - return packages.ToList().Select(p => CreatePackageEntry(p, packagingSource, galleryFeedContext.GetReadStreamUri(p))); - } - ); + private static IEnumerable GetExtensionListFromSource(bool includeScreenshots, PackagingSource packagingSource, Func, IQueryable> query, PackagingSource source) { + var galleryFeedContext = new GalleryFeedContext(new Uri(source.FeedUrl)) { IgnoreMissingProperties = true }; + + // Setup compression + galleryFeedContext.SendingRequest += (o, e) => { + if (e.Request is HttpWebRequest) { + (e.Request as HttpWebRequest).AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; + } + }; + + // Include screenshots if needed + IQueryable packages = includeScreenshots + ? galleryFeedContext.Packages.Expand("Screenshots") + : galleryFeedContext.Packages; + + if (query != null) { + packages = query(packages); + } + + return packages.ToList().Select(p => CreatePackageEntry(p, packagingSource, galleryFeedContext.GetReadStreamUri(p))); } /// @@ -110,7 +120,7 @@ namespace Orchard.Packaging.Services { #endregion private static PackagingEntry CreatePackageEntry(PublishedPackage package, PackagingSource source, Uri downloadUri) { - Uri baseUri = new Uri(string.Format("{0}://{1}:{2}/", + var baseUri = new Uri(string.Format("{0}://{1}:{2}/", downloadUri.Scheme, downloadUri.Host, downloadUri.Port)); diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/ViewModels/PackagingListViewModel.cs b/src/Orchard.Web/Modules/Orchard.Packaging/ViewModels/PackagingListViewModel.cs index 3b8d45003..eaf19fe05 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/ViewModels/PackagingListViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/ViewModels/PackagingListViewModel.cs @@ -1,8 +1,10 @@ +using System; using System.Collections.Generic; using Orchard.Packaging.Models; namespace Orchard.Packaging.ViewModels { public class PackagingListViewModel { + public DateTime? LastUpdateCheckUtc { get; set; } public IEnumerable Entries { get; set; } public dynamic Pager { get; set; } } diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Views/GalleryUpdates/ModulesUpdates.cshtml b/src/Orchard.Web/Modules/Orchard.Packaging/Views/GalleryUpdates/ModulesUpdates.cshtml index 3ccac9f02..eb4863754 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Views/GalleryUpdates/ModulesUpdates.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Views/GalleryUpdates/ModulesUpdates.cshtml @@ -26,7 +26,7 @@ }
- @T("Refresh") + @T("Check for Updates")
@if (Model.Entries.Count() <= 0) { diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Views/GalleryUpdates/ThemesUpdates.cshtml b/src/Orchard.Web/Modules/Orchard.Packaging/Views/GalleryUpdates/ThemesUpdates.cshtml index 7c153362a..ce0031b1f 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Views/GalleryUpdates/ThemesUpdates.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Views/GalleryUpdates/ThemesUpdates.cshtml @@ -25,6 +25,10 @@ } } +
+ @T("Check for Updates") +
+ @if (Model.Entries.Count() <= 0) {

@T("No theme updates available.").ToString()

} else {