Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 78 additions & 0 deletions LCG-UDG/Constants/FileHeaderConstants.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
namespace Rappen.XTB.LCG
{
/// <summary>
/// Constants used for file header generation and template placeholders
/// </summary>
public static class FileHeaderConstants
{
/// <summary>
/// Template placeholder for tool name
/// </summary>
public const string ToolName = "{toolname}";

/// <summary>
/// Template placeholder for version
/// </summary>
public const string Version = "{version}";

/// <summary>
/// Template placeholder for organization URL
/// </summary>
public const string Organization = "{organization}";

/// <summary>
/// Template placeholder for filename
/// </summary>
public const string Filename = "{filename}";

/// <summary>
/// Template placeholder for creation date
/// </summary>
public const string CreateDate = "{createdate}";

/// <summary>
/// Template placeholder for legend
/// </summary>
public const string Legend = "{legend}";

/// <summary>
/// Template placeholder for namespace
/// </summary>
public const string Namespace = "{namespace}";

/// <summary>
/// Template placeholder for theme
/// </summary>
public const string Theme = "{theme}";

/// <summary>
/// Template placeholder for padding size
/// </summary>
public const string PaddingSize = "{paddingsize}";

/// <summary>
/// Template placeholder for data content
/// </summary>
public const string Data = "{data}";

/// <summary>
/// Label used for the "Created" line in file headers
/// </summary>
public const string CreatedLabel = "Created";

/// <summary>
/// Label used for the "Filename" line in file headers
/// </summary>
public const string FilenameLabel = "Filename";

/// <summary>
/// Double line ending used in file headers
/// </summary>
public const string LineEnding = "\r\n\r\n";

/// <summary>
/// Single line ending used in file headers
/// </summary>
public const string SingleLineEnding = "\r\n";
}
}
101 changes: 77 additions & 24 deletions LCG-UDG/Generation/Extensions.cs
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
using System;
using McTools.Xrm.Connection;
using Microsoft.Xrm.Sdk.Metadata;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using McTools.Xrm.Connection;
using Microsoft.Xrm.Sdk.Metadata;

