package Visual_DVM_2021.Passes.All; import Common.Constants; import Common.Current; import Common.Utils.Files.VDirectoryChooser; import Common.Utils.Utils; import GlobalData.Settings.SettingName; import ProjectData.Files.ProjectFile; import ProjectData.LanguageName; import Repository.Component.Sapfor.Sapfor; import TestingSystem.Common.Group.Group; import TestingSystem.Common.Test.Test; import Visual_DVM_2021.Passes.PassCode_2021; import Visual_DVM_2021.Passes.Pass_2021; import java.io.File; import java.util.Vector; public class CreateTestFromDirectory extends Pass_2021 { VDirectoryChooser directoryChooser = new VDirectoryChooser("Выбор домашней папки теста"); @Override public String getIconPath() { return "/icons/OpenProject.png"; } @Override public String getButtonText() { return ""; } @Override protected boolean needsAnimation() { return true; } Group group = null; File dir = null; boolean from_directory_chooser = false; Vector project_files = new Vector<>(); @Override protected boolean canStart(Object... args) throws Exception { if (args.length == 0) { from_directory_chooser = true; if (!Current.Check(Log, Current.Group)) return false; Utils.RestoreSelectedDirectory(directoryChooser); dir = directoryChooser.ShowDialog(); group = Current.getGroup(); if (dir == null) { Log.Writeln_("Папка не выбрана."); return false; } else { Pass_2021.passes.get(PassCode_2021.UpdateSetting).Do(SettingName.ProjectsSearchDirectory, dir.getParent()); } } else { from_directory_chooser = false; dir = (File) args[0]; group = (Group) args[1]; } //--- File[] files = dir.listFiles(); project_files = new Vector<>(); int subdirs = 0; int bad = 0; int active_programs = 0; int headers = 0; int other_project_files = 0; //--- if (dir.getName().equalsIgnoreCase(Constants.data)) { Log.Writeln_("Папка " + Utils.Brackets(dir) + " является служебной папкой визуализатора."); return false; } //-- if (!Utils.validateProjectFile(dir, Log)) { Log.Writeln_("Имя папки " + Utils.Brackets(dir.getName()) + " содержит запрещённые символы " + Constants.all_forbidden_characters_string + ", или кириллицу."); return false; } //-- if (files == null) { Log.Writeln_("Не удалось получить список файлов для папки " + Utils.Brackets(dir) + "."); return false; } //-- for (File file : files) { if (!Utils.validateProjectFile(file, Log)) { Log.Writeln_("Имя файла " + Utils.Brackets(file.getName()) + " содержит запрещённые символы " + Constants.all_forbidden_characters_string + ", или кириллицу."); bad++; } if (file.isDirectory() && !file.getName().equalsIgnoreCase(Constants.data) && !Utils.isVersion(file) ) { subdirs++; } if (file.isFile()) { ProjectFile projectFile = new ProjectFile(file); switch (projectFile.fileType) { case program: if (projectFile.languageName.equals(group.language)) { active_programs++; project_files.add(projectFile); } else other_project_files++; break; case header: headers++; project_files.add(projectFile); break; default: other_project_files++; break; } } } //-- if (subdirs > 0) { Log.Writeln_("Папка " + Utils.Brackets(dir) + " содержит вложенные подпапки."); return false; } if (bad > 0) { return false; } if (active_programs == 0) { Log.Writeln_("Папка не содержит ни одной программы на языке " + group.language.getDescription() + "."); return false; } /* if (other_project_files > 0) { Log.Writeln_("Папка содержит файлы, не являющиеся программами на языке " + group.language.getDescription() + ", или заголовочными."); return false; } */ if (project_files.isEmpty()){ Log.Writeln_("В папке не найдено файлов с допустимыми расширениями для языка "+ group.language.getDescription()+"\n"+ group.language.PrintExtensions() ); } //----- target = new Test(); target.sender_address = Current.getAccount().email; target.sender_name = Current.getAccount().name; target.group_id = group.id; target.description = dir.getName(); Vector filesNames = new Vector<>(); for (ProjectFile projectFile : project_files) filesNames.add(projectFile.file.getName()); target.files = String.join("\n", filesNames); return true; } protected void fillProjectFiles() throws Exception { } @Override protected void body() throws Exception { ShowMessage1(dir.getName()); //-- File tempProject = target.packCode(dir, true); //создание копии папки, и архивация. //-- получить размерность консольным сапфором. папка уже отправлена и чистить ее не нужно!! ShowMessage2("Синтаксический анализ и определение размерности"); if (group.language.equals(LanguageName.fortran) && !Sapfor.getMinMaxDim(Sapfor.getTempCopy(Current.getSapfor().getFile()), tempProject, target)) Log.Writeln_("Не удалось определить размерность теста " + Utils.Brackets(tempProject.getName())); } @Override protected boolean validate() { return Log.isEmpty(); } @Override protected void performDone() throws Exception { super.performDone(); if (from_directory_chooser) passes.get(PassCode_2021.PublishTest).Do(target); } }