示例#1
0
        internal static Deserializer CreateDeserializer(System.Data.Services.RequestDescription description, IDataService dataService, bool update, UpdateTracker tracker)
        {
            string   str;
            Encoding encoding;

            HttpProcessUtility.ReadContentType(dataService.OperationContext.Host.RequestContentType, out str, out encoding);
            if (DataServiceActionProviderWrapper.IsServiceActionRequest(description))
            {
                return(new ParameterDeserializer(update, dataService, tracker, description));
            }
            if ((description.TargetKind == RequestTargetKind.OpenPropertyValue) || (description.TargetKind == RequestTargetKind.PrimitiveValue))
            {
                return(new RawValueDeserializer(update, dataService, tracker, description));
            }
            if (description.TargetKind == RequestTargetKind.MediaResource)
            {
                return(new MediaResourceDeserializer(update, dataService, tracker, description));
            }
            if (((description.TargetKind == RequestTargetKind.Primitive) || (description.TargetKind == RequestTargetKind.ComplexObject)) || ((description.TargetKind == RequestTargetKind.Collection) || (description.TargetKind == RequestTargetKind.OpenProperty)))
            {
                return(new PropertyDeserializer(update, dataService, tracker, description));
            }
            if (description.LinkUri)
            {
                return(new EntityReferenceLinkDeserializer(update, dataService, tracker, description));
            }
            if (description.TargetKind != RequestTargetKind.Resource)
            {
                throw new DataServiceException(0x19f, System.Data.Services.Strings.RequestUriProcessor_MethodNotAllowed);
            }
            return(new EntityDeserializer(update, dataService, tracker, description));
        }
示例#2
0
 protected bool NeedNextPageLink(IEnumerator enumerator)
 {
     if (((this.CurrentContainer != null) && !DataServiceActionProviderWrapper.IsServiceActionRequest(this.RequestDescription)) && !this.RequestDescription.IsRequestForEnumServiceOperation)
     {
         if (this.IsCustomPaged)
         {
             this.currentSkipTokenForCustomPaging = this.service.PagingProvider.PagingProviderInterface.GetContinuationToken(BasicExpandProvider.ExpandedEnumeratorEx.UnwrapEnumerator(enumerator));
             return((this.currentSkipTokenForCustomPaging != null) && (this.currentSkipTokenForCustomPaging.Length > 0));
         }
         int pageSize = this.CurrentContainer.PageSize;
         if ((pageSize != 0) && (this.RequestDescription.ResponseVersion != System.Data.Services.RequestDescription.DataServiceDefaultResponseVersion))
         {
             if (this.segmentInfo.Count == 1)
             {
                 int?topQueryParameter = this.GetTopQueryParameter();
                 if (topQueryParameter.HasValue && (topQueryParameter.Value <= pageSize))
                 {
                     return(false);
                 }
             }
             return(this.segmentInfo.CurrentResultCount == pageSize);
         }
     }
     return(false);
 }
        public void Init()
        {
            this.entityType = new ResourceType(typeof(object), ResourceTypeKind.EntityType, null, "Fake.NS", "Type", false)
            {
                CanReflectOnInstanceType = false
            };
            this.entityType.AddProperty(new ResourceProperty("Id", ResourcePropertyKind.Key | ResourcePropertyKind.Primitive, ResourceType.GetPrimitiveResourceType(typeof(int)))
            {
                CanReflectOnInstanceTypeProperty = false
            });
            this.entityType.SetReadOnly();

            var resourceSet = new ResourceSet("Set", this.entityType);

            resourceSet.SetReadOnly();
            this.resourceSetWrapper = ResourceSetWrapper.CreateForTests(resourceSet);

            this.action = new ServiceAction("Fake", ResourceType.GetPrimitiveResourceType(typeof(int)), OperationParameterBindingKind.Sometimes, new[] { new ServiceActionParameter("p1", this.entityType) }, null);
            this.action.SetReadOnly();

            this.provider = new TestDataServiceProvider();

            this.actionProvider = DataServiceActionProviderWrapper.Create(this.provider, ODataProtocolVersion.V4, () => this.operationContext);
            var host = new DataServiceHostSimulator();

            this.operationContext = new DataServiceOperationContext(host);
            this.operationContext.InitializeAndCacheHeaders(new DataServiceSimulator());
        }
