Example #1
0
        private OeEntityItem ReadEntityFromUrl(OeMessageContext context)
        {
            var parser = new ODataUriParser(context.Model, context.BaseUri, RequestUrl);

            ODataPath path       = parser.ParsePath();
            var       keySegment = (KeySegment)path.LastSegment;
            var       entityType = (IEdmEntityType)keySegment.EdmType;
            var       entitySet  = (IEdmEntitySet)keySegment.NavigationSource;

            var properties = new List <ODataProperty>(1);

            foreach (var key in keySegment.Keys)
            {
                properties.Add(new ODataProperty()
                {
                    Name = key.Key, Value = key.Value
                });
            }
            var entry = new ODataResource()
            {
                Properties = properties
            };

            Db.OeEntitySetMetaAdapter entitySetMetaAdapter = context.EntitySetMetaAdapters.FindByEntitySetName(entitySet.Name);
            return(new OeEntityItem(entitySet, entityType, entitySetMetaAdapter.EntityType, entry));
        }
Example #2
0
        private OeEntityItem ReadEntityFromStream(OeMessageContext context, Stream content)
        {
            var                     parser = new ODataUriParser(context.Model, context.BaseUri, RequestUrl);
            IEdmEntitySet           entitySet;
            IEdmEntityTypeReference entityTypeRef = GetEdmEntityTypeRef(parser.ParsePath(), out entitySet);
            var                     entityType    = (IEdmEntityType)entityTypeRef.Definition;

            ODataResource        entry          = null;
            IODataRequestMessage requestMessage = new OeInMemoryMessage(content, ContentType);
            var settings = new ODataMessageReaderSettings {
                EnableMessageStreamDisposal = false
            };

            using (var messageReader = new ODataMessageReader(requestMessage, settings, context.Model))
            {
                ODataReader reader = messageReader.CreateODataResourceReader(entitySet, entityType);

                while (reader.Read())
                {
                    if (reader.State == ODataReaderState.ResourceEnd)
                    {
                        entry = (ODataResource)reader.Item;
                    }
                }
                if (entry == null)
                {
                    throw new InvalidOperationException("operation not contain entry");
                }
            }

            Db.OeEntitySetMetaAdapter entitySetMetaAdapter = context.EntitySetMetaAdapters.FindByEntitySetName(entitySet.Name);
            return(new OeEntityItem(entitySet, entityType, entitySetMetaAdapter.EntityType, entry));
        }
