промежуточный. Рефакторинг публикации теста из текущего проекта.

This commit is contained in:
2023-11-23 01:00:08 +03:00
parent 14b13eae97
commit e852443100
12 changed files with 222 additions and 329 deletions

View File

@@ -5,9 +5,17 @@ import Common.Database.DBObject;
import Common.Database.riDBObject;
import Common.Global;
import Common.UI.UI;
import Common.Utils.Utils;
import ProjectData.Project.db_project_info;
import Repository.RepositoryRefuseException;
import Visual_DVM_2021.Passes.All.UnzipFolderPass;
import Visual_DVM_2021.Passes.All.ZipFolderPass;
import Visual_DVM_2021.Passes.PassException;
import com.sun.org.glassfish.gmbal.Description;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.nio.file.Paths;
public class Test extends riDBObject {
@Description("DEFAULT 1")
public int dim = 1; //размерность теста. для удобства пусть будет и внешним полем.
@@ -23,6 +31,14 @@ public class Test extends riDBObject {
args = t.args;
group_id = t.group_id;
}
@Description("DEFAULT ''")
public String files = ""; //файлы теста
//--------------------------------------------->>>
@Description("IGNORE")
public String temp_project_name = "";
@Description("IGNORE")
public byte[] project_archive_bytes = null;
//--------------------------------------------->>>
public Test(Test test) {
this.SynchronizeFields(test);
}
@@ -50,4 +66,60 @@ public class Test extends riDBObject {
public File getHomePath() {
return new File(Global.visualiser.getWorkspace(), String.valueOf(id));
}
//--
public File getTempArchive() {
return new File(Global.TempDirectory, temp_project_name + ".zip");
}
public File getTempProject() {
return new File(Global.TempDirectory, temp_project_name);
}
//--
public void packProject(db_project_info project) throws Exception {
temp_project_name = Utils.getDateName("test");
//-
File tempProject = getTempProject();
File tempArchive = getTempArchive();
//-
FileUtils.forceMkdir(tempProject);
project.Clone(tempProject, false);
//--
FileUtils.copyFile(project.db.getFile(),
Paths.get(tempProject.getAbsolutePath(), Constants.data, project.db.getFile().getName()).toFile());
//--
ZipFolderPass zip = new ZipFolderPass();
if (zip.Do(tempProject.getAbsolutePath(), tempArchive.getAbsolutePath())) {
project_archive_bytes = Utils.packFile(tempArchive);
} else throw new PassException("Не удалось создать архив проекта");
}
public boolean unpackProjectOnServer() throws Exception {
File tmpArchive = new File(Global.TempDirectory, temp_project_name + ".zip");
File tmpProject = new File(Global.TempDirectory, temp_project_name);
File testProject = new File(Global.TestsDirectory, String.valueOf(id));
File testArchive = new File(Global.TestsDirectory, id + ".zip");
//--
if (tmpArchive.exists())
FileUtils.forceDelete(tmpArchive);
if (tmpProject.exists())
FileUtils.forceDelete(tmpProject);
if (testProject.exists())
FileUtils.forceDelete(testProject);
if (testArchive.exists())
FileUtils.forceDelete(testArchive);
//--
Utils.unpackFile(project_archive_bytes, tmpArchive); // распаковка байтов.
//--
UnzipFolderPass unzipFolderPass = new UnzipFolderPass();
if (!unzipFolderPass.Do(
tmpArchive.getAbsolutePath(),
Global.TempDirectory.getAbsolutePath())) {
return false;
}
//--
FileUtils.moveDirectory(tmpProject, testProject);
//--
ZipFolderPass zip = new ZipFolderPass();
if (!zip.Do(testProject.getAbsolutePath(), testArchive.getAbsolutePath()))
throw new RepositoryRefuseException("Не удалось переписать архив проекта");
return true;
}
}

View File

@@ -1,7 +1,6 @@
package TestingSystem.Common;
import Common.Constants;
import Common.Database.DBObject;
import Common.Database.iDBObject;
import Common.Global;
import Common.Utils.Utils;
import GlobalData.Account.Account;
@@ -31,7 +30,6 @@ import TestingSystem.SAPFOR.SapforTasksPackage.SapforPackageData;
import TestingSystem.SAPFOR.SapforTasksPackage.SapforTasksPackage;
import TestingSystem.SAPFOR.ServerSapfor.ServerSapfor;
import Visual_DVM_2021.Passes.All.DownloadRepository;
import Visual_DVM_2021.Passes.All.UnzipFolderPass;
import Visual_DVM_2021.Passes.All.ZipFolderPass;
import Visual_DVM_2021.Passes.PassCode_2021;
import Visual_DVM_2021.Passes.Pass_2021;
@@ -40,6 +38,7 @@ import org.apache.commons.io.FileUtils;
import javax.swing.*;
import java.io.File;
import java.io.Serializable;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Comparator;
@@ -77,55 +76,6 @@ public class TestingServer extends RepositoryServer<TestsDatabase> {
}
}
@Override
public void afterPublishAction(DBObject object) throws Exception {
if (object instanceof TasksPackage) {
//объект уже вставлен.
TasksPackage tasksPackage = (TasksPackage) object;
//-
for (int group_id : tasksPackage.sorted_tasks.keySet()) {
if (db.groups.containsKey(group_id)) {
Group group = db.groups.get(group_id);
LinkedHashMap<Integer, Vector<TestCompilationTask>> group_tasks = tasksPackage.sorted_tasks.get((group_id));
for (int test_id : group_tasks.keySet()) {
if (db.tests.containsKey(test_id)) {
Test test = db.tests.get(test_id);
db_project_info project = new db_project_info(test);//Открытие бд проекта и ее синхронизация. неизбежно.
//---
for (TestCompilationTask task : group_tasks.get(test_id)) {
Print("принять задачу на компиляцию " + group_id + ":" + test_id + ":" + task.flags);
//Теперь эту задачу надо поставить в очередь. и вернуть пользователю, уже с id
task.state = TaskState.Waiting;
task.id = db.IncKey(SettingName.TaskMaxId);
task.taskspackage_id = tasksPackage.id;
task.makefile_text = group.GenerateMakefile(project, tasksPackage.dvm_drv, task.flags);
task.test_home = tasksPackage.user_workspace + "/projects/" + test_id;
//-->>
task.remote_workspace =
new RemoteFile(
tasksPackage.user_workspace + "/tests/" + tasksPackage.id,
String.valueOf(task.id), true).full_name;
account_db.Insert(task);
if (task.runTasks != null) {
for (TestRunTask rt : task.runTasks) {
rt.id = db.IncKey(SettingName.TaskMaxId);
rt.taskspackage_id = tasksPackage.id;
rt.testcompilationtask_id = task.id;
rt.remote_workspace =
new RemoteFile(
tasksPackage.user_workspace + "/tests/" + tasksPackage.id,
String.valueOf(rt.id), true).full_name;
rt.binary_name = "spf_" + rt.id + "_" + rt.matrix.replace(" ", "_");
account_db.Insert(rt);
}
}
}
}
}
}
}
}
}
@Override
public void DeleteAction(DBObject object) throws Exception {
if (object instanceof Test) {
Test test = (Test) object;
@@ -221,28 +171,6 @@ public class TestingServer extends RepositoryServer<TestsDatabase> {
Test test;
int test_id;
switch (code) {
case PublishTestProject:
Print("Прикрепить проект к тесту " + request.arg);
System.out.println("Прикрепить проект к тесту " + request.arg);
test_id = Integer.parseInt(request.arg);
if (db.tests.containsKey(test_id)) {
test = db.tests.get(test_id);
Utils.unpackFile((byte[]) request.object, test.getArchive());
UnzipFolderPass unzipFolderPass = new UnzipFolderPass();
if (!unzipFolderPass.Do(
test.getArchive().getAbsolutePath(),
Global.TestsDirectory.getAbsolutePath())) {
db.Delete(test);
throw new RepositoryRefuseException(
"Не удалось прикрепить проект к тесту с id " + test.id
+ "\nТест будет удален"
);
}
} else {
throw new RepositoryRefuseException("Не существует теста с ключом " + Utils.Brackets(request.arg));
}
response = new ServerExchangeUnit_2021(ServerCode.OK);
break;
case EmailSapforAssembly:
Print("Сообщить о сборке SAPFOR для пользователя " + request.arg);
Vector<String> assembly_info = (Vector<String>) request.object;
@@ -265,8 +193,7 @@ public class TestingServer extends RepositoryServer<TestsDatabase> {
for (Object object : tasks) {
SapforTask task = (SapforTask) object;
task.id = db.IncKey(SettingName.SapforTaskMaxId);
if (account_db.InsertWithCheck_(task) != null)
afterPublishAction(task);
account_db.Insert(task);
}
account_db.Commit();
response = new ServerExchangeUnit_2021(ServerCode.OK);
@@ -329,17 +256,6 @@ public class TestingServer extends RepositoryServer<TestsDatabase> {
response = new ServerExchangeUnit_2021(ServerCode.OK);
response.object = dbObject;
break;
case PublishAccountObjects:
Print("Опубликовать объекты для пользователя " + request.arg);
SetCurrentAccountDB(request.arg);
Vector<Object> objects__ = (Vector<Object>) request.object;
account_db.BeginTransaction();
for (Object object : objects__)
if (account_db.InsertWithCheck_((DBObject) object) != null)
afterPublishAction((DBObject) object);
account_db.Commit();
response = new ServerExchangeUnit_2021(ServerCode.OK);
break;
case CheckAccountObjectExistense:
SetCurrentAccountDB(request.arg);
p = (Pair<Class, Object>) request.object;
@@ -482,7 +398,8 @@ public class TestingServer extends RepositoryServer<TestsDatabase> {
}
//->>
//->>
Pair<Group, Vector<File>> ConvertDirectoryToGroup(File src, LanguageName languageName, TestType testType, Account account) throws Exception {
Pair<Group, Vector<File>> ConvertDirectoryToGroup(File src, LanguageName languageName, TestType
testType, Account account) throws Exception {
Group object = new Group();
Vector<File> groupFiles = null; //транспорт.
//->>
@@ -584,19 +501,13 @@ public class TestingServer extends RepositoryServer<TestsDatabase> {
}
return res;
}
//-------------------------------------------------------------------------------------->>>
@Override
public void PublishObject(DBObject dbObject) throws Exception {
if (request.arg == null)
super.PublishObject(dbObject);
protected Serializable publishObject(DBObject object) throws Exception {
if (request.arg == null) return super.publishObject(object);
else {
SetCurrentAccountDB(request.arg);
if (dbObject instanceof iDBObject) {
Print("Опубликовать объект для пользователя " + request.arg);
account_db.Insert(dbObject);
} else {
Print("Опубликовать объект с автоинкрементным ключом " + request.arg);
account_db.InsertWithCheck(dbObject); //проверка не нужна,АИ гарантирует что ключ уникален.
}
return (Serializable) account_db.InsertS(object).getPK();
}
}
@Override
@@ -604,10 +515,66 @@ public class TestingServer extends RepositoryServer<TestsDatabase> {
if (object instanceof TasksPackage) {
TasksPackage tasksPackage = (TasksPackage) object;
tasksPackage.id = db.IncKey(SettingName.DVMPackageMaxId);
} else {
if (object instanceof SapforTasksPackage) {
SapforTasksPackage sapforTasksPackage = (SapforTasksPackage) object;
sapforTasksPackage.id = db.IncKey(SettingName.SAPFORPackageId);
} else if (object instanceof SapforTasksPackage) {
SapforTasksPackage sapforTasksPackage = (SapforTasksPackage) object;
sapforTasksPackage.id = db.IncKey(SettingName.SAPFORPackageId);
}
}
@Override
public void afterPublishAction(DBObject object) throws Exception {
if (object instanceof TasksPackage) {
//объект уже вставлен.
TasksPackage tasksPackage = (TasksPackage) object;
//-
for (int group_id : tasksPackage.sorted_tasks.keySet()) {
if (db.groups.containsKey(group_id)) {
Group group = db.groups.get(group_id);
LinkedHashMap<Integer, Vector<TestCompilationTask>> group_tasks = tasksPackage.sorted_tasks.get((group_id));
for (int test_id : group_tasks.keySet()) {
if (db.tests.containsKey(test_id)) {
Test test = db.tests.get(test_id);
db_project_info project = new db_project_info(test);//Открытие бд проекта и ее синхронизация. неизбежно.
//---
for (TestCompilationTask task : group_tasks.get(test_id)) {
Print("принять задачу на компиляцию " + group_id + ":" + test_id + ":" + task.flags);
//Теперь эту задачу надо поставить в очередь. и вернуть пользователю, уже с id
task.state = TaskState.Waiting;
task.id = db.IncKey(SettingName.TaskMaxId);
task.taskspackage_id = tasksPackage.id;
task.makefile_text = group.GenerateMakefile(project, tasksPackage.dvm_drv, task.flags);
task.test_home = tasksPackage.user_workspace + "/projects/" + test_id;
//-->>
task.remote_workspace =
new RemoteFile(
tasksPackage.user_workspace + "/tests/" + tasksPackage.id,
String.valueOf(task.id), true).full_name;
account_db.Insert(task);
if (task.runTasks != null) {
for (TestRunTask rt : task.runTasks) {
rt.id = db.IncKey(SettingName.TaskMaxId);
rt.taskspackage_id = tasksPackage.id;
rt.testcompilationtask_id = task.id;
rt.remote_workspace =
new RemoteFile(
tasksPackage.user_workspace + "/tests/" + tasksPackage.id,
String.valueOf(rt.id), true).full_name;
rt.binary_name = "spf_" + rt.id + "_" + rt.matrix.replace(" ", "_");
account_db.Insert(rt);
}
}
}
}
}
}
}
} else if (object instanceof Test) {
Test test = (Test) object;
if (!test.unpackProjectOnServer()) {
db.Delete(test);
throw new RepositoryRefuseException(
"Не удалось прикрепить проект к тесту с id " + test.id
+ "\nТест будет удален"
);
}
}
}