// PRIVATE METHODS ////////////////////////////////////////////////// #region Parse Methods private static List <string> GetUrlPathSegments(IUrlBuilderConfiguration urlBuilderConfiguration, Uri url) { Contract.Requires(urlBuilderConfiguration != null); Contract.Requires(url != null); // Skip the root path segments that are part of the URL builder // configuration that maybe are in the beginning of the raw URL path. var rootPathSegments = EnumerableExtensions.SafeToList(urlBuilderConfiguration.RootPathSegments); var rootPathSegmentsCount = rootPathSegments.Count; var urlPathSegments = EnumerableExtensions.SafeToList(JsonApiFramework.UriExtensions.GetPathSegments(url) .SkipWhile((pathSegment, index) => { if (index >= rootPathSegmentsCount) { return(false); } var rootPathSegment = rootPathSegments[index]; var rootPathSegmentEqualToPathSegment = String.CompareOrdinal(rootPathSegment, pathSegment) == 0; return(rootPathSegmentEqualToPathSegment); })); return(urlPathSegments); }
// PUBLIC CONSTRUCTORS ////////////////////////////////////////////// #region Constructors public HypermediaContext(IServiceModel serviceModel, IUrlBuilderConfiguration urlBuilderConfiguration) { Contract.Requires(serviceModel != null); Contract.Requires(urlBuilderConfiguration != null); this.ServiceModel = serviceModel; this.UrlBuilderConfiguration = urlBuilderConfiguration; }
// PUBLIC METHODS /////////////////////////////////////////////////// #region Methods public static UrlBuilder Create(IUrlBuilderConfiguration configuration) { Contract.Requires(configuration != null); Contract.Requires(String.IsNullOrWhiteSpace(configuration.Scheme) == false); Contract.Requires(String.IsNullOrWhiteSpace(configuration.Host) == false); var urlBuilder = new UrlBuilder(configuration); return(urlBuilder); }
// PUBLIC CONSTRUCTORS ////////////////////////////////////////////// #region Constructors public HypermediaContext(IServiceModel serviceModel, IUrlBuilderConfiguration urlBuilderConfiguration, IDictionary <Type, IUrlBuilderConfiguration> urlBuilderConfigurationPerResourceType) { Contract.Requires(serviceModel != null); Contract.Requires(urlBuilderConfiguration != null); this.ServiceModel = serviceModel; this.UrlBuilderConfiguration = urlBuilderConfiguration; this.UrlBuilderConfigurationPerResourceType = urlBuilderConfigurationPerResourceType; }
// PRIVATE CONSTRUCTORS ///////////////////////////////////////////// #region Constructors private UrlBuilder(IUrlBuilderConfiguration configuration) { Contract.Requires(configuration != null); Contract.Requires(String.IsNullOrWhiteSpace(configuration.Scheme) == false); Contract.Requires(String.IsNullOrWhiteSpace(configuration.Host) == false); this.Scheme = configuration.Scheme; this.Host = configuration.Host; this.Port = configuration.Port; this.PathSegments = new List <string>(); this.PathSegments.AddRange(configuration.RootPathSegments ?? Enumerable.Empty <string>()); }
public void TestUrlBuilderWithPathObjectCollection(string name, IUrlBuilderConfiguration configuration, IEnumerable <IPath> pathCollection, bool includePathCollection, string expectedUrl) { // Arrange // Act var expectedUrlOutputLine = "Expected URL: {0}".FormatWith(expectedUrl); this.Output.WriteLine(expectedUrlOutputLine); var actualUrl = UrlBuilder.Create(configuration) .Path(pathCollection, includePathCollection) .Build(); var actualUrlOutputLine = "Actual URL: {0}".FormatWith(actualUrl); this.Output.WriteLine(actualUrlOutputLine); // Assert Assert.Equal(expectedUrl, actualUrl); }
public static IDocumentContextOptionsBuilder UseUrlBuilderConfiguration(this IDocumentContextOptionsBuilder documentContextOptionsBuilder, IUrlBuilderConfiguration urlBuilderConfiguration) { Contract.Requires(documentContextOptionsBuilder != null); Contract.Requires(urlBuilderConfiguration != null); documentContextOptionsBuilder.ModifyExtension <ServerDocumentContextExtension>(x => x.UrlBuilderConfiguration = urlBuilderConfiguration); return(documentContextOptionsBuilder); }
// PRIVATE METHODS ////////////////////////////////////////////////// #region Methods public static bool IsUriMatchForUrlBuilderConfiguration(IUrlBuilderConfiguration urlBuilderConfiguration, Uri uri) { Contract.Requires(uri != null); if (urlBuilderConfiguration == null) { return(false); } // Scheme if (String.Compare(urlBuilderConfiguration.Scheme, uri.Scheme, StringComparison.OrdinalIgnoreCase) != 0) { return(false); } // Host if (String.Compare(urlBuilderConfiguration.Host, uri.Host, StringComparison.OrdinalIgnoreCase) != 0) { return(false); } // Port if (urlBuilderConfiguration.Port.HasValue) { if (urlBuilderConfiguration.Port.Value != uri.Port) { return(false); } } // Root Path Segments var rootPathSegments = urlBuilderConfiguration.RootPathSegments.SafeToReadOnlyList(); if (rootPathSegments.Any() == false) { return(true); } var rootPathSegmentsCount = rootPathSegments.Count; var uriPathSegments = uri.GetPathSegments() .SafeToReadOnlyList(); var uriPathSegmentsCount = uriPathSegments.Count; if (uriPathSegmentsCount < rootPathSegmentsCount) { return(false); } for (var i = 0; i < rootPathSegmentsCount; i++) { var rootPathSegment = rootPathSegments[i]; var uriPathSegment = uriPathSegments[i]; if (String.Compare(rootPathSegment, uriPathSegment, StringComparison.OrdinalIgnoreCase) != 0) { return(false); } } return(true); }
public static void SetUrlBuilderConfiguration(this IDocumentContextImplementation implementation, IUrlBuilderConfiguration urlBuilderConfiguration) { Contract.Requires(implementation != null); Contract.Requires(urlBuilderConfiguration != null); implementation.Options.ModifyExtension <ServerDocumentContextExtension>(x => x.UrlBuilderConfiguration = urlBuilderConfiguration); }
public static IDocumentContextOptionsBuilder UseUrlBuilderConfiguration <TResource>(this IDocumentContextOptionsBuilder documentContextOptionsBuilder, IUrlBuilderConfiguration urlBuilderConfiguration) where TResource : class { Contract.Requires(documentContextOptionsBuilder != null); Contract.Requires(urlBuilderConfiguration != null); var resourceType = typeof(TResource); return(documentContextOptionsBuilder.UseUrlBuilderConfiguration(resourceType, urlBuilderConfiguration)); }
public static IDocumentContextOptionsBuilder UseUrlBuilderConfiguration(this IDocumentContextOptionsBuilder documentContextOptionsBuilder, Type resourceType, IUrlBuilderConfiguration urlBuilderConfiguration) { Contract.Requires(documentContextOptionsBuilder != null); Contract.Requires(resourceType != null); Contract.Requires(urlBuilderConfiguration != null); documentContextOptionsBuilder.ModifyExtension <ServerDocumentContextExtension>(x => { x.UrlBuilderConfigurationPerResourceType = x.UrlBuilderConfigurationPerResourceType ?? new Dictionary <Type, IUrlBuilderConfiguration>(); if (x.UrlBuilderConfigurationPerResourceType.ContainsKey(resourceType)) { return; } x.UrlBuilderConfigurationPerResourceType.Add(resourceType, urlBuilderConfiguration); }); return(documentContextOptionsBuilder); }
// PUBLIC METHODS /////////////////////////////////////////////////// #region Extensions Methods public static IEnumerable <IHypermediaPath> ParseDocumentSelfPath(this Uri url, IServiceModel serviceModel, IUrlBuilderConfiguration urlBuilderConfiguration) { Contract.Requires(url != null); Contract.Requires(serviceModel != null); Contract.Requires(urlBuilderConfiguration != null); // Create a URL path segment enumerator to enumerate over the URL path segments. var urlPathSegments = GetUrlPathSegments(urlBuilderConfiguration, url); var urlPathSegmentsEnumerator = (IEnumerator <string>)urlPathSegments.GetEnumerator(); // Parse the raw URL path for document self link path objects by // looking for the following: // 1. resource collection hypermedia path objects // 2. resource hypermedia path objects // 3. non-resource hypermedia path objects // 4. to-many resource collection hypermedia path objects // 5. to-many resource hypermedia path objects var documentSelfPath = new List <IHypermediaPath>(); var continueIterating = InitialIteration(serviceModel, urlPathSegmentsEnumerator, documentSelfPath); while (continueIterating) { continueIterating = NextIteration(serviceModel, urlPathSegmentsEnumerator, documentSelfPath); } return(documentSelfPath); }