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

Last change on this file since 1790 was 1790, checked in by kopal, 11 years ago
  • now the initializes() method of a plugin will be called when the workspace is deserialized
  • bug fix of the minimized view of the plugins
File size: 10.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);
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                            }
85                        }
86                    }
87                }
88            }
89
90            //connect all listener for plugins/plugin models
91            foreach (PluginModel pluginModel in workspacemodel.AllPluginModels)
92            {
93                pluginModel.Plugin.Initialize();
94                pluginModel.Plugin.OnGuiLogNotificationOccured += workspaceManagerEditor.GuiLogNotificationOccured;
95                pluginModel.Plugin.OnGuiLogNotificationOccured += pluginModel.GuiLogNotificationOccured;
96                pluginModel.Plugin.OnPluginProgressChanged += pluginModel.PluginProgressChanged;
97                pluginModel.Plugin.OnPluginStatusChanged += pluginModel.PluginStatusChanged;
98            }
99               
100            //connect all listeners for connectors
101            foreach (ConnectorModel connectorModel in workspacemodel.AllConnectorModels)
102            {
103                if(connectorModel.Outgoing == true){
104                    connectorModel.PluginModel.Plugin.PropertyChanged += connectorModel.PropertyChangedOnPlugin;
105                }
106
107                if (connectorModel.IsDynamic == true)
108                {
109                    DynamicPropertyInfoAttribute dynamicPropertyInfoAttribute = connectorModel.PluginModel.Plugin.GetDynamicPropertyInfo();
110                    EventInfo eventinfo = connectorModel.PluginModel.PluginType.GetEvent(dynamicPropertyInfoAttribute.UpdateDynamicPropertiesEvent);
111                    eventinfo.AddEventHandler(connectorModel.PluginModel.Plugin, new DynamicPropertiesChanged(connectorModel.PropertyTypeChangedOnPlugin));
112                }
113            }
114
115            //restore all IControls
116            foreach (ConnectionModel connectionModel in workspacemodel.AllConnectionModels) 
117            {
118                ConnectorModel from = connectionModel.From;
119                ConnectorModel to = connectionModel.To;
120
121                if (from.IControl && to.IControl)
122                {
123                    object data = null;
124                    //Get IControl data from "to"
125                    if (to.IsDynamic)
126                    {
127                        data = to.PluginModel.Plugin.GetType().GetMethod(to.DynamicGetterName).Invoke(to.PluginModel.Plugin, new object[] { to.PropertyName });
128                    }
129                    else
130                    {
131                        data = to.PluginModel.Plugin.GetType().GetProperty(to.PropertyName).GetValue(to.PluginModel.Plugin, null);
132                    }
133
134                    //Set IControl data
135                    if (from.IsDynamic)
136                    {
137                        MethodInfo propertyInfo = from.PluginModel.Plugin.GetType().GetMethod(from.DynamicSetterName);
138                        propertyInfo.Invoke(from.PluginModel.Plugin, new object[] { from.PropertyName, data });
139                    }
140                    else
141                    {
142                        PropertyInfo propertyInfo = from.PluginModel.Plugin.GetType().GetProperty(from.PropertyName);
143                        propertyInfo.SetValue(from.PluginModel.Plugin, data, null);
144                    }
145                }
146            }
147
148            return workspacemodel;         
149        }
150
151        /// <summary>
152        /// Serializes the given model to a file with the given filename
153        /// </summary>
154        /// <param name="workspaceModel"></param>
155        /// <param name="filename"></param>
156        /// <returns></returns>
157        public static void saveModel(WorkspaceModel workspaceModel, string filename)
158        {
159            PersistantModel persistantModel = new PersistantModel();
160            persistantModel.WorkspaceModel = workspaceModel;
161
162            //Save all Settings of each Plugin
163            foreach (PluginModel pluginModel in workspaceModel.AllPluginModels)
164            {
165                PropertyInfo[] arrpInfo = pluginModel.Plugin.Settings.GetType().GetProperties();
166
167                PersistantPlugin persistantPlugin = new PersistantPlugin();
168                persistantPlugin.PluginModel = pluginModel;
169
170                foreach (PropertyInfo pInfo in arrpInfo)
171                {
172                    DontSaveAttribute[] dontSave = (DontSaveAttribute[])pInfo.GetCustomAttributes(typeof(DontSaveAttribute), false);
173                    if (pInfo.CanWrite && dontSave.Length == 0)
174                    {
175                        PersistantSetting persistantSetting = new PersistantSetting();
176                        persistantSetting.Value = "" + pInfo.GetValue(pluginModel.Plugin.Settings, null);
177                        persistantSetting.Name = pInfo.Name;
178                        persistantSetting.Type = pInfo.PropertyType.FullName;
179                        persistantPlugin.PersistantSettingsList.Add(persistantSetting);
180                    }
181
182                }
183                persistantModel.PersistantPluginList.Add(persistantPlugin);
184            }
185            XMLSerialization.XMLSerialization.Serialize(persistantModel, filename,true);
186        }
187    }
188
189    /// <summary>
190    /// Class for persisting a workspace model
191    /// stores the model and a list of persistant plugin models
192    /// </summary>
193    [Serializable]
194    public class PersistantModel{
195        public WorkspaceModel WorkspaceModel{get;set;}
196        public List<PersistantPlugin> PersistantPluginList = new List<PersistantPlugin>();
197    }
198
199    /// <summary>
200    /// Class for persisting a plugin model
201    /// stores the plugin model and a list of settings
202    /// </summary>
203    [Serializable]
204    public class PersistantPlugin
205    {
206        public PluginModel PluginModel { get; set; }
207        public List<PersistantSetting> PersistantSettingsList = new List<PersistantSetting>();
208    }
209
210    /// <summary>
211    /// Class for persisting settings
212    /// stores the name, the type and the value of the setting
213    /// </summary>
214    [Serializable]
215    public class PersistantSetting
216    {
217        public string Name {get;set;}
218        public string Type { get; set; }
219        public string Value { get; set; }
220    }
221
222}
Note: See TracBrowser for help on using the repository browser.