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

Last change on this file since 1895 was 1895, checked in by kopal, 11 years ago
  • removed Parent because it did not work well (have to implement new Parent concept)
  • TextModels (RichTextBox) data is now saved/loaded
File size: 11.5 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);
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                        DontSaveAttribute[] dontSave = (DontSaveAttribute[])pInfo.GetCustomAttributes(typeof(DontSaveAttribute), false);
56                        if (dontSave.Length == 0)
57                        {
58                            if (pInfo.Name.Equals(persistantSetting.Name))
59                            {
60                                if (persistantSetting.Type.Equals("System.String"))
61                                {
62                                    pInfo.SetValue(persistantPlugin.PluginModel.Plugin.Settings, (String)persistantSetting.Value, null);
63                                }
64                                else if (persistantSetting.Type.Equals("System.Int16"))
65                                {
66                                    pInfo.SetValue(persistantPlugin.PluginModel.Plugin.Settings, System.Int16.Parse((String)persistantSetting.Value), null);
67                                }
68                                else if (persistantSetting.Type.Equals("System.Int32"))
69                                {
70                                    pInfo.SetValue(persistantPlugin.PluginModel.Plugin.Settings, System.Int32.Parse((String)persistantSetting.Value), null);
71                                }
72                                else if (persistantSetting.Type.Equals("System.Int64"))
73                                {
74                                    pInfo.SetValue(persistantPlugin.PluginModel.Plugin.Settings, System.Int64.Parse((String)persistantSetting.Value), null);
75                                }
76                                else if (persistantSetting.Type.Equals("System.Double"))
77                                {
78                                    pInfo.SetValue(persistantPlugin.PluginModel.Plugin.Settings, System.Double.Parse((String)persistantSetting.Value), null);
79                                }
80                                else if (persistantSetting.Type.Equals("System.Boolean"))
81                                {
82                                    pInfo.SetValue(persistantPlugin.PluginModel.Plugin.Settings, System.Boolean.Parse((String)persistantSetting.Value), null);
83                                }
84                                else if (pInfo.PropertyType.IsEnum)
85                                {
86                                    Int32 result = 0;
87                                    System.Int32.TryParse((String)persistantSetting.Value, out result);
88                                    object newEnumValue = Enum.ToObject(pInfo.PropertyType, result);
89                                    pInfo.SetValue(persistantPlugin.PluginModel.Plugin.Settings,newEnumValue,null);                                   
90                                }
91                            }
92                        }
93                    }
94                }
95            }
96
97            //connect all listener for plugins/plugin models
98            foreach (PluginModel pluginModel in workspacemodel.AllPluginModels)
99            {
100                pluginModel.Plugin.Initialize();
101                pluginModel.Plugin.OnGuiLogNotificationOccured += workspaceManagerEditor.GuiLogNotificationOccured;
102                pluginModel.Plugin.OnGuiLogNotificationOccured += pluginModel.GuiLogNotificationOccured;
103                pluginModel.Plugin.OnPluginProgressChanged += pluginModel.PluginProgressChanged;               
104                pluginModel.Plugin.OnPluginStatusChanged += pluginModel.PluginStatusChanged;               
105                if (pluginModel.Plugin.Settings != null)
106                {
107                    pluginModel.Plugin.Settings.PropertyChanged += pluginModel.SettingsPropertyChanged;
108                }
109            }
110               
111            //connect all listeners for connectors
112            foreach (ConnectorModel connectorModel in workspacemodel.AllConnectorModels)
113            {
114                if (connectorModel.IsDynamic == true)
115                {
116                    DynamicPropertyInfoAttribute dynamicPropertyInfoAttribute = connectorModel.PluginModel.Plugin.GetDynamicPropertyInfo();
117                    EventInfo eventinfo = connectorModel.PluginModel.PluginType.GetEvent(dynamicPropertyInfoAttribute.UpdateDynamicPropertiesEvent);
118                    eventinfo.AddEventHandler(connectorModel.PluginModel.Plugin, new DynamicPropertiesChanged(connectorModel.PropertyTypeChangedOnPlugin));
119                }
120                connectorModel.PluginModel.Plugin.PropertyChanged += connectorModel.PropertyChangedOnPlugin;
121            }
122
123            //restore all IControls
124            foreach (ConnectionModel connectionModel in workspacemodel.AllConnectionModels) 
125            {
126                ConnectorModel from = connectionModel.From;
127                ConnectorModel to = connectionModel.To;
128
129                if (from.IControl && to.IControl)
130                {
131                    object data = null;
132                    //Get IControl data from "to"
133                    if (to.IsDynamic)
134                    {
135                        data = to.PluginModel.Plugin.GetType().GetMethod(to.DynamicGetterName).Invoke(to.PluginModel.Plugin, new object[] { to.PropertyName });
136                    }
137                    else
138                    {
139                        data = to.PluginModel.Plugin.GetType().GetProperty(to.PropertyName).GetValue(to.PluginModel.Plugin, null);
140                    }
141
142                    //Set IControl data
143                    if (from.IsDynamic)
144                    {
145                        MethodInfo propertyInfo = from.PluginModel.Plugin.GetType().GetMethod(from.DynamicSetterName);
146                        propertyInfo.Invoke(from.PluginModel.Plugin, new object[] { from.PropertyName, data });
147                    }
148                    else
149                    {
150                        PropertyInfo propertyInfo = from.PluginModel.Plugin.GetType().GetProperty(from.PropertyName);
151                        propertyInfo.SetValue(from.PluginModel.Plugin, data, null);
152                    }
153                }
154            }
155
156            return workspacemodel;         
157        }
158
159        /// <summary>
160        /// Serializes the given model to a file with the given filename
161        /// </summary>
162        /// <param name="workspaceModel"></param>
163        /// <param name="filename"></param>
164        /// <returns></returns>
165        public static void saveModel(WorkspaceModel workspaceModel, string filename)
166        {
167            PersistantModel persistantModel = new PersistantModel();
168            persistantModel.WorkspaceModel = workspaceModel;
169
170            //Save all Settings of each Plugin
171            foreach (PluginModel pluginModel in workspaceModel.AllPluginModels){
172
173                if (pluginModel.Plugin.Settings != null)
174                {
175                    PropertyInfo[] arrpInfo = pluginModel.Plugin.Settings.GetType().GetProperties();
176
177                    PersistantPlugin persistantPlugin = new PersistantPlugin();
178                    persistantPlugin.PluginModel = pluginModel;
179
180                    foreach (PropertyInfo pInfo in arrpInfo)
181                    {
182                        DontSaveAttribute[] dontSave = (DontSaveAttribute[])pInfo.GetCustomAttributes(typeof(DontSaveAttribute), false);
183                        if (pInfo.CanWrite && dontSave.Length == 0)
184                        {
185                            PersistantSetting persistantSetting = new PersistantSetting();
186                            if (pInfo.PropertyType.IsEnum)
187                            {
188                                persistantSetting.Value = "" + pInfo.GetValue(pluginModel.Plugin.Settings, null).GetHashCode();
189                            }
190                            else
191                            {
192                                persistantSetting.Value = "" + pInfo.GetValue(pluginModel.Plugin.Settings, null);
193                            }
194                            persistantSetting.Name = pInfo.Name;
195                            persistantSetting.Type = pInfo.PropertyType.FullName;
196                            persistantPlugin.PersistantSettingsList.Add(persistantSetting);
197                        }
198
199                    }
200                    persistantModel.PersistantPluginList.Add(persistantPlugin);
201                }
202            }
203            XMLSerialization.XMLSerialization.Serialize(persistantModel, filename,true);
204        }
205    }
206
207    /// <summary>
208    /// Class for persisting a workspace model
209    /// stores the model and a list of persistant plugin models
210    /// </summary>
211    [Serializable]
212    public class PersistantModel{
213        public WorkspaceModel WorkspaceModel{get;set;}
214        public List<PersistantPlugin> PersistantPluginList = new List<PersistantPlugin>();
215    }
216
217    /// <summary>
218    /// Class for persisting a plugin model
219    /// stores the plugin model and a list of settings
220    /// </summary>
221    [Serializable]
222    public class PersistantPlugin
223    {
224        public PluginModel PluginModel { get; set; }
225        public List<PersistantSetting> PersistantSettingsList = new List<PersistantSetting>();
226    }
227
228    /// <summary>
229    /// Class for persisting settings
230    /// stores the name, the type and the value of the setting
231    /// </summary>
232    [Serializable]
233    public class PersistantSetting
234    {
235        public string Name {get;set;}
236        public string Type { get; set; }
237        public string Value { get; set; }
238    }
239
240}
Note: See TracBrowser for help on using the repository browser.