-
Notifications
You must be signed in to change notification settings - Fork 32
Expand file tree
/
Copy pathProgram.cs
More file actions
138 lines (117 loc) · 5.66 KB
/
Program.cs
File metadata and controls
138 lines (117 loc) · 5.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
using DG.Tools;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using System.Text.RegularExpressions;
namespace DG.Tools.XrmMockup.Metadata {
class Program {
public static ArgumentParser ParsedArgs;
static List<string> listOfAssemblies = new List<string>();
private static Assembly ResolveXrmAssemblies(object sender, ResolveEventArgs args) {
if (listOfAssemblies.Contains(args.Name)) {
return null;
}
try {
listOfAssemblies.Add(args.Name);
return AssemblyGetter.GetAssemblyFromName(args.Name);
}
finally {
listOfAssemblies.Remove(args.Name);
}
}
static void Main(string[] args)
{
ParsedArgs = new ArgumentParser(Arguments.ArgList, args);
AppDomain.CurrentDomain.AssemblyResolve += ResolveXrmAssemblies;
GenerateMetadata();
}
static void GenerateMetadata() {
var auth = new AuthHelper(
ParsedArgs[Arguments.Url],
ParsedArgs[Arguments.Username],
ParsedArgs[Arguments.Password],
ParsedArgs[Arguments.AuthProvider],
ParsedArgs[Arguments.Domain],
ParsedArgs[Arguments.Method],
ParsedArgs[Arguments.ClientId],
ParsedArgs[Arguments.ReturnUrl],
ParsedArgs[Arguments.ClientSecret],
ParsedArgs[Arguments.ConnectionString]
);
Console.WriteLine("Generation of metadata files started");
bool includeSystemEntities = true;
if (ParsedArgs[Arguments.IncludeSystemEntities] != null)
{
includeSystemEntities = Convert.ToBoolean(ParsedArgs[Arguments.IncludeSystemEntities]);
}
var generator = new DataHelper(auth.Authenticate(), ParsedArgs[Arguments.Entities], ParsedArgs[Arguments.Solutions], ParsedArgs.GetAsType<bool>(Arguments.fetchFromAssemblies),includeSystemEntities);
var outputLocation = ParsedArgs[Arguments.OutDir] ?? Directory.GetCurrentDirectory();
var outputFileName = ParsedArgs[Arguments.OutputFileName] ?? "Metadata.xml";
var skeleton = generator.GetMetadata();
var serializer = new DataContractSerializer(typeof(MetadataSkeleton));
var workflowSerializer = new DataContractSerializer(typeof(Entity));
var securitySerializer = new DataContractSerializer(typeof(SecurityRole));
var workflowsLocation = Path.Combine(outputLocation, "Workflows");
var securityLocation = Path.Combine(outputLocation, "SecurityRoles");
Console.WriteLine("Deleting old files");
Directory.CreateDirectory(workflowsLocation);
foreach (var file in Directory.EnumerateFiles(workflowsLocation, "*.xml")) {
File.Delete(Path.Combine(workflowsLocation, file));
}
Directory.CreateDirectory(securityLocation);
foreach (var file in Directory.EnumerateFiles(securityLocation, "*.xml")) {
File.Delete(Path.Combine(securityLocation, file));
}
Console.WriteLine("Writing files");
Directory.CreateDirectory(outputLocation);
using (var stream = new FileStream(outputLocation + "/" + outputFileName, FileMode.Create)) {
serializer.WriteObject(stream, skeleton);
}
foreach (var workflow in generator.GetWorkflows()) {
var safeName = ToSafeName(workflow.GetAttributeValue<string>("name"));
using (var stream = new FileStream($"{workflowsLocation}/{safeName}.xml", FileMode.Create)) {
workflowSerializer.WriteObject(stream, workflow);
}
}
var securityRoles = generator.GetSecurityRoles(skeleton.RootBusinessUnit.Id);
foreach (var securityRole in securityRoles) {
var safeName = ToSafeName(securityRole.Value.Name);
using (var stream = new FileStream($"{securityLocation}/{safeName}.xml", FileMode.Create)) {
securitySerializer.WriteObject(stream, securityRole.Value);
}
}
// Write to TypeDeclarations file
var typedefFile = Path.Combine(outputLocation, "TypeDeclarations.cs");
using (var file = new StreamWriter(typedefFile, false)) {
file.WriteLine("using System;");
file.WriteLine("");
file.WriteLine("namespace DG.Tools.XrmMockup {");
file.WriteLine("\tpublic struct SecurityRoles {");
foreach (var securityRole in securityRoles.OrderBy(x => x.Value.Name)) {
file.WriteLine($"\t\tpublic static Guid {ToSafeName(securityRole.Value.Name)} = new Guid(\"{securityRole.Key}\");");
}
file.WriteLine("\t}");
file.WriteLine("}");
}
}
private static bool StartsWithNumber(string str) {
return str.Length > 0 && str[0] >= '0' && str[0] <= '9';
}
private static string ToSafeName(string str) {
var compressed = Regex.Replace(str, @"[^\w]", "");
if (StartsWithNumber(compressed)) {
return $"_{compressed}";
}
if (String.IsNullOrWhiteSpace(compressed)) {
return "_EmptyString";
}
return compressed;
}
}
}