Changeset 16992


Ignore:
Timestamp:
05/29/19 11:20:22 (7 weeks ago)
Author:
gkronber
Message:

#2520: Use ContentManager in Clipboard and StartPage. Show info when objects cannot be restored.

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/HeuristicLab.Common/3.3/Content/ContentManager.cs

    r16565 r16992  
    2121
    2222using System;
     23using System.Collections.Generic;
     24using System.Linq;
    2325using System.Threading;
     26using System.Threading.Tasks;
     27using HEAL.Attic;
    2428
    2529namespace HeuristicLab.Common {
    2630  public abstract class ContentManager {
     31    public class Info {
     32      public Info() { }
     33
     34      public Info(string filename, TimeSpan duration) {
     35        Filename = filename;
     36        Duration = duration;
     37      }
     38
     39      public Info(string filename, SerializationInfo serInfo) {
     40        Filename = filename;
     41        Duration = serInfo.Duration;
     42        UnknownTypeGuids = serInfo.UnknownTypeGuids;
     43        NumberOfSerializedObjects = serInfo.NumberOfSerializedObjects;
     44        SerializedTypes = serInfo.SerializedTypes;       
     45      }
     46
     47      public TimeSpan Duration { get; internal set; }
     48      public IEnumerable<Guid> UnknownTypeGuids { get; internal set; } = Enumerable.Empty<Guid>();
     49      public int NumberOfSerializedObjects { get; internal set; }
     50      public IEnumerable<Type> SerializedTypes { get; internal set; } = Enumerable.Empty<Type>();
     51      public string Filename { get; internal set; } = string.Empty;
     52    }
     53
    2754    private static ContentManager instance;
    2855
     
    3663
    3764    public static IStorableContent Load(string filename) {
     65      return Load(filename, out var _);
     66    }
     67
     68    public static IStorableContent Load(string filename, out Info serializationInfo) {
    3869      if (instance == null) throw new InvalidOperationException("ContentManager is not initialized.");
    39       IStorableContent content = instance.LoadContent(filename);
    40       content.Filename = filename;
     70      IStorableContent content = instance.LoadContent(filename, out serializationInfo);
     71     
     72      if (content != null) content.Filename = filename;
    4173      return content;
    4274    }
    43     public static void LoadAsync(string filename, Action<IStorableContent, Exception> loadingCompletedCallback) {
     75
     76
     77    public static Task LoadAsync(string filename, Action<IStorableContent, Exception> loadingCompletedCallback) {
     78      return LoadAsync(filename, (content, error, info) => loadingCompletedCallback(content, error)); // drop info
     79    }
     80
     81    public static async Task LoadAsync(string filename, Action<IStorableContent, Exception, Info> loadingCompletedCallback) {
    4482      if (instance == null) throw new InvalidOperationException("ContentManager is not initialized.");
    45       var func = new Func<string, IStorableContent>(instance.LoadContent);
    46       func.BeginInvoke(filename, delegate (IAsyncResult result) {
    47         Exception error = null;
    48         IStorableContent content = null;
    49         try {
    50           content = func.EndInvoke(result);
    51           content.Filename = filename;
    52         } catch (Exception ex) {
    53           error = ex;
    54         }
    55         loadingCompletedCallback(content, error);
    56       }, null);
     83
     84      Exception error = null;
     85      IStorableContent result = null;
     86      Info serializationInfo = null;
     87      try {
     88        result = await Task.Run(() => {
     89          var content = instance.LoadContent(filename, out serializationInfo);
     90          if(content!=null) content.Filename = filename;
     91          return content;
     92        });
     93      } catch(Exception ex) {
     94        error = ex;
     95      }
     96      loadingCompletedCallback(result, error, serializationInfo);
    5797    }
    58     protected abstract IStorableContent LoadContent(string filename);
     98
     99    protected abstract IStorableContent LoadContent(string filename, out Info serializationInfo);
    59100
    60101    public static void Save(IStorableContent content, string filename, bool compressed, CancellationToken cancellationToken = default(CancellationToken)) {
  • trunk/HeuristicLab.Core.Views/3.3/Clipboard.cs

    r16565 r16992  
    157157      foreach (string filename in items) {
    158158        try {
    159           var ser = new ProtoBufSerializer();
    160           T item = (T)ser.Deserialize(filename);
     159          T item = (T)ContentManager.Load(filename);
    161160          OnItemLoaded(item, progressBar.Maximum / items.Length);
    162         } catch (Exception) {
    163           try {
    164             // try old format if protobuf deserialization fails
    165             T item = XmlParser.Deserialize<T>(filename);
    166             OnItemLoaded(item, progressBar.Maximum / items.Length);
    167           } catch (Exception) { }
     161        } catch(Exception) {
     162          // ignore if loading a clipboad item fails.
    168163        }
    169164      }
  • trunk/HeuristicLab.Core/3.3/PersistenceContentManager.cs

    r16945 r16992  
    2525using HEAL.Attic;
    2626using System;
     27using System.Diagnostics;
    2728
    2829namespace HeuristicLab.Core {
     
    3031    public PersistenceContentManager() : base() { }
    3132
    32     protected override IStorableContent LoadContent(string filename) {
     33    protected override IStorableContent LoadContent(string filename, out Info info) {
    3334      bool useOldPersistence = XmlParser.CanOpen(filename);
    34       if (useOldPersistence) return XmlParser.Deserialize<IStorableContent>(filename);
     35      IStorableContent content = null;
     36      if (useOldPersistence) {
     37        var sw = new Stopwatch();
     38        sw.Start();
     39        content = XmlParser.Deserialize<IStorableContent>(filename);
     40        sw.Stop();
     41        info = new Info(filename, sw.Elapsed);
     42      } else {
     43        var ser = new ProtoBufSerializer();
     44        content = (IStorableContent)ser.Deserialize(filename, out SerializationInfo serInfo);
     45        info = new Info(filename, serInfo);
     46      }
     47      if (content == null) throw new PersistenceException($"Cannot deserialize root element of {filename}");
     48      return content;
     49    }
    3550
    36       var ser = new ProtoBufSerializer();
    37       return (IStorableContent)ser.Deserialize(filename, out SerializationInfo info);
    38     }
    3951
    4052    protected override void SaveContent(IStorableContent content, string filename, bool compressed, CancellationToken cancellationToken) {
  • trunk/HeuristicLab.Optimizer/3.3/FileManager.cs

    r16565 r16992  
    2323using System.Collections.Generic;
    2424using System.IO;
     25using System.Linq;
    2526using System.Threading;
    2627using System.Windows.Forms;
     
    7374    }
    7475
    75     private static void LoadingCompleted(IStorableContent content, Exception error) {
     76    private static void LoadingCompleted(IStorableContent content, Exception error, ContentManager.Info info) {
    7677      try {
    7778        if (error != null) throw error;
     79        if (info!=null && info.UnknownTypeGuids.Any()) {
     80          var message = "Unknown type guids: " + string.Join(Environment.NewLine, info.UnknownTypeGuids);
     81          MessageBox.Show((Control)MainFormManager.MainForm, message, $"File {info.Filename} not restored completely", MessageBoxButtons.OK, MessageBoxIcon.Information);
     82        }
    7883        IView view = MainFormManager.MainForm.ShowContent(content);
    7984        if (view == null)
  • trunk/HeuristicLab.Optimizer/3.3/StartPage.cs

    r16565 r16992  
    3030using HeuristicLab.Core;
    3131using HeuristicLab.MainForm;
    32 using HeuristicLab.Persistence.Default.Xml;
    3332
    3433namespace HeuristicLab.Optimizer {
     
    121120        using (var stream = assembly.GetManifestResourceStream(name)) {
    122121          WriteStreamToTempFile(stream, path); // create a file in a temporary folder (persistence cannot load these files directly from the stream)
    123           var item = XmlParser.Deserialize<INamedItem>(path);
     122          var item = (INamedItem)ContentManager.Load(path);
    124123          OnSampleLoaded(item, group, 1.0 / count);
    125124        }
Note: See TracChangeset for help on using the changeset viewer.