public void Deserialize__CanDeserializeXml()
        {
            var s = new FlexiXmlSerializationService();

            var xml = @"<SimpleTestStruct nameProperty=""one,two,three"" valueProperty=""13"" />";

            var mtc = s.Deserialize<SimpleTestStruct>(xml);

            Assert.AreEqual("one,two,three", mtc.NameProperty);
            Assert.AreEqual(13, mtc.ValueProperty);
        }
        public void Serialize__CanSerializeObject()
        {
            var s = new FlexiXmlSerializationService();

            var result = s.Serialize(DateTime.Now).DumpToString();
        }
        void TryResolveElementReference(FlexiXmlSerializationService.ResolveElementReferenceEventArgs e)
        {
            var configuration = e.DeserializationRootObject as DiagnosticsConfiguration;

            if(e.ReferenceType.IsIn("formatter", "bodyformatter"))
            {
                IFormatter result;

                if (configuration.Formatters.TryFindByName(e.ReferencedObjectName, out result))
                {
                    e.Handle(result);
                    return;
                }
            }

            if(e.ReferenceType == "filter")
            {
                IFilter result =
                    (from f in configuration.FilterDefinitions
                     where f.Name == e.ReferencedObjectName
                     select f).FirstOrDefault();

                if(result == null)
                {
                    var filter = new LazyFilterReference();
                    filter.Name = e.ReferencedObjectName;
                    e.Handle(filter);
                    return;
                }
                else
                {
                    e.Handle(result);
                    return;
                }
            }

            if (e.ReferenceType == "sink")
            {
                ISink result =
                    (from f in configuration.SinkDefinitions
                     where f.Name == e.ReferencedObjectName
                     select f).FirstOrDefault();

                if (result != null)
                {
                    e.Handle(result);
                    return;
                }
            }

            if (e.ReferenceType == "contextdatacollector")
            {
                var result =
                    (from cdc in configuration.GlobalContextDataCollectors
                     where cdc.Name == e.ReferencedObjectName
                     select cdc).FirstOrDefault();

                if(result != null)
                {
                    e.Handle(result);
                    return;
                }
            }
        }
        public Entities.DiagnosticsConfiguration LoadConfiguration()
        {
            var doc = XDocument.Parse(configXml, LoadOptions.SetLineInfo);

            var serializationService = new FlexiXmlSerializationService();

            serializationService.TypeLookupNamespaces.Add("SquaredInfinity.Diagnostics.ContextDataCollectors");
            serializationService.TypeLookupNamespaces.Add("SquaredInfinity.Diagnostics.Entities");
            serializationService.TypeLookupNamespaces.Add("SquaredInfinity.Diagnostics.Filters");
            serializationService.TypeLookupNamespaces.Add("SquaredInfinity.Diagnostics.Formatters");
            serializationService.TypeLookupNamespaces.Add("SquaredInfinity.Diagnostics.Sinks");
            serializationService.TypeLookupNamespaces.Add("SquaredInfinity.Diagnostics.Sinks.File");
            serializationService.TypeLookupNamespaces.Add("SquaredInfinity.Diagnostics.TypeDescriptors");

            serializationService.KnownTypes.Add("FileSink", typeof(FileSink));

            serializationService.KnownTypes.Add("SquaredInfinity.Diagnostics", typeof(DiagnosticsConfiguration));

            serializationService.TryConvertStringToPropertyValue += (s, e) => TryConvertStringToPropertyValue(e);
            serializationService.TryResolveElementReference += (s, e) => TryResolveElementReference(e);

            return serializationService.Deserialize<Entities.DiagnosticsConfiguration>(doc);
        }
        void TryConvertStringToPropertyValue(FlexiXmlSerializationService.ConvertStringToPropertyValueEventArgs e)
        {
            var configuration = e.DeserializationRootObject as DiagnosticsConfiguration;

            if (FilterType.IsAssignableFrom(e.DeclaringType)
                && LogLevelType.IsEqualTo(e.PropertyInfo.PropertyType))
            {
                SeverityLevel result;

                if (configuration.SeverityLevels.TryFindByName(e.ValueAsString, out result))
                {
                    e.Handle(result);
                    return;
                }
            }

            if(e.PropertyInfo.PropertyType == typeof(IFormatter))
            {
                var formatter = new PatternFormatter();
                formatter.Pattern = e.ValueAsString;

                e.Handle(formatter);
                return;
            }

            if(e.DeclaringType == typeof(DefaultArchiveStrategy) && e.PropertyInfo.Name == "TriggerOnFileSize")
            {
                string fileSizeAsString = null;
                int multiplier = 0;

                if (e.ValueAsString.EndsWith("GB"))
                {
                    var str = e.ValueAsString;
                    fileSizeAsString = str.Substring(0, str.Length - "KB".Length);
                    multiplier = 1000000000;
                }
                else if(e.ValueAsString.EndsWith("MB"))
                {
                    var str = e.ValueAsString;
                    fileSizeAsString = str.Substring(0, str.Length - "MB".Length);
                    multiplier = 1000000;
                }
                else if(e.ValueAsString.EndsWith("KB"))
                {
                    var str = e.ValueAsString;
                    fileSizeAsString = str.Substring(0, str.Length - "KB".Length);
                    multiplier = 1000;
                }

                if (!fileSizeAsString.IsNullOrEmpty())
                {
                    long result = 0;
                    if (long.TryParse(fileSizeAsString, out result))
                    {
                        e.Handle(result * multiplier);
                    }
                }
            }
        }