public static MappingEnum Parse(BooleanAttributeMetadata twoOption) { var enm = new MappingEnum(); enm.DisplayName = Naming.GetProperVariableName(Naming.GetProperVariableName(twoOption.SchemaName)); enm.Items = new MapperEnumItem[2]; enm.Items[0] = MapBoolOption(twoOption.OptionSet.TrueOption); enm.Items[1] = MapBoolOption(twoOption.OptionSet.FalseOption); RenameDuplicates(enm); return(enm); }
private static void RenameDuplicates(MappingEnum enm) { Dictionary <string, int> duplicates = new Dictionary <string, int>(); foreach (var i in enm.Items) { if (duplicates.ContainsKey(i.Name)) { duplicates[i.Name] = duplicates[i.Name] + 1; i.Name += "_" + duplicates[i.Name]; } else { duplicates[i.Name] = 1; } } }
public static MappingEnum Parse(EnumAttributeMetadata picklist) { var enm = new MappingEnum { DisplayName = Naming.GetProperVariableName(Naming.GetProperVariableName(picklist.SchemaName)), Items = picklist.OptionSet.Options.Select( o => new MapperEnumItem { Attribute = new CrmPicklistAttribute { DisplayName = o.Label.UserLocalizedLabel.Label, Value = o.Value ?? 1 }, Name = Naming.GetProperVariableName(o.Label.UserLocalizedLabel.Label) } ).ToArray() }; RenameDuplicates(enm); return(enm); }
public static MappingField Parse(AttributeMetadata attribute, MappingEntity entity) { var result = new MappingField(); result.Entity = entity; result.AttributeOf = attribute.AttributeOf; result.IsValidForCreate = (bool)attribute.IsValidForCreate; result.IsValidForRead = (bool)attribute.IsValidForRead; result.IsValidForUpdate = (bool)attribute.IsValidForUpdate; result.IsActivityParty = attribute.AttributeType == AttributeTypeCode.PartyList ? true : false; result.IsStateCode = attribute.AttributeType == AttributeTypeCode.State ? true : false; result.IsOptionSet = attribute.AttributeType == AttributeTypeCode.Picklist; result.IsTwoOption = attribute.AttributeType == AttributeTypeCode.Boolean; result.DeprecatedVersion = attribute.DeprecatedVersion; result.IsDeprecated = !string.IsNullOrWhiteSpace(attribute.DeprecatedVersion); if (attribute is PicklistAttributeMetadata) { result.EnumData = MappingEnum.Parse(attribute as PicklistAttributeMetadata); } if (attribute is LookupAttributeMetadata) { var lookup = attribute as LookupAttributeMetadata; if (lookup.Targets.Count() == 1) { result.LookupSingleType = lookup.Targets[0]; } } ParseMinMaxValues(attribute, result); if (attribute.AttributeType != null) { result.FieldType = attribute.AttributeType.Value; } result.IsPrimaryKey = attribute.IsPrimaryId == true; result.LogicalName = attribute.LogicalName; result.DisplayName = Naming.GetProperVariableName(attribute); result.PrivatePropertyName = Naming.GetEntityPropertyPrivateName(attribute.SchemaName); result.HybridName = Naming.GetProperHybridFieldName(result.DisplayName, result.Attribute); if (attribute.Description != null) { if (attribute.Description.UserLocalizedLabel != null) { result.Description = attribute.Description.UserLocalizedLabel.Label; } } if (attribute.DisplayName != null) { if (attribute.DisplayName.UserLocalizedLabel != null) { result.Label = attribute.DisplayName.UserLocalizedLabel.Label; } } result.IsRequired = attribute.RequiredLevel != null && attribute.RequiredLevel.Value == AttributeRequiredLevel.ApplicationRequired; result.Attribute = new CrmPropertyAttribute { LogicalName = attribute.LogicalName, IsLookup = attribute.AttributeType == AttributeTypeCode.Lookup || attribute.AttributeType == AttributeTypeCode.Customer }; result.TargetTypeForCrmSvcUtil = GetTargetType(result); result.FieldTypeString = result.TargetTypeForCrmSvcUtil; return(result); }
private static MappingEntity GetMappingEntity(EntityMetadata entityMetadata, string serverStamp, MappingEntity entity, bool isTitleCaseLogicalName) { entity = entity ?? new MappingEntity(); entity.MetadataId = entityMetadata.MetadataId; entity.ServerStamp = serverStamp; entity.Attribute = entity.Attribute ?? new CrmEntityAttribute(); entity.TypeCode = entityMetadata.ObjectTypeCode ?? entity.TypeCode; entity.Attribute.LogicalName = entityMetadata.LogicalName ?? entity.Attribute.LogicalName; entity.IsIntersect = (entityMetadata.IsIntersect ?? entity.IsIntersect); entity.Attribute.PrimaryKey = entityMetadata.PrimaryIdAttribute ?? entity.Attribute.PrimaryKey; if (entityMetadata.DisplayName?.UserLocalizedLabel != null) { entity.Label = entityMetadata.DisplayName.UserLocalizedLabel.Label; } if (entityMetadata.SchemaName != null) { entity.DisplayName = Naming.GetProperEntityName(entityMetadata.SchemaName); entity.SchemaName = entityMetadata.SchemaName; if (entityMetadata.LogicalName != null) { entity.HybridName = Naming.GetProperHybridName(entityMetadata.SchemaName, entityMetadata.LogicalName); } } entity.StateName = entity.HybridName + "State"; if (entityMetadata.Description != null && entityMetadata.Description.UserLocalizedLabel != null) { entity.Description = entityMetadata.Description.UserLocalizedLabel.Label; } var fields = (entity.Fields ?? new MappingField[0]).ToList(); foreach (var field in entityMetadata.Attributes.Where(a => a.AttributeOf == null)) { var existingField = fields.FirstOrDefault(fieldQ => fieldQ.MetadataId == field.MetadataId); // if it exists, remove it from the list if (existingField != null) { fields.RemoveAll(fieldQ => fieldQ.MetadataId == field.MetadataId); } // update/create and add to list fields.Add(MappingField.GetMappingField(field, entity, existingField, isTitleCaseLogicalName)); } fields.ForEach(f => { if (f.DisplayName == entity.DisplayName) { f.DisplayName += "1"; } if (f.HybridName == entity.HybridName) { f.HybridName += "1"; } } ); AddEntityImageCrm2013(fields); AddLookupFields(fields); entity.Fields = fields.ToArray(); if (entityMetadata.Attributes != null) { // get the states enum from the metadata entity.States = entityMetadata.Attributes.Where(a => a is StateAttributeMetadata && a.AttributeOf == null) .Select(a => MappingEnum.GetMappingEnum(a as EnumAttributeMetadata, null, isTitleCaseLogicalName)) .FirstOrDefault() ?? entity.States; // get all optionsets from the metadata var newEnums = entityMetadata.Attributes .Where(a => (a is EnumAttributeMetadata || a is BooleanAttributeMetadata) && a.AttributeOf == null); // if there was never any enums previously, then just take the ones sent if (entity.Enums == null) { entity.Enums = newEnums.Select(newEnum => MappingEnum.GetMappingEnum(newEnum, null, isTitleCaseLogicalName)).ToArray(); } else { var existingEnums = entity.Enums.ToList(); // else, update the changed ones newEnums.AsParallel() .ForAll(newEnum => { // has this enum been updated? var existingEnum = existingEnums.Find(existingEnumQ => existingEnumQ.MetadataId == newEnum.MetadataId); if (existingEnum != null) { // update it here entity.Enums[existingEnums.IndexOf(existingEnum)] = MappingEnum.GetMappingEnum(newEnum, existingEnum, isTitleCaseLogicalName); } else { // add new existingEnums.Add(MappingEnum.GetMappingEnum(newEnum, null, isTitleCaseLogicalName)); } }); entity.Enums = existingEnums.ToArray(); } } entity.PrimaryKey = entity.Fields.First(f => f.Attribute.LogicalName == entity.Attribute.PrimaryKey); entity.PrimaryKeyProperty = entity.PrimaryKey.DisplayName; entity.PrimaryNameAttribute = entityMetadata.PrimaryNameAttribute ?? entity.PrimaryNameAttribute; MappingRelationship1N.UpdateCache(entityMetadata.OneToManyRelationships.ToList(), entity, entity.Fields); MappingRelationshipN1.UpdateCache(entityMetadata.ManyToOneRelationships.ToList(), entity, entity.Fields); MappingRelationshipMN.UpdateCache(entityMetadata.ManyToManyRelationships.ToList(), entity, entity.LogicalName); // add a clone for self-referenced relation var relationshipsManyToMany = entity.RelationshipsManyToMany.ToList(); var selfReferenced = relationshipsManyToMany.Where(r => r.IsSelfReferenced).ToList(); foreach (var referenced in selfReferenced) { if (relationshipsManyToMany.All( rel => rel.DisplayName != "Referencing" + Naming.GetProperVariableName(referenced.SchemaName, false))) { var referencing = (MappingRelationshipMN)referenced.Clone(); referencing.DisplayName = "Referencing" + Naming.GetProperVariableName(referenced.SchemaName, false); referencing.EntityRole = "Microsoft.Xrm.Sdk.EntityRole.Referencing"; relationshipsManyToMany.Add(referencing); } } entity.RelationshipsManyToMany = relationshipsManyToMany.OrderBy(r => r.DisplayName).ToArray(); entity.FriendlyName = Naming.Clean(string.IsNullOrEmpty(entity.Label) ? Naming.Clean(entity.HybridName) : Naming.Clean(entity.Label)); // generate attribute friendly names and detect duplicates entity.Fields.AsParallel() .ForAll(field => { var cleanFieldName = Naming.Clean( string.IsNullOrEmpty(field.Label) ? Naming.Clean(field.DisplayName) : Naming.Clean(field.Label)) + (field == entity.PrimaryKey ? "Id" : ""); var isDuplicateName = entity.Fields.Count( fieldQ => Naming.Clean( string.IsNullOrEmpty(fieldQ.Label) ? Naming.Clean(fieldQ.DisplayName) : Naming.Clean(fieldQ.Label)) == cleanFieldName) > 1; isDuplicateName = isDuplicateName || cleanFieldName == "Attributes" || cleanFieldName == entity.FriendlyName || cleanFieldName == "LogicalName" || cleanFieldName == "EntityLogicalName" || cleanFieldName == "SchemaName" || cleanFieldName == "DisplayName" || cleanFieldName == "EntityTypeCode"; field.FriendlyName = cleanFieldName + (isDuplicateName ? "_" + field.DisplayName : ""); }); // generate enum friendly names entity.Enums.AsParallel() .ForAll(enm => { var attribute = entity.Fields.FirstOrDefault(field => field.LogicalName == enm.LogicalName); enm.FriendlyName = attribute == null ? enm.DisplayName : attribute.FriendlyName; }); return(entity); }
public static MappingEnum GetMappingEnum(AttributeMetadata picklist, MappingEnum mappingEnum, bool isTitleCaseLogicalName) { mappingEnum ??= new MappingEnum { MetadataId = picklist.MetadataId }; if (picklist.SchemaName != null) { mappingEnum.DisplayName = Naming.GetProperVariableName(picklist, isTitleCaseLogicalName); } mappingEnum.LogicalName = picklist.LogicalName ?? mappingEnum.LogicalName; mappingEnum.Items = new MapperEnumItem[0]; var attributeAsEnum = picklist as EnumAttributeMetadata; if (attributeAsEnum?.OptionSet != null && attributeAsEnum.OptionSet.Options.Count > 0) { var newItems = new List <MapperEnumItem>(); newItems.AddRange(attributeAsEnum.OptionSet.Options .Where(o => o.Label.UserLocalizedLabel != null) .Select(e => GetEnumItem(e, isTitleCaseLogicalName))); mappingEnum.Items = newItems.ToArray(); } else { var attributeAsBool = picklist as BooleanAttributeMetadata; if (attributeAsBool?.OptionSet != null) { var newItems = new List <MapperEnumItem>(); var trueOption = attributeAsBool.OptionSet.TrueOption; if (trueOption.Label.UserLocalizedLabel != null) { newItems.Add(GetEnumItem(trueOption, isTitleCaseLogicalName)); } var falseOption = attributeAsBool.OptionSet.FalseOption; if (falseOption.Label.UserLocalizedLabel != null) { newItems.Add(GetEnumItem(falseOption, isTitleCaseLogicalName)); } mappingEnum.Items = newItems.ToArray(); } } var duplicates = new Dictionary <string, int>(); foreach (var item in mappingEnum.Items) { if (duplicates.ContainsKey(item.Name)) { duplicates[item.Name] = duplicates[item.Name] + 1; item.Name += "_" + duplicates[item.Name]; } else { duplicates[item.Name] = 1; } } mappingEnum.IsMultiSelect = picklist is MultiSelectPicklistAttributeMetadata; return(mappingEnum); }
public static MappingEntity Parse(EntityMetadata entityMetadata) { var entity = new MappingEntity(); entity.Attribute = new CrmEntityAttribute(); entity.TypeCode = entityMetadata.ObjectTypeCode; entity.Attribute.LogicalName = entityMetadata.LogicalName; entity.IsIntersect = (bool)entityMetadata.IsIntersect; entity.Attribute.PrimaryKey = entityMetadata.PrimaryIdAttribute; // entity.DisplayName = Helper.GetProperVariableName(entityMetadata.SchemaName); entity.DisplayName = Naming.GetProperEntityName(entityMetadata.SchemaName); entity.HybridName = Naming.GetProperHybridName(entityMetadata.SchemaName, entityMetadata.LogicalName); entity.StateName = entity.HybridName + "State"; if (entityMetadata.Description != null) { if (entityMetadata.Description.UserLocalizedLabel != null) { entity.Description = entityMetadata.Description.UserLocalizedLabel.Label; } } var fields = entityMetadata.Attributes .Where(a => a.AttributeOf == null) .Select(a => MappingField.Parse(a, entity)).ToList(); fields.ForEach(f => { if (f.DisplayName == entity.DisplayName) { f.DisplayName += "1"; } //f.HybridName = Naming.GetProperHybridFieldName(f.DisplayName, f.Attribute); } ); AddEnityImageCRM2013(fields); AddLookupFields(fields); entity.Fields = fields.ToArray(); entity.States = entityMetadata.Attributes.Where(a => a is StateAttributeMetadata).Select(a => MappingEnum.Parse(a as EnumAttributeMetadata)).FirstOrDefault(); entity.Enums = entityMetadata.Attributes .Where(a => a is PicklistAttributeMetadata || a is StateAttributeMetadata || a is StatusAttributeMetadata || a is BooleanAttributeMetadata) .Select(a => MappingEnum.Parse(a)).ToArray(); entity.PrimaryKey = entity.Fields.First(f => f.Attribute.LogicalName == entity.Attribute.PrimaryKey); entity.PrimaryKeyProperty = entity.PrimaryKey.DisplayName; entity.PrimaryNameAttribute = entityMetadata.PrimaryNameAttribute; entity.RelationshipsOneToMany = entityMetadata.OneToManyRelationships.Select(r => MappingRelationship1N.Parse(r, entity.Fields)).ToArray(); entity.RelationshipsOneToMany.ToList().ForEach(r => { var newName = r.DisplayName; if (newName == entity.DisplayName || newName == entity.HybridName) { newName = r.DisplayName += "1"; } if (entity.Fields.Any(e => e.DisplayName == newName)) { newName = r.DisplayName += "2"; } }); entity.RelationshipsManyToOne = entityMetadata.ManyToOneRelationships.Select(r => MappingRelationshipN1.Parse(r, entity.Fields)).ToArray(); entity.RelationshipsManyToOne.ToList().ForEach(r => { var newName = r.DisplayName; if (newName == entity.DisplayName || newName == entity.HybridName) { newName = r.DisplayName += "1"; } if (entity.Fields.Any(e => e.DisplayName == newName)) { newName = r.DisplayName += "2"; } }); var RelationshipsManyToMany = entityMetadata.ManyToManyRelationships.Select(r => MappingRelationshipMN.Parse(r, entity.LogicalName)).ToList(); var selfReferenced = RelationshipsManyToMany.Where(r => r.IsSelfReferenced).ToList(); foreach (var referecned in selfReferenced) { var referencing = (MappingRelationshipMN)referecned.Clone(); referencing.DisplayName = "Referencing" + Naming.GetProperVariableName(referecned.SchemaName); referencing.EntityRole = "Microsoft.Xrm.Sdk.EntityRole.Referencing"; RelationshipsManyToMany.Add(referencing); } RelationshipsManyToMany.ForEach(r => { var newName = r.DisplayName; if (newName == entity.DisplayName || newName == entity.HybridName) { newName = r.DisplayName += "1"; } if (entity.Fields.Any(e => e.DisplayName == newName)) { newName = r.DisplayName += "2"; } }); entity.RelationshipsManyToMany = RelationshipsManyToMany.OrderBy(r => r.DisplayName).ToArray(); return(entity); }
public static MappingField GetMappingField(AttributeMetadata attribute, MappingEntity entity, MappingField result, bool isTitleCaseLogicalName) { result ??= new MappingField(); result.Entity = entity; result.MetadataId = attribute.MetadataId; result.LogicalName = attribute.LogicalName ?? result.LogicalName; result.AttributeOf = attribute.AttributeOf ?? result.AttributeOf; result.IsValidForCreate = attribute.IsValidForCreate ?? result.IsValidForCreate; result.IsValidForRead = attribute.IsValidForRead ?? result.IsValidForRead; result.IsValidForUpdate = attribute.IsValidForUpdate ?? result.IsValidForUpdate; if (attribute.AttributeType != null) { result.FieldType = attribute.AttributeType.Value; result.IsActivityParty = attribute.AttributeType == AttributeTypeCode.PartyList; result.IsStateCode = attribute.AttributeType == AttributeTypeCode.State; } result.DeprecatedVersion = attribute.DeprecatedVersion ?? result.DeprecatedVersion; if (attribute.DeprecatedVersion != null) { result.IsDeprecated = !string.IsNullOrWhiteSpace(attribute.DeprecatedVersion); } if (attribute is EnumAttributeMetadata || attribute is BooleanAttributeMetadata) { result.EnumData = MappingEnum.GetMappingEnum(attribute, result.EnumData, isTitleCaseLogicalName); } var lookup = attribute as LookupAttributeMetadata; if (lookup?.Targets != null && lookup.Targets.Length == 1) { result.LookupSingleType = lookup.Targets[0]; } ParseDateTime(attribute, result); ParseMinMaxValues(attribute, result); result.IsPrimaryKey = attribute.IsPrimaryId ?? result.IsPrimaryKey; if (attribute.SchemaName != null) { result.SchemaName = attribute.SchemaName ?? result.SchemaName; if (attribute.LogicalName != null) { result.DisplayName = Naming.GetProperVariableName(attribute, isTitleCaseLogicalName); } result.PrivatePropertyName = Naming.GetEntityPropertyPrivateName(attribute.SchemaName); } result.HybridName = Naming.GetProperHybridFieldName(result.DisplayName, new Yagasoft.CrmCodeGenerator.Models.Attributes.CrmPropertyAttribute { IsEntityReferenceHelper = result.Attribute.IsEntityReferenceHelper, IsImage = result.Attribute.IsImage, IsLookup = result.Attribute.IsLookup, IsMultiTyped = result.Attribute.IsMultiTyped, LogicalName = result.Attribute.LogicalName, SchemaName = result.Attribute.SchemaName, }); if (attribute.Description?.UserLocalizedLabel != null) { result.Description = attribute.Description.UserLocalizedLabel.Label; } if (attribute.DisplayName != null) { if (attribute.DisplayName.LocalizedLabels != null) { result.LocalizedLabels = attribute.DisplayName .LocalizedLabels.Select(label => new LocalizedLabelSerialisable { LanguageCode = label.LanguageCode, Label = label.Label }).ToArray(); } if (attribute.DisplayName.UserLocalizedLabel != null) { result.Label = attribute.DisplayName.UserLocalizedLabel.Label; } } if (attribute.RequiredLevel != null) { result.IsRequired = attribute.RequiredLevel.Value == AttributeRequiredLevel.ApplicationRequired; } if (attribute.AttributeType != null) { result.Attribute = new CrmPropertyAttribute { LogicalName = attribute.LogicalName, IsLookup = attribute.AttributeType == AttributeTypeCode.Lookup || attribute.AttributeType == AttributeTypeCode.Owner || attribute.AttributeType == AttributeTypeCode.Customer }; } result.TargetTypeForCrmSvcUtil = GetTargetType(result); result.FieldTypeString = result.TargetTypeForCrmSvcUtil; return(result); }