package SapforTestingSystem.SapforTest; import Common.Constants.Constants; import Common.Utils.Utils; import ProjectData.Project.db_project_info; import Visual_DVM_2021.Passes.PassCode_2021; import Visual_DVM_2021.Passes.PassException; import org.apache.commons.io.FileUtils; import java.io.File; import java.nio.charset.Charset; import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.Vector; public class SapforTest { File root; File sapfor_drv; String flags; Vector codes; //----- File parentTask; File task; //----- Process process = null; int exit_code = Constants.Nan; //---- File outputFile = null; File errorsFile = null; //-- Vector outputLines; Vector errorsLines; //--- //--- public SapforTest(File sapfor_drv_in, File root_in, String flags_in, List codes_in) { sapfor_drv = sapfor_drv_in; root = root_in; flags = flags_in; codes = new Vector<>(codes_in); } protected static boolean checkLines(Vector lines) { for (String line : lines) { if (line.toLowerCase().contains("internal error")) { return false; } if (line.toLowerCase().contains("exception")) { return false; } if (line.contains("[ERROR]")) { return false; } } return true; } protected boolean performSapforScript(String name, File workspace, String command, String outName, String errName) throws Exception { process = null; exit_code = Constants.Nan; //--- File data_workspace = new File(workspace, db_project_info.data); Utils.CheckDirectory(data_workspace); outputFile = new File(data_workspace, outName); errorsFile = new File(data_workspace, errName); Utils.delete_with_check(outputFile); Utils.delete_with_check(errorsFile); //--- File file = new File(data_workspace, name + ".bat"); FileUtils.write(file, Utils.DQuotes(sapfor_drv.getAbsolutePath()) + (flags.isEmpty() ? "" : (" " + flags)) + " -noLogo" + " " + command + " 1>" + Utils.DQuotes(outputFile.getAbsolutePath()) + " 2>" + Utils.DQuotes(errorsFile.getAbsolutePath()), Charset.defaultCharset()); if (!file.setExecutable(true)) throw new PassException("Не удалось сделать файл скрипта " + name + " исполняемым!"); //-- ProcessBuilder procBuilder = new ProcessBuilder(file.getAbsolutePath()); procBuilder.directory(workspace); process = procBuilder.start(); exit_code = process.waitFor(); if (exit_code != 0) throw new PassException("Процесс завершился с кодом " + exit_code); process = null; //--- outputLines = new Vector<>(FileUtils.readLines(outputFile)); errorsLines = new Vector<>(FileUtils.readLines(errorsFile)); return checkLines(outputLines) && checkLines(errorsLines); } protected boolean parse() throws Exception { if (performSapforScript("parse", parentTask, "-parse *.f *.for *.fdv *.f90 *.f77", "parse_out.txt", "parse_err.txt") && (new File(parentTask, "dvm.proj")).exists()) { return true; } else { // taskResult.state = TaskState.DoneWithErrors; return false; } } protected boolean transformation(PassCode_2021 code) throws Exception { task = new File(parentTask, "v1"); Utils.CheckAndCleanDirectory(task); //папка для преобразования. if (performSapforScript("transformation", parentTask, code.getTestingCommand() + " -F " + Utils.DQuotes(task.getAbsolutePath()), "out.txt", "err.txt" )) { //taskResult.state = TaskState.Done; //taskResult.versions.add(new SapforVersion_json(task.getAbsolutePath(), code.getDescription())); parentTask = task; return true; } Utils.delete_with_check(task); // taskResult.state = TaskState.DoneWithErrors; return false; } protected boolean variants() throws Exception { if (performSapforScript("create_variants", parentTask, " -t 13 -allVars", "out.txt", "err.txt" )) { //найти папки с вариантами. File[] files_ = parentTask.listFiles((dir, name) -> dir.isDirectory() && Utils.isParallelVersionName(name)); if ((files_ != null) && (files_.length > 0)) { Vector files = new Vector<>(Arrays.asList(files_)); files.sort(Comparator.comparingInt(o -> Integer.parseInt(o.getName().substring(1)))); /* taskResult.state = TaskState.Done; for (File file : files) taskResult.variants.add(new SapforVersion_json(file.getAbsolutePath(), PassCode_2021.SPF_CreateParallelVariant.getDescription())); */ return true; } } // taskResult.state = TaskState.DoneWithErrors; return false; } public void Do() throws Exception { parentTask = root; //-- // taskResult = new SapforTask(); // taskResult.test_description = test; // taskResult.sapfortaskspackage_2023_id = Integer.parseInt(packageWorkspace.getName()); // taskResult.versions.add(new SapforVersion_json(parentTask.getAbsolutePath(), "исходная")); //-- System.out.println(root.getName() + " " + Utils.Brackets(flags)); for (PassCode_2021 code : codes) { System.out.println(code); if (parse()) { if (code.equals(PassCode_2021.CreateParallelVariants)) variants(); else if (!transformation(code)) break; } else break; } //--- //results.tasks.add(taskResult); } }