package _VisualDVM.TestingSystem.Common; import Common.CommonConstants; import Common.Database.RepositoryRefuseException; import Common.Database.SQLITE.SQLiteDatabase; import Common.Utils.Utils_; import _VisualDVM.ComponentsServer.Component.Sapfor.Sapfor; import _VisualDVM.ComponentsServer.UserAccount.UserAccount; import _VisualDVM.Constants; import _VisualDVM.Global; import _VisualDVM.Passes.All.ZipFolderPass; import _VisualDVM.Passes.PassCode; import _VisualDVM.ServerObjectsCache.VisualCaches; import _VisualDVM.TestingSystem.Common.Group.Group; import _VisualDVM.TestingSystem.Common.Group.GroupsDBTable; import _VisualDVM.TestingSystem.Common.Test.Test; import _VisualDVM.TestingSystem.Common.Test.TestDBTable; import _VisualDVM.TestingSystem.Common.TestingPackageToKill.TestingPackagesToKillDBTable; import _VisualDVM.TestingSystem.DVM.DVMConfiguration.DVMConfiguration; import _VisualDVM.TestingSystem.DVM.DVMConfiguration.DVMConfigurationDBTable; import _VisualDVM.TestingSystem.DVM.DVMPackage.DVMPackage; import _VisualDVM.TestingSystem.DVM.DVMPackage.DVMPackageDBTable; import _VisualDVM.TestingSystem.DVM.DVMSettings.DVMSettingsDBTable; import _VisualDVM.TestingSystem.DVM.DVMTasks.DVMRunTasksSet; import _VisualDVM.TestingSystem.SAPFOR.SapforConfiguration.SapforConfiguration; import _VisualDVM.TestingSystem.SAPFOR.SapforConfiguration.SapforConfigurationDBTable; import _VisualDVM.TestingSystem.SAPFOR.SapforPackage.SapforPackage; import _VisualDVM.TestingSystem.SAPFOR.SapforPackage.SapforPackageDBTable; import _VisualDVM.TestingSystem.SAPFOR.SapforSettings.SapforSettingsDBTable; import _VisualDVM.TestingSystem.SAPFOR.SapforSettingsCommand.SapforSettingsCommandsDBTable; import _VisualDVM.TestingSystem.SAPFOR.ServerSapfor.ServerSapfor; import _VisualDVM.TestingSystem.SAPFOR.ServerSapfor.ServerSapforState; import _VisualDVM.TestingSystem.SAPFOR.ServerSapfor.ServerSapforsDBTable; import _VisualDVM.Utils; import javafx.util.Pair; import org.apache.commons.io.FileUtils; import java.io.File; import java.nio.file.Paths; import java.util.Comparator; import java.util.LinkedHashMap; import java.util.Vector; public class TestsDatabase extends SQLiteDatabase { public DVMConfigurationDBTable dvmConfigurations; public TestDBTable tests; public GroupsDBTable groups; public DVMPackageDBTable dvmPackages; public SapforPackageDBTable sapforPackages; //-- public TestingPackagesToKillDBTable testingPackagesToKill; //-- public SapforConfigurationDBTable sapforConfigurations; //---- public ServerSapforsDBTable serverSapfors; //--- public DVMRunTasksSet dvmRunTasks = new DVMRunTasksSet(); //задачи текущего пакета тестирования DVM public SapforSettingsDBTable sapforSettings; public SapforSettingsCommandsDBTable sapforSettingsCommands; //-- public DVMSettingsDBTable dvmSettings; public TestsDatabase() { super(Paths.get(System.getProperty("user.dir"), "Data", Constants.tests_db_name + ".sqlite").toFile()); } @Override protected void initAllTables() throws Exception { addTable(dvmConfigurations = new DVMConfigurationDBTable()); addTable(groups = new GroupsDBTable()); addTable(tests = new TestDBTable()); addTable(dvmPackages = new DVMPackageDBTable()); addTable(sapforPackages = new SapforPackageDBTable()); addTable(testingPackagesToKill = new TestingPackagesToKillDBTable()); //- addTable(sapforConfigurations = new SapforConfigurationDBTable()); addTable(serverSapfors = new ServerSapforsDBTable()); addTable(sapforSettings = new SapforSettingsDBTable()); addTable(sapforSettingsCommands = new SapforSettingsCommandsDBTable()); addTable(dvmSettings = new DVMSettingsDBTable()); } @Override public PassCode getSynchronizePassCode() { return PassCode.SynchronizeTests; } public Vector getFirstActiveSapforPackagesCopies() { Vector res = new Vector<>(); Vector packages = new Vector<>(); SapforPackage activePackage = null; //1. получить активные пакеты. for (SapforPackage p : sapforPackages.Data.values()) { switch (p.state) { case Done: case Aborted: case Draft: case ConnectionError: case DoneWithErrors: break; default: packages.add(p); break; } } //2. отсортировать по приоритету. packages.sort(new Comparator() { @Override public int compare(SapforPackage o1, SapforPackage o2) { return Integer.compare(o1.state.ordinal(), o2.state.ordinal()); } }); if (!packages.isEmpty()) { activePackage = packages.lastElement(); if (activePackage.state.equals(TasksPackageState.Queued)) { activePackage.state = TasksPackageState.TestsSynchronize; try { Update(activePackage); } catch (Exception ex) { ex.printStackTrace(); } } res.add(new SapforPackage(activePackage)); ; //копия чтобы не было конфликта доступа с нитью планировщика. } return res; } public Vector getFirstActiveDVMPackagesCopies() { Vector res = new Vector<>(); //-- LinkedHashMap> packagesByMachines = new LinkedHashMap<>(); //---- //1. Получить список активных пакетов по машинам. for (DVMPackage dvmPackage : dvmPackages.Data.values()) { switch (dvmPackage.state) { case Done: case DoneWithErrors: case Aborted: case Draft: case ConnectionError: break; default: //активен. Vector packages = null; //-- if (packagesByMachines.containsKey(dvmPackage.machine_address)) { packages = packagesByMachines.get(dvmPackage.machine_address); } else { packages = new Vector<>(); packagesByMachines.put(dvmPackage.machine_address, packages); } packages.add(dvmPackage); break; } } //2. Выбрать для каждой машины наиболее приоритетный пакет. for (String machine : packagesByMachines.keySet()) { Vector packages = packagesByMachines.get(machine); if (!packages.isEmpty()) { packages.sort(new Comparator() { @Override public int compare(DVMPackage o1, DVMPackage o2) { return Integer.compare(o1.state.ordinal(), o2.state.ordinal()); } }); //- DVMPackage activePackage = packages.lastElement(); if (activePackage.state.equals(TasksPackageState.Queued)) { activePackage.state = TasksPackageState.TestsSynchronize; try { Update(activePackage); } catch (Exception ex) { ex.printStackTrace(); } } res.add(new DVMPackage(activePackage)); //копия чтобы не было конфликта доступа с нитью планировщика. } } return res; } //-- public void DetectTestMinMaxDim(ServerSapfor serverSapfor, Group group, Test test) throws Exception { switch (group.language) { case fortran: if (serverSapfor != null) { Sapfor.getTestMinMaxDim_F(new File(serverSapfor.call_command), test); Update(test); } break; case c: Sapfor.getTestMinMaxDime_C(test); Update(test); break; } } public void SaveTestFromSingleFile(ServerSapfor sapfor, Group group, Test test, File file) throws Exception { File testDirectory = new File(Global.TestsDirectory, String.valueOf(test.id)); Utils_.CheckAndCleanDirectory(testDirectory); File testFile = Paths.get(testDirectory.getAbsolutePath(), file.getName()).toFile(); FileUtils.copyFile(file, testFile); //---- //архивация. File archive = test.getArchive(); if (archive.exists()) FileUtils.forceDelete(archive); //----------->> ZipFolderPass zip = new ZipFolderPass(); zip.Do(testDirectory.getAbsolutePath(), archive.getAbsolutePath()); DetectTestMinMaxDim(sapfor, group, test); } //--- //--- public void CreateTestFromSingleFile(UserAccount account, ServerSapfor sapfor, Group group, File file, String testDescription) throws Exception { Test test = new Test(); test.description = testDescription; test.sender_name = account.name; test.sender_address = account.email; test.group_id = group.id; test.files = file.getName(); Insert(test); //->> SaveTestFromSingleFile(sapfor, group, test, file); } public void RefreshGroup(UserAccount account, ServerSapfor sapfor, Pair> groupData) throws Exception { Group group = groupData.getKey(); Vector files = groupData.getValue(); //-- Group oldGroup = groups.getGroupByDescription(group.language, group.description); if (oldGroup == null) { Insert(group); for (File file : files) { String testDescription = Utils_.getNameWithoutExtension(file.getName()) + "_" + group.language.getDVMCompile(); CreateTestFromSingleFile(account, sapfor, group, file, testDescription); } } else { for (File file : files) { String testDescription = Utils_.getNameWithoutExtension(file.getName()) + "_" + group.language.getDVMCompile(); Test oldTest = tests.getTestByDescription(oldGroup.id, testDescription); if (oldTest == null) { CreateTestFromSingleFile(account, sapfor, oldGroup, file, testDescription); } else { SaveTestFromSingleFile(sapfor, group, oldTest, file); } } } } public Vector getFirstActiveDVMPackageCopyForMachineURL(String arg) { Vector res = new Vector<>(); Vector machinePackages = new Vector<>(); //-- //1. Получить список активных пакетов для машины. for (DVMPackage dvmPackage : dvmPackages.Data.values()) { switch (dvmPackage.state) { case Done: case DoneWithErrors: case Aborted: case Draft: case ConnectionError: break; default: if (dvmPackage.getMachineURL().equals(arg)) machinePackages.add(dvmPackage); break; } } if (!machinePackages.isEmpty()) { machinePackages.sort(new Comparator() { @Override public int compare(DVMPackage o1, DVMPackage o2) { return Integer.compare(o1.state.ordinal(), o2.state.ordinal()); } }); //- DVMPackage activePackage = machinePackages.lastElement(); if (activePackage.state.equals(TasksPackageState.Queued)) { activePackage.state = TasksPackageState.TestsSynchronize; try { Update(activePackage); } catch (Exception ex) { ex.printStackTrace(); } } res.add(new DVMPackage(activePackage)); } return res; } public ServerSapfor getSapforCopyForCompilation() { for (ServerSapfor serverSapfor : serverSapfors.Data.values()) { if (serverSapfor.state.equals(ServerSapforState.Queued)) { return new ServerSapfor(serverSapfor); } } return null; } public Integer getInstalledSapforMaxVersion() { int max_version = CommonConstants.Nan; for (ServerSapfor sapfor : serverSapfors.Data.values()) { if (sapfor.state.equals(ServerSapforState.Done)) { int version = CommonConstants.Nan; try { version = Integer.parseInt(sapfor.version); } catch (Exception ex) { ex.printStackTrace(); } if (version > max_version) max_version = version; } } return max_version; } public boolean hasActiveSapfors() { for (ServerSapfor serverSapfor : serverSapfors.Data.values()) { if (serverSapfor.state.isActive()) return true; } return false; } public void UnselectAllGTC() { groups.getUI().SelectAll(false); tests.getUI().SelectAll(false); dvmConfigurations.getUI().SelectAll(false); } //todo возможно рассмотреть вариант с синхроннизацией тестов для пакетов через команду серверу а не в нити //во избежание конфликта доступа,или удалением тестов во время копирования(?) @Override public void DropUI(){ super.DropUI(); dvmConfigurations.ClearUI(); groups.ClearUI(); sapforConfigurations.ClearUI(); serverSapfors.ClearUI(); dvmPackages.ClearUI(); sapforPackages.ClearUI(); sapforSettings.ClearUI(); dvmSettings.ClearUI(); } @Override public void ResetUI(){ VisualCaches.ClearDataForClass(DVMConfiguration.class); VisualCaches.ClearDataForClass(SapforConfiguration.class); VisualCaches.ClearDataForClass(DVMPackage.class); VisualCaches.ClearDataForClass(SapforPackage.class); //server.db.machines dvmConfigurations.ShowUI(); groups.ShowUI(); sapforConfigurations.ShowUI(); serverSapfors.ShowUI(); dvmPackages.ShowUI(); sapforPackages.ShowUI(); sapforSettings.ShowUI(); dvmSettings.ShowUI(); super.ResetUI(); } }