From 6f7f3336b385b713c723f9233b19acc83e25e9c4 Mon Sep 17 00:00:00 2001 From: Gary Sharp Date: Thu, 20 Jun 2013 12:33:52 +1000 Subject: [PATCH] Fix: On Startup, only Update Plugins if installed --- Disco.BI/Properties/AssemblyInfo.cs | 4 +- Disco.Data/Properties/AssemblyInfo.cs | 4 +- Disco.Models/Properties/AssemblyInfo.cs | 4 +- Disco.Services/Plugins/UpdatePluginTask.cs | 65 ++++++---- Disco.Services/Properties/AssemblyInfo.cs | 4 +- .../Properties/AssemblyInfo.cs | 4 +- Disco.Web/App_Start/AppConfig.cs | 93 +++++++-------- Disco.Web/Global.asax.cs | 111 +++++++++--------- Disco.Web/Properties/AssemblyInfo.cs | 4 +- 9 files changed, 153 insertions(+), 140 deletions(-) diff --git a/Disco.BI/Properties/AssemblyInfo.cs b/Disco.BI/Properties/AssemblyInfo.cs index 5f232fe5..a22a41ab 100644 --- a/Disco.BI/Properties/AssemblyInfo.cs +++ b/Disco.BI/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.2.0618.1707")] -[assembly: AssemblyFileVersion("1.2.0618.1707")] \ No newline at end of file +[assembly: AssemblyVersion("1.2.0620.1229")] +[assembly: AssemblyFileVersion("1.2.0620.1229")] \ No newline at end of file diff --git a/Disco.Data/Properties/AssemblyInfo.cs b/Disco.Data/Properties/AssemblyInfo.cs index 0db0d938..17a88277 100644 --- a/Disco.Data/Properties/AssemblyInfo.cs +++ b/Disco.Data/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.2.0618.1707")] -[assembly: AssemblyFileVersion("1.2.0618.1707")] \ No newline at end of file +[assembly: AssemblyVersion("1.2.0620.1229")] +[assembly: AssemblyFileVersion("1.2.0620.1229")] \ No newline at end of file diff --git a/Disco.Models/Properties/AssemblyInfo.cs b/Disco.Models/Properties/AssemblyInfo.cs index a9658f5d..d15e1711 100644 --- a/Disco.Models/Properties/AssemblyInfo.cs +++ b/Disco.Models/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.2.0618.1707")] -[assembly: AssemblyFileVersion("1.2.0618.1707")] \ No newline at end of file +[assembly: AssemblyVersion("1.2.0620.1229")] +[assembly: AssemblyFileVersion("1.2.0620.1229")] \ No newline at end of file diff --git a/Disco.Services/Plugins/UpdatePluginTask.cs b/Disco.Services/Plugins/UpdatePluginTask.cs index c0ae07ad..d64a3e4a 100644 --- a/Disco.Services/Plugins/UpdatePluginTask.cs +++ b/Disco.Services/Plugins/UpdatePluginTask.cs @@ -82,21 +82,12 @@ namespace Disco.Services.Plugins Plugins.RestartApp(1500); } - internal static void UpdateOffline(ScheduledTaskStatus Status) + public static List OfflineInstalledPlugins(DiscoDataContext dbContext) { - string pluginsLocation; - string pluginPackagesLocation; - string pluginsStorageLocation; - PluginLibraryUpdateResponse pluginCatalogue; - List> UpdatePlugins = new List>(); + string pluginsLocation = dbContext.DiscoConfiguration.PluginsLocation; + string pluginsStorageLocation = dbContext.DiscoConfiguration.PluginStorageLocation; - using (DiscoDataContext dbContext = new DiscoDataContext()) - { - pluginCatalogue = Plugins.LoadCatalogue(dbContext); - pluginsLocation = dbContext.DiscoConfiguration.PluginsLocation; - pluginPackagesLocation = dbContext.DiscoConfiguration.PluginPackagesLocation; - pluginsStorageLocation = dbContext.DiscoConfiguration.PluginStorageLocation; - } + List installedPluginManifests = new List(); DirectoryInfo pluginDirectoryRoot = new DirectoryInfo(pluginsLocation); if (pluginDirectoryRoot.Exists) @@ -114,22 +105,48 @@ namespace Disco.Services.Plugins catch (Exception) { } if (pluginManifest != null) - { - // Check for Update - var catalogueItem = pluginCatalogue.Plugins.FirstOrDefault(i => i.Id == pluginManifest.Id && Version.Parse(i.LatestVersion) > pluginManifest.Version); - - if (catalogueItem != null) - { // Update Available - UpdatePlugins.Add(new Tuple(pluginManifest, null, catalogueItem)); - } - } + installedPluginManifests.Add(pluginManifest); } } } - if (UpdatePlugins.Count > 0) + return installedPluginManifests; + } + + internal static void UpdateOffline(ScheduledTaskStatus Status) + { + PluginLibraryUpdateResponse pluginCatalogue = null; + List installedPluginManifests; + string pluginPackagesLocation; + List> updatePlugins = new List>(); + + + using (DiscoDataContext dbContext = new DiscoDataContext()) { - ExecuteTaskInternal(Status, pluginPackagesLocation, UpdatePlugins); + pluginPackagesLocation = dbContext.DiscoConfiguration.PluginPackagesLocation; + installedPluginManifests = OfflineInstalledPlugins(dbContext); + + if (installedPluginManifests.Count > 0) + pluginCatalogue = Plugins.LoadCatalogue(dbContext); + } + + if (pluginCatalogue != null && installedPluginManifests.Count > 0) + { + foreach (var pluginManifest in installedPluginManifests) + { + // Check for Update + var catalogueItem = pluginCatalogue.Plugins.FirstOrDefault(i => i.Id == pluginManifest.Id && Version.Parse(i.LatestVersion) > pluginManifest.Version); + + if (catalogueItem != null) + { // Update Available + updatePlugins.Add(new Tuple(pluginManifest, null, catalogueItem)); + } + } + } + + if (updatePlugins.Count > 0) + { + ExecuteTaskInternal(Status, pluginPackagesLocation, updatePlugins); } } diff --git a/Disco.Services/Properties/AssemblyInfo.cs b/Disco.Services/Properties/AssemblyInfo.cs index 63dfcdec..c246ebbd 100644 --- a/Disco.Services/Properties/AssemblyInfo.cs +++ b/Disco.Services/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.2.0618.1707")] -[assembly: AssemblyFileVersion("1.2.0618.1707")] \ No newline at end of file +[assembly: AssemblyVersion("1.2.0620.1229")] +[assembly: AssemblyFileVersion("1.2.0620.1229")] \ No newline at end of file diff --git a/Disco.Web.Extensions/Properties/AssemblyInfo.cs b/Disco.Web.Extensions/Properties/AssemblyInfo.cs index 4d1b974f..f049d9e9 100644 --- a/Disco.Web.Extensions/Properties/AssemblyInfo.cs +++ b/Disco.Web.Extensions/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.2.0618.1707")] -[assembly: AssemblyFileVersion("1.2.0618.1707")] \ No newline at end of file +[assembly: AssemblyVersion("1.2.0620.1229")] +[assembly: AssemblyFileVersion("1.2.0620.1229")] \ No newline at end of file diff --git a/Disco.Web/App_Start/AppConfig.cs b/Disco.Web/App_Start/AppConfig.cs index 02b27ae4..612cfde2 100644 --- a/Disco.Web/App_Start/AppConfig.cs +++ b/Disco.Web/App_Start/AppConfig.cs @@ -25,42 +25,40 @@ namespace Disco.Web return true; } - public static void InitalizeEnvironment() + public static void InitalizeEnvironment(DiscoDataContext dbContext) { - using (var dbContext = new DiscoDataContext()) + // Initialize Logging + Disco.Services.Logging.LogContext.Initalize(dbContext, DiscoApplication.SchedulerFactory); + + // Load Organisation Name + DiscoApplication.OrganisationName = dbContext.DiscoConfiguration.OrganisationName; + DiscoApplication.MultiSiteMode = dbContext.DiscoConfiguration.MultiSiteMode; + + // Setup Global Proxy + DiscoApplication.SetGlobalProxy(dbContext.DiscoConfiguration.ProxyAddress, + dbContext.DiscoConfiguration.ProxyPort, + dbContext.DiscoConfiguration.ProxyUsername, + dbContext.DiscoConfiguration.ProxyPassword); + + // Initialize Expressions + BI.Expressions.Expression.InitializeExpressions(); + + // Initialize Warranty Providers Plugins + Disco.Services.Plugins.Plugins.InitalizePlugins(dbContext); + + // Initialize Scheduled Tasks + Disco.Services.Tasks.ScheduledTasks.InitalizeScheduledTasks(dbContext, DiscoApplication.SchedulerFactory, true); + + // Schedule Immediate Check for Update (if never updated, or last updated over 2 days ago) + if (dbContext.DiscoConfiguration.UpdateLastCheck == null || + dbContext.DiscoConfiguration.UpdateLastCheck.ResponseTimestamp < DateTime.Now.AddDays(-2)) { - // Initialize Logging - Disco.Services.Logging.LogContext.Initalize(dbContext, DiscoApplication.SchedulerFactory); - - // Load Organisation Name - DiscoApplication.OrganisationName = dbContext.DiscoConfiguration.OrganisationName; - DiscoApplication.MultiSiteMode = dbContext.DiscoConfiguration.MultiSiteMode; - - // Setup Global Proxy - DiscoApplication.SetGlobalProxy(dbContext.DiscoConfiguration.ProxyAddress, - dbContext.DiscoConfiguration.ProxyPort, - dbContext.DiscoConfiguration.ProxyUsername, - dbContext.DiscoConfiguration.ProxyPassword); - - // Initialize Expressions - BI.Expressions.Expression.InitializeExpressions(); - - // Initialize Warranty Providers Plugins - Disco.Services.Plugins.Plugins.InitalizePlugins(dbContext); - - // Initialize Scheduled Tasks - Disco.Services.Tasks.ScheduledTasks.InitalizeScheduledTasks(dbContext, DiscoApplication.SchedulerFactory, true); - - // Schedule Immediate Check for Update (if never updated, or last updated over 2 days ago) - if (dbContext.DiscoConfiguration.UpdateLastCheck == null || - dbContext.DiscoConfiguration.UpdateLastCheck.ResponseTimestamp < DateTime.Now.AddDays(-2)) - { - Disco.BI.Interop.Community.UpdateCheckTask.ScheduleNow(); - } - - // Setup Attachment Monitor - DiscoApplication.DocumentDropBoxMonitor = new BI.DocumentTemplateBI.Importer.DocumentDropBoxMonitor(dbContext, DiscoApplication.SchedulerFactory, HttpContext.Current.Cache); + Disco.BI.Interop.Community.UpdateCheckTask.ScheduleNow(); } + + // Setup Attachment Monitor + DiscoApplication.DocumentDropBoxMonitor = new BI.DocumentTemplateBI.Importer.DocumentDropBoxMonitor(dbContext, DiscoApplication.SchedulerFactory, HttpContext.Current.Cache); + DiscoApplication.DocumentDropBoxMonitor.StartWatching(); DiscoApplication.DocumentDropBoxMonitor.ScheduleCurrentFiles(10); @@ -68,26 +66,23 @@ namespace Disco.Web Disco.BI.Interop.SignalRHandlers.RepositoryMonitorNotifications.Initialize(); } - public static void InitializeUpdateEnvironment() + public static void InitializeUpdateEnvironment(DiscoDataContext dbContext) { - using (var dbContext = new DiscoDataContext()) - { - // Initialize Logging - Disco.Services.Logging.LogContext.Initalize(dbContext, DiscoApplication.SchedulerFactory); + // Initialize Logging + Disco.Services.Logging.LogContext.Initalize(dbContext, DiscoApplication.SchedulerFactory); - // Load Organisation Name - DiscoApplication.OrganisationName = dbContext.DiscoConfiguration.OrganisationName; - DiscoApplication.MultiSiteMode = dbContext.DiscoConfiguration.MultiSiteMode; + // Load Organisation Name + DiscoApplication.OrganisationName = dbContext.DiscoConfiguration.OrganisationName; + DiscoApplication.MultiSiteMode = dbContext.DiscoConfiguration.MultiSiteMode; - // Setup Global Proxy - DiscoApplication.SetGlobalProxy(dbContext.DiscoConfiguration.ProxyAddress, - dbContext.DiscoConfiguration.ProxyPort, - dbContext.DiscoConfiguration.ProxyUsername, - dbContext.DiscoConfiguration.ProxyPassword); + // Setup Global Proxy + DiscoApplication.SetGlobalProxy(dbContext.DiscoConfiguration.ProxyAddress, + dbContext.DiscoConfiguration.ProxyPort, + dbContext.DiscoConfiguration.ProxyUsername, + dbContext.DiscoConfiguration.ProxyPassword); - // Initialize Scheduled Tasks - Disco.Services.Tasks.ScheduledTasks.InitalizeScheduledTasks(dbContext, DiscoApplication.SchedulerFactory, true); - } + // Initialize Scheduled Tasks + Disco.Services.Tasks.ScheduledTasks.InitalizeScheduledTasks(dbContext, DiscoApplication.SchedulerFactory, true); } public static void DisposeEnvironment() diff --git a/Disco.Web/Global.asax.cs b/Disco.Web/Global.asax.cs index 92a466ed..c788ccaf 100644 --- a/Disco.Web/Global.asax.cs +++ b/Disco.Web/Global.asax.cs @@ -38,68 +38,69 @@ namespace Disco.Web if (AppConfig.InitializeDatabase()) { // Database Initialized - Debug.WriteLine("Initialized Database: +{0}ms", timer.ElapsedMilliseconds - timer_last); timer_last = timer.ElapsedMilliseconds; - // Check for Post-Update - bool ignoreVersionUpdate = false; - bool.TryParse(ConfigurationManager.AppSettings["DiscoIgnoreVersionUpdate"], out ignoreVersionUpdate); - Version previousVersion = null; - - if (!ignoreVersionUpdate) + using (DiscoDataContext dbContext = new DiscoDataContext()) { - using (DiscoDataContext dbContext = new DiscoDataContext()) - { - previousVersion = dbContext.DiscoConfiguration.InstalledDatabaseVersion; - } - } - if (ignoreVersionUpdate || Disco.BI.Interop.Community.UpdateCheck.CurrentDiscoVersion() == previousVersion) - { - // Normal Startup - - AreaRegistration.RegisterAllAreas(); - - Debug.WriteLine("Registered Areas: +{0}ms", timer.ElapsedMilliseconds - timer_last); - timer_last = timer.ElapsedMilliseconds; - - WebApiConfig.Register(GlobalConfiguration.Configuration); - - Debug.WriteLine("Registered API: +{0}ms", timer.ElapsedMilliseconds - timer_last); - timer_last = timer.ElapsedMilliseconds; - - FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); - - Debug.WriteLine("Registered Global Filters: +{0}ms", timer.ElapsedMilliseconds - timer_last); - timer_last = timer.ElapsedMilliseconds; - - RouteConfig.RegisterRoutes(RouteTable.Routes); - - Debug.WriteLine("Registered Routes: +{0}ms", timer.ElapsedMilliseconds - timer_last); - timer_last = timer.ElapsedMilliseconds; - - BundleConfig.RegisterBundles(); - - Debug.WriteLine("Registered Bundles: +{0}ms", timer.ElapsedMilliseconds - timer_last); - timer_last = timer.ElapsedMilliseconds; - - AppConfig.InitalizeEnvironment(); - - Debug.WriteLine("Initialized Environment: +{0}ms", timer.ElapsedMilliseconds - timer_last); - timer_last = timer.ElapsedMilliseconds; - } - else - { - // Post-Update Startup - FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); - RouteConfig.RegisterUpdateRoutes(RouteTable.Routes); - BundleConfig.RegisterBundles(); - AppConfig.InitializeUpdateEnvironment(); - - using (DiscoDataContext dbContext = new DiscoDataContext()) + // Check for Post-Update + bool isVersionUpdate = dbContext.DiscoConfiguration.InstalledDatabaseVersion != Disco.BI.Interop.Community.UpdateCheck.CurrentDiscoVersion(); + bool ignoreVersionUpdate = false; + + if (isVersionUpdate) { + // Update Database with New Version dbContext.DiscoConfiguration.InstalledDatabaseVersion = Disco.BI.Interop.Community.UpdateCheck.CurrentDiscoVersion(); dbContext.SaveChanges(); + + // Check if configured to Ignore Plugin Updates (Mainly for Dev environment) + bool.TryParse(ConfigurationManager.AppSettings["DiscoIgnoreVersionUpdate"], out ignoreVersionUpdate); + // Only Update if Plugins are installed + if (!ignoreVersionUpdate) + ignoreVersionUpdate = (Disco.Services.Plugins.UpdatePluginTask.OfflineInstalledPlugins(dbContext).Count == 0); + } + + if (!isVersionUpdate || ignoreVersionUpdate) + { + // Normal Startup + + AreaRegistration.RegisterAllAreas(); + + Debug.WriteLine("Registered Areas: +{0}ms", timer.ElapsedMilliseconds - timer_last); + timer_last = timer.ElapsedMilliseconds; + + WebApiConfig.Register(GlobalConfiguration.Configuration); + + Debug.WriteLine("Registered API: +{0}ms", timer.ElapsedMilliseconds - timer_last); + timer_last = timer.ElapsedMilliseconds; + + FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); + + Debug.WriteLine("Registered Global Filters: +{0}ms", timer.ElapsedMilliseconds - timer_last); + timer_last = timer.ElapsedMilliseconds; + + RouteConfig.RegisterRoutes(RouteTable.Routes); + + Debug.WriteLine("Registered Routes: +{0}ms", timer.ElapsedMilliseconds - timer_last); + timer_last = timer.ElapsedMilliseconds; + + BundleConfig.RegisterBundles(); + + Debug.WriteLine("Registered Bundles: +{0}ms", timer.ElapsedMilliseconds - timer_last); + timer_last = timer.ElapsedMilliseconds; + + AppConfig.InitalizeEnvironment(dbContext); + + Debug.WriteLine("Initialized Environment: +{0}ms", timer.ElapsedMilliseconds - timer_last); + timer_last = timer.ElapsedMilliseconds; + } + else + { + // Post-Update Startup + FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); + RouteConfig.RegisterUpdateRoutes(RouteTable.Routes); + BundleConfig.RegisterBundles(); + AppConfig.InitializeUpdateEnvironment(dbContext); } } } diff --git a/Disco.Web/Properties/AssemblyInfo.cs b/Disco.Web/Properties/AssemblyInfo.cs index f71cd6f4..3a8cba8e 100644 --- a/Disco.Web/Properties/AssemblyInfo.cs +++ b/Disco.Web/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("1.2.0618.1707")] -[assembly: AssemblyFileVersion("1.2.0618.1707")] \ No newline at end of file +[assembly: AssemblyVersion("1.2.0620.1229")] +[assembly: AssemblyFileVersion("1.2.0620.1229")] \ No newline at end of file