From: <fab...@us...> - 2010-10-07 12:34:46
|
Revision: 5235 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5235&view=rev Author: fabiomaulo Date: 2010-10-07 12:34:39 +0000 (Thu, 07 Oct 2010) Log Message: ----------- Fix NH-2367 (UriType) 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/UriType.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/UriClass.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/UriClass.hbm.xml trunk/nhibernate/src/NHibernate.Test/TypesTest/UriTypeFixture.cs Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2010-10-06 20:55:15 UTC (rev 5234) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2010-10-07 12:34:39 UTC (rev 5235) @@ -859,6 +859,7 @@ <Compile Include="Type\DefaultCollectionTypeFactory.cs" /> <Compile Include="Bytecode\ICollectionTypeFactory.cs" /> <Compile Include="Type\LocalDateTimeType.cs" /> + <Compile Include="Type\UriType.cs" /> <Compile Include="Type\UtcDateTimeType.cs" /> <Compile Include="Type\XmlDocType.cs" /> <Compile Include="Util\ExpressionsHelper.cs" /> Modified: trunk/nhibernate/src/NHibernate/NHibernateUtil.cs =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernateUtil.cs 2010-10-06 20:55:15 UTC (rev 5234) +++ trunk/nhibernate/src/NHibernate/NHibernateUtil.cs 2010-10-07 12:34:39 UTC (rev 5235) @@ -283,6 +283,8 @@ public static readonly NullableType XmlDoc = new XmlDocType(); + public static readonly NullableType Uri = new UriType(); + /// <summary> /// A NHibernate persistent enum type /// </summary> Modified: trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs 2010-10-06 20:55:15 UTC (rev 5234) +++ trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs 2010-10-07 12:34:39 UTC (rev 5235) @@ -208,6 +208,8 @@ RegisterType(typeof (UInt64), NHibernateUtil.UInt64, new[] {"ulong"}); RegisterType(typeof (XmlDocument), NHibernateUtil.XmlDoc, new[] {"xmldoc", "xmldocument", "xml"}); + + RegisterType(typeof (Uri), NHibernateUtil.Uri, new[] {"uri", "url"}); // object needs to have both class and serializable setup before it can // be created. Added: trunk/nhibernate/src/NHibernate/Type/UriType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/UriType.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Type/UriType.cs 2010-10-07 12:34:39 UTC (rev 5235) @@ -0,0 +1,64 @@ +using System; +using System.Data; +using NHibernate.SqlTypes; + +namespace NHibernate.Type +{ + [Serializable] + public class UriType : ImmutableType, IDiscriminatorType + { + public UriType() + : base(new StringSqlType()) + { + } + + public UriType(SqlType sqlType) : base(sqlType) + { + } + + public override string Name + { + get { return "Uri"; } + } + + public override System.Type ReturnedClass + { + get { return typeof(Uri); } + } + + public object StringToObject(string xml) + { + return new Uri(xml); + } + + public override void Set(IDbCommand cmd, object value, int index) + { + ((IDataParameter)cmd.Parameters[index]).Value = ToString(value); + } + + public override object Get(IDataReader rs, int index) + { + return StringToObject(Convert.ToString(rs[index])); + } + + public override object Get(IDataReader rs, string name) + { + return StringToObject(Convert.ToString(rs[name])); + } + + public override string ToString(object val) + { + return ((Uri)val).OriginalString; + } + + public override object FromStringValue(string xml) + { + return StringToObject(xml); + } + + public string ObjectToSQLString(object value, Dialect.Dialect dialect) + { + return "'" + ((Uri)value).OriginalString + "'"; + } + } +} \ 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-06 20:55:15 UTC (rev 5234) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-10-07 12:34:39 UTC (rev 5235) @@ -529,6 +529,8 @@ <Compile Include="TypesTest\CharClassFixture.cs" /> <Compile Include="TypesTest\DateTimeClass.cs" /> <Compile Include="TypesTest\LocalDateTimeTypeFixture.cs" /> + <Compile Include="TypesTest\UriClass.cs" /> + <Compile Include="TypesTest\UriTypeFixture.cs" /> <Compile Include="TypesTest\UtcDateTimeTypeFixture.cs" /> <Compile Include="TypesTest\XmlDocClass.cs" /> <Compile Include="TypesTest\XmlDocTypeFixture.cs" /> @@ -2321,6 +2323,7 @@ <EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" /> <EmbeddedResource Include="DriverTest\EntityForMs2008.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="TypesTest\UriClass.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\EntityNameWithFullName\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2361\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\EntityNameAndCompositeId\Mappings.hbm.xml" /> Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/UriClass.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/UriClass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/UriClass.cs 2010-10-07 12:34:39 UTC (rev 5235) @@ -0,0 +1,11 @@ +using System; + +namespace NHibernate.Test.TypesTest +{ + public class UriClass + { + public int Id { get; set; } + public Uri Url { get; set; } + public Uri AutoUri { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/UriClass.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/UriClass.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/UriClass.hbm.xml 2010-10-07 12:34:39 UTC (rev 5235) @@ -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.UriClass, NHibernate.Test" table="nh_uri"> + <id name="Id" column="id"> + <generator class="assigned" /> + </id> + + <property name="Url" type="Uri" /> + <property name="AutoUri" /> + </class> +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/UriTypeFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/UriTypeFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/UriTypeFixture.cs 2010-10-07 12:34:39 UTC (rev 5235) @@ -0,0 +1,73 @@ +using System; +using NHibernate.Type; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.TypesTest +{ + public class UriTypeFixture : TypeFixtureBase + { + protected override string TypeName + { + get { return "Uri"; } + } + + [Test] + public void ReadWrite() + { + using (var s = OpenSession()) + { + var entity = new UriClass { Id = 1 }; + entity.Url = new Uri("http://www.fabiomaulo.blogspot.com/"); + s.Save(entity); + s.Flush(); + } + + using (var s = OpenSession()) + { + var entity = s.Get<UriClass>(1); + entity.Url.Should().Not.Be.Null(); + entity.Url.OriginalString.Should().Be("http://www.fabiomaulo.blogspot.com/"); + entity.Url = new Uri("http://fabiomaulo.blogspot.com/2010/10/nhibernate-30-cookbook.html"); + s.Save(entity); + s.Flush(); + } + using (var s = OpenSession()) + { + var entity = s.Get<UriClass>(1); + entity.Url.OriginalString.Should().Be("http://fabiomaulo.blogspot.com/2010/10/nhibernate-30-cookbook.html"); + s.Delete(entity); + s.Flush(); + } + } + + [Test] + public void InsertNullValue() + { + using (ISession s = OpenSession()) + { + var entity = new UriClass { Id = 1 }; + entity.Url = null; + s.Save(entity); + s.Flush(); + } + + using (ISession s = OpenSession()) + { + var entity = s.Get<UriClass>(1); + entity.Url.Should().Be.Null(); + s.Delete(entity); + s.Flush(); + } + } + + [Test] + public void AutoDiscoverFromNetType() + { + // integration test to be 100% sure + var propertyType = sessions.GetEntityPersister(typeof(UriClass).FullName).GetPropertyType("AutoUri"); + propertyType.Should().Be.InstanceOf<UriType>(); + } + + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |