/// <summary>
        /// Initializes a new instance of the <see cref="PathTemplateSegmentTemplate"/> class.
        /// </summary>
        /// <param name="segment">The path template segment to be parsed as a template.</param>
        public PathTemplateSegmentTemplate(PathTemplateSegment segment)
        {
            if (segment == null)
            {
                throw Error.ArgumentNull("segment");
            }

            TemplateSegment = segment;

            string value;

            SegmentName = segment.TranslatePathTemplateSegment(out value);

            PropertyName = value;
            TreatPropertyNameAsParameterName = false;

            if (RoutingConventionHelpers.IsRouteParameter(PropertyName))
            {
                PropertyName = PropertyName.Substring(1, PropertyName.Length - 2);
                TreatPropertyNameAsParameterName = true;

                if (String.IsNullOrEmpty(PropertyName))
                {
                    Error.Format(SRResources.EmptyParameterAlias, PropertyName, segment.LiteralText);
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// Handle a PropertySegment
        /// </summary>
        /// <param name="segment">the segment to handle</param>
        public override void Handle(PathTemplateSegment segment)
        {
            Contract.Assert(segment != null);
            _navigationSource = null;

            _pathUriLiteral.Add(segment.LiteralText);
        }
Beispiel #3
0
        public void TryTranslatePathTemplateSegmentTemplate_ReturnsDynamicPathSegment()
        {
            // Arrange
            RouteValueDictionary          routeValueDictionary = new RouteValueDictionary(new { dynamicproperty = "Dynamic" });
            ODataTemplateTranslateContext context = new ODataTemplateTranslateContext
            {
                RouteValues = routeValueDictionary
            };

            context.Segments.Add(new MySegment(_entityType));

            PathTemplateSegment         segment     = new PathTemplateSegment("{dynamicproperty}");
            PathTemplateSegmentTemplate pathSegment = new PathTemplateSegmentTemplate(segment);

            // Act
            Assert.True(pathSegment.TryTranslate(context));

            // Assert
            Assert.Equal(2, context.Segments.Count); // 1 - MySegment, 2 - Property Segment
            Assert.Collection(context.Segments,
                              e =>
            {
                Assert.IsType <MySegment>(e);
            },
                              e =>
            {
                DynamicPathSegment dynamicSegment = Assert.IsType <DynamicPathSegment>(e);
                Assert.Equal("Dynamic", dynamicSegment.Identifier);
            });
        }
Beispiel #4
0
 public async Task VisitAsync(ODataPath path)
 {
     NotFound       = false;
     BadRequest     = false;
     Result         = null;
     ResultType     = null;
     PropertySetter = null;
     Index          = 0;
     foreach (var segment in path)
     {
         await(segment switch
         {
             TypeSegment typeSegment => VisitAsync(typeSegment),
             NavigationPropertySegment navigationPropertySegment => VisitAsync(navigationPropertySegment),
             EntitySetSegment entitySetSegment => VisitAsync(entitySetSegment),
             SingletonSegment singletonSegment => VisitAsync(singletonSegment),
             KeySegment keySegment => VisitAsync(keySegment),
             PropertySegment propertySegment => VisitAsync(propertySegment),
             AnnotationSegment annotationSegment => VisitAsync(annotationSegment),
             OperationImportSegment operationImportSegment => VisitAsync(operationImportSegment),
             OperationSegment operationSegment => VisitAsync(operationSegment),
             DynamicPathSegment dynamicPathSegment => VisitAsync(dynamicPathSegment),
             CountSegment countSegment => VisitAsync(countSegment),
             FilterSegment filterSegment => VisitAsync(filterSegment),
             ReferenceSegment referenceSegment => VisitAsync(referenceSegment),
             EachSegment eachSegment => VisitAsync(eachSegment),
             NavigationPropertyLinkSegment navigationPropertyLinkSegment => VisitAsync(navigationPropertyLinkSegment),
             ValueSegment valueSegment => VisitAsync(valueSegment),
             BatchSegment batchSegment => VisitAsync(batchSegment),
             BatchReferenceSegment batchReferenceSegment => VisitAsync(batchReferenceSegment),
             MetadataSegment metadataSegment => VisitAsync(metadataSegment),
             PathTemplateSegment pathTemplateSegment => VisitAsync(pathTemplateSegment),
             _ => throw new NotSupportedException()
         });
Beispiel #5
0
        public static string TranslatePathTemplateSegment(this PathTemplateSegment pathTemplatesegment, out string value)
        {
            if (pathTemplatesegment == null)
            {
                throw Error.ArgumentNull("pathTemplatesegment");
            }

            string pathTemplateSegmentLiteralText = pathTemplatesegment.LiteralText;

            if (pathTemplateSegmentLiteralText == null)
            {
                throw new ODataException(Error.Format(SRResources.InvalidAttributeRoutingTemplateSegment, String.Empty));
            }

            if (pathTemplateSegmentLiteralText.StartsWith("{", StringComparison.Ordinal) &&
                pathTemplateSegmentLiteralText.EndsWith("}", StringComparison.Ordinal))
            {
                string[] keyValuePair = pathTemplateSegmentLiteralText.Substring(1,
                                                                                 pathTemplateSegmentLiteralText.Length - 2).Split(':');
                if (keyValuePair.Length != 2)
                {
                    throw new ODataException(Error.Format(
                                                 SRResources.InvalidAttributeRoutingTemplateSegment,
                                                 pathTemplateSegmentLiteralText));
                }
                value = "{" + keyValuePair[0] + "}";
                return(keyValuePair[1]);
            }

            value = String.Empty;
            return(String.Empty);
        }
Beispiel #6
0
        public void TryTranslatePathTemplateSegmentTemplate_ReturnsNavigationPropertySegment()
        {
            // Arrange
            RouteValueDictionary          routeValueDictionary = new RouteValueDictionary(new { property = "RelatedCustomers" });
            ODataTemplateTranslateContext context = new ODataTemplateTranslateContext
            {
                RouteValues = routeValueDictionary
            };

            context.Segments.Add(new MySegment(_entityType));

            PathTemplateSegment         segment     = new PathTemplateSegment("{property}");
            PathTemplateSegmentTemplate pathSegment = new PathTemplateSegmentTemplate(segment);

            // Act
            Assert.True(pathSegment.TryTranslate(context));

            // Assert
            Assert.Equal(2, context.Segments.Count); // 1 - MySegment, 2 - Property Segment
            Assert.Collection(context.Segments,
                              e =>
            {
                Assert.IsType <MySegment>(e);
            },
                              e =>
            {
                NavigationPropertySegment propertySegment = Assert.IsType <NavigationPropertySegment>(e);
                Assert.Equal("RelatedCustomers", propertySegment.NavigationProperty.Name);
            });
        }
Beispiel #7
0
        /// <summary>
        /// Handle a PropertySegment
        /// </summary>
        /// <param name="segment">the segment to handle</param>
        public override void Handle(PathTemplateSegment segment)
        {
            _navigationSource = null;

            _pathTemplate.Add(ODataSegmentKinds.Property); // path template

            _pathUriLiteral.Add(segment.LiteralText);
        }
        public void Ctor_FailedWithWrongPathTemplateString()
        {
            // Arrange
            PathTemplateSegment segment = new PathTemplateSegment("{pName:dynamic:test}");

            // Act & Assert
            ExceptionAssert.Throws <ODataException>(() => new PathTemplateSegmentTemplate(segment),
                                                    string.Format("The attribute routing template contains invalid segment '{0}'.", "{pName:dynamic:test}"));
        }
Beispiel #9
0
        public static string ToUriLiteral(this PathTemplateSegment segment)
        {
            if (segment == null)
            {
                throw Error.ArgumentNull("segment");
            }

            return(segment.LiteralText);
        }
Beispiel #10
0
        public void TryTranslatePathTemplateSegmentTemplate_ThrowsArgumentNull_Context()
        {
            // Arrange
            PathTemplateSegment         segment     = new PathTemplateSegment("{any}");
            PathTemplateSegmentTemplate pathSegment = new PathTemplateSegmentTemplate(segment);

            // Act & Assert
            ExceptionAssert.ThrowsArgumentNull(() => pathSegment.TryTranslate(null), "context");
        }
Beispiel #11
0
        [InlineData("{dynamicproperty}")] // false because no previous segment in the context
        public void TryTranslatePathTemplateSegmentTemplate_ReturnsFalse_NotSupportedTemplate(string template)
        {
            // Arrange
            PathTemplateSegment           segment     = new PathTemplateSegment(template);
            PathTemplateSegmentTemplate   pathSegment = new PathTemplateSegmentTemplate(segment);
            ODataTemplateTranslateContext context     = new ODataTemplateTranslateContext();

            // Act & Assert
            Assert.False(pathSegment.TryTranslate(context));
        }
Beispiel #12
0
        public void CtorPathTemplateSegmentTemplate_ThrowsODataException_EmptyTemplate()
        {
            // Arrange
            PathTemplateSegment segment = new PathTemplateSegment("{}");

            // Act & Assert
            ODataException exception = ExceptionAssert.Throws <ODataException>(() => new PathTemplateSegmentTemplate(segment));

            Assert.Equal("The route template in path template '{}' is empty.", exception.Message);
        }
Beispiel #13
0
        public void CtorPathTemplateSegmentTemplate_SetsProperties()
        {
            // Arrange & Act
            PathTemplateSegment         segment     = new PathTemplateSegment("{any}");
            PathTemplateSegmentTemplate pathSegment = new PathTemplateSegmentTemplate(segment);

            // Assert
            Assert.Equal("any", pathSegment.ParameterName);
            Assert.Same(segment, pathSegment.Segment);
        }
Beispiel #14
0
        public void CtorPathTemplateSegmentTemplate_ThrowsODataException_WrongTemplate()
        {
            // Arrange
            PathTemplateSegment segment = new PathTemplateSegment("property");

            // Act & Assert
            ODataException exception = ExceptionAssert.Throws <ODataException>(() => new PathTemplateSegmentTemplate(segment));

            Assert.Equal("The attribute routing template contains invalid segment 'property'. The template string does not start with '{' or ends with '}'.",
                         exception.Message);
        }
Beispiel #15
0
        public void GetTemplatesPathTemplateSegmentTemplate_ReturnsTemplates()
        {
            // Arrange
            PathTemplateSegment         segment     = new PathTemplateSegment("{any}");
            PathTemplateSegmentTemplate pathSegment = new PathTemplateSegmentTemplate(segment);

            // Act & Assert
            IEnumerable <string> templates = pathSegment.GetTemplates();
            string template = Assert.Single(templates);

            Assert.Equal("/{any}", template);
        }
        public void Ctor_SetPropertiesCorrectly()
        {
            // Arrange
            PathTemplateSegment segment = new PathTemplateSegment("{pName:dynamicproperty}");

            // Act
            PathTemplateSegmentTemplate template = new PathTemplateSegmentTemplate(segment);

            // Assert
            Assert.Equal("pName", template.PropertyName);
            Assert.Equal("dynamicproperty", template.SegmentName);
        }
        public void TryMatch_DifferentType()
        {
            // Arrange
            PathTemplateSegment         pathTemplateSegment = new PathTemplateSegment("{pName:dynamicproperty}");
            PathTemplateSegmentTemplate template            = new PathTemplateSegmentTemplate(pathTemplateSegment);

            // Act
            Dictionary <string, object> values = new Dictionary <string, object>();
            bool result = template.TryMatch(MetadataSegment.Instance, values);

            // Assert
            Assert.False(result);
        }
Beispiel #18
0
        public void ODataPathSegmentHandler_Handles_PathTemplateSegment()
        {
            // Arrange
            ODataPathSegmentHandler handler = new ODataPathSegmentHandler();
            PathTemplateSegment     segment = new PathTemplateSegment("{any}");

            // Act
            handler.Handle(segment);

            // Assert
            Assert.Equal("{any}", handler.PathLiteral);
            Assert.Null(handler.NavigationSource);
        }
Beispiel #19
0
        public void TryTranslatePathTemplateSegmentTemplate_ReturnsFalse_PreviousSegmentNotStructuredType(string template)
        {
            // Arrange
            MySegment previousSegment = new MySegment(EdmCoreModel.Instance.GetString(false).Definition);

            PathTemplateSegment           segment     = new PathTemplateSegment(template);
            PathTemplateSegmentTemplate   pathSegment = new PathTemplateSegmentTemplate(segment);
            ODataTemplateTranslateContext context     = new ODataTemplateTranslateContext();

            context.Segments.Add(previousSegment);

            // Act & Assert
            Assert.False(pathSegment.TryTranslate(context));
        }
Beispiel #20
0
        public void ODataPathSegmentToTemplateHandler_Handles_PathTemplate()
        {
            // Arrange
            ODataPathSegmentToTemplateHandler handler = new ODataPathSegmentToTemplateHandler(null);
            PathTemplateSegment segment = new PathTemplateSegment("{any}");

            // Act
            handler.Handle(segment);

            // Assert
            ODataSegmentTemplate segmentTemplate = Assert.Single(handler.Templates);

            Assert.IsType <PathTemplateSegmentTemplate>(segmentTemplate);
        }
Beispiel #21
0
        public void Translate_PathTemplateSegment_To_DynamicPropertyPathSegment_Works()
        {
            // Arrange
            PathTemplateSegment segment = new PathTemplateSegment("{pName:dynamicproperty}");

            // Act
            IEnumerable <ODataPathSegment> segments = _translator.Translate(segment);

            // Assert
            ODataPathSegment           pathSegment    = Assert.Single(segments);
            DynamicPropertyPathSegment dynamicSegment = Assert.IsType <DynamicPropertyPathSegment>(pathSegment);

            Assert.Equal("{pName}", dynamicSegment.PropertyName);
        }
        /// <summary>
        /// Handle a PropertySegment
        /// </summary>
        /// <param name="segment">the segment to handle</param>
        public override void Handle(PathTemplateSegment segment)
        {
            string value;

            switch (segment.TranslatePathTemplateSegment(out value))
            {
            case ODataSegmentKinds.DynamicProperty:
                break;

            default:
                throw new ODataException(Error.Format(
                                             SRResources.InvalidAttributeRoutingTemplateSegment,
                                             segment.LiteralText));
            }
        }
Beispiel #23
0
        public void TryTranslatePathTemplateSegmentTemplate_ReturnsFalse_NoCorrectRouteData(string template)
        {
            // Arrange
            PathTemplateSegment           segment     = new PathTemplateSegment(template);
            PathTemplateSegmentTemplate   pathSegment = new PathTemplateSegmentTemplate(segment);
            ODataTemplateTranslateContext context     = new ODataTemplateTranslateContext
            {
                RouteValues = new RouteValueDictionary()
            };

            context.Segments.Add(new MySegment(_entityType));

            // Act & Assert
            Assert.False(pathSegment.TryTranslate(context));
        }
        public void TryMatch_RetrunsTrue()
        {
            // Arrange
            PathTemplateSegment         pathTemplateSegment = new PathTemplateSegment("{pName:dynamicproperty}");
            PathTemplateSegmentTemplate template            = new PathTemplateSegmentTemplate(pathTemplateSegment);
            DynamicPathSegment          segment             = new DynamicPathSegment("property");

            // Act
            Dictionary <string, object> values = new Dictionary <string, object>();
            bool result = template.TryMatch(segment, values);

            // Assert
            Assert.True(result);
            Assert.True(values.ContainsKey("pName"));
            Assert.Equal("property", values["pName"]);
        }
Beispiel #25
0
        /// <summary>
        /// Translate a PathTemplateSegment
        /// </summary>
        /// <param name="segment">the segment to Translate</param>
        /// <returns>Translated WebApi path segment.</returns>
        public override IEnumerable <ODataPathSegment> Translate(PathTemplateSegment segment)
        {
            string value = String.Empty;

            switch (TranslatePathTemplateSegment(segment.LiteralText, out value))
            {
            case ODataSegmentKinds._DynamicProperty:
                yield return(new DynamicPropertyPathSegment(value));

                break;

            default:
                throw new ODataException(Error.Format(
                                             SRResources.InvalidAttributeRoutingTemplateSegment,
                                             segment.LiteralText));
            }
        }
Beispiel #26
0
        /// <summary>
        /// Initializes a new instance of the <see cref="PathTemplateSegmentTemplate"/> class.
        /// </summary>
        /// <param name="segment">The path template segment to be parsed as a template.</param>
        public PathTemplateSegmentTemplate(PathTemplateSegment segment)
        {
            Segment = segment ?? throw new ArgumentNullException(nameof(segment));

            if (!IsRouteParameter(segment.LiteralText))
            {
                throw new ODataException(Error.Format(SRResources.InvalidAttributeRoutingTemplateSegment, segment.LiteralText));
            }

            // ParameterName = property or dynamicproperty
            ParameterName = segment.LiteralText.Substring(1, segment.LiteralText.Length - 2);

            if (string.IsNullOrEmpty(ParameterName))
            {
                throw new ODataException(Error.Format(SRResources.EmptyPathTemplate, segment.LiteralText));
            }
        }
Beispiel #27
0
        public void TryTranslatePathTemplateSegmentTemplate_ReturnsFalse_DynamicPathSegmentWithKnowProperty()
        {
            // Arrange
            RouteValueDictionary          routeValueDictionary = new RouteValueDictionary(new { dynamicproperty = "Name" });
            ODataTemplateTranslateContext context = new ODataTemplateTranslateContext
            {
                RouteValues = routeValueDictionary
            };

            context.Segments.Add(new MySegment(_entityType));

            PathTemplateSegment         segment     = new PathTemplateSegment("{dynamicproperty}");
            PathTemplateSegmentTemplate pathSegment = new PathTemplateSegmentTemplate(segment);

            // Act & Assert
            Assert.False(pathSegment.TryTranslate(context));
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="PathTemplateSegmentTemplate"/> class.
        /// </summary>
        /// <param name="segment">The path template segment to be parsed as a template.</param>
        public PathTemplateSegmentTemplate(PathTemplateSegment segment)
        {
            Segment = segment ?? throw new ArgumentNullException(nameof(segment));

            string value;

            SegmentName = segment.TranslatePathTemplateSegment(out value);

            PropertyName = value;
            TreatPropertyNameAsParameterName = false;

            if (IsRouteParameter(PropertyName))
            {
                PropertyName = PropertyName.Substring(1, PropertyName.Length - 2);
                TreatPropertyNameAsParameterName = true;

                if (string.IsNullOrEmpty(PropertyName))
                {
                    Error.Format(SRResources.EmptyParameterAlias, PropertyName, segment.LiteralText);
                }
            }
        }
Beispiel #29
0
 /// <summary>
 /// Translate a PathTemplateSegment
 /// </summary>
 /// <param name="segment">the segment to Translate</param>
 /// <returns>Translated odata path segment.</returns>
 public override ODataPathSegment Translate(PathTemplateSegment segment)
 {
     return(segment);
 }
        public void Translate_PathTemplateSegment_To_DynamicPropertyPathSegment_Works()
        {
            // Arrange
            PathTemplateSegment segment = new PathTemplateSegment("{pName:dynamicproperty}");

            // Act
            IEnumerable<ODataPathSegment> segments = _translator.Translate(segment);

            // Assert
            ODataPathSegment pathSegment = Assert.Single(segments);
            DynamicPropertyPathSegment dynamicSegment = Assert.IsType<DynamicPropertyPathSegment>(pathSegment);
            Assert.Equal("{pName}", dynamicSegment.PropertyName);
        }
 /// <summary>
 /// Handle a PropertySegment
 /// </summary>
 /// <param name="segment">the segment to handle</param>
 public override ODataSegmentTemplate Translate(PathTemplateSegment segment)
 {
     return(new PathTemplateSegmentTemplate(segment));
 }
 /// <summary>
 /// Handle a PathTemplateSegment
 /// </summary>
 /// <param name="segment">the segment to Handle</param>
 public virtual void Handle(PathTemplateSegment segment)
 {
     throw new NotImplementedException();
 }