From: <fab...@us...> - 2009-11-28 14:04:51
|
Revision: 4867 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4867&view=rev Author: fabiomaulo Date: 2009-11-28 14:04:43 +0000 (Sat, 28 Nov 2009) Log Message: ----------- - Binders refactoring - new advanced feature : see Configuration.AddDeserializedMapping Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/ClassExtractor.cs trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/Binder.cs trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/CollectionBinder.cs trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/MappingRootBinder.cs Modified: trunk/nhibernate/src/NHibernate/Cfg/ClassExtractor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/ClassExtractor.cs 2009-11-28 13:15:02 UTC (rev 4866) +++ trunk/nhibernate/src/NHibernate/Cfg/ClassExtractor.cs 2009-11-28 14:04:43 UTC (rev 4867) @@ -1,4 +1,5 @@ using System.Xml; +using NHibernate.Cfg.XmlHbmBinding; using NHibernate.Util; using System.Collections.Generic; using Iesi.Collections.Generic; @@ -92,7 +93,7 @@ // TODO this should be extracted into a utility method since there's similar // code in Configuration XmlNamespaceManager nsmgr = new XmlNamespaceManager(document.NameTable); - nsmgr.AddNamespace(HbmConstants.nsPrefix, Configuration.MappingSchemaXMLNS); + nsmgr.AddNamespace(HbmConstants.nsPrefix, Binder.MappingSchemaXMLNS); // Since the document is validated, no error checking is done in this method. HashedSet<ClassEntry> classEntries = new HashedSet<ClassEntry>(); Modified: trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2009-11-28 13:15:02 UTC (rev 4866) +++ trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2009-11-28 14:04:43 UTC (rev 4867) @@ -51,9 +51,6 @@ [Serializable] public class Configuration:ISerializable { - /// <summary>The XML Namespace for the nhibernate-mapping</summary> - public const string MappingSchemaXMLNS = "urn:nhibernate-mapping-2.2"; - /// <summary>Default name for hibernate configuration file.</summary> public const string DefaultHibernateCfgFileName = "hibernate.cfg.xml"; @@ -497,36 +494,52 @@ /// <param name="doc">The NamedXmlDocument that contains the <b>validated</b> mapping XML file.</param> private void AddValidatedDocument(NamedXmlDocument doc) { + HbmMapping mappingMeta = null; try { - // note that the prefix has absolutely nothing to do with what the user - // selects as their prefix in the document. It is the prefix we use to - // build the XPath and the nsmgr takes care of translating our prefix into - // the user defined prefix... - var namespaceManager = new XmlNamespaceManager(doc.Document.NameTable); - namespaceManager.AddNamespace(HbmConstants.nsPrefix, MappingSchemaXMLNS); - - Dialect.Dialect dialect = Dialect.Dialect.GetDialect(properties); - Mappings mappings = CreateMappings(dialect); - // TODO : The mappingMeta should be the property of NamedXmlDocument // A validated document IS a deserialized doc and we don't need to deserialize it more than one time. - HbmMapping mappingMeta; using (var reader = new StringReader(doc.Document.DocumentElement.OuterXml)) { - mappingMeta= (HbmMapping) new XmlSerializer(typeof (HbmMapping)).Deserialize(reader); + mappingMeta = (HbmMapping) new XmlSerializer(typeof (HbmMapping)).Deserialize(reader); } - - new MappingRootBinder(mappings, namespaceManager, dialect).Bind(mappingMeta); } catch (Exception e) { string nameFormatted = doc.Name ?? "(unknown)"; LogAndThrow(new MappingException("Could not compile the mapping document: " + nameFormatted, e)); } + AddDeserializedMapping(mappingMeta, doc.Name); } /// <summary> + /// Add mapping data using deserialized class. + /// </summary> + /// <param name="mappingDocument">Mapping metadata.</param> + /// <param name="documentFileName">XML file's name where available; otherwise null.</param> + public void AddDeserializedMapping(HbmMapping mappingDocument, string documentFileName) + { + if (mappingDocument == null) + { + throw new ArgumentNullException("mappingDocument"); + } + try + { + Dialect.Dialect dialect = Dialect.Dialect.GetDialect(properties); + Mappings mappings = CreateMappings(dialect); + + new MappingRootBinder(mappings, dialect).Bind(mappingDocument); + } + catch (Exception e) + { + var message = documentFileName == null + ? "Could not compile deserialized mapping document." + : "Could not compile the mapping document: " + documentFileName; + LogAndThrow(new MappingException(message, e)); + } + } + + /// <summary> /// Create a new <see cref="Mappings" /> to add classes and collection /// mappings to. /// </summary> Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/Binder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/Binder.cs 2009-11-28 13:15:02 UTC (rev 4866) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/Binder.cs 2009-11-28 14:04:43 UTC (rev 4867) @@ -15,6 +15,9 @@ { public abstract class Binder { + /// <summary>The XML Namespace for the nhibernate-mapping</summary> + public const string MappingSchemaXMLNS = "urn:nhibernate-mapping-2.2"; + protected static readonly ILog log = LogManager.GetLogger(typeof (Binder)); protected static readonly IDictionary<string, MetaAttribute> EmptyMeta = @@ -155,6 +158,13 @@ { var hbmDocument = new XmlDocument(); hbmDocument.Load(reader); + // note that the prefix has absolutely nothing to do with what the user + // selects as their prefix in the document. It is the prefix we use to + // build the XPath and the nsmgr takes care of translating our prefix into + // the user defined prefix... + var namespaceManager = new XmlNamespaceManager(hbmDocument.NameTable); + namespaceManager.AddNamespace(HbmConstants.nsPrefix, MappingSchemaXMLNS); + return hbmDocument.DocumentElement; } } Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs 2009-11-28 13:15:02 UTC (rev 4866) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs 2009-11-28 14:04:43 UTC (rev 4867) @@ -44,7 +44,7 @@ foreach (XmlNode subnode in node.ChildNodes) { //I am only concerned with elements that are from the nhibernate namespace - if (subnode.NamespaceURI != Configuration.MappingSchemaXMLNS) + if (subnode.NamespaceURI != MappingSchemaXMLNS) continue; string name = subnode.LocalName; //.Name; @@ -346,7 +346,7 @@ foreach (XmlNode subnode in node.ChildNodes) { //I am only concerned with elements that are from the nhibernate namespace - if (subnode.NamespaceURI != Configuration.MappingSchemaXMLNS) + if (subnode.NamespaceURI != MappingSchemaXMLNS) continue; string name = subnode.Name; @@ -593,7 +593,7 @@ foreach (XmlNode subnode in node.ChildNodes) { //I am only concerned with elements that are from the nhibernate namespace - if (subnode.NamespaceURI != Configuration.MappingSchemaXMLNS) + if (subnode.NamespaceURI != MappingSchemaXMLNS) continue; string name = subnode.LocalName; //.Name; Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/CollectionBinder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/CollectionBinder.cs 2009-11-28 13:15:02 UTC (rev 4866) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/CollectionBinder.cs 2009-11-28 14:04:43 UTC (rev 4867) @@ -299,7 +299,7 @@ string name = subnode.LocalName; //.Name; //I am only concerned with elements that are from the nhibernate namespace - if (subnode.NamespaceURI != Configuration.MappingSchemaXMLNS) + if (subnode.NamespaceURI != MappingSchemaXMLNS) continue; switch (name) @@ -500,7 +500,7 @@ foreach (XmlNode subnode in node.ChildNodes) { //I am only concerned with elements that are from the nhibernate namespace - if (subnode.NamespaceURI != Configuration.MappingSchemaXMLNS) + if (subnode.NamespaceURI != MappingSchemaXMLNS) continue; string name = subnode.LocalName; //.Name; @@ -563,7 +563,7 @@ foreach (XmlNode subnode in node.ChildNodes) { //I am only concerned with elements that are from the nhibernate namespace - if (subnode.NamespaceURI != Configuration.MappingSchemaXMLNS) + if (subnode.NamespaceURI != MappingSchemaXMLNS) continue; string name = subnode.LocalName; //.Name; Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/MappingRootBinder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/MappingRootBinder.cs 2009-11-28 13:15:02 UTC (rev 4866) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/MappingRootBinder.cs 2009-11-28 14:04:43 UTC (rev 4867) @@ -10,12 +10,10 @@ public class MappingRootBinder : Binder { private readonly Dialect.Dialect dialect; - private readonly XmlNamespaceManager namespaceManager; - public MappingRootBinder(Mappings mappings, XmlNamespaceManager namespaceManager, Dialect.Dialect dialect) + public MappingRootBinder(Mappings mappings, Dialect.Dialect dialect) : base(mappings) { - this.namespaceManager = namespaceManager; this.dialect = dialect; } @@ -81,15 +79,26 @@ private void AddRootClasses(XmlNode parentNode, HbmClass rootClass, IDictionary<string, MetaAttribute> inheritedMetas) { - var binder = new RootClassBinder(this, namespaceManager, dialect); + var binder = new RootClassBinder(this, GetNamespaceManager(parentNode), dialect); binder.Bind(parentNode, rootClass, inheritedMetas); } + private XmlNamespaceManager GetNamespaceManager(XmlNode parentNode) + { + // note that the prefix has absolutely nothing to do with what the user + // selects as their prefix in the document. It is the prefix we use to + // build the XPath and the nsmgr takes care of translating our prefix into + // the user defined prefix... + var namespaceManager = new XmlNamespaceManager(parentNode.OwnerDocument.NameTable); + namespaceManager.AddNamespace(HbmConstants.nsPrefix, MappingSchemaXMLNS); + return namespaceManager; + } + private void AddUnionSubclasses(XmlNode parentNode, HbmUnionSubclass unionSubclass, IDictionary<string, MetaAttribute> inheritedMetas) { - var binder = new UnionSubclassBinder(this, namespaceManager, dialect); + var binder = new UnionSubclassBinder(this, GetNamespaceManager(parentNode), dialect); binder.Bind(parentNode, inheritedMetas); } @@ -97,14 +106,14 @@ private void AddJoinedSubclasses(XmlNode parentNode, HbmJoinedSubclass joinedSubclass, IDictionary<string, MetaAttribute> inheritedMetas) { - var binder = new JoinedSubclassBinder(this, namespaceManager, dialect); + var binder = new JoinedSubclassBinder(this, GetNamespaceManager(parentNode), dialect); binder.Bind(parentNode, inheritedMetas); } private void AddSubclasses(XmlNode parentNode, HbmSubclass subClass, IDictionary<string, MetaAttribute> inheritedMetas) { - var binder = new SubclassBinder(this, namespaceManager, dialect); + var binder = new SubclassBinder(this, GetNamespaceManager(parentNode), dialect); binder.Bind(parentNode, inheritedMetas); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |