Esempio n. 1
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));
        }
Esempio n. 2
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));
        }
        public virtual IEnumerable Read(Stream response)
        {
            String entitySetName = GetEntitSetName(response);

            response.Position = 0;
            Db.OeEntitySetMetaAdapter entitySetMetaAdatpter = EntitySetMetaAdapters.FindByEntitySetName(entitySetName);
            return(ReadImpl(response, entitySetMetaAdatpter));
        }
Esempio n. 4
0
        public override IEnumerable Read(Stream response)
        {
            String entitySetName = ResponseReader.GetEntitSetName(response);

            response.Position = 0;
            Db.OeEntitySetMetaAdapter entitySetMetaAdatpter = base.EntitySetMetaAdapters.FindByEntitySetName(entitySetName);
            return(base.ReadImpl(response, entitySetMetaAdatpter));
        }
Esempio n. 5
0
        private OeEntryFactory CreateEntryFactory(OeExpressionBuilder expressionBuilder)
        {
            IEdmEntitySet entitySet = EntitySet;

            if (expressionBuilder.EntityType != EntitySetAdapter.EntityType)
            {
                String                    typeName             = expressionBuilder.EntityType.FullName;
                Db.OeDataAdapter          dataAdapter          = EntitySetAdapter.DataAdapter;
                Db.OeEntitySetMetaAdapter entitySetMetaAdapter = dataAdapter.EntitySetMetaAdapters.FindByTypeName(typeName);
                if (entitySetMetaAdapter != null)
                {
                    entitySet = EdmModel.FindDeclaredEntitySet(entitySetMetaAdapter.EntitySetName);
                }
            }
            return(expressionBuilder.CreateEntryFactory(entitySet));
        }
Esempio n. 6
0
        private IEnumerable <T> ReadFeedImpl <T>(Stream response, Db.OeEntitySetMetaAdapter entitySetMetaAdatpter)
        {
            IODataRequestMessage responseMessage = new OeInMemoryMessage(response, null);
            var settings = new ODataMessageReaderSettings()
            {
                EnableMessageStreamDisposal = false
            };
            var messageReader = new ODataMessageReader(responseMessage, settings, _edmModel);

            IEdmEntitySet entitySet = _edmModel.EntityContainer.FindEntitySet(entitySetMetaAdatpter.EntitySetName);
            ODataReader   reader    = messageReader.CreateODataResourceSetReader(entitySet, entitySet.EntityType());

            var stack = new Stack <StackItem>();

            while (reader.Read())
            {
                switch (reader.State)
                {
                case ODataReaderState.ResourceStart:
                    stack.Push(new StackItem((ODataResource)reader.Item));
                    break;

                case ODataReaderState.ResourceEnd:
                    StackItem stackItem = stack.Pop();

                    Object entity = CreateEntity(stackItem);
                    if (stack.Count == 0)
                    {
                        yield return((T)entity);
                    }
                    else
                    {
                        stack.Peek().AddEntry(entity);
                    }
                    break;

                case ODataReaderState.NestedResourceInfoStart:
                    stack.Push(new StackItem((ODataNestedResourceInfo)reader.Item));
                    break;

                case ODataReaderState.NestedResourceInfoEnd:
                    StackItem item = stack.Pop();
                    stack.Peek().AddLink((ODataNestedResourceInfo)item.Item, item.Value);
                    break;
                }
            }
        }
Esempio n. 7
0
        public IEnumerable ReadFeed(Stream response)
        {
            String entitySetName = GetEntitSetName(response);

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

            response.Position = 0;
            Db.OeEntitySetMetaAdapter entitySetMetaAdatpter = _entitySetMetaAdapters.FindByEntitySetName(entitySetName);

            Delegate   func        = (Func <Stream, Db.OeEntitySetMetaAdapter, IEnumerable <Object> >)ReadFeedImpl <Object>;
            MethodInfo genericDef  = func.GetMethodInfo().GetGenericMethodDefinition();
            MethodInfo genericFunc = genericDef.MakeGenericMethod(entitySetMetaAdatpter.EntityType);

            return((IEnumerable)genericFunc.Invoke(this, new Object[] { response, entitySetMetaAdatpter }));
        }
