2023-12-07 00:09:10 +03:00
|
|
|
|
package Visual_DVM_2021.Passes.All;
|
|
|
|
|
|
import Common.Current;
|
|
|
|
|
|
import Common.Global;
|
2023-12-07 02:05:08 +03:00
|
|
|
|
import Common.UI.UI;
|
2023-12-07 00:09:10 +03:00
|
|
|
|
import Common.Utils.Files.VDirectoryChooser;
|
2023-12-08 21:35:36 +03:00
|
|
|
|
import Common.Utils.Index;
|
2023-12-07 00:09:10 +03:00
|
|
|
|
import Common.Utils.Utils;
|
2023-12-07 16:25:16 +03:00
|
|
|
|
import GlobalData.Tasks.TaskState;
|
2023-12-07 00:09:10 +03:00
|
|
|
|
import TestingSystem.DVM.Tasks.TestRunTask;
|
|
|
|
|
|
import TestingSystem.DVM.TasksPackage.TasksPackage;
|
|
|
|
|
|
import TestingSystem.DVM.TasksPackage.TasksPackageState;
|
|
|
|
|
|
import Visual_DVM_2021.Passes.Pass_2021;
|
|
|
|
|
|
import org.apache.commons.io.FileUtils;
|
|
|
|
|
|
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
2023-12-07 16:25:16 +03:00
|
|
|
|
import org.apache.poi.hssf.util.HSSFColor;
|
2023-12-07 02:05:08 +03:00
|
|
|
|
import org.apache.poi.ss.usermodel.Font;
|
2023-12-07 00:09:10 +03:00
|
|
|
|
import org.apache.poi.ss.usermodel.*;
|
|
|
|
|
|
|
2023-12-07 02:05:08 +03:00
|
|
|
|
import java.awt.*;
|
2023-12-07 00:09:10 +03:00
|
|
|
|
import java.io.File;
|
|
|
|
|
|
import java.io.FileOutputStream;
|
|
|
|
|
|
import java.util.Vector;
|
|
|
|
|
|
public class ExportTasksPackageToExcel extends Pass_2021<TasksPackage> {
|
|
|
|
|
|
//https://tproger.ru/translations/how-to-read-write-excel-file-java-poi-example
|
|
|
|
|
|
File dir;
|
|
|
|
|
|
File res;
|
|
|
|
|
|
VDirectoryChooser directoryChooser = new VDirectoryChooser("Выбор папки для сохранения таблицы Excel");
|
|
|
|
|
|
//---
|
2023-12-08 19:03:54 +03:00
|
|
|
|
final int max_columns = 16;
|
2023-12-07 16:25:16 +03:00
|
|
|
|
Vector<CellStyle> styles;
|
|
|
|
|
|
//--
|
|
|
|
|
|
//--
|
2023-12-07 00:09:10 +03:00
|
|
|
|
Workbook book = null;
|
|
|
|
|
|
Sheet sheet = null;
|
2023-12-07 02:05:08 +03:00
|
|
|
|
//--
|
|
|
|
|
|
Vector<TestRunTask> tasks = null;
|
|
|
|
|
|
//--
|
2023-12-07 00:09:10 +03:00
|
|
|
|
@Override
|
|
|
|
|
|
public String getIconPath() {
|
|
|
|
|
|
return "/icons/Excel.png";
|
|
|
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public String getButtonText() {
|
|
|
|
|
|
return "";
|
|
|
|
|
|
}
|
|
|
|
|
|
@Override
|
2023-12-07 17:02:00 +03:00
|
|
|
|
protected boolean needsAnimation() {
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
@Override
|
2023-12-07 00:09:10 +03:00
|
|
|
|
protected boolean canStart(Object... args) throws Exception {
|
2023-12-07 02:05:08 +03:00
|
|
|
|
book = null;
|
2023-12-07 00:09:10 +03:00
|
|
|
|
sheet = null;
|
2023-12-07 16:25:16 +03:00
|
|
|
|
styles = null;
|
2023-12-07 02:05:08 +03:00
|
|
|
|
tasks = null;
|
2023-12-07 00:09:10 +03:00
|
|
|
|
//--
|
|
|
|
|
|
if (Current.Check(Log, Current.TasksPackage)) {
|
|
|
|
|
|
target = Current.getTasksPackage();
|
|
|
|
|
|
if (!target.state.equals(TasksPackageState.Done)) {
|
|
|
|
|
|
Log.Writeln_("Можно получить таблицу только завершенного пакета.");
|
|
|
|
|
|
return false;
|
|
|
|
|
|
} else {
|
2023-12-07 02:05:08 +03:00
|
|
|
|
//---
|
|
|
|
|
|
tasks = new Vector<>();
|
|
|
|
|
|
for (TestRunTask task : Global.testingServer.account_db.testRunTasks.Data.values()) {
|
|
|
|
|
|
if ((task.taskspackage_id == target.id) && (task.isVisible()))
|
|
|
|
|
|
tasks.add(task);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (tasks.isEmpty()) {
|
|
|
|
|
|
Log.Writeln_("Не найдено ни одной видимой задачи.");
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
//---
|
2023-12-07 00:09:10 +03:00
|
|
|
|
dir = directoryChooser.ShowDialog();
|
|
|
|
|
|
if (dir == null) {
|
|
|
|
|
|
Log.Writeln_("Папка не выбрана.");
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
res = new File(dir, Utils.getDateName("package_" + target.id) + ".xls");
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
protected Row addRow(int row_num, boolean isHeader, Object... values) {
|
|
|
|
|
|
Row row = sheet.createRow(row_num);
|
|
|
|
|
|
int i = 0;
|
|
|
|
|
|
for (Object value : values) {
|
2023-12-07 16:25:16 +03:00
|
|
|
|
String cell_text = value.toString();
|
2023-12-07 00:09:10 +03:00
|
|
|
|
Cell cell = row.createCell(i);
|
2023-12-07 16:25:16 +03:00
|
|
|
|
int style_index = 0;
|
|
|
|
|
|
if (!isHeader) {
|
|
|
|
|
|
switch (i) {
|
|
|
|
|
|
case 4:
|
|
|
|
|
|
case 5:
|
|
|
|
|
|
TaskState state = (TaskState) value;
|
|
|
|
|
|
cell_text = state.getDescription();
|
|
|
|
|
|
switch (state) {
|
|
|
|
|
|
case FailedToQueue:
|
|
|
|
|
|
case NoSuchTask:
|
|
|
|
|
|
case AbortedByUser:
|
|
|
|
|
|
case AbortedByTimeout:
|
|
|
|
|
|
case DoneWithErrors:
|
|
|
|
|
|
case WrongTestFormat:
|
|
|
|
|
|
case InternalError:
|
|
|
|
|
|
case Canceled:
|
|
|
|
|
|
style_index = 3;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case Queued:
|
|
|
|
|
|
case Running:
|
|
|
|
|
|
style_index = 5;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case Done:
|
|
|
|
|
|
style_index = 2;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case Crushed:
|
|
|
|
|
|
style_index = 4;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case Finished:
|
|
|
|
|
|
style_index = 6;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
style_index = 1;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
cell.setCellStyle(styles.get(style_index));
|
|
|
|
|
|
cell.setCellValue(cell_text);
|
2023-12-07 00:09:10 +03:00
|
|
|
|
//--
|
|
|
|
|
|
++i;
|
|
|
|
|
|
}
|
|
|
|
|
|
return row;
|
|
|
|
|
|
}
|
2023-12-07 16:25:16 +03:00
|
|
|
|
protected void setBorder(CellStyle style, short border) {
|
|
|
|
|
|
style.setBorderBottom(border);
|
|
|
|
|
|
style.setBorderLeft(border);
|
|
|
|
|
|
style.setBorderRight(border);
|
|
|
|
|
|
style.setBorderTop(border);
|
|
|
|
|
|
}
|
2023-12-08 20:45:23 +03:00
|
|
|
|
protected String extractEnvironmentValue(String environmentsSet, String name) {
|
|
|
|
|
|
if (environmentsSet.contains(name)) {
|
|
|
|
|
|
int index = environmentsSet.lastIndexOf(name);
|
|
|
|
|
|
if (index >= 0) {
|
|
|
|
|
|
String s1 = environmentsSet.substring(index + name.length() + 1);
|
|
|
|
|
|
String[] data = s1.split("\"");
|
|
|
|
|
|
if (data.length > 0) {
|
|
|
|
|
|
return data[1];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return null;
|
2023-12-08 19:03:54 +03:00
|
|
|
|
}
|
2023-12-08 20:45:23 +03:00
|
|
|
|
protected Integer extractIntegerEnvironmentValue(String environmentsSet, String name) {
|
|
|
|
|
|
Integer res = null;
|
|
|
|
|
|
String s = extractEnvironmentValue(environmentsSet, name);
|
|
|
|
|
|
if (s != null) {
|
|
|
|
|
|
try {
|
|
|
|
|
|
res = Integer.parseInt(s);
|
|
|
|
|
|
} catch (NumberFormatException ex) {
|
|
|
|
|
|
ex.printStackTrace();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return res;
|
2023-12-08 19:03:54 +03:00
|
|
|
|
}
|
2023-12-08 21:35:36 +03:00
|
|
|
|
void createStyles(){
|
2023-12-07 16:25:16 +03:00
|
|
|
|
styles = new Vector<>();
|
|
|
|
|
|
//0 - заголовок
|
|
|
|
|
|
//1 - черный
|
|
|
|
|
|
//2 - зеленый
|
|
|
|
|
|
//3 - красный
|
|
|
|
|
|
//4 - темно красный
|
|
|
|
|
|
//5 - оранжевый
|
|
|
|
|
|
//6 - серый
|
|
|
|
|
|
for (int i = 0; i < 6; ++i) {
|
|
|
|
|
|
CellStyle style = book.createCellStyle();
|
|
|
|
|
|
Font font = book.createFont();
|
|
|
|
|
|
switch (i) {
|
|
|
|
|
|
case 0:
|
|
|
|
|
|
font.setBold(true);
|
|
|
|
|
|
setBorder(style, CellStyle.BORDER_THICK);
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
setBorder(style, CellStyle.BORDER_THIN);
|
|
|
|
|
|
switch (i) {
|
|
|
|
|
|
case 1:
|
|
|
|
|
|
font.setColor(HSSFColor.BLACK.index);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 2:
|
|
|
|
|
|
font.setColor(HSSFColor.GREEN.index);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 3:
|
|
|
|
|
|
font.setColor(HSSFColor.RED.index);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 4:
|
|
|
|
|
|
font.setColor(HSSFColor.DARK_RED.index);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 5:
|
|
|
|
|
|
font.setColor(HSSFColor.ORANGE.index);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 6:
|
|
|
|
|
|
font.setColor(HSSFColor.GREY_40_PERCENT.index);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
style.setFont(font);
|
|
|
|
|
|
styles.add(style);
|
|
|
|
|
|
}
|
2023-12-08 21:35:36 +03:00
|
|
|
|
}
|
|
|
|
|
|
void exportPackage(TasksPackage tasksPackage, Index offset){
|
|
|
|
|
|
Row header = addRow(offset.getValue(), true,
|
2023-12-07 00:09:10 +03:00
|
|
|
|
"Группа",
|
|
|
|
|
|
"Тест",
|
|
|
|
|
|
"Язык",
|
|
|
|
|
|
"Флаги",
|
2023-12-08 20:45:23 +03:00
|
|
|
|
"Компиляция",
|
2023-12-07 00:09:10 +03:00
|
|
|
|
"Запуск",
|
2023-12-08 19:03:54 +03:00
|
|
|
|
"NUM_THREADS",
|
|
|
|
|
|
"NUM_CUDAS",
|
|
|
|
|
|
"TOTAL_THREADS",
|
2023-12-08 20:45:23 +03:00
|
|
|
|
"Матрица",
|
2023-12-07 00:09:10 +03:00
|
|
|
|
"Окружение",
|
|
|
|
|
|
"usr.par",
|
2023-12-07 23:32:11 +03:00
|
|
|
|
"Время компиляции (с)",
|
2023-12-08 20:45:23 +03:00
|
|
|
|
"Время запуска (с)",
|
2023-12-07 00:09:10 +03:00
|
|
|
|
"Чистое время (с)",
|
|
|
|
|
|
"Прогресс (%)");
|
|
|
|
|
|
//--
|
2023-12-08 21:35:36 +03:00
|
|
|
|
offset.Inc();
|
|
|
|
|
|
//--
|
2023-12-07 00:09:10 +03:00
|
|
|
|
for (TestRunTask task : tasks) {
|
2023-12-07 17:02:00 +03:00
|
|
|
|
ShowMessage2(task.test_description);
|
2023-12-08 20:45:23 +03:00
|
|
|
|
//---
|
|
|
|
|
|
Integer NUM_THREADS = extractIntegerEnvironmentValue(task.environments, "DVMH_NUM_THREADS");
|
|
|
|
|
|
if (NUM_THREADS == 0)
|
|
|
|
|
|
NUM_THREADS = 1;
|
|
|
|
|
|
Integer NUM_CUDAS = extractIntegerEnvironmentValue(task.environments, "DVMH_NUM_CUDAS");
|
|
|
|
|
|
//--
|
|
|
|
|
|
Object num_threads = (NUM_THREADS != null) ? NUM_THREADS : "undef";
|
|
|
|
|
|
Object num_cudas = (NUM_CUDAS != null) ? NUM_CUDAS : "undef";
|
|
|
|
|
|
Object total_threads = (NUM_THREADS != null) ? NUM_THREADS * Utils.getMatrixProcessors(task.matrix) : "undef";
|
|
|
|
|
|
//--
|
2023-12-08 21:35:36 +03:00
|
|
|
|
Row row = addRow(offset.getValue(), false,
|
2023-12-07 00:09:10 +03:00
|
|
|
|
task.group_description,
|
|
|
|
|
|
task.test_description,
|
|
|
|
|
|
task.language.getDescription(),
|
|
|
|
|
|
task.flags,
|
2023-12-07 16:25:16 +03:00
|
|
|
|
task.compilation_state,
|
|
|
|
|
|
task.state,
|
2023-12-08 20:45:23 +03:00
|
|
|
|
num_threads,
|
|
|
|
|
|
num_cudas,
|
|
|
|
|
|
total_threads,
|
2023-12-07 00:09:10 +03:00
|
|
|
|
task.matrix,
|
|
|
|
|
|
task.environments,
|
|
|
|
|
|
task.usr_par,
|
2023-12-07 23:32:11 +03:00
|
|
|
|
task.compilation_time,
|
2023-12-07 00:09:10 +03:00
|
|
|
|
task.Time,
|
|
|
|
|
|
task.CleanTime,
|
|
|
|
|
|
task.progress
|
|
|
|
|
|
);
|
2023-12-08 21:35:36 +03:00
|
|
|
|
offset.Inc();
|
2023-12-07 00:09:10 +03:00
|
|
|
|
}
|
2023-12-08 21:35:36 +03:00
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
protected void body() throws Exception {
|
|
|
|
|
|
File file = Utils.getTempFileName("table");
|
|
|
|
|
|
//--
|
|
|
|
|
|
book = new HSSFWorkbook();
|
|
|
|
|
|
sheet = book.createSheet("Результаты тестирования");
|
|
|
|
|
|
//--
|
|
|
|
|
|
createStyles();
|
|
|
|
|
|
//--
|
|
|
|
|
|
Index offset = new Index();
|
|
|
|
|
|
exportPackage(target, offset);
|
2023-12-07 00:09:10 +03:00
|
|
|
|
//--
|
2023-12-08 21:35:36 +03:00
|
|
|
|
for (int i = 0; i < max_columns; ++i)
|
2023-12-07 00:09:10 +03:00
|
|
|
|
sheet.autoSizeColumn(i);
|
|
|
|
|
|
// Записываем всё в файл
|
|
|
|
|
|
FileOutputStream stream = new FileOutputStream(file);
|
|
|
|
|
|
book.write(stream);
|
|
|
|
|
|
book.close();
|
|
|
|
|
|
stream.close();
|
|
|
|
|
|
///--
|
|
|
|
|
|
FileUtils.copyFile(file, res);
|
|
|
|
|
|
book = null;
|
|
|
|
|
|
stream = null;
|
|
|
|
|
|
file = null;
|
|
|
|
|
|
}
|
2023-12-07 02:05:08 +03:00
|
|
|
|
@Override
|
|
|
|
|
|
protected void performDone() throws Exception {
|
|
|
|
|
|
super.performDone();
|
|
|
|
|
|
if (Desktop.isDesktopSupported()) {
|
|
|
|
|
|
if (UI.Question("Таблица сформирована в файле\n" + Utils.DQuotes(res.getAbsolutePath()) + ".\nОткрыть её"
|
|
|
|
|
|
)) {
|
|
|
|
|
|
Desktop.getDesktop().open(res);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-12-07 00:09:10 +03:00
|
|
|
|
}
|