package Visual_DVM_2021.Passes.All; import Common.Current; import Common.Global; import Common.GlobalProperties; import Common.UI.UI; import Common.Utils.Utils; import GlobalData.Settings.SettingName; import ProjectData.LanguageName; import Repository.Server.ServerCode; import Repository.Server.ServerExchangeUnit_2021; import SapforTestingSystem.Json.SapforPackage_json; import SapforTestingSystem.Json.SapforScenario_json; import SapforTestingSystem.SapforConfiguration.SapforConfiguration; import SapforTestingSystem.SapforConfiguration.SapforConfigurationInterface; import SapforTestingSystem.SapforConfigurationCommand.SapforConfigurationCommand; import SapforTestingSystem.SapforScenario.SapforScenario; import SapforTestingSystem.SapforTasksPackage.SapforTasksPackage; import TestingSystem.Group.Group; import TestingSystem.Test.Test; import TestingSystem.Test.TestInterface; import Visual_DVM_2021.Passes.PassCode_2021; import Visual_DVM_2021.Passes.Pass_2021; import Visual_DVM_2021.Passes.TestingSystemPass; import org.apache.commons.io.FileUtils; import java.io.File; import java.nio.file.Paths; import java.util.LinkedHashMap; import java.util.Vector; import java.util.stream.Collectors; public class StartSapforTests extends Pass_2021 { protected int allTasksCount = 0; //-- protected LinkedHashMap> groupsTests = null; //-- protected LinkedHashMap allTests = null; protected Vector testsNames_lower = null; //все тесты что участвуют здесь protected Vector groupsLanguages = null; protected File sapfor = null; //--- @Override public String getIconPath() { return "/icons/Start.png"; } @Override public String getButtonText() { return ""; } @Override protected boolean needsAnimation() { return true; } //-- protected boolean checkTestName(Test test) { String name = test.description.toLowerCase(); if (testsNames_lower.contains(name)) { Log.Writeln_("В пакет не могут входить тесты с одинаковыми именами (без учета регистра):" + test.description.toLowerCase()); return false; } testsNames_lower.add(name); return true; } protected boolean getGroupTests(String groupId) { Vector groupTests = new Vector<>(); Vector selectedGroupTests = new Vector<>(); //--- for (Test test : Global.testingServer.db.tests.Data.values()) { if (test.group_id.equals(groupId)) { groupTests.add(test.id); if (test.isSelected()) selectedGroupTests.add(test.id); } } if (!groupTests.isEmpty() && !selectedGroupTests.isEmpty()) groupTests = selectedGroupTests; //--- if (groupTests.isEmpty()) { Log.Writeln_("Пустая группа тестов: " + groupId); return false; } //-- for (String testId : groupTests) { Test test = Global.testingServer.db.tests.get(testId); if (!checkTestName(test)) return false; else allTests.put(test.description, test); } //-- groupsTests.put(groupId, groupTests); //-- return true; } public boolean getConfigurationCommands(SapforConfiguration sapforConfiguration) { //1. получить список всех команд. Vector codes = new Vector<>(); int v = 0; for (SapforConfigurationCommand command : Global.testingServer.db.sapforConfigurationCommands.Data.values()) { if (command.sapforconfiguration_id.equals(sapforConfiguration.id)) { codes.add(command.passCode); if (command.passCode.equals(PassCode_2021.CreateParallelVariants)) v++; } } //-- if (codes.size() == 0) { Log.Writeln_("Пустая конфигурация:" + sapforConfiguration.id); return false; } //-- if (v > 2) { Log.Writeln_("Неверная конфигурация:" + sapforConfiguration.id + ": построение параллельных вариантов возможно единожды."); return false; } //-- if ((v == 1) && codes.size() > 1) { if (!codes.lastElement().equals(PassCode_2021.CreateParallelVariants)) { Log.Writeln_("Неверная конфигурация:" + sapforConfiguration.id + ": построение параллельных вариантов может быть только завершающей командой!"); return false; } } return true; } @Override protected boolean canStart(Object... args) throws Exception { //-- allTasksCount = 0; target = null; //-- groupsTests = new LinkedHashMap<>(); //--->> testsNames_lower = new Vector<>(); allTests = new LinkedHashMap<>(); groupsLanguages = new Vector<>(); //проверка стартовых условий. //--->> if (Global.testingServer.db.sapforConfigurations.getCheckedCount() == 0) { Log.Writeln_("Не отмечено ни одной конфигурации SAPFOR."); return false; } //- for (SapforConfiguration configuration : Global.testingServer.db.sapforConfigurations.getCheckedItems()) { if (!getConfigurationCommands(configuration)) return false; } //-- if (Global.testingServer.db.groups.getCheckedCount() == 0) { Log.Writeln_("Не отмечено ни одной группы тестов"); return false; } //-- for (Group group : Global.testingServer.db.groups.getCheckedItems()) { //--- if (!groupsLanguages.contains(group.language)) groupsLanguages.add(group.language); //- if (groupsLanguages.get(0) != LanguageName.fortran) { Log.Writeln_("Поддерживается пакетный режим только для языка Fortran!"); return false; } if (groupsLanguages.size() > 1) { Log.Writeln_("Запуск тестов на разных языках в рамках одного пакета запрещен!"); return false; } //--- if (!getGroupTests(group.id)) return false; } //-- for (int i = 0; i < Global.testingServer.db.sapforConfigurations.getCheckedCount(); ++i) { for (Vector tests : groupsTests.values()) allTasksCount += tests.size(); } //-- return (UI.Question("Будет запущено:\n" + allTasksCount + " задач\n" + "Продолжить")) && new TestingSystemPass() { @Override public String getDescription() { return "Синхронизация тестов"; } @Override protected boolean needsAnimation() { return true; } @Override protected void ServerAction() throws Exception { for (Test test : allTests.values()) { ShowMessage1("загрузка " + test.description); Command(new ServerExchangeUnit_2021(ServerCode.DownloadTest, test.id)); response.Unpack(TestInterface.getArchive(test)); } } }.Do(); } @Override protected void body() throws Exception { //--- ShowMessage1("Распаковка тестов..."); //сразу в задачи распаковывать нельзя, потому что копируются под ид,а не дескриптион. for (Test test : allTests.values()) { ShowMessage2(test.description); File testDst = new File(Global.TestsDirectory, test.id); Utils.delete_with_check(testDst); passes.get(PassCode_2021.UnzipFolderPass).Do( TestInterface.getArchive(test).getAbsolutePath(), Global.TestsDirectory.getAbsolutePath(), false ); } target = new SapforScenario(); target.sapfor_version = String.valueOf(Current.getSapfor().version); target.tasksCount = allTasksCount; Global.db.Insert(target); //--->>> File scenarioWorkspace = Paths.get(Global.db.settings.get(SettingName.Workspace).Value, String.valueOf(target.id)).toFile(); Utils.CheckAndCleanDirectory(scenarioWorkspace); target.workspace = scenarioWorkspace.getAbsolutePath(); target.testsNames = String.join(";", testsNames_lower); sapfor = new File(target.workspace, "SAPFOR_F.exe"); //развилка на линукс ShowMessage2("Копирование SAPFOR"); FileUtils.copyFile(Current.getSapfor().getFile(), sapfor); ShowMessage2("Копирование визуализатора"); File visualiser = new File(target.workspace, "VisualSapfor.jar"); FileUtils.copyFile(Global.visualiser.getFile(), visualiser); ShowMessage2("Создание настроек"); GlobalProperties properties = new GlobalProperties(); properties.Mode = Current.Mode.Scenario; //---- Utils.jsonToFile(properties, new File(target.workspace, "properties")); //---- File scenarioFile = new File(target.workspace, "scenario.txt"); SapforScenario_json scenario_json = new SapforScenario_json(); scenario_json.tests.addAll(allTests.keySet()); //scenario_json.flags = SapforConfigurationInterface.getFlags(configuration); //---- Global.db.Update(target); ShowMessage1("Создание рабочих пространств..."); for (SapforConfiguration configuration : Global.testingServer.db.sapforConfigurations.getCheckedItems()) { SapforTasksPackage sapforTasksPackage = new SapforTasksPackage(); Vector codes = SapforConfigurationInterface.getPassCodes(configuration); Vector passesNames = codes.stream().map(PassCode_2021::getDescription).collect(Collectors.toCollection(Vector::new)); //-- sapforTasksPackage.sapforscenario_id = target.id; sapforTasksPackage.sapforconfiguration_id = configuration.id; sapforTasksPackage.flags = SapforConfigurationInterface.getFlags(configuration); sapforTasksPackage.passesNames = String.join(";", passesNames); //-- Global.db.Insert(sapforTasksPackage); sapforTasksPackage.workspace = Paths.get( Global.db.settings.get(SettingName.Workspace).Value, String.valueOf(target.id), String.valueOf(sapforTasksPackage.id) ).toFile().getAbsolutePath(); //--- Utils.CheckAndCleanDirectory(new File(sapforTasksPackage.workspace)); //--- for (Vector testIds : groupsTests.values()) { for (String testId : testIds) { Test test = Global.testingServer.db.tests.get(testId); ShowMessage2(test.description); //-- File taskWorkspace = new File(sapforTasksPackage.workspace, test.description); Utils.CheckAndCleanDirectory(taskWorkspace); //-- Utils.copyDirectory(new File(Global.TestsDirectory, test.id), taskWorkspace); } } Global.db.Update(sapforTasksPackage); //--->> SapforPackage_json package_json = new SapforPackage_json(); package_json.id = String.valueOf(sapforTasksPackage.id); package_json.flags = sapforTasksPackage.flags; package_json.codes.addAll(codes); //--->> scenario_json.packages.add(package_json); } //-- Utils.jsonToFile(scenario_json, scenarioFile); } @Override protected void showFinish() throws Exception { Global.db.sapforScenarios.ShowUI(target.getPK()); } @Override protected void performDone() throws Exception { /* //тут должен быть планировщик и очередь пакетов. отдельной нитью. for (SapforTasksPackage_2023 sapforTasksPackage_2023 : target) { File workspaceFile = new File(sapforTasksPackage_2023.workspace); // Utils.startScript(workspaceFile, workspaceFile, "start", "java -jar VisualSapfor.jar"); Utils.startScript_(workspaceFile, workspaceFile, "start", "java -jar VisualSapfor.jar"); } */ } @Override protected void showDone() throws Exception { Global.db.sapforScenarios.ShowUI(); } }