From: <te...@us...> - 2008-11-07 07:37:41
|
Revision: 3892 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3892&view=rev Author: tehlike Date: 2008-11-07 07:37:36 +0000 (Fri, 07 Nov 2008) Log Message: ----------- Implementing AbstractEnumType for enum bases. Also fixes NH-1232 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate/Type/EnumCharType.cs trunk/nhibernate/src/NHibernate/Type/EnumStringType.cs trunk/nhibernate/src/NHibernate/Type/PersistentEnumType.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Type/AbstractEnumType.cs trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/ trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Bar.cs trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Baz.cs trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Colors.cs trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/EnumDiscriminator.hbm.xml trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/EnumDiscriminatorFixture.cs trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Foo.cs Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-11-07 04:49:41 UTC (rev 3891) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-11-07 07:37:36 UTC (rev 3892) @@ -1046,6 +1046,7 @@ <Compile Include="Tuple\VersionProperty.cs" /> <Compile Include="TypeMismatchException.cs" /> <Compile Include="Type\AbstractBynaryType.cs" /> + <Compile Include="Type\AbstractEnumType.cs" /> <Compile Include="Type\AbstractStringType.cs" /> <Compile Include="Type\AnsiCharType.cs" /> <Compile Include="Type\AnyType.cs" /> Added: trunk/nhibernate/src/NHibernate/Type/AbstractEnumType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/AbstractEnumType.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Type/AbstractEnumType.cs 2008-11-07 07:37:36 UTC (rev 3892) @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Text; +using NHibernate.SqlTypes; + +namespace NHibernate.Type +{ + + /// <summary> + /// Base class for enum types. + /// </summary> + [Serializable] + public abstract class AbstractEnumType : PrimitiveType, IDiscriminatorType + { + protected AbstractEnumType(SqlType sqlType,System.Type enumType) + : base(sqlType) + { + if (enumType.IsEnum) + { + this.enumType = enumType; + } + else + { + throw new MappingException(enumType.Name + " did not inherit from System.Enum"); + } + defaultValue = Enum.GetValues(enumType).GetValue(0); + } + + private readonly object defaultValue; + private readonly System.Type enumType; + + public override System.Type ReturnedClass + { + get { return enumType; } + } + + + #region IIdentifierType Members + + public object StringToObject(string xml) + { + return Enum.Parse(enumType, xml); + } + + #endregion + + + public override object FromStringValue(string xml) + { + return StringToObject(xml); + } + + public override System.Type PrimitiveClass + { + get { return this.enumType; } + } + + public override object DefaultValue + { + get { return defaultValue; } + } + } +} Modified: trunk/nhibernate/src/NHibernate/Type/EnumCharType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/EnumCharType.cs 2008-11-07 04:49:41 UTC (rev 3891) +++ trunk/nhibernate/src/NHibernate/Type/EnumCharType.cs 2008-11-07 07:37:36 UTC (rev 3892) @@ -6,21 +6,12 @@ namespace NHibernate.Type { [Serializable] - public class EnumCharType<T> : ImmutableType, IDiscriminatorType + public class EnumCharType<T> : AbstractEnumType { - public EnumCharType() : base(new StringFixedLengthSqlType(1)) + public EnumCharType() : base(new StringFixedLengthSqlType(1),typeof(T)) { - if (typeof(T).IsEnum) - { - this.enumClass = typeof(T); - } - else - { - throw new MappingException(enumClass.Name + " did not inherit from System.Enum"); - } } - private readonly System.Type enumClass; public virtual object GetInstance(object code) { @@ -34,13 +25,13 @@ } else { - throw new HibernateException(string.Format("Can't Parse {0} as {1}", code, enumClass.Name)); + throw new HibernateException(string.Format("Can't Parse {0} as {1}", code, ReturnedClass.Name)); } } private object GetInstanceFromString(String s) { - if (s.Length == 0) throw new HibernateException(string.Format("Can't Parse empty string as {0}", enumClass.Name)); + if (s.Length == 0) throw new HibernateException(string.Format("Can't Parse empty string as {0}", this.ReturnedClass.Name)); if (s.Length == 1) { @@ -52,17 +43,17 @@ //Name of enum value e.g. "Red" try { - return Enum.Parse(enumClass, s, false); + return Enum.Parse(this.ReturnedClass, s, false); } catch (ArgumentException) { try { - return Enum.Parse(enumClass, s, true); + return Enum.Parse(this.ReturnedClass, s, true); } catch (ArgumentException ae) { - throw new HibernateException(string.Format("Can't Parse {0} as {1}", s, enumClass.Name), ae); + throw new HibernateException(string.Format("Can't Parse {0} as {1}", s, this.ReturnedClass.Name), ae); } } } @@ -72,13 +63,13 @@ { Object instance; - instance = Enum.ToObject(enumClass, c); - if (Enum.IsDefined(enumClass, instance)) return instance; + instance = Enum.ToObject(this.ReturnedClass, c); + if (Enum.IsDefined(this.ReturnedClass, instance)) return instance; - instance = Enum.ToObject(enumClass, Alternate(c)); - if (Enum.IsDefined(enumClass, instance)) return instance; + instance = Enum.ToObject(this.ReturnedClass, Alternate(c)); + if (Enum.IsDefined(this.ReturnedClass, instance)) return instance; - throw new HibernateException(string.Format("Can't Parse {0} as {1}", c, enumClass.Name)); + throw new HibernateException(string.Format("Can't Parse {0} as {1}", c, this.ReturnedClass.Name)); } private Char Alternate(Char c) @@ -103,10 +94,6 @@ } } - public override System.Type ReturnedClass - { - get { return enumClass; } - } public override void Set(IDbCommand cmd, object value, int index) { @@ -141,7 +128,7 @@ public override string Name { - get { return "enumchar - " + enumClass.Name; } + get { return "enumchar - " + this.ReturnedClass.Name; } } public override string ToString(object value) @@ -166,17 +153,13 @@ return (value == null) ? null : GetValue(value); } - public virtual object StringToObject(string xml) - { - return (string.IsNullOrEmpty(xml)) ? null : FromStringValue(xml); - } public override object FromStringValue(string xml) { return GetInstance(xml); } - public virtual string ObjectToSQLString(object value, Dialect.Dialect dialect) + public override string ObjectToSQLString(object value, Dialect.Dialect dialect) { return '\'' + GetValue(value).ToString() + '\''; } Modified: trunk/nhibernate/src/NHibernate/Type/EnumStringType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/EnumStringType.cs 2008-11-07 04:49:41 UTC (rev 3891) +++ trunk/nhibernate/src/NHibernate/Type/EnumStringType.cs 2008-11-07 07:37:36 UTC (rev 3892) @@ -62,9 +62,8 @@ /// </para> /// </remarks> [Serializable] - public abstract class EnumStringType : ImmutableType, IDiscriminatorType + public abstract class EnumStringType : AbstractEnumType { - private readonly System.Type enumClass; /// <summary> /// Hardcoding of <c>255</c> for the maximum length @@ -91,16 +90,9 @@ /// <param name="enumClass">The <see cref="System.Type"/> of the Enum.</param> /// <param name="length">The length of the string that can be written to the column.</param> protected EnumStringType(System.Type enumClass, int length) - : base(SqlTypeFactory.GetString(length)) + :base(SqlTypeFactory.GetString(length),enumClass) { - if (enumClass.IsEnum) - { - this.enumClass = enumClass; - } - else - { - throw new MappingException(enumClass.Name + " did not inherit from System.Enum"); - } + } /// <summary> @@ -113,11 +105,11 @@ //code is an named constants defined for the enumeration. try { - return Enum.Parse(enumClass, code as string, true); + return StringToObject(code as string); } catch (ArgumentException ae) { - throw new HibernateException(string.Format("Can't Parse {0} as {1}", code, enumClass.Name), ae); + throw new HibernateException(string.Format("Can't Parse {0} as {1}", code, this.ReturnedClass.Name), ae); } } @@ -135,14 +127,6 @@ /// <summary> /// /// </summary> - public override System.Type ReturnedClass - { - get { return enumClass; } - } - - /// <summary> - /// - /// </summary> /// <param name="cmd"></param> /// <param name="value"></param> /// <param name="index"></param> @@ -155,7 +139,7 @@ } else { - par.Value = Enum.Format(this.enumClass, value, "G"); + par.Value = Enum.Format(this.ReturnedClass, value, "G"); } } @@ -200,7 +184,7 @@ /// </remarks> public override string Name { - get { return "enumstring - " + enumClass.Name; } + get { return "enumstring - " + this.ReturnedClass.Name; } } /// <summary> @@ -237,23 +221,9 @@ return (value == null) ? null : GetValue(value); } - /// <summary> - /// - /// </summary> - /// <param name="xml"></param> - /// <returns></returns> - public object StringToObject(string xml) - { - return (string.IsNullOrEmpty(xml)) ? null : FromStringValue(xml); - } - public override object FromStringValue(string xml) + public override string ObjectToSQLString(object value, Dialect.Dialect dialect) { - return GetInstance(xml); - } - - public string ObjectToSQLString(object value, Dialect.Dialect dialect) - { return GetValue(value).ToString(); } } Modified: trunk/nhibernate/src/NHibernate/Type/PersistentEnumType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/PersistentEnumType.cs 2008-11-07 04:49:41 UTC (rev 3891) +++ trunk/nhibernate/src/NHibernate/Type/PersistentEnumType.cs 2008-11-07 07:37:36 UTC (rev 3892) @@ -10,7 +10,7 @@ /// PersistentEnumType /// </summary> [Serializable] - public class PersistentEnumType : PrimitiveType + public class PersistentEnumType : AbstractEnumType { #region Converters @@ -160,19 +160,11 @@ } private static readonly Dictionary<System.Type, IEnumConverter> converters; - private readonly System.Type enumClass; private readonly IEnumConverter converter; - private readonly object defaultValue; - public PersistentEnumType(System.Type enumClass) : base(GetEnumCoverter(enumClass).SqlType) + public PersistentEnumType(System.Type enumClass) : base(GetEnumCoverter(enumClass).SqlType,enumClass) { - if (!enumClass.IsEnum) - { - throw new MappingException(enumClass.Name + " did not inherit from System.Enum"); - } converter = GetEnumCoverter(enumClass); - this.enumClass = enumClass; - defaultValue = Enum.GetValues(enumClass).GetValue(0); } public static IEnumConverter GetEnumCoverter(System.Type enumClass) @@ -207,7 +199,7 @@ { try { - return converter.ToObject(enumClass, code); + return converter.ToObject(this.ReturnedClass, code); } catch (ArgumentException ae) { @@ -230,10 +222,6 @@ return converter.ToEnumValue(code); } - public override System.Type ReturnedClass - { - get { return enumClass; } - } public override void Set(IDbCommand cmd, object value, int index) { @@ -248,7 +236,7 @@ public override string Name { - get { return enumClass.FullName; } + get { return ReturnedClass.FullName; } } public override string ToString(object value) @@ -283,22 +271,13 @@ return false; } - return ((PersistentEnumType) obj).enumClass == enumClass; + return ((PersistentEnumType)obj).ReturnedClass == ReturnedClass; } public override int GetHashCode() { - return enumClass.GetHashCode(); + return ReturnedClass.GetHashCode(); } - public override System.Type PrimitiveClass - { - get { return enumClass; } - } - - public override object DefaultValue - { - get { return defaultValue; } - } } } Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-11-07 04:49:41 UTC (rev 3891) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-11-07 07:37:36 UTC (rev 3892) @@ -858,6 +858,11 @@ <Compile Include="SubclassFilterTest\DiscrimSubclassFilterTest.cs" /> <Compile Include="SubclassFilterTest\Employee.cs" /> <Compile Include="SubclassFilterTest\Person.cs" /> + <Compile Include="Subclass\EnumDiscriminator\Bar.cs" /> + <Compile Include="Subclass\EnumDiscriminator\Baz.cs" /> + <Compile Include="Subclass\EnumDiscriminator\Colors.cs" /> + <Compile Include="Subclass\EnumDiscriminator\EnumDiscriminatorFixture.cs" /> + <Compile Include="Subclass\EnumDiscriminator\Foo.cs" /> <Compile Include="Subclass\SubclassAssert.cs" /> <Compile Include="Subclass\SubclassBase.cs" /> <Compile Include="Subclass\SubclassExtendsFixture.cs" /> @@ -1517,6 +1522,7 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="Subclass\EnumDiscriminator\EnumDiscriminator.hbm.xml" /> <EmbeddedResource Include="Generatedkeys\Select\MyEntity.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1478\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1447\Mappings.hbm.xml" /> Added: trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Bar.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Bar.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Bar.cs 2008-11-07 07:37:36 UTC (rev 3892) @@ -0,0 +1,4 @@ +namespace NHibernate.Test.Subclass.EnumDiscriminator +{ + public class Bar : Foo {} +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Baz.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Baz.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Baz.cs 2008-11-07 07:37:36 UTC (rev 3892) @@ -0,0 +1,22 @@ +using System; + +namespace NHibernate.Test.Subclass.EnumDiscriminator +{ + public class Baz + { + private Int64 id; + private Colors color; + + public virtual Int64 Id + { + get { return id; } + set { id = value; } + } + + public virtual Colors Color + { + get { return color; } + set { color = value; } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Colors.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Colors.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Colors.cs 2008-11-07 07:37:36 UTC (rev 3892) @@ -0,0 +1,9 @@ +namespace NHibernate.Test.Subclass.EnumDiscriminator +{ + public enum Colors + { + Red, + Green, + Blue + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/EnumDiscriminator.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/EnumDiscriminator.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/EnumDiscriminator.hbm.xml 2008-11-07 07:37:36 UTC (rev 3892) @@ -0,0 +1,17 @@ +<?xml version="1.0"?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false" namespace="NHibernate.Test.Subclass.EnumDiscriminator" assembly="NHibernate.Test"> + <class name="Foo" table="subclass_enumdiscriminator" discriminator-value="Green"> + <id name="Id" type="Int64"> + <generator class="assigned"/> + </id> + <discriminator column="Color" type="NHibernate.Test.Subclass.EnumDiscriminator.Colors, NHibernate.Test"/> + <subclass name="Bar" discriminator-value="Blue"/> + </class> + + <class name="Baz" table="subclass_enumdiscriminator"> + <id name="Id" type="Int64"> + <generator class="assigned"/> + </id> + <property name="Color"/> + </class> +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/EnumDiscriminatorFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/EnumDiscriminatorFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/EnumDiscriminatorFixture.cs 2008-11-07 07:37:36 UTC (rev 3892) @@ -0,0 +1,74 @@ +using System; +using System.Collections; +using NUnit.Framework; + +namespace NHibernate.Test.Subclass.EnumDiscriminator +{ + [TestFixture] + public class EnumDiscriminatorFixture : TestCase + { + protected override string MappingsAssembly + { + get { return "NHibernate.Test"; } + } + + protected override IList Mappings + { + get { return new String[] {"Subclass.EnumDiscriminator.EnumDiscriminator.hbm.xml"}; } + } + + [Test] + public void PersistsDefaultDiscriminatorValue() + { + Foo foo = new Foo(); + foo.Id = 1; + + using (ISession s = OpenSession()) + { + s.Save(foo); + s.Flush(); + } + + using (ISession s = OpenSession()) + { + Baz baz = s.Load<Baz>(1L); + Assert.AreEqual(Colors.Green, baz.Color); + } + } + + [Test] + public void CanConvertOneTypeToAnother() + { + Foo foo = new Foo(); + foo.Id = 1; + + using (ISession s = OpenSession()) + { + s.Save(foo); + s.Flush(); + } + + using (ISession s = OpenSession()) + { + Baz baz = s.Load<Baz>(1L); + baz.Color = Colors.Blue; + s.Save(baz); + s.Flush(); + } + + using (ISession s = OpenSession()) + { + Bar bar = s.Load<Bar>(1L); + } + } + + protected override void OnTearDown() + { + using (ISession s = OpenSession()) + { + s.Delete("from Baz"); + s.Flush(); + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Foo.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Foo.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Foo.cs 2008-11-07 07:37:36 UTC (rev 3892) @@ -0,0 +1,15 @@ +using System; + +namespace NHibernate.Test.Subclass.EnumDiscriminator +{ + public class Foo + { + private Int64 id; + + public long Id + { + get { return id; } + set { id = value; } + } + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |