/// <summary>
        ///     Initializes a new instance of the <see cref="ProfilerMonitorViewModel" /> class.
        /// </summary>
        /// <param name="settings">The settings.</param>
        public ProfilerMonitorViewModel(IPluginSettings settings)
        {
            _dispatcher = Dispatcher.CurrentDispatcher;

            PluginSettings = settings;

            ClearCommand = new DelegateCommand(() => _dispatcher.Invoke(Clear));

            ProfilerTraceModel = new ProfilerTraceModel(_dispatcher);
        }
        private void Deserialize <T>(MemoryStream stream, string channel)
        {
            var obj = Serializer.Deserialize <ChannelMessage <T> >(stream);

            if (obj != null)
            {
                var jss = new JavaScriptSerializer( );
                jss.MaxJsonLength  = int.MaxValue;
                jss.RecursionLimit = int.MaxValue;

                var jsonObject = jss.Deserialize <dynamic>(obj.Message.ToString( )) as IDictionary <string, object>;

                if (jsonObject != null)
                {
                    var root = new ProfilerTrace(jsonObject, "web.png");

                    _dispatcher.Invoke(() => ProfilerTraceModel.Add(root, Guid.Empty));

                    var child = jsonObject["Root"] as IDictionary <string, object>;

                    Parse(child, root.Id);
                }
            }
        }
        private void Parse(IDictionary <string, object> obj, Guid parent)
        {
            var trace = new ProfilerTrace(obj);

            _dispatcher.Invoke(() => ProfilerTraceModel.Add(trace, parent));

            object children;

            if (obj.TryGetValue("Children", out children))
            {
                if (children != null)
                {
                    var childrenItems = children as object[];

                    foreach (var childItem in childrenItems)
                    {
                        var childDictionary = childItem as IDictionary <string, object>;

                        Parse(childDictionary, trace.Id);
                    }
                }
            }

            object customTimings;

            if (obj.TryGetValue("CustomTimings", out customTimings))
            {
                if (customTimings != null)
                {
                    var timingDictionary = customTimings as IDictionary <string, object>;

                    if (timingDictionary != null)
                    {
                        object sqlTimings;

                        if (timingDictionary.TryGetValue("sql", out sqlTimings))
                        {
                            if (sqlTimings != null)
                            {
                                var sqlArray = sqlTimings as object[];

                                if (sqlArray != null)
                                {
                                    foreach (var sqlObj in sqlArray)
                                    {
                                        var sql = sqlObj as IDictionary <string, object>;

                                        var sqlTrace = new SqlProfilerTrace(sql);

                                        _dispatcher.Invoke(() => ProfilerTraceModel.Add(sqlTrace, parent));
                                    }
                                }
                            }
                        }

                        object redisTimings;

                        if (timingDictionary.TryGetValue("redis", out redisTimings))
                        {
                            if (redisTimings != null)
                            {
                                var redisArray = redisTimings as object[];

                                if (redisArray != null)
                                {
                                    foreach (var redisObj in redisArray)
                                    {
                                        var redis = redisObj as IDictionary <string, object>;

                                        var sqlTrace = new RedisProfilerTrace(redis);

                                        _dispatcher.Invoke(() => ProfilerTraceModel.Add(sqlTrace, parent));
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
 /// <summary>
 ///     Clears this instance.
 /// </summary>
 private void Clear( )
 {
     ProfilerTraceModel.Clear( );
 }