Пример #1
0
        protected override void HandleCommand(CommandPacket commandPacket)
        {
            try
            {
                switch (commandPacket.Command)
                {
                case ServerCommands.GENERATE:
                {
                    var kind          = commandPacket.Arguments.Single(a => a.Key == "Kind").Value;
                    var generatorKind = EnumUtils.GetValue <GeneratorKind>(((string)kind).ToTitleCase());

                    if (generatorKind == GeneratorKind.App)
                    {
                        var    entitiesProjectPath = commandPacket.Arguments.Single(a => a.Key == "EntitiesProjectPath").Value;
                        var    servicesProjectPath = commandPacket.Arguments.Single(a => a.Key == "ServicesProjectPath").Value;
                        var    generatorPass       = EnumUtils.GetValue <GeneratorPass>((string)commandPacket.Arguments.Single(a => a.Key == "GeneratorPass").Value);
                        var    noFileCreation      = bool.Parse(commandPacket.Arguments.Single(a => a.Key == "NoFileCreation").Value.ToString());
                        var    projectFolderRoot   = currentWorkingDirectory;
                        object packageCachePath    = null;

                        if (commandPacket.Arguments.Any(a => a.Key == "PackageCachePath"))
                        {
                            packageCachePath = commandPacket.Arguments.Single(a => a.Key == "PackageCachePath").Value;
                        }

                        generatorHandler = new GeneratorHandler();

                        webApiService.GeneratorHandler       = generatorHandler;
                        generatorHandler.SuppressDebugOutput = true;

                        generatorHandler.Execute(new Dictionary <string, object>
                            {
                                { "GeneratorKind", generatorKind },
                                { "EntitiesProjectPath", entitiesProjectPath },
                                { "ServicesProjectPath", servicesProjectPath },
                                { "PackageCachePath", packageCachePath },
                                { "GeneratorMode", GeneratorMode.RedirectedConsole },
                                { "GeneratorOptions", new RedirectedGeneratorOptions(outputWriter, errorWriter, generatorPass, noFileCreation) }
                            });
                    }
                    else if (generatorKind == GeneratorKind.BusinessModel)
                    {
                        var generatorPass     = EnumUtils.GetValue <GeneratorPass>((string)commandPacket.Arguments.Single(a => a.Key == "GeneratorPass").Value);
                        var noFileCreation    = bool.Parse(commandPacket.Arguments.Single(a => a.Key == "NoFileCreation").Value.ToString());
                        var templateFile      = commandPacket.Arguments.Single(a => a.Key == "TemplateFile").Value.ToString();
                        var projectFolderRoot = currentWorkingDirectory;

                        generatorHandler = new GeneratorHandler();

                        webApiService.GeneratorHandler       = generatorHandler;
                        generatorHandler.SuppressDebugOutput = true;

                        generatorHandler.Execute(new Dictionary <string, object>
                            {
                                { "GeneratorKind", generatorKind },
                                { "TemplateFile", templateFile },
                                { "GeneratorMode", GeneratorMode.RedirectedConsole },
                                { "GeneratorOptions", new RedirectedGeneratorOptions(outputWriter, errorWriter, generatorPass, noFileCreation) }
                            });
                    }
                    else if (generatorKind == GeneratorKind.Entities)
                    {
                        var generatorPass       = EnumUtils.GetValue <GeneratorPass>((string)commandPacket.Arguments.Single(a => a.Key == "GeneratorPass").Value);
                        var noFileCreation      = bool.Parse(commandPacket.Arguments.Single(a => a.Key == "NoFileCreation").Value.ToString());
                        var templateFile        = commandPacket.Arguments.Single(a => a.Key == "TemplateFile").Value.ToString();
                        var jsonFile            = commandPacket.Arguments.Single(a => a.Key == "JsonFile").Value.ToString();
                        var businessModelFile   = commandPacket.Arguments.Single(a => a.Key == "BusinessModelFile").Value.ToString();
                        var entitiesProjectPath = commandPacket.Arguments.Single(a => a.Key == "EntitiesProjectPath").Value;
                        var projectFolderRoot   = currentWorkingDirectory;

                        generatorHandler = new GeneratorHandler();

                        webApiService.GeneratorHandler       = generatorHandler;
                        generatorHandler.SuppressDebugOutput = true;

                        generatorHandler.Execute(new Dictionary <string, object>
                            {
                                { "GeneratorKind", generatorKind },
                                { "TemplateFile", templateFile },
                                { "JsonFile", jsonFile },
                                { "BusinessModelFile", businessModelFile },
                                { "EntitiesProjectPath", entitiesProjectPath },
                                { "GeneratorMode", GeneratorMode.RedirectedConsole },
                                { "GeneratorOptions", new RedirectedGeneratorOptions(outputWriter, errorWriter, generatorPass, noFileCreation) }
                            });
                    }
                    else if (generatorKind == GeneratorKind.Workspace)
                    {
                        var generatorPass     = EnumUtils.GetValue <GeneratorPass>((string)commandPacket.Arguments.Single(a => a.Key == "GeneratorPass").Value);
                        var noFileCreation    = bool.Parse(commandPacket.Arguments.Single(a => a.Key == "NoFileCreation").Value.ToString());
                        var appName           = commandPacket.Arguments.Single(a => a.Key == "AppName").Value.ToString();
                        var appDescription    = commandPacket.Arguments.Single(a => a.Key == "AppDescription").Value.ToString();
                        var projectFolderRoot = currentWorkingDirectory;

                        generatorHandler = new GeneratorHandler();

                        webApiService.GeneratorHandler       = generatorHandler;
                        generatorHandler.SuppressDebugOutput = true;

                        generatorHandler.Execute(new Dictionary <string, object>
                            {
                                { "GeneratorKind", generatorKind },
                                { "AppName", appName },
                                { "AppDescription", appDescription },
                                { "GeneratorMode", GeneratorMode.RedirectedConsole },
                                { "GeneratorOptions", new RedirectedGeneratorOptions(outputWriter, errorWriter, generatorPass, noFileCreation) }
                            });
                    }
                }

                break;

                case ServerCommands.TERMINATE:
                {
                    if (generatorHandler != null)
                    {
                        var config = generatorHandler.GeneratorConfiguration;

                        commandPacket = new CommandPacket(commandPacket.Command, commandPacket.SentTimestamp, "Terminating");
                        outputWriter.WriteJsonCommand(commandPacket, null);

                        config.StopServices();

                        outputWriter.WriteLine(Environment.NewLine);
                    }
                    else
                    {
                        commandPacket = new CommandPacket(commandPacket.Command, commandPacket.SentTimestamp, "Terminating");
                        outputWriter.WriteJsonCommand(commandPacket);
                    }

                    this.Stop();
                }

                break;

                case ServerCommands.CONNECT:
                {
                    commandPacket = new CommandPacket(commandPacket.Command, commandPacket.SentTimestamp, "Connected successfully");
                    outputWriter.WriteJsonCommand(commandPacket);
                }

                break;

                case ServerCommands.PING:
                {
                    commandPacket = new CommandPacket(commandPacket.Command, commandPacket.SentTimestamp, "Success");
                    outputWriter.WriteJsonCommand(commandPacket);
                }

                break;

                case ServerCommands.GET_VERSION:
                {
                    var version = Assembly.GetEntryAssembly().GetAttributes().Version;

                    commandPacket = new CommandPacket(commandPacket.Command, commandPacket.SentTimestamp, version);
                    outputWriter.WriteJsonCommand(commandPacket);
                }

                break;

                case ServerCommands.GET_FOLDER:
                {
                    var relativePath = (string)commandPacket.Arguments.Single(a => a.Key == "relativePath").Value;
                    var config       = generatorHandler.GeneratorConfiguration;
                    var folder       = (Folder)config.FileSystem[relativePath];

                    commandPacket = new CommandPacket(commandPacket.Command, commandPacket.SentTimestamp, folder);
                    outputWriter.WriteJsonCommand(commandPacket);
                }

                break;

                case ServerCommands.GET_FILE:
                {
                    var relativePath = (string)commandPacket.Arguments.Single(a => a.Key == "relativePath").Value;
                    var config       = generatorHandler.GeneratorConfiguration;
                    var file         = (File)config.FileSystem[relativePath];

                    commandPacket = new CommandPacket(commandPacket.Command, commandPacket.SentTimestamp, file);
                    outputWriter.WriteJsonCommand(commandPacket);
                }

                break;

                case ServerCommands.GET_FOLDERS:
                {
                    var relativePath = (string)commandPacket.Arguments.Single(a => a.Key == "relativePath").Value;
                    var config       = generatorHandler.GeneratorConfiguration;
                    var folder       = (Folder)config.FileSystem[relativePath];

                    commandPacket = new CommandPacket(commandPacket.Command, commandPacket.SentTimestamp, folder.Folders.ToArray());
                    outputWriter.WriteJsonCommand(commandPacket);
                }

                break;

                case ServerCommands.GET_FILES:
                {
                    var relativePath = (string)commandPacket.Arguments.Single(a => a.Key == "relativePath").Value;
                    var config       = generatorHandler.GeneratorConfiguration;
                    var folder       = (Folder)config.FileSystem[relativePath];

                    commandPacket = new CommandPacket(commandPacket.Command, commandPacket.SentTimestamp, folder.Files.ToArray());
                    outputWriter.WriteJsonCommand(commandPacket);
                }

                break;

                case ServerCommands.GET_PACKAGE_INSTALLS:
                {
                    var config          = generatorHandler.GeneratorConfiguration;
                    var packageInstalls = config.PackageInstalls;

                    // kn todo - comment
                    // packageInstalls = packageInstalls.Randomize().Take(5).ToList();
                    // packageInstalls = new List<string> { "@gracesnoh/tiny" };

                    commandPacket = new CommandPacket(commandPacket.Command, commandPacket.SentTimestamp, packageInstalls.ToArray());
                    outputWriter.WriteJsonCommand(commandPacket);
                }

                break;

                case ServerCommands.GET_PACKAGE_DEV_INSTALLS:
                {
                    var config             = generatorHandler.GeneratorConfiguration;
                    var packageDevInstalls = config.PackageDevInstalls;

                    // kn todo - comment
                    // packageDevInstalls = packageDevInstalls.Randomize().Take(2).ToList();
                    // packageDevInstalls = new List<string> { "@gracesnoh/tiny" };

                    commandPacket = new CommandPacket(commandPacket.Command, commandPacket.SentTimestamp, packageDevInstalls.ToArray());
                    outputWriter.WriteJsonCommand(commandPacket);
                }

                break;

                case ServerCommands.GET_CACHE_STATUS:
                {
                    var config      = generatorHandler.GeneratorConfiguration;
                    var mode        = (string)commandPacket.Arguments.Single(a => a.Key == "mode").Value;
                    var cacheStatus = config.GetCacheStatus(mode, true);

                    commandPacket = new CommandPacket(commandPacket.Command, commandPacket.SentTimestamp, cacheStatus);
                    outputWriter.WriteJsonCommand(commandPacket);
                }

                break;

                case ServerCommands.SET_INSTALL_STATUS:
                {
                    var config = generatorHandler.GeneratorConfiguration;
                    var status = (string)commandPacket.Arguments.Single(a => a.Key == "status").Value;
                    var result = config.SetInstallStatus(status);

                    commandPacket = new CommandPacket(commandPacket.Command, commandPacket.SentTimestamp, result);
                    outputWriter.WriteJsonCommand(commandPacket);
                }

                break;

                case ServerCommands.GET_FILE_ICON:
                {
                    var relativePath = (string)commandPacket.Arguments.Single(a => a.Key == "relativePath").Value;
                    var config       = generatorHandler.GeneratorConfiguration;
                    var file         = (File)config.FileSystem[relativePath];
                    var bitmap       = file.Icon.ToBitmap();

                    bitmap.MakeTransparent(Color.Black);

                    using (var stream = new System.IO.MemoryStream())
                    {
                        bitmap.Save(stream, ImageFormat.Gif);
                        stream.Flush();
                        stream.Rewind();

                        commandPacket = new CommandPacket(commandPacket.Command, commandPacket.SentTimestamp, stream.ToBase64() + Environment.NewLine.Repeat(2));
                    }

                    outputWriter.WriteJsonCommand(commandPacket);
                }

                break;

                case ServerCommands.GET_FILE_CONTENTS:
                {
                    var    relativePath = (string)commandPacket.Arguments.Single(a => a.Key == "relativePath").Value;
                    var    config       = generatorHandler.GeneratorConfiguration;
                    var    file         = (File)config.FileSystem[relativePath];
                    var    fileInfo     = file.SystemLocalFile;
                    byte[] contents;

                    if (fileInfo.Exists)
                    {
                        contents = System.IO.File.ReadAllBytes(fileInfo.FullName);
                    }
                    else
                    {
                        contents = file.Info.ToString().ToBytes();
                    }

                    using (var stream = new System.IO.MemoryStream())
                    {
                        stream.Write(contents, 0, contents.Length);
                        stream.Flush();
                        stream.Rewind();

                        commandPacket = new CommandPacket(commandPacket.Command, commandPacket.SentTimestamp, stream.ToBase64() + Environment.NewLine.Repeat(2));
                    }

                    outputWriter.WriteJsonCommand(commandPacket);
                }

                break;

                default:
                    DebugUtils.Break();
                    break;
                }
            }
            catch (Exception ex)
            {
#if DEBUG
                errorWriter.Write(ex.ToString());
#else
                errorWriter.Write(ex.Message);
#endif
                errorWriter.Flush();

                Environment.Exit(1);
            }
        }