示例#4
0
 private string ComputeContainerName()
 {
     if (DataServiceActionProviderWrapper.IsServiceActionSegment(base.RequestDescription.LastSegmentInfo))
     {
         bool flag2;
         return(base.Provider.GetNameFromContainerQualifiedName(base.RequestDescription.ContainerName, out flag2));
     }
     return(base.RequestDescription.ContainerName);
 }
示例#5
0
        internal static RequestDescription ProcessQuery(IDataService service, RequestDescription description)
        {
            if ((service.OperationContext.Host.HttpVerb != HttpVerbs.GET) && (description.SegmentInfos[0].TargetSource != RequestTargetSource.ServiceOperation))
            {
                CheckV2EmptyQueryArguments(service);
            }
            if (((description.RequestExpression == null) || DataServiceActionProviderWrapper.IsServiceActionRequest(description)) || !typeof(IQueryable).IsAssignableFrom(description.RequestExpression.Type))
            {
                CheckEmptyQueryArguments(service, false);
                return(description);
            }
            RequestQueryProcessor processor = new RequestQueryProcessor(service, description);

            return(processor.ProcessQuery());
        }
示例#6
0
        private static DataServiceProviderWrapper CreateProviderWrapper(TestActionProvider actionProvider = null, Action <DataServiceProviderSimulator> addMetadata = null)
        {
            var provider = new DataServiceProviderSimulator();

            if (addMetadata != null)
            {
                addMetadata(provider);
            }

            var dataService = new DataServiceSimulatorWithGetService();

            dataService.Configuration      = new DataServiceConfiguration(provider);
            dataService.ProcessingPipeline = new DataServiceProcessingPipeline();
            dataService.Configuration.SetServiceActionAccessRule("*", ServiceActionRights.Invoke);
            dataService.Configuration.SetEntitySetAccessRule("*", EntitySetRights.All);
            dataService.Configuration.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
            dataService.Configuration.DataServiceBehavior.MaxProtocolVersion = ODataProtocolVersion.V4;

            dataService.OperationContext = new DataServiceOperationContext(false, new DataServiceHost2Simulator {
                AbsoluteRequestUri = new Uri("http://fake.org/$metadata")
            });
            dataService.OperationContext.InitializeAndCacheHeaders(dataService);

            DataServiceStaticConfiguration staticConfiguration = new DataServiceStaticConfiguration(dataService.Instance.GetType(), provider);
            IDataServiceProviderBehavior   providerBehavior    = DataServiceProviderBehavior.CustomDataServiceProviderBehavior;

            var providerWrapper = new DataServiceProviderWrapper(
                new DataServiceCacheItem(
                    dataService.Configuration,
                    staticConfiguration),
                provider,
                provider,
                dataService,
                false);

            dataService.Provider             = providerWrapper;
            providerWrapper.ProviderBehavior = providerBehavior;

            dataService.ActionProvider = DataServiceActionProviderWrapper.Create(dataService);
            if (actionProvider != null)
            {
                dataService.Providers.Add(typeof(IDataServiceActionProvider), actionProvider);
            }

            return(providerWrapper);
        }
