private MetadataNode AddDynamicNode(List <MetadataNode> itemNodes, MetadataIdentity identity, IBindingMetadata metadata, ColumnIdentity value) { this.AddStaticNode(itemNodes, metadata, null); MetadataNode thisNode = this.FindNode(itemNodes, identity); MetadataIdentity parentIdentity = identity.Pop(); if (thisNode != null) { thisNode.Column ??= value; } else if (parentIdentity != null) { MetadataNode parentNode = this.FindNode(itemNodes, parentIdentity) ?? this.AddDynamicNode(itemNodes, parentIdentity, metadata, null); if (parentNode != null) { thisNode = new MetadataNode(identity) { Column = value, Metadata = metadata, Flags = NodeFlags.Dynamic, }; parentNode.Properties.Add(thisNode); } } return(thisNode); }
private static Node AddDynamicNode(NodeTree tree, MetadataIdentity identity, IBindingMetadata metadata) { AddStaticNode(tree, metadata); Node thisNode = tree.FindNode(identity); MetadataIdentity parentIdentity = identity.Pop(); if (thisNode != null) { return(thisNode); } else if (parentIdentity != null) { Node parentNode = tree.FindNode(parentIdentity) ?? AddDynamicNode(tree, parentIdentity, metadata); if (parentNode != null) { thisNode = new Node(identity, metadata) { IsDynamic = true, }; parentNode.Properties.Add(thisNode); tree.Nodes.Add(thisNode); } } return(thisNode); }
private IJsonMetadata GetMetadata(IMetadataBuilderContext context, MetadataIdentity identity) { MetadataIdentity parentIdentity = identity.Pop(); IJsonMetadata parent = context.GetMetadata <IJsonMetadata>(parentIdentity.Name) ?? this.GetMetadata(context, parentIdentity); IRelationMetadata relation = identity.GetMetadata <IRelationMetadata>(); if (parent == null || relation == null) { return(null); } JsonMetadata metadata = new JsonMetadata(relation); if (this.HasJsonAttribute(relation) || relation.HasFlag(RelationMetadataFlags.Item)) { metadata.MemberOf = metadata; metadata.IsRoot = true; metadata.Path = "$"; } else { metadata.MemberOf = parent.MemberOf; metadata.IsRoot = false; metadata.Path = $"{parent.Path}.{this.GetPropertyNameFromContract(metadata)}"; } context.AddMetadata <IJsonMetadata>(metadata); return(metadata); }
private IBindingMetadata FindDynamicMetadata(MetadataIdentity identity) { IBindingMetadata metadata = identity.GetMetadata <IBindingMetadata>(); while (metadata == null && (identity = identity.Pop()) != null) { metadata = identity.GetMetadata <IBindingMetadata>(); } if (metadata != null && metadata.HasFlag(BindingMetadataFlags.Dynamic)) { return(metadata); } return(null); }
private ITableMetadata GetMetadata(IMetadataBuilderContext context, MetadataIdentity identity) { MetadataIdentity parentIdentity = identity.Pop(); ITableMetadata parent = context.GetMetadata <ITableMetadata>(parentIdentity.Name) ?? this.GetMetadata(context, parentIdentity); if (parent == null) { return(null); } else if (parent.Item != null && parent.Item.Identity.Equals(identity)) { return(parent.Item); } return(parent.Properties.FirstOrDefault(m => m.Identity.Equals(identity))); }