Beispiel #1
0
        internal virtual void Initialize(Entity entity)
        {
            //// TODO: Think about currating the resulting data set against i.e. ontology to trim unnecessary proxy property values.
            var context = new EntityInitializationContext();

            InitializeInternal(entity, _entitySource.Load(entity.Iri), context);
        }
Beispiel #2
0
        private void InitializeChildEntities(EntityInitializationContext context)
        {
            foreach (var otherEntity in context.EntitiesCreated.Where(otherEntity => !otherEntity.IsInitialized))
            {
                IEnumerable <Statement> statements = null;
                ISet <Statement>        otherStatements;
                if (!context.EntityStatements.TryGetValue(otherEntity.Iri, out otherStatements))
                {
                    statements = _entitySource.Load(otherEntity.Iri);
                }

                InitializeInternal(otherEntity, otherStatements ?? statements, context);
                context.EntityStatements.Remove(otherEntity.Iri);
            }
        }
        internal static void InitializeLists(this Entity entity, EntityInitializationContext context)
        {
            Dictionary <Iri, ICollectionMapping> linkedLists;

            if (!context.LinkedLists.TryGetValue(entity.Iri, out linkedLists))
            {
                return;
            }

            foreach (var head in linkedLists)
            {
                entity.SetList(head.Key, head.Value, context);
            }

            context.LinkedLists.Remove(entity.Iri);
        }
        internal static void SetList(this Entity entity, Iri head, ICollectionMapping collectionMapping, EntityInitializationContext context)
        {
            Iri previousHead = null;

            while (true)
            {
                ISet <Statement> statements;
                if ((previousHead == head) || (!context.EntityStatements.TryGetValue(head, out statements)))
                {
                    break;
                }

                context.EntityStatements.Remove(previousHead = head);
                foreach (var statement in statements)
                {
                    if (statement.Predicate == rdf.first)
                    {
                        entity.SetProperty(statement, collectionMapping, context);
                    }
                    else if (statement.Predicate == rdf.rest)
                    {
                        head = statement.Object;
                    }
                }
            }
        }
        internal static void SetProperty(this Entity entity, Statement statement, IPropertyMapping propertyMapping, EntityInitializationContext context)
        {
            object value;

            if (statement.Object != null)
            {
                var otherEntity = (IEntity)((DefaultEntityContext)entity.Context)
                                  .CreateInternal(statement.Object, false)
                                  .ActLike(propertyMapping.ReturnType.GetItemType());
                context.EntitiesCreated.Add(otherEntity.UnwrapEntity());
                value = otherEntity;
            }
            else
            {
                value = propertyMapping.ValueConverter.ConvertFrom(statement);
            }

            entity.SetPropertyInternal(propertyMapping.PropertyInfo, value);
        }
Beispiel #6
0
        internal virtual void InitializeInternal(Entity entity, IEnumerable <Statement> statements, EntityInitializationContext context, Action <Statement> onIteration = null)
        {
            if (onIteration == null)
            {
                onIteration = _ => { };
            }

            foreach (var statement in statements)
            {
                onIteration(statement);
                if (!statement.IsRelatedTo(entity))
                {
                    context.EntityStatements.EnsureKey(statement.Subject).Add(statement);
                    continue;
                }

                if (statement.IsTypeAssertion())
                {
                    var entityMapping = Mappings.FindEntityMappingFor(entity, statement.Object, statement.Graph);
                    if (entityMapping != null)
                    {
                        entity.CastedTypes.Add(entityMapping.Type);
                    }

                    continue;
                }

                var propertyMapping = Mappings.FindPropertyMappingFor(entity, statement.Predicate, statement.Graph);
                if ((propertyMapping == null) && (UnmappedPropertyEncountered != null))
                {
                    var e = new UnmappedPropertyEventArgs(this, statement);
                    UnmappedPropertyEncountered(this, e);
                    propertyMapping = e.PropertyMapping;
                }

                if ((propertyMapping == null) || (!statement.Matches(propertyMapping.Graph)))
                {
                    continue;
                }

                //// TODO: Develop a dictionary statements handling.
                var collectionMapping = propertyMapping as ICollectionMapping;
                if (collectionMapping?.StoreAs == CollectionStorageModel.LinkedList)
                {
                    context.LinkedLists.EnsureKey(entity.Iri)[statement.Object] = collectionMapping;
                    continue;
                }

                entity.SetProperty(statement, propertyMapping, context);
            }

            entity.InitializeLists(context);
            entity.IsInitialized = true;
            InitializeChildEntities(context);
        }