Ejemplo n.º 1
0
        private static ODataValue GetComplexValue(InstanceAnnotation entryAnnotation, object annotation, IEdmModel model, ODataComplexTypeSerializer complexSerializer, ODataSerializerContext serializerContext)
        {
            Contract.Requires(entryAnnotation != null);
            Contract.Requires(annotation != null);
            Contract.Requires(model != null);
            Contract.Requires(complexSerializer != null);
            Contract.Requires(serializerContext != null);

            var complexType = (IEdmComplexType)model.FindDeclaredType(entryAnnotation.AnnotationTypeName);

            if (complexType == null)
            {
                return(null);
            }

            var typeRef = new EdmComplexTypeReference(complexType, entryAnnotation.IsNullable);

            if (!entryAnnotation.IsCollection)
            {
                return(complexSerializer.CreateODataComplexValue(annotation, typeRef, serializerContext));
            }

            var typeName = Invariant($"Collection({typeRef.FullName()})");
            var items    = GetComplexValues(annotation, complexSerializer, typeRef, serializerContext);

            return(new ODataCollectionValue()
            {
                Items = items, TypeName = typeName
            });
        }
Ejemplo n.º 2
0
        public void TypeNameShouldNotBeWrittenForDeclaredComplexProperty()
        {
            var typeFromMetadata = new EdmComplexTypeReference(new EdmComplexType("Test", "ComplexType"), true);
            var typeFromValue    = new EdmComplexTypeReference(new EdmComplexType("Test", "ComplexType"), false);

            this.typeNameOracle.GetResourceTypeNameForWriting(typeFromMetadata.FullName(),
                                                              new ODataResource {
                TypeName = "Test.ComplexType"
            },
                                                              /* isUndeclared*/ false).Should().BeNull();
        }
Ejemplo n.º 3
0
        public void Named_type_reference_fullName_returns_fullName()
        {
            IEdmModel edmModel = this.GetEdmModel();

            foreach (var entity in edmModel.SchemaElements.OfType <IEdmEntityType>())
            {
                var entityTypeRef = new EdmEntityTypeReference(entity, false);

                Assert.IsNotNull(entityTypeRef.FullName(), "EntityTypeReference.FullName()");
                Assert.AreEqual(entity.FullName(), entityTypeRef.FullName(), "EntityTypeReference.FullName()");
            }

            foreach (var complex in edmModel.SchemaElements.OfType <IEdmComplexType>())
            {
                var complexTypeRef = new EdmComplexTypeReference(complex, false);

                Assert.IsNotNull(complexTypeRef.FullName(), "ComplexTypeReference.FullName()");
                Assert.AreEqual(complex.FullName(), complexTypeRef.FullName(), "ComplexTypeReference.FullName()");
            }
        }
        public void ValueWithTypeNameAnnotationShouldReturnTypeNameFromAnnotation()
        {
            var complexValue = new ODataResource()
            {
                TypeName = ComplexTypeName
            };

            complexValue.TypeAnnotation = new ODataTypeAnnotation("TypeNameFromSTNA");

            Assert.Equal("TypeNameFromSTNA", this.testSubject.GetResourceTypeNameForWriting(
                             complexTypeReference.FullName(),
                             complexValue,
                             /*isOpen*/ false));
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Deserializes the given <paramref name="complexValue"/> under the given <paramref name="readContext"/>.
        /// </summary>
        /// <param name="complexValue">The complex value to deserialize.</param>
        /// <param name="complexType">The EDM type of the complex value to read.</param>
        /// <param name="readContext">The deserializer context.</param>
        /// <returns>The deserialized complex value.</returns>
        public virtual object ReadComplexValue(ODataComplexValue complexValue, IEdmComplexTypeReference complexType,
                                               ODataDeserializerContext readContext)
        {
            if (complexValue == null)
            {
                throw Error.ArgumentNull("complexValue");
            }

            if (readContext == null)
            {
                throw Error.ArgumentNull("readContext");
            }

            if (readContext.Model == null)
            {
                throw Error.Argument("readContext", SRResources.ModelMissingFromReadContext);
            }

            if (!String.IsNullOrEmpty(complexValue.TypeName) && complexType.FullName() != complexValue.TypeName)
            {
                // received a derived complex type in a base type deserializer.
                IEdmModel model = readContext.Model;
                if (model == null)
                {
                    throw Error.Argument("readContext", SRResources.ModelMissingFromReadContext);
                }

                IEdmComplexType actualType = model.FindType(complexValue.TypeName) as IEdmComplexType;
                if (actualType == null)
                {
                    throw new ODataException(Error.Format(SRResources.ComplexTypeNotInModel, complexValue.TypeName));
                }

                if (actualType.IsAbstract)
                {
                    string message = Error.Format(SRResources.CannotInstantiateAbstractComplexType,
                                                  complexValue.TypeName);
                    throw new ODataException(message);
                }

                IEdmTypeReference        actualComplexType = new EdmComplexTypeReference(actualType, isNullable: false);
                ODataEdmTypeDeserializer deserializer      = DeserializerProvider.GetEdmTypeDeserializer(actualComplexType);
                if (deserializer == null)
                {
                    throw new SerializationException(
                              Error.Format(SRResources.TypeCannotBeDeserialized, actualComplexType.FullName(),
                                           typeof(ODataMediaTypeFormatter).Name));
                }

                object resource = deserializer.ReadInline(complexValue, actualComplexType, readContext);

                EdmStructuredObject structuredObject = resource as EdmStructuredObject;
                if (structuredObject != null)
                {
                    structuredObject.ExpectedEdmType = complexType.ComplexDefinition();
                }

                return(resource);
            }
            else
            {
                object complexResource = CreateResource(complexType, readContext);

                foreach (ODataProperty complexProperty in complexValue.Properties)
                {
                    DeserializationHelpers.ApplyProperty(complexProperty, complexType, complexResource,
                                                         DeserializerProvider, readContext);
                }
                return(complexResource);
            }
        }