Esempio n. 1
0
        private static void ParseComponent(EdmEntityObject entity, ComponentHelpClass item, object value)
        {
            int i = 0;

            EdmStructuredObject actualEntity = entity;

            for (i = 0; i < item.Depth - 1; i++)
            {
                var    componentName = item.SplitedComponents[i];
                object local         = null;
                actualEntity.TryGetPropertyValue(componentName, out local);
                if (local == null)
                {
                    var declaredProperty = actualEntity.ActualEdmType.DeclaredProperties.FirstOrDefault(w => w.Name == componentName);
                    var edmComplexObject = new EdmComplexObject(declaredProperty.Type.AsComplex());

                    actualEntity.TrySetPropertyValue(componentName, edmComplexObject);
                    actualEntity = edmComplexObject;
                }
                else
                {
                    actualEntity = (EdmStructuredObject)local;
                }
            }

            var propertyName = item.SplitedComponents[item.Depth - 1];

            actualEntity.TrySetPropertyValue(propertyName, value);
        }
Esempio n. 2
0
        /// <summary>
        /// Deserializes the given <paramref name="entryWrapper"/> under the given <paramref name="readContext"/>.
        /// </summary>
        /// <param name="entryWrapper">The OData entry to deserialize.</param>
        /// <param name="entityType">The entity type of the entry to deserialize.</param>
        /// <param name="readContext">The deserializer context.</param>
        /// <returns>The deserialized entity.</returns>
        public virtual object ReadEntry(ODataEntryWithNavigationLinks entryWrapper, IEdmEntityTypeReference entityType,
                                        ODataDeserializerContext readContext)
        {
            if (entryWrapper == null)
            {
                throw Error.ArgumentNull("entryWrapper");
            }

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

            if (!String.IsNullOrEmpty(entryWrapper.Entry.TypeName) && entityType.FullName() != entryWrapper.Entry.TypeName)
            {
                // received a derived type in a base type deserializer. delegate it to the appropriate derived type deserializer.
                IEdmModel model = readContext.Model;

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

                IEdmEntityType actualType = model.FindType(entryWrapper.Entry.TypeName) as IEdmEntityType;
                if (actualType == null)
                {
                    throw new ODataException(Error.Format(SRResources.EntityTypeNotInModel, entryWrapper.Entry.TypeName));
                }

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

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

                object resource = deserializer.ReadInline(entryWrapper, actualEntityType, readContext);

                EdmStructuredObject structuredObject = resource as EdmStructuredObject;
                if (structuredObject != null)
                {
                    structuredObject.ExpectedEdmType = entityType.EntityDefinition();
                }

                return(resource);
            }
            else
            {
                object resource = CreateEntityResource(entityType, readContext);
                ApplyEntityProperties(resource, entryWrapper, entityType, readContext);
                return(resource);
            }
        }
Esempio n. 3
0
        public void GetDefaultValue_NonNullableEntity()
        {
            IEdmTypeReference nonNullableEntityType = new EdmEntityTypeReference(new EdmEntityType("NS", "Entity"), isNullable: false);

            var result = EdmStructuredObject.GetDefaultValue(nonNullableEntityType);

            var entityObject = Assert.IsType <EdmEntityObject>(result);

            Assert.Equal(nonNullableEntityType, entityObject.GetEdmType(), new EdmTypeReferenceEqualityComparer());
        }
Esempio n. 4
0
        public void GetClrTypeForUntypedDelta_ThrowsInvalidOperation_ForUnsupportedTypeKind()
        {
            // Arrange & Act
            IEdmPathTypeReference path = EdmCoreModel.Instance.GetPathType(EdmPathTypeKind.PropertyPath, true);
            Action test = () => EdmStructuredObject.GetClrTypeForUntypedDelta(path);

            // Assert
            ExceptionAssert.Throws <InvalidOperationException>(
                () => EdmStructuredObject.GetClrTypeForUntypedDelta(path),
                "The EDM type '[Edm.PropertyPath Nullable=True]' of kind 'Path' is not supported.");
        }