示例#7
0
 protected void IncrementSegmentResultCount()
 {
     if (this.segmentInfo != null)
     {
         int maxResultsPerCollection = this.service.Configuration.MaxResultsPerCollection;
         if ((!this.IsCustomPaged && (this.CurrentContainer != null)) && (this.CurrentContainer.PageSize != 0))
         {
             maxResultsPerCollection = this.CurrentContainer.PageSize;
         }
         if ((maxResultsPerCollection != 0x7fffffff) || this.IsCustomPaged)
         {
             int num2 = this.segmentInfo.CurrentResultCount + 1;
             if ((num2 > maxResultsPerCollection) && !DataServiceActionProviderWrapper.IsServiceActionRequest(this.RequestDescription))
             {
                 throw DataServiceException.CreateBadRequestError(System.Data.Services.Strings.Serializer_ResultsExceedMax(maxResultsPerCollection));
             }
             this.segmentInfo.CurrentResultCount = num2;
         }
     }
 }
        /// <summary>Constructs a <see cref="MetadataProviderEdmModel"/> which wraps the given <see cref="DataServiceProviderWrapper"/> instance.</summary>
        /// <param name="provider"><see cref="DataServiceProviderWrapper"/> instance.</param>
        /// <param name="streamProviderWrapper">The stream provider wrapper instance.</param>
        /// <param name="actionProviderWrapper">The action provider wrapper instance.</param>
        internal MetadataProviderEdmModel(DataServiceProviderWrapper provider, DataServiceStreamProviderWrapper streamProviderWrapper, DataServiceActionProviderWrapper actionProviderWrapper)
        {
            Debug.Assert(provider != null, "provider != null");

            this.metadataProvider = provider;
            this.streamProviderWrapper = streamProviderWrapper;
            this.actionProviderWrapper = actionProviderWrapper;
            this.schemaTypeCache = new Dictionary<string, IEdmSchemaType>(StringComparer.Ordinal);
            this.resourceTypesPerNamespaceCache = new Dictionary<string, HashSet<ResourceType>>(StringComparer.Ordinal);
            this.entityContainerCache = new Dictionary<string, MetadataProviderEdmEntityContainer>(StringComparer.Ordinal);
            this.primitiveOrComplexCollectionTypeCache = new Dictionary<ResourceType, IEdmCollectionType>(EqualityComparer<ResourceType>.Default);
            this.entityPrimitiveOrComplexCollectionTypeCache = new Dictionary<ResourceType, IEdmCollectionType>(EqualityComparer<ResourceType>.Default);
            this.derivedTypeMappings = new Dictionary<IEdmStructuredType, List<IEdmStructuredType>>(EqualityComparer<IEdmStructuredType>.Default);
            this.associationSetByKeyCache = new Dictionary<string, string>(StringComparer.Ordinal);
            this.operationsQualifiedNameCache = new Dictionary<string, List<MetadataProviderEdmOperation>>(StringComparer.Ordinal);
            this.operationWrapperOperationLookUp = new Dictionary<OperationWrapper, IEdmOperation>(EqualityComparer<OperationWrapper>.Default);

            // In the model, set the data service version and the edm version based on the MPV (this is the best estimate we have at this time). 
            // This helps to set the nullability facet correctly when resolving type references. Note that, when the model is serialized for $metadata requests 
            // in MetadataSerializer.WriteMetadataDocument, the DSV and the edm version on the model will be overwritten with the value computed by walking the 
            // resource model.
            Version odataVersion = this.metadataProvider.Configuration.DataServiceBehavior.MaxProtocolVersion.ToVersion();
            Version edmVersion = null;
            if (!MetadataProviderUtils.DataServiceEdmVersionMap.TryGetValue(odataVersion, out edmVersion))
            {
                this.SetEdmVersion(Microsoft.OData.Edm.Library.EdmConstants.EdmVersionLatest);
            }
            else
            {
                this.SetEdmVersion(edmVersion);
            }

            // Initialize the minimum Edm Metadata Version to 4.0.
            this.MinMetadataEdmSchemaVersion = Microsoft.OData.Edm.Library.EdmConstants.EdmVersion4;

            this.AnnotationsCache = new VocabularyAnnotationCache(this);
        }
        private static IEdmEntityType CreateModelAndGetEdmType(ResourceType resourceType)
        {
            var provider = new DataServiceProviderSimulator();
            DataServiceSimulator dataService = new DataServiceSimulator();

            DataServiceStaticConfiguration staticConfiguration = new DataServiceStaticConfiguration(dataService.Instance.GetType(), provider);
            IDataServiceProviderBehavior   providerBehavior    = DataServiceProviderBehavior.CustomDataServiceProviderBehavior;

            DataServiceProviderWrapper providerWrapper = new DataServiceProviderWrapper(
                new DataServiceCacheItem(
                    new DataServiceConfiguration(provider),
                    staticConfiguration),
                provider,
                provider,
                dataService,
                false);

            dataService.Provider = providerWrapper;
            var model = new MetadataProviderEdmModel(providerWrapper, new DataServiceStreamProviderWrapper(dataService), DataServiceActionProviderWrapper.Create(dataService));

            dataService.ProcessingPipeline          = new DataServiceProcessingPipeline();
            model.MetadataProvider.ProviderBehavior = providerBehavior;

            var edmType = model.EnsureSchemaType(resourceType) as IEdmEntityType;

            return(edmType);
        }
        private static MetadataProviderEdmModel CreateMetadataProviderEdmModel(DataServiceProviderSimulator metadataProvider, IDataServiceActionProvider actionProvider = null)
        {
            var dataServiceSimulator = new DataServiceSimulatorWithGetService {
                OperationContext = new DataServiceOperationContext(false, new DataServiceHost2Simulator()), ProcessingPipeline = new DataServiceProcessingPipeline()
            };

            dataServiceSimulator.OperationContext.InitializeAndCacheHeaders(dataServiceSimulator);

            var dataServiceConfiguration = new DataServiceConfiguration(metadataProvider);

            dataServiceConfiguration.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
            dataServiceConfiguration.SetServiceActionAccessRule("*", ServiceActionRights.Invoke);
            dataServiceConfiguration.DataServiceBehavior.MaxProtocolVersion = ODataProtocolVersion.V4;

            if (actionProvider != null)
            {
                dataServiceSimulator.Providers.Add(typeof(IDataServiceActionProvider), actionProvider);
            }

            DataServiceStaticConfiguration staticConfiguration = new DataServiceStaticConfiguration(dataServiceSimulator.Instance.GetType(), metadataProvider);
            IDataServiceProviderBehavior   providerBehavior    = DataServiceProviderBehavior.CustomDataServiceProviderBehavior;

            DataServiceProviderWrapper providerWrapper = new DataServiceProviderWrapper(
                new DataServiceCacheItem(
                    dataServiceConfiguration,
                    staticConfiguration),
                metadataProvider,
                metadataProvider,
                dataServiceSimulator,
                false);

            dataServiceSimulator.Provider = providerWrapper;

            var model = new MetadataProviderEdmModel(providerWrapper, new DataServiceStreamProviderWrapper(dataServiceSimulator), DataServiceActionProviderWrapper.Create(dataServiceSimulator));

            model.MetadataProvider.ProviderBehavior = providerBehavior;
            return(model);
        }
