From: <fab...@us...> - 2010-10-12 17:25:38
|
Revision: 5246 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5246&view=rev Author: fabiomaulo Date: 2010-10-12 17:25:31 +0000 (Tue, 12 Oct 2010) Log Message: ----------- Apply NH-2342 XDocument support and System.Xml.Linq reference :(( Modified Paths: -------------- trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate/NHibernateUtil.cs trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Type/XDocType.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/XDocClass.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/XDocClass.hbm.xml trunk/nhibernate/src/NHibernate.Test/TypesTest/XDocTypeFixture.cs Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2010-10-12 16:15:16 UTC (rev 5245) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2010-10-12 17:25:31 UTC (rev 5246) @@ -67,6 +67,9 @@ <HintPath>..\..\lib\net\3.5\Remotion.Data.Linq.dll</HintPath> </Reference> <Reference Include="System.Configuration" /> + <Reference Include="System.Xml.Linq"> + <RequiredTargetFramework>3.5</RequiredTargetFramework> + </Reference> </ItemGroup> <ItemGroup> <Compile Include="ADOException.cs" /> @@ -861,6 +864,7 @@ <Compile Include="Type\LocalDateTimeType.cs" /> <Compile Include="Type\UriType.cs" /> <Compile Include="Type\UtcDateTimeType.cs" /> + <Compile Include="Type\XDocType.cs" /> <Compile Include="Type\XmlDocType.cs" /> <Compile Include="Util\ExpressionsHelper.cs" /> <Compile Include="Util\NullableDictionary.cs" /> Modified: trunk/nhibernate/src/NHibernate/NHibernateUtil.cs =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernateUtil.cs 2010-10-12 16:15:16 UTC (rev 5245) +++ trunk/nhibernate/src/NHibernate/NHibernateUtil.cs 2010-10-12 17:25:31 UTC (rev 5246) @@ -283,6 +283,8 @@ public static readonly NullableType XmlDoc = new XmlDocType(); + public static readonly NullableType XDoc = new XDocType(); + public static readonly NullableType Uri = new UriType(); /// <summary> Modified: trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs 2010-10-12 16:15:16 UTC (rev 5245) +++ trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs 2010-10-12 17:25:31 UTC (rev 5246) @@ -4,6 +4,7 @@ using System.Globalization; using System.Reflection; using System.Xml; +using System.Xml.Linq; using NHibernate.Bytecode; using NHibernate.Classic; using NHibernate.Engine; @@ -211,6 +212,8 @@ RegisterType(typeof (Uri), NHibernateUtil.Uri, new[] {"uri", "url"}); + RegisterType(typeof(XDocument), NHibernateUtil.XDoc, new[] { "xdoc", "xdocument" }); + // object needs to have both class and serializable setup before it can // be created. RegisterType(typeof (Object), NHibernateUtil.Object, new[] {"object"}); Added: trunk/nhibernate/src/NHibernate/Type/XDocType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/XDocType.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Type/XDocType.cs 2010-10-12 17:25:31 UTC (rev 5246) @@ -0,0 +1,85 @@ +using System; +using System.Data; +using System.Xml.Linq; +using NHibernate.SqlTypes; + +namespace NHibernate.Type +{ + [Serializable] + public class XDocType : MutableType + { + public XDocType() + : base(new XmlSqlType()) + { + } + + public XDocType(SqlType sqlType) + : base(sqlType) + { + } + + public override string Name + { + get { return "XDoc"; } + } + + public override System.Type ReturnedClass + { + get { return typeof (XDocument); } + } + + public override void Set(IDbCommand cmd, object value, int index) + { + ((IDataParameter) cmd.Parameters[index]).Value = ((XDocument) value).ToString(SaveOptions.DisableFormatting); + } + + public override object Get(IDataReader rs, int index) + { + // according to documentation, GetValue should return a string, at list for MsSQL + // hopefully all DataProvider has the same behaviour + string xmlString = Convert.ToString(rs.GetValue(index)); + return FromStringValue(xmlString); + } + + public override object Get(IDataReader rs, string name) + { + return Get(rs, rs.GetOrdinal(name)); + } + + public override string ToString(object val) + { + return val == null ? null : val.ToString(); + } + + public override object FromStringValue(string xml) + { + if (xml != null) + { + return XDocument.Parse(xml); + } + + return null; + } + + public override object DeepCopyNotNull(object value) + { + var original = (XDocument) value; + var copy = new XDocument(original); + return copy; + } + + public override bool IsEqual(object x, object y) + { + if (x == null && y == null) + { + return true; + } + if (x == null || y == null) + { + return false; + } + + return XNode.DeepEquals((XDocument) x, (XDocument) y); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-10-12 16:15:16 UTC (rev 5245) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-10-12 17:25:31 UTC (rev 5246) @@ -80,6 +80,9 @@ </Reference> <Reference Include="System.Transactions" /> <Reference Include="System.Xml" /> + <Reference Include="System.Xml.Linq"> + <RequiredTargetFramework>3.5</RequiredTargetFramework> + </Reference> </ItemGroup> <ItemGroup> <Compile Include="Ado\AlmostSimple.cs" /> @@ -538,6 +541,8 @@ <Compile Include="TypesTest\UriClass.cs" /> <Compile Include="TypesTest\UriTypeFixture.cs" /> <Compile Include="TypesTest\UtcDateTimeTypeFixture.cs" /> + <Compile Include="TypesTest\XDocClass.cs" /> + <Compile Include="TypesTest\XDocTypeFixture.cs" /> <Compile Include="TypesTest\XmlDocClass.cs" /> <Compile Include="TypesTest\XmlDocTypeFixture.cs" /> <Compile Include="UtilityTest\ReflectionHelperIsMethodOfTests.cs" /> @@ -2329,6 +2334,7 @@ <EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" /> <EmbeddedResource Include="DriverTest\EntityForMs2008.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="TypesTest\XDocClass.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2374\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2328\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2313\Mappings.hbm.xml" /> Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/XDocClass.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/XDocClass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/XDocClass.cs 2010-10-12 17:25:31 UTC (rev 5246) @@ -0,0 +1,11 @@ +using System.Xml.Linq; + +namespace NHibernate.Test.TypesTest +{ + public class XDocClass + { + public int Id { get; set; } + public XDocument Document { get; set; } + public XDocument AutoDocument { get; set; } + } +} Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/XDocClass.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/XDocClass.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/XDocClass.hbm.xml 2010-10-12 17:25:31 UTC (rev 5246) @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false"> + <class name="NHibernate.Test.TypesTest.XDocClass, NHibernate.Test" table="nh_xdoc"> + <id name="Id" column="id"> + <generator class="assigned" /> + </id> + + <property name="Document" type="XDoc" /> + <property name="AutoDocument" /> + </class> +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/XDocTypeFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/XDocTypeFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/XDocTypeFixture.cs 2010-10-12 17:25:31 UTC (rev 5246) @@ -0,0 +1,76 @@ +using System.Xml.Linq; +using NHibernate.Type; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.TypesTest +{ + [TestFixture] + public class XDocTypeFixture : TypeFixtureBase + { + protected override string TypeName + { + get { return "XDoc"; } + } + + [Test] + public void ReadWrite() + { + using (var s = OpenSession()) + { + var docEntity = new XDocClass {Id = 1 }; + docEntity.Document = XDocument.Parse("<MyNode>my Text</MyNode>"); + s.Save(docEntity); + s.Flush(); + } + + using (var s = OpenSession()) + { + var docEntity = s.Get<XDocClass>(1); + var document = docEntity.Document; + document.Should().Not.Be.Null(); + document.Document.Root.ToString(SaveOptions.DisableFormatting).Should().Contain("<MyNode>my Text</MyNode>"); + var xmlElement = new XElement("Pizza", new XAttribute("temp", "calda")); + document.Document.Root.Add(xmlElement); + s.Save(docEntity); + s.Flush(); + } + using (var s = OpenSession()) + { + var docEntity = s.Get<XDocClass>(1); + var document = docEntity.Document; + document.Document.Root.ToString(SaveOptions.DisableFormatting).Should().Contain("Pizza temp=\"calda\""); + s.Delete(docEntity); + s.Flush(); + } + } + + [Test] + public void InsertNullValue() + { + using (ISession s = OpenSession()) + { + var docEntity = new XDocClass { Id = 1 }; + docEntity.Document = null; + s.Save(docEntity); + s.Flush(); + } + + using (ISession s = OpenSession()) + { + var docEntity = s.Get<XDocClass>(1); + docEntity.Document.Should().Be.Null(); + s.Delete(docEntity); + s.Flush(); + } + } + + [Test] + public void AutoDiscoverFromNetType() + { + // integration test to be 100% sure + var propertyType = sessions.GetEntityPersister(typeof (XDocClass).FullName).GetPropertyType("AutoDocument"); + propertyType.Should().Be.InstanceOf<XDocType>(); + } + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |