source: trunk/CrypPlugins/WorkspaceManager/Model/ModelPersistance.cs @ 2280

Last change on this file since 2280 was 2127, checked in by kopal, 11 years ago
  • model persistence/xml serialization is now more "error" friendly and does not crash, if a model element can not be restored. But it shows a warning
File size: 13.4 KB
Line 
1/*                             
2   Copyright 2010 Nils Kopal, Viktor M.
3
4   Licensed under the Apache License, Version 2.0 (the "License");
5   you may not use this file except in compliance with the License.
6   You may obtain a copy of the License at
7
8       http://www.apache.org/licenses/LICENSE-2.0
9
10   Unless required by applicable law or agreed to in writing, software
11   distributed under the License is distributed on an "AS IS" BASIS,
12   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   See the License for the specific language governing permissions and
14   limitations under the License.
15*/
16
17using System;
18using System.Collections.Generic;
19using System.Linq;
20using System.Text;
21using System.IO;
22using System.Xml.Serialization;
23using System.Runtime.Serialization.Formatters.Binary;
24using System.Reflection;
25using Cryptool.PluginBase;
26using XMLSerialization;
27
28namespace WorkspaceManager.Model
29{
30    /// <summary>
31    /// Class with static methods for loading and saving of WorkspaceModels
32    /// </summary>
33    public class ModelPersistance
34    {
35        /// <summary>
36        /// Deserializes a model from the given file with the given filename
37        /// </summary>
38        /// <param name="filename"></param>
39        /// <returns></returns>
40        public static WorkspaceModel loadModel(string filename, WorkspaceManager workspaceManagerEditor)
41        {
42            PersistantModel persistantModel = (PersistantModel)XMLSerialization.XMLSerialization.Deserialize(filename,true,workspaceManagerEditor);
43            WorkspaceModel workspacemodel = persistantModel.WorkspaceModel;
44            workspacemodel.WorkspaceManagerEditor = workspaceManagerEditor;           
45
46            //restore all settings of each plugin
47            foreach (PersistantPlugin persistantPlugin in persistantModel.PersistantPluginList)
48            {
49                foreach (PersistantSetting persistantSetting in persistantPlugin.PersistantSettingsList)
50                {
51
52                    PropertyInfo[] arrpInfo = persistantPlugin.PluginModel.Plugin.Settings.GetType().GetProperties();
53                    foreach (PropertyInfo pInfo in arrpInfo)
54                    {
55                        try
56                        {
57                            DontSaveAttribute[] dontSave =
58                                (DontSaveAttribute[]) pInfo.GetCustomAttributes(typeof (DontSaveAttribute), false);
59                            if (dontSave.Length == 0)
60                            {
61                                if (pInfo.Name.Equals(persistantSetting.Name))
62                                {
63                                    if (persistantSetting.Type.Equals("System.String"))
64                                    {
65                                        pInfo.SetValue(persistantPlugin.PluginModel.Plugin.Settings,
66                                                       (String) persistantSetting.Value, null);
67                                    }
68                                    else if (persistantSetting.Type.Equals("System.Int16"))
69                                    {
70                                        pInfo.SetValue(persistantPlugin.PluginModel.Plugin.Settings,
71                                                       System.Int16.Parse((String) persistantSetting.Value), null);
72                                    }
73                                    else if (persistantSetting.Type.Equals("System.Int32"))
74                                    {
75                                        pInfo.SetValue(persistantPlugin.PluginModel.Plugin.Settings,
76                                                       System.Int32.Parse((String) persistantSetting.Value), null);
77                                    }
78                                    else if (persistantSetting.Type.Equals("System.Int64"))
79                                    {
80                                        pInfo.SetValue(persistantPlugin.PluginModel.Plugin.Settings,
81                                                       System.Int64.Parse((String) persistantSetting.Value), null);
82                                    }
83                                    else if (persistantSetting.Type.Equals("System.Double"))
84                                    {
85                                        pInfo.SetValue(persistantPlugin.PluginModel.Plugin.Settings,
86                                                       System.Double.Parse((String) persistantSetting.Value), null);
87                                    }
88                                    else if (persistantSetting.Type.Equals("System.Boolean"))
89                                    {
90                                        pInfo.SetValue(persistantPlugin.PluginModel.Plugin.Settings,
91                                                       System.Boolean.Parse((String) persistantSetting.Value), null);
92                                    }
93                                    else if (pInfo.PropertyType.IsEnum)
94                                    {
95                                        Int32 result = 0;
96                                        System.Int32.TryParse((String) persistantSetting.Value, out result);
97                                        object newEnumValue = Enum.ToObject(pInfo.PropertyType, result);
98                                        pInfo.SetValue(persistantPlugin.PluginModel.Plugin.Settings, newEnumValue, null);
99                                    }
100                                }
101                            }
102                        }catch(Exception ex)
103                        {
104                            workspaceManagerEditor.GuiLogMessage("Could not restore the setting \"" + persistantSetting.Name + "\" of plugin \"" + persistantPlugin.PluginModel.Name + "\" because of:" + ex.Message,NotificationLevel.Warning);
105                        }
106                    }
107                }
108            }
109
110            //connect all listener for plugins/plugin models
111            foreach (PluginModel pluginModel in workspacemodel.AllPluginModels)
112            {
113                try
114                {
115                    pluginModel.Plugin.Initialize();
116                }
117                catch(Exception ex)
118                {
119                    workspaceManagerEditor.GuiLogMessage("Error while initializing \"" + pluginModel.Name + "\". Surely plugin will not work well. Error was:" + ex.Message,NotificationLevel.Error);
120                }
121                pluginModel.Plugin.OnGuiLogNotificationOccured += workspaceManagerEditor.GuiLogNotificationOccured;
122                pluginModel.Plugin.OnGuiLogNotificationOccured += pluginModel.GuiLogNotificationOccured;
123                pluginModel.Plugin.OnPluginProgressChanged += pluginModel.PluginProgressChanged;               
124                pluginModel.Plugin.OnPluginStatusChanged += pluginModel.PluginStatusChanged;               
125                if (pluginModel.Plugin.Settings != null)
126                {
127                    pluginModel.Plugin.Settings.PropertyChanged += pluginModel.SettingsPropertyChanged;
128                }
129            }
130               
131            //connect all listeners for connectors
132            foreach (ConnectorModel connectorModel in workspacemodel.AllConnectorModels)
133            {
134                if (connectorModel.IsDynamic == true)
135                {
136                    DynamicPropertyInfoAttribute dynamicPropertyInfoAttribute = connectorModel.PluginModel.Plugin.GetDynamicPropertyInfo();
137                    EventInfo eventinfo = connectorModel.PluginModel.PluginType.GetEvent(dynamicPropertyInfoAttribute.UpdateDynamicPropertiesEvent);
138                    eventinfo.AddEventHandler(connectorModel.PluginModel.Plugin, new DynamicPropertiesChanged(connectorModel.PropertyTypeChangedOnPlugin));
139                }
140                connectorModel.PluginModel.Plugin.PropertyChanged += connectorModel.PropertyChangedOnPlugin;
141            }
142
143            //restore all IControls
144            foreach (ConnectionModel connectionModel in workspacemodel.AllConnectionModels) 
145            {
146                ConnectorModel from = connectionModel.From;
147                ConnectorModel to = connectionModel.To;
148                try
149                {
150                    if (from.IControl && to.IControl)
151                    {
152                        object data = null;
153                        //Get IControl data from "to"
154                        if (to.IsDynamic)
155                        {
156                            data =
157                                to.PluginModel.Plugin.GetType().GetMethod(to.DynamicGetterName).Invoke(
158                                    to.PluginModel.Plugin, new object[] {to.PropertyName});
159                        }
160                        else
161                        {
162                            data =
163                                to.PluginModel.Plugin.GetType().GetProperty(to.PropertyName).GetValue(
164                                    to.PluginModel.Plugin, null);
165                        }
166
167                        //Set IControl data
168                        if (from.IsDynamic)
169                        {
170                            MethodInfo propertyInfo = from.PluginModel.Plugin.GetType().GetMethod(from.DynamicSetterName);
171                            propertyInfo.Invoke(from.PluginModel.Plugin, new object[] {from.PropertyName, data});
172                        }
173                        else
174                        {
175                            PropertyInfo propertyInfo = from.PluginModel.Plugin.GetType().GetProperty(from.PropertyName);
176                            propertyInfo.SetValue(from.PluginModel.Plugin, data, null);
177                        }
178                    }
179                }catch(Exception ex)
180                {
181                    workspaceManagerEditor.GuiLogMessage("Error while restoring IControl Connection between \"" + from.PluginModel.Name + "\" to \"" + to.PluginModel.Name + "\". Workspace surely will not work well. Error was:" + ex.Message, NotificationLevel.Error);
182                }
183            }
184
185            return workspacemodel;         
186        }
187
188        /// <summary>
189        /// Serializes the given model to a file with the given filename
190        /// </summary>
191        /// <param name="workspaceModel"></param>
192        /// <param name="filename"></param>
193        /// <returns></returns>
194        public static void saveModel(WorkspaceModel workspaceModel, string filename)
195        {
196            PersistantModel persistantModel = new PersistantModel();
197            persistantModel.WorkspaceModel = workspaceModel;           
198
199            //Save all Settings of each Plugin
200            foreach (PluginModel pluginModel in workspaceModel.AllPluginModels){
201
202                if (pluginModel.Plugin.Settings != null)
203                {
204                    PropertyInfo[] arrpInfo = pluginModel.Plugin.Settings.GetType().GetProperties();
205
206                    PersistantPlugin persistantPlugin = new PersistantPlugin();
207                    persistantPlugin.PluginModel = pluginModel;
208
209                    foreach (PropertyInfo pInfo in arrpInfo)
210                    {
211                        DontSaveAttribute[] dontSave = (DontSaveAttribute[])pInfo.GetCustomAttributes(typeof(DontSaveAttribute), false);
212                        if (pInfo.CanWrite && dontSave.Length == 0)
213                        {
214                            PersistantSetting persistantSetting = new PersistantSetting();
215                            if (pInfo.PropertyType.IsEnum)
216                            {
217                                persistantSetting.Value = "" + pInfo.GetValue(pluginModel.Plugin.Settings, null).GetHashCode();
218                            }
219                            else
220                            {
221                                persistantSetting.Value = "" + pInfo.GetValue(pluginModel.Plugin.Settings, null);
222                            }
223                            persistantSetting.Name = pInfo.Name;
224                            persistantSetting.Type = pInfo.PropertyType.FullName;
225                            persistantPlugin.PersistantSettingsList.Add(persistantSetting);
226                        }
227
228                    }
229                    persistantModel.PersistantPluginList.Add(persistantPlugin);
230                }
231            }
232            XMLSerialization.XMLSerialization.Serialize(persistantModel, filename,true);
233        }
234    }
235
236    /// <summary>
237    /// Class for persisting a workspace model
238    /// stores the model and a list of persistant plugin models
239    /// </summary>
240    [Serializable]
241    public class PersistantModel{
242        public WorkspaceModel WorkspaceModel{get;set;}
243        public List<PersistantPlugin> PersistantPluginList = new List<PersistantPlugin>();
244    }
245
246    /// <summary>
247    /// Class for persisting a plugin model
248    /// stores the plugin model and a list of settings
249    /// </summary>
250    [Serializable]
251    public class PersistantPlugin
252    {
253        public PluginModel PluginModel { get; set; }
254        public List<PersistantSetting> PersistantSettingsList = new List<PersistantSetting>();
255    }
256
257    /// <summary>
258    /// Class for persisting settings
259    /// stores the name, the type and the value of the setting
260    /// </summary>
261    [Serializable]
262    public class PersistantSetting
263    {
264        public string Name {get;set;}
265        public string Type { get; set; }
266        public string Value { get; set; }
267    }
268
269}
Note: See TracBrowser for help on using the repository browser.