|
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.
|