Ejemplo n.º 1
0
        private PropertyData AssembleDerivedProperty(ResourceProperty property)
        {
            var propertyData = PropertyData.CreateDerivedProperty(property);

            if (property.EntityProperty.IsInheritedIdentifyingRenamed)
            {
                return(propertyData);
            }

            if (property.IsInherited)
            {
                var baseProperty = property.BaseEntityProperty();

                if (!baseProperty.IncomingAssociations.Any())
                {
                    propertyData[ResourceRenderer.RenderType] = ResourceRenderer.RenderStandard;
                    return(propertyData);
                }

                return(PropertyData.CreateReferencedProperty(
                           baseProperty.ToResourceProperty(property.Parent),
                           UniqueIdSpecification.IsUniqueId(property.PropertyName)
                        ? string.Format(
                               "A unique alphanumeric code assigned to a {0}.",
                               property.RemoveUniqueIdOrUsiFromPropertyName()
                               .ToCamelCase())
                        : property.Description.ScrubForXmlDocumentation(),
                           property.Parent.Name));
            }

            propertyData[ResourceRenderer.RenderType] = ResourceRenderer.RenderStandard;
            return(propertyData);
        }
Ejemplo n.º 2
0
        private IEnumerable <PropertyData> CreateProperties(ResourceClassBase resourceClass)
        {
            var allPossibleProperties = resourceClass.FilterContext.UnfilteredResourceClass?.NonIdentifyingProperties ??
                                        resourceClass.NonIdentifyingProperties;

            var currentProperties = resourceClass.AllProperties;

            var propertyPairs =
                (from p in allPossibleProperties
                 join c in currentProperties on p.PropertyName equals c.PropertyName into leftJoin
                 from _c in leftJoin.DefaultIfEmpty()
                 where

                 // Non-identifying properties only
                 !p.IsIdentifying

                 // Exclude boilerplate "id" property
                 && !p.PropertyName.Equals("Id")

                 // Exclude inherited properties
                 && !p.IsInheritedProperty()
                 orderby p.PropertyName
                 select new
            {
                UnderlyingProperty = p,
                CurrentProperty = _c
            })
                .ToList();

            foreach (var propertyPair in propertyPairs)
            {
                // If the property was filtered out, then generate an explicit interface "Null" implementation only.
                if (propertyPair.CurrentProperty == null)
                {
                    yield return(PropertyData.CreateNullProperty(propertyPair.UnderlyingProperty));

                    continue;
                }

                var property = propertyPair.CurrentProperty;

                if (property.IsSynchronizable())
                {
                    if (resourceClass.IsDescriptorEntity())
                    {
                        if (!property.IsInheritedProperty())
                        {
                            yield return(AssembleDerivedProperty(property));
                        }
                    }
                    else if (property.IsDirectLookup)
                    {
                        yield return(PropertyData.CreateStandardProperty(property));
                    }
                    else
                    {
                        yield return
                            (property.HasAssociations()
                                ? PropertyData.CreateReferencedProperty(property)
                                : PropertyData.CreateStandardProperty(property));
                    }
                }
                else
                {
                    if (property.HasAssociations())
                    {
                        yield return(property.IsLookup
                            ? PropertyData.CreateStandardProperty(property)
                            : PropertyData.CreateReferencedProperty(property));
                    }
                    else
                    {
                        yield return(PropertyData.CreateStandardProperty(property));
                    }
                }
            }
        }
Ejemplo n.º 3
0
        public object AssemblePrimaryKeys(
            ResourceProfileData profileData,
            ResourceClassBase resourceClass,
            TemplateContext templateContext)
        {
            if (profileData == null)
            {
                throw new ArgumentNullException(nameof(profileData));
            }

            if (resourceClass == null)
            {
                throw new ArgumentNullException(nameof(resourceClass));
            }

            if (templateContext == null)
            {
                throw new ArgumentNullException(nameof(templateContext));
            }

            var pks = new List <object>();

            var activeResource = profileData.GetProfileActiveResource(resourceClass);

            var filteredResource = profileData.GetContainedResource(resourceClass) ?? resourceClass;

            if (resourceClass is ResourceChildItem)
            {
                pks.Add(
                    new
                {
                    HasParent = ResourceRenderer.DoRenderProperty,
                    Property  = new
                    {
                        PropertyName =
                            resourceClass.GetResourceInterfaceName(
                                templateContext.GetSchemaProperCaseNameForResource(resourceClass),
                                templateContext.IsProfiles,
                                templateContext.IsExtension),
                        ReferencesWithUnifiedKey =
                            resourceClass.References
                            .Where(@ref => @ref.Properties.Any(rp => rp.IsUnified()))
                            .Select(@ref => new
                        {
                            ReferencePropertyName = @ref.PropertyName,
                            ReferenceFieldName    = @ref.PropertyName.ToCamelCase(),
                            UnifiedKeyProperties  = @ref.Properties
                                                    .Where(rp => rp.IsUnified())
                                                    .Select(rp => new
                            {
                                UnifiedKeyPropertyName = rp.PropertyName
                            })
                        })
                    }
                });
            }

            var props = new List <PropertyData>();

            foreach (var property in activeResource.AllProperties
                     .Where(x => x.IsIdentifying)
                     .OrderBy(x => x.PropertyName))
            {
                if (activeResource.IsDescriptorEntity())
                {
                    props.Add(PropertyData.CreateDerivedProperty(property));
                    continue;
                }

                if (activeResource.IsAggregateRoot())
                {
                    if (resourceClass.IsDerived)
                    {
                        props.Add(AssembleDerivedProperty(property));
                    }
                    else
                    {
                        props.Add(
                            property.IsPersonOrUsi() && !templateContext.IsExtension
                                ? PropertyData.CreateUsiPrimaryKey(property)
                                : property.HasAssociations() && !property.IsDirectLookup
                                    ? PropertyData.CreateReferencedProperty(property, resource: filteredResource)
                                    : PropertyData.CreateStandardProperty(property));
                    }
                }
                else
                {
                    // non aggregate root
                    if (activeResource.References.Any())
                    {
                        if (property.IsPersonOrUsi())
                        {
                            props.Add(PropertyData.CreateUsiPrimaryKey(property));
                            continue;
                        }

                        if (resourceClass.HasBackReferences() &&
                            resourceClass.BackReferencedProperties()
                            .Contains(property, ModelComparers.ResourcePropertyNameOnly))
                        {
                            continue;
                        }

                        props.Add(
                            property.HasAssociations() && !property.IsDirectLookup
                                ? PropertyData.CreateReferencedProperty(property)
                                : PropertyData.CreateStandardProperty(property));
                    }
                    else
                    {
                        props.Add(PropertyData.CreateStandardProperty(property));
                    }
                }
            }

            pks.AddRange(CreatePropertyDtos(props));

            return(pks.Any()
                ? new { Properties = pks }
                : ResourceRenderer.DoNotRenderProperty);
        }