namespace Rappen.XTB.LCG
{
public static class Extensions
{
private const string DatePattern = @"\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}";
private const string DateFormat = "yyyy-MM-dd HH:mm:ss";

public static AttributeMetadata GetAttribute(this Dictionary<string, EntityMetadata> entities, string entity, string attribute)
{
if (entities == null
Expand All @@ -31,21 +35,70 @@ public static bool WriteFile(this string data, string filename, string orgurl, S
var content = GetDataContent(data, settings, version);
content = header + "\r\n\r\n" + content;
content = content.BeautifyContent(settings.TemplateSettings.Template.IndentStr);

if (settings.SaveConfigurationInCommonFile)
{
string selection = GetInlineConfiguration(settings);
content += "\r\n\r\n" + selection;
}
try

if (File.Exists(filename))
{
File.WriteAllText(filename, content);
return true;
var existingContent = File.ReadAllText(filename);
var contentWithoutDate = RemoveDateFromContent(content);
var existingContentWithoutDate = RemoveDateFromContent(existingContent);

if (contentWithoutDate.Trim().Equals(existingContentWithoutDate.Trim(), StringComparison.Ordinal))
{
return false;
}
}
catch (Exception e)

File.WriteAllText(filename, content);
return true;
}

private static string RemoveDateFromContent(string content)
{
var lines = content.Split(new[] { "\r\n", "\n" }, StringSplitOptions.None);
var result = new List<string>();
var skipConfiguration = false;

foreach (var line in lines)
{
MessageBox.Show(e.Message, "Generate", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
if (line.Contains(FileHeaderConstants.CreatedLabel) && line.Contains(":") &&
Regex.IsMatch(line, DatePattern))
{
continue;
}

if (line.Contains(FileHeaderConstants.FilenameLabel) && line.Contains(":"))
{
continue;
}

// Skip configuration section
if (line.Contains("LCG-configuration-BEGIN"))
{
skipConfiguration = true;
continue;
}

if (line.Contains("LCG-configuration-END"))
{
skipConfiguration = false;
continue;
}

if (skipConfiguration)
{
continue;
}

result.Add(line);
}

return string.Join("\r\n", result);
}

private static string GetInlineConfiguration(Settings settings)
Expand All @@ -63,27 +116,27 @@ private static string GetInlineConfiguration(Settings settings)
private static string GetFileHeader(string filename, string orgurl, Settings settings, string version)
{
var header = settings.TemplateSettings.Template.FileHeader
.Replace("{toolname}", settings.TemplateSettings.ToolName)
.Replace("{version}", version)
.Replace("{organization}", orgurl)
.Replace("{filename}", filename)
.Replace("{createdate}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))
.Replace("{legend}", settings.Legend ? settings.TemplateSettings.Template.Legend : string.Empty)
.Replace("{namespace}", settings.NameSpace)
.Replace("\r\n\r\n", "\r\n");
.Replace(FileHeaderConstants.ToolName, settings.TemplateSettings.ToolName)
.Replace(FileHeaderConstants.Version, version)
.Replace(FileHeaderConstants.Organization, orgurl)
.Replace(FileHeaderConstants.Filename, filename)
.Replace(FileHeaderConstants.CreateDate, DateTime.Now.ToString(DateFormat))
.Replace(FileHeaderConstants.Legend, settings.Legend ? settings.TemplateSettings.Template.Legend : string.Empty)
.Replace(FileHeaderConstants.Namespace, settings.NameSpace)
.Replace(FileHeaderConstants.LineEnding, FileHeaderConstants.SingleLineEnding);
return header;
}

private static string GetDataContent(string data, Settings settings, string version)
{
return settings.TemplateSettings.Template.DataContainer
.Replace("{toolname}", settings.TemplateSettings.ToolName)
.Replace("{version}", version)
.Replace("{namespace}", settings.NameSpace)
.Replace("{theme}", string.IsNullOrEmpty(settings.Theme) ? settings.TemplateSettings.Template.DefaultTheme : settings.GetTheme())
.Replace("{legend}", settings.Legend ? settings.TemplateSettings.Template.Legend : string.Empty)
.Replace("{paddingsize}", settings.TableSize.ToString())
.Replace("{data}", data);
.Replace(FileHeaderConstants.ToolName, settings.TemplateSettings.ToolName)
.Replace(FileHeaderConstants.Version, version)
.Replace(FileHeaderConstants.Namespace, settings.NameSpace)
.Replace(FileHeaderConstants.Theme, string.IsNullOrEmpty(settings.Theme) ? settings.TemplateSettings.Template.DefaultTheme : settings.GetTheme())
.Replace(FileHeaderConstants.Legend, settings.Legend ? settings.TemplateSettings.Template.Legend : string.Empty)
.Replace(FileHeaderConstants.PaddingSize, settings.TableSize.ToString())
.Replace(FileHeaderConstants.Data, data);
}

private static string BeautifyContent(this string content, string indentstr)
Expand Down
59 changes: 25 additions & 34 deletions LCG-UDG/Generation/GenerationUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,53 +4,44 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Rappen.XTB.LCG
{
public class GenerationUtils
{
public static bool GenerateFiles(List<EntityMetadataProxy> selectedentities, Settings settings, IConstantFileWriter fileWriter)
{
try
var addedrelationships = new List<string>();
var commonentity = GetCommonEntity(selectedentities, settings);
var suffix = Settings.FileSuffix(settings.TemplateFormat);
if (commonentity != null)
{
var addedrelationships = new List<string>();
var commonentity = GetCommonEntity(selectedentities, settings);
var suffix = Settings.FileSuffix(settings.TemplateFormat);
if (commonentity != null)
{
var entity = GetClass(commonentity, null, settings, addedrelationships);
var fileName = commonentity.GetNameTechnical(settings.FileName, settings) + suffix;
fileWriter.WriteBlock(settings, entity, fileName);
}
if (settings.Groups?.Count > 0)
{
foreach (var group in settings.Groups.Where(g => selectedentities.Any(e => e.Group == g)))
{
var groupstr = GetGroup(group, selectedentities.Where(e => e.Group == group).ToList(), settings, addedrelationships);
fileWriter.WriteBlock(settings, groupstr, group.Name);
}
}
foreach (var entitymetadata in selectedentities.Where(e => e.Group == null))
{
var entity = GetClass(entitymetadata, commonentity, settings, addedrelationships);
var fileName = entitymetadata.GetNameTechnical(settings.FileName, settings) + suffix;
fileWriter.WriteBlock(settings, entity, fileName);
}
if (settings.TemplateSettings.Template.AddAllRelationshipsAfterEntities)
var entity = GetClass(commonentity, null, settings, addedrelationships);
var fileName = commonentity.GetNameTechnical(settings.FileName, settings) + suffix;
fileWriter.WriteBlock(settings, entity, fileName);
}
if (settings.Groups?.Count > 0)
{
foreach (var group in settings.Groups.Where(g => selectedentities.Any(e => e.Group == g)))
{
var relationships = selectedentities.SelectMany(e => e.Relationships.Where(r => r.IsSelected));
relationships = relationships.GroupBy(r => r.LogicalName).Select(r => r.FirstOrDefault()); // This will make it distinct by LogicalName
var allrelationshipsstring = GetRelationships(relationships, settings, addedrelationships);
fileWriter.WriteBlock(settings, allrelationshipsstring, "Relationships" + suffix);
var groupstr = GetGroup(group, selectedentities.Where(e => e.Group == group).ToList(), settings, addedrelationships);
fileWriter.WriteBlock(settings, groupstr, group.Name);
}
return fileWriter.Finalize(settings);
}
catch (Exception ex)
foreach (var entitymetadata in selectedentities.Where(e => e.Group == null))
{
var entity = GetClass(entitymetadata, commonentity, settings, addedrelationships);
var fileName = entitymetadata.GetNameTechnical(settings.FileName, settings) + suffix;
fileWriter.WriteBlock(settings, entity, fileName);
}
if (settings.TemplateSettings.Template.AddAllRelationshipsAfterEntities)
{
MessageBox.Show($"Error:\n{ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
var relationships = selectedentities.SelectMany(e => e.Relationships.Where(r => r.IsSelected));
relationships = relationships.GroupBy(r => r.LogicalName).Select(r => r.FirstOrDefault()); // This will make it distinct by LogicalName
var allrelationshipsstring = GetRelationships(relationships, settings, addedrelationships);
fileWriter.WriteBlock(settings, allrelationshipsstring, "Relationships" + suffix);
}
return fileWriter.Finalize(settings);
Comment on lines +37 to +44
}

private static EntityMetadataProxy GetCommonEntity(List<EntityMetadataProxy> selectedentities, Settings settings)
Expand Down
1 change: 1 addition & 0 deletions LCG-UDG/LCG-UDG-Common.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@
<Compile Include="About.designer.cs">
<DependentUpon>About.cs</DependentUpon>
</Compile>
<Compile Include="Constants\FileHeaderConstants.cs" />
<Compile Include="EntityGroup.cs" />
<Compile Include="Generation\FabienDehopreIdentifier.cs" />
<Compile Include="Generation\UnicodeCharacterUtilities.cs" />
Expand Down
25 changes: 18 additions & 7 deletions LCG-UDG/LCG.cs
Original file line number Diff line number Diff line change
Expand Up @@ -127,20 +127,31 @@ private void btnGenerate_Click(object sender, EventArgs e)
GetSettingsFromUI();
GetSelectionFromUI();
var filewriter = settings.GetWriter(ConnectionDetail.WebApplicationUrl);
if (GenerationUtils.GenerateFiles(entities.Where(ent => ent.Selected).ToList(), settings, filewriter))
try
{
var message = filewriter.GetResult(settings);
if (isUML)
if (GenerationUtils.GenerateFiles(entities.Where(ent => ent.Selected).ToList(), settings, filewriter))
{
this.ShowFileLinkMessage(
message,
settings.CommonFilePath, 10000);
var message = filewriter.GetResult(settings);
if (isUML)
{
this.ShowFileLinkMessage(
message,
settings.CommonFilePath, 10000);
}
else
{
this.ShowSuccessMessage(message, 10000);
}
}
else
{
this.ShowSuccessMessage(message, 10000);
this.ShowInfoMessage("No file needed, probably because no changes.", 5000);
}
}
catch (Exception ex)
{
ShowErrorDialog(ex, $"Generate {settings.TemplateFormat}");
}
}

private void btnLoadEntities_Click(object sender, EventArgs e)
Expand Down
Loading