Esempio n. 5
0
        public void GetDefaultValue_NonNullableEntityCollection()
        {
            IEdmTypeReference           elementType          = new EdmEntityTypeReference(new EdmEntityType("NS", "Entity"), isNullable: true);
            IEdmCollectionTypeReference entityCollectionType = new EdmCollectionTypeReference(new EdmCollectionType(elementType));

            var result = EdmStructuredObject.GetDefaultValue(entityCollectionType);

            var entityCollectionObject = Assert.IsType <EdmEntityObjectCollection>(result);

            Assert.Equal(entityCollectionType, entityCollectionObject.GetEdmType(), new EdmTypeReferenceEqualityComparer());
        }
        /// <summary>
        /// Sets the property value and unwraps it from a DTO wrapper if necessary.
        /// </summary>
        public static bool TrySetPropertyValue <T>(this EdmStructuredObject targetObject, string propertyName, T value)
        {
            if (value != null)
            {
                object unwrappedValue;
                if (PropertyValueWrappingHelper.TryUnwrapEdmObject(value, out unwrappedValue))
                {
                    return(targetObject.TrySetPropertyValue(propertyName, unwrappedValue));
                }
            }

            return(targetObject.TrySetPropertyValue(propertyName, value));
        }
        private static void AssertObject(
            EdmStructuredObject edmEntityObject,
            string nameSet,
            string surnameSet,
            DateTime acceptanceDateSet,
            int versionExpected,
            string acceptanceTextSet)
        {
            object value = null;

            edmEntityObject.TryGetPropertyValue(TestModelBuilder.TestEntityName_NamePropertyName, out value);
            Assert.AreEqual(nameSet, value);

            edmEntityObject.TryGetPropertyValue(TestModelBuilder.TestEntityName_SurnamePropertyName, out value);
            Assert.AreEqual(surnameSet, value);

            object agreement = null;

            edmEntityObject.TryGetPropertyValue(TestModelBuilder.TestEntityName_AgreementsTypeName, out agreement);

            object marketingAgreementProperty = null;

            ((EdmStructuredObject)agreement).TryGetPropertyValue(TestModelBuilder.TestEntityName_AgreementsTypeName_MarketingagreementTypeName, out marketingAgreementProperty);

            ((EdmStructuredObject)marketingAgreementProperty).TryGetPropertyValue(TestModelBuilder.TestEntityName_AgreementsTypeName_MarketingagreementTypeName_AcceptanceDatePropertyName, out value);
            Assert.AreEqual(acceptanceDateSet, value);

            object acceptanceAgreementInfoProperty = null;

            ((EdmStructuredObject)marketingAgreementProperty).TryGetPropertyValue(TestModelBuilder.TestEntityName_AgreementsTypeName_MarketingagreementTypeName_AcceptedAgreementInfoTypeName, out acceptanceAgreementInfoProperty);

            ((EdmStructuredObject)acceptanceAgreementInfoProperty).TryGetPropertyValue(TestModelBuilder.TestEntityName_AgreementsTypeName_MarketingagreementTypeName_AcceptedAgreementInfoTypeName_VersionPropertyName, out value);
            Assert.AreEqual(versionExpected, value);
            ((EdmStructuredObject)acceptanceAgreementInfoProperty).TryGetPropertyValue(TestModelBuilder.TestEntityName_AgreementsTypeName_MarketingagreementTypeName_AcceptedAgreementInfoTypeName_TextPropertyName, out value);
            Assert.AreEqual(acceptanceTextSet, value);
        }
Esempio n. 8
0
        internal static void SetEntityPropertyValue(this DbDataReader reader, int fieldIndex, EdmStructuredObject entity)
        {
            string name = reader.GetName(fieldIndex);

            if (reader.IsDBNull(fieldIndex))
            {
                entity.TrySetPropertyValue(name, null);
                return;
            }
            if (reader.GetFieldType(fieldIndex) == typeof(DateTime))
            {
                entity.TrySetPropertyValue(name, new DateTimeOffset(reader.GetDateTime(fieldIndex)));
            }
            else
            {
                entity.TrySetPropertyValue(name, reader.GetValue(fieldIndex));
            }
        }
