Example #1
0
        /// <summary>
        /// Calculates the DataServiceVersion for a particular EntityDescriptor
        /// </summary>
        /// <param name="entityDescriptorData">Entity Descriptor Data</param>
        /// <param name="maxProtocolVersion">The client's max protocol version</param>
        /// <returns>A Data service protocol version</returns>
        public DataServiceProtocolVersion CalculateDataServiceVersion(EntityDescriptorData entityDescriptorData, DataServiceProtocolVersion maxProtocolVersion)
        {
            ExceptionUtilities.CheckArgumentNotNull(entityDescriptorData, "entityDescriptorData");

            Type       entityType     = entityDescriptorData.Entity.GetType();
            EntityType testEntityType = this.entityModelSchema.EntityTypes.Single(et => et.FullName == entityType.FullName);

            // Calculate expected version based on type's feed mappings.
            DataServiceProtocolVersion expectedVersion = VersionHelper.CalculateEntityPropertyMappingProtocolVersion(testEntityType, VersionCalculationType.Response, MimeTypes.ApplicationAtomXml, maxProtocolVersion, maxProtocolVersion);

            // Commenting out this code pending a quick versioning discussion with pratikp and ahmed
            // Cannot check in as with code it breaks BVT's, want to get this in and update pending discussion 12-7-10
            // if (testEntityType.AllProperties.Any(p => p.IsStream()))
            // {
            //    expectedVersion = VersionHelper.IncreaseVersionIfRequired(expectedVersion, DataServiceProtocolVersion.V4);
            // }
            // If there are bag properties then its at least v3
            if (testEntityType.HasMultiValue(true) ||
                testEntityType.HasSpatialProperties())
            {
                expectedVersion = VersionHelper.IncreaseVersionIfRequired(expectedVersion, DataServiceProtocolVersion.V4);
            }

            return(expectedVersion);
        }
        /// <summary>
        /// Visits an EntityInstance and determines the version of it
        /// </summary>
        /// <param name="payloadElement">EntityInstance payload</param>
        public override void Visit(EntityInstance payloadElement)
        {
            ExceptionUtilities.CheckArgumentNotNull(payloadElement, "payloadElement");

            EntitySetAnnotation entitySetAnnotation = payloadElement.Annotations.OfType <EntitySetAnnotation>().SingleOrDefault();

            // skip when payloadElement.IsNull since null EntityInstance does not have FullType name and we don't need to increase version for null EntityInstance
            if (entitySetAnnotation != null && !payloadElement.IsNull)
            {
                var entitySet  = entitySetAnnotation.EntitySet;
                var entityType = entitySet.Container.Model.EntityTypes.Single(t => t.IsKindOf(entitySet.EntityType) && t.FullName == payloadElement.FullTypeName);

                this.IncreaseVersionIfRequired(entityType.CalculateProtocolVersion(this.responseContentType, VersionCalculationType.Response, this.currentMaxProtocolVersion, this.currentMaxDataServiceVersion));

                if (payloadElement.Annotations.OfType <XmlTreeAnnotation>().Any())
                {
                    var epmVersion = VersionHelper.CalculateEntityPropertyMappingProtocolVersion(entityType, VersionCalculationType.Response, this.responseContentType, this.currentMaxProtocolVersion, this.currentMaxDataServiceVersion);
                    this.IncreaseVersionIfRequired(epmVersion);
                }
            }

            base.Visit(payloadElement);
        }
        public DataServiceProtocolVersion CalculateProtocolVersion(EntityModelSchema entityModelSchema)
        {
            ExceptionUtilities.CheckArgumentNotNull(entityModelSchema, "entityModelSchema");

            DataServiceProtocolVersion expectedDataServiceVersion = DataServiceProtocolVersion.V4;

            foreach (EntityType t in entityModelSchema.EntityTypes)
            {
                var entityTypeVersion = VersionHelper.CalculateDataTypeVersion(DataTypes.EntityType.WithDefinition(t));
                expectedDataServiceVersion = VersionHelper.IncreaseVersionIfRequired(expectedDataServiceVersion, entityTypeVersion);
                expectedDataServiceVersion = VersionHelper.IncreaseVersionIfRequired(expectedDataServiceVersion, VersionHelper.CalculateEntityPropertyMappingProtocolVersion(t, VersionCalculationType.Metadata, MimeTypes.ApplicationXml, VersionHelper.LatestProtocolVersion, VersionHelper.LatestProtocolVersion));
            }

            if (entityModelSchema.Functions.Any(f => f.IsAction()))
            {
                expectedDataServiceVersion = VersionHelper.IncreaseVersionIfRequired(expectedDataServiceVersion, DataServiceProtocolVersion.V4);
            }

            return(expectedDataServiceVersion);
        }