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

Last change on this file since 1878 was 1878, checked in by kopal, 11 years ago
  • ModelElements like WorkspaceModel and PluginModel now have a Parent which also is a PluginModel or a WorkspaceModel
  • PluginModel now have a method to get all "children" (other PluginModels having this one as Parent)
File size: 11.7 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.Parent == null)
106                {
107                    pluginModel.Parent = workspacemodel;
108                }
109                if (pluginModel.Plugin.Settings != null)
110                {
111                    pluginModel.Plugin.Settings.PropertyChanged += pluginModel.SettingsPropertyChanged;
112                }
113            }
114               
115            //connect all listeners for connectors
116            foreach (ConnectorModel connectorModel in workspacemodel.AllConnectorModels)
117            {
118                if (connectorModel.IsDynamic == true)
119                {
120                    DynamicPropertyInfoAttribute dynamicPropertyInfoAttribute = connectorModel.PluginModel.Plugin.GetDynamicPropertyInfo();
121                    EventInfo eventinfo = connectorModel.PluginModel.PluginType.GetEvent(dynamicPropertyInfoAttribute.UpdateDynamicPropertiesEvent);
122                    eventinfo.AddEventHandler(connectorModel.PluginModel.Plugin, new DynamicPropertiesChanged(connectorModel.PropertyTypeChangedOnPlugin));
123                }
124                connectorModel.PluginModel.Plugin.PropertyChanged += connectorModel.PropertyChangedOnPlugin;
125            }
126
127            //restore all IControls
128            foreach (ConnectionModel connectionModel in workspacemodel.AllConnectionModels) 
129            {
130                ConnectorModel from = connectionModel.From;
131                ConnectorModel to = connectionModel.To;
132
133                if (from.IControl && to.IControl)
134                {
135                    object data = null;
136                    //Get IControl data from "to"
137                    if (to.IsDynamic)
138                    {
139                        data = to.PluginModel.Plugin.GetType().GetMethod(to.DynamicGetterName).Invoke(to.PluginModel.Plugin, new object[] { to.PropertyName });
140                    }
141                    else
142                    {
143                        data = to.PluginModel.Plugin.GetType().GetProperty(to.PropertyName).GetValue(to.PluginModel.Plugin, null);
144                    }
145
146                    //Set IControl data
147                    if (from.IsDynamic)
148                    {
149                        MethodInfo propertyInfo = from.PluginModel.Plugin.GetType().GetMethod(from.DynamicSetterName);
150                        propertyInfo.Invoke(from.PluginModel.Plugin, new object[] { from.PropertyName, data });
151                    }
152                    else
153                    {
154                        PropertyInfo propertyInfo = from.PluginModel.Plugin.GetType().GetProperty(from.PropertyName);
155                        propertyInfo.SetValue(from.PluginModel.Plugin, data, null);
156                    }
157                }
158            }
159
160            return workspacemodel;         
161        }
162
163        /// <summary>
164        /// Serializes the given model to a file with the given filename
165        /// </summary>
166        /// <param name="workspaceModel"></param>
167        /// <param name="filename"></param>
168        /// <returns></returns>
169        public static void saveModel(WorkspaceModel workspaceModel, string filename)
170        {
171            PersistantModel persistantModel = new PersistantModel();
172            persistantModel.WorkspaceModel = workspaceModel;
173
174            //Save all Settings of each Plugin
175            foreach (PluginModel pluginModel in workspaceModel.AllPluginModels){
176
177                if (pluginModel.Plugin.Settings != null)
178                {
179                    PropertyInfo[] arrpInfo = pluginModel.Plugin.Settings.GetType().GetProperties();
180
181                    PersistantPlugin persistantPlugin = new PersistantPlugin();
182                    persistantPlugin.PluginModel = pluginModel;
183
184                    foreach (PropertyInfo pInfo in arrpInfo)
185                    {
186                        DontSaveAttribute[] dontSave = (DontSaveAttribute[])pInfo.GetCustomAttributes(typeof(DontSaveAttribute), false);
187                        if (pInfo.CanWrite && dontSave.Length == 0)
188                        {
189                            PersistantSetting persistantSetting = new PersistantSetting();
190                            if (pInfo.PropertyType.IsEnum)
191                            {
192                                persistantSetting.Value = "" + pInfo.GetValue(pluginModel.Plugin.Settings, null).GetHashCode();
193                            }
194                            else
195                            {
196                                persistantSetting.Value = "" + pInfo.GetValue(pluginModel.Plugin.Settings, null);
197                            }
198                            persistantSetting.Name = pInfo.Name;
199                            persistantSetting.Type = pInfo.PropertyType.FullName;
200                            persistantPlugin.PersistantSettingsList.Add(persistantSetting);
201                        }
202
203                    }
204                    persistantModel.PersistantPluginList.Add(persistantPlugin);
205                }
206            }
207            XMLSerialization.XMLSerialization.Serialize(persistantModel, filename,true);
208        }
209    }
210
211    /// <summary>
212    /// Class for persisting a workspace model
213    /// stores the model and a list of persistant plugin models
214    /// </summary>
215    [Serializable]
216    public class PersistantModel{
217        public WorkspaceModel WorkspaceModel{get;set;}
218        public List<PersistantPlugin> PersistantPluginList = new List<PersistantPlugin>();
219    }
220
221    /// <summary>
222    /// Class for persisting a plugin model
223    /// stores the plugin model and a list of settings
224    /// </summary>
225    [Serializable]
226    public class PersistantPlugin
227    {
228        public PluginModel PluginModel { get; set; }
229        public List<PersistantSetting> PersistantSettingsList = new List<PersistantSetting>();
230    }
231
232    /// <summary>
233    /// Class for persisting settings
234    /// stores the name, the type and the value of the setting
235    /// </summary>
236    [Serializable]
237    public class PersistantSetting
238    {
239        public string Name {get;set;}
240        public string Type { get; set; }
241        public string Value { get; set; }
242    }
243
244}
Note: See TracBrowser for help on using the repository browser.