示例#11
0
        private void InitWithQueryOptions(string selectQueryOption, string expandQueryOption)
        {
            string queryOption = string.Empty;

            if (selectQueryOption != null && expandQueryOption != null)
            {
                queryOption = "?$select=" + selectQueryOption + "&$expand=" + expandQueryOption;
            }
            else if (selectQueryOption != null)
            {
                queryOption = "?$select=" + selectQueryOption;
            }
            else
            {
                queryOption = "?$expand=" + expandQueryOption;
            }

            this.host = new DataServiceHostSimulator
            {
                AbsoluteRequestUri = new Uri("http://fake.org/FakeSet" + queryOption),
                AbsoluteServiceUri = new Uri("http://fake.org/"),
                RequestHttpMethod  = "GET",
                RequestVersion     = "2.0",
            };

            if (selectQueryOption != null)
            {
                this.host.SetQueryStringItem("$select", selectQueryOption);
            }

            if (expandQueryOption != null)
            {
                this.host.SetQueryStringItem("$expand", expandQueryOption);
            }

            DataServiceProviderSimulator provider = new DataServiceProviderSimulator
            {
                ContainerName      = "SelectTestContainer",
                ContainerNamespace = "SelectTestNamespace"
            };

            var resourceType = new ResourceType(typeof(object), ResourceTypeKind.EntityType, null, "SelectTestNamespace", "Fake", false)
            {
                CanReflectOnInstanceType = false, IsOpenType = true
            };

            resourceType.AddProperty(new ResourceProperty("Id", ResourcePropertyKind.Key | ResourcePropertyKind.Primitive, ResourceType.GetPrimitiveResourceType(typeof(int)))
            {
                CanReflectOnInstanceTypeProperty = false
            });
            var resourceSet = new ResourceSet("FakeSet", resourceType);

            resourceSet.SetReadOnly();

            provider.AddResourceSet(resourceSet);

            DataServiceConfiguration configuration = new DataServiceConfiguration(provider);

            configuration.SetEntitySetAccessRule("*", EntitySetRights.All);
            this.service = new DataServiceSimulator
            {
                OperationContext = new DataServiceOperationContext(this.host),
                Configuration    = configuration,
            };

            DataServiceStaticConfiguration staticConfiguration = new DataServiceStaticConfiguration(this.service.Instance.GetType(), provider);
            IDataServiceProviderBehavior   providerBehavior    = DataServiceProviderBehavior.CustomDataServiceProviderBehavior;

            this.service.Provider = new DataServiceProviderWrapper(
                new DataServiceCacheItem(
                    configuration,
                    staticConfiguration),
                provider,
                provider,
                this.service,
                false);

            this.service.ProcessingPipeline        = new DataServiceProcessingPipeline();
            this.service.Provider.ProviderBehavior = providerBehavior;
            this.service.ActionProvider            = DataServiceActionProviderWrapper.Create(this.service);
            this.service.OperationContext.InitializeAndCacheHeaders(service);
        }
