Пример #1
0
        // 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;
        }
Пример #3
0
        // 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);
        }
Пример #4
0
        // 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;
        }
Пример #5
0
        // 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>());
        }
Пример #6
0
        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);
        }
Пример #7
0
        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);
        }
Пример #8
0
        // 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);
        }
Пример #10
0
        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));
        }
Пример #11
0
        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);
        }
Пример #12
0
        // 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);
        }