Example #3
0
        public static OeOperationMessage Create(OeMessageContext context, ODataBatchReader reader)
        {
            ODataBatchOperationRequestMessage batchRequest = reader.CreateOperationRequestMessage();
            var operation = new OeOperationMessage(batchRequest);

            if (batchRequest.Method == ODataConstants.MethodDelete)
            {
                operation.EntityItem = operation.ReadEntityFromUrl(context);
            }
            else
            {
                using (Stream stream = batchRequest.GetStream())
                    operation.EntityItem = operation.ReadEntityFromStream(context, stream);
            }
            return(operation);
        }
        public async Task ExecuteAsync(Stream requestStream, Stream responseStream, String contentType, CancellationToken cancellationToken)
        {
            var            context      = new OeMessageContext(_baseUri, _model, _dataAdapter.EntitySetMetaAdapters);
            OeBatchMessage batchMessage = OeBatchMessage.CreateBatchMessage(context, requestStream, contentType);

            if (batchMessage.Changeset != null)
            {
                await ExecuteChangeset(batchMessage.Changeset, cancellationToken).ConfigureAwait(false);
            }
            else if (batchMessage.Operation != null)
            {
                await ExecuteOperation(batchMessage.Operation, cancellationToken).ConfigureAwait(false);
            }

            var batchWriter = new Writers.OeBatchWriter(context.BaseUri, context.Model);

            batchWriter.Write(responseStream, batchMessage);
        }
        public static OeBatchMessage CreateBatchMessage(OeMessageContext context, Stream requestStream, String contentType)
        {
            IODataRequestMessage requestMessage = new OeInMemoryMessage(requestStream, contentType);
            var settings = new ODataMessageReaderSettings()
            {
                EnableMessageStreamDisposal = false
            };

            using (var messageReader = new ODataMessageReader(requestMessage, settings))
            {
                var batchMessage             = new List <OeBatchMessage>();
                ODataBatchReader batchReader = messageReader.CreateODataBatchReader();
                while (batchReader.Read())
                {
                    if (batchReader.State == ODataBatchReaderState.ChangesetStart)
                    {
                        var operations = new List <OeOperationMessage>();
                        while (batchReader.Read() && batchReader.State != ODataBatchReaderState.ChangesetEnd)
                        {
                            if (batchReader.State == ODataBatchReaderState.Operation)
                            {
                                OeOperationMessage operation = OeOperationMessage.Create(context, batchReader);
                                operations.Add(operation);
                            }
                        }
                        return(new OeBatchMessage(contentType, operations));
                    }
                    else if (batchReader.State == ODataBatchReaderState.Operation)
                    {
                        OeOperationMessage operation = OeOperationMessage.Create(context, batchReader);
                        return(new OeBatchMessage(contentType, operation));
                    }
                }
            }

            throw new InvalidOperationException("batch not found");
        }
        protected virtual async Task BatchCore()
        {
            var actionDescriptors    = GetService <IActionDescriptorCollectionProvider>().ActionDescriptors;
            var actionInvokerFactory = GetService <IActionInvokerFactory>();

            String[] apiSegments = base.HttpContext.Request.Path.Value.Split(new[] { '/' }, 2, StringSplitOptions.RemoveEmptyEntries);
            Uri      baseUri     = UriHelper.GetBaseUri(base.Request);

            var            messageContext = new OeMessageContext(baseUri, EdmModel, DataAdapter.EntitySetMetaAdapters);
            OeBatchMessage batchMessage   = OeBatchMessage.CreateBatchMessage(messageContext, base.HttpContext.Request.Body, base.HttpContext.Request.ContentType);

            Object dataContext = null;

            try
            {
                dataContext = DataAdapter.CreateDataContext();

                foreach (OeOperationMessage operation in batchMessage.Changeset)
                {
                    OeEntitySetAdapter entitySetAdapter = DataAdapter.GetEntitySetAdapter(operation.EntityItem.EntitySet.Name);

                    var segments = new String[apiSegments.Length];
                    Array.Copy(apiSegments, segments, 1);
                    segments[apiSegments.Length - 1] = entitySetAdapter.EntitySetMetaAdapter.EntitySetName;

                    var candidates = OeRouter.SelectCandidates(actionDescriptors.Items, segments, operation.Method);
                    if (candidates.Count > 1)
                    {
                        throw new AmbiguousActionException(String.Join(Environment.NewLine, candidates.Select(c => c.DisplayName)));
                    }
                    if (candidates.Count == 0)
                    {
                        throw new InvalidOperationException("Action " + operation.Method + " for controller " + segments.Last() + " not found");
                    }

                    var modelState = new OeFilterAttribute.BatchModelStateDictionary()
                    {
                        Entity      = operation.EntityItem.Entity,
                        DataContext = new OeDataContext(ref entitySetAdapter, dataContext, operation)
                    };
                    OnBeforeInvokeController(modelState.DataContext, operation.EntityItem);

                    var            actionContext = new ActionContext(base.HttpContext, base.HttpContext.GetRouteData(), candidates[0], modelState);
                    IActionInvoker actionInvoker = actionInvokerFactory.CreateInvoker(actionContext);
                    await actionInvoker.InvokeAsync();
                }

                await SaveChangesAsync(dataContext).ConfigureAwait(false);
            }
            finally
            {
                if (dataContext != null)
                {
                    DataAdapter.CloseDataContext(dataContext);
                }
            }

            base.HttpContext.Response.ContentType = base.HttpContext.Request.ContentType;
            var batchWriter = new OeBatchWriter(baseUri, EdmModel);

            batchWriter.Write(base.HttpContext.Response.Body, batchMessage);
        }