- Timestamp:
- 08/03/10 17:20:46 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/3.2/sources/HeuristicLab.Hive.Client.Core/3.2/PluginCache.cs
r4042 r4140 2 2 using System.Collections.Generic; 3 3 using System.Linq; 4 using System.Runtime.CompilerServices; 4 5 using System.Text; 5 6 using HeuristicLab.PluginInfrastructure; … … 9 10 using HeuristicLab.Tracing; 10 11 using System.IO; 12 using HeuristicLab.PluginInfrastructure.Manager; 11 13 12 14 namespace HeuristicLab.Hive.Client.Core { 15 16 17 13 18 public class PluginCache { 14 19 15 20 private static PluginCache instance = null; 21 22 public const string PLUGIN_REPO = @"plugins\"; 23 24 private List<PluginDescription> cachedPlugins = new List<PluginDescription>(); 25 26 private PluginManager pm = new PluginManager(PLUGIN_REPO); 27 16 28 public static PluginCache Instance { 17 29 get { … … 22 34 } 23 35 24 private List<CachedHivePluginInfoDto> pluginCache;25 26 36 27 public PluginCache() { 28 pluginCache = new List<CachedHivePluginInfoDto>(); 29 } 30 31 public void AddPlugin(CachedHivePluginInfoDto plugin) { 32 pluginCache.Add(plugin); 37 public PluginCache() { 38 DoUpdateRun(); 33 39 } 34 40 35 public List<CachedHivePluginInfoDto> GetPlugins(List<HivePluginInfoDto> requests) { 41 private void DoUpdateRun() { 42 pm.DiscoverAndCheckPlugins(); 43 cachedPlugins = new List<PluginDescription>(pm.Plugins); 44 } 45 46 47 [MethodImpl(MethodImplOptions.Synchronized)] 48 public bool CopyPluginsForJob(List<HivePluginInfoDto> requests, Guid jobId) { 49 50 String targetDir = PLUGIN_REPO + jobId.ToString() + "\\"; 51 52 if(Directory.Exists(targetDir)) { 53 Directory.Delete(targetDir, true); 54 } 55 56 DirectoryInfo di = Directory.CreateDirectory(targetDir); 57 58 foreach (HivePluginInfoDto requestedPlugin in requests) { 59 PluginDescription pd = 60 cachedPlugins.Where( 61 cp => 62 cp.Name == requestedPlugin.Name && 63 cp.Version.Major == requestedPlugin.Version.Major && 64 cp.Version.Minor == requestedPlugin.Version.Minor && 65 cp.Version.Revision >= requestedPlugin.Version.Revision). 66 SingleOrDefault(); 67 if (pd == null) { 68 return false; 69 } 70 71 foreach(IPluginFile ipf in pd.Files) { 72 File.Copy(ipf.Name, targetDir + ipf.Name.Split('\\').Last()); 73 } 74 } 75 return true; 76 } 77 78 [MethodImpl(MethodImplOptions.Synchronized)] 79 internal void PreparePlugins(List<HivePluginInfoDto> requiredPlugins) { 36 80 Logger.Debug("Fetching plugins for job"); 37 List<CachedHivePluginInfoDto> neededPlugins = new List<CachedHivePluginInfoDto>(); 81 List<HivePluginInfoDto> localPlugins = new List<HivePluginInfoDto>(); 82 List<HivePluginInfoDto> neededPlugins = new List<HivePluginInfoDto>(); 38 83 List<HivePluginInfoDto> missingPlugins = new List<HivePluginInfoDto>(); 39 84 bool found = false; 40 41 foreach (HivePluginInfoDto info in requ ests) {85 86 foreach (HivePluginInfoDto info in requiredPlugins) { 42 87 //we MAY run in problems here - if there is a plugin twice in requests, there may be added two different versions of the plugin 43 foreach ( CachedHivePluginInfoDto cache in pluginCache) {44 if (info.Name.Equals(cache .Name) && info.Version.Equals(cache.Version) && info.BuildDate <= cache.BuildDate) {88 foreach (PluginDescription cachedPlugin in cachedPlugins) { 89 if (info.Name.Equals(cachedPlugin.Name)) { 45 90 Logger.Debug("Found plugin " + info.Name + ", " + info.Version); 46 neededPlugins.Add(cache); 91 localPlugins.Add(new HivePluginInfoDto() { BuildDate = DateTime.Now, Id = new Guid(), Name = info.Name, Version = info.Version, Update = true}); 92 neededPlugins.Add(info); 47 93 found = true; 94 48 95 break; 49 96 } 50 97 } 51 if (!found) 52 Logger.Debug(" FoundNOT found " + info.Name + ", " + info.Version);98 if (!found) { 99 Logger.Debug("Plugin NOT found " + info.Name + ", " + info.Version); 53 100 missingPlugins.Add(info); 101 } 54 102 found = false; 55 103 } 56 104 57 Logger.Debug("Requesting missing plugins"); 58 List<CachedHivePluginInfoDto> receivedPlugins = WcfService.Instance.RequestPlugins(missingPlugins); 59 Logger.Debug("Requested missing plugins"); 105 Logger.Debug("First run - Update the plugins in the cache"); 60 106 61 if (receivedPlugins != null) { 62 neededPlugins.AddRange(receivedPlugins); 63 pluginCache.AddRange(receivedPlugins); 64 } else 65 Logger.Error("Fetching of the plugins failed!"); 107 localPlugins.AddRange(missingPlugins); 66 108 67 return neededPlugins; 109 List<CachedHivePluginInfoDto> updateablePlugins = WcfService.Instance.RequestPlugins(localPlugins); 110 111 foreach (CachedHivePluginInfoDto updateablePlugin in updateablePlugins) { 112 PluginDescription pd = 113 cachedPlugins.Where(cachedPlugin => cachedPlugin.Name.Equals(updateablePlugin.Name)).SingleOrDefault(); 114 115 if (pd != null) { 116 Logger.Debug("deleting old files"); 117 foreach (IPluginFile ipf in pd.Files) { 118 File.Delete(ipf.Name); 119 } 120 } 121 122 Logger.Debug("deleted old files"); 123 Logger.Debug("creating new files"); 124 125 126 127 foreach (HivePluginFile pf in updateablePlugin.PluginFiles) { 128 File.WriteAllBytes(PLUGIN_REPO + pf.Name.Split('\\').Last(), pf.BinaryFile); 129 } 130 131 Logger.Debug("created new files"); 132 DoUpdateRun(); 133 } 68 134 } 69 135 70 71 internal void PreparePlugins(List<HivePluginInfoDto> requiredPlugins) { 72 List<HivePluginInfoDto> missingPlugins = new List<HivePluginInfoDto>(); 73 foreach (HivePluginInfoDto requiredPlugin in requiredPlugins) { 74 if(ApplicationManager.Manager.Plugins.Count(ipd => ipd.Version.Major == requiredPlugin.Version.Major && ipd.Version.Minor >= requiredPlugin.Version.Minor) == 0) { 75 missingPlugins.Add(requiredPlugin); 76 } 136 internal void DeletePluginsForJob(Guid id) { 137 try { 138 Logger.Debug("unloading..."); 139 Directory.Delete(Path.Combine(PLUGIN_REPO, id.ToString()), true); 140 } catch (Exception ex) { 141 Logger.Debug("failed while unloading " + id + " with exception " + ex); 77 142 } 78 79 Logger.Debug("Requesting missing plugins");80 List<CachedHivePluginInfoDto> receivedPlugins = WcfService.Instance.RequestPlugins(missingPlugins);81 Logger.Debug("Requested missing plugins");82 83 foreach (CachedHivePluginInfoDto receivedPlugin in receivedPlugins) {84 foreach (HivePluginFile hpf in receivedPlugin.PluginFiles) {85 Logger.Info("writing file " + hpf.Name);86 File.WriteAllBytes("C:\\temp\\" + hpf.Name.Split('\\').Last(), hpf.BinaryFile);87 }88 }89 90 143 } 91 144 }
Note: See TracChangeset
for help on using the changeset viewer.