IGNITE-3359 .NET: Added IgniteConfiguration.ToXml() method. This closes #918.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/e087152c Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/e087152c Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/e087152c Branch: refs/heads/ignite-3443 Commit: e087152cb86375c3f75d8dbf5f77f974bb3adb45 Parents: c421614 Author: Pavel Tupitsyn <[email protected]> Authored: Thu Aug 4 09:12:14 2016 +0300 Committer: vozerov-gridgain <[email protected]> Committed: Thu Aug 4 09:12:14 2016 +0300 ---------------------------------------------------------------------- .../IgniteConfigurationSerializerTest.cs | 145 +++++++++++++++++-- .../Apache.Ignite.Core/IgniteConfiguration.cs | 65 +++++++++ 2 files changed, 195 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/e087152c/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs ---------------------------------------------------------------------- diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs index 73e0047..b9e0236 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs @@ -22,6 +22,7 @@ namespace Apache.Ignite.Core.Tests using System; using System.Collections; using System.Collections.Generic; + using System.Configuration; using System.Globalization; using System.IO; using System.Linq; @@ -111,9 +112,8 @@ namespace Apache.Ignite.Core.Tests <atomicConfiguration backups='2' cacheMode='Local' atomicSequenceReserveSize='250' /> <transactionConfiguration defaultTransactionConcurrency='Optimistic' defaultTransactionIsolation='RepeatableRead' defaultTimeout='0:1:2' pessimisticTransactionLogSize='15' pessimisticTransactionLogLinger='0:0:33' /> </igniteConfig>"; - var reader = XmlReader.Create(new StringReader(xml)); - var cfg = IgniteConfigurationXmlSerializer.Deserialize(reader); + var cfg = IgniteConfiguration.FromXml(xml); Assert.AreEqual("c:", cfg.WorkDirectory); Assert.AreEqual("127.1.1.1", cfg.Localhost); @@ -279,6 +279,132 @@ namespace Apache.Ignite.Core.Tests } /// <summary> + /// Tests the XML conversion. + /// </summary> + [Test] + public void TestToXml() + { + // Empty config + Assert.AreEqual("<?xml version=\"1.0\" encoding=\"utf-16\"?>\r\n<igniteConfiguration " + + "xmlns=\"http://ignite.apache.org/schema/dotnet/IgniteConfigurationSection\" />", + new IgniteConfiguration().ToXml()); + + // Some properties + var cfg = new IgniteConfiguration + { + GridName = "myGrid", + ClientMode = true, + CacheConfiguration = new[] + { + new CacheConfiguration("myCache") + { + CacheMode = CacheMode.Replicated, + QueryEntities = new[] + { + new QueryEntity(typeof(int)), + new QueryEntity(typeof(int), typeof(string)) + } + } + }, + IncludedEventTypes = new[] + { + EventType.CacheEntryCreated, + EventType.CacheNodesLeft + } + }; + + Assert.AreEqual(FixLineEndings(@"<?xml version=""1.0"" encoding=""utf-16""?> +<igniteConfiguration gridName=""myGrid"" clientMode=""true"" xmlns=""http://ignite.apache.org/schema/dotnet/IgniteConfigurationSection""> + <cacheConfiguration> + <cacheConfiguration name=""myCache"" cacheMode=""Replicated""> + <queryEntities> + <queryEntity valueTypeName=""java.lang.Integer"" valueType=""System.Int32"" /> + <queryEntity keyTypeName=""java.lang.Integer"" keyType=""System.Int32"" valueTypeName=""java.lang.String"" valueType=""System.String"" /> + </queryEntities> + </cacheConfiguration> + </cacheConfiguration> + <includedEventTypes> + <int>CacheEntryCreated</int> + <int>CacheNodesLeft</int> + </includedEventTypes> +</igniteConfiguration>"), cfg.ToXml()); + + // Custom section name and indent + var sb = new StringBuilder(); + + var settings = new XmlWriterSettings + { + Indent = true, + IndentChars = " " + }; + + using (var xmlWriter = XmlWriter.Create(sb, settings)) + { + cfg.ToXml(xmlWriter, "igCfg"); + } + + Assert.AreEqual(FixLineEndings(@"<?xml version=""1.0"" encoding=""utf-16""?> +<igCfg gridName=""myGrid"" clientMode=""true"" xmlns=""http://ignite.apache.org/schema/dotnet/IgniteConfigurationSection""> + <cacheConfiguration> + <cacheConfiguration name=""myCache"" cacheMode=""Replicated""> + <queryEntities> + <queryEntity valueTypeName=""java.lang.Integer"" valueType=""System.Int32"" /> + <queryEntity keyTypeName=""java.lang.Integer"" keyType=""System.Int32"" valueTypeName=""java.lang.String"" valueType=""System.String"" /> + </queryEntities> + </cacheConfiguration> + </cacheConfiguration> + <includedEventTypes> + <int>CacheEntryCreated</int> + <int>CacheNodesLeft</int> + </includedEventTypes> +</igCfg>"), sb.ToString()); + } + + /// <summary> + /// Tests the deserialization. + /// </summary> + [Test] + public void TestFromXml() + { + // Empty section. + var cfg = IgniteConfiguration.FromXml("<x />"); + AssertReflectionEqual(new IgniteConfiguration(), cfg); + + // Empty section with XML header. + cfg = IgniteConfiguration.FromXml("<?xml version=\"1.0\" encoding=\"utf-16\"?><x />"); + AssertReflectionEqual(new IgniteConfiguration(), cfg); + + // Simple test. + cfg = IgniteConfiguration.FromXml(@"<igCfg gridName=""myGrid"" clientMode=""true"" />"); + AssertReflectionEqual(new IgniteConfiguration {GridName = "myGrid", ClientMode = true}, cfg); + + // Invalid xml. + var ex = Assert.Throws<ConfigurationErrorsException>(() => + IgniteConfiguration.FromXml(@"<igCfg foo=""bar"" />")); + + Assert.AreEqual("Invalid IgniteConfiguration attribute 'foo=bar', there is no such property " + + "on 'Apache.Ignite.Core.IgniteConfiguration'", ex.Message); + + // Xml reader. + using (var xmlReader = XmlReader.Create( + new StringReader(@"<igCfg gridName=""myGrid"" clientMode=""true"" />"))) + { + cfg = IgniteConfiguration.FromXml(xmlReader); + } + AssertReflectionEqual(new IgniteConfiguration { GridName = "myGrid", ClientMode = true }, cfg); + } + + /// <summary> + /// Ensures windows-style \r\n line endings in a string literal. + /// Git settings may cause string literals in both styles. + /// </summary> + private static string FixLineEndings(string s) + { + return s.Split('\n').Select(x => x.TrimEnd('\r')) + .Aggregate((acc, x) => string.Format("{0}\r\n{1}", acc, x)); + } + + /// <summary> /// Checks the schema validation. /// </summary> private static void CheckSchemaValidation() @@ -325,20 +451,9 @@ namespace Apache.Ignite.Core.Tests /// </summary> private static IgniteConfiguration SerializeDeserialize(IgniteConfiguration cfg) { - var sb = new StringBuilder(); + var xml = cfg.ToXml(); - using (var xmlWriter = XmlWriter.Create(sb)) - { - IgniteConfigurationXmlSerializer.Serialize(cfg, xmlWriter, "igniteConfig"); - } - - var xml = sb.ToString(); - - using (var xmlReader = XmlReader.Create(new StringReader(xml))) - { - xmlReader.MoveToContent(); - return IgniteConfigurationXmlSerializer.Deserialize(xmlReader); - } + return IgniteConfiguration.FromXml(xml); } /// <summary> http://git-wip-us.apache.org/repos/asf/ignite/blob/e087152c/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfiguration.cs ---------------------------------------------------------------------- diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfiguration.cs b/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfiguration.cs index 6bdf1ab..e033ce0 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfiguration.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfiguration.cs @@ -24,6 +24,8 @@ using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; + using System.Text; + using System.Xml; using Apache.Ignite.Core.Binary; using Apache.Ignite.Core.Cache; using Apache.Ignite.Core.Cache.Configuration; @@ -678,5 +680,68 @@ get { return _isLateAffinityAssignment ?? DefaultIsLateAffinityAssignment; } set { _isLateAffinityAssignment = value; } } + + /// <summary> + /// Serializes this instance to the specified XML writer. + /// </summary> + /// <param name="writer">The writer.</param> + /// <param name="rootElementName">Name of the root element.</param> + public void ToXml(XmlWriter writer, string rootElementName) + { + IgniteArgumentCheck.NotNull(writer, "writer"); + IgniteArgumentCheck.NotNullOrEmpty(rootElementName, "rootElementName"); + + IgniteConfigurationXmlSerializer.Serialize(this, writer, rootElementName); + } + + /// <summary> + /// Serializes this instance to an XML string. + /// </summary> + public string ToXml() + { + var sb = new StringBuilder(); + + var settings = new XmlWriterSettings + { + Indent = true + }; + + using (var xmlWriter = XmlWriter.Create(sb, settings)) + { + ToXml(xmlWriter, "igniteConfiguration"); + } + + return sb.ToString(); + } + + /// <summary> + /// Deserializes IgniteConfiguration from the XML reader. + /// </summary> + /// <param name="reader">The reader.</param> + /// <returns>Deserialized instance.</returns> + public static IgniteConfiguration FromXml(XmlReader reader) + { + IgniteArgumentCheck.NotNull(reader, "reader"); + + return IgniteConfigurationXmlSerializer.Deserialize(reader); + } + + /// <summary> + /// Deserializes IgniteConfiguration from the XML string. + /// </summary> + /// <param name="xml">Xml string.</param> + /// <returns>Deserialized instance.</returns> + public static IgniteConfiguration FromXml(string xml) + { + IgniteArgumentCheck.NotNullOrEmpty(xml, "xml"); + + using (var xmlReader = XmlReader.Create(new StringReader(xml))) + { + // Skip XML header. + xmlReader.MoveToContent(); + + return FromXml(xmlReader); + } + } } }
