/// <summary> /// Validates that a string is either a valid absolute URI, or (if it begins with '#') it is a valid URI fragment. /// </summary> /// <param name="metadataDocumentUri">The metadata document uri.</param> /// <param name="propertyName">The property name to validate.</param> internal static void ValidateMetadataReferencePropertyName(Uri metadataDocumentUri, string propertyName) { Debug.Assert(metadataDocumentUri != null, "metadataDocumentUri != null"); Debug.Assert(metadataDocumentUri.IsAbsoluteUri, "metadataDocumentUri.IsAbsoluteUri"); Debug.Assert(!String.IsNullOrEmpty(propertyName), "!string.IsNullOrEmpty(propertyName)"); string uriStringToValidate = propertyName; // If it starts with a '#', validate that the rest of the string is a valid Uri fragment. if (propertyName[0] == ODataConstants.ContextUriFragmentIndicator) { // In order to use System.Uri to validate a fragement, we first prepend the metadataDocumentUri // so that it becomes an absolute URI which we can validate with Uri.IsWellFormedUriString. uriStringToValidate = UriUtils.UriToString(metadataDocumentUri) + UriUtils.EnsureEscapedFragment(propertyName); } if (!Uri.IsWellFormedUriString(uriStringToValidate, UriKind.Absolute) || !ODataJsonLightUtils.IsMetadataReferenceProperty(propertyName) || propertyName[propertyName.Length - 1] == ODataConstants.ContextUriFragmentIndicator) { throw new ODataException(Strings.ValidationUtils_InvalidMetadataReferenceProperty(propertyName)); } if (IsOpenMetadataReferencePropertyName(metadataDocumentUri, propertyName)) { throw new ODataException(Strings.ODataJsonLightValidationUtils_OpenMetadataReferencePropertyNotSupported(propertyName, UriUtils.UriToString(metadataDocumentUri))); } }
/// <summary> /// Converts the metadata reference property name to an absolute Uri. /// </summary> /// <param name="metadataDocumentUri">The metadata document uri.</param> /// <param name="propertyName">The metadata reference property name.</param> /// <returns>The absolute Uri for the metadata reference property name.</returns> internal static Uri GetAbsoluteUriFromMetadataReferencePropertyName(Uri metadataDocumentUri, string propertyName) { Debug.Assert(metadataDocumentUri != null, "metadataDocumentUri != null"); Debug.Assert(!String.IsNullOrEmpty(propertyName), "!string.IsNullOrEmpty(propertyName)"); if (propertyName[0] == ODataConstants.ContextUriFragmentIndicator) { propertyName = UriUtils.EnsureEscapedFragment(propertyName); return(new Uri(metadataDocumentUri, propertyName)); } Debug.Assert(Uri.IsWellFormedUriString(propertyName, UriKind.Absolute), "The propertyName should be an absolute Uri."); return(new Uri(propertyName, UriKind.Absolute)); }