Пример #2
0
        public static void Main(string[] args)
        {
            var waitForInput            = false;
            var debugAttach             = false;
            var currentWorkingDirectory = Environment.CurrentDirectory;
            var parentProcess           = Process.GetCurrentProcess().GetParent();
            StandardStreamService streamService;
            GeneratorHandler      generatorHandler = null;
            var parseResult = CommandLineParser.ParseArgs <ParseResult>(args, (result, arg) =>
            {
            },
                                                                        (result, _switch, switchArg) =>
            {
                switch (_switch)
                {
                case SwitchCommands.DEBUG:
                    debugAttach = true;
                    break;

                case SwitchCommands.WAIT_FOR_INPUT:
                    waitForInput = true;
                    break;

                case SwitchCommands.CWD:
                    currentWorkingDirectory = switchArg;
                    break;
                }
            });

            AppDomain.CurrentDomain.DomainUnload += CurrentDomain_DomainUnload;

            if (debugAttach)
            {
                Debugger.Launch();
            }

            if (waitForInput)
            {
                var url = ConfigurationManager.AppSettings["WebApiUrl"];

                webApiService = new WebApiService(url);
                streamService = new StandardStreamService(webApiService);

                streamService.Start(parentProcess, currentWorkingDirectory);
                webApiService.Start();

                streamService.Wait();
            }
            else
            {
                var packageCachePath = Environment.ExpandEnvironmentVariables(@"%APPDATA%\hydra\cache");
                var testWebApi       = Environment.CommandLine.Contains("/TestWebApi");
                var container        = new UnityContainer();
                KeyValuePair <string, IGeneratorOverrides> keyValuePair;
                IGeneratorOverrides generatorOverrides;
                string argumentsKind;

                AppDomain.CurrentDomain.SetData("UnityContainer", container);

                generatorHandler = new GeneratorHandler();
                keyValuePair     = generatorHandler.GetOverrides().LastOrDefault();

                argumentsKind      = keyValuePair.Key;
                generatorOverrides = keyValuePair.Value;

                if (testWebApi)
                {
                    var url = ConfigurationManager.AppSettings["WebApiUrl"];

                    webApiService = new WebApiService(url);
                    webApiService.GeneratorHandler       = generatorHandler;
                    generatorHandler.SuppressDebugOutput = true;

                    Console.WriteLine($"Starting WebAPI Service at '{ url }'");

                    webApiService.Start();
                }

                if (RUN_UNIT_TESTS)
                {
                    UnitTests.RunUnitTests();
                }

                if (argumentsKind != null)
                {
                    var arguments = generatorOverrides.GetHandlerArguments(packageCachePath, argumentsKind);

                    if (arguments.ContainsKey("GeneratorKinds"))
                    {
                        var generatorKinds = ((string)arguments["GeneratorKinds"]).Split(',').Select(k => k.Trim());

                        foreach (var kind in generatorKinds)
                        {
                            arguments = generatorOverrides.GetHandlerArguments(packageCachePath, kind);

                            generatorHandler.Execute(arguments);
                        }
                    }
                    else
                    {
                        generatorHandler.Execute(arguments);
                    }
                }
                else
                {
                    Console.WriteLine("This program was not intended to be run directly");
                }
            }
        }