示例#12
0
        private static DataServiceProviderWrapper CreateProvider(out DataServiceConfiguration config, out DataServiceOperationContext operationContext)
        {
            var baseUri = new Uri("http://localhost");
            var host    = new DataServiceHostSimulator()
            {
                AbsoluteServiceUri = baseUri,
                AbsoluteRequestUri = new Uri(baseUri.AbsoluteUri + "/$metadata", UriKind.Absolute),
                RequestHttpMethod  = "GET",
                RequestAccept      = "application/xml+atom",
                RequestVersion     = "4.0",
                RequestMaxVersion  = "4.0",
            };

            operationContext = new DataServiceOperationContext(host);
            var dataService = new DataServiceSimulator()
            {
                OperationContext = operationContext
            };

            operationContext.InitializeAndCacheHeaders(dataService);

            DataServiceProviderSimulator providerSimulator = new DataServiceProviderSimulator();

            providerSimulator.ContainerNamespace = "MyModel";
            providerSimulator.ContainerName      = "CustomersContainer";

            ResourceType customerEntityType = new ResourceType(
                typeof(object), ResourceTypeKind.EntityType, null, "MyModel", "Customer", false)
            {
                CanReflectOnInstanceType = false
            };

            ResourcePropertyKind idPropertyKind = ResourcePropertyKind.Primitive | ResourcePropertyKind.Key;
            ResourceProperty     idProperty     = new ResourceProperty(
                "Id", idPropertyKind, ResourceType.GetPrimitiveResourceType(typeof(int)))
            {
                CanReflectOnInstanceTypeProperty = false
            };

            customerEntityType.AddProperty(idProperty);

            ResourcePropertyKind firstNamePropertyKind = ResourcePropertyKind.Primitive | ResourcePropertyKind.Key;
            ResourceProperty     firstNameProperty     = new ResourceProperty(
                "FirstName", firstNamePropertyKind, ResourceType.GetPrimitiveResourceType(typeof(string)))
            {
                CanReflectOnInstanceTypeProperty = false
            };

            customerEntityType.AddProperty(firstNameProperty);

            customerEntityType.SetReadOnly();
            providerSimulator.AddResourceType(customerEntityType);

            ResourceSet customerSet = new ResourceSet("Customers", customerEntityType);

            customerSet.SetReadOnly();
            providerSimulator.AddResourceSet(customerSet);

            config = new DataServiceConfiguration(providerSimulator);
            config.SetEntitySetAccessRule("*", EntitySetRights.All);
            config.DataServiceBehavior.MaxProtocolVersion = ODataProtocolVersion.V4;

            IDataServiceProviderBehavior   providerBehavior = DataServiceProviderBehavior.CustomDataServiceProviderBehavior;
            DataServiceStaticConfiguration staticConfig     = new DataServiceStaticConfiguration(dataService.Instance.GetType(), providerSimulator);

            DataServiceProviderWrapper provider = new DataServiceProviderWrapper(
                new DataServiceCacheItem(config, staticConfig), providerSimulator, providerSimulator, dataService, false);

            dataService.ProcessingPipeline = new DataServiceProcessingPipeline();
            dataService.Provider           = provider;
            provider.ProviderBehavior      = providerBehavior;
            dataService.ActionProvider     = DataServiceActionProviderWrapper.Create(dataService);
#if DEBUG
            dataService.ProcessingPipeline.SkipDebugAssert = true;
#endif
            operationContext.RequestMessage.InitializeRequestVersionHeaders(VersionUtil.ToVersion(config.DataServiceBehavior.MaxProtocolVersion));
            return(provider);
        }