Esempio n. 8
0
        private OeEntryFactory CreateEntryFactory(OeExpressionBuilder expressionBuilder)
        {
            IEdmEntitySetBase entitySet = EntitySet;

            if (expressionBuilder.EntityType != EntitySetAdapter.EntityType)
            {
                String                    typeName             = expressionBuilder.EntityType.FullName;
                Db.OeDataAdapter          dataAdapter          = EntitySetAdapter.DataAdapter;
                Db.OeEntitySetMetaAdapter entitySetMetaAdapter = dataAdapter.EntitySetMetaAdapters.FindByTypeName(typeName);
                if (entitySetMetaAdapter != null)
                {
                    entitySet = EdmModel.FindDeclaredEntitySet(entitySetMetaAdapter.EntitySetName);
                }
            }

            OeEntryFactory entryFactory = expressionBuilder.CreateEntryFactory(entitySet);

            entryFactory.CountOption = ODataUri.QueryCount;
            return(entryFactory);
        }
        protected Object CreateEntity(ODataResource resource, IReadOnlyList <NavigationPorperty> navigationProperties)
        {
            Db.OeEntitySetMetaAdapter entitySetMetaAdapter = EntitySetMetaAdapters.FindByTypeName(resource.TypeName);
            Object entity = OeEntityItem.CreateEntity(entitySetMetaAdapter.EntityType, resource);
            Dictionary <PropertyInfo, ODataResourceSetBase> propertyInfos = null;

            foreach (NavigationPorperty navigationProperty in navigationProperties)
            {
                PropertyInfo clrProperty = entitySetMetaAdapter.EntityType.GetProperty(navigationProperty.Name);
                Object       value       = navigationProperty.Value;

                if (navigationProperty.ResourceSet == null || (navigationProperty.ResourceSet.Count == null && navigationProperty.ResourceSet.NextPageLink == null))
                {
                    clrProperty.SetValue(entity, value);
                    continue;
                }

                if (value == null && navigationProperty.ResourceSet.NextPageLink != null)
                {
                    value = CreateCollection(clrProperty.PropertyType);
                }

                clrProperty.SetValue(entity, value);
                if (value is IEnumerable collection)
                {
                    NavigationProperties.Add(collection, navigationProperty.ResourceSet);

                    if (propertyInfos == null)
                    {
                        propertyInfos = new Dictionary <PropertyInfo, ODataResourceSetBase>(navigationProperties.Count);
                        NavigationPropertyEntities.Add(entity, propertyInfos);
                    }
                    propertyInfos.Add(clrProperty, navigationProperty.ResourceSet);
                }
            }

            return(entity);
        }
Esempio n. 10
0
 public IEnumerable <T> ReadFeed <T>(Stream response)
 {
     Db.OeEntitySetMetaAdapter entitySetMetaAdatpter = _entitySetMetaAdapters.FindByClrType(typeof(T));
     return(ReadFeedImpl <T>(response, entitySetMetaAdatpter));
 }
        protected IEnumerable ReadImpl(Stream response, Db.OeEntitySetMetaAdapter entitySetMetaAdatpter)
        {
            ResourceSet = null;
            NavigationProperties.Clear();
            NavigationPropertyEntities.Clear();

            IODataResponseMessage responseMessage = new OeInMemoryMessage(response, null);
            var settings = new ODataMessageReaderSettings()
            {
                EnableMessageStreamDisposal = false, Validations = ValidationKinds.None
            };
            var messageReader = new ODataMessageReader(responseMessage, settings, EdmModel);

            IEdmEntitySet entitySet = EdmModel.EntityContainer.FindEntitySet(entitySetMetaAdatpter.EntitySetName);
            ODataReader   reader    = messageReader.CreateODataResourceSetReader(entitySet, entitySet.EntityType());

            var stack = new Stack <StackItem>();

            while (reader.Read())
            {
                switch (reader.State)
                {
                case ODataReaderState.ResourceSetStart:
                    if (stack.Count == 0)
                    {
                        ResourceSet = (ODataResourceSetBase)reader.Item;
                    }
                    else
                    {
                        stack.Peek().ResourceSet = (ODataResourceSetBase)reader.Item;
                    }
                    break;

                case ODataReaderState.ResourceStart:
                    stack.Push(new StackItem((ODataResource)reader.Item));
                    break;

                case ODataReaderState.ResourceEnd:
                    StackItem stackItem = stack.Pop();

                    if (reader.Item != null)
                    {
                        if (stack.Count == 0)
                        {
                            yield return(CreateRootEntity((ODataResource)stackItem.Item, stackItem.NavigationProperties, entitySetMetaAdatpter.EntityType));
                        }
                        else
                        {
                            stack.Peek().AddEntry(CreateEntity((ODataResource)stackItem.Item, stackItem.NavigationProperties));
                        }
                    }
                    break;

                case ODataReaderState.NestedResourceInfoStart:
                    stack.Push(new StackItem((ODataNestedResourceInfo)reader.Item));
                    break;

                case ODataReaderState.NestedResourceInfoEnd:
                    StackItem item = stack.Pop();
                    stack.Peek().AddLink((ODataNestedResourceInfo)item.Item, item.Value, item.ResourceSet);
                    break;
                }
            }
        }