Example #1
0
        /*
         *  --model=C:\code\nHydrateTestAug\ConsoleApp1\Model1.nhydrate --output=C:\code\nHydrateTestAug --generators=nHydrate.Generator.EFCodeFirstNetCore.EFCodeFirstNetCoreProjectGenerator,nHydrate.Generator.PostgresInstaller.PostgresDatabaseProjectGenerator,nHydrate.Generator.SQLInstaller.Core.DatabaseProjectGenerator
         */

        static int Main(string[] args)
        {
            IConfiguration Configuration = new ConfigurationBuilder()
                                           .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                                           .AddJsonFile("appsettings.development.json", optional: true, reloadOnChange: true)
                                           .AddCommandLine(args)
                                           .Build();

            var modelFile  = string.Empty;
            var output     = string.Empty;
            var generators = new string[0];

            //AppSettings
            var allValues = Configuration.GetChildren().Select(x => new { x.Key, x.Value }).ToDictionary(x => x.Key.ToString(), x => x.Value?.ToString());

            if (allValues.ContainsKey(ModelKey))
            {
                modelFile = allValues[ModelKey];
            }
            if (allValues.ContainsKey(OutputKey))
            {
                output = allValues[OutputKey];
            }
            if (allValues.ContainsKey(GeneratorsKey))
            {
                generators = allValues[GeneratorsKey].Split(",", StringSplitOptions.RemoveEmptyEntries);
            }

            if (modelFile.IsEmpty())
            {
                return(ShowError("The model is required."));
            }
            if (output.IsEmpty())
            {
                return(ShowError("The output folder is required."));
            }

            //If there are no generators specified on the command line then check for the file "nhydrate.generators"
            if (!generators.Any())
            {
                var folderName = (new FileInfo(modelFile)).DirectoryName;
                var genDefFile = Path.Combine(folderName, "nhydrate.generators");
                if (File.Exists(genDefFile))
                {
                    generators = File.ReadAllLines(genDefFile).Where(x => x.Trim() != string.Empty).ToArray();
                }
                if (!generators.Any())
                {
                    return(ShowError("The generators are required."));
                }
            }

            Console.WriteLine($"modelFile='{modelFile}'");
            Console.WriteLine($"output='{output}'");
            Console.WriteLine($"generators='{string.Join(",", generators)}'");

            //NOTE: Yaml Model files must end with ".nhydrate.yaml"
            //Old Xml file ends with ".nhydrate"

            //Specified a folder so look for the file
            string actualFile = null;

            if (Directory.Exists(modelFile))
            {
                var folderName = modelFile;

                //Look for new Yaml file
                var f = Directory.GetFiles(folderName, "*" + FileManagement.ModelExtension).FirstOrDefault();
                if (File.Exists(f))
                {
                    actualFile = f;
                }

                //Look for old xml file
                if (actualFile.IsEmpty())
                {
                    f = Directory.GetFiles(folderName, "*" + FileManagement.OldModelExtension).FirstOrDefault();
                    if (File.Exists(f))
                    {
                        actualFile = f;
                    }
                }

                if (actualFile.IsEmpty())
                {
                    //Back 1 folder
                    folderName = (new DirectoryInfo(folderName)).Parent.FullName;

                    f = Directory.GetFiles(folderName, "*" + FileManagement.ModelExtension).FirstOrDefault();
                    if (File.Exists(f))
                    {
                        actualFile = f;
                    }

                    //Look for old xml file
                    if (actualFile.IsEmpty())
                    {
                        f = Directory.GetFiles(folderName, "*" + FileManagement.OldModelExtension).FirstOrDefault();
                        if (File.Exists(f))
                        {
                            actualFile = f;
                        }
                    }
                }
            }
            else
            {
                //Is this the Yaml model?
                if (modelFile.EndsWith(FileManagement.ModelExtension))
                {
                    actualFile = modelFile;
                }

                //Is this the Xml model?
                if (modelFile.EndsWith(FileManagement.OldModelExtension))
                {
                    actualFile = modelFile;
                }

                //Look one folder back for Yaml
                if (actualFile.IsEmpty())
                {
                    var folderName = (new FileInfo(modelFile)).Directory.Parent.FullName;
                    var f          = Directory.GetFiles(folderName, "*" + FileManagement.ModelExtension).FirstOrDefault();
                    if (File.Exists(f))
                    {
                        actualFile = f;
                    }
                }
            }

            if (actualFile.IsEmpty())
            {
                return(ShowError("Model file not found."));
            }
            modelFile = actualFile;

            var timer       = System.Diagnostics.Stopwatch.StartNew();
            var formatModel = (allValues.ContainsKey("formatmodel") && allValues["formatmodel"] == "true");

            //TODO: when model files missing ID, it generates all fields as first one

            nHydrate.Generator.Common.Models.ModelRoot model = null;
            try
            {
                Console.WriteLine();
                Console.WriteLine("Loading model...");
                model = ModelHelper.CreatePOCOModel(modelFile, formatModel);
            }
            catch (ModelException ex)
            {
                //All YAML validation errors will come here
                Console.WriteLine(ex.Message);
                return(1);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Unknown error.");
                return(1);
            }

            //Generate
            if (model != null && !formatModel)
            {
                Console.WriteLine("Loading generators...");
                var genHelper = new nHydrate.Command.Core.GeneratorHelper(output);
                genHelper.ProjectItemGenerated += new nHydrate.Generator.Common.GeneratorFramework.ProjectItemGeneratedEventHandler(g_ProjectItemGenerated);

                var genList    = new List <nHydrateGeneratorProject>();
                var genProject = new nHydrateGeneratorProject();
                genList.Add(genProject);
                model.ResetKey(model.Key);
                model.GeneratorProject = genProject;
                genProject.Model       = model;
                genProject.FileName    = $"{modelFile}.generating";
                var document = new System.Xml.XmlDocument();
                document.LoadXml($"<modelRoot guid=\"{model.Key}\" type=\"nHydrate.Generator.nHydrateGeneratorProject\" assembly=\"nHydrate.Generator.dll\"><ModelRoot></ModelRoot></modelRoot>");
                ((nHydrate.Generator.Common.GeneratorFramework.IXMLable)model).XmlAppend(document.DocumentElement.ChildNodes[0]);
                System.IO.File.WriteAllText(genProject.FileName, document.ToIndentedString());

                var allgenerators = genHelper.GetProjectGenerators(genProject);
                var excludeList   = allgenerators.Where(x => !generators.Contains(x.FullName)).ToList();

                //Get the last version we generated on this machine
                //We will use this to determine if any other generations have been performed on other machines
                var cacheFile = new nHydrate.Generator.Common.ModelCacheFile(genList.First());
                var cachedGeneratedVersion = cacheFile.GeneratedVersion;
                var generatedVersion       = cachedGeneratedVersion + 1;
                model.GeneratedVersion = generatedVersion;

                Console.WriteLine($"Generating code...");
                foreach (var item in genList)
                {
                    genHelper.GenerateAll(item, excludeList);
                }

                //Save local copy of last generated version
                cacheFile.GeneratedVersion = generatedVersion;
                cacheFile.ModelerVersion   = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
                cacheFile.Save();

                if (File.Exists(genProject.FileName))
                {
                    File.Delete(genProject.FileName);
                }

                //Write stats
                Console.WriteLine();
                Console.WriteLine("Generation Summary");
                Console.WriteLine($"Total Files: {_stats.ProcessedFileCount}");
                Console.WriteLine($"Files Success: {_stats.FilesSuccess}");
                Console.WriteLine($"Files Skipped: {_stats.FilesSkipped}");
                Console.WriteLine($"Files Failed: {_stats.FilesFailed}");
                Console.WriteLine();
            }
            else if (!formatModel)
            {
                Console.WriteLine("The model could not be loaded.");
            }

            timer.Stop();
            Console.WriteLine($"Generation complete. Elapsed={timer.ElapsedMilliseconds}ms");
            return(0);
        }