示例#13
0
        /// <summary>
        /// TODO: Refactor this into a factory pattern, if needed
        /// </summary>
        /// <returns>IDataService</returns>
        public IDataService CreateService <T>() where T : DataServiceSimulator, new()
        {
            T dataService = new T();

            //
            // Operation Context
            //
            DataServiceOperationContext operationContext = new DataServiceOperationContext(host);

            operationContext.InitializeAndCacheHeaders(dataService);

            //
            // Configuration
            //
            DataServiceConfiguration config = new DataServiceConfiguration(provider);

            config.SetEntitySetAccessRule("*", EntitySetRights.All);
            config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
            config.SetServiceActionAccessRule("*", ServiceActionRights.Invoke);
            config.DataServiceBehavior.AcceptAnyAllRequests              = this.behavior.AcceptAnyAllRequests;
            config.DataServiceBehavior.AcceptCountRequests               = this.behavior.AcceptCountRequests;
            config.DataServiceBehavior.AcceptProjectionRequests          = this.behavior.AcceptProjectionRequests;
            config.DataServiceBehavior.AcceptSpatialLiteralsInQuery      = this.behavior.AcceptSpatialLiteralsInQuery;
            config.DataServiceBehavior.IncludeAssociationLinksInResponse = this.behavior.IncludeAssociationLinksInResponse;
            config.DataServiceBehavior.InvokeInterceptorsOnLinkDelete    = this.behavior.InvokeInterceptorsOnLinkDelete;
            config.DataServiceBehavior.MaxProtocolVersion = this.behavior.MaxProtocolVersion;
            config.DataServiceBehavior.UseMetadataKeyOrderForBuiltInProviders = this.behavior.UseMetadataKeyOrderForBuiltInProviders;

            DataServiceStaticConfiguration staticConfiguration = new DataServiceStaticConfiguration(dataService.Instance.GetType(), provider);
            IDataServiceProviderBehavior   providerBehavior    = DataServiceProviderBehavior.CustomDataServiceProviderBehavior;

            var providerWrapper = new DataServiceProviderWrapper(
                new DataServiceCacheItem(
                    config,
                    staticConfiguration),
                provider,
                provider,
                dataService,
                false);

            dataService.ProcessingPipeline   = new DataServiceProcessingPipeline();
            dataService.Provider             = providerWrapper;
            providerWrapper.ProviderBehavior = providerBehavior;

            //
            // Service
            //
            operationContext.RequestMessage.InitializeRequestVersionHeaders(config.DataServiceBehavior.MaxProtocolVersion.ToVersion());
            var pipeline = new DataServiceProcessingPipeline();

#if DEBUG
            pipeline.SkipDebugAssert = true;
#endif
            dataService.OperationContext   = operationContext;
            dataService.Provider           = providerWrapper;
            dataService.ProcessingPipeline = pipeline;
            dataService.Configuration      = config;
            dataService.StreamProvider     = new DataServiceStreamProviderWrapper(dataService);
            dataService.ActionProvider     = DataServiceActionProviderWrapper.Create(dataService);
            return(dataService);
        }