2023-11-23 20:38:57 +03:00
|
|
|
|
package Visual_DVM_2021.Passes.All;
|
2024-10-09 23:37:58 +03:00
|
|
|
|
import Common.Current_;
|
2024-10-11 00:00:30 +03:00
|
|
|
|
import Common.Utils.Utils_;
|
2024-10-09 22:01:19 +03:00
|
|
|
|
import _VisualDVM.Constants;
|
|
|
|
|
|
import _VisualDVM.Current;
|
2024-10-08 23:45:06 +03:00
|
|
|
|
import Common.Visual.Windows.Dialog.VDirectoryChooser;
|
2024-10-13 22:08:13 +03:00
|
|
|
|
import _VisualDVM.Global;
|
2024-10-09 22:01:19 +03:00
|
|
|
|
import _VisualDVM.Utils;
|
2024-10-09 22:21:57 +03:00
|
|
|
|
import _VisualDVM.GlobalData.Settings.SettingName;
|
|
|
|
|
|
import _VisualDVM.ProjectData.Files.ProjectFile;
|
|
|
|
|
|
import _VisualDVM.ProjectData.LanguageName;
|
|
|
|
|
|
import _VisualDVM.Repository.Component.Sapfor.Sapfor;
|
|
|
|
|
|
import _VisualDVM.TestingSystem.Common.Group.Group;
|
|
|
|
|
|
import _VisualDVM.TestingSystem.Common.Test.Test;
|
2024-10-09 23:37:58 +03:00
|
|
|
|
import Visual_DVM_2021.Passes.PassCode;
|
2024-10-10 23:57:36 +03:00
|
|
|
|
import Common.Passes.PassException;
|
|
|
|
|
|
import Common.Passes.Pass;
|
2023-12-01 19:31:31 +03:00
|
|
|
|
import org.apache.commons.io.FileUtils;
|
2023-11-23 20:38:57 +03:00
|
|
|
|
|
|
|
|
|
|
import java.io.File;
|
2024-07-21 23:19:18 +03:00
|
|
|
|
import java.util.Arrays;
|
2023-11-23 20:38:57 +03:00
|
|
|
|
import java.util.Vector;
|
2024-10-09 23:37:58 +03:00
|
|
|
|
public class CreateTestFromDirectory extends Pass<Test> {
|
2023-11-23 20:38:57 +03:00
|
|
|
|
@Override
|
|
|
|
|
|
public String getIconPath() {
|
|
|
|
|
|
return "/icons/OpenProject.png";
|
|
|
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public String getButtonText() {
|
|
|
|
|
|
return "";
|
|
|
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
|
|
|
protected boolean needsAnimation() {
|
2023-11-25 01:51:18 +03:00
|
|
|
|
return true;
|
2023-11-23 20:38:57 +03:00
|
|
|
|
}
|
2023-11-23 22:38:21 +03:00
|
|
|
|
Group group = null;
|
2023-11-23 20:38:57 +03:00
|
|
|
|
File dir = null;
|
2024-07-21 23:19:18 +03:00
|
|
|
|
boolean from_files_chooser = false;
|
|
|
|
|
|
//--
|
|
|
|
|
|
void saveDirectory() {
|
2024-10-13 23:55:03 +03:00
|
|
|
|
Global.mainModule.getPass(PassCode.UpdateSetting).Do(SettingName.ProjectsSearchDirectory,
|
2024-07-21 23:19:18 +03:00
|
|
|
|
(dir.getParentFile() == null) ? dir.getAbsolutePath() : dir.getParent()
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
Vector<File> files = null;
|
|
|
|
|
|
protected boolean selectFiles() {
|
|
|
|
|
|
VDirectoryChooser directoryChooser = new VDirectoryChooser("Выбор домашней папки теста");
|
|
|
|
|
|
Utils.RestoreSelectedDirectory(directoryChooser);
|
|
|
|
|
|
dir = directoryChooser.ShowDialog();
|
|
|
|
|
|
if (dir == null) {
|
|
|
|
|
|
Log.Writeln_("Папка не выбрана.");
|
|
|
|
|
|
return false;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
files = new Vector<>(Arrays.asList(dir.listFiles()));
|
|
|
|
|
|
saveDirectory();
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
//--
|
2023-11-23 20:38:57 +03:00
|
|
|
|
Vector<ProjectFile> project_files = new Vector<>();
|
2024-07-21 23:19:18 +03:00
|
|
|
|
protected boolean initTarget() throws Exception {
|
2024-03-02 01:44:03 +03:00
|
|
|
|
target = new Test();
|
2024-10-13 22:08:13 +03:00
|
|
|
|
target.sender_address = Global.mainModule.getAccount().email;
|
|
|
|
|
|
target.sender_name = Global.mainModule.getAccount().name;
|
2024-03-02 01:44:03 +03:00
|
|
|
|
target.group_id = group.id;
|
|
|
|
|
|
target.description = dir.getName();
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
2023-11-23 20:38:57 +03:00
|
|
|
|
@Override
|
|
|
|
|
|
protected boolean canStart(Object... args) throws Exception {
|
2024-07-21 23:19:18 +03:00
|
|
|
|
files = null;
|
2023-11-23 20:38:57 +03:00
|
|
|
|
if (args.length == 0) {
|
2024-07-21 23:19:18 +03:00
|
|
|
|
//--
|
|
|
|
|
|
from_files_chooser = true;
|
2024-10-13 22:08:13 +03:00
|
|
|
|
if (!Global.mainModule.Check(Log, Current.Group))
|
2023-11-23 20:38:57 +03:00
|
|
|
|
return false;
|
2024-10-13 22:08:13 +03:00
|
|
|
|
group = Global.mainModule.getGroup();
|
2024-07-21 23:19:18 +03:00
|
|
|
|
if (!selectFiles())
|
2023-11-24 20:51:16 +03:00
|
|
|
|
return false;
|
2024-07-21 23:19:18 +03:00
|
|
|
|
//-
|
2023-11-23 20:38:57 +03:00
|
|
|
|
} else {
|
2024-07-21 23:19:18 +03:00
|
|
|
|
from_files_chooser = false;
|
2023-11-23 20:38:57 +03:00
|
|
|
|
dir = (File) args[0];
|
2023-11-23 22:38:21 +03:00
|
|
|
|
group = (Group) args[1];
|
2024-07-21 23:19:18 +03:00
|
|
|
|
files = new Vector<>(Arrays.asList(dir.listFiles()));
|
2023-11-23 20:38:57 +03:00
|
|
|
|
}
|
|
|
|
|
|
//---
|
|
|
|
|
|
int subdirs = 0;
|
|
|
|
|
|
int bad = 0;
|
2023-11-30 01:25:26 +03:00
|
|
|
|
int active_programs = 0;
|
2023-11-23 20:38:57 +03:00
|
|
|
|
int headers = 0;
|
|
|
|
|
|
int other_project_files = 0;
|
|
|
|
|
|
//---
|
|
|
|
|
|
if (dir.getName().equalsIgnoreCase(Constants.data)) {
|
2024-10-11 00:00:30 +03:00
|
|
|
|
Log.Writeln_("Папка " + Utils_.Brackets(dir) + " является служебной папкой визуализатора.");
|
2023-11-25 01:51:18 +03:00
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
//--
|
2024-10-11 00:00:30 +03:00
|
|
|
|
if (Utils_.ContainsCyrillic(dir.getName()) || Utils_.ContainsForbiddenName(dir.getName())) {
|
|
|
|
|
|
Log.Writeln_("Имя папки " + Utils_.Brackets(dir.getName())
|
2024-10-07 22:04:09 +03:00
|
|
|
|
+ " содержит запрещённые символы "
|
2024-10-11 00:00:30 +03:00
|
|
|
|
+ Utils_.printAllForbiddenCharacters() + ", или кириллицу.");
|
2023-11-23 20:38:57 +03:00
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
//--
|
|
|
|
|
|
if (files == null) {
|
2024-10-11 00:00:30 +03:00
|
|
|
|
Log.Writeln_("Не удалось получить список файлов для папки " + Utils_.Brackets(dir) + ".");
|
2023-11-23 20:38:57 +03:00
|
|
|
|
return false;
|
|
|
|
|
|
}
|
2023-12-01 19:31:31 +03:00
|
|
|
|
//---
|
|
|
|
|
|
project_files = new Vector<>();
|
2023-11-23 20:38:57 +03:00
|
|
|
|
//--
|
|
|
|
|
|
for (File file : files) {
|
2023-12-01 19:31:31 +03:00
|
|
|
|
//-----
|
|
|
|
|
|
if (file.isDirectory()) {
|
|
|
|
|
|
//если это подпапка нам все равно на каком она языке. не версия и не служебная. ее наличие уже не допустимо.
|
|
|
|
|
|
if (!file.getName().equalsIgnoreCase(Constants.data) &&
|
|
|
|
|
|
!Utils.isVersion(file)) {
|
|
|
|
|
|
subdirs++;
|
|
|
|
|
|
}
|
2024-10-11 00:00:30 +03:00
|
|
|
|
} else if (file.isFile() && !Utils_.ContainsCyrillic(file.getName()) && !Utils_.ContainsForbiddenName(file.getName())) {
|
2023-12-01 19:31:31 +03:00
|
|
|
|
//если файл. все недопустимые файлы просто игнорируются.
|
2023-11-23 20:38:57 +03:00
|
|
|
|
ProjectFile projectFile = new ProjectFile(file);
|
2023-12-01 19:31:31 +03:00
|
|
|
|
if (isNotExcluded(projectFile)) {
|
|
|
|
|
|
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++;
|
2023-11-30 01:25:26 +03:00
|
|
|
|
project_files.add(projectFile);
|
2023-12-01 19:31:31 +03:00
|
|
|
|
break;
|
2024-06-08 19:45:37 +03:00
|
|
|
|
case none:
|
|
|
|
|
|
project_files.add(projectFile);
|
|
|
|
|
|
other_project_files++;
|
|
|
|
|
|
break;
|
2023-12-01 19:31:31 +03:00
|
|
|
|
default:
|
2023-11-23 20:38:57 +03:00
|
|
|
|
other_project_files++;
|
2023-12-01 19:31:31 +03:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
2023-11-23 20:38:57 +03:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//--
|
|
|
|
|
|
if (subdirs > 0) {
|
2024-10-11 00:00:30 +03:00
|
|
|
|
Log.Writeln_("Папка " + Utils_.Brackets(dir) + " содержит вложенные подпапки,\n" +
|
2023-12-01 19:31:31 +03:00
|
|
|
|
"не являющиеся версиями или данными визуализатора");
|
2023-11-23 20:38:57 +03:00
|
|
|
|
return false;
|
|
|
|
|
|
}
|
2023-11-30 01:25:26 +03:00
|
|
|
|
if (active_programs == 0) {
|
2023-11-25 01:51:18 +03:00
|
|
|
|
Log.Writeln_("Папка не содержит ни одной программы на языке " + group.language.getDescription() + ".");
|
2023-11-23 20:38:57 +03:00
|
|
|
|
return false;
|
|
|
|
|
|
}
|
2023-12-01 19:31:31 +03:00
|
|
|
|
if (project_files.isEmpty()) {
|
|
|
|
|
|
Log.Writeln_("В папке не найдено файлов с допустимыми расширениями для языка " +
|
|
|
|
|
|
group.language.getDescription() + "\n" +
|
2023-11-30 01:25:26 +03:00
|
|
|
|
group.language.PrintExtensions()
|
2023-12-01 19:31:31 +03:00
|
|
|
|
);
|
2023-11-23 20:38:57 +03:00
|
|
|
|
}
|
2024-03-02 01:44:03 +03:00
|
|
|
|
//----
|
|
|
|
|
|
if (!initTarget()) return false;
|
|
|
|
|
|
//----
|
2023-11-23 22:38:21 +03:00
|
|
|
|
Vector<String> filesNames = new Vector<>();
|
|
|
|
|
|
for (ProjectFile projectFile : project_files)
|
|
|
|
|
|
filesNames.add(projectFile.file.getName());
|
|
|
|
|
|
target.files = String.join("\n", filesNames);
|
2023-11-23 20:38:57 +03:00
|
|
|
|
return true;
|
|
|
|
|
|
}
|
2023-12-01 19:31:31 +03:00
|
|
|
|
public boolean isNotExcluded(ProjectFile projectFile) {
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
//-
|
|
|
|
|
|
public File packTestCode() throws Exception {
|
2024-10-11 00:00:30 +03:00
|
|
|
|
target.temp_project_name = Utils_.getDateName("test");
|
2023-12-01 19:31:31 +03:00
|
|
|
|
//-
|
|
|
|
|
|
File tempProject = target.getTempProject();
|
|
|
|
|
|
File tempArchive = target.getTempArchive();
|
|
|
|
|
|
//- создать бд.
|
|
|
|
|
|
FileUtils.forceMkdir(tempProject);
|
|
|
|
|
|
//--
|
|
|
|
|
|
for (ProjectFile projectFile : project_files) {
|
|
|
|
|
|
File dst = new File(tempProject, projectFile.file.getName());
|
|
|
|
|
|
FileUtils.copyFile(projectFile.file, dst);
|
|
|
|
|
|
}
|
|
|
|
|
|
//---
|
|
|
|
|
|
Utils.ClearProjectData(tempProject);
|
|
|
|
|
|
//--
|
2023-12-01 21:18:29 +03:00
|
|
|
|
ZipFolderPass zip = new ZipFolderPass();
|
|
|
|
|
|
if (zip.Do(tempProject.getAbsolutePath(), tempArchive.getAbsolutePath())) {
|
2024-10-11 00:00:30 +03:00
|
|
|
|
target.project_archive_bytes = Utils_.fileToBytes(tempArchive);
|
2023-12-01 21:18:29 +03:00
|
|
|
|
} else throw new PassException("Не удалось создать архив папки с кодом.");
|
2023-12-01 19:31:31 +03:00
|
|
|
|
return tempProject;
|
2023-11-30 01:25:26 +03:00
|
|
|
|
}
|
2023-12-01 19:31:31 +03:00
|
|
|
|
//-
|
2023-11-23 20:38:57 +03:00
|
|
|
|
@Override
|
|
|
|
|
|
protected void body() throws Exception {
|
2023-11-25 13:41:57 +03:00
|
|
|
|
ShowMessage1(dir.getName());
|
2023-11-23 20:38:57 +03:00
|
|
|
|
//--
|
2023-12-01 19:31:31 +03:00
|
|
|
|
File tempProject = packTestCode(); //создание копии папки, и архивация.
|
2023-11-24 02:11:33 +03:00
|
|
|
|
//-- получить размерность консольным сапфором. папка уже отправлена и чистить ее не нужно!!
|
2023-11-26 00:30:43 +03:00
|
|
|
|
ShowMessage2("Синтаксический анализ и определение размерности");
|
2023-12-01 21:18:29 +03:00
|
|
|
|
if (group.language == LanguageName.fortran) {//если не определит, будут нули.
|
2024-10-13 22:08:13 +03:00
|
|
|
|
Sapfor.getMinMaxDim(Sapfor.getTempCopy(Global.mainModule.getSapfor().getFile()), tempProject, target);
|
2023-12-01 21:18:29 +03:00
|
|
|
|
}
|
2023-11-24 12:28:12 +03:00
|
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
|
|
|
protected boolean validate() {
|
|
|
|
|
|
return Log.isEmpty();
|
2023-11-23 22:38:21 +03:00
|
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
|
|
|
protected void performDone() throws Exception {
|
|
|
|
|
|
super.performDone();
|
2024-07-21 23:19:18 +03:00
|
|
|
|
if (from_files_chooser)
|
2024-10-13 23:55:03 +03:00
|
|
|
|
Global.mainModule.getPass(PassCode.PublishTest).Do(target);
|
2023-11-23 20:38:57 +03:00
|
|
|
|
}
|
|
|
|
|
|
}
|