Skip to content

Commit

Permalink
Start of removal of all app config references #368
Browse files Browse the repository at this point in the history
  • Loading branch information
daryllabar committed Mar 28, 2023
1 parent 8866299 commit a7f66eb
Show file tree
Hide file tree
Showing 6 changed files with 160 additions and 164 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public void CustomizeCodeDom(CodeCompileUnit codeUnit, IServiceProvider services

private CodeConstructor GetAnonymousTypeConstructor(CodeTypeDeclaration type)
{
var data = Entities[type.GetFieldInitalizedValue("EntityLogicalName")];
var data = Entities[type.GetEntityLogicalName()];
var constructor = new CodeConstructor
{
Attributes = System.CodeDom.MemberAttributes.Public,
Expand Down
310 changes: 154 additions & 156 deletions DLaB.CrmSvcUtilExtensions/Entity/EnumPropertyGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
using System.CodeDom;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

//using System.Reflection;

namespace DLaB.ModelBuilderExtensions.Entity
Expand Down Expand Up @@ -43,7 +45,7 @@ public void CustomizeCodeDom(CodeCompileUnit codeUnit, IServiceProvider services
{
if (!type.IsClass || type.IsContextType() || type.IsBaseEntityType()) { continue; }

var logicalName = type.GetFieldInitalizedValue("EntityLogicalName");
var logicalName = type.GetEntityLogicalName();
var propertiesToReplace = new Dictionary<int,CodeMemberProperty>();
foreach (var member in type.Members)
{
Expand All @@ -54,16 +56,12 @@ public void CustomizeCodeDom(CodeCompileUnit codeUnit, IServiceProvider services
}

// ReSharper disable once AssignNullToNotNullAttribute
//propertiesToReplace[type.Members.IndexOf(property)] = GetOptionSetEnumType(property, logicalName);
propertiesToReplace[type.Members.IndexOf(property)] = GetOptionSetEnumType(property, logicalName);
}

foreach (var enumProp in propertiesToReplace.Where(p => p.Value != null).OrderByDescending(p => p.Key))
{
if (ReplaceOptionSetProperties)
{
type.Members[enumProp.Key] = enumProp.Value;
}
else
if (!ReplaceOptionSetProperties)
{
type.Members.Insert(enumProp.Key + 1, enumProp.Value);
}
Expand Down Expand Up @@ -140,155 +138,155 @@ private class EnumPropertyInfo
public bool IsMultSelect { get; set; }
}

//private CodeMemberProperty GetOptionSetEnumType(CodeMemberProperty prop, string entityLogicalName)
//{
// var info = GetOptionSetEnumInfo(prop, entityLogicalName);
// if (info == null)
// {
// return null;
// }
//
// var property = new CodeMemberProperty
// {
// Name = info.PropertyName,
// Type = new CodeTypeReference(info.EnumType),
// Attributes = System.CodeDom.MemberAttributes.Public
// };
// property.Comments.AddRange(prop.Comments);
//
// // [Microsoft.Xrm.Sdk.AttributeLogicalNameAttribute("AttributeLogicalName")]
// property.CustomAttributes.Add(new CodeAttributeDeclaration("Microsoft.Xrm.Sdk.AttributeLogicalNameAttribute", new CodeAttributeArgument(new CodePrimitiveExpression(info.LogicalName))));
// AddEnumGet(info, property);
// AddEnumSet(prop, info, property);
// return property;
//}
//
//private void AddEnumGet(EnumPropertyInfo info, CodeMemberProperty property)
//{
// CodeExpression returnExpression;
// if (info.IsMultSelect)
// {
// MultiSelectEnumCreated = true;
// // return EntityOptionSetEnum.GetMultiEnum<info.OptionSetType>(this, info.LogicalName);
// returnExpression =
// new CodeMethodInvokeExpression(
// new CodeMethodReferenceExpression(
// CreateBaseClasses
// ? new CodeTypeReferenceExpression(EntityBaseClassGenerator.BaseEntityName)
// : new CodeTypeReferenceExpression("EntityOptionSetEnum"),
// "GetMultiEnum",
// new CodeTypeReference(info.OptionSetType)),
// new CodeThisReferenceExpression(),
// new CodePrimitiveExpression(info.LogicalName));
// }
// else
// {
// returnExpression =
// new CodeCastExpression(
// info.EnumType,
// new CodeMethodInvokeExpression(
// CreateBaseClasses
// ? new CodeTypeReferenceExpression(EntityBaseClassGenerator.BaseEntityName)
// : new CodeTypeReferenceExpression("EntityOptionSetEnum"),
// "GetEnum",
// new CodeThisReferenceExpression(),
// new CodePrimitiveExpression(info.LogicalName)));
// }
//
// property.GetStatements.Add(new CodeMethodReturnStatement(returnExpression));
//}
//
//private void AddEnumSet(CodeMemberProperty prop, EnumPropertyInfo info, CodeMemberProperty property)
//{
// if (!prop.HasSet)
// {
// return;
// }
//
// // this.OnPropertyChanging("PropName");
// property.SetStatements.Add(new CodeMethodInvokeExpression(
// new CodeThisReferenceExpression(), "OnPropertyChanging", new CodePrimitiveExpression(prop.Name)
// ));
//
// CodeExpression getValueToSetExpression;
// if (info.IsMultSelect)
// {
// //EntityOptionSetEnum.GetMultiEnum(this, info.LogicalName, value)
// getValueToSetExpression =
// new CodeMethodInvokeExpression(
// CreateBaseClasses
// ? new CodeTypeReferenceExpression(EntityBaseClassGenerator.BaseEntityName)
// : new CodeTypeReferenceExpression("EntityOptionSetEnum"),
// "GetMultiEnum",
// new CodeThisReferenceExpression(),
// new CodePrimitiveExpression(info.LogicalName),
// new CodePropertySetValueReferenceExpression());
// }
// else
// {
// getValueToSetExpression = new CodeSnippetExpression(
// IsNullableIntProperty(prop)
// ? "(int?)value"
// : "value.HasValue ? new Microsoft.Xrm.Sdk.OptionSetValue((int)value) : null");
// }
//
// // this.SetAttributeValue("logicalName", getValueExpression);
// property.SetStatements.Add(
// new CodeMethodInvokeExpression(
// new CodeThisReferenceExpression(),
// "SetAttributeValue",
// new CodePrimitiveExpression(prop.GetLogicalName()),
// getValueToSetExpression));
//
// // this.OnPropertyChanged("PropName");
// property.SetStatements.Add(new CodeMethodInvokeExpression(
// new CodeThisReferenceExpression(), "OnPropertyChanged", new CodePrimitiveExpression(prop.Name)
// ));
//}
//
//private EnumPropertyInfo GetOptionSetEnumInfo(CodeMemberProperty prop, string entityLogicalName)
//{
// var propertyLogicalName = prop.GetLogicalName();
// if (propertyLogicalName == null) { throw new Exception("Unable to determine property Logical Name"); }
//
// var data = Entities[entityLogicalName];
// var attribute = data.Attributes.FirstOrDefault(a => a.LogicalName == propertyLogicalName);
// var picklist = attribute as EnumAttributeMetadata;
// if (picklist == null) { return null; }
//
// var enumName = NamingService.GetNameForOptionSet(data, picklist.OptionSet, Services);
// if (SpecifiedMappings.TryGetValue(entityLogicalName.ToLower() + "." + prop.Name.ToLower(), out var specifiedEnum))
// {
// enumName = specifiedEnum;
// }
// else if (Entities.ContainsKey(enumName) && Entities[enumName].SchemaName == enumName)
// {
// enumName += "Enum";
// }
//
// return new EnumPropertyInfo
// {
// OptionSetType = enumName,
// IsMultSelect = picklist is MultiSelectPicklistAttributeMetadata,
// PropertyName = prop.Name + (ReplaceOptionSetProperties
// ? string.Empty
// : "Enum" ),
// LogicalName = propertyLogicalName
// };
//}
//
//private CodeTypeDeclaration GetEntityOptionSetEnumDeclaration()
//{
// var enumClass = new CodeTypeDeclaration("EntityOptionSetEnum")
// {
// IsClass = true,
// TypeAttributes = TypeAttributes.Sealed | TypeAttributes.NotPublic,
// };
//
// enumClass.Members.AddRange(CreateGetEnumMethods(MultiSelectEnumCreated));
//
// return enumClass;
//}
private CodeMemberProperty GetOptionSetEnumType(CodeMemberProperty prop, string entityLogicalName)
{
var info = GetOptionSetEnumInfo(prop, entityLogicalName);
if (info == null)
{
return null;
}

var property = new CodeMemberProperty
{
Name = info.PropertyName,
Type = new CodeTypeReference(info.EnumType),
Attributes = System.CodeDom.MemberAttributes.Public
};
property.Comments.AddRange(prop.Comments);

// [Microsoft.Xrm.Sdk.AttributeLogicalNameAttribute("AttributeLogicalName")]
property.CustomAttributes.Add(new CodeAttributeDeclaration("Microsoft.Xrm.Sdk.AttributeLogicalNameAttribute", new CodeAttributeArgument(new CodePrimitiveExpression(info.LogicalName))));
AddEnumGet(info, property);
AddEnumSet(prop, info, property);
return property;
}

private void AddEnumGet(EnumPropertyInfo info, CodeMemberProperty property)
{
CodeExpression returnExpression;
if (info.IsMultSelect)
{
MultiSelectEnumCreated = true;
// return EntityOptionSetEnum.GetMultiEnum<info.OptionSetType>(this, info.LogicalName);
returnExpression =
new CodeMethodInvokeExpression(
new CodeMethodReferenceExpression(
CreateBaseClasses
? new CodeTypeReferenceExpression(EntityBaseClassGenerator.BaseEntityName)
: new CodeTypeReferenceExpression("EntityOptionSetEnum"),
"GetMultiEnum",
new CodeTypeReference(info.OptionSetType)),
new CodeThisReferenceExpression(),
new CodePrimitiveExpression(info.LogicalName));
}
else
{
returnExpression =
new CodeCastExpression(
info.EnumType,
new CodeMethodInvokeExpression(
CreateBaseClasses
? new CodeTypeReferenceExpression(EntityBaseClassGenerator.BaseEntityName)
: new CodeTypeReferenceExpression("EntityOptionSetEnum"),
"GetEnum",
new CodeThisReferenceExpression(),
new CodePrimitiveExpression(info.LogicalName)));
}

property.GetStatements.Add(new CodeMethodReturnStatement(returnExpression));
}

private void AddEnumSet(CodeMemberProperty prop, EnumPropertyInfo info, CodeMemberProperty property)
{
if (!prop.HasSet)
{
return;
}

// this.OnPropertyChanging("PropName");
property.SetStatements.Add(new CodeMethodInvokeExpression(
new CodeThisReferenceExpression(), "OnPropertyChanging", new CodePrimitiveExpression(prop.Name)
));

CodeExpression getValueToSetExpression;
if (info.IsMultSelect)
{
//EntityOptionSetEnum.GetMultiEnum(this, info.LogicalName, value)
getValueToSetExpression =
new CodeMethodInvokeExpression(
CreateBaseClasses
? new CodeTypeReferenceExpression(EntityBaseClassGenerator.BaseEntityName)
: new CodeTypeReferenceExpression("EntityOptionSetEnum"),
"GetMultiEnum",
new CodeThisReferenceExpression(),
new CodePrimitiveExpression(info.LogicalName),
new CodePropertySetValueReferenceExpression());
}
else
{
getValueToSetExpression = new CodeSnippetExpression(
IsNullableIntProperty(prop)
? "(int?)value"
: "value.HasValue ? new Microsoft.Xrm.Sdk.OptionSetValue((int)value) : null");
}

// this.SetAttributeValue("logicalName", getValueExpression);
property.SetStatements.Add(
new CodeMethodInvokeExpression(
new CodeThisReferenceExpression(),
"SetAttributeValue",
new CodePrimitiveExpression(prop.GetLogicalName()),
getValueToSetExpression));

// this.OnPropertyChanged("PropName");
property.SetStatements.Add(new CodeMethodInvokeExpression(
new CodeThisReferenceExpression(), "OnPropertyChanged", new CodePrimitiveExpression(prop.Name)
));
}

private EnumPropertyInfo GetOptionSetEnumInfo(CodeMemberProperty prop, string entityLogicalName)
{
var propertyLogicalName = prop.GetLogicalName();
if (propertyLogicalName == null) { throw new Exception("Unable to determine property Logical Name"); }

var data = Entities[entityLogicalName];
var attribute = data.Attributes.FirstOrDefault(a => a.LogicalName == propertyLogicalName);
var picklist = attribute as EnumAttributeMetadata;
if (picklist == null) { return null; }

var enumName = NamingService.GetNameForOptionSet(data, picklist.OptionSet, Services);
if (SpecifiedMappings.TryGetValue(entityLogicalName.ToLower() + "." + prop.Name.ToLower(), out var specifiedEnum))
{
enumName = specifiedEnum;
}
else if (Entities.ContainsKey(enumName) && Entities[enumName].SchemaName == enumName)
{
enumName += "Enum";
}

return new EnumPropertyInfo
{
OptionSetType = enumName,
IsMultSelect = picklist is MultiSelectPicklistAttributeMetadata,
PropertyName = prop.Name + (ReplaceOptionSetProperties
? string.Empty
: "Enum" ),
LogicalName = propertyLogicalName
};
}

private CodeTypeDeclaration GetEntityOptionSetEnumDeclaration()
{
var enumClass = new CodeTypeDeclaration("EntityOptionSetEnum")
{
IsClass = true,
TypeAttributes = TypeAttributes.Sealed | TypeAttributes.NotPublic,
};

enumClass.Members.AddRange(CreateGetEnumMethods(MultiSelectEnumCreated));

return enumClass;
}

public static CodeTypeMember[] CreateGetEnumMethods(bool multiSelectCreated)
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using System;
using System.CodeDom;
using System.Collections.Generic;
using System.Linq;
using Microsoft.PowerPlatform.Dataverse.ModelBuilderLib;
using Microsoft.Xrm.Sdk;
Expand All @@ -23,12 +22,12 @@ public void CustomizeCodeDom(CodeCompileUnit codeUnit, IServiceProvider services
{
if (!type.IsClass || type.IsContextType() || type.IsBaseEntityType()) { continue; }

var logicalName = type.GetFieldInitalizedValue("EntityLogicalName");
Dictionary<string, AttributeMetadata> attributes;
if (!attributesByEntity.TryGetValue(logicalName, out attributes))
var logicalName = type.GetEntityLogicalName();
if (!attributesByEntity.TryGetValue(logicalName, out var attributes))
{
continue;
}

foreach (var member in type.Members)
{
if (!(member is CodeMemberProperty property)
Expand Down
2 changes: 1 addition & 1 deletion DLaB.CrmSvcUtilExtensions/Extensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ public static string GetRelationshipLogicalName(this CodeMemberProperty property

#region CodeTypeDeclaration

public static string GetFieldInitalizedValue(this CodeTypeDeclaration type, string fieldName)
public static string GetFieldInitializedValue(this CodeTypeDeclaration type, string fieldName)
{
var field = type.Members.OfType<CodeMemberField>().FirstOrDefault(f => f.Name == fieldName);
if (field != null)
Expand Down
2 changes: 1 addition & 1 deletion DLaB.CrmSvcUtilExtensions/MetadataProviderService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ public static void SerializeMetadata(IOrganizationMetadata metadata, string file
filePath = RootPath(filePath);
Console.WriteLine("[**** Writing Metadata to File {0} ****]", filePath);
File.WriteAllText(filePath, Serialize(localMetadata,true));
Console.WriteLine("[**** Finished Writing Metadata ****]", filePath);
Console.WriteLine("[**** Finished Writing Metadata ****]");
}

private static string RootPath(string filePath)
Expand Down
1 change: 0 additions & 1 deletion DLaB.EarlyBoundGenerator/Settings/SettingsMapDescriptor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,6 @@ private void DisableUnsupportedProperties()
nameof(ActionsToSkip),
nameof(AddDebuggerNonUserCode),
nameof(AddNewFilesToProject),
nameof(AddOptionSetMetadataAttribute),
nameof(AudibleCompletionNotification),
nameof(CreateOneFilePerAction),
nameof(CreateOneFilePerEntity),
Expand Down

0 comments on commit a7f66eb

Please sign in to comment.