Exemplo n.º 1
0
        private void ValidateContract(RelationMetadata metadata, IRelationContract contract)
        {
            if (contract.ItemType == null)
            {
                throw MetadataBuilderException.InvalidContract(metadata, "Item type cannot be null.");
            }
            else if (string.IsNullOrWhiteSpace(contract.ItemName))
            {
                throw MetadataBuilderException.InvalidContract(metadata, "Item name cannot be empty.");
            }
            else
            {
                Type enumerableType = typeof(IEnumerable <>).MakeGenericType(contract.ItemType);

                if (!enumerableType.IsAssignableFrom(metadata.Type))
                {
                    throw MetadataBuilderException.InvalidContract(metadata, $"List of type '{metadata.Type.GetSanitizedName()}' cannot be converted to '{enumerableType.GetSanitizedName()}'.");
                }
            }

            if (contract.ReadIndex != null && !contract.ReadIndex.HasSignature(contract.ItemType, typeof(int)))
            {
                throw MetadataBuilderException.InvalidContract(metadata, $"ReadIndex method must have signature '{contract.ItemType.GetSanitizedName()} (int)'.");
            }

            if (contract.WriteIndex != null && !contract.WriteIndex.HasSignature(typeof(void), typeof(int), contract.ItemType))
            {
                throw MetadataBuilderException.InvalidContract(metadata, $"WriteIndex method must have signature 'void (int, {contract.ItemType.GetSanitizedName()})'.");
            }
        }
Exemplo n.º 2
0
        private Lazy <IRelationMetadata> CreateRecursor(RelationMetadata metadata)
        {
            if (metadata.HasFlag(RelationMetadataFlags.Item))
            {
                IRelationMetadata recursiveParent = this.GetRecursiveParent(metadata);

                if (recursiveParent != null)
                {
                    string recursivePath = metadata.Notation.Path(recursiveParent.Identity.Name, metadata.Parent.Identity.Name);
                    string otherPath     = metadata.Notation.Combine(metadata.Identity.Name, recursivePath);

                    MetadataIdentity otherId = metadata.Identity.Push(recursivePath);

                    return(new Lazy <IRelationMetadata>(() => this.GetMetadata(metadata.Schema, otherId)));
                }
            }
            else if (metadata.Owner.Recursor != null)
            {
                IRelationContract contract = this.GetContract(metadata);

                if (contract != null && metadata.Owner.Type.Equals(contract.ItemType))
                {
                    return(new Lazy <IRelationMetadata>(() => metadata.Owner));
                }
            }

            return(null);
        }
Exemplo n.º 3
0
        private RelationMetadata CreateItem(RelationMetadata parent)
        {
            if (parent.Owner.HasFlag(RelationMetadataFlags.Recursive))
            {
                MemberInfo parentMember = parent.Owner.Parent?.Member;
                MemberInfo thisMember   = parent.Member;

                if (parentMember != null && parentMember.Equals(thisMember))
                {
                    return(null);
                }
            }

            IRelationContract contract = this.GetContract(parent);

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

            MetadataIdentity itemId   = parent.Identity.Push(contract.ItemName ?? "Item");
            RelationMetadata metadata = new RelationMetadata(parent.Schema, itemId)
            {
                Parent     = parent,
                Type       = contract.ItemType,
                Flags      = RelationMetadataFlags.Item,
                ReadIndex  = contract.ReadIndex,
                WriteIndex = contract.WriteIndex,
                Depth      = parent.Depth + 1,
            };

            metadata.Owner       = metadata;
            metadata.Item        = this.CreateItem(metadata);
            metadata.Properties  = this.CreateLazy(() => this.CreateProperties(metadata));
            metadata.Annotations = this.CreateAnnotations(metadata).ToList();

            if (contract.ReadIndex != null)
            {
                metadata.Flags |= RelationMetadataFlags.Readable;
            }

            if (contract.WriteIndex != null)
            {
                metadata.Flags |= RelationMetadataFlags.Writable;
            }

            if (metadata.Item != null)
            {
                metadata.Flags |= RelationMetadataFlags.List;
            }

            return(metadata);
        }
Exemplo n.º 4
0
        private IRelationContract GetContract(RelationMetadata metadata)
        {
            IEnumerable <IRelationContractResolver> allResolvers = new[] { this.DefaultResolver }.Concat(this);

            IRelationContract contract = allResolvers.Reverse().NotNull(cr => cr.GetContract(metadata)).FirstOrDefault();

            if (contract != null)
            {
                this.ValidateContract(metadata, contract);
            }

            return(contract);
        }