コード例 #1
0
        public void BuildIdLink_DoesNotThrow_IfJsonAndIdLinkBuilderIsNull(object metadataLevel)
        {
            NavigationSourceLinkBuilderAnnotation linkBuilder = new NavigationSourceLinkBuilderAnnotation(_entitySet);

            ExceptionAssert.DoesNotThrow(
                () => linkBuilder.BuildIdLink(new ResourceContext(), (ODataMetadataLevel)metadataLevel));
        }
コード例 #2
0
        public void BuildIdLink_ThrowsArgumentNull_InstanceContext()
        {
            // Arrange
            NavigationSourceLinkBuilderAnnotation linkBuilder = new NavigationSourceLinkBuilderAnnotation(_customers, _model);

            // Act & Assert
            ExceptionAssert.ThrowsArgumentNull(() => linkBuilder.BuildIdLink(null, ODataMetadataLevel.Full), "instanceContext");
        }
コード例 #3
0
        public static Uri GenerateODataLink(HttpRequestMessage request, object entity, bool isEntityId)
        {
            EntityInstanceContext entityContext = CreateEntityInstanceContext(request, entity);

            Contract.Assert(entityContext != null);

            // Generate location or entityId header from request Uri and key, if Post to a containment.
            // Link builder is not used, since it is also for generating ID, Edit, Read links, etc. scenarios, where
            // request Uri is not used.
            if (entityContext.NavigationSource.NavigationSourceKind() == EdmNavigationSourceKind.ContainedEntitySet)
            {
                return(GenerateContainmentODataPathSegments(entityContext, isEntityId));
            }

            NavigationSourceLinkBuilderAnnotation linkBuilder =
                entityContext.EdmModel.GetNavigationSourceLinkBuilder(entityContext.NavigationSource);

            Contract.Assert(linkBuilder != null);

            Uri idLink = linkBuilder.BuildIdLink(entityContext);

            if (isEntityId)
            {
                if (idLink == null)
                {
                    throw Error.InvalidOperation(
                              SRResources.IdLinkNullForEntityIdHeader,
                              entityContext.NavigationSource.Name);
                }

                return(idLink);
            }

            Uri editLink = linkBuilder.BuildEditLink(entityContext);

            if (editLink == null)
            {
                if (idLink != null)
                {
                    return(idLink);
                }

                throw Error.InvalidOperation(
                          SRResources.EditLinkNullForLocationHeader,
                          entityContext.NavigationSource.Name);
            }

            return(editLink);
        }
コード例 #4
0
        public void Ctor_FollowingConventions_GeneratesSelfLinkWithCast_IfDerivedTypeHasNavigationProperty()
        {
            // Arrange
            CustomersModelWithInheritance model = new CustomersModelWithInheritance();
            var request = RequestFactory.CreateFromModel(model.Model);
            ODataSerializerContext serializerContext = ODataSerializerContextFactory.Create(model.Model, model.Customers, request);
            ResourceContext        instanceContext   = new ResourceContext(serializerContext, model.SpecialCustomer.AsReference(), new { ID = 42 });

            // Act
            NavigationSourceLinkBuilderAnnotation linkBuilder = new NavigationSourceLinkBuilderAnnotation(model.Customers, model.Model);
            var result = linkBuilder.BuildIdLink(instanceContext, ODataMetadataLevel.FullMetadata);

            // Assert
            Assert.Equal("http://localhost/Customers(42)/NS.SpecialCustomer", result.ToString());
        }
コード例 #5
0
        private static Uri GetNestedNextPageLink(ODataSerializerContext writeContext, int pageSize, object obj)
        {
            Contract.Assert(writeContext.ExpandedResource != null);
            Uri navigationLink;
            IEdmNavigationSource sourceNavigationSource       = writeContext.ExpandedResource.NavigationSource;
            NavigationSourceLinkBuilderAnnotation linkBuilder = writeContext.Model.GetNavigationSourceLinkBuilder(sourceNavigationSource);

            // In Contained Navigation, we don't have navigation property binding,
            // Hence we cannot get the NavigationLink from the NavigationLinkBuilder
            if (writeContext.NavigationSource.NavigationSourceKind() == EdmNavigationSourceKind.ContainedEntitySet)
            {
                // Contained navigation.
                Uri idlink = linkBuilder.BuildIdLink(writeContext.ExpandedResource);

                var link = idlink.ToString() + "/" + writeContext.NavigationProperty.Name;
                navigationLink = new Uri(link);
            }
            else
            {
                // Non-Contained navigation.
                navigationLink =
                    linkBuilder.BuildNavigationLink(writeContext.ExpandedResource, writeContext.NavigationProperty);
            }

            Uri nestedNextLink = GenerateQueryFromExpandedItem(writeContext, navigationLink);

            SkipTokenHandler nextLinkGenerator = null;

            if (writeContext.QueryContext != null)
            {
                nextLinkGenerator = writeContext.QueryContext.GetSkipTokenHandler();
            }

            if (nestedNextLink != null)
            {
                if (nextLinkGenerator != null)
                {
                    return(nextLinkGenerator.GenerateNextPageLink(nestedNextLink, pageSize, obj, writeContext));
                }

                return(GetNextPageHelper.GetNextPageLink(nestedNextLink, pageSize));
            }

            return(null);
        }
コード例 #6
0
        public void BuildIdLink(bool followsConventions, ODataMetadataLevel metadataLevel, bool linkEmitted)
        {
            // Arrange
            _entitySet.HasIdLink(new SelfLinkBuilder <Uri>((context) => new Uri("http://selflink"), followsConventions));
            NavigationSourceLinkBuilderAnnotation linkBuilder = new NavigationSourceLinkBuilderAnnotation(_entitySet);

            // Act
            Uri generatedIdLink = linkBuilder.BuildIdLink(new ResourceContext(), (ODataMetadataLevel)metadataLevel);

            // Assert
            if (linkEmitted)
            {
                Assert.Equal(new Uri("http://selflink"), generatedIdLink);
            }
            else
            {
                Assert.Null(generatedIdLink);
            }
        }
コード例 #7
0
        internal Uri GenerateLocationHeader()
        {
            EntityInstanceContext entityContext = CreateEntityInstanceContext(Request, Entity);

            Contract.Assert(entityContext != null);

            NavigationSourceLinkBuilderAnnotation linkBuilder = entityContext.EdmModel.GetNavigationSourceLinkBuilder(entityContext.NavigationSource);

            Contract.Assert(linkBuilder != null);

            Uri idLink   = linkBuilder.BuildIdLink(entityContext, ODataMetadataLevel.Default);
            Uri editLink = linkBuilder.BuildEditLink(entityContext, ODataMetadataLevel.Default, idLink);

            if (editLink == null)
            {
                throw Error.InvalidOperation(SRResources.EditLinkNullForLocationHeader, entityContext.NavigationSource.Name);
            }

            return(editLink);
        }