From: <fab...@us...> - 2009-11-29 00:01:11
|
Revision: 4869 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4869&view=rev Author: fabiomaulo Date: 2009-11-29 00:00:57 +0000 (Sun, 29 Nov 2009) Log Message: ----------- Binders refactoring Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/HbmClass.cs trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/JoinedSubclassBinder.cs trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/MappingRootBinder.cs trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/RootClassBinder.cs trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/SubclassBinder.cs trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/UnionSubclassBinder.cs trunk/nhibernate/src/NHibernate/Mapping/Table.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate/Util/StringHelper.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/HbmExtensions.cs trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/HbmJoinedSubclass.cs trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/HbmSubclass.cs trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/HbmUnionSubclass.cs trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/IEntityDiscriminableMapping.cs trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/IEntityMapping.cs trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/IEntitySqlsMapping.cs Removed Paths: ------------- trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/IEntityMetadata.cs Modified: trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/HbmClass.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/HbmClass.cs 2009-11-28 21:09:24 UTC (rev 4868) +++ trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/HbmClass.cs 2009-11-29 00:00:57 UTC (rev 4869) @@ -1,8 +1,6 @@ -using System; - namespace NHibernate.Cfg.MappingSchema { - partial class HbmClass: AbstractDecoratable + partial class HbmClass : AbstractDecoratable, IEntityMapping, IEntityDiscriminableMapping { public HbmId Id { @@ -24,9 +22,111 @@ get { return Item1 as HbmTimestamp; } } + #region Implementation of IEntityMapping + protected override HbmMeta[] Metadatas { get { return meta ?? new HbmMeta[0]; } } + + public string EntityName + { + get { return entityname; } + } + + public string Name + { + get { return name; } + } + + public string Node + { + get { return node; } + } + + public string Proxy + { + get { return proxy; } + } + + public bool? UseLazy + { + get { return lazySpecified ? lazy : (bool?)null; } + } + + public HbmTuplizer[] Tuplizers + { + get { return tuplizer ?? new HbmTuplizer[0]; } + } + + public bool DynamicUpdate + { + get { return dynamicupdate; } + } + + public bool DynamicInsert + { + get { return dynamicinsert; } + } + + public int? BatchSize + { + get { return batchsizeSpecified ? batchsize : (int?) null; } + } + + public bool SelectBeforeUpdate + { + get { return selectbeforeupdate; } + } + + public string Persister + { + get { return persister; } + } + + public bool? IsAbstract + { + get { return abstractSpecified ? @abstract : (bool?) null; } + } + + public HbmSynchronize[] Synchronize + { + get { return synchronize ?? new HbmSynchronize[0]; } + } + + #endregion + + #region Implementation of IEntityDiscriminableMapping + + public string DiscriminatorValue + { + get { return discriminatorvalue; } + } + + #endregion + + #region Implementation of IEntitySqlsMapping + + public HbmLoader SqlLoader + { + get { return loader; } + } + + public HbmCustomSQL SqlInsert + { + get { return sqlinsert; } + } + + public HbmCustomSQL SqlUpdate + { + get { return sqlupdate; } + } + + public HbmCustomSQL SqlDelete + { + get { return sqldelete; } + } + + #endregion } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/HbmExtensions.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/HbmExtensions.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/HbmExtensions.cs 2009-11-29 00:00:57 UTC (rev 4869) @@ -0,0 +1,25 @@ +using System; +using NHibernate.Engine; + +namespace NHibernate.Cfg.MappingSchema +{ + public static class HbmExtensions + { + public static Versioning.OptimisticLock ToOptimisticLock(this HbmOptimisticLockMode hbmOptimisticLockMode) + { + switch (hbmOptimisticLockMode) + { + case HbmOptimisticLockMode.None: + return Versioning.OptimisticLock.None; + case HbmOptimisticLockMode.Version: + return Versioning.OptimisticLock.Version; + case HbmOptimisticLockMode.Dirty: + return Versioning.OptimisticLock.Dirty; + case HbmOptimisticLockMode.All: + return Versioning.OptimisticLock.All; + default: + return Versioning.OptimisticLock.Version; + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/HbmJoinedSubclass.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/HbmJoinedSubclass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/HbmJoinedSubclass.cs 2009-11-29 00:00:57 UTC (rev 4869) @@ -0,0 +1,106 @@ +namespace NHibernate.Cfg.MappingSchema +{ + public partial class HbmJoinedSubclass : AbstractDecoratable, IEntityMapping + { + #region Overrides of AbstractDecoratable + + protected override HbmMeta[] Metadatas + { + get { return meta ?? new HbmMeta[0]; } + } + + #endregion + + #region Implementation of IEntityMapping + + public string EntityName + { + get { return entityname; } + } + + public string Name + { + get { return name; } + } + + public string Node + { + get { return node; } + } + + public string Proxy + { + get { return proxy; } + } + + public bool? UseLazy + { + get { return lazySpecified ? lazy : (bool?)null; } + } + + public HbmTuplizer[] Tuplizers + { + get { return tuplizer ?? new HbmTuplizer[0]; } + } + public bool DynamicUpdate + { + get { return dynamicupdate; } + } + + public bool DynamicInsert + { + get { return dynamicinsert; } + } + + public int? BatchSize + { + get { return !string.IsNullOrEmpty(batchsize) ? int.Parse(batchsize) : (int?)null; } + } + + public bool SelectBeforeUpdate + { + get { return selectbeforeupdate; } + } + + public string Persister + { + get { return persister; } + } + + public bool? IsAbstract + { + get { return abstractSpecified ? @abstract : (bool?)null; } + } + + public HbmSynchronize[] Synchronize + { + get { return synchronize ?? new HbmSynchronize[0]; } + } + + #endregion + + #region Implementation of IEntitySqlsMapping + + public HbmLoader SqlLoader + { + get { return loader; } + } + + public HbmCustomSQL SqlInsert + { + get { return sqlinsert; } + } + + public HbmCustomSQL SqlUpdate + { + get { return sqlupdate; } + } + + public HbmCustomSQL SqlDelete + { + get { return sqldelete; } + } + + #endregion + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/HbmSubclass.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/HbmSubclass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/HbmSubclass.cs 2009-11-29 00:00:57 UTC (rev 4869) @@ -0,0 +1,117 @@ +namespace NHibernate.Cfg.MappingSchema +{ + public partial class HbmSubclass : AbstractDecoratable, IEntityMapping, IEntityDiscriminableMapping + { + #region Overrides of AbstractDecoratable + + protected override HbmMeta[] Metadatas + { + get { return meta ?? new HbmMeta[0]; } + } + + #endregion + + #region Implementation of IEntityMapping + + public string EntityName + { + get { return entityname; } + } + + public string Name + { + get { return name; } + } + + public string Node + { + get { return node; } + } + + public string Proxy + { + get { return proxy; } + } + + public bool? UseLazy + { + get { return lazySpecified ? lazy : (bool?)null; } + } + + public HbmTuplizer[] Tuplizers + { + get { return tuplizer ?? new HbmTuplizer[0]; } + } + + public bool DynamicUpdate + { + get { return dynamicupdate; } + } + + public bool DynamicInsert + { + get { return dynamicinsert; } + } + + public int? BatchSize + { + get { return !string.IsNullOrEmpty(batchsize) ? int.Parse(batchsize) : (int?)null; } + } + + public bool SelectBeforeUpdate + { + get { return selectbeforeupdate; } + } + + public string Persister + { + get { return persister; } + } + + public bool? IsAbstract + { + get { return abstractSpecified ? @abstract : (bool?)null; } + } + + public HbmSynchronize[] Synchronize + { + get { return synchronize ?? new HbmSynchronize[0]; } + } + + #endregion + + #region Implementation of IEntityDiscriminableMapping + + public string DiscriminatorValue + { + get { return discriminatorvalue; } + } + + #endregion + + #region Implementation of IEntitySqlsMapping + + public HbmLoader SqlLoader + { + get { return loader; } + } + + public HbmCustomSQL SqlInsert + { + get { return sqlinsert; } + } + + public HbmCustomSQL SqlUpdate + { + get { return sqlupdate; } + } + + public HbmCustomSQL SqlDelete + { + get { return sqldelete; } + } + + #endregion + + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/HbmUnionSubclass.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/HbmUnionSubclass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/HbmUnionSubclass.cs 2009-11-29 00:00:57 UTC (rev 4869) @@ -0,0 +1,108 @@ +namespace NHibernate.Cfg.MappingSchema +{ + public partial class HbmUnionSubclass : AbstractDecoratable, IEntityMapping + { + #region Overrides of AbstractDecoratable + + protected override HbmMeta[] Metadatas + { + get { return meta ?? new HbmMeta[0]; } + } + + #endregion + + #region Implementation of IEntityMapping + + public string EntityName + { + get { return entityname; } + } + + public string Name + { + get { return name; } + } + + public string Node + { + get { return node; } + } + + public string Proxy + { + get { return proxy; } + } + + public bool? UseLazy + { + get { return lazySpecified ? lazy : (bool?)null; } + } + + public HbmTuplizer[] Tuplizers + { + get { return tuplizer ?? new HbmTuplizer[0]; } + } + + public bool DynamicUpdate + { + get { return dynamicupdate; } + } + + public bool DynamicInsert + { + get { return dynamicinsert; } + } + + public int? BatchSize + { + get { return !string.IsNullOrEmpty(batchsize) ? int.Parse(batchsize) : (int?)null; } + } + + public bool SelectBeforeUpdate + { + get { return selectbeforeupdate; } + } + + public string Persister + { + get { return persister; } + } + + public bool? IsAbstract + { + get { return abstractSpecified ? @abstract : (bool?)null; } + } + + public HbmSynchronize[] Synchronize + { + get { return synchronize ?? new HbmSynchronize[0]; } + } + + #endregion + + #region Implementation of IEntitySqlsMapping + + public HbmLoader SqlLoader + { + get { return loader; } + } + + public HbmCustomSQL SqlInsert + { + get { return sqlinsert; } + } + + public HbmCustomSQL SqlUpdate + { + get { return sqlupdate; } + } + + public HbmCustomSQL SqlDelete + { + get { return sqldelete; } + } + + #endregion + + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/IEntityDiscriminableMapping.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/IEntityDiscriminableMapping.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/IEntityDiscriminableMapping.cs 2009-11-29 00:00:57 UTC (rev 4869) @@ -0,0 +1,7 @@ +namespace NHibernate.Cfg.MappingSchema +{ + public interface IEntityDiscriminableMapping + { + string DiscriminatorValue { get; } + } +} \ No newline at end of file Copied: trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/IEntityMapping.cs (from rev 4867, trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/IEntityMetadata.cs) =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/IEntityMapping.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/IEntityMapping.cs 2009-11-29 00:00:57 UTC (rev 4869) @@ -0,0 +1,19 @@ +namespace NHibernate.Cfg.MappingSchema +{ + public interface IEntityMapping : IDecoratable, IEntitySqlsMapping + { + string EntityName { get; } + string Name { get; } + string Node { get; } + string Proxy { get; } + bool? UseLazy { get; } + HbmTuplizer[] Tuplizers { get; } + bool DynamicUpdate { get; } + bool DynamicInsert { get; } + int? BatchSize { get; } + bool SelectBeforeUpdate { get; } + string Persister { get; } + bool? IsAbstract { get; } + HbmSynchronize[] Synchronize { get; } + } +} \ No newline at end of file Deleted: trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/IEntityMetadata.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/IEntityMetadata.cs 2009-11-28 21:09:24 UTC (rev 4868) +++ trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/IEntityMetadata.cs 2009-11-29 00:00:57 UTC (rev 4869) @@ -1,7 +0,0 @@ -namespace NHibernate.Cfg.MappingSchema -{ - public interface IEntityMetadata - { - - } -} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/IEntitySqlsMapping.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/IEntitySqlsMapping.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/IEntitySqlsMapping.cs 2009-11-29 00:00:57 UTC (rev 4869) @@ -0,0 +1,10 @@ +namespace NHibernate.Cfg.MappingSchema +{ + public interface IEntitySqlsMapping + { + HbmLoader SqlLoader { get; } + HbmCustomSQL SqlInsert { get; } + HbmCustomSQL SqlUpdate { get; } + HbmCustomSQL SqlDelete { get; } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs 2009-11-28 21:09:24 UTC (rev 4868) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs 2009-11-29 00:00:57 UTC (rev 4869) @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Linq; using System.Text; using System.Xml; using NHibernate.Cfg.MappingSchema; @@ -96,13 +97,13 @@ model.AddJoin(join); } else if ("subclass".Equals(name)) - new SubclassBinder(this).HandleSubclass(model, subnode, inheritedMetas); + new SubclassBinder(this).HandleSubclass(model, subnode, Deserialize<HbmSubclass>(subnode) , inheritedMetas); else if ("joined-subclass".Equals(name)) - new JoinedSubclassBinder(this).HandleJoinedSubclass(model, subnode, inheritedMetas); + new JoinedSubclassBinder(this).HandleJoinedSubclass(model, subnode, Deserialize<HbmJoinedSubclass>(subnode), inheritedMetas); else if ("union-subclass".Equals(name)) - new UnionSubclassBinder(this).HandleUnionSubclass(model, subnode, inheritedMetas); + new UnionSubclassBinder(this).HandleUnionSubclass(model, subnode, Deserialize<HbmUnionSubclass>(subnode), inheritedMetas); else if ("filter".Equals(name)) ParseFilter(subnode, model); @@ -137,18 +138,15 @@ } } - protected void BindClass(XmlNode node, IDecoratable classMapping, PersistentClass model, IDictionary<string, MetaAttribute> inheritedMetas) + protected void BindClass(IEntityMapping classMapping, PersistentClass model, IDictionary<string, MetaAttribute> inheritedMetas) { - // transfer an explicitly defined entity name // handle the lazy attribute - XmlAttribute lazyNode = node.Attributes["lazy"]; - bool lazy = lazyNode == null ? mappings.DefaultLazy : "true".Equals(lazyNode.Value); // go ahead and set the lazy here, since pojo.proxy can override it. - model.IsLazy = lazy; + model.IsLazy = classMapping.UseLazy.HasValue ? classMapping.UseLazy.Value : mappings.DefaultLazy; - string entityName = (node.Attributes["entity-name"] != null ? node.Attributes["entity-name"].Value : null) - ?? - ClassForNameChecked(node.Attributes["name"].Value, mappings, "persistent class {0} not found"). + // transfer an explicitly defined entity name + string entityName = classMapping.EntityName ?? + ClassForNameChecked(classMapping.Name, mappings, "persistent class {0} not found"). FullName; if (entityName == null) { @@ -156,26 +154,24 @@ } model.EntityName = entityName; - BindPocoRepresentation(node, model); - BindXmlRepresentation(node, model); - BindMapRepresentation(node, model); + BindPocoRepresentation(classMapping, model); + BindXmlRepresentation(classMapping, model); + BindMapRepresentation(classMapping, model); - BindPersistentClassCommonValues(node, classMapping, model, inheritedMetas); + BindPersistentClassCommonValues(classMapping, model, inheritedMetas); } - private void BindPersistentClassCommonValues(XmlNode node, IDecoratable classMapping, PersistentClass model, IDictionary<string, MetaAttribute> inheritedMetas) + private void BindPersistentClassCommonValues(IEntityMapping classMapping, PersistentClass model, IDictionary<string, MetaAttribute> inheritedMetas) { // DISCRIMINATOR - XmlAttribute discriminatorNode = node.Attributes["discriminator-value"]; - model.DiscriminatorValue = (discriminatorNode == null) ? model.EntityName : discriminatorNode.Value; + var discriminable = classMapping as IEntityDiscriminableMapping; + model.DiscriminatorValue = (discriminable == null || string.IsNullOrEmpty(discriminable.DiscriminatorValue)) ? model.EntityName : discriminable.DiscriminatorValue; // DYNAMIC UPDATE - XmlAttribute dynamicNode = node.Attributes["dynamic-update"]; - model.DynamicUpdate = (dynamicNode == null) ? false : "true".Equals(dynamicNode.Value); + model.DynamicUpdate = classMapping.DynamicUpdate; // DYNAMIC INSERT - XmlAttribute insertNode = node.Attributes["dynamic-insert"]; - model.DynamicInsert = (insertNode == null) ? false : "true".Equals(insertNode.Value); + model.DynamicInsert = classMapping.DynamicInsert; // IMPORT // For entities, the EntityName is the key to find a persister @@ -187,102 +183,81 @@ mappings.AddImport(qualifiedName, StringHelper.Unqualify(model.EntityName)); // BATCH SIZE - XmlAttribute batchNode = node.Attributes["batch-size"]; - if (batchNode != null) - model.BatchSize = int.Parse(batchNode.Value); + if (classMapping.BatchSize.HasValue) + model.BatchSize = classMapping.BatchSize.Value; // SELECT BEFORE UPDATE - XmlAttribute sbuNode = node.Attributes["select-before-update"]; - if (sbuNode != null) - model.SelectBeforeUpdate = "true".Equals(sbuNode.Value); + model.SelectBeforeUpdate = classMapping.SelectBeforeUpdate;; - // OPTIMISTIC LOCK MODE - XmlAttribute olNode = node.Attributes["optimistic-lock"]; - model.OptimisticLockMode = GetOptimisticLockMode(olNode); + // OPTIMISTIC LOCK MODE (hack) + var hbmClass = classMapping as HbmClass; + if(hbmClass != null) + { + model.OptimisticLockMode = hbmClass.optimisticlock.ToOptimisticLock(); + } // META ATTRIBUTES - model.MetaAttributes = classMapping != null - ? GetMetas(classMapping, inheritedMetas) - : GetMetas(node.SelectNodes(HbmConstants.nsMeta, namespaceManager), inheritedMetas); + model.MetaAttributes = GetMetas(classMapping, inheritedMetas); // PERSISTER - XmlAttribute persisterNode = node.Attributes["persister"]; - if (persisterNode == null) - { - //persister = typeof( EntityPersister ); - } - else - model.EntityPersisterClass = ClassForNameChecked(persisterNode.Value, mappings, + if(!string.IsNullOrEmpty(classMapping.Persister)) + model.EntityPersisterClass = ClassForNameChecked(classMapping.Persister, mappings, "could not instantiate persister class: {0}"); // CUSTOM SQL - HandleCustomSQL(node, model); + HandleCustomSQL(classMapping, model); - foreach (XmlNode syncNode in node.SelectNodes(HbmConstants.nsSynchronize, namespaceManager)) - model.AddSynchronizedTable(XmlHelper.GetAttributeValue(syncNode, "table")); - - bool? isAbstract = null; - XmlAttribute abstractNode = node.Attributes["abstract"]; - if (abstractNode != null) + foreach (var synchronize in classMapping.Synchronize) { - if ("true".Equals(abstractNode.Value) || "1".Equals(abstractNode.Value)) - isAbstract = true; - else if ("false".Equals(abstractNode.Value) || "0".Equals(abstractNode.Value)) - isAbstract = false; + model.AddSynchronizedTable(synchronize.table); } - model.IsAbstract = isAbstract; + + model.IsAbstract = classMapping.IsAbstract; } - private void BindMapRepresentation(XmlNode node, PersistentClass entity) + private void BindMapRepresentation(IEntityMapping classMapping, PersistentClass entity) { - XmlNode tuplizer = LocateTuplizerDefinition(node, EntityMode.Map); + HbmTuplizer tuplizer = classMapping.Tuplizers.FirstOrDefault(tp => tp.entitymode == HbmTuplizerEntitymode.DynamicMap); if (tuplizer != null) { - string tupClassName = FullQualifiedClassName(tuplizer.Attributes["class"].Value, mappings); + string tupClassName = FullQualifiedClassName(tuplizer.@class, mappings); entity.AddTuplizer(EntityMode.Map, tupClassName); } } - private void BindXmlRepresentation(XmlNode node, PersistentClass entity) + private void BindXmlRepresentation(IEntityMapping classMapping, PersistentClass entity) { - string nodeName = null; - XmlAttribute nodeAtt = node.Attributes["node"]; - if(nodeAtt != null) - nodeName = nodeAtt.Value; - if (nodeName == null) - nodeName = StringHelper.Unqualify(entity.EntityName); - entity.NodeName = nodeName; + entity.NodeName = string.IsNullOrEmpty(classMapping.Node) ? StringHelper.Unqualify(entity.EntityName): classMapping.Node; - XmlNode tuplizer = LocateTuplizerDefinition(node, EntityMode.Xml); + HbmTuplizer tuplizer = classMapping.Tuplizers.FirstOrDefault(tp => tp.entitymode == HbmTuplizerEntitymode.Xml); if (tuplizer != null) { - string tupClassName = FullQualifiedClassName(tuplizer.Attributes["class"].Value, mappings); + string tupClassName = FullQualifiedClassName(tuplizer.@class, mappings); entity.AddTuplizer(EntityMode.Xml, tupClassName); } } - private void BindPocoRepresentation(XmlNode node, PersistentClass entity) + private void BindPocoRepresentation(IEntityMapping classMapping, PersistentClass entity) { - string className = node.Attributes["name"] == null + string className = classMapping.Name == null ? null - : ClassForNameChecked(node.Attributes["name"].Value, mappings, "persistent class {0} not found"). + : ClassForNameChecked(classMapping.Name, mappings, "persistent class {0} not found"). AssemblyQualifiedName; entity.ClassName = className; - XmlAttribute proxyNode = node.Attributes["proxy"]; - if (proxyNode != null) + if (!string.IsNullOrEmpty(classMapping.Proxy)) { - entity.ProxyInterfaceName = ClassForNameChecked(proxyNode.Value, mappings, "proxy class not found: {0}").AssemblyQualifiedName; + entity.ProxyInterfaceName = ClassForNameChecked(classMapping.Proxy, mappings, "proxy class not found: {0}").AssemblyQualifiedName; entity.IsLazy = true; } else if (entity.IsLazy) entity.ProxyInterfaceName = className; - XmlNode tuplizer = LocateTuplizerDefinition(node, EntityMode.Poco); + HbmTuplizer tuplizer = classMapping.Tuplizers.FirstOrDefault(tp=> tp.entitymode == HbmTuplizerEntitymode.Poco); if (tuplizer != null) { - string tupClassName = FullQualifiedClassName(tuplizer.Attributes["class"].Value, mappings); + string tupClassName = FullQualifiedClassName(tuplizer.@class, mappings); entity.AddTuplizer(EntityMode.Poco, tupClassName); } } @@ -313,7 +288,8 @@ XmlAttribute actionNode = node.Attributes["schema-action"]; string action = actionNode == null ? "all" : actionNode.Value; - Table table = mappings.AddTable(schema, catalog, GetClassTableName(persistentClass, node), null, false, action); + string tableName = node.Attributes["table"] != null ? node.Attributes["table"].Value : null; + Table table = mappings.AddTable(schema, catalog, GetClassTableName(persistentClass, tableName), null, false, action); join.Table = table; XmlAttribute fetchNode = node.Attributes["fetch"]; @@ -401,33 +377,31 @@ HandleCustomSQL(node, join); } - private void HandleCustomSQL(XmlNode node, PersistentClass model) + private void HandleCustomSQL(IEntitySqlsMapping sqlsMapping, PersistentClass model) { - XmlNode element = node.SelectSingleNode(HbmConstants.nsSqlInsert, namespaceManager); - - if (element != null) + var sqlInsert = sqlsMapping.SqlInsert; + if (sqlInsert != null) { - bool callable = IsCallable(element); - model.SetCustomSQLInsert(element.InnerText.Trim(), callable, GetResultCheckStyle(element, callable)); + bool callable = sqlInsert.callableSpecified && sqlInsert.callable; + model.SetCustomSQLInsert(sqlInsert.Text.LinesToString(), callable, GetResultCheckStyle(sqlInsert)); } - element = node.SelectSingleNode(HbmConstants.nsSqlDelete, namespaceManager); - if (element != null) + var sqlDelete = sqlsMapping.SqlDelete; + if (sqlDelete != null) { - bool callable = IsCallable(element); - model.SetCustomSQLDelete(element.InnerText.Trim(), callable, GetResultCheckStyle(element, callable)); + bool callable = sqlDelete.callableSpecified && sqlDelete.callable; + model.SetCustomSQLDelete(sqlDelete.Text.LinesToString(), callable, GetResultCheckStyle(sqlDelete)); } - element = node.SelectSingleNode(HbmConstants.nsSqlUpdate, namespaceManager); - if (element != null) + var sqlUpdate = sqlsMapping.SqlUpdate; + if (sqlUpdate != null) { - bool callable = IsCallable(element); - model.SetCustomSQLUpdate(element.InnerText.Trim(), callable, GetResultCheckStyle(element, callable)); + bool callable = sqlUpdate.callableSpecified && sqlUpdate.callable; + model.SetCustomSQLUpdate(sqlUpdate.Text.LinesToString(), callable, GetResultCheckStyle(sqlUpdate)); } - element = node.SelectSingleNode(HbmConstants.nsLoader, namespaceManager); - if (element != null) - model.LoaderName = XmlHelper.GetAttributeValue(element, "query-ref"); + if (sqlsMapping.SqlLoader != null) + model.LoaderName = sqlsMapping.SqlLoader.queryref; } private void HandleCustomSQL(XmlNode node, Join model) @@ -494,13 +468,11 @@ return superModel; } - protected string GetClassTableName(PersistentClass model, XmlNode node) + protected string GetClassTableName(PersistentClass model, string mappedTableName) { - XmlAttribute tableNameNode = node.Attributes["table"]; - if (tableNameNode == null) - return mappings.NamingStrategy.ClassToTableName(model.EntityName); - else - return mappings.NamingStrategy.TableName(tableNameNode.Value); + return string.IsNullOrEmpty(mappedTableName) + ? mappings.NamingStrategy.ClassToTableName(model.EntityName) + : mappings.NamingStrategy.TableName(mappedTableName); } protected void MakeIdentifier(XmlNode node, SimpleValue model) @@ -1004,6 +976,31 @@ return ExecuteUpdateResultCheckStyle.Parse(attr.Value); } + protected static ExecuteUpdateResultCheckStyle GetResultCheckStyle(HbmCustomSQL customSQL) + { + if (customSQL != null) + { + if (!customSQL.checkSpecified) + { + return ExecuteUpdateResultCheckStyle.Count; + } + else + { + switch (customSQL.check) + { + case HbmCustomSQLCheck.None: + return ExecuteUpdateResultCheckStyle.None; + break; + case HbmCustomSQLCheck.Rowcount: + return ExecuteUpdateResultCheckStyle.Count; + case HbmCustomSQLCheck.Param: + return null; // not supported + } + } + } + return null; + } + protected void ParseFilter(XmlNode filterElement, IFilterable filterable) { string name = GetPropertyName(filterElement); Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/JoinedSubclassBinder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/JoinedSubclassBinder.cs 2009-11-28 21:09:24 UTC (rev 4868) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/JoinedSubclassBinder.cs 2009-11-29 00:00:57 UTC (rev 4869) @@ -1,5 +1,5 @@ using System.Xml; - +using NHibernate.Cfg.MappingSchema; using NHibernate.Mapping; using NHibernate.Persister.Entity; using System.Collections.Generic; @@ -18,32 +18,32 @@ { } - public void Bind(XmlNode node, IDictionary<string, MetaAttribute> inheritedMetas) + public void Bind(XmlNode node, HbmJoinedSubclass joinedSubclassMapping, IDictionary<string, MetaAttribute> inheritedMetas) { PersistentClass superModel = GetSuperclass(node); - HandleJoinedSubclass(superModel, node, inheritedMetas); + HandleJoinedSubclass(superModel, node, joinedSubclassMapping, inheritedMetas); } - public void HandleJoinedSubclass(PersistentClass model, XmlNode subnode, IDictionary<string, MetaAttribute> inheritedMetas) + public void HandleJoinedSubclass(PersistentClass model, XmlNode subnode, HbmJoinedSubclass joinedSubclassMapping, IDictionary<string, MetaAttribute> inheritedMetas) { JoinedSubclass subclass = new JoinedSubclass(model); - BindClass(subnode, null, subclass, inheritedMetas); - inheritedMetas = GetMetas(subnode.SelectNodes(HbmConstants.nsMeta, namespaceManager), inheritedMetas, true); // get meta's from <joined-subclass> + BindClass(joinedSubclassMapping, subclass, inheritedMetas); + inheritedMetas = GetMetas(joinedSubclassMapping, inheritedMetas, true); // get meta's from <joined-subclass> + // joined subclass if (subclass.EntityPersisterClass == null) subclass.RootClazz.EntityPersisterClass = typeof(JoinedSubclassEntityPersister); //table + schema names - XmlAttribute schemaNode = subnode.Attributes["schema"]; - string schema = schemaNode == null ? mappings.SchemaName : schemaNode.Value; - XmlAttribute catalogNode = subnode.Attributes["catalog"]; - string catalog = catalogNode == null ? mappings.CatalogName : catalogNode.Value; + string schema = joinedSubclassMapping.schema ?? mappings.SchemaName; + string catalog = joinedSubclassMapping.catalog ?? mappings.CatalogName; + // TODO: very strange, the schema does not support it XmlAttribute actionNode = subnode.Attributes["schema-action"]; string action = actionNode == null ? "all" : actionNode.Value; - - Table mytable = mappings.AddTable(schema, catalog, GetClassTableName(subclass, subnode), null, false, action); + + Table mytable = mappings.AddTable(schema, catalog, GetClassTableName(subclass, joinedSubclassMapping.table), null, false, action); ((ITableOwner)subclass).Table = mytable; log.InfoFormat("Mapping joined-subclass: {0} -> {1}", subclass.EntityName, subclass.Table.Name); @@ -64,11 +64,8 @@ subclass.Table.Name + ", the same table as its base class."); subclass.CreateForeignKey(); - // CHECK - XmlAttribute chNode = subnode.Attributes["check"]; - if (chNode != null) - mytable.AddCheckConstraint(chNode.Value); + mytable.AddCheckConstraint(joinedSubclassMapping.check); // properties PropertiesFromXML(subnode, subclass, inheritedMetas); Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/MappingRootBinder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/MappingRootBinder.cs 2009-11-28 21:09:24 UTC (rev 4868) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/MappingRootBinder.cs 2009-11-29 00:00:57 UTC (rev 4869) @@ -100,7 +100,7 @@ { var binder = new UnionSubclassBinder(this, GetNamespaceManager(parentNode), dialect); - binder.Bind(parentNode, inheritedMetas); + binder.Bind(parentNode, unionSubclass, inheritedMetas); } private void AddJoinedSubclasses(XmlNode parentNode, HbmJoinedSubclass joinedSubclass, @@ -108,14 +108,14 @@ { var binder = new JoinedSubclassBinder(this, GetNamespaceManager(parentNode), dialect); - binder.Bind(parentNode, inheritedMetas); + binder.Bind(parentNode, joinedSubclass, inheritedMetas); } private void AddSubclasses(XmlNode parentNode, HbmSubclass subClass, IDictionary<string, MetaAttribute> inheritedMetas) { var binder = new SubclassBinder(this, GetNamespaceManager(parentNode), dialect); - binder.Bind(parentNode, inheritedMetas); + binder.Bind(parentNode, subClass, inheritedMetas); } private void AddQueries(HbmMapping mappingSchema) Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/RootClassBinder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/RootClassBinder.cs 2009-11-28 21:09:24 UTC (rev 4868) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/RootClassBinder.cs 2009-11-29 00:00:57 UTC (rev 4869) @@ -16,7 +16,7 @@ public void Bind(XmlNode node, HbmClass classSchema, IDictionary<string, MetaAttribute> inheritedMetas) { RootClass rootClass = new RootClass(); - BindClass(node, classSchema, rootClass, inheritedMetas); + BindClass(classSchema, rootClass, inheritedMetas); inheritedMetas = GetMetas(classSchema, inheritedMetas, true); // get meta's from <class> //TABLENAME Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/SubclassBinder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/SubclassBinder.cs 2009-11-28 21:09:24 UTC (rev 4868) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/SubclassBinder.cs 2009-11-29 00:00:57 UTC (rev 4869) @@ -1,6 +1,6 @@ using System.Collections.Generic; using System.Xml; - +using NHibernate.Cfg.MappingSchema; using NHibernate.Mapping; using NHibernate.Persister.Entity; @@ -18,20 +18,19 @@ { } - public void Bind(XmlNode node, IDictionary<string, MetaAttribute> inheritedMetas) + public void Bind(XmlNode node, HbmSubclass subClassMapping, IDictionary<string, MetaAttribute> inheritedMetas) { PersistentClass superModel = GetSuperclass(node); - HandleSubclass(superModel, node, inheritedMetas); + HandleSubclass(superModel, node, subClassMapping, inheritedMetas); } - public void HandleSubclass(PersistentClass model, XmlNode subnode, IDictionary<string, MetaAttribute> inheritedMetas) + public void HandleSubclass(PersistentClass model, XmlNode subnode, HbmSubclass subClassMapping, IDictionary<string, MetaAttribute> inheritedMetas) { Subclass subclass = new SingleTableSubclass(model); - BindClass(subnode, null, subclass, inheritedMetas); + BindClass(subClassMapping, subclass, inheritedMetas); + inheritedMetas = GetMetas(subClassMapping, inheritedMetas, true); // get meta's from <subclass> - inheritedMetas = GetMetas(subnode.SelectNodes(HbmConstants.nsMeta, namespaceManager), inheritedMetas, true); // get meta's from <subclass> - if (subclass.EntityPersisterClass == null) subclass.RootClazz.EntityPersisterClass = typeof(SingleTableEntityPersister); Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/UnionSubclassBinder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/UnionSubclassBinder.cs 2009-11-28 21:09:24 UTC (rev 4868) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/UnionSubclassBinder.cs 2009-11-29 00:00:57 UTC (rev 4869) @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Xml; +using NHibernate.Cfg.MappingSchema; using NHibernate.Mapping; using NHibernate.Persister.Entity; @@ -17,32 +18,30 @@ { } - public void Bind(XmlNode node, IDictionary<string, MetaAttribute> inheritedMetas) + public void Bind(XmlNode node, HbmUnionSubclass unionSubclassMapping, IDictionary<string, MetaAttribute> inheritedMetas) { PersistentClass superModel = GetSuperclass(node); - HandleUnionSubclass(superModel, node, inheritedMetas); + HandleUnionSubclass(superModel, node, unionSubclassMapping, inheritedMetas); } - public void HandleUnionSubclass(PersistentClass model, XmlNode subnode, IDictionary<string, MetaAttribute> inheritedMetas) + public void HandleUnionSubclass(PersistentClass model, XmlNode subnode, HbmUnionSubclass unionSubclassMapping, IDictionary<string, MetaAttribute> inheritedMetas) { var unionSubclass = new UnionSubclass(model); - BindClass(subnode, null, unionSubclass, inheritedMetas); - inheritedMetas = GetMetas(subnode.SelectNodes(HbmConstants.nsMeta, namespaceManager), inheritedMetas, true); // get meta's from <union-subclass> + BindClass(unionSubclassMapping, unionSubclass, inheritedMetas); + inheritedMetas = GetMetas(unionSubclassMapping, inheritedMetas, true); // get meta's from <union-subclass> // union subclass if (unionSubclass.EntityPersisterClass == null) unionSubclass.RootClazz.EntityPersisterClass = typeof(UnionSubclassEntityPersister); //table + schema names - XmlAttribute schemaNode = subnode.Attributes["schema"]; - string schema = schemaNode == null ? mappings.SchemaName : schemaNode.Value; - XmlAttribute catalogNode = subnode.Attributes["catalog"]; - string catalog = catalogNode == null ? mappings.CatalogName : catalogNode.Value; + string schema = unionSubclassMapping.schema ?? mappings.SchemaName; + string catalog = unionSubclassMapping.catalog ?? mappings.CatalogName; Table denormalizedSuperTable = unionSubclass.Superclass.Table; Table mytable = - mappings.AddDenormalizedTable(schema, catalog, GetClassTableName(unionSubclass, subnode), + mappings.AddDenormalizedTable(schema, catalog, GetClassTableName(unionSubclass, unionSubclassMapping.table), unionSubclass.IsAbstract.GetValueOrDefault(), null, denormalizedSuperTable); ((ITableOwner)unionSubclass).Table = mytable; Modified: trunk/nhibernate/src/NHibernate/Mapping/Table.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/Table.cs 2009-11-28 21:09:24 UTC (rev 4868) +++ trunk/nhibernate/src/NHibernate/Mapping/Table.cs 2009-11-29 00:00:57 UTC (rev 4869) @@ -832,7 +832,10 @@ /// <param name="constraint"></param> public void AddCheckConstraint(string constraint) { - checkConstraints.Add(constraint); + if (!string.IsNullOrEmpty(constraint)) + { + checkConstraints.Add(constraint); + } } internal void SetHasDenormalizedTables() Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-11-28 21:09:24 UTC (rev 4868) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-11-29 00:00:57 UTC (rev 4869) @@ -495,7 +495,13 @@ <Compile Include="Cfg\Loquacious\MappingsConfiguration.cs" /> <Compile Include="Cfg\Loquacious\ProxyConfiguration.cs" /> <Compile Include="Cfg\MappingSchema\HbmDefinition.cs" /> - <Compile Include="Cfg\MappingSchema\IEntityMetadata.cs" /> + <Compile Include="Cfg\MappingSchema\HbmExtensions.cs" /> + <Compile Include="Cfg\MappingSchema\HbmJoinedSubclass.cs" /> + <Compile Include="Cfg\MappingSchema\HbmSubclass.cs" /> + <Compile Include="Cfg\MappingSchema\HbmUnionSubclass.cs" /> + <Compile Include="Cfg\MappingSchema\IEntityDiscriminableMapping.cs" /> + <Compile Include="Cfg\MappingSchema\IEntityMapping.cs" /> + <Compile Include="Cfg\MappingSchema\IEntitySqlsMapping.cs" /> <Compile Include="Cfg\SchemaAutoAction.cs" /> <Compile Include="Cfg\SessionFactoryConfigurationBase.cs" /> <Compile Include="Cfg\ISessionFactoryConfiguration.cs" /> Modified: trunk/nhibernate/src/NHibernate/Util/StringHelper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Util/StringHelper.cs 2009-11-28 21:09:24 UTC (rev 4868) +++ trunk/nhibernate/src/NHibernate/Util/StringHelper.cs 2009-11-29 00:00:57 UTC (rev 4869) @@ -6,13 +6,8 @@ namespace NHibernate.Util { /// <summary></summary> - public sealed class StringHelper + public static class StringHelper { - private StringHelper() - { - // not creatable - } - public const string WhiteSpace = " \n\r\f\t"; /// <summary></summary> @@ -394,6 +389,21 @@ return buf.Append(NullSafeToString(array[len - 1])).ToString(); } + public static string LinesToString(this string[] text) + { + if(text == null) + { + return null; + } + if(text.Length == 1) + { + return text[0]; + } + var sb = new StringBuilder(200); + Array.ForEach(text, t => sb.AppendLine(t)); + return sb.ToString(); + } + /// <summary> /// /// </summary> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |