public virtual void VerifyClassMap(IClassMap classMap) { bool failedSorting = false; IClassMap superClassMap = null; if (classMap.Name.Length < 1) { HandleVerifyException(classMap, "Class name must not be empty!", "Name"); // do not localize } if (classMap.ClassType == ClassType.Class || classMap.ClassType == ClassType.Default) { superClassMap = classMap.GetInheritedClassMap(); if (superClassMap != null) { if (!(classMap.IsLegalAsSuperClass(superClassMap))) { HandleVerifyException(classMap, "Inherited class '" + superClassMap.Name + "' is illegal as superclass for this class! Creates cyclic inheritance graph, which is a very serious error, potentially leading to infinite loops! No more verification of this class or its properties will be made until this error is corrected! (" + GetClassType(classMap) + ": '" + classMap.Name + "')", "InheritsClass"); // do not localize return; } } bool checkMappings = this.checkOrmMappings; if (classMap.IsAbstract) { if (classMap.InheritanceType == InheritanceType.ConcreteTableInheritance) { checkMappings = false; } } if (checkMappings) { if (classMap.SourceClass.Length > 0) { if (classMap.GetSourceClassMap() == null) { HandleVerifyException(classMap, "Source class not found! (Class: '" + classMap.Name + "', Source class: '" + classMap.SourceClass + "')", "SourceClass"); // do not localize } } else { if (classMap.Table.Length < 1) { HandleVerifyException(classMap, "Table name must not be empty! (" + GetClassType(classMap) + ": '" + classMap.Name + "')", "Table"); // do not localize } if (classMap.GetTableMap() == null) { HandleVerifyException(classMap, "Table not found! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Table: '" + classMap.Table + "')", "Table"); // do not localize } if (classMap.TypeColumn.Length > 0) { if (classMap.GetTypeColumnMap() == null) { HandleVerifyException(classMap, "Type column not found! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Type column: '" + classMap.TypeColumn + "')", "TypeColumn"); // do not localize } if (classMap.TypeValue.Length < 1) { HandleVerifyException(classMap, "Type column supplied but no type value! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Type column: '" + classMap.TypeColumn + "')", "TypeColumn"); // do not localize } } } if (classMap.TypeValue.Length > 0) { if (classMap.TypeColumn.Length < 1) { HandleVerifyException(classMap, "Type value supplied but no type column! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Type value: '" + classMap.TypeValue + "')", "TypeValue"); // do not localize } VerifyUniqueTypeValue(classMap); } } if (classMap.InheritsClass.Length > 0) { if (superClassMap == null) { HandleVerifyException(classMap, "Inherited class not found! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Inherited class: '" + classMap.InheritsClass + "')", "InheritsClass"); // do not localize } } if (classMap.GetSortedIdentityPropertyMaps(ref failedSorting, true).Count < 1) { HandleVerifyException(classMap, "Class must have at least one identity property! (" + GetClassType(classMap) + ": '" + classMap.Name + "')", "PropertyMaps"); // do not localize } if (failedSorting) { HandleVerifyException(classMap, "Failed sorting identity properties due to invalid indexes! (" + GetClassType(classMap) + ": '" + classMap.Name + "')", "PropertyMaps"); // do not localize } if (classMap.IsInHierarchy()) { if (classMap.InheritanceType == InheritanceType.None) { HandleVerifyException(classMap, "Inheritance type must be specified for class that is part of an inheritance hierarchy! (" + GetClassType(classMap) + ": '" + classMap.Name + "')", "InheritanceType"); // do not localize } else { if (classMap.InheritanceType == InheritanceType.ConcreteTableInheritance) { if (superClassMap != null) { if (!(classMap.IsAbstract)) { foreach (IPropertyMap propertyMap in classMap.GetAllPropertyMaps()) { if (classMap.IsShadowingProperty(propertyMap)) { if (propertyMap.IsIdentity) { HandleVerifyException(classMap,"Identity properties should not be shadowed! (" + GetClassType(classMap) + ": '" + classMap.Name + "', property: '" + propertyMap.Name + "')", "InheritanceType"); // do not localize } } else { if (!(propertyMap.IsIdentity) && !(propertyMap.IsCollection)) { if (classMap.IsInheritedProperty(propertyMap)) { HandleVerifyException(classMap, "Non-identity, non-collection Properties should be shadowed (at least in the mapping file) in concrete classes for 'ConcreteTableInheritance' inheritance types! (" + GetClassType(classMap) + ": '" + classMap.Name + "', property: '" + propertyMap.Name + "')", "InheritanceType"); // do not localize } } } } } } } else { if (superClassMap != null) { foreach (IPropertyMap propertyMap in classMap.GetAllPropertyMaps()) { if (classMap.IsShadowingProperty(propertyMap)) { if (propertyMap.IsIdentity) { HandleVerifyException(classMap, "Identity properties should not be shadowed! (" + GetClassType(classMap) + ": '" + classMap.Name + "', property: '" + propertyMap.Name + "')", "InheritanceType"); // do not localize } else { HandleVerifyException(classMap, "Properties should not be shadowed for 'SingleTableInheritance' or 'ClassTableInheritance' inheritance types! (" + GetClassType(classMap) + ": '" + classMap.Name + "', property: '" + propertyMap.Name + "')", "InheritanceType"); // do not localize } } } } } } } else { } if (classMap.InheritanceType != InheritanceType.None) { if (classMap.TypeValue.Length < 1) { HandleVerifyException(classMap, "Type value must not be empty for class in inheritance hierarchy! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Type value: '" + classMap.TypeValue + "')", "TypeValue"); // do not localize } if (checkMappings) { if (classMap.GetTypeColumnMap() == null) { HandleVerifyException(classMap, "Type column not found! Class in inheritance hierarchy must have a type column! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Type column: '" + classMap.TypeColumn + "')", "TypeColumn"); // do not localize } } } else { } } if (classMap.ClassType == ClassType.Enum) { if (classMap.InheritsClass.Length > 0) { HandleVerifyException(classMap, "Enumerations can not inherit! (Enumeration: '" + classMap.Name + "', Inherits: '" + classMap.InheritsClass + "'", "InheritsClass"); // do not localize } if (classMap.PropertyMaps.Count > 0) { HandleVerifyException(classMap, "Enumerations can not have properties! (Enumeration: '" + classMap.Name + "'", "PropertyMaps"); // do not localize } if (classMap.GetSortedEnumValueMaps(ref failedSorting).Count < 1) { HandleVerifyException(classMap, "Enumeration must have at least one enumeration value! (" + GetClassType(classMap) + ": '" + classMap.Name + "')", "PropertyMaps"); // do not localize } if (failedSorting) { HandleVerifyException(classMap, "Failed sorting enumeration values due to invalid indexes! (" + GetClassType(classMap) + ": '" + classMap.Name + "')", "PropertyMaps"); // do not localize } } else { if (classMap.EnumValueMaps.Count > 0) { HandleVerifyException(classMap, "Only enumerations can have enumeration values! (" + GetClassType(classMap) + ": '" + classMap.Name + "'", "PropertyMaps"); // do not localize } } if (classMap.ClassType == ClassType.Interface) { if (classMap.InheritsClass.Length > 0) { IClassMap super = classMap.GetInheritedClassMap() ; if (super != null) { if (super.ClassType != ClassType.Interface) { HandleVerifyException(classMap, "Interfaces can only inherit other interfaces! (Interface: '" + classMap.Name + "', Inherits: '" + classMap.InheritsClass + "'", "InheritsClass"); // do not localize } } } } if (classMap.ClassType != ClassType.Class && classMap.ClassType != ClassType.Default) { if (classMap.Source.Length > 0) { HandleVerifyException(classMap, "Only classes can be mapped to a persistent data source! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Source: '" + classMap.Source + "'", "Source"); // do not localize } if (classMap.Table.Length > 0) { HandleVerifyException(classMap, "Only classes can be mapped to a table in a persistent data source! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Table: '" + classMap.Table + "'", "Table"); // do not localize } if (classMap.TypeColumn.Length > 0) { HandleVerifyException(classMap, "Only classes can be mapped to a type column in a persistent data source! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Type column: '" + classMap.TypeColumn + "'", "TypeColumn"); // do not localize } if (classMap.TypeValue.Length > 0) { HandleVerifyException(classMap, "Only classes can be mapped to a type value in a persistent data source! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Type value: '" + classMap.TypeValue + "'", "TypeValue"); // do not localize } if (classMap.SourceClass.Length > 0) { HandleVerifyException(classMap, "Only classes can be mapped to a class in a persistent data source! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Source class: '" + classMap.SourceClass + "'", "SourceClass"); // do not localize } if (classMap.DocElement.Length > 0) { HandleVerifyException(classMap, "Only classes can be mapped to an element in a persistent data source! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Document element: '" + classMap.DocElement + "'", "DocElement"); // do not localize } if (classMap.DocParentProperty.Length > 0) { HandleVerifyException(classMap, "Only classes can be mapped to a parent class property for mapping against a persistent data source! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Document parent property: '" + classMap.DocParentProperty + "'", "DocParentProperty"); // do not localize } if (classMap.DocRoot.Length > 0) { HandleVerifyException(classMap, "Only classes can be mapped to a document root in a persistent data source! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Document root: '" + classMap.DocRoot + "'", "DocRoot"); // do not localize } } if (this.Recursive) { foreach (IPropertyMap propertyMap in classMap.PropertyMaps) { propertyMap.Accept(this); } foreach (ICodeMap codeMap in classMap.CodeMaps) { codeMap.Accept(this); } foreach (IEnumValueMap enumValueMap in classMap.EnumValueMaps) { enumValueMap.Accept(this); } } Hashtable hashNames = new Hashtable(); foreach (IPropertyMap propertyMap in classMap.PropertyMaps) { if (propertyMap.Name.Length > 0) { if (hashNames.ContainsKey(propertyMap.Name.ToLower(CultureInfo.InvariantCulture))) { HandleVerifyException(classMap, "Property names must not appear in duplicates! (" + GetClassType(classMap) + ": '" + classMap.Name + "', Overridable Property name: '" + propertyMap.Name + "')", "PropertyMaps"); // do not localize } hashNames[propertyMap.Name.ToLower(CultureInfo.InvariantCulture)] = "1"; } } if (classMap.DomainMap.VerifyCSharpReservedWords) { if (MapBase.IsReservedCSharp(classMap.Name)) { HandleVerifyException(classMap, "Reserved word conflict! The name of this class is a reserved word in C#! (" + GetClassType(classMap) + ": '" + classMap.Name + "')", "Name"); // do not localize } } if (classMap.DomainMap.VerifyVbReservedWords) { if (MapBase.IsReservedVBNet(classMap.Name)) { HandleVerifyException(classMap, "Reserved word conflict! The name of this class is a reserved word in Visual Basic.NET! (" + GetClassType(classMap) + ": '" + classMap.Name + "')", "Name"); // do not localize } } if (classMap.DomainMap.VerifyDelphiReservedWords) { if (MapBase.IsReservedDelphi(classMap.Name)) { HandleVerifyException(classMap, "Reserved word conflict! The name of this class is a reserved word in delphi for .NET! (" + GetClassType(classMap) + ": '" + classMap.Name + "')", "Name"); // do not localize } } }