Example #2
0
        /*
         *  /model:C:\code\nHydrateTestAug\ConsoleApp1\Model1.nhydrate /output:C:\code\nHydrateTestAug /generators:nHydrate.Generator.EFCodeFirstNetCore.EFCodeFirstNetCoreProjectGenerator,nHydrate.Generator.PostgresInstaller.PostgresDatabaseProjectGenerator,nHydrate.Generator.SQLInstaller.Core.DatabaseProjectGenerator
         */

        static int Main(string[] args)
        {
            var commandParams = GetCommandLineParameters();

            if (!commandParams.ContainsKey(ModelKey))
            {
                return(ShowError("The model is required."));
            }
            if (!commandParams.ContainsKey(OutputKey))
            {
                return(ShowError("The output folder is required."));
            }
            if (!commandParams.ContainsKey(GeneratorsKey))
            {
                return(ShowError("The generators are required."));
            }

            var modelFile  = commandParams[ModelKey];
            var output     = commandParams[OutputKey];
            var generators = commandParams[GeneratorsKey].Split(",", StringSplitOptions.RemoveEmptyEntries);

            nHydrate.Generator.Common.Models.ModelRoot model = null;
            try
            {
                model = ModelHelper.CreatePOCOModel(modelFile);
            }
            catch (ModelException ex)
            {
                Console.WriteLine(ex.Message);
                return(1);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Unknown error.");
                return(1);
            }

            //Generate
            if (model != null)
            {
                var genHelper = new nHydrate.Command.Core.GeneratorHelper(output);

                var genList    = new List <nHydrateGeneratorProject>();
                var genProject = new nHydrateGeneratorProject();
                genList.Add(genProject);
                model.SetKey(model.Id.ToString());
                model.GeneratorProject = genProject;
                genProject.Model       = model;
                genProject.FileName    = modelFile + ".generating";
                var document = new System.Xml.XmlDocument();
                document.LoadXml("<modelRoot guid=\"" + model.Id + "\" type=\"nHydrate.Generator.nHydrateGeneratorProject\" assembly=\"nHydrate.Generator.dll\"><ModelRoot></ModelRoot></modelRoot>");
                ((nHydrate.Generator.Common.GeneratorFramework.IXMLable)model).XmlAppend(document.DocumentElement.ChildNodes[0]);
                System.IO.File.WriteAllText(genProject.FileName, document.ToIndentedString());

                var allgenerators = genHelper.GetProjectGenerators(genProject);

                var excludeList = allgenerators.Where(x => !generators.Contains(x.FullName)).ToList();

                foreach (var item in genList)
                {
                    genHelper.GenerateAll(item, excludeList);
                }
            }

            return(0);
        }