/// <summary> /// Validates the type of an entry in a top-level feed. /// </summary> /// <param name="entityType">The type of the entry.</param> internal void ValidateEntry(IEdmEntityType entityType) { Debug.Assert(entityType != null, "entityType != null"); // If we don't have a type, store the type of the first item. if (this.itemType == null) { this.itemType = entityType; } // Validate the expected and actual types. if (this.itemType.IsEquivalentTo(entityType)) { return; } // If the types are not equivalent, make sure they have a common base type. IEdmType commonBaseType = EdmLibraryExtensions.GetCommonBaseType(this.itemType, entityType); if (commonBaseType == null) { throw new ODataException(Strings.FeedWithoutExpectedTypeValidator_IncompatibleTypes(entityType.ODataFullName(), this.itemType.ODataFullName())); } this.itemType = (IEdmEntityType)commonBaseType; }
/// <summary> /// Validates the type of a resource in a top-level resource set. /// </summary> /// <param name="resourceType">The type of the resource.</param> internal void ValidateResource(IEdmStructuredType resourceType) { if (resourceType == null) { return; } // If we don't have a type, store the type of the first item. if (this.itemType == null) { this.itemType = resourceType; } // Validate the expected and actual types. if (this.itemType.IsEquivalentTo(resourceType)) { return; } // If the types are not equivalent, make sure they have a common base type. IEdmType commonBaseType = EdmLibraryExtensions.GetCommonBaseType(this.itemType, resourceType); if (commonBaseType == null) { throw new ODataException(Strings.ResourceSetWithoutExpectedTypeValidator_IncompatibleTypes(resourceType.FullTypeName(), this.itemType.FullTypeName())); } this.itemType = (IEdmStructuredType)commonBaseType; }
/// <summary> /// Validates the type of a resource in a top-level resource set. /// </summary> /// <param name="itemType">The type of the resource.</param> internal void ValidateResource(IEdmType itemType) { if (this.itemType == null || this.itemType.TypeKind == EdmTypeKind.Untyped) { return; } // Validate the expected and actual types. if (this.itemType.IsEquivalentTo(itemType)) { return; } IEdmStructuredType structuredType = itemType as IEdmStructuredType; IEdmStructuredType thisStructuredType = this.itemType as IEdmStructuredType; if (structuredType == null || thisStructuredType == null) { throw new ODataException(Strings.ResourceSetWithoutExpectedTypeValidator_IncompatibleTypes(itemType.FullTypeName(), this.itemType.FullTypeName())); } // If the types are not equivalent, make sure they have a common base type. IEdmType commonBaseType = EdmLibraryExtensions.GetCommonBaseType(thisStructuredType, structuredType); if (commonBaseType == null) { throw new ODataException(Strings.ResourceSetWithoutExpectedTypeValidator_IncompatibleTypes(itemType.FullTypeName(), this.itemType.FullTypeName())); } this.itemType = (IEdmType)commonBaseType; }
/// <summary> /// Validate that the expected and actual type names and type kinds are compatible. /// </summary> /// <param name="collectionItemTypeName">The actual type name.</param> /// <param name="collectionItemTypeKind">The actual type kind.</param> private void ValidateCollectionItemTypeNameAndKind(string collectionItemTypeName, EdmTypeKind collectionItemTypeKind) { // Compare the item type kinds. if (this.itemTypeKind != collectionItemTypeKind) { throw new ODataException(Strings.CollectionWithoutExpectedTypeValidator_IncompatibleItemTypeKind(collectionItemTypeKind, this.itemTypeKind)); } if (this.itemTypeKind == EdmTypeKind.Primitive) { Debug.Assert(this.primitiveItemType != null, "this.primitiveItemType != null"); Debug.Assert(collectionItemTypeName != null, "collectionItemTypeName != null"); // NOTE: we do support type inheritance for spatial primitive types; otherwise the type names have to match. if (!string.IsNullOrEmpty(this.itemTypeName) && this.itemTypeName.Equals(collectionItemTypeName, System.StringComparison.OrdinalIgnoreCase)) { return; } if (this.primitiveItemType.IsSpatial()) { EdmPrimitiveTypeKind collectionItemPrimitiveKind = EdmCoreModel.Instance.GetPrimitiveTypeKind(collectionItemTypeName); IEdmPrimitiveType collectionItemPrimitiveType = EdmCoreModel.Instance.GetPrimitiveType(collectionItemPrimitiveKind); if (this.itemTypeDerivedFromCollectionValue) { // If the collection defines an item type, the collection item type has to be assignable to it. if (this.primitiveItemType.IsAssignableFrom(collectionItemPrimitiveType)) { return; } } else { // If the collection does not define an item type, the collection items must have a common base type. IEdmPrimitiveType commonBaseType = EdmLibraryExtensions.GetCommonBaseType(this.primitiveItemType, collectionItemPrimitiveType); if (commonBaseType != null) { this.primitiveItemType = commonBaseType; this.itemTypeName = commonBaseType.FullTypeName(); return; } } } throw new ODataException(Strings.CollectionWithoutExpectedTypeValidator_IncompatibleItemTypeName(collectionItemTypeName, this.itemTypeName)); } else { // Since we do not support type inheritance for complex types, comparison of the type names is sufficient if (string.CompareOrdinal(this.itemTypeName, collectionItemTypeName) != 0) { throw new ODataException(Strings.CollectionWithoutExpectedTypeValidator_IncompatibleItemTypeName(collectionItemTypeName, this.itemTypeName)); } } }