Esempio n. 9
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);
            }
        }
Esempio n. 10
0
 public void GetClrTypeForUntypedDelta(IEdmTypeReference edmType, Type expectedType)
 {
     // Arrange & Act & Assert
     Assert.Equal(expectedType, EdmStructuredObject.GetClrTypeForUntypedDelta(edmType));
 }
Esempio n. 11
0
 public void GetDefaultValue(IEdmTypeReference edmType, object expectedResult)
 {
     Assert.Equal(expectedResult, EdmStructuredObject.GetDefaultValue(edmType));
 }
Esempio n. 12
0
        /// <summary>
        /// Deserializes the given <paramref name="resourceWrapper"/> under the given <paramref name="readContext"/>.
        /// </summary>
        /// <param name="resourceWrapper">The OData resource to deserialize.</param>
        /// <param name="structuredType">The type of the resource to deserialize.</param>
        /// <param name="readContext">The deserializer context.</param>
        /// <returns>The deserialized resource.</returns>
        public virtual object ReadResource(ODataResourceWrapper resourceWrapper, IEdmStructuredTypeReference structuredType,
                                           ODataDeserializerContext readContext)
        {
            if (resourceWrapper == null)
            {
                throw Error.ArgumentNull("resourceWrapper");
            }

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

            if (!String.IsNullOrEmpty(resourceWrapper.Resource.TypeName) && structuredType.FullName() != resourceWrapper.Resource.TypeName)
            {
                // received a derived type in a base type deserializer. delegate it to the appropriate derived type deserializer.
                IEdmModel model = readContext.Model;

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

                IEdmStructuredType actualType = model.FindType(resourceWrapper.Resource.TypeName) as IEdmStructuredType;
                if (actualType == null)
                {
                    throw new ODataException(Error.Format(SRResources.ResourceTypeNotInModel, resourceWrapper.Resource.TypeName));
                }

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

                IEdmTypeReference actualStructuredType;
                IEdmEntityType    actualEntityType = actualType as IEdmEntityType;
                if (actualEntityType != null)
                {
                    actualStructuredType = new EdmEntityTypeReference(actualEntityType, isNullable: false);
                }
                else
                {
                    actualStructuredType = new EdmComplexTypeReference(actualType as IEdmComplexType, isNullable: false);
                }

                ODataEdmTypeDeserializer deserializer = DeserializerProvider.GetEdmTypeDeserializer(actualStructuredType);
                if (deserializer == null)
                {
                    throw new SerializationException(
                              Error.Format(SRResources.TypeCannotBeDeserialized, actualEntityType.FullName()));
                }

                object resource = deserializer.ReadInline(resourceWrapper, actualStructuredType, readContext);

                EdmStructuredObject structuredObject = resource as EdmStructuredObject;
                if (structuredObject != null)
                {
                    structuredObject.ExpectedEdmType = structuredType.StructuredDefinition();
                }

                return(resource);
            }
            else
            {
                object resource = CreateResourceInstance(structuredType, readContext);
                ApplyResourceProperties(resource, resourceWrapper, structuredType, readContext);
                return(resource);
            }
        }
Esempio n. 13
0
        internal static void SetEntityPropertyValue(this DbDataReader reader, int fieldIndex, EdmStructuredObject entity, bool lowerName = false)
        {
            string name = reader.GetName(fieldIndex);

            if (lowerName)
            {
                name = name.ToLower();
            }
            if (reader.IsDBNull(fieldIndex))
            {
                entity.TrySetPropertyValue(name, null);
                return;
            }
            var t = reader.GetFieldType(fieldIndex);

            entity.TryGetPropertyType(name, out Type et);
            if (t == typeof(DateTime))
            {
                entity.TrySetPropertyValue(name, new DateTimeOffset(reader.GetDateTime(fieldIndex)));
            }
            else if (et == typeof(bool?) || et == typeof(bool))
            {
                entity.TrySetPropertyValue(name, reader[fieldIndex].ToString() != "0");
            }
            else
            {
                entity.TrySetPropertyValue(name, reader.GetValue(fieldIndex));
            }
        }