Compare commits

..

831 Commits

Author SHA1 Message Date
c7a2e80f1e no message 2025-06-16 13:32:40 +03:00
83d48d4db1 подстановка инклудов — передача параметров 2025-06-13 14:45:18 +03:00
f2644392ad проверка на пустоту сообщений при распаковке
++
2025-06-12 13:32:49 +03:00
641ce80102 запаковка со стороны визуализатора инклудов 2025-06-06 22:59:58 +03:00
7924212fed no message 2025-06-06 22:36:49 +03:00
3090e80f72 распаковка сообщений от консольного режима. фикс подсчета ошибок,различия считались за ошибки, но для них уже давно есть отдельное поле
++
2025-06-06 14:06:29 +03:00
b418066932 распаковка сообщений от парсера 2025-05-26 00:23:09 +03:00
f5eaf3df25 принятие сообщений сапфора в json 2025-05-23 18:25:23 +03:00
bf5a648582 добавил поле типа 2025-05-23 17:10:33 +03:00
114e2ac4ad no message 2025-05-23 15:37:46 +03:00
b5e3a2c011 no message 2025-05-23 15:16:22 +03:00
b8d10a1434 сообщения в json 2025-05-22 14:11:38 +03:00
46cdd480bc no message 2025-05-20 16:34:09 +03:00
93396a00b1 ++
Перевод оценок параллельных вариантов в json формат
2025-05-20 16:31:54 +03:00
eeb57ab7c2 стата вариантов в json 2025-05-20 16:29:57 +03:00
e53f0ed939 TotalScore 2025-05-20 16:14:40 +03:00
9eede4802e стата вариантов в json 2025-05-20 14:33:28 +03:00
688f36c4c3 распаковка ссылок 2025-05-19 14:37:14 +03:00
c270429c66 объекты для ссылок 2025-05-18 19:34:05 +03:00
6135b738ba no message 2025-05-18 18:49:30 +03:00
41ce6527d5 ++
распределение в json, еще нашел внесенный переходом баг с отображением массивов текущего файла.
2025-05-18 18:12:30 +03:00
cba4425cd7 переименования в единый стиль полей массивов и регионов 2025-05-17 18:07:07 +03:00
0cb4022969 ++
fix бага со слиянием
2025-05-13 15:33:47 +03:00
0ec1ce09da ++
исправление бага с тестированием
2025-05-12 17:57:55 +03:00
ef92651552 рефакторинг. подготовка к переводу регионов на json 2025-05-12 17:18:26 +03:00
d8178fa704 no message 2025-05-10 17:16:24 +03:00
c148f62198 no message 2025-05-10 17:15:45 +03:00
e1291446c8 no message 2025-05-07 21:44:44 +03:00
1f4b736188 исправление имен файлов на виндовые слеши при распаковке 2025-05-07 20:36:14 +03:00
47a4772632 no message 2025-05-07 20:30:27 +03:00
571e2d2544 Перевод объявлений массивов в json 2025-05-07 20:29:58 +03:00
62a45fd8be no message 2025-05-06 17:28:46 +03:00
6e0956e3e5 Массивы в json 2025-05-06 16:26:47 +03:00
b46f86bebb ++
гков на джсон. добавлена проверка на отрицательный код инфы по джсон
2025-05-02 22:41:56 +03:00
d2c2f571ff ++
фикс падения при поиске зависимостей
2025-04-30 21:27:47 +03:00
70771dd0ce ++
метрику в json
2025-04-23 14:22:30 +03:00
b37e20e4a4 ++
решение проблемы совместимости с java 1.8._4xx
2025-04-21 15:27:20 +03:00
e8c748eb7e метрика json 2025-04-16 14:45:34 +03:00
da4e8b07bc ++
инклуды в json формате
2025-04-16 14:29:37 +03:00
611194be8c отображение инклудов 2025-04-16 14:16:38 +03:00
a0c45a2df0 небольшие правки с инклудами 2025-04-15 00:02:43 +03:00
8d236c99b8 no message 2025-04-14 21:58:11 +03:00
ccf20c354b no message 2025-04-14 21:44:35 +03:00
28eee09056 json для инклудов 2025-04-14 21:44:19 +03:00
cb1f19cfb7 ++
Перевод в json получаемых координат графа процедур
2025-04-13 21:39:24 +03:00
74f9a68ceb no message 2025-04-13 21:20:57 +03:00
9303839e8e no message 2025-04-13 20:14:25 +03:00
dc17b7d741 ++
граф процедур на json
2025-04-13 18:59:33 +03:00
eb86b936bc no message 2025-04-13 18:08:16 +03:00
cd86f1257a no message 2025-04-13 17:54:56 +03:00
46e1bd17f1 no message 2025-04-13 17:19:10 +03:00
7efe852bc1 граф процедур в json 2025-04-10 20:56:46 +03:00
829cd0c770 ++
убрал избыточно длинное имя в версиях пакета сапфор на панели сравнения
2025-04-09 20:34:58 +03:00
6faf06f949 ++
фикс бага с путями. визуализатор все пути к файлам переделывает на винду, для однотипности ключей в бд проекта. не было учтено при распаковке графа циклов
2025-04-09 20:19:19 +03:00
73a39681f1 ++
включил автоскролл при сравнении одинаковых пакетов
2025-04-07 19:34:32 +03:00
4c5331de55 ++
недостающие иконки
2025-04-07 18:35:24 +03:00
411e97abb8 ++
изменение отображения различий пакетов сапфора
2025-04-07 18:08:59 +03:00
fd21de489e возврат визуального бага. все же, нужно принудительно перерисовывать файл с ГПЕ,иначе шрифт все равно едет 2025-04-07 15:00:51 +03:00
aac4221a4d no message 2025-04-03 23:04:26 +03:00
f1a1ce0436 no message 2025-04-03 19:14:55 +03:00
419af0766e ++
Оптимизация анализа состояния версий пакетов сапфор
2025-04-03 19:08:17 +03:00
98ec37233a фикс бага с распаковкой сообщений при выгрузке версий тестирования сапфор как проекта 2025-04-03 16:08:36 +03:00
32e1e68d9a ++ 2025-04-01 15:46:41 +03:00
68cf40367a fix
При новой распаковке выдает имена с линуксовым слешем, для винды пришлось учесть
2025-03-31 22:25:27 +03:00
c6d2452530 граф циклов в джсоне 2025-03-31 22:12:04 +03:00
76c710b1bc распаковка с учетом интов 2025-03-31 22:01:40 +03:00
029947c793 no message 2025-03-31 21:18:15 +03:00
38f39411ad no message 2025-03-31 19:49:15 +03:00
cb7b5809f1 no message 2025-03-31 14:41:27 +03:00
ddf04c6f39 no message 2025-03-31 14:40:09 +03:00
48290ccf97 исправление енума на инт 2025-03-31 14:18:43 +03:00
e706b52b53 no message 2025-03-30 17:37:51 +03:00
c8045a5db1 no message 2025-03-30 16:38:39 +03:00
5ef516d019 no message 2025-03-30 16:00:18 +03:00
4f5a091af7 no message 2025-03-30 15:35:00 +03:00
cc21931ebe переименование/лишние поля 2025-03-30 15:30:38 +03:00
18227f565a логический тип в инт 2025-03-28 20:01:17 +03:00
ef5bd5b1a8 версия под джсон. в графе циклов временно закоммичена старая распаковка 2025-03-28 19:57:24 +03:00
41b98607cd рефакторинг объектов сапфора для подготовки к джсону 2025-03-28 18:55:54 +03:00
7178ecbc9c ++
убирание джсон запакованных полей у баг репортов
2025-03-27 15:31:26 +03:00
dcdbaa83cf рефакторинг адресатов баг репортов 2025-03-27 15:12:09 +03:00
86b582dd1f no message 2025-03-27 13:00:43 +03:00
c7a618dd25 промежуточный. перевод хранимых настроек багов из джсона в таблицу. рефакторинг публикации, был лишний проход 2025-03-27 12:55:56 +03:00
fb296a02ee no message 2025-03-27 12:45:55 +03:00
19afec4d25 утренние изменения
удаление эталона и роль студента
2025-03-26 16:12:00 +03:00
1ae4d1980a ++
роль студента
2025-03-26 14:00:46 +03:00
919e7a2e10 ++
сброс эталона пакета сапфор
2025-03-26 13:24:40 +03:00
fef75270a7 ++
доделано сравнение
2025-03-26 02:43:58 +03:00
2a30a42e77 фикс подсветки. 2025-03-26 02:07:22 +03:00
b900622e4e промежуточный. использовал невидимый символ для обозначения различий 2025-03-26 00:11:41 +03:00
a47a6705d8 ++
сравнение
2025-03-25 18:56:18 +03:00
809b1f8d14 ++
завершено избавление от  джсонов
2025-03-25 14:46:32 +03:00
23b143f916 no message 2025-03-25 14:09:11 +03:00
7ef9ee0d5c промежуточный. перевод опций и флагов из джсона в таблицы. надо еще отладить, и доделать клонирование 2025-03-25 01:56:48 +03:00
a60ed8f661 ++
показ эталонов сапфор
2025-03-24 14:50:54 +03:00
74ae6abf50 no message 2025-03-23 22:34:05 +03:00
b4d0a62d6c ++
учет только групп возможен и в конфигах сапфора
2025-03-23 22:31:50 +03:00
535053baca ++
упразднение джсон в описании конфигураций
2025-03-23 22:03:17 +03:00
af644f8f04 no message 2025-03-23 21:24:09 +03:00
dae9d58d82 no message 2025-03-23 18:44:12 +03:00
4f50c4a559 промежуточный. начало ввода индексов для пакетов 2025-03-23 16:43:19 +03:00
fcebae094f fix 2025-03-23 16:17:32 +03:00
abab3f067c ++
временне исправление эталонов тестирования сапфор
2025-03-23 15:59:28 +03:00
167ceb42a5 удаление неиспользуемых джсонов групп тестов и настроек. 2025-03-23 15:44:52 +03:00
cf9b028400 no message 2025-03-23 15:36:46 +03:00
b763c2c266 чистка лишних импортов.и фикс бага с сохранением тестов 2025-03-23 14:28:20 +03:00
811acba5a7 фикс. проверил внешние ключи новых таблиц 2025-03-23 13:20:11 +03:00
bc1faa1a06 no message 2025-03-23 13:06:44 +03:00
f6cc447481 промежуточный.привожу в порядок индексы. 2025-03-23 02:14:23 +03:00
10c213feae прмежуточный. в процесе рефакторина лишних джсон. частично в разобранном виде поэтому не сливать! 2025-03-21 23:02:53 +03:00
74146fae4c no message 2025-03-21 17:43:46 +03:00
df204b64a7 no message 2025-03-21 17:02:45 +03:00
2d0d69fd7a рефакторинг. прописал стандартную проверку существования объекта в бд сервера 2025-03-21 12:56:12 +03:00
637e9c5c0f рефакторинг взаимодействия с бд сервера. был индийский код при альтернативной базе на сервере компонент 2025-03-21 01:21:54 +03:00
78ee5bc428 ++
Удаление спф директив
2025-03-20 18:14:41 +03:00
0b5f8c6ec7 ++
рефакторинг бд файлов тестов.
2025-03-20 17:48:18 +03:00
3f4ef5f198 ++
ввод флага для конфигураций, учитывать только группы
2025-03-18 19:26:32 +03:00
afaaaba1e7 ++
отслеживание нанов в тестах
2025-03-18 15:28:00 +03:00
21a41987b4 no message 2025-03-16 15:28:04 +03:00
933638afb8 no message 2025-03-16 14:11:44 +03:00
b6b7bb3ae5 no message 2025-03-15 18:03:32 +03:00
6a3be45b1a ++
fix
2025-03-15 16:06:44 +03:00
55aa66fa18 исправил условие применения эталонов с "только корректность" на "все кроме производительности"
++
2025-03-15 13:53:23 +03:00
2ab2a79d8d фикс.. при отображении состава текущей конфигурации тестирования не снимались галочки с настроек,до этого момента 2025-03-15 13:42:16 +03:00
c8d597e9cd эталоны
работают только для тестов на корректность,и если задана соответствующая настройка( с последним можно подумать и искать их самостоятельно, если они есть)
2025-03-14 23:55:09 +03:00
9a5b84c068 рефакторинг анализа результатов запуска двм пакетов. был удвоенный код 2025-03-14 21:29:21 +03:00
174bc344a4 доработка создания эталонов, теперь отслеживается есть ли уже последовательная задача для каждого теста. прочие имеют ссылку на ее ид 2025-03-14 20:54:02 +03:00
e2b307d4f6 фикс бага с синхронизацией тестов из репозитория. забыл поменять почту со своей на серверную и они качались заново и множились.
начал внедрение эталонов
++
2025-03-14 19:13:04 +03:00
a2017f9e01 ++
добивание живых задач, отключение лишней рассылки админам, настройка удаления или не удаления пакета на машине
2025-03-14 13:48:30 +03:00
9f4eb9d88e fix.додедал этап прерывания компиляции 2025-03-14 10:35:24 +03:00
04cf5c1552 ++
исправления планировщика
2025-03-14 01:14:56 +03:00
c7626e877e no message 2025-03-13 22:52:44 +03:00
ALEXks
cb7360ae86 improved planner 2025-03-13 20:47:20 +03:00
8fc70d48ad имя пакета в имени задач планировщика. 2025-03-13 20:10:28 +03:00
4ce7190905 ++
перевод тестов на гит, рефакторинг проходов загрузки репозитория
2025-03-13 17:11:05 +03:00
dc68667b20 ++
Дополнение обновлений
2025-03-13 14:36:02 +03:00
1d97048de1 no message 2025-03-13 00:32:20 +03:00
91e40c4393 no message 2025-03-12 23:09:08 +03:00
a6e02172f8 no message 2025-03-12 21:50:13 +03:00
8a6c9804b4 сборка компонент под юниксом через гит 2025-03-12 21:47:54 +03:00
8aea85a009 сборка сапфора через гит. если версия собралась с ошибками, больше не будет попыток ее автоматической сборки.( но возможна ручная) 2025-03-12 21:04:22 +03:00
b1740da1f1 подправил бекапы. на почту шлется только бд,(иначе вложения не влезают). тестирование сохраняет только бд и тесты. 2025-03-10 01:48:41 +03:00
5653438b75 ++
ошибки в статусе пакета
2025-03-09 22:32:37 +03:00
c85661a264 назначение окружения PATH LD_LIBRARY_PATH
++
2025-03-09 21:35:34 +03:00
d2a333c7cb ++
Оптимизация рассылки при публикации.
2025-03-09 17:27:35 +03:00
f3747a359b ++
Исправлены баги с рассылкой и размножением сообщений.
2025-03-08 15:56:34 +03:00
e123600e06 no message 2025-03-08 02:47:58 +03:00
c4157fc30b рефакторинг бекапов. бекапы для тестирования. бекапы по кнопке
++
2025-03-08 02:42:21 +03:00
e428d621ac ++ 2025-03-07 17:37:30 +03:00
aa5bcc7df7 fix. журналы серверов были почему то настроены на папку компонентов 2025-03-07 17:33:28 +03:00
dec4835187 упразднение постоянного хранения тестовых архивов 2025-03-07 17:26:13 +03:00
d66fdc5e77 ++
перевод инфы о файлах в джсон. попутно задел под пользовательские типы файлов стиль язык
2025-03-07 03:10:05 +03:00
670324837d поле запаковки в json данных о файлах теста 2025-03-07 00:21:43 +03:00
ab0e0af6b3 определение размерности после замены кода теста на текущий проект. 2025-03-06 22:07:36 +03:00
b08242fed4 рефакторинг определения размерности тестов на сервере. 2025-03-06 21:48:51 +03:00
7b81a8bdd0 ++
мелочи. название p для версии общей памяти, фильтр задач по матрицам, отображение числа завершившихся задач в статусе, отображение размерности матрицы и числа процессов в таблице задач
2025-03-06 17:59:03 +03:00
20aef1f340 фикс багов с отображением тестов и внесенного бага печати исключений
++
2025-03-05 20:25:23 +03:00
39f5b99ade v++
Зачиста устаревших полей в БД тестировния
2025-03-04 17:11:17 +03:00
e8d6764563 генерация задач с обновленными параметрами. 2025-03-04 16:30:32 +03:00
9c0f3215ad no message 2025-03-04 14:19:04 +03:00
b908ddc8f1 no message 2025-03-04 13:43:31 +03:00
0b35c948ab аналогичная запаковка и распаковка окружения. осталось формирование задач и отображение в таблице 2025-03-04 13:33:46 +03:00
b79b33e232 fix 2025-03-04 03:30:39 +03:00
0e2d2abb84 удаление набора флагов 2025-03-04 02:24:27 +03:00
fe78d89a58 Merge branch 'main' of http://alex-freenas.ddns.net:3000/M/VisualSapfor 2025-03-04 02:15:32 +03:00
7f9305f02b промежуточный. внедрение наборов флагов в параметры тестирования двм. сделал добавление и редактирование. 2025-03-04 02:14:30 +03:00
ALEXks
fca5bb42bd rollback 2025-03-03 18:54:03 +03:00
ALEXks
4ae8c2f664 removed timer checking 2025-03-03 18:51:20 +03:00
ALEXks
683d5249eb fixed 2025-03-03 18:23:49 +03:00
ALEXks
278782a244 Merge branch 'main' of http://alex-freenas.ddns.net:3000/M/VisualSapfor into main 2025-03-03 18:18:57 +03:00
ALEXks
4288f83105 improved planner 2025-03-03 18:18:09 +03:00
ALEXks
242719e7a7 improved planner 2025-03-03 18:16:46 +03:00
4da5f4bc03 v++ 2025-03-03 17:11:13 +03:00
cba10bef14 Merge branch 'main' of http://alex-freenas.ddns.net:3000/M/VisualSapfor 2025-03-03 16:49:44 +03:00
7728ddbf23 небольшой баг. у незарегистрированного пользователя могли проверяться пакеты. 2025-03-03 16:21:32 +03:00
d455c21b9c no message 2025-03-03 16:09:58 +03:00
ALEXks
b8751d9b67 version updated 2025-03-03 15:04:58 +03:00
ALEXks
74f4be7027 rollback 2025-03-03 15:04:31 +03:00
eb7c0ffbc5 v++ 2025-03-03 13:40:24 +03:00
b4808bcd7c no message 2025-03-03 13:39:32 +03:00
ALEXks
90b45fc806 improved planner 2025-03-03 13:38:26 +03:00
ALEXks
9b02a5c9ea improved planner 2025-03-03 13:36:20 +03:00
e98127880b символические ссылки при копировании экземпляров визуализатора на сервере ( для нитей и пакетов сапфора)
v++
2025-03-02 18:32:45 +03:00
1ee8256885 просмотр текста ячеек по пкм.
v++
2025-03-02 15:19:37 +03:00
c9a013a17b расширенный просмотр содержимого ячейки таблицы по ПКМ 2025-03-02 14:26:16 +03:00
6413f2340a уменьшил шрифт в столбцах со временем 2025-03-02 13:43:59 +03:00
3c9bc3f9b7 v++
время выполнения пакетов
2025-02-28 23:31:53 +03:00
d019beff5f реализовал сохранение пути при экспорте в эксель, и при сохранении изображения графа функций. 2025-02-28 22:54:37 +03:00
4441864b6f v++
убирание недоступных пользователю вкладок, и настроек
2025-02-28 21:48:51 +03:00
33f3d615da сокрытие настроек от пользователей если недостаточно прав. например синхронизация тестирования не видима ролям ниже разрабов 2025-02-28 19:12:32 +03:00
61d8670416 рефактиринг интерфейса при отображении полномочий роли пользователя. ввод настройки отменяющей приглашение регистрации при запуске приложения. 2025-02-28 17:46:57 +03:00
c551fdd2c9 опечатка в имени функции 2025-02-28 16:18:37 +03:00
d7ea2f862e Закрытие уязвимости с именами тестов
v++
2025-02-25 14:17:23 +03:00
d81abc226c исправление бага с инициализацией нового пользователя.
v++
2025-02-23 15:11:05 +03:00
2f4f841dcc v++
Авторство тестов из репозитория серверу и серверной почте. На будущее введем акк сервер
2025-02-22 16:48:19 +03:00
c83cfd9eff fix
Устранены пропущенные уязвимости в некоторых проходах
v++
2025-02-22 16:10:21 +03:00
f7973e0991 промежуточный. нашел еще несколько уязвимостей в редактировнии чужих объектов. 2025-02-22 15:18:22 +03:00
8701c8ba36 Завершение обновления безопасности.
v++
2025-02-21 01:57:15 +03:00
49f0a56c4f путь к двм для конвертации в настройки сервера 2025-02-20 15:21:41 +03:00
ed61eb2ae0 v++ 2025-02-20 14:13:13 +03:00
25fc55c03e no message 2025-02-20 13:51:27 +03:00
a8244bf872 v++
Авторизация по ключам
2025-02-20 13:47:50 +03:00
daa53d9d73 no message 2025-02-20 01:02:44 +03:00
b445e3e879 сохранение адресатов и исполнителя.восстановление 2025-02-20 00:49:30 +03:00
f1440dd1e2 no message 2025-02-20 00:39:59 +03:00
4e3597ba7a промежуточный. загрузка адресатов для багов без наличия их в бд. 2025-02-19 22:47:56 +03:00
7a9c70f396 удаление учетной записи с сервера 2025-02-19 14:34:42 +03:00
8215388bc6 Добавление учетных записей администратором 2025-02-19 02:05:07 +03:00
39595d849e fix 2025-02-19 01:16:47 +03:00
024f274360 ключ теперь не поле бд а отдельный файл на сервере. 2025-02-19 01:10:25 +03:00
7eba13370d промежуточный. проход редактирования учетной записи админом 2025-02-19 00:41:55 +03:00
5046d84b86 no message 2025-02-18 23:45:24 +03:00
073bbfd544 промежуточный.заложил вкладку для админа 2025-02-18 21:52:25 +03:00
1b4b375f39 упразднение старого объекта аккаунта 2025-02-18 20:14:14 +03:00
794097f81f no message 2025-02-18 19:11:29 +03:00
9d11ebb653 промежуточный. проверка пользователя по ключу 2025-02-18 18:13:50 +03:00
0a123988b3 рефакторинг 2025-02-18 16:21:20 +03:00
9c0ed53d52 fix столбы конфигурация сапфор
v++
2025-02-16 22:37:26 +03:00
77179789f5 v++ 2025-02-15 23:30:48 +03:00
68bd1ef6b4 fix
отключение проверки версии при регистрации
v++
2025-02-14 13:32:38 +03:00
c76908ad58 no message 2025-02-14 03:16:43 +03:00
209bb2455d no message 2025-02-14 02:17:56 +03:00
a86a5b1e6b промежуточный.безопасность на стороне сервера. Утром доделаю на стороне клиента 2025-02-14 02:09:55 +03:00
05b49a842e no message 2025-02-14 01:24:49 +03:00
6d9bd4bc9b no message 2025-02-14 01:22:50 +03:00
245ed7c5f0 включение цепочки преобразований в описание теста при его импорте из пакета сапфор
v++
2025-02-14 00:13:00 +03:00
f2b2acb49f v++
Исправлен таймаут на скачивание пакетов.Разрешено добавлять в группу завершенный с ошибками пакет( только успешные задачи)
2025-02-13 23:07:18 +03:00
36438e5b20 рефакторинг кода тестового сервера 2025-02-13 22:43:04 +03:00
5e6719412d рефакторинг кода сервера компонент 2025-02-13 22:25:54 +03:00
0bdc870a72 удаление устаревших кодов для сервера 2025-02-13 20:45:51 +03:00
54ec1fee99 промежуточный. рефакторинг объекта сервера. 2025-02-13 20:27:01 +03:00
91f4ed4a17 fix умножения сапфоровских задач
v++
2025-02-13 18:40:53 +03:00
dd1f7f8040 Рефакторинг проходов запуска, остановки,публикации серверов
v++
2025-02-13 16:20:48 +03:00
016e51dbe5 v++
Массовое определение размерности тестов
2025-02-13 01:43:23 +03:00
90b6f3648e fix 2025-02-12 23:24:54 +03:00
57baa6c9c1 v++ 2025-02-12 23:02:46 +03:00
74fcc2150d внутренний проход на обновление результатов анализа пакетов двм системы. пока только по заявкам, в обычной версии никому его не видно. Возможно и не понадобится больше. 2025-02-12 22:49:20 +03:00
b80bea4c1b no message 2025-02-12 14:22:11 +03:00
ede6438fbf v++
fix
2025-02-11 23:32:28 +03:00
62de67ccb7 fix 2025-02-11 23:08:27 +03:00
c69e7194bc промежуточный. определение размерности тестов на сервере через консоль. но есть баг. почему то один и тот же пакет повторно нельзя сконвертировать в тесты. 2025-02-11 23:03:18 +03:00
25eabf6852 промежуточный. на стороне сервера реализовано создание тестов на основе версий. 2025-02-11 21:28:35 +03:00
4ef8d4b52c v++ 2025-02-10 22:49:30 +03:00
0049409cdf Отображение текущей задачи тестирования ДВМ 2025-02-10 22:38:42 +03:00
7eecdf8f4d убрал возможность задавать тип машины как кластера 2025-02-10 16:14:48 +03:00
bc750f8db0 в массовых фильтрах по умолчанию убрал галки. чтобы посмотреть раздел нужен лишний клик это не очень удобно 2025-02-08 21:46:16 +03:00
75abb0ae46 удаление распакованных результатов после анализа 2025-02-08 21:28:25 +03:00
a27ab3acef исправление бага с неуведомлением о запуске пакета двм 2025-02-08 20:48:16 +03:00
950b47d145 фильтр задач двм по языку 2025-02-08 20:21:24 +03:00
2eca19cad4 Добавление фильтров по имени в - группы, тесты, параметры, конфигурации, задачи двм системы 2025-02-08 20:06:43 +03:00
b8f1ad56ed убирание портов в константы внутри кода 2025-02-08 19:19:26 +03:00
7dd3069445 v++ 2025-02-06 22:54:06 +03:00
407294c6ae показ имени машины 2025-02-06 21:39:19 +03:00
0c2b716368 символьные ссылки в планировщике 2025-02-06 21:23:55 +03:00
bd2e8643fd защита групп и тестов от редактирования не-авторами 2025-02-06 21:10:58 +03:00
dcdd392e95 укорачивание поля выбора порта 2025-02-06 20:56:22 +03:00
fa31d5570c дополнение безопасности. не везде был сделан режим чтения 2025-02-06 20:44:51 +03:00
16c307103f запрет на удаление чужих объектов тестирования 2025-02-06 19:44:59 +03:00
467c9b5b31 no message 2025-02-06 19:20:15 +03:00
305b607c24 запрет с правами ниже разработчика во владку тестирования 2025-02-06 18:45:30 +03:00
20e82075b7 исправление безопасности. промежуточный. 2025-02-06 18:31:18 +03:00
6e0e51beff пауза тестирования. перенос фильтров влево. v++ 2025-02-06 17:26:14 +03:00
63b923e33b отключение проверок на сбой связи 2025-02-06 14:07:46 +03:00
775526b5e3 пустой файл вывода как признак падения (авост) теста двм 2025-02-06 14:04:08 +03:00
82fbe8a751 флаг 2025-02-05 20:07:14 +03:00
19bcc13048 ++ версии планировщика 2025-02-05 19:53:21 +03:00
ALEXks
d5aabbace7 Merge branch 'main' of http://alex-freenas.ddns.net:3000/M/VisualSapfor into main 2025-02-05 19:50:33 +03:00
ALEXks
fa12c4b672 fixed 2025-02-05 19:50:28 +03:00
de9f5ce5c7 поднял версию планировщика в коде 2025-02-05 19:32:35 +03:00
905a31da1f no message 2025-02-05 19:30:16 +03:00
ALEXks
68c21c6955 improved planner 2025-02-05 19:18:05 +03:00
e259a3c2a9 v++
Любое взаимодействие с серверами сведено до единстенной команды.
2025-02-05 01:40:28 +03:00
c89e757171 no message 2025-02-05 01:14:41 +03:00
dd90100bfa no message 2025-02-04 23:47:15 +03:00
13cda78d47 no message 2025-02-04 22:00:16 +03:00
a19a9759d3 no message 2025-02-04 21:37:07 +03:00
bcae6820af no message 2025-02-04 21:14:14 +03:00
5841f5ca7d no message 2025-02-04 20:57:32 +03:00
d4c2875ed5 no message 2025-02-04 20:51:23 +03:00
b05e7ffaec no message 2025-02-04 20:45:12 +03:00
e18d605d5b no message 2025-02-04 20:43:34 +03:00
7212dd7d31 рефакторинг создания группы тестов из папки.попутно найден внесенный обновлением настроек баг. 2025-02-04 20:24:58 +03:00
e1fc740321 no message 2025-02-04 19:28:38 +03:00
7855ce62a4 no message 2025-02-04 18:49:55 +03:00
281ec9bfc2 no message 2025-02-04 18:13:49 +03:00
fb98945b38 no message 2025-02-04 17:07:03 +03:00
b0941d6bfd no message 2025-02-04 16:55:55 +03:00
d35848478f no message 2025-02-04 16:36:33 +03:00
87a761f5a6 no message 2025-02-04 16:33:06 +03:00
353c0b2dbe no message 2025-02-04 16:24:32 +03:00
c2256a247b no message 2025-02-04 16:22:42 +03:00
8696c7e66f продолжение рефакторинга клиентских проходов. 2025-02-04 16:06:49 +03:00
e15f2921ee no message 2025-02-04 01:44:22 +03:00
0373e7b546 открытие задач по двойному клику 2025-02-04 00:59:35 +03:00
ae2327347a no message 2025-02-04 00:44:45 +03:00
505d151ee5 рефакторинг отправления бага. была избыточная команда 2025-02-03 23:50:09 +03:00
26434b21ab рефакторинг публикации компонентов 2025-02-03 23:04:40 +03:00
458e250b5c дополнение анализа ошибок вывода тестов 2025-02-03 20:38:27 +03:00
aefbd50612 рефакторинг запроса версий компонент. сделал одной командой 2025-02-03 20:31:34 +03:00
46f44f48b7 рефакторинг дополнения полей багов 2025-02-03 19:53:48 +03:00
e0f441d82a промежуточный. кусок рефакторинга на тему борьбы с зависаниями. пока не внедрен 2025-02-03 15:19:53 +03:00
6911bc6cdb Обновление прав.Разработчики могут произвольно работать с багами
v++
2025-02-01 22:24:15 +03:00
ef5089443a v++ 2025-01-29 15:20:24 +03:00
f7de2590b9 универсальный дофикс бага с перерисовкой деревьев 2025-01-29 14:32:20 +03:00
f5e411c827 очистка отладочной печати. тоже кое-что накопилось. 2025-01-29 14:08:57 +03:00
8c9835f8fd v++
fix визуального бага с деревом. Для корректной перерисовки узла нужно перерисовать его персонально.
2025-01-23 20:44:13 +03:00
58312b9c3d исправление бага с неверным приоритетом открытия файлов проекта. v++ 2025-01-23 19:52:25 +03:00
94208ec25c fix бага с настройками почты 2025-01-23 17:40:52 +03:00
6c0c103804 v++
Папка для загрузок, и пропущенный баг с настройками визуализатора.
2025-01-23 16:56:45 +03:00
29176ebb4a no message 2025-01-23 15:59:01 +03:00
18b4d58682 no message 2025-01-18 01:36:02 +03:00
69151dd7a8 удаление устаревшего объекта 2025-01-17 18:11:32 +03:00
3d8ba57f4a no message 2025-01-17 17:39:13 +03:00
9034636067 fix 2025-01-17 17:16:37 +03:00
30fcf649c3 fix 2025-01-17 01:55:37 +03:00
28fe6ee235 v++
завершение обновления с настройками
2025-01-17 01:35:43 +03:00
01da3b3a70 галочка для назначения профиля по умолчанию 2025-01-16 23:44:17 +03:00
72e4fbdf31 no message 2025-01-16 20:42:55 +03:00
095c0bad9a no message 2025-01-16 19:53:51 +03:00
328a00063e no message 2025-01-16 19:35:26 +03:00
96a269004d патч на применение настроек старых баг репортов 2025-01-16 19:04:46 +03:00
1b6db1fd5b no message 2025-01-16 16:25:27 +03:00
6d7f885926 no message 2025-01-16 16:21:21 +03:00
0f7b65f467 промежуточный. перенос настроек в проект. есть баги. завтра доделываю, версия не вполне рабочая 2025-01-16 02:26:51 +03:00
483089e954 промежуточный. в процессе рефакторинга объектов с настройками 2025-01-14 00:47:19 +03:00
63112eed7b no message 2025-01-13 22:43:00 +03:00
3decbe5212 удаление мусорного кода с настройками 2025-01-13 22:41:11 +03:00
6e28bfa809 v++
перенос всех DBSetting кроме сапфоровских в properties.
2025-01-13 14:38:20 +03:00
d2c4794690 no message 2025-01-11 23:19:24 +03:00
7a06c2ce2b no message 2025-01-11 22:48:00 +03:00
8b2fb67422 no message 2025-01-11 21:34:17 +03:00
fe752d2073 no message 2025-01-11 21:08:48 +03:00
bbe99efefe no message 2025-01-11 20:27:43 +03:00
b48e2c995d no message 2025-01-11 20:02:03 +03:00
fc60b78784 no message 2025-01-11 19:32:54 +03:00
0d3edd7e3f no message 2025-01-11 18:13:25 +03:00
9c6198656f продолжение рефакторинга настроек. попутно нашел небольшой баг с закрытием пустого проекта. 2025-01-11 17:43:27 +03:00
3de25ff12d no message 2025-01-11 17:12:26 +03:00
bd705813e9 no message 2025-01-11 14:26:24 +03:00
d495a5afb7 no message 2025-01-11 02:09:44 +03:00
fcc2bbaf04 no message 2025-01-11 01:42:24 +03:00
f3f6c52f81 промежуточный. в процессе рефакторинга настроек. 2025-01-10 23:57:49 +03:00
0b7b793571 перенос настроек сравнения в проперти 2025-01-10 22:22:23 +03:00
10a4ebfe43 удаление части лишних позиций в енуме настроек 2025-01-10 21:09:13 +03:00
9bc35c0ca6 промежуточный. перевод настроек синхронизации в проперти 2025-01-10 21:03:06 +03:00
368fcf4a8e включен анализатор. v++ 2025-01-08 14:04:40 +03:00
a38427a25a исправление бага с кнопками. проблема была в привязке меню бара к старому датасорсу при переоткрытии проектов.
v++
2024-12-25 14:42:00 +03:00
8536ba9d77 редизайн вкладки с машинами, и отображения текущих объектов
v++
2024-12-02 23:11:40 +03:00
03b73e98f8 no message 2024-12-02 01:51:25 +03:00
9c8abd7ee4 рефакторинг полей багов, настройка автопоиска обновлений, версия ++ 2024-12-01 23:55:14 +03:00
dd674dce48 рефакторинг. запаковка адресатов багов в json 2024-12-01 20:52:27 +03:00
216b595450 команда запуска без shell канала а через exec
v++
2024-12-01 01:07:23 +03:00
b76aa24ae4 fix v++ 2024-11-29 16:33:46 +03:00
01957b9fb3 продолжение рефакторинга рассылки и исправление анимации
v++
2024-11-28 16:52:17 +03:00
d559e9963d рефактиринг рассылки.v++ 2024-11-27 02:42:26 +03:00
14f2e90d7a фикс отображения адресатов 2024-11-27 00:30:29 +03:00
18414e5c80 Исправление бага с регистрацией. v++
todo рефакторинг системы регистрации багов и прочего.
2024-11-26 14:45:59 +03:00
3add52b2b7 фикс бага на стороне сервера, было падение при архивации на машинах 2024-11-26 13:47:14 +03:00
784e4dbbca fix v++ 2024-11-25 20:23:41 +03:00
f66790f67a сравнение с эталоном начальная версия
v++
2024-11-22 02:54:17 +03:00
d5b6d9dd55 фикс с визуальным багом кнопки компиляции и запуска, v++ 2024-11-19 22:39:08 +03:00
7e0332fad0 v++
визуальный баг с кнопкой публикации
2024-11-19 11:21:12 +03:00
a4b35c2258 fix v++ 2024-11-17 19:13:36 +03:00
025a04d0ed fix лишней рассылки админам 2024-11-17 18:37:32 +03:00
1259db5041 новый проход. v++ 2024-11-17 17:04:08 +03:00
3dd7845d76 временное сохранение последнийх выбранных машины юзера и компилятора в пропертиес. концепция пропертиес будет дорабатываться потом. 2024-11-17 16:24:47 +03:00
493b19c5e4 fix 2024-11-17 15:08:00 +03:00
b79002edcc no message 2024-11-17 15:05:18 +03:00
910901f940 при удалении пакета все ссылки на то где он был эталоном обнуляются 2024-11-16 22:03:10 +03:00
de960b6a9b удаление инфы о тестах при удалении группы из конфиги 2024-11-16 21:32:27 +03:00
b6d106aeb7 каскадное удаление информации о тестах вконфигурации при удалении теста 2024-11-16 21:10:17 +03:00
ddd975a37f каскадное изменение описаний конфигураций при изменении имен настроек 2024-11-15 02:08:42 +03:00
3e32e51e57 каскадное изменение конфигураций в случае удаления группы 2024-11-15 01:17:52 +03:00
e0fa7abeb4 каскадное изменение информации о группе в конфигурациях в случае ее редактирования 2024-11-15 00:44:23 +03:00
901eb0f623 выделение эталона если он есть 2024-11-14 22:31:01 +03:00
cd0bae2620 механизм назначения пакета-эталона для текущей конфигурации тестирования сапфор.сравнение с эталоном пока не реализовано! 2024-11-14 22:06:49 +03:00
62e734f725 промежуточный. упорядочил код отображения дат в таблицах 2024-10-30 19:33:52 +03:00
2712b904b1 убрал избыточный подсчет в фильтрах на панели. все равно оно там неотображается 2024-10-29 21:20:29 +03:00
c78c5d464d no message 2024-10-29 20:12:07 +03:00
192e20be30 no message 2024-10-28 13:14:42 +03:00
9daf69107a no message 2024-10-27 19:38:33 +03:00
56981686e1 no message 2024-10-26 17:46:30 +03:00
ed37dd2107 no message 2024-10-26 15:14:23 +03:00
c3ce2fed96 no message 2024-10-26 14:42:31 +03:00
a79816082a рефакторинг форм таблиц и заполнения информации о столбцах 2024-10-26 14:34:55 +03:00
ffcad7a620 Revert "no message"
This reverts commit 48d96d51d7.
2024-10-25 13:01:54 +03:00
48d96d51d7 no message 2024-10-25 13:00:29 +03:00
1d1618ae95 no message 2024-10-25 12:53:27 +03:00
d537cbe00d нечувствительность фильтров заголовков к регистру 2024-10-25 02:37:57 +03:00
2490a783dd no message 2024-10-25 02:24:21 +03:00
f6ab578ce2 изменение умолчаний для контролов таблиц 2024-10-25 02:08:23 +03:00
f2de9054d0 no message 2024-10-25 00:50:19 +03:00
9482abefcc no message 2024-10-25 00:43:03 +03:00
aa490e4181 fix 2024-10-25 00:00:24 +03:00
36c11ac93f постепенное выведение старой концепции текущих объектов, касаемо табличных лучше держать их в интерфейсе таблиц, чтобы не писать описание объекта дважды и не мучиться с типом. некоторые фиксы 2024-10-24 23:40:24 +03:00
f811d9b3ac no message 2024-10-22 20:25:26 +03:00
cee06af384 no message 2024-10-22 20:18:50 +03:00
c160a20d06 рефакторин методов связанных с компонентами. 2024-10-22 20:16:57 +03:00
bf5d5442d4 no message 2024-10-22 19:54:51 +03:00
84c3813894 обобщение именования стандартных проходов,теперь их описание берется из таблицы к которой они относятся. 2024-10-22 19:53:38 +03:00
2fed433634 перевод тестовых описания данных обратно в таблицы. нужно для обобщения описаний типовых проходов 2024-10-22 19:17:01 +03:00
2edaffd634 no message 2024-10-22 17:44:23 +03:00
a0ceafff0a no message 2024-10-22 17:27:41 +03:00
a60fd375d0 вывод диалоговых форм для объектов в отдельный класс 2024-10-22 16:44:13 +03:00
38b2896e4a окончательное разделение таблицы и функционала видимой ее формы 2024-10-22 15:25:06 +03:00
319e6575c8 no message 2024-10-22 13:54:56 +03:00
54a52a1e6e no message 2024-10-22 13:36:57 +03:00
fc6282cd22 no message 2024-10-22 13:06:47 +03:00
b696af952f no message 2024-10-22 13:00:11 +03:00
348b7602ff пока завершение рефакторинга и обощения фильтров 2024-10-22 01:35:30 +03:00
20044315fb no message 2024-10-21 15:12:41 +03:00
f1c0523753 рефакторинг фильтров. обобщил их от интерфейса 2024-10-21 13:54:52 +03:00
6af0df7835 no message 2024-10-21 12:32:20 +03:00
4999e1587f нюансы с фильтром. отключение сортировки (что было ранее) как оказалось влияло на отрисовку всей таблицы. так что пока оставил включенным. 2024-10-20 23:08:22 +03:00
0b6f555099 no message 2024-10-20 22:19:25 +03:00
fda2940a79 no message 2024-10-20 21:59:39 +03:00
99643aa755 no message 2024-10-20 21:06:15 +03:00
b40328f931 no message 2024-10-20 20:51:23 +03:00
f6da288ec5 no message 2024-10-20 17:54:09 +03:00
a042f24833 no message 2024-10-20 17:44:30 +03:00
3f42f61c76 рефакторинг интерфейса таблиц. все же, вывел их в полноценные классы,с указанием типа объектов к ним относящихся 2024-10-20 17:27:58 +03:00
10422327ba no message 2024-10-20 16:19:43 +03:00
ffb719cbb5 промежуточный. в процессе продолжение рефакторинга фильтра 2024-10-20 16:01:09 +03:00
f13a9cda2e перенос метода получающего поле объекта для отображения 2024-10-20 13:34:38 +03:00
dc53ecd6c8 рефакторинг фильтра по заголовку столбца. начало. 2024-10-20 12:09:59 +03:00
96df1c3a18 исправил старый баг. при синхронизации бд не восстанавливались поставленные галки а текущий объект был реализован странно 2024-10-17 23:27:47 +03:00
4c2d39cb92 no message 2024-10-17 22:54:38 +03:00
c16948a9e4 no message 2024-10-17 22:54:15 +03:00
afea3e0233 no message 2024-10-17 22:41:43 +03:00
b871d2673b no message 2024-10-17 22:18:10 +03:00
6b7ed74c60 no message 2024-10-17 22:09:18 +03:00
c9c8519a10 приведение фильтров к объекту интерфейса таблицы 2024-10-17 21:49:18 +03:00
452c023f1d продолжение рефакторинга таблиц. перевод меню баров в интерфейс 2024-10-17 21:24:55 +03:00
debc1a6cae no message 2024-10-17 20:44:11 +03:00
7b56eae371 no message 2024-10-17 20:31:06 +03:00
3b5bffe998 no message 2024-10-17 20:16:51 +03:00
2b9fc52c12 no message 2024-10-17 20:11:27 +03:00
d027036a99 no message 2024-10-17 20:09:01 +03:00
66fa638ec4 рефакторинг контролов таблиц. убрал странный и запутанный старый код 2024-10-17 20:04:16 +03:00
01d366e256 no message 2024-10-17 17:37:59 +03:00
e34778d6be рефакторинг. инкапсуляция таблиц бд 2024-10-17 17:22:33 +03:00
17c2644766 no message 2024-10-16 22:13:47 +03:00
592ef14909 удаление объектов в таблицах по клавише DELETE 2024-10-16 21:58:46 +03:00
c902dd0b91 no message 2024-10-16 21:18:30 +03:00
5503751e07 рефакторинг верхних меню таблиц. 2024-10-16 20:45:59 +03:00
307b83f8c9 no message 2024-10-16 19:52:16 +03:00
9dc4922b89 no message 2024-10-16 19:40:55 +03:00
d01dab21b2 fix 2024-10-16 19:04:32 +03:00
788bd67201 рефакторинг массовых удалений объектов 2024-10-16 18:58:23 +03:00
cf660d26ea no message 2024-10-16 00:53:13 +03:00
071aab5ea6 fix.убрал из общей(в перспективе библиотечной) части ссылки на частные объекты визуализатора 2024-10-16 00:40:45 +03:00
b79474fdd1 no message 2024-10-16 00:13:09 +03:00
5c432c0ea4 no message 2024-10-16 00:04:36 +03:00
2fa413b1c6 рефакторинг сохранения форм. не было единого интерфейса 2024-10-15 23:01:36 +03:00
7d789b22d3 no message 2024-10-15 20:25:51 +03:00
fae3ecc8b9 no message 2024-10-15 20:06:58 +03:00
f353c1b90c рефакторинг. вынес часть иконок в общую часть 2024-10-15 16:58:20 +03:00
01041ccf75 no message 2024-10-15 15:55:57 +03:00
f181f5ab1d no message 2024-10-15 15:38:35 +03:00
f44ccf7893 no message 2024-10-15 15:30:26 +03:00
5e2a9848da упраздение лишних енумов в оформлении таблиц и деревьев. 2024-10-15 15:13:57 +03:00
b7b82e54c6 no message 2024-10-15 13:35:33 +03:00
e4d907e4a3 no message 2024-10-15 12:45:13 +03:00
2999390b91 рефакторинг хранения окон 2024-10-15 02:32:52 +03:00
1f6cc4a579 no message 2024-10-14 21:55:58 +03:00
7f1d21a067 рефакторинг создания меню баров для таблиц 2024-10-14 20:57:18 +03:00
84acf05c19 no message 2024-10-14 20:17:29 +03:00
bdbd49fa6d no message 2024-10-14 18:52:44 +03:00
45447f34f8 no message 2024-10-14 18:41:02 +03:00
702529147d no message 2024-10-14 16:16:41 +03:00
066ebfaa71 no message 2024-10-14 15:30:52 +03:00
5e09fb44ea no message 2024-10-14 15:19:13 +03:00
8eef367bd4 fix 2024-10-14 14:56:57 +03:00
e64a4f4c47 no message 2024-10-14 12:54:52 +03:00
e1627badd3 no message 2024-10-14 12:37:30 +03:00
e265a2a3b6 no message 2024-10-14 12:37:02 +03:00
f5538bc220 no message 2024-10-14 12:34:36 +03:00
24631268af no message 2024-10-14 12:24:59 +03:00
452c4c7268 no message 2024-10-14 12:14:01 +03:00
3a29898d5f no message 2024-10-14 12:02:42 +03:00
e4422bf2c8 no message 2024-10-14 11:50:57 +03:00
334a8de3bf no message 2024-10-14 11:48:44 +03:00
69173eb2b8 fix 2024-10-14 02:25:07 +03:00
031ae09a4b no message 2024-10-14 01:50:33 +03:00
9669eb61d2 no message 2024-10-14 01:31:33 +03:00
b37d52496e Рефакторинг кода панели быстрого доступа. 2024-10-14 01:16:31 +03:00
4e86871571 перенос проходов в центральный модуль 2024-10-13 23:55:03 +03:00
6afa2dc892 рефакторинг. переносил текущие объекты в другое место 2024-10-13 22:08:13 +03:00
09b64218bd рефакторинг. избыточный код. зачем то был абстрактный метод 2024-10-12 00:28:58 +03:00
c826b4a4bd no message 2024-10-12 00:17:51 +03:00
f317ab1aa1 no message 2024-10-11 00:00:30 +03:00
a11b7711f7 no message 2024-10-10 23:57:36 +03:00
cde3e1da42 no message 2024-10-10 15:37:29 +03:00
23891a0489 fix. был внесенный баг с проверкой конфигураций тестирования на корректность. 2024-10-10 15:03:12 +03:00
61f6c63e0b no message 2024-10-10 14:29:54 +03:00
d1ffab1e70 no message 2024-10-09 23:37:58 +03:00
eb278676cc no message 2024-10-09 23:12:46 +03:00
428a056586 fix 2024-10-09 22:51:52 +03:00
6252af944e no message 2024-10-09 22:21:57 +03:00
54c80c516b no message 2024-10-09 22:15:56 +03:00
90b5abb70f no message 2024-10-09 22:01:19 +03:00
63b7f7dfd2 no message 2024-10-09 20:35:18 +03:00
e5f4ee40aa no message 2024-10-08 23:57:57 +03:00
91f73cbfa0 no message 2024-10-08 23:45:06 +03:00
07436988cf no message 2024-10-08 23:33:00 +03:00
42675d55d8 no message 2024-10-08 23:21:47 +03:00
31c0cad38f no message 2024-10-08 23:21:42 +03:00
e0974fe4a8 no message 2024-10-08 22:33:49 +03:00
90546fc62e no message 2024-10-08 16:59:20 +03:00
cba2c8ec34 no message 2024-10-08 16:20:45 +03:00
e7939713e7 no message 2024-10-08 15:32:39 +03:00
18ceb04325 рефакторинг. вынес в обобщенную часть бд, но еще не все 2024-10-08 01:30:25 +03:00
d0c08a2c7e продолжение рефакторинга. создал предка для класса current 2024-10-08 00:39:13 +03:00
3516b58127 no message 2024-10-07 22:22:51 +03:00
17c0bf7eb3 no message 2024-10-07 22:04:09 +03:00
7fac84740d продолжение рефакторинга и проверка на занятость файлов 2024-10-07 20:04:11 +03:00
e7f661f7ad no message 2024-10-07 17:46:38 +03:00
6537eebe09 no message 2024-10-07 14:49:35 +03:00
c431745ad4 no message 2024-10-07 14:48:17 +03:00
4b05d4f4f2 fix. 2024-10-07 14:44:24 +03:00
61fc37b574 no message 2024-10-07 14:22:52 +03:00
6b1576461d промежуточный. частичный рефакторинг с прицелом на библиотечную часть 2024-10-07 00:58:29 +03:00
c211ffb82b no message 2024-10-06 21:18:53 +03:00
4ad0a32238 улучшение описания пакетов 2024-10-03 16:21:11 +03:00
76b6a36de6 Merge branch 'main' of http://alex-freenas.ddns.net:3000/M/VisualSapfor 2024-10-03 14:37:40 +03:00
c077af6824 клонирование параметров тестирования двм/сапфора 2024-10-03 14:36:45 +03:00
8ebb5d8989 Обновить README.md 2024-10-02 14:32:15 +00:00
d18eb3327e Рефакторинг конструкторов объектов тестирования. 2024-10-01 17:33:08 +03:00
b89283fc91 рефакторинг конфигураций тестирования сапфор. кнфигурация сделана как пара - набор тестов+ наборы настроек. наборы настроек стали отдельным объектом 2024-09-28 21:47:17 +03:00
4547fd10bd промежуточный. вариант с разбитием конфигурации сапфора и настройки как отдельный объект 2024-09-27 22:50:47 +03:00
30b51180c4 при тестировании двм задачи сортируются так что ошибки сверху 2024-09-27 02:01:14 +03:00
1be569e294 промежуточный. в таблицах пакетов открытие текущего пакета по 2 клику 2024-09-26 21:31:18 +03:00
45fcf9b585 no message 2024-09-25 01:42:30 +03:00
679e46499e ввел состояние пакета тестирования - выполнен с ошибками. 2024-09-25 01:27:02 +03:00
bb671c5166 no message 2024-09-24 23:34:41 +03:00
33e6abfbf5 no message 2024-09-24 20:22:41 +03:00
797f232347 no message 2024-09-24 00:28:46 +03:00
00b4250ce0 рефакторинг. перевод формирования пакета задач сапфор в его конструктор. нужно для автоматического запуска. 2024-09-24 00:24:28 +03:00
39dbf5f146 no message 2024-09-23 21:16:52 +03:00
a420ddbc9d no message 2024-09-22 23:10:27 +03:00
12c4eaf33d промежутоный. все же, вывел число ядер в конфигурации. иначе автоматическое тестирование обзаведется лишней настройкой. 2024-09-20 01:52:39 +03:00
ae379ea196 no message 2024-09-20 00:22:42 +03:00
3863b31328 красные галочки для авто тестирования. пока без обновления бд 2024-09-19 23:05:04 +03:00
25cd097445 обновление конфигураций для тестирования сапфора. нужно будет еще проверить и рефакторить. 2024-09-19 17:37:34 +03:00
54d86d6e4d исправление бага с кешированием. 2024-09-19 00:24:36 +03:00
660a410a05 no message 2024-09-18 23:19:55 +03:00
00136fa9d9 no message 2024-09-18 22:58:38 +03:00
a767fc265a no message 2024-09-18 16:18:50 +03:00
c469a38709 no message 2024-09-18 15:25:58 +03:00
cd28ce025d no message 2024-09-18 14:57:11 +03:00
0cef474233 подправил кеширование отображаемых данных ( чтобы не распаковывать каждый раз список имен групп и прочее) 2024-09-18 13:37:11 +03:00
f55a3a6324 no message 2024-09-17 14:10:26 +03:00
96c9c27191 no message 2024-09-17 14:01:38 +03:00
55a724a511 no message 2024-09-17 02:53:17 +03:00
df9fb2e2a2 промежуточный. оптимизация хранения связанных с пакетом конфигураций и их отображения. перевод на json формат хранящийся в бд как строка 2024-09-17 01:04:41 +03:00
7bd4600a25 no message 2024-09-16 22:15:21 +03:00
3e55bdec38 no message 2024-09-16 16:03:39 +03:00
d4d8d255fb no message 2024-09-16 15:41:43 +03:00
7ea64c49d1 промежуточный. тестирую новую версий конфигураций 2024-09-15 01:36:19 +03:00
1e782daa3d промежуточный. редактирование пакетов тестирования ДВМ, и возможность их перезапуска. 2024-09-14 01:16:08 +03:00
222163c557 no message 2024-09-14 00:27:26 +03:00
91a509b3de no message 2024-09-14 00:18:27 +03:00
756c2d214f промежуточный.переработка объекта пакета тестирования 2024-09-13 00:19:15 +03:00
3201742848 no message 2024-09-12 23:32:15 +03:00
4da2187f42 no message 2024-09-11 17:00:36 +03:00
151572fd82 промежуточный. хранение инфы о конфигах, группах и тестах пакета.пока отлаживается. 2024-09-10 01:50:44 +03:00
958ccbc9ab v++
улучшение удаления баг репортов
2024-08-18 15:15:22 +03:00
5e35c493cf no message 2024-08-18 12:28:54 +03:00
39e9c634a2 промежуточный. улучшение удаления баг репортов, в процессе отображения диалогового окна 2024-08-18 01:08:56 +03:00
de1d81ac33 фикс бага с регулярным выражением при парсе сообщений от парсера. был сплит по оф без пробелов
v++
2024-08-07 21:48:54 +03:00
077bfe9676 fix 2024-08-05 19:16:52 +03:00
80e3537fb0 переименование опции. v++ 2024-07-31 22:34:04 +03:00
5057db453f убирание выключенных адресатов из списка, v++ 2024-07-29 23:15:17 +03:00
0fe33b21ee v++ 2024-07-22 21:03:34 +03:00
905e1646e4 галочка отображения только активных пакетов 2024-07-22 20:52:37 +03:00
9dd52b37c2 выписка адресатов при рассылке 2024-07-22 18:57:14 +03:00
53ad5e637f удаление отладочной печати сравнения и не только 2024-07-22 00:57:05 +03:00
3374c9783b обратная сортировка пакетов тестирования двм и сапфора 2024-07-21 23:42:51 +03:00
87ed3bd003 Обратная сортировка версий сапфора и коммит старых измений 2024-07-21 23:19:18 +03:00
12f58bdde2 v++
возможность добавлять хедеры произвольного расширения в тесты
2024-06-08 19:45:37 +03:00
07c479ad2b Отображение списка конфигураций пакета 2024-06-06 22:55:20 +03:00
ba6257cd36 проход переименования заголовков. v++ 2024-06-05 15:06:16 +03:00
2983d5c579 v++
Учет настроек сравнения при сравнении пакетов сапфор
2024-05-24 16:10:18 +03:00
edb6714ea8 v++
автоматическая инициализация
2024-05-22 00:38:37 +03:00
8de3474fa4 no message 2024-05-22 00:30:36 +03:00
d6bad4d45e no message 2024-05-22 00:09:01 +03:00
e860e7968f no message 2024-05-21 23:48:01 +03:00
fa04452d3d no message 2024-05-21 23:20:50 +03:00
50c3914228 промежуточный. проверка инициализации при тестировании.. 2024-05-21 23:07:42 +03:00
d51fb1a23e no message 2024-05-21 17:39:02 +03:00
0ae5327fb4 автоматический поиск версии сапфора для установки на сервере. 2024-05-21 17:36:03 +03:00
fb53a4133a no message 2024-05-18 23:31:45 +03:00
d29c2ba93c v++ 2024-05-17 01:33:39 +03:00
264fc3b955 рефакторинг получения шрифта статуса в таблицах 2024-05-16 21:56:34 +03:00
630d6b3985 промежуточный. проверка версии сапфора при асинхроноой сборке, из репозитория. Завтра доделаю и закоммичу 2024-05-16 01:26:03 +03:00
8a4371fc86 рефакторинг сборки Сапфора. Перевел ее в планировщик задач тестирования сапфора. осталось при проверке бд это отобразить. 2024-05-08 01:56:17 +03:00
468bfc027d no message 2024-05-08 00:57:48 +03:00
387b43c771 no message 2024-05-08 00:06:43 +03:00
12fddbdc95 no message 2024-05-07 01:06:47 +03:00
b39de4ad14 no message 2024-05-06 00:47:29 +03:00
15a2f83275 пока все на отладочном порту. Сохранение вывода сборки Сапфора в папке версии. 2024-05-05 23:20:12 +03:00
002a8517e0 Наметил локальный вариант, но пока не уверен что он приоритетен.. 2024-04-27 18:44:36 +03:00
c84a648bb6 no message 2024-04-26 22:21:56 +03:00
cf81637812 no message 2024-04-26 20:54:10 +03:00
3821e3b164 no message 2024-04-26 20:28:50 +03:00
71f746c3b3 no message 2024-04-26 19:54:34 +03:00
756863ab80 no message 2024-04-26 19:27:21 +03:00
92ceb84898 no message 2024-04-26 19:18:12 +03:00
b17e23a93a no message 2024-04-26 19:16:38 +03:00
4d629df46f no message 2024-04-26 18:23:08 +03:00
830aa1a948 no message 2024-04-26 17:57:58 +03:00
c6e5036b9c Доделаны процессы для разных машин 2024-04-24 22:23:50 +03:00
4d543cb94f рабочий вариант отдельных процессов на разные машины 2024-04-23 22:48:02 +03:00
f2d0eb0d2c no message 2024-04-23 16:40:05 +03:00
291c804fc7 no message 2024-04-23 01:39:54 +03:00
cefbd875c8 no message 2024-04-23 00:36:37 +03:00
5f7b600c6d no message 2024-04-21 23:23:57 +03:00
d7b559fd21 no message 2024-04-21 00:01:17 +03:00
9bd90c7a4a fix. неверно определялся PID пакета ошибка была внесена в последних изменених с шеллом 2024-04-15 22:41:13 +03:00
56f97584ef промежуточный. пилотный вариант планировщика в качестве отдельного процесса 2024-04-15 22:09:10 +03:00
5d09ae430c v++
сообщение R204
2024-04-13 20:09:26 +03:00
97a26f7a0e Коррекция имен новых директив 2024-04-10 14:11:34 +03:00
493941edab новые директивы. v++ 2024-04-10 00:29:36 +03:00
0fb9412d24 Merge branch 'main' of http://alex-freenas.ddns.net:3000/M/VisualSapfor 2024-04-09 19:48:24 +03:00
e4fe527365 v++
Исправление зависания кнопки запуска сервера
2024-04-09 19:46:15 +03:00
ALEXks
5903c72051 updated instruction 2024-04-09 16:36:06 +03:00
ALEXks
cacae8041a removed unused 2024-04-09 16:26:01 +03:00
3d70efe253 ночные изменения,+ исправление бага с иконкой сравнения 2024-04-09 15:23:35 +03:00
4e503d3b9b v++
Лимит ошибок связи 10
2024-04-08 01:30:46 +03:00
09afe82704 v++ 2024-04-07 21:44:53 +03:00
8b9400fb95 подсветка версий с ошибками в журнале 2024-04-07 21:30:11 +03:00
002867274f кнопка для сворачивания машин, и отмена восстановления меню анализов 2024-04-03 01:12:14 +03:00
c40d6fbbfc fix недоделки с одиночным запуском. стояла ожидающая команда. v++ 2024-04-03 00:01:52 +03:00
48f7845564 рефакторинг команд ssh
v++
динамическая смена названия прохода Анализ Кода
2024-04-02 23:35:54 +03:00
95cd91bbca v++ 2024-03-29 01:59:26 +03:00
9687dc9f29 функционал для управления сервером компонент и багов.
удаление временных файлов при запросе версии
2024-03-29 01:39:14 +03:00
a5ffce7c08 промежуточный. добавление кнопки публикации тестового сервера. она выполняет остановку сервера, замену его на текущий файл jar, и запускает заново 2024-03-29 00:07:04 +03:00
cad6ea8d3b Исправление бага с пробелами. v++ 2024-03-27 00:28:04 +03:00
79085ad5f8 fix.после убийства пакета информация о том , что пакет нужно убить не удалялась. 2024-03-25 00:12:24 +03:00
bd5ebdf53c исправление бага с определением версии с++ на целевой машине тестирования DVM 2024-03-24 23:36:56 +03:00
3f49abc35a новый проход 2024-03-24 19:47:48 +03:00
fe03fd6b47 fix 2024-03-24 18:08:23 +03:00
aaddd55152 fix. при клонировании пакета сапфор, задачам не раздавались ид 2024-03-24 18:02:29 +03:00
e83ecac005 v++ 2024-03-24 02:49:32 +03:00
784bca869d доработка остановки сервера, добавлен проход запроса активности сервера, перед созданием файла interrupt 2024-03-24 01:54:52 +03:00
40feda7c5e реализация остановки сервера тестирования по кнопке 2024-03-23 23:28:02 +03:00
9f1777431c Исправление клонирования пакетов ДВМ 2024-03-22 23:08:51 +03:00
b6b6e2e642 Разделение очереди на разные машины, и исправление бага. могло выполняться более одного пакета одновременно 2024-03-21 19:02:08 +03:00
dd0570f281 Исправление ssh, сделал признаком приглашения @
v++
2024-03-21 02:25:56 +03:00
082753b366 v++ 2024-03-21 00:24:59 +03:00
a707ceaabd Доделал восстановление позиции разделителя при распахивании области. 2024-03-21 00:15:41 +03:00
34df30fcd5 Сделал сворачивание через меню настроек. 2024-03-20 23:32:24 +03:00
7bfb980d69 no message 2024-03-20 19:14:26 +03:00
a39b8c3a13 промежуточный. сворачивание деревьев проекта по тестовой кнопке. думаю положить сворачивание в настройки компактности. 2024-03-20 19:12:43 +03:00
eaeaee869b no message 2024-03-19 02:24:02 +03:00
05097bc22e промежуточный. сворачивание сообщений и левых графов. завтра еще доотлажу. 2024-03-19 02:22:41 +03:00
2a2000147c Сворачивание левой панели графов файла 2024-03-17 01:55:10 +03:00
4e611e4333 синхрон панелей сравнения сапфор, ++ 2024-03-15 16:26:01 +03:00
1b91cff318 сворачивание машин v++ 2024-03-15 12:32:49 +03:00
431d23f427 v++, перетасовал вкладки. 2024-03-13 21:17:32 +03:00
0238cc1b3e промежуточный. перенос вкладок 2024-03-13 19:19:32 +03:00
f52a062e86 Справа добавлена галочка фильтрации пакетов тестирования, позволяющая показать только свои пакеты.
v++
2024-03-10 00:42:29 +03:00
eeaf4d7217 no message 2024-03-09 02:14:00 +03:00
8f38a616d5 v++ 2024-03-08 02:45:49 +03:00
b792cf80b8 создание пакета из нескольких старых 2024-03-08 01:17:54 +03:00
e7c8810291 промежуточный. изменен механизм формирования задач для тестирования SAPFOR. Теперь они создаются на стадии черновика, при публикации только обновляются ссылки на родительский пакет. При добавлении задач в пакет идет проверка по ключам на их существование. 2024-03-07 18:56:47 +03:00
2b9cfc3af1 Проверка на администратора при удалении SAPFOR 2024-03-06 13:47:57 +03:00
da3f624cf2 Дополнил замену. Если файлы выделены, но не совпадают по именам с уже имеющимися в группе тестами, будут добавлены как новые тесты. 2024-03-05 19:52:49 +03:00
a4bca9c33b no message 2024-03-05 19:21:42 +03:00
4136236d41 Замена файлов в группе проверена, v++ 2024-03-05 18:39:41 +03:00
2f31f02eff Замена тестов в группе на выбранные файлы. Приду, отлажу и закоммичу 2024-03-05 16:49:57 +03:00
70ad507313 no message 2024-03-04 22:27:49 +03:00
121d91cf77 no message 2024-03-04 20:51:52 +03:00
e8f2e50257 диалог для сравнения двм задач 2024-03-04 20:29:05 +03:00
3c43984fe4 группировка проходов с группами и тестами в выпадающие меню 2024-03-03 19:20:32 +03:00
6088854a54 проверка, что версии SAPFOR не собрана. v++ 2024-03-02 22:32:42 +03:00
2451129e0e v++ 2024-03-02 02:31:41 +03:00
34504f9992 Замена проекта в тесте на текущий. 2024-03-02 01:44:03 +03:00
c34728f65d v++ 2024-03-01 21:25:46 +03:00
e20ee062c6 Распределение вкладок 2024-03-01 21:01:35 +03:00
ba9fb8c0c2 v++ 2024-02-26 02:17:20 +03:00
27598fed85 no message 2024-02-26 01:33:51 +03:00
75c196f611 рефакторинг сравнения 2024-02-26 00:36:35 +03:00
848d95ee14 no message 2024-02-25 20:34:00 +03:00
1c57e1821f Запрет повторяющейся конфигурации при формировании пакета SAPFOR 2024-02-25 19:35:14 +03:00
00af17e823 no message 2024-02-25 17:37:49 +03:00
0a2f2f05e1 промежуточный. убрал изменение порядка задач. вместо этого будет фильтр по состояниям 2024-02-25 15:42:46 +03:00
a85446b72d промежуточный. в процессе поиска бага со сравнением. 2024-02-25 01:50:56 +03:00
037518a085 no message 2024-02-24 23:06:49 +03:00
0092b708d3 промежуточный. немного изменил отображение задач сапфора. сравнение в процессе 2024-02-23 21:34:01 +03:00
6a7feb96e7 no message 2024-02-19 23:49:35 +03:00
11f82d2bb9 вынос порта для SSH 2024-02-19 18:01:17 +03:00
a138f367a8 v++ 2024-02-17 01:04:14 +03:00
cd2fefd099 прогресс пакетов сапфор 2024-02-16 23:49:04 +03:00
0efd6ebb9b no message 2024-02-16 21:44:13 +03:00
1bb3da18c3 no message 2024-02-14 21:46:07 +03:00
0397346b0f no message 2024-02-14 17:58:52 +03:00
ea3fb6a0ba v++
Добавил удаление мертвого кода.
2024-01-23 16:49:56 +03:00
fce61bf55a v++
рефакторинг. Исправлен баг. если прервать локальную задачу, не удалялся файл interrupt.
2024-01-08 20:37:16 +03:00
5baf2154e2 fix
v++
2023-12-31 17:36:20 +03:00
b4184d9361 v++ 2023-12-27 21:07:12 +03:00
bf1730cd77 v++
клонирование пакета DVM тестирования
2023-12-27 03:05:46 +03:00
bc7059314d отключение признака кубичности решетки по умолчанию 2023-12-26 21:13:45 +03:00
64073e8b15 v++
рефактиринг фильтров завершен.
2023-12-26 20:37:20 +03:00
b21e25e932 fix 2023-12-26 20:23:09 +03:00
7030e13238 Если все фильтры отключены, они не учитываются. 2023-12-26 19:41:11 +03:00
ce31d5dae2 Промежуточный. Рефактиринг фильтров 2023-12-26 19:12:30 +03:00
05ec4871a1 no message 2023-12-26 16:18:23 +03:00
f604f94858 v++ 2023-12-25 18:18:59 +03:00
0370573269 fix отображения пакетов 2023-12-25 17:55:15 +03:00
e5f3230c9c no message 2023-12-25 02:07:37 +03:00
6eccd3364a промежуточный. изменение Сапфора . теперь можно формировать пакеты. 2023-12-25 00:33:14 +03:00
44e37d01cf no message 2023-12-24 20:08:40 +03:00
d6246429f3 v++
ограничения подстановки заголовков.
2023-12-24 02:19:34 +03:00
9e571d33a8 проверка версии модулей в стадии - создание рабочих папок пакета. Если версия не найдена, или меньше актуальной, модули будут пересобраны. 2023-12-24 01:36:52 +03:00
43d7c4da8b no message 2023-12-23 21:39:46 +03:00
M
f6fdea5c46 Merge pull request 'improved' (#6) from planner into main
Reviewed-on: http://alex-freenas.ddns.net:3000/M/VisualSapfor/pulls/6
2023-12-23 18:36:14 +00:00
2ad0c85331 SPF_InsertPrivateFromGUI
v++
2023-12-23 21:31:56 +03:00
405b873f8e improved 2023-12-23 18:06:51 +03:00
7684966849 Откат релизайна. 2023-12-22 18:20:11 +03:00
cf8c237fa3 Revert "вкладки. v++"
This reverts commit 2379f65803.
2023-12-22 18:12:21 +03:00
2379f65803 вкладки. v++ 2023-12-22 01:24:35 +03:00
a399544b77 v++ 2023-12-21 22:49:19 +03:00
ed8c1ee914 переименовал падение в авост 2023-12-21 20:09:09 +03:00
6378a04841 fix бага с отключенной рассылкой 2023-12-21 19:32:26 +03:00
52ce1e78aa fix, не учитывалась настройка оповещения. оповещалось безусловно 2023-12-21 18:16:14 +03:00
dbc05900ba создание 3 кнопок синхронизации бд тестов - в тестах. и в соответствующих конфигурациях. 2023-12-21 17:42:20 +03:00
0adb5337d5 v++ 2023-12-20 21:13:52 +03:00
8a71c79650 изменение маски для парсера консоли 2023-12-20 20:58:14 +03:00
76f68ae2ab инициализация с поиском с++11/17 2023-12-20 20:39:11 +03:00
8e7fa7d763 переименовал Planner.cpp в planner.cpp, ради единообразия в сборке модулей. 2023-12-20 20:31:59 +03:00
fd34111d20 fix 2023-12-20 20:21:47 +03:00
96b6d40136 no message 2023-12-20 16:56:18 +03:00
8edb0ba16b промежуточный. частичный рефакторинг инициализации. еще не готов. 2023-12-20 02:47:47 +03:00
c228832c94 Добавление новых случаев падения в парсер. 2023-12-18 23:18:17 +03:00
6f8e16602b no message 2023-12-18 16:38:56 +03:00
e85e194ae0 100 прогресса сапфору по его завершении 2023-12-18 15:55:13 +03:00
ef65bb2439 Перенос кнопки синхронизации на панель тестирования. Исправление бага с формированием пакета. 2023-12-18 15:44:48 +03:00
ed2222c163 no message 2023-12-18 00:04:44 +03:00
86c6c4700e Отображение результатов задач. 2023-12-17 21:38:54 +03:00
6011a2851c Восстановление Excel. Осталось восстановить отображение сапфора. 2023-12-17 20:04:15 +03:00
eefbc25be0 Обощение массовой загрузки пакетов с сервера. 2023-12-17 19:19:59 +03:00
d9fca1fa72 no message 2023-12-17 17:34:30 +03:00
3efeb28919 no message 2023-12-17 17:27:23 +03:00
0c513cec5e промежуточный. выкинул старые объекты и функционал. Осталось восстановить эксель, и отображение пакетов Сапфор 2023-12-16 16:52:17 +03:00
94ff786ed6 отображение задач из json 2023-12-16 15:34:29 +03:00
e69769713b скачать результатов текущего двм пакета. 2023-12-16 11:35:37 +03:00
ad19ee2665 перенос меню баров к соответствующим таблицам в коде. 2023-12-16 10:38:35 +03:00
0c47c893a2 no message 2023-12-16 04:06:14 +03:00
34c08e7d44 рефакторинг серверной части сапфора. 2023-12-16 03:57:01 +03:00
b7b41ae59c no message 2023-12-15 20:39:49 +03:00
ac5757160e fix удаления пакетов если среди них есть черновик 2023-12-15 20:29:24 +03:00
b4b7a8e183 no message 2023-12-15 18:57:00 +03:00
13c629f1b4 no message 2023-12-15 18:38:05 +03:00
55e49ce3b7 no message 2023-12-15 18:10:27 +03:00
da74a8a699 разрыв каждые 100 проверок. на всякий случай. 2023-12-15 16:44:14 +03:00
bd702b3ebc принудительный обрыв соединения после пересылок и консольных команд. 2023-12-15 16:27:01 +03:00
730ded1f4c убрал сброс соединения. сделал удаление папок новых пакетов при их удалении с бд 2023-12-15 15:45:43 +03:00
57a98475d0 fix 2023-12-15 15:12:17 +03:00
5a1f9b7f68 fix 2023-12-15 15:04:02 +03:00
bdf0f7f4eb доделал отображение прогресса и актуализацию активных пакетов. пришлось заменить признак изменения с состояния на дату изменения. 2023-12-15 14:55:16 +03:00
54bab7f83d no message 2023-12-15 14:02:12 +03:00
fd76843aff fix 2023-12-15 02:34:30 +03:00
106626eb9a актуализация двм пакетов на новых объектах. 2023-12-14 23:00:50 +03:00
204d4ceca0 фикс критического бага новой нити тестирования. в json идентификаторы задач на компиляцию и запуск пересекались. 2023-12-14 21:14:36 +03:00
a8c8aa3212 обновление planner c прогрессом. 2023-12-14 21:11:24 +03:00
ff3e3003d4 fix 2023-12-14 19:57:47 +03:00
1fc60e6c12 рефакторинг нити планировщика двм тестов на сервере. 2023-12-14 18:45:41 +03:00
c07b72eb5d промежуточный. прописал для планировщиков общий класс-предок 2023-12-14 02:30:56 +03:00
749c0397e6 промежуточный. отправка пакета нового класса. 2023-12-13 02:26:20 +03:00
91c494e9f8 формирование json пакета из разных конфигураций и тестов. промежуточный. 2023-12-12 16:09:14 +03:00
f700154394 no message 2023-12-12 01:01:36 +03:00
953ff522d5 восстановил отображение текущей двм системы на вкладке 2023-12-11 18:52:23 +03:00
12e963ca1b отображение машины и ползователя на вкладке тестирования. 2023-12-11 18:29:15 +03:00
cb74d629b7 no message 2023-12-11 02:00:28 +03:00
99cdca1ebb no message 2023-12-11 01:38:44 +03:00
4f003b8317 no message 2023-12-11 01:24:30 +03:00
M
d064daa90c Merge pull request 'planner' (#5) from planner into main
Reviewed-on: http://alex-freenas.ddns.net:3000/M/VisualSapfor/pulls/5
2023-12-10 22:23:51 +00:00
ALEXks
f86fca6169 ends format 2023-12-10 16:22:22 +03:00
ALEXks
9bd5dc03f9 improved planner 2023-12-10 16:20:10 +03:00
127aec5a1d v++
Оптимизация актуальности задач.
2023-12-10 02:26:28 +03:00
fce85afc71 суммарное число задач, и время пакетов при экспорте 2023-12-09 22:47:15 +03:00
dbd8d416f9 умолчания 2023-12-09 21:37:36 +03:00
b76ac2a0b2 выравнивание по центру для ячеек 2023-12-09 21:30:15 +03:00
c4b6db5011 no message 2023-12-09 13:51:54 +03:00
2b169392e6 v++
Разобрался с форматами ячеек. числа надо было писать не переводя в String, тогда ошибки не показывает. Матрицы закинул в кавычки.
2023-12-09 02:19:28 +03:00
7dc687e0c6 no message 2023-12-09 01:36:08 +03:00
8147381d4f экспорт нескольких файлов. 2023-12-09 00:59:39 +03:00
827981a591 шапка пакета с информацией в экселе 2023-12-08 23:39:01 +03:00
01468da72e no message 2023-12-08 21:35:36 +03:00
c491e805c9 подсчет GPU, и потоков 2023-12-08 20:45:23 +03:00
033d33dce0 fix 2023-12-08 19:03:54 +03:00
f86e4d8109 добавление DVMH_NO_DIRECT_COPY=1 2023-12-08 18:38:08 +03:00
be7176fe11 v++ 2023-12-08 01:47:16 +03:00
fc20f95457 исправление анализа вывода тестов. если число линий содержащих start и end одинаковое, то число завершенных тестов может быть нулевым, иначе неверный формат. 2023-12-08 01:17:45 +03:00
25d5c4b7f0 заполнение времени при таймауте maxtime+1 2023-12-08 00:58:48 +03:00
9c6d5d57e1 добавил в шаблоны падения
"fatal error"  "unknown error class"  "failed"
2023-12-08 00:49:32 +03:00
ca941814ec сдвиг времени компиляции к времени выполнения, в экселе и в таблице. 2023-12-07 23:32:11 +03:00
b9f27bf51f Отображение прогресса в экселе 2023-12-07 17:02:00 +03:00
bf88dd2eae v++ 2023-12-07 16:27:53 +03:00
5ed803cda0 цветное состояние в экселе 2023-12-07 16:25:16 +03:00
2044ff4320 Фильтры у групп, и тестов изменены на фильтры по ИЛИ. Отдельные виды фильтров ( например язык тестов и тип тестов, все еще взаимодействут по И)
Добавлена возможность экспорта соответствующих фильтрам задач пакета DVM в Excel.

v++
2023-12-07 02:05:08 +03:00
540c041408 Экспорт пакета в excel 2023-12-07 00:09:10 +03:00
9b46d395df промежуточный. создание таблицы excel 2023-12-06 19:19:14 +03:00
def13d2e5e no message 2023-12-06 18:52:05 +03:00
e1da90d705 v++
массовые операции с бд тестирования
2023-12-06 03:04:26 +03:00
3e5859284f масс удаление конфигураций сапфора. был баг - не прописано было удаление команд с сервера. 2023-12-06 02:43:06 +03:00
0f74b3168e массовое удаление пакетов DVM 2023-12-06 02:33:01 +03:00
469330a7ed массовое удаление конфигураций DVM 2023-12-06 02:13:55 +03:00
6b115c7296 массовое удаление тестов. 2023-12-06 01:59:27 +03:00
2a209bc94e проход для массового удаления объектов в сервера.
массовое удаление групп.
2023-12-06 01:50:11 +03:00
2b52763c02 удаление записи о папке пользователя на машине через админку. нужно будет крайне редко, если например обновились модули. Пока не реализована очистка на целевой машине, но возможно и не понадобится. 2023-12-05 19:25:17 +03:00
M
9beadaf95c Merge pull request 'fixed and improved' (#4) from planner_improve into main
Reviewed-on: http://alex-freenas.ddns.net:3000/M/VisualSapfor/pulls/4
2023-12-05 13:20:02 +00:00
be4985be2d no message 2023-12-05 16:15:12 +03:00
1e45d4d4d7 fixed and improved 2023-12-05 16:12:34 +03:00
5e229fcb68 fixed and improved 2023-12-05 16:03:42 +03:00
M
3794b2a330 Merge pull request 'fixed' (#3) from planner_improve into main
Reviewed-on: http://alex-freenas.ddns.net:3000/M/VisualSapfor/pulls/3
2023-12-05 11:32:25 +00:00
bba4d403d7 no message 2023-12-05 14:27:42 +03:00
0bd2d3fe36 improved String 2023-12-05 14:08:31 +03:00
79cf5bc0da fixed 2023-12-05 13:20:43 +03:00
15a179d8e9 фикс бага с ssh, соединения вообще не закрывались и плодились как кролики. 2023-12-05 01:31:53 +03:00
a6a29e913a fix. во время переноса вкладок с компиляцией и запуском сбил сохранение текущиъ машины пользователя и компилятора 2023-12-05 00:40:08 +03:00
f6bf044060 fix 2023-12-04 23:15:55 +03:00
c1d3d9208e Удаление пакета задач( неактивного) 2023-12-04 23:13:19 +03:00
c21c7c2e10 no message 2023-12-04 20:53:45 +03:00
5f076f14f4 новая распаковка анализа 2023-12-04 20:40:44 +03:00
11fae0bc4e методы копирования 2023-12-04 18:42:20 +03:00
3f9ba0feb3 убрал лишний enter в печати в файл. 2023-12-04 16:37:30 +03:00
7b28d1a84d Дополнил выходные файлы. Различил текст о задачах на компиляцию и о задачах на запуск. Убрал печать состояний задач, и времени. 2023-12-04 16:26:13 +03:00
c37f3d9e70 Оптимизация поиска нового состояния в папке state. 2023-12-04 15:26:54 +03:00
163552d74f Оптимизация команды Exists для SSH 2023-12-04 14:42:36 +03:00
1682 changed files with 43354 additions and 30097 deletions

4
.gitignore vendored
View File

@@ -36,9 +36,12 @@ BackUps/*
*.ilk
Bugs/*
Archives/*
Downloads/*
Temp/*
Projects/*
CompilationTasks/*
Packages/*
DVMPackages/*
SapforPackages/*
User/*
RunTasks/*
@@ -46,5 +49,6 @@ Makefiles/*
Repo/*
Sts/*
Tests/*
Keys/*
debug.log
properties

View File

@@ -11,6 +11,19 @@
<element id="extracted-dir" path="$PROJECT_DIR$/libs/mxgraphx-all-4.2.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/libs/gson-2.8.1.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/libs/commons-io-2.5.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/libs/poi-3.12-20150511.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/libs/poi-examples-3.12-20150511.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/libs/poi-excelant-3.12-20150511.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/libs/poi-ooxml-3.12-20150511.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/libs/poi-ooxml-schemas-3.12-20150511.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/libs/poi-scratchpad-3.12-20150511.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/libs/commons-codec-1.9.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/libs/commons-logging-1.1.3.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/libs/junit-4.12.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/libs/log4j-1.2.17.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/libs/xmlbeans-2.6.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/libs/commons-lang-2.6.0.jar" path-in-jar="/" />
<element id="extracted-dir" path="$PROJECT_DIR$/libs/java-diff-utils.jar" path-in-jar="/" />
</root>
</artifact>
</component>

9
.idea/libraries/commons_lang_2_6_0.xml generated Normal file
View File

@@ -0,0 +1,9 @@
<component name="libraryTable">
<library name="commons-lang-2.6.0">
<CLASSES>
<root url="jar://$PROJECT_DIR$/libs/commons-lang-2.6.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

54
.idea/workspace.xml generated
View File

@@ -8,14 +8,7 @@
<component name="ChangeListManager">
<list default="true" id="e42177c3-2328-4b27-8a01-35779b2beb99" name="Default Changelist" comment="">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/GlobalData/Tasks/TaskState.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/GlobalData/Tasks/TaskState.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/TestingSystem/Common/TestingServer.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/TestingSystem/Common/TestingServer.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/TestingSystem/DVM/TestsSupervisor_2022.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/TestingSystem/DVM/TestsSupervisor_2022.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/Visual_DVM_2021/Passes/All/RemoteInitialiseUser.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Visual_DVM_2021/Passes/All/RemoteInitialiseUser.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/files/Planner/Planner.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/src/files/Planner/Planner.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/files/Planner/RunTask.h" beforeDir="false" afterPath="$PROJECT_DIR$/src/files/Planner/RunTask.h" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/files/Planner/Supervisor.h" beforeDir="false" afterPath="$PROJECT_DIR$/src/files/Planner/Supervisor.h" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/files/Planner/Task.h" beforeDir="false" afterPath="$PROJECT_DIR$/src/files/Planner/Task.h" afterDir="false" />
<change beforePath="$PROJECT_DIR$/properties" beforeDir="false" afterPath="$PROJECT_DIR$/properties" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -36,8 +29,8 @@
<option name="RECENT_TEMPLATES">
<list>
<option value="FxmlFile" />
<option value="Interface" />
<option value="Enum" />
<option value="Interface" />
<option value="Class" />
</list>
</option>
@@ -54,10 +47,10 @@
</file-type-list>
</component>
<component name="HighlightingSettingsPerFile">
<setting file="file://$PROJECT_DIR$/src/Visual_DVM_2021/Passes/All/PublishTest.java" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/src/TestingSystem/Common/TestingServer.java" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/src/Visual_DVM_2021/Passes/All/ConvertCorrectnessTests.java" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/src/Visual_DVM_2021/Passes/All/PublishGroup.java" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/src/_VisualDVM/Passes/All/ConvertCorrectnessTests.java" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/src/_VisualDVM/Passes/All/PublishGroup.java" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/src/_VisualDVM/Passes/All/PublishTest.java" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/src/_VisualDVM/TestingSystem/Common/TestingServer.java" root0="FORCE_HIGHLIGHTING" />
</component>
<component name="KotlinCodeInsightWorkspaceSettings">
<option name="optimizeImportsOnTheFly" value="true" />
@@ -85,18 +78,20 @@
<property name="JavaClassFindUsagesOptions.isDerivedClasses" value="true" />
<property name="JavaClassFindUsagesOptions.isFieldsUsages" value="true" />
<property name="JavaClassFindUsagesOptions.isMethodsUsages" value="true" />
<property name="OverrideImplement.combined" value="false" />
<property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
<property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
<property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
<property name="TODO_SCOPE" value="All Places" />
<property name="UI_DESIGNER_EDITOR_MODE.PaletteManager.SHOW" value="true" />
<property name="UI_DESIGNER_EDITOR_MODE.PaletteManager.WIDTH" value="282" />
<property name="UI_DESIGNER_EDITOR_MODE.UIDesignerToolWindowManager.SHOW" value="true" />
<property name="UI_DESIGNER_EDITOR_MODE.UIDesignerToolWindowManager.WIDTH" value="509" />
<property name="extract.method.default.visibility" value="public" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/src/icons" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/src" />
<property name="project.structure.last.edited" value="Artifacts" />
<property name="project.structure.proportion" value="0.15" />
<property name="project.structure.side.proportion" value="0.2" />
<property name="project.structure.side.proportion" value="0.27322906" />
<property name="run.code.analysis.last.selected.profile" value="pProject Default" />
<property name="settings.editor.selected.configurable" value="reference.settings.project.statistic.project.settings" />
</component>
@@ -106,27 +101,28 @@
<recent name="controls.Trees" />
</key>
<key name="CopyFile.RECENT_KEYS">
<recent name="C:\Users\misha\Documents\visual_sapfor_2023\src\icons" />
<recent name="C:\Users\misha\Documents\visual_sapfor_2023\src\icons\versions" />
<recent name="C:\Users\misha\Documents\visual_sapfor_2023\src" />
<recent name="C:\Users\misha\Documents\visual_sapfor_2023\src\_dif_utils" />
<recent name="C:\Users\misha\Documents\visual_sapfor_2023\libs" />
<recent name="C:\Users\misha\Documents\visual_sapfor_2023\src\icons\Transformations" />
<recent name="C:\Users\misha\Documents\visual_dvm_2020\src\icons" />
<recent name="C:\Users\misha\Documents\visual_dvm_2020\src\icons\Transformations" />
<recent name="C:\Users\misha\Documents\visual_sapfor_2023\src\_VisualDVM\TestingSystem\DVM\DVMTasks\UI" />
</key>
<key name="MoveMembersDialog.RECENTS_KEY">
<recent name="Repository.Component.Sapfor.Sapfor" />
<recent name="TestingSystem.Group.GroupsDBTable" />
<recent name="Common.Constants" />
<recent name="SapforTestingSystem.SapforTask.SapforTask" />
<recent name="TestingSystem.TestingServer" />
<recent name="_VisualDVM.ComponentsServer.Component.Sapfor.Sapfor" />
<recent name="_VisualDVM.Constants" />
<recent name="_VisualDVM.Global" />
<recent name="_VisualDVM.ProjectData.SapforData.Arrays.UI.ProjectArraysForm" />
<recent name="_VisualDVM.TestingSystem.SAPFOR.SapforPackage.UI.SapforPackagesForm" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="C:\Users\misha\Documents\visual_sapfor_2023\src\icons" />
<recent name="C:\Users\misha\Documents\visual_dvm_2020\src\Visual_DVM_2021\Passes\UI" />
<recent name="E:\Visual_DVM_2020\src\Visual_DVM_2021\UI\Main" />
<recent name="E:\Visual_DVM_2020\src\JAnalyzer" />
<recent name="E:\Visual_DVM_2020\resources" />
<recent name="C:\Users\misha\Documents\visual_sapfor_2023\src\_VisualDVM\TestingSystem\SAPFOR\SapforSettingsCommand\UI" />
<recent name="C:\Users\misha\Documents\visual_sapfor_2023\src\_VisualDVM\GlobalData\FileObject\UI" />
<recent name="C:\Users\misha\Documents\visual_sapfor_2023\src\Common\icons" />
<recent name="C:\Users\misha\Documents\visual_sapfor_2023\src\Common\Visual\Windows" />
<recent name="C:\Users\misha\Documents\visual_sapfor_2023\src\_VisualDVM\Visual\Windows" />
</key>
<key name="MoveClassesOrPackagesDialog.RECENTS_KEY">
<recent name="_VisualDVM.Visual.Windows" />
<recent name="Visual_DVM_2021.Passes.UI" />
<recent name="Visual_DVM_2021.Passes" />
<recent name="Common.UI.Menus" />

View File

@@ -1 +0,0 @@
{"inter":[{"col_op":[{"comm":0.0,"ncall":8,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0},{"comm":0.0,"ncall":0,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0},{"comm":0.0,"ncall":0,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0},{"comm":0.0,"ncall":0,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0}],"id":{"expr":2000000000,"nenter":1.0,"nlev":0,"nline":6,"nline_end":64,"pname":"jac3d.f","t":21},"proc_times":[{"comm":0.0,"exec_time":0.3102550506591797,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"gpu_times":null,"idle":0.0,"insuf_sys":0.0,"insuf_user":0.0,"load_imb":0.0,"lost_time":0.0,"num_gpu":0,"num_threads":0,"overlap":0.0,"prod_cpu":0.3100552558898926,"prod_io":0.0001800060272216797,"prod_sys":1.9788742065429688e-05,"real_comm":0.0,"synch":0.0,"sys_time":0.0,"th_times":null,"thr_sys_time":0.0,"thr_user_time":0.0,"time_var":0.0}],"times":{"comm":0.0,"comm_start":0.0,"efficiency":1.0,"exec_time":0.3102550506591797,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"idle":0.0,"insuf":0.0,"insuf_sys":0.0,"insuf_user":0.0,"load_imb":0.0,"lost_time":0.0,"nproc":1,"overlap":0.0,"prod_cpu":0.3100552558898926,"prod_io":0.0001800060272216797,"prod_sys":1.9788742065429688e-05,"real_comm":0.0,"synch":0.0,"sys_time":0.3102550506591797,"thr_sys_time":0.0,"thr_user_time":0.0,"threadsOfAllProcs":2,"time_var":0.0}}],"iscomp":false,"nproc":1,"p_heading":"1*1","proc":[{"node_name":"mic.dvm-system.org","test_time":0.5540609359741211}]}

View File

@@ -1 +0,0 @@
{"inter":[{"col_op":[{"comm":0.0,"ncall":107,"overlap":0.0,"real_comm":0.0,"synch":0.09642767906188965,"time_var":0.10170316696166992},{"comm":0.09526991844177246,"ncall":100,"overlap":0.00025081634521484375,"real_comm":0.0,"synch":2.384185791015625e-05,"time_var":1.5735626220703125e-05},{"comm":0.01116180419921875,"ncall":100,"overlap":7.390975952148438e-05,"real_comm":0.0,"synch":0.0018832683563232422,"time_var":0.0013852119445800781},{"comm":0.0,"ncall":0,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0}],"id":{"expr":2000000000,"nenter":1.0,"nlev":0,"nline":15,"nline_end":71,"pname":"jac2d.for","t":21},"proc_times":[{"comm":0.008355379104614258,"exec_time":4.960660934448242,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"gpu_times":null,"idle":0.00014519691467285156,"insuf_sys":0.02597987651824951,"insuf_user":0.002836167812347412,"load_imb":0.0,"lost_time":0.03731662034988403,"num_gpu":0,"num_threads":0,"overlap":0.0,"prod_cpu":4.9148295521736145,"prod_io":0.0015007257461547852,"prod_sys":0.007159233093261719,"real_comm":0.0,"synch":0.015146493911743164,"sys_time":1.42268456e-316,"th_times":null,"thr_sys_time":0.0,"thr_user_time":0.0,"time_var":0.011813640594482422},{"comm":0.020066499710083008,"exec_time":4.960740089416504,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"gpu_times":null,"idle":6.604194641113281e-05,"insuf_sys":0.022036850452423096,"insuf_user":0.0030239224433898926,"load_imb":0.006429493427276611,"lost_time":0.04519331455230713,"num_gpu":0,"num_threads":0,"overlap":0.0,"prod_cpu":4.9082671999931335,"prod_io":5.352497100830078e-05,"prod_sys":0.0072920918464660645,"real_comm":0.0,"synch":0.021478652954101563,"sys_time":1632742196.495043,"th_times":null,"thr_sys_time":0.0,"thr_user_time":0.0,"time_var":0.024171829223632813},{"comm":0.05277681350708008,"exec_time":4.960806131362915,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"gpu_times":null,"idle":0.0,"insuf_sys":0.023320376873016357,"insuf_user":0.0034398436546325684,"load_imb":0.040790677070617676,"lost_time":0.079537034034729,"num_gpu":0,"num_threads":0,"overlap":0.0,"prod_cpu":4.873495638370514,"prod_io":7.098913192749023e-05,"prod_sys":0.007702469825744629,"real_comm":0.0,"synch":0.03799128532409668,"sys_time":5.51718905656e-313,"th_times":null,"thr_sys_time":0.0,"thr_user_time":0.0,"time_var":0.04065394401550293},{"comm":0.025233030319213867,"exec_time":4.960805177688599,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"gpu_times":null,"idle":9.5367431640625e-07,"insuf_sys":0.022124826908111572,"insuf_user":0.0031962990760803223,"load_imb":0.011793673038482666,"lost_time":0.05055510997772217,"num_gpu":0,"num_threads":0,"overlap":0.0,"prod_cpu":4.902876079082489,"prod_io":5.5909156799316406e-05,"prod_sys":0.007319033145904541,"real_comm":0.0,"synch":0.02371835708618164,"sys_time":1.4228205e-316,"th_times":null,"thr_sys_time":0.0,"thr_user_time":0.0,"time_var":0.02646470069885254}],"times":{"comm":0.10643172264099121,"comm_start":0.0,"efficiency":0.989285910732807,"exec_time":4.960806131362915,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"idle":0.00021219253540039063,"insuf":0.10595816373825073,"insuf_sys":0.09346193075180054,"insuf_user":0.012496232986450195,"load_imb":0.05901384353637695,"lost_time":0.21260207891464233,"nproc":4,"overlap":0.0003247261047363281,"prod_cpu":19.59946846961975,"prod_io":0.0016811490058898926,"prod_sys":0.029472827911376953,"real_comm":0.0,"synch":0.09833478927612305,"sys_time":19.84322452545166,"thr_sys_time":0.0,"thr_user_time":0.0,"threadsOfAllProcs":4,"time_var":0.1031041145324707}}],"iscomp":false,"nproc":4,"p_heading":"2*2","proc":[{"node_name":"mic.dvm-system.org","test_time":0.5796339511871338},{"node_name":"mic.dvm-system.org","test_time":0.5798628330230713},{"node_name":"mic.dvm-system.org","test_time":0.5795998573303223},{"node_name":"mic.dvm-system.org","test_time":0.5797138214111328}]}

View File

@@ -1 +0,0 @@
{"inter":[{"col_op":[{"comm":0.0,"ncall":107,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0},{"comm":0.0012249946594238281,"ncall":100,"overlap":0.00010442733764648438,"real_comm":0.0,"synch":0.0,"time_var":0.0},{"comm":0.0,"ncall":100,"overlap":5.507469177246094e-05,"real_comm":0.0,"synch":0.0,"time_var":0.0},{"comm":0.0,"ncall":0,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0}],"id":{"expr":2000000000,"nenter":1.0,"nlev":0,"nline":15,"nline_end":71,"pname":"jac2d.for","t":21},"proc_times":[{"comm":0.0012249946594238281,"exec_time":12.855837106704712,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"gpu_times":null,"idle":0.0,"insuf_sys":0.0,"insuf_user":0.0,"load_imb":0.0,"lost_time":0.0012249946594238281,"num_gpu":0,"num_threads":0,"overlap":0.0,"prod_cpu":12.844730615615845,"prod_io":0.0035636425018310547,"prod_sys":0.006317853927612305,"real_comm":0.0,"synch":0.0,"sys_time":1.4784531e-316,"th_times":null,"thr_sys_time":0.0,"thr_user_time":0.0,"time_var":0.0}],"times":{"comm":0.0012249946594238281,"comm_start":0.0,"efficiency":0.9999047129604042,"exec_time":12.855837106704712,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"idle":0.0,"insuf":0.0,"insuf_sys":0.0,"insuf_user":0.0,"load_imb":0.0,"lost_time":0.0012249946594238281,"nproc":1,"overlap":0.0001595020294189453,"prod_cpu":12.844730615615845,"prod_io":0.0035636425018310547,"prod_sys":0.006317853927612305,"real_comm":0.0,"synch":0.0,"sys_time":12.855837106704712,"thr_sys_time":0.0,"thr_user_time":0.0,"threadsOfAllProcs":1,"time_var":0.0}}],"iscomp":false,"nproc":1,"p_heading":"1*1","proc":[{"node_name":"mic.dvm-system.org","test_time":0.5531537532806396}]}

View File

@@ -1 +0,0 @@
{"inter":[{"col_op":[{"comm":0.0,"ncall":54,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0},{"comm":0.0,"ncall":0,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0},{"comm":0.0,"ncall":0,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0},{"comm":0.0,"ncall":0,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0}],"id":{"expr":2000000000,"nenter":1.0,"nlev":0,"nline":174,"nline_end":298,"pname":"bt.f","t":21},"proc_times":[{"comm":0.0,"exec_time":37.97893500328064,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"gpu_times":null,"idle":0.0,"insuf_sys":0.0,"insuf_user":0.0,"load_imb":0.0,"lost_time":0.0,"num_gpu":0,"num_threads":0,"overlap":0.0,"prod_cpu":37.97744798660278,"prod_io":0.0006661415100097656,"prod_sys":0.0008208751678466797,"real_comm":0.0,"synch":0.0,"sys_time":4.080717506121202e-33,"th_times":null,"thr_sys_time":0.0,"thr_user_time":0.0,"time_var":0.0}],"times":{"comm":0.0,"comm_start":0.0,"efficiency":1.0,"exec_time":37.97893500328064,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"idle":0.0,"insuf":0.0,"insuf_sys":0.0,"insuf_user":0.0,"load_imb":0.0,"lost_time":0.0,"nproc":1,"overlap":0.0,"prod_cpu":37.97744798660278,"prod_io":0.0006661415100097656,"prod_sys":0.0008208751678466797,"real_comm":0.0,"synch":0.0,"sys_time":37.97893500328064,"thr_sys_time":0.0,"thr_user_time":0.0,"threadsOfAllProcs":12,"time_var":0.0}}],"iscomp":false,"nproc":1,"p_heading":"1*1*1*1","proc":[{"node_name":"mic.dvm-system.org","test_time":0.5507678985595703}]}

View File

@@ -1 +0,0 @@
{"inter":[{"col_op":[{"comm":0.0,"ncall":107,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0},{"comm":0.0011873245239257813,"ncall":100,"overlap":9.274482727050781e-05,"real_comm":0.0,"synch":0.0,"time_var":0.0},{"comm":0.0,"ncall":100,"overlap":5.435943603515625e-05,"real_comm":0.0,"synch":0.0,"time_var":0.0},{"comm":0.0,"ncall":0,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0}],"id":{"expr":2000000000,"nenter":1.0,"nlev":0,"nline":15,"nline_end":71,"pname":"jac2d.for","t":21},"proc_times":[{"comm":0.0011873245239257813,"exec_time":12.533138990402222,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"gpu_times":null,"idle":0.0,"insuf_sys":0.0,"insuf_user":0.0,"load_imb":0.0,"lost_time":0.0011873245239257813,"num_gpu":0,"num_threads":0,"overlap":0.0,"prod_cpu":12.522205114364624,"prod_io":0.0035867691040039063,"prod_sys":0.006159782409667969,"real_comm":0.0,"synch":0.0,"sys_time":2.49049955e-316,"th_times":null,"thr_sys_time":0.0,"thr_user_time":0.0,"time_var":0.0}],"times":{"comm":0.0011873245239257813,"comm_start":0.0,"efficiency":0.999905265191359,"exec_time":12.533138990402222,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"idle":0.0,"insuf":0.0,"insuf_sys":0.0,"insuf_user":0.0,"load_imb":0.0,"lost_time":0.0011873245239257813,"nproc":1,"overlap":0.00014710426330566406,"prod_cpu":12.522205114364624,"prod_io":0.0035867691040039063,"prod_sys":0.006159782409667969,"real_comm":0.0,"synch":0.0,"sys_time":12.533138990402222,"thr_sys_time":0.0,"thr_user_time":0.0,"threadsOfAllProcs":1,"time_var":0.0}}],"iscomp":false,"nproc":1,"p_heading":"1*1","proc":[{"node_name":"mic.dvm-system.org","test_time":0.5526328086853027}]}

View File

@@ -4,4 +4,4 @@
Инструкция для установки и настройки Диалоговой обочки https://cloud.mail.ru/public/NDxu/LJJhQgQUG
Проект SAPFOR FORTRAN http://alex-freenas.ddns.net:3000/Alexander_KS/SAPFOR
Проект SAPFOR FORTRAN http://dvmh-server.ddns.net:3000/Alexander_KS/SAPFOR

View File

@@ -16,5 +16,84 @@
<orderEntry type="library" name="mxgraphx-all-4.2.0" level="project" />
<orderEntry type="library" name="gson-2.8.1" level="project" />
<orderEntry type="library" name="commons-io-2.5" level="project" />
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/libs/poi-3.12-20150511.jar!/" />
<root url="jar://$MODULE_DIR$/libs/poi-examples-3.12-20150511.jar!/" />
<root url="jar://$MODULE_DIR$/libs/poi-excelant-3.12-20150511.jar!/" />
<root url="jar://$MODULE_DIR$/libs/poi-ooxml-3.12-20150511.jar!/" />
<root url="jar://$MODULE_DIR$/libs/poi-ooxml-schemas-3.12-20150511.jar!/" />
<root url="jar://$MODULE_DIR$/libs/poi-scratchpad-3.12-20150511.jar!/" />
<root url="file://$MODULE_DIR$" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="file://$MODULE_DIR$/Components/poi-src-5.2.5-20231118/poi-src-5.2.5-20231118/osgi/src/main/java" />
<root url="file://$MODULE_DIR$/Components/poi-src-5.2.5-20231118/poi-src-5.2.5-20231118/osgi/src/test/java" />
<root url="file://$MODULE_DIR$/Components/poi-src-5.2.5-20231118/poi-src-5.2.5-20231118/poi-examples/src/main/java" />
<root url="file://$MODULE_DIR$/Components/poi-src-5.2.5-20231118/poi-src-5.2.5-20231118/poi-examples/src/main/ruby/java" />
<root url="file://$MODULE_DIR$/Components/poi-src-5.2.5-20231118/poi-src-5.2.5-20231118/poi-examples/src/test/java" />
<root url="file://$MODULE_DIR$/Components/poi-src-5.2.5-20231118/poi-src-5.2.5-20231118/poi-excelant/src/main/java" />
<root url="file://$MODULE_DIR$/Components/poi-src-5.2.5-20231118/poi-src-5.2.5-20231118/poi-excelant/src/poi-ant-contrib/java" />
<root url="file://$MODULE_DIR$/Components/poi-src-5.2.5-20231118/poi-src-5.2.5-20231118/poi-excelant/src/test/java" />
<root url="file://$MODULE_DIR$/Components/poi-src-5.2.5-20231118/poi-src-5.2.5-20231118/poi-integration/src/test/java" />
<root url="file://$MODULE_DIR$/Components/poi-src-5.2.5-20231118/poi-src-5.2.5-20231118/poi-ooxml-lite-agent/src/main/java" />
<root url="file://$MODULE_DIR$/Components/poi-src-5.2.5-20231118/poi-src-5.2.5-20231118/poi-ooxml/src/main/java" />
<root url="file://$MODULE_DIR$/Components/poi-src-5.2.5-20231118/poi-src-5.2.5-20231118/poi-ooxml/src/test/java" />
<root url="file://$MODULE_DIR$/Components/poi-src-5.2.5-20231118/poi-src-5.2.5-20231118/poi-scratchpad/src/main/java" />
<root url="file://$MODULE_DIR$/Components/poi-src-5.2.5-20231118/poi-src-5.2.5-20231118/poi-scratchpad/src/test/java" />
<root url="file://$MODULE_DIR$/Components/poi-src-5.2.5-20231118/poi-src-5.2.5-20231118/poi/src/main/java" />
<root url="file://$MODULE_DIR$/Components/poi-src-5.2.5-20231118/poi-src-5.2.5-20231118/poi/src/test/java" />
<root url="file://$MODULE_DIR$/src" />
</SOURCES>
</library>
</orderEntry>
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/libs/commons-logging-1.1.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/libs/commons-codec-1.9.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/libs/junit-4.12.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/libs/log4j-1.2.17.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/libs/xmlbeans-2.6.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="library" name="commons-lang-2.6.0" level="project" />
</component>
</module>

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 KiB

View File

@@ -0,0 +1,37 @@
{
"Mode": "Normal",
"ServerAddress": "alex-freenas.ddns.net",
"ServerUserName": "testuser",
"ServerUserSHHPort": 23,
"ComponentsServerPort": 7995,
"TestingServerPort": 7996,
"SocketTimeout": 5000,
"OldServer": false,
"SMTPHost": "smtp.mail.ru",
"SMTPPort": 465,
"MailSocketPort": 465,
"BackupWorkspace": "_sapfor_x64_backups",
"BackupHour": 5,
"BackupMinute": 0,
"EmailAdminsOnStart": false,
"AutoUpdateSearch": false,
"ConfirmPassesStart": true,
"ShowPassesDone": true,
"FocusPassesResult": true,
"GlobalDBName": "db7.sqlite",
"ProjectDBName": "new_project_base.sqlite",
"BugReportsDBName": "bug_reports.sqlite",
"TestsDBName": "tests.sqlite",
"ComponentsWindowWidth": 843,
"ComponentsWindowHeight": 250,
"VisualiserPath": "C:\\Users\\misha\\Downloads",
"Sapfor_FPath": "E:\\_sapfor_x64\\Components\\Sapfor_F",
"Visualizer_2Path": "C:\\Users\\misha\\Documents",
"InstructionPath": "",
"PerformanceAnalyzerPath": "",
"ComponentsBackUpsCount": 10,
"TestingKernels": 28,
"AutoCheckTesting": false,
"CheckTestingIntervalSeconds": 10,
"EmailOnTestingProgress": false
}

View File

@@ -0,0 +1,37 @@
{
"Mode": "Normal",
"ServerAddress": "alex-freenas.ddns.net",
"ServerUserName": "testuser",
"ServerUserSHHPort": 2000,
"ComponentsServerPort": 7995,
"TestingServerPort": 7998,
"SocketTimeout": 5000,
"OldServer": false,
"SMTPHost": "smtp.mail.ru",
"SMTPPort": 465,
"MailSocketPort": 465,
"BackupWorkspace": "_sapfor_x64_backups",
"BackupHour": 5,
"BackupMinute": 0,
"EmailAdminsOnStart": false,
"AutoUpdateSearch": false,
"ConfirmPassesStart": true,
"ShowPassesDone": true,
"FocusPassesResult": true,
"GlobalDBName": "db7.sqlite",
"ProjectDBName": "new_project_base.sqlite",
"BugReportsDBName": "bug_reports.sqlite",
"TestsDBName": "tests.sqlite",
"ComponentsWindowWidth": 843,
"ComponentsWindowHeight": 250,
"VisualiserPath": "C:\\Users\\misha\\Downloads",
"Sapfor_FPath": "E:\\_sapfor_x64\\Components\\Sapfor_F",
"Visualizer_2Path": "C:\\Users\\misha\\Documents",
"InstructionPath": "",
"PerformanceAnalyzerPath": "",
"ComponentsBackUpsCount": 10,
"TestingKernels": 28,
"AutoCheckTesting": true,
"CheckTestingIntervalSeconds": 10,
"EmailOnTestingProgress": false
}

View File

@@ -1,32 +1,51 @@
{
"Mode": "Normal",
"SocketTimeout": 5000,
"OldServer": false,
"SMTPHost": "smtp.mail.ru",
"SMTPPort": 465,
"MailSocketPort": 465,
"BackupWorkspace": "_sapfor_x64_backups",
"BackupHour": 5,
"BackupMinute": 0,
"EmailAdminsOnStart": false,
"AutoUpdateSearch": true,
"ConfirmPassesStart": true,
"ShowPassesDone": true,
"FocusPassesResult": false,
"GlobalDBName": "db7.sqlite",
"ProjectDBName": "new_project_base.sqlite",
"BugReportsDBName": "bug_reports.sqlite",
"TestsDBName": "tests.sqlite",
"ComponentsWindowWidth": 843,
"ComponentsWindowHeight": 250,
"Email": "vmk-post@yandex.ru",
"Name": "M",
"ServerUserPassword": "mprit_2011",
"OfferRegistrationOnStart": true,
"Workspace": "E:\\Tests",
"ProjectsSearchDirectory": "E:\\Tests\\Downloads\\bugreport_1701089001",
"DocumentsDirectory": "C:\\Users\\misha\\Documents\\_testing_system",
"VisualiserPath": "C:\\Users\\misha\\Downloads",
"Sapfor_FPath": "E:\\_sapfor_x64\\Components\\Sapfor_F",
"Visualizer_2Path": "C:\\Users\\misha\\Documents",
"InstructionPath": "",
"PerformanceAnalyzerPath": "",
"ComponentsBackUpsCount": 10,
"TestingKernels": 16,
"AutoCheckTesting": false,
"InstructionPath": "C:\\Users\\misha\\Documents",
"PerformanceAnalyzerPath": "C:\\Users\\misha\\Documents",
"AutoBugReportsLoad": true,
"AutoTestsLoad": true,
"ConfirmPassesStart": true,
"ShowPassesDone": true,
"FocusPassesResult": false,
"collapseCredentials": true,
"collapseFileGraphs": false,
"collapseFileMessages": false,
"collapseProjectTrees": false,
"EditorFontSize": 17,
"ComponentsWindowWidth": 929,
"ComponentsWindowHeight": 250,
"Kernels": 8,
"LocalMakePathWindows": "C:\\MinGW\\msys\\1.0\\bin\\make.exe",
"CheckTestingIntervalSeconds": 10,
"EmailOnTestingProgress": true
"AutoCheckTesting": true,
"EmailOnTestingProgress": true,
"CompleteCompilationOptions": true,
"CompleteRunEnvironments": true,
"CreateEthalonTasks": true,
"ErasePackageWorkspace": true,
"lastMachineId": 13,
"lastUserId": 34,
"lastCompilerId": 52,
"RegisterOn": false,
"SpacesOn": false,
"EmptyLinesOn": false,
"FortranWrapsOn": false,
"ExtensionsOn": false,
"ComparsionDiffMergeOn": true,
"ShowFullArraysDeclarations": true,
"ShowFullTabsNames": true,
"SmallScreen": false,
"BugReportsAgeLimit": 1,
"FastAccessPassesCount": 10,
"LastOpenedProjectsCount": 25,
"Mode": "Normal"
}

View File

@@ -0,0 +1,43 @@
{
"Mode": "Normal",
"ServerAddress": "alex-freenas.ddns.net",
"ServerUserName": "testuser",
"ServerUserSHHPort": 2000,
"ComponentsServerPort": 7996,
"TestingServerPort": 7998,
"SocketTimeout": 5000,
"OldServer": false,
"SMTPHost": "smtp.mail.ru",
"SMTPPort": 465,
"MailSocketPort": 465,
"collapseCredentials": false,
"collapseFileGraphs": false,
"collapseFileMessages": false,
"collapseProjectTrees": false,
"BackupWorkspace": "_sapfor_x64_backups",
"BackupHour": 5,
"BackupMinute": 0,
"EmailAdminsOnStart": false,
"AutoUpdateSearch": true,
"ConfirmPassesStart": true,
"ShowPassesDone": true,
"FocusPassesResult": true,
"ProjectDBName": "new_project_base.sqlite",
"BugReportsDBName": "bug_reports.sqlite",
"TestsDBName": "tests.sqlite",
"ComponentsWindowWidth": 924,
"ComponentsWindowHeight": 250,
"VisualiserPath": "C:\\Users\\misha\\Downloads",
"Sapfor_FPath": "E:\\_sapfor_x64\\Components\\Sapfor_F",
"Visualizer_2Path": "C:\\Users\\misha\\Documents",
"InstructionPath": "",
"PerformanceAnalyzerPath": "",
"ComponentsBackUpsCount": 10,
"AutoCheckTesting": true,
"CheckTestingIntervalSeconds": 10,
"EmailOnTestingProgress": true,
"eraseTestingWorkspaces": true,
"lastMachineId": 13,
"lastUserId": 34,
"lastCompilerId": 52
}

View File

@@ -0,0 +1,3 @@
package Common;
public interface ApplicationMode {
}

View File

@@ -0,0 +1,31 @@
package Common;
import Common.Utils.Vector_;
import java.util.Vector;
import java.util.regex.Pattern;
public class CommonConstants {
public static final int Nan = -1;
public static final Pattern VALID_EMAIL_ADDRESS_REGEX =
Pattern.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$", Pattern.CASE_INSENSITIVE);
//--
//-файлы-признаки
public static final String LOADED = "LOADED";
public static final String STARTED = "STARTED";
public static final String ABORTED = "ABORTED";
public static final String INTERRUPT = "INTERRUPT"; //файл признак прерывания.
public final static String DONE = "DONE";
public final static String TIMEOUT = "TIMEOUT";
//--
public static char[] regular_metasymbols = new char[]{
'<', '>', '(', ')', '[', ']', '{', '}', '^', '-', '=', '$', '!', '|', '?', '*', '+', '.'
};
public static char toStrike = (char) 822;
public static char boop = (char) 7;
public static Vector<Character> forbidden_file_name_characters = new Vector_<>(
'#', '%', '&', '{', '}',
'<', '>', '*', '?', '!',
'$', '\'', '\"', '@', '+',
'`', '|', '=', '#', ':', '/', '\\',
'~', '^'
);
}

View File

@@ -1,494 +0,0 @@
package Common;
import Common.Database.iDBObject;
import Common.UI.Themes.VisualiserTheme;
import Common.Utils.TextLog;
import GlobalData.Account.Account;
import GlobalData.Compiler.Compiler;
import GlobalData.Machine.Machine;
import GlobalData.Makefile.Makefile;
import GlobalData.Module.Module;
import GlobalData.RemoteFile.RemoteFile;
import GlobalData.RunConfiguration.RunConfiguration;
import GlobalData.Tasks.CompilationTask.CompilationTask;
import GlobalData.Tasks.RunTask.RunTask;
import GlobalData.User.User;
import ProjectData.Files.DBProjectFile;
import ProjectData.Project.db_project_info;
import ProjectData.SapforData.Functions.FuncInfo;
import ProjectData.SapforData.Regions.ParallelRegion;
import Repository.BugReport.BugReport;
import Repository.Subscribes.Subscriber;
import TestingSystem.SAPFOR.SapforConfiguration.SapforConfiguration;
import TestingSystem.DVM.Configuration.Configuration;
import TestingSystem.DVM.Tasks.TestCompilationTask;
import TestingSystem.DVM.Tasks.TestRunTask;
import TestingSystem.DVM.TasksPackage.TasksPackage;
import TestingSystem.Common.Test.Test;
import Visual_DVM_2021.Passes.UI.PassForm;
import javax.swing.tree.DefaultMutableTreeNode;
import java.io.File;
import java.util.LinkedHashMap;
public enum Current {
Undefined,
//--
ServerSapfor,
SapforTasksPackage,
SapforEtalonVersion,//самый левый пакет
SapforVersion,
//--
//--
ComponentServerBackup,
Subscriber,
Theme,
FileGraphElement,
InlineGraphElement,
InlineGraphElement2,
IncludeGraphElement,
Component,
Project,
File,
Root,
Version,
BugReport,
Account,
DBArray,
ProjectArray,
ParallelRegionInfo,
ParallelVariant,
Machine,
User,
Compiler,
Makefile,
Module,
RunConfiguration,
EnvironmentValue,
CompilationTask,
RunTask,
ProjectNode, //узел в дереве проекта. нужен для отображения добавленных файлов
SelectedDirectory,
SelectedFile,
//текущий выбранный удаленный файл
RemoteFile,
PassForm, //текущее окно анимации. нужно для сообщений сапфора по сокету.
RunStsRecord,
//только для того, чтобы закодировать таблицу.
Array,
ParallelRegion,
Dimensions,
//----------
Warnings,
Errors,
Notes,
Recommendations,
//-
Sapfor,
//-
Scenario,
ScenarioCommand,
//-
Configuration,
Group,
//-
DVMParameterValue,
Test,
Function,
SelectedFunction,
//-
Credentials,
TestCompilationTask,
TestRunTask,
TasksPackage,
//-
DialogWindow,
//-
PackageVersion,
SapforConfiguration,
SapforConfigurationCommand,
SapforTask,
SapforProfile,
SapforProfileSetting,
//--
ProjectView;
//-
//---
private static final LinkedHashMap<Current, Object> objects = new LinkedHashMap<>();
public static Mode mode;
public static boolean hasUI() {
return Current.mode.equals(Current.Mode.Normal);
}
public static boolean HasProject() {
return get(Project) != null;
}
public static boolean HasFile() {
return get(File) != null;
}
public static boolean HasSelectedFile() {
return get(SelectedFile) != null;
}
public static boolean HasAccount() {
return get(Account) != null;
}
public static boolean HasMachine() {
return get(Machine) != null;
}
public static boolean HasUser() {
return get(User) != null;
}
public static boolean HasCompiler() {
return get(Compiler) != null;
}
public static boolean HasRemoteFile() {
return get(RemoteFile) != null;
}
public static boolean HasMakefile() {
return get(Makefile) != null;
}
public static boolean HasRunConfiguration() {
return get(RunConfiguration) != null;
}
public static boolean HasCompilationTask() {
return get(CompilationTask) != null;
}
public static boolean HasRunTask() {
return get(RunTask) != null;
}
public static boolean HasPassForm() {
return get(PassForm) != null;
}
public static boolean HasProjectView() {
return get(ProjectView) != null;
}
//для быстрого доступа на чтение. слишком много на нем завязано.
public static db_project_info getProject() {
return (db_project_info) get(Project);
}
public static DBProjectFile getFile() {
return (DBProjectFile) get(File);
}
public static Repository.Component.Component getComponent() {
return (Repository.Component.Component) get(Component);
}
public static Repository.BugReport.BugReport getBugReport() {
return (BugReport) get(BugReport);
}
public static db_project_info getRoot() {
return (db_project_info) get(Root);
}
public static boolean HasRoot() {
return get(Root) != null;
}
public static db_project_info getVersion() {
return (db_project_info) get(Version);
}
public static Account getAccount() {
return (Account) get(Account);
}
public static boolean HasSubscriber() {
return get(Current.Subscriber) != null;
}
public static Repository.Subscribes.Subscriber getSubscriber() {
return (Subscriber) get(Current.Subscriber);
}
public static Machine getMachine() {
return (Machine) get(Current.Machine);
}
public static User getUser() {
return (User) get(Current.User);
}
public static Compiler getCompiler() {
return (Compiler) get(Current.Compiler);
}
public static CompilationTask getCompilationTask() {
return (CompilationTask) get(Current.CompilationTask);
}
public static RunTask getRunTask() {
return (RunTask) get(Current.RunTask);
}
public static RemoteFile getRemoteFile() {
return (RemoteFile) get(Current.RemoteFile);
}
public static Makefile getMakefile() {
return (Makefile) get(Current.Makefile);
}
public static Module getModule() {
return (Module) get(Current.Module);
}
public static RunConfiguration getRunConfiguration() {
return (RunConfiguration) get(Current.RunConfiguration);
}
public static Repository.Component.Sapfor.Sapfor getSapfor() {
return (Repository.Component.Sapfor.Sapfor) get(Current.Sapfor);
}
public static boolean HasGroup() {
return get(Current.Group) != null;
}
public static TestingSystem.Common.Group.Group getGroup() {
return (TestingSystem.Common.Group.Group) get(Current.Group);
}
//--
public static boolean HasConfiguration() {
return get(Current.Configuration) != null;
}
public static TestingSystem.DVM.Configuration.Configuration getConfiguration() {
return (Configuration) get(Current.Configuration);
}
public static SapforConfiguration getSapforConfiguration() {
return (TestingSystem.SAPFOR.SapforConfiguration.SapforConfiguration) get(Current.SapforConfiguration);
}
//--
public static Test getTest() {
return (TestingSystem.Common.Test.Test) get(Current.Test);
}
public static boolean HasTest() {
return get(Current.Test) != null;
}
public static boolean HasVersion() {
return get(Current.Version) != null;
}
public static TestCompilationTask getTestCompilationTask() {
return (TestingSystem.DVM.Tasks.TestCompilationTask) get(Current.TestCompilationTask);
}
public static boolean HasTestCompilationTask() {
return get(Current.TestCompilationTask) != null;
}
public static boolean HasTestRunTask() {
return get(Current.TestRunTask) != null;
}
public static TestRunTask getTestRunTask() {
return (TestingSystem.DVM.Tasks.TestRunTask) get(Current.TestRunTask);
}
public static RemoteFile getComponentServerBackup() {
return (RemoteFile) get(Current.ComponentServerBackup);
}
public static boolean HasComponentServerBackup() {
return get(Current.ComponentServerBackup) != null;
}
//-
public static DefaultMutableTreeNode getProjectNode() {
return (DefaultMutableTreeNode) get(Current.ProjectNode);
}
public static DefaultMutableTreeNode getProjectCurrentParentNode() {
DefaultMutableTreeNode node = Current.getProjectNode();
//если в дереве еще никто не выделялся, берем корень.
if (node == null)
return Current.getProject().filesTreeRoot;
return (node.getUserObject() instanceof DBProjectFile) ? (DefaultMutableTreeNode) node.getParent() : node;
}
public static File getSelectedDirectory() {
return (File) get(Current.SelectedDirectory);
}
public static DBProjectFile getSelectedFile() {
return (DBProjectFile) get(Current.SelectedFile);
}
//-
public static boolean HasBugReport() {
return get(Current.BugReport) != null;
}
public static PassForm getPassForm() {
return (Visual_DVM_2021.Passes.UI.PassForm) get(Current.PassForm);
}
public static VisualiserTheme getTheme() {
return (VisualiserTheme) get(Current.Theme);
}
//--------------------------------------------------------------------------------
public static ParallelRegion getParallelRegion() {
return (ParallelRegion) get(Current.ParallelRegion);
}
public static boolean HasParallelRegion() {
return get(Current.ParallelRegion) != null;
}
public static boolean HasFunction() {
return get(Current.Function) != null;
}
public static boolean HasSelectedFunction() {
return get(Current.SelectedFunction) != null;
}
public static FuncInfo getFunction() {
return (FuncInfo) get(Current.Function);
}
public static FuncInfo getSelectionFunction() {
return (FuncInfo) get(Current.SelectedFunction);
}
public static boolean HasTasksPackage() {
return get(Current.TasksPackage) != null;
}
public static TasksPackage getTasksPackage() {
return (TasksPackage) get(Current.TasksPackage);
}
public static boolean HasScenario() {
return get(Current.Scenario) != null;
}
public static db_project_info getPackageVersion() {
return (db_project_info) get(Current.PackageVersion);
}
public static boolean HasPackageVersion() {
return get(Current.PackageVersion) != null;
}
public static boolean HasSapforConfiguration() {
return get(Current.SapforConfiguration) != null;
}
public static boolean HasSapforTask() {
return get(Current.SapforTask) != null;
}
public static TestingSystem.SAPFOR.SapforTask.SapforTask getSapforTask() {
return (TestingSystem.SAPFOR.SapforTask.SapforTask) get(Current.SapforTask);
}
public static ProjectData.ProjectView getProjectView() {
return (ProjectData.ProjectView) get(ProjectView);
}
public static boolean Check(TextLog Log, Current... names) {
for (Current name : names)
if (get(name) == null)
Log.Writeln_(name.getDescription() + " не выбран(а)");
return Log.isEmpty();
}
public static void CreateAll() {
for (Current c : values())
objects.put(c, null);
}
//-----------------------------------------
public static Object get(Current name) {
return objects.get(name);
}
public static Object set(Current name, Object object) {
objects.replace(name, object);
return object;
}
//применять только для наследников iDBObject
public static boolean CheckID(Current name, int id) {
return (get(name) != null) && (((iDBObject) get(name)).id == id);
}
public static TestingSystem.SAPFOR.SapforConfigurationCommand.SapforConfigurationCommand getSapforConfigurationCommand() {
return (TestingSystem.SAPFOR.SapforConfigurationCommand.SapforConfigurationCommand) get(Current.SapforConfigurationCommand);
}
public static boolean HasSapforProfile() {
return get(Current.SapforProfile) != null;
}
public static GlobalData.SapforProfile.SapforProfile getSapforProfile() {
return (GlobalData.SapforProfile.SapforProfile) get(Current.SapforProfile);
}
public static boolean HasSapforTasksPackage() {
return get(Current.SapforTasksPackage) != null;
}
public static TestingSystem.SAPFOR.SapforTasksPackage.SapforTasksPackage getSapforTasksPackage() {
return (TestingSystem.SAPFOR.SapforTasksPackage.SapforTasksPackage) get(Current.SapforTasksPackage);
}
//сапфоры установленные на тестовый сервер.
public static boolean HasServerSapfor() {
return get(Current.ServerSapfor) != null;
}
public static TestingSystem.SAPFOR.ServerSapfor.ServerSapfor getServerSapfor() {
return (TestingSystem.SAPFOR.ServerSapfor.ServerSapfor) get(Current.ServerSapfor);
}
//--------------------------------------------
public String getDescription() {
switch (this) {
case ServerSapfor:
return "тестовая версия SAPFOR";
case SapforTasksPackage:
return "пакет задач SAPFOR";
case SapforProfile:
return "Профиль SAPFOR";
case SapforProfileSetting:
return "Настройка профиля SAPFOR";
case SapforEtalonVersion:
return "Версия SAPFOR(Эталон)";
case SapforVersion:
return "Версия SAPFOR";
case ComponentServerBackup:
return "Версия компонента для восстановления с сервера";
case Subscriber:
return "Адресат";
case SapforTask:
return "Задача SAPFOR";
case SelectedFunction:
return "Выбранный узел графа процедур";
case SapforConfigurationCommand:
return "Команда конфигурации тестирования SAPFOR";
case SapforConfiguration:
return "Конфигурация тестирования SAPFOR";
case PackageVersion:
return "Версия пакетного режима";
case TasksPackage:
return "Пакет задач";
case Credentials:
return "Учётные данные";
case Function:
return "Функция";
case TestRunTask:
return "Задача на запуск теста";
case TestCompilationTask:
return "Задача на компиляцию теста";
case DVMParameterValue:
return "Параметр DVM системы";
case ParallelRegion:
return "Область распараллеливания";
case Group:
return "Группа тестов DVM";
case Scenario:
return "Сценарий";
case ScenarioCommand:
return "Команда сценария";
case ProjectNode:
return "текущий узел дерева проектов"; //служебка
case Test:
return "Тест";
case Sapfor:
return "SAPFOR";
case Theme:
return "Тема";
case EnvironmentValue:
return "Значение переменной окружения";
case SelectedDirectory:
return "Папка проекта";
case SelectedFile:
return "Файл проекта";
case RunConfiguration:
return "Конфигурация запуска";
case RunTask:
return "Задача на запуск";
case CompilationTask:
return "Задача на компиляцию";
case Makefile:
return "Мейкфайл";
case Module:
return "Языковой модуль мейкфайла";
case RemoteFile:
return "Удалённый файл";
case Component:
return "Компонент";
case Project:
return "Проект";
case File:
return "Файл";
case Root:
return "Корень дерева версий";
case Version:
return "Версия";
case BugReport:
return "Отчёт об ошибке";
case Account:
return "Аккаунт";
case Machine:
return "Машина";
case User:
return "Пользователь";
case Compiler:
return "Компилятор";
case DialogWindow:
return "Диалоговое окно";
default:
return "";
}
}
//---
public enum Mode {
Undefined,
Normal,
Server,
Testing,
Package
}
}

6
src/Common/Current_.java Normal file
View File

@@ -0,0 +1,6 @@
package Common;
public interface Current_ {
default String getDescription() {
return "?";
}
}

View File

@@ -1,34 +0,0 @@
package Common.Database;
import java.lang.reflect.Field;
public abstract class DBTable<K, D extends DBObject> extends DataSet<K, D> {
//-
public DBTableColumn PK = null;
private Database db = null; //база данных - владелец таблицы.
public DBTable(Class<K> k_in, Class<D> d_in) {
super(k_in, d_in);
for (Field field : d.getFields()) {
DBTableColumn column = new DBTableColumn(field);
if ((!column.Ignore) && !columns.containsKey(column.Name)) {
columns.put(column.Name, column);
if (column.PrimaryKey) PK = column;
}
}
}
public Database getDb() {
return db;
}
public void setDb(Database db_in) {
db = db_in;
}
@Override
public String getPKName() {
return PK.Name;
}
@Override
public String toString() {
StringBuilder res = new StringBuilder(Name + "\n");
for (DBTableColumn c : columns.values())
res.append(c).append("\n");
return res.toString();
}
}

View File

@@ -1,253 +0,0 @@
package Common.Database;
import Common.Current;
import Common.UI.DataSetControlForm;
import Common.UI.Menus_2023.DataMenuBar;
import Common.UI.Tables.ColumnFilter;
import Common.UI.UI;
import Common.UI.Windows.Dialog.DBObjectDialog;
import Common.UI.Windows.Dialog.DialogFields;
import Common.Utils.TextLog;
import Visual_DVM_2021.UI.Interface.FilterWindow;
import javax.swing.*;
import java.awt.*;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.Vector;
import java.util.stream.Collectors;
public class DataSet<K, D extends DBObject> extends DataSetAnchestor {
//-
public static LinkedHashMap<Class, Object> selections = new LinkedHashMap<>();
//-
public String Name;
public Class<K> k; //класс первичного ключа.
public Class<D> d; //класс объектов.
public LinkedHashMap<K, D> Data = new LinkedHashMap<>(); //наполнение
//-
//<editor-fold desc="UI таблица">
public DataSetControlForm ui_;
protected FilterWindow f_ui;
//</editor-fold>
//-
public LinkedHashMap<Integer, ColumnFilter> columnsFilters = new LinkedHashMap<>();
public DataSet(Class<K> k_in, Class<D> d_in) {
k = k_in;
d = d_in;
Name = d.getSimpleName();
}
public void mountUI(JPanel content_in) {
UI.Clear(content_in);
//-->
ui_ = createUI();
ui_.setContent(content_in);
//-->
if (UI.menuBars.containsKey(getClass())) {
DataMenuBar bar = UI.menuBars.get(getClass());
content_in.add(bar, BorderLayout.NORTH);
setFilterUI(count -> UI.menuBars.get(getClass()).countLabel.setText(String.valueOf(count)));
if (ui_.hasCheckBox())
bar.createSelectionButtons(this);
}
content_in.add(ui_.getDataPanel(), BorderLayout.CENTER);
}
public DataSetControlForm getUi() {
return ui_;
}
public void setFilterUI(FilterWindow ui_in) {
f_ui = ui_in;
}
public void ShowUI() {
if (ui_ != null) {
ui_.Show();
if (f_ui != null)
f_ui.ShowMatchesCount(getRowCountUI());
}
}
public void ShowUI(Object key) {
if (ui_ != null) {
ui_.Show(key);
if (f_ui != null)
f_ui.ShowMatchesCount(getRowCountUI());
}
}
public void ClearUI() {
if ((ui_ != null) && ui_.isShown()) {
ui_.ClearSelection();
ui_.Clear();
if (f_ui != null)
f_ui.ShowNoMatches();
}
}
public void RefreshUI() {
if (ui_ != null) ui_.Refresh();
}
public int getRowCountUI() {
return ui_.getRowCount();
}
public void SetCurrentObjectUI(Object pk) {
if (ui_ != null) {
//todo возможно проверить, что текущий объект уже соответствует ключу, и если да, то ничего делать.
ui_.ClearSelection(); //сброс текущего объекта и всего что с ним связано.
ui_.Select(pk);
}
}
//столбы/ потом переименовать обратно в getUIColumnNames.сейчас так для скорости переноса.
public String[] getUIColumnNames() {
return new String[]{};
}
protected DataSetControlForm createUI() {
return null;
}
public boolean hasUI() {
return ui_ != null;
}
public void CheckAll(boolean flag) {
for (D object : Data.values()) {
if (object.isVisible())
object.Select(flag);
}
RefreshUI();
}
public D getFirstRecord() {
return Data.values().stream().findFirst().orElse(null);
}
public Vector<D> getOrderedRecords(Comparator<D> comparator) {
Vector<D> res = new Vector<>(Data.values());
res.sort(comparator);
return res;
}
@SuppressWarnings("unchecked")
public DBObjectDialog<D, ? extends DialogFields> getDialog() {
return null;
}
public boolean ShowAddObjectDialog(DBObject object) {
return getDialog().ShowDialog(getSingleDescription() + ": добавление", object);
}
public boolean ShowEditObjectDialog(DBObject object) {
DBObjectDialog dialog = getDialog();
dialog.edit = true;
dialog.SetEditLimits();
return dialog.ShowDialog(getSingleDescription() + ": редактирование", object);
}
public boolean ViewObject(DBObject object) {
DBObjectDialog dialog = getDialog();
dialog.SetReadonly();
dialog.ShowDialog(getSingleDescription() + ": просмотр", object);
return false;
}
public boolean ShowDeleteObjectDialog(DBObject object) {
return UI.Warning(getSingleDescription() + " " + object.getBDialogName() + " будет удален(а)");
}
public String QName() {
return "\"" + Name + "\"";
}
public String getPKName() {
return "";
} //получить имя ключевого поля. нужно для таблиц.
public String getPluralDescription() {
return "";
}
public String getSingleDescription() {
return "";
}
//времянки
public Current CurrentName() {
return Current.Undefined;
}
public boolean CheckCurrent(TextLog log) {
return Current.Check(log, CurrentName());
}
public boolean hasCurrent() {
return Current.get(CurrentName()) != null;
}
public void dropCurrent() {
Current.set(CurrentName(), null);
}
public D getCurrent() {
return (D) Current.get(CurrentName());
}
public void setCurrent(D o) {
Current.set(CurrentName(), o);
}
//-
public void put(Object key, D object) {
Data.put((K) key, object);
}
public D get(Object key) {
return Data.get(key);
}
public Object getFieldAt(D object, int columnIndex) {
return null;
}
public void clear() {
Data.clear();
}
public int size() {
return Data.size();
}
public boolean containsKey(Object key) {
return Data.containsKey(key);
}
//-
public Vector<K> getVisibleKeys() {
Comparator<D> comparator = getComparator();
Vector<K> res = new Vector<>();
if (comparator == null) {
for (K key : Data.keySet())
if (Data.get(key).isVisible())
res.add(key);
} else {
Vector<D> raw = new Vector<>();
for (D object : Data.values()) {
if (object.isVisible())
raw.add(object);
}
raw.sort(comparator);
for (D object : raw)
res.add((K) object.getPK());
}
return res;
}
protected Comparator<D> getComparator() {
return null;
}
public int getCheckedCount() {
return (int) Data.values().stream().filter(d -> d.isVisible() && d.isSelected()).count();
}
public Vector<D> getCheckedItems() {
return Data.values().stream().filter(d -> d.isVisible() && d.isSelected()).collect(Collectors.toCollection(Vector::new));
}
public Vector<K> getCheckedKeys() {
return Data.values().stream().filter(DBObject::isSelected).map(d -> (K) d.getPK()).collect(Collectors.toCollection(Vector::new));
}
//--
public void SaveLastSelections() {
if (hasUI()) {
Object lastPk = null;
if ((CurrentName() != Current.Undefined) && (getCurrent() != null))
lastPk = getCurrent().getPK();
if (!selections.containsKey(getClass()))
selections.put(getClass(), lastPk);
else selections.replace(getClass(), lastPk);
}
}
public void RestoreLastSelections() {
if (hasUI()) {
Object lastPk = selections.get(getClass());
// if (lastPk != null) UI.Info(this.getClass() + ":" + lastPk.toString());
if ((CurrentName() != Current.Undefined) && (lastPk != null)) {
// UI.Info(lastPk.toString());
// System.out.println(ui);
// UI.Info("+");
ui_.Select(lastPk);
}
}
}
//---
// применить значение фильтра к фильру объекта напирмер Message.filterValue = text;
public void changeColumnFilterValue(int columnIndex, String text) {
}
public Object getColumnFilterValue(int columnIndex) {
return "";
}
}

View File

@@ -1,9 +1,13 @@
package Common.Database;
import Common.Constants;
import Common.Global;
import Common.Utils.Utils;
import Repository.RepositoryRefuseException;
import Visual_DVM_2021.Passes.PassCode_2021;
import Common.CommonConstants;
import Common.Database.Objects.DBObject;
import Common.Database.Objects.iDBObject;
import Common.Database.Tables.DBTable;
import Common.Database.Tables.DataSet;
import Common.Passes.PassCode_;
import Common.Utils.TextLog;
import Common.Utils.Utils_;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.util.LinkedHashMap;
@@ -11,11 +15,14 @@ import java.util.Vector;
//самый общий интерфейс базы данных, независимо от реализации.
public abstract class Database {
//------------------------------
public LinkedHashMap<Class<? extends DBObject>, DBTable> tables = new LinkedHashMap<>(); //таблицы
protected LinkedHashMap<Class<? extends DBObject>, DBTable> tables = new LinkedHashMap<>(); //таблицы
protected File file = null;
public Database(File file_in) {
file = file_in;
}
public <T extends DBObject> DBTable<?, T> getTable(Class<T> tableClass) {
return tables.get(tableClass);
}
public File getFile() {
return file;
}
@@ -27,6 +34,12 @@ public abstract class Database {
// UI.Print(DebugPrintLevel.Database, "соединение с базой данных " + file.getAbsolutePath());
connect();
}
public void Activate() throws Exception {
Connect();
CreateAllTables();
prepareTablesStatements();
Synchronize();
}
public void prepareTablesStatements() throws Exception {
}
public void Disconnect() throws Exception {
@@ -81,7 +94,7 @@ public abstract class Database {
public DBObject InsertS(DBObject object) throws Exception {
DBTable table = tables.get(object.getClass());
if (!(object instanceof iDBObject) && table.Data.containsKey(object.getPK()))
throw new RepositoryRefuseException("Таблица " + Utils.Brackets(table.Name) + " уже содержит объект с ключом " + Utils.Brackets(object.getPK().toString()));
throw new RepositoryRefuseException("Таблица " + Utils_.Brackets(table.getName()) + " уже содержит объект с ключом " + Utils_.Brackets(object.getPK().toString()));
insert(table, object);
table.Data.put(object.getPK(), object);
return object;
@@ -108,7 +121,7 @@ public abstract class Database {
table.Data.remove(o.getPK());
return o;
} else
throw new RepositoryRefuseException("Таблица " + Utils.Brackets(table.Name) + " не содержит объект с ключом " + Utils.Brackets(to_delete.getPK().toString()));
throw new RepositoryRefuseException("Таблица " + Utils_.Brackets(table.getName()) + " не содержит объект с ключом " + Utils_.Brackets(to_delete.getPK().toString()));
}
public DBObject DeleteByPK(Class object_class, Object key) throws Exception {
DBTable table = tables.get(object_class);
@@ -118,7 +131,7 @@ public abstract class Database {
table.Data.remove(key);
return o;
} else
throw new RepositoryRefuseException("Таблица " + Utils.Brackets(table.Name) + " не содержит объект с ключом " + Utils.Brackets(key.toString()));
throw new RepositoryRefuseException("Таблица " + Utils_.Brackets(table.getName()) + " не содержит объект с ключом " + Utils_.Brackets(key.toString()));
}
// не работает с автоинкрементом.
public DBObject getObjectCopyByPK(Class table_class, Object pk) throws Exception {
@@ -168,19 +181,19 @@ public abstract class Database {
}
//</editor-fold>
//<editor-fold desc="работа с внешними ключами">
public <O extends DBObject, F extends DBObject> Vector<DBObject> getVectorByFK(O owner, Class<F> fk_class) {
Vector<DBObject> res = new Vector<>();
public <O extends DBObject, F extends DBObject> Vector<F> getVectorByFK(O owner, Class<F> fk_class) {
Vector<F> res = new Vector<>();
try {
for (Object o : tables.get(fk_class).Data.values()) {
if (fk_class.getField(owner.getFKName()).get(o).equals(owner.getPK())) res.add((DBObject) o);
if (fk_class.getField(owner.getFKName()).get(o).equals(owner.getPK())) res.add((F) o);
}
} catch (Exception e) {
Global.Log.PrintException(e);
Utils_.MainLog.PrintException(e);
}
return res;
}
public <F extends DBObject> void DeleteByFK(DBObject master, Class<F> fk_class) throws Exception {
Vector<DBObject> to_delete = getVectorByFK(master, fk_class);
Vector<F> to_delete = getVectorByFK(master, fk_class);
BeginTransaction();
for (DBObject object : to_delete)
Delete(object);
@@ -188,7 +201,7 @@ public abstract class Database {
}
//-----------
public <F extends DBObject> void DropByFK(DBObject master, Class<F> fk_class) throws Exception {
Vector<DBObject> to_drop = getVectorByFK(master, fk_class);
Vector<F> to_drop = getVectorByFK(master, fk_class);
BeginTransaction();
for (DBObject object : to_drop) {
fk_class.getField(master.getFKName()).set(object, master.getEmptyFK());
@@ -204,13 +217,27 @@ public abstract class Database {
if (fk_class.getField(owner.getFKName()).get(f).equals(owner.getPK())) res.put((K) f.getPK(), f);
}
} catch (Exception e) {
Global.Log.PrintException(e);
Utils_.MainLog.PrintException(e);
}
return res;
}
public <O extends DBObject, F extends iDBObject> LinkedHashMap<Integer, F> getMapByFKi(O owner, Class<F> fk_class) {
return getMapByFK(owner, fk_class, java.lang.Integer.class);
}
public <O extends iDBObject, F extends iDBObject> Vector<Integer> getFKi(
Integer owner_pk, Class<O> owner_class, Class<F> fk_class) {
String fk_name = owner_class.getSimpleName().toLowerCase() + "_id";
Vector<Integer> res = new Vector<>();
try {
for (Object o : tables.get(fk_class).Data.values()) {
F f = (F) o;
if (fk_class.getField(fk_name).get(f).equals(owner_pk)) res.add((Integer) f.getPK());
}
} catch (Exception e) {
Utils_.MainLog.PrintException(e);
}
return res;
}
//-
public <O extends DBObject, F extends DBObject> Vector<String> getVectorStringByFK(O owner, Class<F> fk_class) {
Vector<String> res = new Vector<>();
@@ -219,7 +246,7 @@ public abstract class Database {
if (fk_class.getField(owner.getFKName()).get(o).equals(owner.getPK())) res.add(o.toString());
}
} catch (Exception e) {
Global.Log.PrintException(e);
Utils_.MainLog.PrintException(e);
}
return res;
}
@@ -229,7 +256,7 @@ public abstract class Database {
(O) (tables.get(class_in).Data.get(pk)) : null;
}
public <O extends iDBObject> O getById(Class<O> class_in, int pk) {
return getByPK(class_in, pk, Constants.Nan);
return getByPK(class_in, pk, CommonConstants.Nan);
}
public <G, O extends DBObject, F extends DBObject> LinkedHashMap<G, F> getByFKAndGroupBy(O owner, Class<F> fk_class, String group_field, Class<G> group_class) {
LinkedHashMap<G, F> res = new LinkedHashMap<>();
@@ -240,7 +267,7 @@ public abstract class Database {
res.put((G) (fk_class.getField(group_field).get(f)), f);
}
} catch (Exception e) {
Global.Log.PrintException(e);
Utils_.MainLog.PrintException(e);
}
return res;
}
@@ -267,13 +294,63 @@ public abstract class Database {
protected abstract void resetAI(DBTable table) throws Exception;
//-
public void SaveLastSelections() {
for (DataSet dataSet : tables.values())
dataSet.SaveLastSelections();
for (DataSet dataSet : tables.values()) {
if (dataSet.getUI() != null)
dataSet.getUI().SaveLastCurrent();
}
}
public void RestoreLastSelections() {
for (DataSet dataSet : tables.values())
dataSet.RestoreLastSelections();
for (DataSet dataSet : tables.values()) {
if (dataSet.getUI() != null)
dataSet.getUI().RestoreLastCurrent();
}
}
//---
public abstract PassCode_2021 getSynchronizePassCode(); //если бд есть на сервере.
public boolean CheckCurrent(TextLog log, Class... tablesClasses) {
for (Class tableClass : tablesClasses) {
DBTable table = getTable(tableClass);
if (table.getUI() != null)
table.getUI().CheckCurrent(log);
}
return log.isEmpty();
}
public boolean canModifyCurrent(TextLog log, Class... tablesClasses) {
for (Class tableClass : tablesClasses) {
DBTable table = getTable(tableClass);
if (table.getUI() != null)
table.getUI().canModifyCurrent(log);
}
return log.isEmpty();
}
public abstract PassCode_ getSynchronizePassCode(); //если бд есть на сервере.
//--
public void ReplaceFileAndReconnect(File file_in) throws Exception {
Disconnect();
Utils_.forceDeleteWithCheck(getFile());
FileUtils.moveFile(file_in, getFile());
Connect();
prepareTablesStatements();
Synchronize();
}
public void DeleteDependencies(DBObject object) throws Exception {
DBTable object_table = getTable(object.getClass());
for (Class dep : object_table.getFKDependencies().keySet()) {
switch (object_table.getFKDependencies().get(dep).data) {
case NONE:
break;
case DROP:
DropByFK(object, dep);
break;
case DELETE:
DeleteByFK(object, dep);
break;
}
}
}
public void DropUI() {
SaveLastSelections();
}
public void ResetUI() {
RestoreLastSelections();
}
}

View File

@@ -1,32 +1,31 @@
package GlobalData.FormsParams;
import Common.Database.DBObject;
import Common.UI.Windows.FormType;
package Common.Database.Objects.DBForm;
import Common.Database.Objects.DBObject;
import com.sun.org.glassfish.gmbal.Description;
import java.awt.*;
public class DBForm extends DBObject {
@Description("PRIMARY KEY,UNIQUE, NOT NULL")
public FormType type = FormType.Undefined;
public String type = null;
public int X = 0;
public int Y = 0;
public int Width = 0;
public int Height = 0;
public DBForm(FormType type_, Window window) {
public DBForm(String type_, Window window) {
type = type_;
Init(window);
Fill(window);
}
public DBForm() {
}
public void Init(Window window) {
X = window.getX();
Y = window.getY();
Width = window.getWidth();
Height = window.getHeight();
}
public void Apply(Window window) {
window.setSize(Width, Height);
window.setLocation(X, Y);
}
public void Fill(Window window) {
X = window.getX();
Y = window.getY();
Width = window.getWidth();
Height = window.getHeight();
}
@Override
public Object getPK() {
return type;

View File

@@ -0,0 +1,7 @@
package Common.Database.Objects.DBForm;
import Common.Database.Tables.DBTable;
public class FormsDBTable extends DBTable<String, DBForm> {
public FormsDBTable() {
super(String.class, DBForm.class);
}
}

View File

@@ -1,7 +1,7 @@
package Common.Database;
import Common.UI.Selectable;
package Common.Database.Objects;
import Common.Utils.Index;
import Common.Utils.Utils;
import Common.Utils.Utils_;
import Common.Visual.Selectable;
import com.sun.org.glassfish.gmbal.Description;
import java.io.Serializable;
@@ -10,6 +10,12 @@ public abstract class DBObject implements Selectable, Serializable {
//<editor-fold desc="Selectable">
@Description("IGNORE")
private boolean selected = false;
//------
public DBObject() {
}
public DBObject(DBObject src) {
this.SynchronizeFields(src);
}
@Override
public boolean isSelected() {
return selected;
@@ -29,18 +35,13 @@ public abstract class DBObject implements Selectable, Serializable {
public Index getSelectionCounter() {
return null;
}
public boolean isVisible() {
return true;
}
public abstract Object getPK();
public String getBDialogName() {
return Utils.Brackets(getDialogName());
return Utils_.Brackets(getDialogName());
}
public String getDialogName() {
return getPK().toString();
}
//статус. например завершенность багрепорта или состояние задачи на запуск. как правило обладает цветным шрифтом.
//как объект будут называть по внешним ключам.
public String getFKName() {
return getClass().getSimpleName().toLowerCase() + "_id";
}
@@ -52,14 +53,7 @@ public abstract class DBObject implements Selectable, Serializable {
return getBDialogName();
}
//---
public void SynchronizeFields(DBObject src){
public void SynchronizeFields(DBObject src) {
selected = src.selected;
}
//------
public DBObject(){}
public DBObject(DBObject src){
this.SynchronizeFields(src);
}
//---------
}

View File

@@ -1,19 +1,19 @@
package GlobalData.Grid;
import Common.Current;
import Common.Database.DBObject;
package Common.Database.Objects.Grid;
import Common.Database.Objects.DBObject;
import com.sun.org.glassfish.gmbal.Description;
import java.util.Arrays;
import java.util.Vector;
import java.util.stream.Collectors;
public class Grid extends DBObject {
public class TableVisualData extends DBObject {
@Description("PRIMARY KEY, UNIQUE") //имя таблицы
public Current name = Current.Undefined;
public String name = null;
//todo запаковать в json (?)
@Description("DEFAULT ''")
public String sizes = ""; //ширины столбцов запакованные через |. вводить объекты ради них нецелесообразно.
public Grid() {
public TableVisualData() {
}
public Grid(Current name_in) {
public TableVisualData(String name_in) {
name = name_in;
sizes = "";
}

View File

@@ -0,0 +1,7 @@
package Common.Database.Objects.Grid;
import Common.Database.Tables.DBTable;
public class TablesVisualDatasDBTable extends DBTable<String, TableVisualData> {
public TablesVisualDatasDBTable() {
super(String.class, TableVisualData.class);
}
}

View File

@@ -1,22 +1,20 @@
package Visual_DVM_2021.PassStats;
import Common.Database.DBObject;
import Visual_DVM_2021.Passes.PassCode_2021;
import Visual_DVM_2021.Passes.Pass_2021;
package Common.Database.Objects.PassStats;
import Common.Database.Objects.DBObject;
import com.sun.org.glassfish.gmbal.Description;
public class PassStats extends DBObject {
@Description("PRIMARY KEY, UNIQUE")
public PassCode_2021 code = PassCode_2021.Undefined;
public String code = null;
//меняется только когда юзер кликает на пункте меню или же на кнопке.
public int Usages = 0;
public PassStats() {
}
public PassStats(Pass_2021 pass) {
code = pass.code();
public PassStats(String code_in) {
code = code_in;
}
public void Inc() {
Usages++;
}
public void Drop() {
public void Reset() {
Usages = 0;
}
public boolean HasUsages() {

View File

@@ -0,0 +1,19 @@
package Common.Database.Objects.PassStats;
import Common.Database.Tables.DBTable;
public class PassStatsDBTable extends DBTable<String, PassStats> {
public PassStatsDBTable() {
super(String.class, PassStats.class);
}
public void IncPassStat(String passName) throws Exception {
PassStats passStats = null;
if (Data.containsKey(passName)) {
passStats = Data.get(passName);
passStats.Inc();
getDb().Update(passStats);
} else {
passStats = new PassStats(passName);
passStats.Inc();
getDb().Insert(passStats);
}
}
}

View File

@@ -1,6 +1,6 @@
package GlobalData.Splitter;
import Common.Constants;
import Common.Database.DBObject;
package Common.Database.Objects.Splitter;
import Common.CommonConstants;
import Common.Database.Objects.DBObject;
import com.sun.org.glassfish.gmbal.Description;
import javax.swing.*;
@@ -8,7 +8,7 @@ public class Splitter extends DBObject {
@Description("PRIMARY KEY, UNIQUE")
public String name = "";
@Description("DEFAULT -1")
public int position = Constants.Nan;
public int position = CommonConstants.Nan;
public Splitter() {
}
public Splitter(JSplitPane splitPane) {

View File

@@ -1,6 +1,6 @@
package GlobalData.Splitter;
import Common.Database.DBTable;
import Common.Global;
package Common.Database.Objects.Splitter;
import Common.Database.Tables.DBTable;
import Common.Utils.Utils_;
import javax.swing.*;
import java.lang.reflect.Field;
@@ -32,7 +32,7 @@ public class SplittersDBTable extends DBTable<String, Splitter> {
}
}
} catch (Exception ex) {
Global.Log.PrintException(ex);
Utils_.MainLog.PrintException(ex);
}
}
public void Save(Object form) {
@@ -44,7 +44,7 @@ public class SplittersDBTable extends DBTable<String, Splitter> {
getDb().Update(splitter);
}
} catch (Exception ex) {
Global.Log.PrintException(ex);
Utils_.MainLog.PrintException(ex);
}
}
}

View File

@@ -1,26 +1,29 @@
package Common.Database;
import Common.Constants;
package Common.Database.Objects;
import Common.CommonConstants;
import com.google.gson.annotations.Expose;
import com.sun.org.glassfish.gmbal.Description;
//автоинкрементальный ключ
public class iDBObject extends DBObject {
@Expose
@Description("PRIMARY KEY,AUTOINCREMENT")
public int id;
public iDBObject() {
}
public iDBObject(iDBObject src) {
this.SynchronizeFields(src);
}
@Override
public Object getPK() {
return id;
}
@Override
public Object getEmptyFK() {
return Constants.Nan;
return CommonConstants.Nan;
}
//---
@Override
public void SynchronizeFields(DBObject src) {
super.SynchronizeFields(src);
id = ((iDBObject)src).id;
}
public iDBObject(){}
public iDBObject(iDBObject src){
this.SynchronizeFields(src);
id = ((iDBObject) src).id;
}
}

View File

@@ -1,9 +1,14 @@
package Common.Database;
import Common.Utils.Utils;
package Common.Database.Objects;
import Common.Utils.Utils_;
import com.sun.org.glassfish.gmbal.Description;
public abstract class nDBObject extends DBObject {
@Description("PRIMARY KEY, UNIQUE")
public String id = "";
public nDBObject(nDBObject src) {
this.SynchronizeFields(src);
}
public nDBObject() {
}
@Override
public Object getPK() {
return id;
@@ -12,17 +17,16 @@ public abstract class nDBObject extends DBObject {
public Object getEmptyFK() {
return "";
}
public String getFKName() {
return getClass().getSimpleName().toLowerCase() + "_id";
}
public void genName() {
id = Utils.getDateName(getClass().getSimpleName().toLowerCase());
id = Utils_.getDateName(getClass().getSimpleName().toLowerCase());
}
//-
@Override
public void SynchronizeFields(DBObject src) {
super.SynchronizeFields(src);
id = ((nDBObject)src).id;
id = ((nDBObject) src).id;
}
public nDBObject(nDBObject src){
this.SynchronizeFields(src);
}
public nDBObject(){}
}

View File

@@ -1,4 +1,4 @@
package Common.Database;
package Common.Database.Objects;
import java.util.Date;
//объект репозитория. ключ имя, и есть данные отправителя.
public class rDBObject extends nDBObject {
@@ -8,6 +8,11 @@ public class rDBObject extends nDBObject {
//-
public long date = 0;
public long change_date;
public rDBObject(rDBObject src) {
this.SynchronizeFields(src);
}
public rDBObject() {
}
public Date getDate() {
return new Date(date);
}
@@ -24,9 +29,4 @@ public class rDBObject extends nDBObject {
date = r.date;
change_date = r.change_date;
}
public rDBObject(rDBObject src) {
this.SynchronizeFields(src);
}
public rDBObject() {
}
}

View File

@@ -1,8 +1,10 @@
package Common.Database;
public class riDBObject extends iDBObject{
package Common.Database.Objects;
public class riDBObject extends iDBObject {
//-
//todo int useraccount_id по объекту аккаунтов. сюда и права. и проверку их.
public String sender_name = "";
public String sender_address = "";
//---
public String description = "";
//-
@Override

View File

@@ -1,7 +1,7 @@
package Repository;
public class RepositoryRefuseException extends Exception{
package Common.Database;
public class RepositoryRefuseException extends Exception {
//исключение для "штатных" отказов. например отсутствие объекта с заданным ключом.
public RepositoryRefuseException(String message_in){
public RepositoryRefuseException(String message_in) {
super(message_in);
}
}

View File

@@ -1,26 +1,26 @@
package Common.Database.SQLITE;
import Common.Database.DBObject;
import Common.Database.DBTable;
import Common.Database.DBTableColumn;
import Common.Database.Database;
import Common.UI.UI;
import Common.Utils.Utils;
import Visual_DVM_2021.Passes.PassException;
import javafx.util.Pair;
import Common.Database.Objects.DBObject;
import Common.Database.Tables.DBTable;
import Common.Database.Tables.DBTableColumn;
import Common.Passes.PassException;
import Common.Utils.Pair;
import Common.Utils.Utils_;
import Common.Visual.UI;
import java.io.File;
import java.sql.*;
import java.util.LinkedHashMap;
import java.util.Vector;
import static Common.Utils.Utils.requireNonNullElse;
import static Common.Utils.Utils_.requireNonNullElse;
public abstract class SQLiteDatabase extends Database {
protected Connection conn = null;
protected Statement statement = null;
protected ResultSet resSet = null;
public LinkedHashMap<Class<? extends DBObject>, PreparedStatement> insertStatements = new LinkedHashMap<>();
public LinkedHashMap<Class<? extends DBObject>, PreparedStatement> updateStatements = new LinkedHashMap<>();
public LinkedHashMap<Class<? extends DBObject>, PreparedStatement> deleteStatements = new LinkedHashMap<>();
protected Connection conn = null;
protected Statement statement = null;
protected ResultSet resSet = null;
//->>
public SQLiteDatabase(File file_in) {
super(file_in);
@@ -36,7 +36,7 @@ public abstract class SQLiteDatabase extends Database {
ex.printStackTrace();
conn = null;
System.gc();
Utils.sleep(2000);
Utils_.sleep(2000);
}
}
if (conn == null)
@@ -116,7 +116,7 @@ public abstract class SQLiteDatabase extends Database {
Vector<String> columns_names = new Vector<>();
for (DBTableColumn column : table.columns.values())
columns_names.add(column.toString());
cmd += Utils.RBrackets(String.join(",", columns_names));
cmd += Utils_.RBrackets(String.join(",", columns_names));
statement.execute(cmd);
}
}
@@ -135,8 +135,8 @@ public abstract class SQLiteDatabase extends Database {
}
insertStatements.put(table.d, conn.prepareStatement(
"INSERT OR REPLACE INTO " + table.QName() + " " +
Utils.RBrackets(String.join(",", column_names)) + " " + "VALUES " +
Utils.RBrackets(String.join(",", column_values))));
Utils_.RBrackets(String.join(",", column_names)) + " " + "VALUES " +
Utils_.RBrackets(String.join(",", column_values))));
//------------------------------------------------------------------------------->>
Vector<String> new_values = new Vector();
for (DBTableColumn column : table.columns.values()) {
@@ -184,9 +184,7 @@ public abstract class SQLiteDatabase extends Database {
try {
field_value = Enum.valueOf(enum_class, string);
} catch (Exception ignore) {
System.out.println(Utils.Brackets(string) + "not found");
field_value = enum_constants[0];
System.out.println(field_value);
}
} else field_value = enum_constants[0];
} else
@@ -196,7 +194,7 @@ public abstract class SQLiteDatabase extends Database {
if (field_value != null) {
table.d.getField(column.Name).set(o, field_value);
} else
throw new PassException("Ошибка при загрузке поля " + Utils.Brackets(column.Name) + " класса " + Utils.Brackets(table.d.getSimpleName()));
throw new PassException("Ошибка при загрузке поля " + Utils_.Brackets(column.Name) + " класса " + Utils_.Brackets(table.d.getSimpleName()));
}
return new Pair<>((K) o.getPK(), o);
}
@@ -257,5 +255,4 @@ public abstract class SQLiteDatabase extends Database {
}
//--
//https://stackoverflow.com/questions/8558099/sqlite-query-with-byte-where-clause
}

View File

@@ -1,43 +0,0 @@
package Common.Database;
import Common.UI.Menus_2023.StableMenuItem;
import Common.Utils.Utils;
import javax.swing.*;
public class TableFilter<D extends DBObject> {
DataSet table;
public JMenuItem menuItem; //пункт меню фильтра. ( возможно потом сделать и кнопку)
String description;
boolean active = false; //включен ли фильтр
public int count = 0;
protected boolean validate(D object) {
return true;
}
public boolean Validate(D object) {
boolean valid;
if (valid=validate(object))
count++;
return !active || valid;
}
static String getNotActiveIconPath() {
return "/icons/NotPick.png";
}
static String getActiveIconPath() {
return "/icons/Pick.png";
}
public TableFilter(DataSet table_in, String description_in) {
table = table_in;
menuItem = new StableMenuItem((description = description_in)+" (0)");
menuItem.addActionListener(e -> {
active = !active;
Mark();
table.ShowUI();
});
Mark();
}
public void Mark() {
menuItem.setIcon(Utils.getIcon(active ? getActiveIconPath() : getNotActiveIconPath()));
}
public void ShowDescriptionAndCount() {
menuItem.setText(description + " " + Utils.RBrackets(count));
}
}

View File

@@ -1,4 +1,4 @@
package Common.Database;
package Common.Database.Tables;
public enum ColumnType {
UNDEFINED,
INT,

View File

@@ -0,0 +1,65 @@
package Common.Database.Tables;
import Common.Database.Database;
import Common.Database.Objects.DBObject;
import java.lang.reflect.Field;
import java.util.Vector;
public abstract class DBTable<K, D extends DBObject> extends DataSet<K, D> {
//-
public DBTableColumn PK = null;
private Database db = null; //база данных - владелец таблицы.
public DBTable(Class<K> k_in, Class<D> d_in) {
super(k_in, d_in);
for (Field field : d.getFields()) {
DBTableColumn column = new DBTableColumn(field);
if ((!column.Ignore) && !columns.containsKey(column.Name)) {
columns.put(column.Name, column);
if (column.PrimaryKey) PK = column;
}
}
}
public Database getDb() {
return db;
}
public void setDb(Database db_in) {
db = db_in;
}
@Override
public String getPKName() {
return PK.Name;
}
@Override
public String toString() {
StringBuilder res = new StringBuilder(getName() + "\n");
for (DBTableColumn c : columns.values())
res.append(c).append("\n");
return res.toString();
}
boolean vectorContains(D object, Vector<D> vector) {
for (D v_object : vector) {
if (isEqual(object, v_object))
return true;
}
return false;
}
public void ActualizeData(Vector<D> old, Vector<D> actual) throws Exception {
//привести данные вектора old в соответствие с вектором new
//те, что в нем появились вставить, те что отсутствуют но есть в old удалить
Vector<D> to_delete = new Vector<>();
Vector<D> to_insert = new Vector<>();
for (D object : old) {
if (!vectorContains(object, actual))
to_delete.add(object);
}
for (D object : actual) {
if (!vectorContains(object, old))
to_insert.add(object);
}
db.BeginTransaction();
for (D object : to_delete)
db.Delete(object);
for (D object : to_insert)
db.Insert(object);
db.Commit();
}
}

View File

@@ -1,4 +1,4 @@
package Common.Database;
package Common.Database.Tables;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

View File

@@ -0,0 +1,94 @@
package Common.Database.Tables;
import Common.Database.Objects.DBObject;
import Common.Visual.DataSetControlForm;
import Common.Visual.UI;
import javax.swing.*;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.Vector;
public class DataSet<K, D extends DBObject> extends DataSetAnchestor {
public Class<D> d; //класс объектов.
public LinkedHashMap<K, D> Data = new LinkedHashMap<>(); //наполнение
Class<K> k; //класс первичного ключа.
//-
DataSetControlForm ui = null;
//--
public DataSet(Class<K> k_in, Class<D> d_in) {
k = k_in;
d = d_in;
}
//--
public String getPluralDescription() {
return "";
}
public String getSingleDescription() {
return "";
}
//---
protected DataSetControlForm createUI(JPanel mountPanel) {
return null;
}
//БАЗА ДАННЫХ
public String getName() {
return d.getSimpleName();
}
public String QName() {
return "\"" + getName() + "\"";
}
public String getPKName() {
return "";
} //получить имя ключевого поля. нужно для таблиц.
//ИНТЕРФЕЙС
public DataSetControlForm<D> getUI() {
return ui;
}
public void mountUI(JPanel mountPanel_in) {
UI.Clear(mountPanel_in);
ui = createUI(mountPanel_in);
}
public void ClearUI() {
if ((ui != null) && ui.isShown()) {
ui.ClearSelection();
ui.Clear();
}
}
public void ShowUI() {
if (ui != null) {
ui.Show();
}
}
public void ShowUI(Object key) {
if (ui != null) {
ui.Show(key);
}
}
//СОДЕРЖИМОЕ
public D getFirstRecord() {
return Data.values().stream().findFirst().orElse(null);
}
public Vector<D> getOrderedRecords(Comparator<D> comparator) {
Vector<D> res = new Vector<>(Data.values());
res.sort(comparator);
return res;
}
public void put(Object key, D object) {
Data.put((K) key, object);
}
public D get(Object key) {
return Data.get(key);
}
public void clear() {
Data.clear();
}
public int size() {
return Data.size();
}
public boolean containsKey(Object key) {
return Data.containsKey(key);
}
//--
public boolean isEqual(D o1, D o2) {
return false;
}
}

View File

@@ -1,4 +1,6 @@
package Common.Database;
package Common.Database.Tables;
import Common.Database.Objects.DBObject;
import java.util.LinkedHashMap;
public abstract class DataSetAnchestor {
//чтобы обмануть стирание типов во всех параметризованных полях. используется не во всех потомках.

View File

@@ -1,4 +1,4 @@
package Common.Database;
package Common.Database.Tables;
public class FKBehaviour {
public FKDataBehaviour data; //поведение данных внешнего ключа при удалении/модификации
public FKCurrentObjectBehaviuor ui; //поведение интерфейсов таблиц внешнего ключа при показе текущего объекта.

View File

@@ -1,4 +1,4 @@
package Common.Database;
package Common.Database.Tables;
public enum FKCurrentObjectBehaviuor {
PASSIVE,
ACTIVE

View File

@@ -1,4 +1,4 @@
package Common.Database;
package Common.Database.Tables;
//поведение таблиц имеющих внешние ключи
public enum FKDataBehaviour {
NONE,

View File

@@ -1,4 +1,5 @@
package Common.Database;
package Common.Database.Tables;
import Common.Database.Objects.iDBObject;
public abstract class iDBTable<D extends iDBObject> extends DBTable<Integer, D> {
public iDBTable(Class<D> d_in) {
super(Integer.class, d_in);

View File

@@ -0,0 +1,29 @@
package Common.Database;
import Common.Database.Objects.DBForm.FormsDBTable;
import Common.Database.Objects.Grid.TablesVisualDatasDBTable;
import Common.Database.Objects.PassStats.PassStatsDBTable;
import Common.Database.Objects.Splitter.SplittersDBTable;
import Common.Database.SQLITE.SQLiteDatabase;
import Common.Passes.PassCode_;
import java.io.File;
public class VisualiserDatabase extends SQLiteDatabase {
public FormsDBTable forms;
public TablesVisualDatasDBTable tablesVisualData;
public SplittersDBTable splitters;
public PassStatsDBTable passStats;
public VisualiserDatabase(File file_in) {
super(file_in);
}
@Override
protected void initAllTables() throws Exception {
addTable(forms = new FormsDBTable());
addTable(tablesVisualData = new TablesVisualDatasDBTable());
addTable(splitters = new SplittersDBTable());
addTable(passStats = new PassStatsDBTable());
}
@Override
public PassCode_ getSynchronizePassCode() {
return null;
}
}

View File

@@ -1,405 +0,0 @@
package Common;
import Common.Database.DataSet;
import Common.UI.Menus_2023.ComponentsMenuBar.ComponentsMenuBar;
import Common.UI.UI;
import Common.Utils.Utils;
import GlobalData.GlobalDatabase;
import GlobalData.Settings.DBSetting;
import GlobalData.Settings.SettingName;
import ProjectData.ProjectView;
import Repository.Component.*;
import Repository.Component.PerformanceAnalyzer.PerformanceAnalyzer;
import Repository.Component.Sapfor.MessagesServer;
import Repository.Component.Sapfor.Sapfor_F;
import Repository.Component.Sapfor.TransformationPermission;
import Repository.Server.ComponentsServer;
import TestingSystem.SAPFOR.PackageModeSupervisor;
import TestingSystem.Common.TestingServer;
import Visual_DVM_2021.Passes.PassCode_2021;
import Visual_DVM_2021.Passes.Pass_2021;
import Visual_DVM_2021.UI.Interface.Loggable;
import org.fife.ui.rsyntaxtextarea.AbstractTokenMakerFactory;
import org.fife.ui.rsyntaxtextarea.TokenMakerFactory;
import java.io.File;
import java.nio.file.Paths;
import java.util.Vector;
public class Global {
//--------------------------------------------------
//текущая папка системы. в отличие от шарпа никогда не должна меняться.
public static final String components = "Components";
public static final String data = "Data";
public static final String Bugs = "Bugs";
public static final String BackUps = "BackUps";
public static final String DataBackUps = "DataBackUps";
public static final String Temp = "Temp";
public static final String Projects = "Projects";
public static final String CompilationTasks = "CompilationTasks";
public static final String RunTasks = "RunTasks";
public static final String Sts = "Sts";
public static final String Repo = "Repo";
public static final String Tests = "Tests";
public static final String Packages = "Packages";
public static final String PerformanceAnalyzer = "PerformanceAnalyzer";
public static GlobalProperties properties = new GlobalProperties();
//</editor-fold>
//------------------------------------------------------
public static boolean enable_text_changed = false;
//---
public static boolean files_multiselection = false;
public static boolean versions_multiselection = false;
//---
public static TransformationPermission transformationPermission = TransformationPermission.None;
//??
public static DataSet<ComponentType, Component> Components = null;
public static MessagesServer messagesServer = null;
//--------------------------------------------------
public static GlobalDatabase db = null;
public static String[] admins_mails = new String[]{
"vmk-post@yandex.ru",
"79854210702@ya.ru"
};
//-
public static String Home;
public static File ComponentsDirectory;
public static File DataDirectory;
public static File BugReportsDirectory;
public static File BackUpsDirectory;
public static File TempDirectory;
public static File ProjectsDirectory;
public static File CompilationTasksDirectory;
public static File RunTasksDirectory;
public static File StsDirectory;
public static File RepoDirectory;
public static File TestsDirectory;
public static File PerformanceAnalyzerDirectory;
public static File DataBackUpsDirectory;
public static File PackagesDirectory;
public static File SapforsDirectory;
public static File SapforPackagesDirectory;
//------------------------------------------------------------------
public static Visualiser visualiser = null;
public static Visualizer_2 visualizer_2 = null;
public static PerformanceAnalyzer performanceAnalyzer = null;
//------------------------------------------------------------------
public static ComponentsServer componentsServer = new ComponentsServer();
public static TestingServer testingServer = new TestingServer();
//------------------------------------------------------------------
public static boolean isWindows;
public static int bad_state = 0;
public static int need_update = 0;
public static int need_publish = 0;
//------------------------------------------------------------------------
public static Loggable Log;
public static void SynschronizeProperties() {
try {
File new_propertiesFile = Paths.get(Home, "properties").toFile();
if (new_propertiesFile.exists())
properties = (GlobalProperties) Utils.jsonFromFile(new_propertiesFile, GlobalProperties.class);
Utils.jsonToFile(properties, new_propertiesFile);
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void CheckVisualiserDirectories() {
Utils.CheckDirectory(ComponentsDirectory = Paths.get(Home, components).toFile());
Utils.CheckAndCleanDirectory(TempDirectory = Paths.get(Home, Temp).toFile());
Utils.CheckDirectory(DataDirectory = Paths.get(Home, data).toFile());
//-
Utils.CheckDirectory(RepoDirectory = Paths.get(Home, Repo).toFile());
Utils.CheckDirectory(BugReportsDirectory = Paths.get(Home, Bugs).toFile());
Utils.CheckDirectory(BackUpsDirectory = Paths.get(Home, BackUps).toFile());
Utils.CheckDirectory(ProjectsDirectory = Paths.get(Home, Projects).toFile());
Utils.CheckDirectory(CompilationTasksDirectory = Paths.get(Home, CompilationTasks).toFile());
Utils.CheckDirectory(RunTasksDirectory = Paths.get(Home, RunTasks).toFile());
Utils.CheckDirectory(StsDirectory = Paths.get(Home, Sts).toFile());
Utils.CheckDirectory(TestsDirectory = Paths.get(Home, Tests).toFile());
Utils.CheckDirectory(PerformanceAnalyzerDirectory = Paths.get(Home, PerformanceAnalyzer).toFile());
Utils.CheckAndCleanDirectory(SapforPackagesDirectory = Paths.get(Home, "SapforPackages").toFile());
}
public static void CheckServerDirectories() {
Utils.CheckDirectory(ComponentsDirectory = Paths.get(Home, components).toFile());
Utils.CheckAndCleanDirectory(TempDirectory = Paths.get(Home, Temp).toFile());
Utils.CheckDirectory(DataDirectory = Paths.get(Home, data).toFile());
//-
Utils.CheckDirectory(BugReportsDirectory = Paths.get(Home, Bugs).toFile());
Utils.CheckDirectory(DataBackUpsDirectory = Paths.get(Home, DataBackUps).toFile());
}
public static void CheckTestingSystemDirectories() {
Utils.CheckDirectory(ComponentsDirectory = Paths.get(Home, components).toFile());
Utils.CheckAndCleanDirectory(TempDirectory = Paths.get(Home, Temp).toFile());
Utils.CheckDirectory(DataDirectory = Paths.get(Home, data).toFile());
//-
Utils.CheckDirectory(TestsDirectory = Paths.get(Home, Tests).toFile());
Utils.CheckDirectory(RepoDirectory = Paths.get(Home, Repo).toFile());
Utils.CheckDirectory(PackagesDirectory = Paths.get(Home, Packages).toFile());
Utils.CheckDirectory(SapforsDirectory = Paths.get(Home, "Sapfors").toFile());
Utils.CheckDirectory(SapforPackagesDirectory = Paths.get(Home, "SapforPackages").toFile());
}
public static void CreateLog() {
Log = new Loggable() {
@Override
public String getLogHomePath() {
return Paths.get(System.getProperty("user.dir"), "Components").toString();
}
@Override
public String getLogName() {
return "VisualDVM";
}
};
Log.ClearLog();
}
//-
public static void FinishApplication() {
try {
if (db != null) db.Disconnect();
if (componentsServer.db != null)
componentsServer.db.Disconnect();
if (testingServer.db != null)
testingServer.db.Disconnect();
if (visualizer_2 != null)
visualizer_2.Shutdown();
if (messagesServer != null)
messagesServer.Shutdown();
if (performanceAnalyzer != null)
performanceAnalyzer.Shutdown();
} catch (Exception ex) {
if (Log != null) {
Log.PrintException(ex);
} else {
ex.printStackTrace();
}
}
System.exit(0);
}
public static void ActivateDB() throws Exception {
db = new GlobalDatabase();
db.Connect();
db.CreateAllTables();
db.prepareTablesStatements();
db.Synchronize();
}
public static void RefreshUpdatesStatus() {
Components.RefreshUI();
ValidateComponentsStates();
if (UI.HasMainWindow())
UI.getMainWindow().ShowUpdatesIcon();
}
public static boolean ValidateComponentsStates() {
bad_state = need_update = need_publish = 0;
for (Component component : Components.Data.values()) {
if (component.isVisible()) {
switch (component.getState()) {
case Not_found:
case Unknown_version:
case Old_version:
if (component.isNecessary())
bad_state++;
component.Select(true);
break;
case Needs_update:
need_update++;
component.Select(true);
break;
case Needs_publish:
need_publish++;
break;
default:
component.Select(false);
break;
}
}
}
return (bad_state == 0);
}
//возможно заменить settings на properties
public static DBSetting getSetting(SettingName settingName) throws Exception {
switch (Current.mode) {
case Normal:
return db.settings.get(settingName);
default:
return null;
}
}
public static void changeSetting(SettingName settingName, Object new_value) throws Exception {
Pass_2021.passes.get(PassCode_2021.UpdateSetting).Do(settingName, new_value);
}
public static String packSapforSettings() {
Vector<String> res_ = new Vector<>();
Vector<SettingName> forbidden = new Vector<>();
forbidden.add(SettingName.GCOVLimit);
forbidden.add(SettingName.Precompilation);
forbidden.add(SettingName.DVMConvertationOptions);
forbidden.add(SettingName.SaveModifications);
for (DBSetting setting : db.settings.getSettingsByOwner(ComponentType.SapforOptions)) {
if (!forbidden.contains(setting.Name))
res_.add(setting.Value);
}
return String.join("|", res_);
}
//--
public static void removeOldDatabases() {
File data = Paths.get(System.getProperty("user.dir"), "Data").toFile();
File[] files = data.listFiles();
if (files != null) {
for (File file : files) {
if (file.getName().contains(Constants.old_tests_db_name)) {
System.out.println("found "+Utils.Brackets(file.getAbsolutePath()));
try {
Utils.forceDeleteWithCheck(file);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
}
public static void NormalMode(int port) throws Exception {
isWindows = System.getProperty("os.name").startsWith("Windows");
removeOldDatabases();
CheckVisualiserDirectories();
CreateLog();
//-
visualizer_2 = new Visualizer_2(port);
visualizer_2.Connect();
visualizer_2.refreshPid();
//если делать раньше, то не удастся убить сервер.
if (Utils.ContainsCyrillic(Global.Home)) {
UI.Info("В пути к корневой папке " + Utils.DQuotes(Global.Home) + "\n" +
"Найдены русские буквы.\n" +
"Визуализатор завершает работу."); //
FinishApplication();
}
messagesServer = new MessagesServer();
messagesServer.Start();
//создание списков служебных объектов
Current.CreateAll();
UI.CreateAll();
Pass_2021.CreateAll();
Utils.init();
//единственное меню до остальных.
UI.menuBars.put(ComponentsSet.class, new ComponentsMenuBar());
Components = new ComponentsSet();
Current.set(Current.ProjectView, ProjectView.Files);
Components.put(ComponentType.Visualiser, visualiser = new Visualiser());
Components.put(ComponentType.Sapfor_F, (Component) Current.set(Current.Sapfor, new Sapfor_F()));
Components.put(ComponentType.Visualizer_2, visualizer_2);
Components.put(ComponentType.PerformanceAnalyzer, performanceAnalyzer = new PerformanceAnalyzer());
Components.put(ComponentType.Instruction, new Instruction());
//-
for (Component component : Components.Data.values())
if (component.isVisible()) component.InitialVersionCheck();
//-
UI.CreateComponentsForm();
AbstractTokenMakerFactory atmf = (AbstractTokenMakerFactory) TokenMakerFactory.getDefaultInstance();
atmf.putMapping("text/FortranSPF", "Common.UI.Themes.FortranSPFTokenMaker");
atmf.putMapping("text/FreeFortranSPF", "Common.UI.Themes.FreeFortranSPFTokenMaker");
// FoldParserManager.get().addFoldParserMapping("text/FortranSPF", new FortranFolder()); блоки кода. todo
//-------->>
//-------->>
if (properties.AutoUpdateSearch)
Pass_2021.passes.get(PassCode_2021.GetComponentsActualVersions).Do();
ValidateComponentsStates();
if ((need_update > 0) || (bad_state > 0)) {
boolean flag = true;
do {
UI.ShowComponentsWindow();
if (flag = (!ValidateComponentsStates())) {
if (!UI.Question("Найдено " + bad_state + " некорректных необходимых компонент.Работа визуализатора невозможна.\n" +
"Вернуться к окну компонент"
)) {
UI.Info("Визуализатор завершает работу.");
FinishApplication();
}
}
} while (flag);
}
//---
ActivateDB(); //тут current getAccount; роль по умолчанию всегда неизвестна.
///--------------
Pass_2021.passes.get(PassCode_2021.CheckAccount).Do();
//---------------
componentsServer.ActivateDB();
testingServer.ActivateDB();
//-- чисто чтобы создать таблицы. соединения на стороне клиента не предвидится.
testingServer.SetCurrentAccountDB(Current.getAccount().email);
//--->>>
if (db.settings.get(SettingName.AutoBugReportsLoad).toBoolean())
Pass_2021.passes.get(PassCode_2021.SynchronizeBugReports).Do();
//--
if (db.settings.get(SettingName.AutoTestsLoad).toBoolean())
Pass_2021.passes.get(PassCode_2021.SynchronizeTests).Do();
Pass_2021.CheckAllStats();
Current.getSapfor().refreshPid(); //без сапфора сюда это все равно не дойдет.
UI.CreateMenus();
UI.CreateWindows();
}
public static void ServerMode() throws Exception {
isWindows = false;
CheckServerDirectories();
CreateLog();
componentsServer = new ComponentsServer();
componentsServer.ActivateDB();
componentsServer.Start();
System.exit(0);
}
public static void TestingSystemMode() throws Exception {
isWindows = false;
CheckTestingSystemDirectories();
CreateLog();
testingServer = new TestingServer();
testingServer.ActivateDB();
testingServer.Start();
System.exit(0);
}
public static void PackageMode() throws Exception {
isWindows = System.getProperty("os.name").startsWith("Windows");
Log = new Loggable() {
@Override
public String getLogHomePath() {
return Home;
}
@Override
public String getLogName() {
return "Package";
}
};
Log.ClearLog();
PackageModeSupervisor planner = new PackageModeSupervisor();
planner.Start();
}
//---
public static void Init(String... args) {
System.out.println("VisualSapfor.jar started..");
Home = System.getProperty("user.dir"); //если Linux, дает без слеша в конце !!!
System.out.println("home directory is" + Utils.Brackets(Home));
//---
SynschronizeProperties();
Current.mode = properties.Mode;
System.out.println("mode is " + Current.mode);
try {
switch (Current.mode) {
case Normal:
NormalMode(Integer.parseInt(args[1]));
break;
case Server:
ServerMode();
break;
case Testing:
TestingSystemMode();
break;
case Package:
PackageMode();
break;
case Undefined:
break;
}
} catch (Exception ex) {
System.out.println("VISUALISER FAILED");
ex.printStackTrace();
if (Global.Log != null)
Global.Log.PrintException(ex);
FinishApplication();
}
}
}

View File

@@ -1,93 +0,0 @@
package Common;
import com.google.gson.annotations.Expose;
import java.io.File;
import java.nio.file.Paths;
public class GlobalProperties extends Properties {
@Override
public String getFieldDescription(String fieldName) {
switch (fieldName) {
case "ShowPassesDone":
return "Сообщать об успешном выполнении проходов";
case "ConfirmPassesStart":
return "Запрашивать подтверждения начала выполнения проходов";
case "FocusPassesResult":
return "Переходить на результирующую вкладку проходов по их завершении";
default:
return "?";
}
}
@Expose
public Current.Mode Mode = Current.Mode.Normal;
//---
@Expose
public int SocketTimeout = 5000;
@Expose
public boolean OldServer = false;
//---
@Expose
public String SMTPHost = "smtp.mail.ru";
@Expose
public int SMTPPort = 465;
@Expose
public int MailSocketPort = 465;
//---
@Expose
public String BackupWorkspace = "_sapfor_x64_backups";
@Expose
public int BackupHour = 5;
@Expose
public int BackupMinute = 0;
@Expose
public boolean EmailAdminsOnStart = false;
//---
@Expose
public boolean AutoUpdateSearch = true;
// настройки визуализатора. по крайней мере, флаги.
@Expose
public boolean ConfirmPassesStart = true;
@Expose
public boolean ShowPassesDone = true;
@Expose
public boolean FocusPassesResult = true;
@Expose
public String GlobalDBName = "db7.sqlite";
@Expose
public String ProjectDBName = "new_project_base.sqlite";
@Expose
public String BugReportsDBName = "bug_reports.sqlite";
@Expose
public String TestsDBName = "tests.sqlite";
//-
@Expose
public int ComponentsWindowWidth = 650;
@Expose
public int ComponentsWindowHeight = 250;
//-
@Expose
public String VisualiserPath = "";
@Expose
public String Sapfor_FPath = "";
@Expose
public String Visualizer_2Path = "";
@Expose
public String InstructionPath = "";
@Expose
public String PerformanceAnalyzerPath = "";
@Expose
public int ComponentsBackUpsCount=10;
//- тестирование.
@Expose
public int TestingKernels = 4; //число ядер для тестирования
@Expose
public boolean AutoCheckTesting = false; // проверять ли задачи тестирования при включенном визуализаторе.
@Expose
public int CheckTestingIntervalSeconds = 10; //интервал автопроверки тестирования
@Expose
public boolean EmailOnTestingProgress = false; //включено ли оповещение по email о результатах тестирования.
//-
@Override
public File getFile() {
return Paths.get(System.getProperty("user.dir"),"properties").toFile();
}
}

146
src/Common/MainModule_.java Normal file
View File

@@ -0,0 +1,146 @@
package Common;
import Common.Database.Objects.PassStats.PassStats;
import Common.Database.VisualiserDatabase;
import Common.Passes.Pass;
import Common.Passes.PassCode_;
import Common.Utils.TextLog;
import Common.Visual.UIModule_;
import javax.swing.*;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.Vector;
//Основной объект визуализатора.
public abstract class MainModule_<D extends VisualiserDatabase, U extends UIModule_> {
public static MainModule_ instance = null; //текущий экземпляр. всегда один.
//--
D db = null;
Class<D> db_class = null;
LinkedHashMap<Current_, Object> objects = null; //Current/ большинство выведено
//--
LinkedHashMap<PassCode_, Pass> passes = null;
//--
U ui = null;
Class<U> ui_class = null;
MenuElement[] last_menu_path = null;
//--
public MainModule_(Class<D> db_class_in, Class<U> ui_class_in) throws Exception {
ui_class = ui_class_in;
db_class = db_class_in;
instance = this;
}
public void Init() throws Exception {
//нужно потому что внутри есть ссылки на экземпляр объекта, и конструктор не годится
if (ui_class != null) {
ui = ui_class.newInstance();
}
//--
createPasses();
//-
objects = new LinkedHashMap<>();
}
//ИНТЕРФЕЙС
public boolean hasUI() {
return ui != null;
}
public U getUI() {
return ui;
}
public boolean hasLastMenuPath() {
return last_menu_path != null;
}
public MenuElement[] getLastMenuPath() {
return last_menu_path;
}
public MenuElement[] setLastMenuPath(MenuElement[] last_menu_path_in) {
return last_menu_path = last_menu_path_in;
}
//БАЗА ДАННЫХ И ТЕКУЩИЕ ОБЪЕКТЫ
public D getDb() {
return db;
}
public void ActivateDB() throws Exception {
db = db_class.newInstance();
db.Connect();
db.CreateAllTables();
db.prepareTablesStatements();
db.Synchronize();
}
public void DeactivateDB() throws Exception {
if (db != null) db.Disconnect();
}
public Object get(Current_ name) {
if (!objects.containsKey(name))
objects.put(name, null);
return objects.get(name);
}
public Object set(Current_ name, Object object) {
if (objects.containsKey(name))
objects.replace(name, object);
else objects.put(name, object);
return object;
}
public boolean Check(TextLog Log, Current_... names) {
for (Current_ name : names)
if (get(name) == null)
Log.Writeln_(name.getDescription() + " не выбран(а)");
return Log.isEmpty();
}
//ПРОХОДЫ
public abstract Class getPassCodesEnum();
public abstract String getAllPassesClassPrefix();
private void createPasses() {
passes = new LinkedHashMap<>();
for (Object code : getPassCodesEnum().getEnumConstants()) {
try {
Class<?> clazz = Class.forName(getAllPassesClassPrefix() + code.toString());
Pass pass = ((Pass) clazz.newInstance());
passes.put((PassCode_) code, pass);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
public void setPassesControlsVisible(boolean flag, PassCode_... codes_in) {
for (PassCode_ code_in : codes_in)
getPass(code_in).setControlsVisible(flag);
}
public Pass getPass(PassCode_ code) {
return passes.get(code);
}
public String getPassDescription(String passName) {
return ((PassCode_) Enum.valueOf(MainModule_.instance.getPassCodesEnum(), passName)).getDescription();
}
public Vector<Pass> getFirstAccessPasses() {
Vector<PassStats> sortedStats = new Vector<>(getDb().passStats.Data.values());
sortedStats.sort(new Comparator<PassStats>() {
@Override
public int compare(PassStats o1, PassStats o2) {
return Integer.compare(o2.Usages, o1.Usages);
}
});
Vector<Pass> res = new Vector<>();
for (PassStats passStats : sortedStats) {
PassCode_ passCode = (PassCode_) Enum.valueOf(getPassCodesEnum(), passStats.code);
//--
Pass pass = getPass(passCode);
if (pass.hasStats())
res.add(getPass(passCode));
//--
}
return res;
}
//---
public int getFirstAccessPassesCount() {
return 0;
}
public boolean confirmPassesStart() {
return false;
}
public boolean confirmPassesDone() {
return false;
}
public boolean focusPassesResult() {
return false;
}
}

View File

@@ -0,0 +1,13 @@
package Common.MainModules;
import Common.Database.Database;
import Common.Visual.UIModule_;
public class _MainModule {
protected Database db = null;
protected UIModule_ ui = null;
public boolean hasUI() {
return ui != null;
}
public Database getDb() {
return db;
}
}

View File

@@ -1,25 +1,30 @@
package Visual_DVM_2021.Passes;
import Common.Database.DBObject;
package Common.Passes;
import Common.Database.Objects.DBObject;
public abstract class AddObjectPass<D extends DBObject> extends ObjectPass<D> {
public AddObjectPass(Class<D> d_in) {
super(d_in);
}
public Class<? extends DBObject> getOwner() {
protected Class<? extends DBObject> getOwnerClass() {
return null;
}
protected DBObject getOwner() {
return getDb().getTable(getOwnerClass()).getUI().getCurrent();
}
@Override
public String getDescription_() {
return "добавление";
}
@Override
protected boolean canStart(Object... args) throws Exception {
target = d.newInstance();
return
((getOwner() == null) || (getDb().tables.get(getOwner()).CheckCurrent(Log))) &&
fillObjectFields();
return ((getOwnerClass() == null) || (getDb().getTable(getOwnerClass()).getUI().CheckCurrent(Log))) && fillObjectFields();
}
protected boolean fillObjectFields() throws Exception {
return getTable().ShowAddObjectDialog(target);
return getTable().getUI().ShowAddObjectDialog(target);
}
@Override
public String getIconPath() {
return "/icons/RedAdd.png";
return "/Common/icons/RedAdd.png";
}
@Override
protected void body() throws Exception {

View File

@@ -1,17 +1,21 @@
package Visual_DVM_2021.Passes;
import Common.Database.DBObject;
package Common.Passes;
import Common.Database.Objects.DBObject;
public abstract class DeleteObjectPass<D extends DBObject> extends ObjectPass<D> {
public DeleteObjectPass(Class<D> d_in) {
super(d_in);
}
@Override
public String getDescription_() {
return "удаление";
}
@Override
public String getIconPath() {
return "/icons/Delete.png";
return "/Common/icons/Delete.png";
}
@Override
protected boolean canStart(Object... args) throws Exception {
target = (D) getTable().getCurrent();
return getTable().CheckCurrent(Log) && getTable().ShowDeleteObjectDialog(target);
target = (D) getTable().getUI().getCurrent();
return getTable().getUI().CheckCurrent(Log) && getTable().getUI().ShowDeleteObjectDialog(target);
}
//Очищаем все связанные таблицы, чтобы не допустить перерисовки во время удаления объекта.
@Override
@@ -23,7 +27,7 @@ public abstract class DeleteObjectPass<D extends DBObject> extends ObjectPass<D>
case DROP:
break;
case DELETE:
getDb().tables.get(dep).ClearUI();
getDb().getTable(dep).ClearUI();
break;
}
}
@@ -31,25 +35,11 @@ public abstract class DeleteObjectPass<D extends DBObject> extends ObjectPass<D>
@Override
protected void body() throws Exception {
getDb().Delete(target);
for (Class dep : getTable().getFKDependencies().keySet()) {
switch (getTable().getFKDependencies().get(dep).data) {
case NONE:
break;
case DROP:
getDb().DropByFK(target, dep);
break;
case DELETE:
getDb().DeleteByFK(target, dep);
break;
}
}
getDb().DeleteDependencies(target);
}
//тут именно на финише, чтобы в любом случае вся таблица всегда была видна.
@Override
protected void performFinish() throws Exception {
protected void showFinish() throws Exception {
getTable().ShowUI();
for (Class dep : getTable().getFKDependencies().keySet()) {
getDb().tables.get(dep).RefreshUI();
}
}
}

View File

@@ -0,0 +1,58 @@
package Common.Passes;
import Common.Database.Objects.DBObject;
public abstract class DeleteObjectsPass<D extends DBObject> extends ObjectsPass<D> {
public DeleteObjectsPass(Class<D> d_in) {
super(d_in);
}
public String getDescription_() {
return "удаление";
}
@Override
public String getIconPath() {
return "/Common/icons/Delete.png";
}
@Override
protected boolean canStart(Object... args) throws Exception {
if (!getTable().getUI().CheckSelectedOrCurrent(Log))
return false;
target = getTable().getUI().getSelectedOrCurrent();
return getTable().getUI().ShowDeleteObjectsDialog(target.size());
}
//Очищаем все связанные таблицы, чтобы не допустить перерисовки во время удаления объекта.
@Override
protected void showPreparation() throws Exception {
getTable().ClearUI();
for (Class dep : getTable().getFKDependencies().keySet()) {
switch (getTable().getFKDependencies().get(dep).data) {
case NONE:
case DROP:
break;
case DELETE:
getDb().getTable(dep).ClearUI();
break;
}
}
}
@Override
protected void body() throws Exception {
for (D d : target) {
getDb().Delete(d);
for (Class dep : getTable().getFKDependencies().keySet()) {
switch (getTable().getFKDependencies().get(dep).data) {
case NONE:
break;
case DROP:
getDb().DropByFK(d, dep);
break;
case DELETE:
getDb().DeleteByFK(d, dep);
break;
}
}
}
}
@Override
protected void showFinish() throws Exception {
getTable().ShowUI();
}
}

View File

@@ -0,0 +1,34 @@
package Common.Passes;
import Common.Database.Objects.DBObject;
public abstract class EditObjectPass<D extends DBObject> extends ObjectPass<D> {
public EditObjectPass(Class<D> d_in) {
super(d_in);
}
public String getDescription_() {
return "редактирование";
}
@Override
public String getIconPath() {
return "/Common/icons/Edit.png";
}
protected boolean fillObjectFields() throws Exception {
return getTable().getUI().ShowEditObjectDialog(target);
}
@Override
protected boolean canStart(Object... args) throws Exception {
target = (D) getTable().getUI().getCurrent();
return getTable().getUI().CheckCurrent(Log) && fillObjectFields();
}
@Override
protected void body() throws Exception {
getDb().Update(target);
}
@Override
protected void showFinish() throws Exception {
getTable().ShowUI(target.getPK());
for (Class dep : getTable().getFKDependencies().keySet()) {
if (getDb().getTable(dep).getUI() != null)
getDb().getTable(dep).getUI().RedrawControl();
}
}
}

View File

@@ -0,0 +1,29 @@
package Common.Passes;
import Common.Database.Database;
import Common.Database.Objects.DBObject;
import Common.Database.Tables.DBTable;
import Common.MainModule_;
public abstract class ObjectPass<D extends DBObject> extends Pass<D> {
protected Class<D> d; //класс объектов.
public ObjectPass(Class<D> d_in) {
d = d_in;
}
protected Database getDb() {
return MainModule_.instance.getDb();
}
//источник данных
public DBTable getTable() {
return getDb().getTable(d);
} //таблица в источнике данных
public String getDescription_() {
return "?";
}
@Override
public String getDescription() {
return getTable().getSingleDescription() + ": " + getDescription_();
}
@Override//sorted
public String getButtonText() {
return "";
}
}

View File

@@ -0,0 +1,31 @@
package Common.Passes;
import Common.Database.Database;
import Common.Database.Objects.DBObject;
import Common.Database.Tables.DBTable;
import Common.MainModule_;
import java.util.Vector;
//массовый проход с объектами. на данный момент удаление.
public abstract class ObjectsPass<D extends DBObject> extends Pass<Vector<D>> {
protected Class<D> d; //класс объектов.
public ObjectsPass(Class<D> d_in) {
d = d_in;
}
protected Database getDb() {
return MainModule_.instance.getDb();
}
public DBTable getTable() {
return getDb().getTable(d);
} //таблица в источнике данных
@Override
public String getButtonText() {
return "";
}
public String getDescription_() {
return "?";
}
@Override
public String getDescription() {
return getTable().getPluralDescription() + ": " + getDescription_();
}
}

View File

@@ -1,83 +1,51 @@
package Visual_DVM_2021.Passes;
import Common.Current;
import Common.Global;
import Common.UI.DebugPrintLevel;
import Common.UI.Menus_2023.PassButton;
import Common.UI.Menus_2023.PassControl;
import Common.UI.Menus_2023.StablePassMenuItem;
import Common.UI.UI;
package Common.Passes;
import Common.MainModule_;
import Common.Utils.Stopwatch;
import Common.Utils.TextLog;
import Common.Utils.Utils;
import Visual_DVM_2021.PassStats.PassStats;
import Visual_DVM_2021.Passes.UI.PassForm;
import Common.Utils.Utils_;
import Common.Visual.Controls.PassButton;
import Common.Visual.Controls.PassControl;
import Common.Visual.Controls.StablePassMenuItem;
import Common.Visual.UI;
import Common.Visual.Windows.PassForm;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.util.LinkedHashMap;
import java.util.Stack;
import java.util.Vector;
import java.util.concurrent.Semaphore;
public class Pass_2021<T> {
public static Vector<Pass_2021> FAPasses = new Vector<>();
//</editor-fold>
//-
public static LinkedHashMap<PassCode_2021, Pass_2021> passes = new LinkedHashMap<>();
public PassStats stats = null;
public class Pass<T> {
public int callsCount = 0; //число вызовов прохода за текущий сеанс визуализатора.
public T target; //главный аргумент.
public PassState state = PassState.Inactive; //текущее состояние прохода.
public Semaphore animation_sem;
//--------------
public boolean ui_visible = true;
public Vector<PassControl> controls = new Vector<>();
protected TextLog Log; //внутренний журнал прохода.
public TextLog Log; //внутренний журнал прохода.
protected boolean interrupt;
protected SwingWorker dispatcher = null;
private PassForm form = null;
protected JMenuItem menuItem = null;
private PassForm form = null;
private JButton button = null;
private JButton tabButton = null;
private Exception last_error; //последнее пойманное исключение выполнения.
public void addControl(PassControl control_in) {
control_in.setVisible(ui_visible);
controls.add(control_in);
}
//->>
public static Throwable getCauseRec(Throwable ex) {
public Throwable getCauseRec(Throwable ex) {
Throwable cause = ex.getCause();
return (cause == null) ? ex : getCauseRec(cause);
}
public static void setPassesControlsVisible(boolean flag, PassCode_2021... codes_in) {
for (PassCode_2021 code_in : codes_in)
passes.get(code_in).setControlsVisible(flag);
}
//важно. вызывать только если есть интерфейс.
public static void CheckAllStats() throws Exception {
for (Pass_2021 pass : FAPasses) {
if (!Global.db.passStats.Data.containsKey(pass.code()))
Global.db.Insert(pass.stats = new PassStats(pass));
else pass.stats = Global.db.passStats.Data.get(pass.code());
}
FAPasses.sort(new SortPassesByStats());
}
public static void CreateAll() {
for (PassCode_2021 code : PassCode_2021.values()) {
if (code != PassCode_2021.Undefined) {
try {
Class<?> clazz = Class.forName("Visual_DVM_2021.Passes.All." + code.toString());
Pass_2021 pass = ((Pass_2021) clazz.newInstance());
passes.put(code, pass);
if (pass.hasStats())
FAPasses.add(pass);
} catch (Exception ex) {
Global.Log.PrintException(ex);
}
}
}
}
//<editor-fold desc="Интерфейс">
//https://www.delftstack.com/ru/howto/java/java-resize-image/
public String getIconPath() {
return null;
}
public Icon getTabIcon(){
return Utils.getTabIcon(getIconPath());
public Icon getTabIcon() {
return Utils_.getTabIcon(getIconPath());
}
public AbstractAction getControlAction() {
return new AbstractAction() {
@@ -111,8 +79,9 @@ public class Pass_2021<T> {
control.setEnabled(flag);
}
public void setControlsVisible(boolean flag) {
ui_visible = flag;
for (PassControl control : controls)
control.setVisible(flag);
control.setVisible(ui_visible);
}
public void setControlsToolTipText(String text) {
for (PassControl control : controls)
@@ -120,33 +89,31 @@ public class Pass_2021<T> {
}
protected void FocusResult() {
}
protected boolean hasStats() {
public boolean hasStats() {
return false;
}
public void UpdateStatsIfNeed() {
if (hasStats()) {
stats.Inc();
try {
Global.db.Update(stats);
FAPasses.sort(new SortPassesByStats());
if (Current.HasProject())
UI.fastAccessMenuBar.Refresh();
MainModule_.instance.getDb().passStats.IncPassStat(getName());
} catch (Exception ex) {
Global.Log.PrintException(ex);
Utils_.MainLog.PrintException(ex);
}
if (UI.isActive())
MainModule_.instance.getUI().getFastAccessMenuBar().Refresh();
}
}
public PassCode_2021 code() {
return PassCode_2021.valueOf(getClass().getSimpleName());
}
public boolean isDone() {
return state == PassState.Done;
return state.equals(PassState.Done);
}
public void setDone() {
state = PassState.Done;
}
public String getName() {
return getClass().getSimpleName();
}
public String getDescription() {
return code().getDescription();
return MainModule_.instance.getPassDescription(getName());
}
public String getStartDescription() {
return getDescription();
@@ -189,34 +156,34 @@ public class Pass_2021<T> {
//-
private void PerformCanNotStart() throws Exception {
performCanNotStart();
if (Current.hasUI())
if (UI.isActive())
showCanNotStart();
}
protected void PerformPreparation() throws Exception {
performPreparation();
if (Current.hasUI())
if (UI.isActive())
showPreparation();
}
private void PerformFinish() throws Exception {
performFinish();
//-
if (Current.hasUI())
if (UI.isActive())
showFinish();
}
private void PerformDone() throws Exception {
performDone();
//-
if (Current.hasUI())
if (UI.isActive())
showDone();
}
private void PerformFail() throws Exception {
performFail();
//-
if (Current.hasUI())
if (UI.isActive())
showFail();
}
//------
protected PassCode_2021 necessary() {
protected PassCode_ necessary() {
return null;
}
protected boolean resetsNecessary() {
@@ -227,33 +194,34 @@ public class Pass_2021<T> {
state = PassState.Inactive;
}
//------
protected void createStack_r(Stack<Pass_2021> ToDo, Vector<String> ToPrint) {
protected void createStack_r(Stack<Pass> ToDo, Vector<String> ToPrint) {
ToDo.push(this);
if (needsConfirmations() // если UI нет, сюда он не дойдет.
) {
ToPrint.add(this.getStartDescription());
}
if (necessary() != null) {
Pass_2021 next = passes.get(necessary());
Pass next = MainModule_.instance.getPass(necessary());
if (resetsNecessary() || !next.isDone())
next.createStack_r(ToDo, ToPrint);
}
}
public boolean Do(Object... args) {
Stack<Pass_2021> ToDo = new Stack<>();
Stack<Pass> ToDo = new Stack<>();
Vector<String> ToPrint = new Vector<>();
createStack_r(ToDo, ToPrint);
if (Global.properties.ConfirmPassesStart && !ToPrint.isEmpty() &&
!UI.Question("Выполнить проход(ы):\n" + String.join("\n", ToPrint))
if (
UI.isActive() && MainModule_.instance.confirmPassesStart() && !ToPrint.isEmpty() &&
!UI.Question("Выполнить проход(ы):\n" + String.join("\n", ToPrint))
) return false;
while (ToDo.size() > 1) {
if (!ToDo.pop().start()) return false;
}
if (start(args)) {
if (Global.properties.FocusPassesResult)
if (UI.isActive() && MainModule_.instance.focusPassesResult())
FocusResult();
//-
if (Global.properties.ShowPassesDone && !ToPrint.isEmpty()
if (UI.isActive() && MainModule_.instance.confirmPassesDone() && !ToPrint.isEmpty()
) {
UI.Info("Проход(ы)\n\n" + String.join("\n", ToPrint) +
"\nуспешно выполнен(ы)!");
@@ -269,7 +237,7 @@ public class Pass_2021<T> {
return false;
}
public void Interrupt() throws Exception {
UI.Info("Проход " + Utils.Brackets(getDescription()) + " не разрешено прерывать.");
UI.Info("Проход " + Utils_.Brackets(getDescription()) + " не разрешено прерывать.");
}
public boolean needsConfirmations() {
return false;
@@ -280,7 +248,7 @@ public class Pass_2021<T> {
if (ex instanceof PassException) {
Log.Writeln_(ex.getMessage());
} else
Global.Log.PrintException(ex);
Utils_.MainLog.PrintException(ex);
}
public boolean start(Object... args) {
//------------------------------->
@@ -292,23 +260,22 @@ public class Pass_2021<T> {
target = null;
Log = new TextLog();
if (!getDescription().isEmpty())
Global.Log.Print(DebugPrintLevel.Passes, getDescription() + " стартует..");
Utils_.MainLog.Print(getDescription() + " стартует..");
timer.Start();
//------------------------------->
try {
if (Current.hasUI()) FocusBeforeStart();
if (UI.isActive()) FocusBeforeStart();
if (canStart(args)) {
PerformPreparation();
//todo тут должна быть вилка на анимацию?
if (Current.hasUI() && needsAnimation()) {
if (UI.isActive() && needsAnimation()) {
animation_sem = new Semaphore(1);
animation_sem.acquire();
//---
form = null;
Current.set(Current.PassForm, null);
MainModule_.instance.getUI().DropPassForm();
System.gc();
//--
Current.set(Current.PassForm, form = new PassForm(this));
form = MainModule_.instance.getUI().SetPassForm(new PassForm(this));
dispatcher = new SwingWorker() {
@Override
protected Object doInBackground() {
@@ -323,7 +290,7 @@ public class Pass_2021<T> {
try {
animation_sem.acquire();
} catch (InterruptedException e) {
Global.Log.PrintException(e);
Utils_.MainLog.PrintException(e);
}
//и уничтожаем его.
// UI.Print(DebugPrintLevel.Passes, "Окно анимации активировано.");
@@ -356,11 +323,7 @@ public class Pass_2021<T> {
CheckException(ex);
}
}
//---
// UI.Info(this.getClass().getSimpleName()+" +");
PerformFinish();
// UI.Info(this.getClass().getSimpleName()+" ++");
//---
if ((state != PassState.Crushed) && validate()) {
state = PassState.Done;
PerformDone();
@@ -374,19 +337,19 @@ public class Pass_2021<T> {
}
} catch (Exception ex) {
state = PassState.ExternalCrushed;
Global.Log.PrintException(ex);
Utils_.MainLog.PrintException(ex);
}
//------------------------------->
timer.Stop();
if (!getDescription().isEmpty()) {
Global.Log.Print(DebugPrintLevel.Passes,
Utils_.MainLog.Print(
getDescription() +
" окончен за " + timer.Print() +
" состояние " + Utils.Brackets(state.getDescription())
" состояние " + Utils_.Brackets(state.getDescription())
);
if (!Log.isEmpty() && Current.hasUI())
if (!Log.isEmpty() && UI.isActive())
UI.Error(
"проход " + Utils.Brackets(getDescription()) + "\n" + state.getDescription() + "\n\n" +
"проход " + Utils_.Brackets(getDescription()) + "\n" + state.getDescription() + "\n\n" +
Log.toString());
}
//------------------------------->
@@ -394,7 +357,7 @@ public class Pass_2021<T> {
}
//--
public void ShowSapforMessage(String message) {
if (Current.hasUI() && form != null) {
if (UI.isActive() && form != null) {
String[] data = message.split(":");
switch (data[0]) {
case "message_1":
@@ -407,17 +370,15 @@ public class Pass_2021<T> {
form.fields.ProgressBar.setValue((data.length > 1) ? Integer.parseInt(data[1]) : 0);
break;
}
} else System.out.println(Utils.Brackets(message));
}
}
public void ShowMessage1(String message) {
if (form != null)
form.fields.Label1.setText((message.length() > 1) ? message : "");
else System.out.println(Utils.Brackets(message));
}
public void ShowMessage2(String message) {
if (form != null)
form.fields.Label2.setText((message.isEmpty() ? "" : message));
else System.out.println(Utils.Brackets(message));
}
public void ShowProgress(int total, int current, boolean auto) {
if (form != null) {

View File

@@ -0,0 +1,6 @@
package Common.Passes;
public interface PassCode_ {
default String getDescription() {
return "?";
}
}

View File

@@ -1,4 +1,4 @@
package Visual_DVM_2021.Passes;
package Common.Passes;
public class PassException extends Exception {
//штатное исключение
public PassException(String text) {

View File

@@ -1,4 +1,4 @@
package Visual_DVM_2021.Passes;
package Common.Passes;
public enum PassState {
Inactive,
Interrupted,

View File

@@ -1,62 +1,44 @@
package Common;
import Common.UI.Menus_2023.StableMenuItem;
import Common.Utils.Utils;
import Common.Utils.Utils_;
import Common.Visual.Controls.StableMenuItem;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.lang.reflect.Field;
public abstract class Properties {
public void addFlagMenuItem(JMenu menu, String fieldName) {
JMenuItem menu_item = new StableMenuItem(getFieldDescription(fieldName),
getFlag(fieldName) ? "/icons/Pick.png" : "/icons/NotPick.png");
//-
menu_item.addActionListener(e -> {
switchFlag(fieldName);
Update();
menu_item.setIcon(Utils.getIcon(getFlag(fieldName) ? "/icons/Pick.png" : "/icons/NotPick.png"));
});
menu.add(menu_item);
import java.util.LinkedHashMap;
public class Properties {
protected LinkedHashMap<String, JMenuItem> controls = new LinkedHashMap<>();
private File file = null; //файл где хранятся настройки.
public Properties() {
}
public boolean getFlag(String fieldName) {
boolean field = false;
try {
field = (boolean) GlobalProperties.class.getField(fieldName).get(this);
//
} catch (Exception ex) {
ex.printStackTrace();
}
return field;
public Properties(File file_in) {
setFile(file_in);
}
public void switchFlag(String fieldName) {
boolean field = false;
try {
field = (boolean) GlobalProperties.class.getField(fieldName).get(this);
GlobalProperties.class.getField(fieldName).set(this, !field);
//
} catch (Exception ex) {
ex.printStackTrace();
}
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public void Update() {
try {
Utils.jsonToFile(this, getFile());
Utils_.jsonToFile(this, getFile());
} catch (Exception e) {
e.printStackTrace();
}
}
//--
public abstract String getFieldDescription(String fieldName);
public abstract File getFile();
public boolean updateField(String name, Object newValue) {
try {
Field field = getClass().getField(name);
Object oldValue = field.get(Global.properties);
Object oldValue = field.get(this);
//---
if (newValue.equals(oldValue))
return false;
//--
field.set(this, newValue);
this.Update();
Update();
return true;
//--
} catch (Exception exception) {
@@ -64,17 +46,49 @@ public abstract class Properties {
}
return false;
}
public void switchAndUpdateFlag(String name){
public String getFieldDescription(String fieldName) {
return "?";
}
public boolean controlAction(String fieldName, JMenuItem control
) {
return false;
}
public JMenuItem getMenuItem(String fieldName) {
final JMenuItem menuItem;
if (controls.containsKey(fieldName))
menuItem = controls.get(fieldName);
else {
menuItem = new StableMenuItem();
Mark(fieldName, menuItem);
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (controlAction(fieldName, menuItem))
Mark(fieldName, menuItem);
}
});
controls.put(fieldName, menuItem);
}
return menuItem;
}
public void Mark(String fieldName, JMenuItem control) {
String description = getFieldDescription(fieldName);
try {
Field field = getClass().getField(name);
boolean oldValue = (boolean) field.get(Global.properties);
boolean newValue = !oldValue;
//---
field.set(this, newValue);
this.Update();
//--
} catch (Exception exception) {
exception.printStackTrace();
Object value = this.getClass().getField(fieldName).get(this);
if (value instanceof Boolean) {
Boolean flag = (Boolean) value;
control.setText(description);
control.setIcon(Utils_.getIcon(flag ? "/Common/icons/Pick.png" : "/Common/icons/NotPick.png"));
} else {
control.setText(description + " : " + value);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void setControlVisible(String settingName, boolean flag) {
if (controls.containsKey(settingName)) {
controls.get(settingName).setVisible(flag);
}
}
}

View File

@@ -1,53 +0,0 @@
package Common.UI;
import Common.Global;
import javax.swing.*;
import java.awt.*;
//класс, представляющий собой прокручиваемую панель, на которой лежит нечто.
public class ControlForm<C extends Component> {
public C control = null;
protected Class<C> control_class;
protected JPanel content; //задник.
public JScrollPane scroll = null;
public ControlForm(Class<C> class_in) {
control_class = class_in;
setContent(new JPanel(new BorderLayout()));
}
//нужно будет вывестии сделать нормальные формы для деревьев а не ручное создание.
public JPanel getContent() {
return content;
}
public void setContent(JPanel content_in) {
content = content_in;
}
//-
public void Show() {
Clear();
CreateControl();
//------------------------
scroll = new JScrollPane(control);
scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
}
public void CreateControl() {
try {
control = control_class.newInstance();
} catch (Exception e) {
Global.Log.PrintException(e);
}
}
public boolean isShown() {
return control != null;
}
public void Clear() {
control = null; //очищено.
}
public void Refresh() {
if (control != null)
refresh();
}
//-
protected void refresh() {
} //перерисовать контрол.
}

View File

@@ -1,19 +0,0 @@
package Common.UI;
import Common.Current;
import java.awt.*;
public class ControlWithCurrentForm<C extends Component> extends ControlForm<C> {
public ControlWithCurrentForm(Class<C> class_in) {
super(class_in);
}
//-
public Current CurrentName() {
return Current.Undefined;
}
public void ShowCurrentObject() throws Exception {
}
public void ShowNoCurrentObject() throws Exception {
}
public void MouseAction2() throws Exception {
}
}

View File

@@ -1,13 +0,0 @@
package Common.UI;
import Common.Current;
public interface DataControl_OLD {
//todo скорее всего устареет.
default Current getCurrent() {
return Current.Undefined;
}
//-?
default void ShowCurrentObject() throws Exception {
}
default void ShowNoCurrentObject() throws Exception {
}
}

View File

@@ -1,329 +0,0 @@
package Common.UI;
import Common.Constants;
import Common.Current;
import Common.Database.DBObject;
import Common.Database.DBTable;
import Common.Database.DataSet;
import Common.Database.FKBehaviour;
import Common.Global;
import Common.UI.Menus.TableMenu;
import Common.UI.Tables.ColumnInfo;
import Common.UI.Tables.DataTable;
import Common.UI.Tables.Grid.GridAnchestor;
import GlobalData.Grid.Grid;
import javax.swing.*;
import javax.swing.table.TableColumn;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Arrays;
import java.util.Vector;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import static Common.UI.Tables.TableEditors.EditorSelect;
import static Common.UI.Tables.TableRenderers.RendererSelect;
public class DataSetControlForm extends ControlWithCurrentForm<DataTable> {
protected JPanel dataPanel;
protected DataSet dataSource;
public JPanel getDataPanel() {
return dataPanel;
}
protected int current_row_i;
protected boolean events_on = true;
protected String colNamesAndSizes = "";
protected Vector<ColumnInfo> columns = new Vector<>();
public DataSetControlForm(DataSet dataSource_in) {
this(dataSource_in, DataTable.class);
}
public DataSetControlForm(DataSet dataSource_in, Class tableClass) {
super(tableClass);
dataSource = dataSource_in;
//---
dataPanel = new JPanel(new BorderLayout());
content.add(dataPanel, BorderLayout.CENTER);
}
@Override
public void Show() {
super.Show();
dataPanel.add(scroll);
dataPanel.updateUI();
}
@Override
public void Clear() {
super.Clear();
UI.Clear(dataPanel);
}
public DataSet getDataSource() {
return dataSource;
}
@Override
public Current CurrentName() {
return getDataSource().CurrentName();
}
public void SaveColumns() {
if (Global.db != null) {
try {
if ((CurrentName() != Current.Undefined)) {
Vector<String> widths = IntStream.range(0, columns.size()).mapToObj(i -> String.valueOf(control.getColumnModel().getColumn(i).getWidth())).collect(Collectors.toCollection(Vector::new));
String packed = String.join("|", widths);
Grid grid;
if (Global.db.grids.containsKey(CurrentName())) {
grid = Global.db.grids.get(CurrentName());
} else {
grid = new Grid(CurrentName());
Global.db.Insert(grid);
}
grid.sizes = packed;
Global.db.Update(grid);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
public boolean hasCheckBox() {
return false;
}
private Vector<String> getHeaders() {
return columns.stream().map(ColumnInfo::getName).collect(Collectors.toCollection(Vector::new));
}
protected void CreateColumnsInfo() {
columns.clear();
columns.add(new ColumnInfo(getDataSource().getPKName()));
if (hasCheckBox()) {
columns.add(new ColumnInfo("", RendererSelect, EditorSelect));
columns.get(1).setMinWidth(25);
columns.get(1).setMaxWidth(25);
}
Arrays.stream(getDataSource().getUIColumnNames()).forEach(name -> columns.add(new ColumnInfo(name)));
AdditionalInitColumns();
}
protected void AdditionalInitColumns() {
//уточнение инфы по столбцам.
}
@SuppressWarnings("unchecked")
@Override
public void CreateControl() {
CreateColumnsInfo();
GridAnchestor table_data_model = new GridAnchestor(getHeaders(), dataSource.getVisibleKeys()) {
@SuppressWarnings("unchecked")
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Object key = data.get(rowIndex);
if (columnIndex == 0)
return key;
DBObject object = getDataSource().get((key));
if ((columnIndex == 1) && hasCheckBox())
return object.isSelected();
return getDataSource().getFieldAt(object, columnIndex);
}
@Override
public boolean isCellEditable(int row, int col) {
return columns.get(col).isEditable();
}
//------------------------------------------------------------------------------------
@Override
public void setValueAt(Object value, int row, int col) {
fireTableCellUpdated(row, col);
}
};
control = new DataTable(table_data_model) {
@Override
public TableMenu CreateMenu() {
return new TableMenu(this);
}
//строго говоря эта штука нужна только для рендереров и едиторов клеток.
@Override
public DBObject getRowObject(int rowIndex) {
//вот так делать НЕЛЬЗЯ. модель только для внутреннего пользования
// Object key = table_data_model.data.get(rowIndex);
//из таблицы можно пользоваться только getValueAt
//иначе сортировка не будет работать.
Object key = getValueAt(rowIndex, 0);
return getDataSource().get(key);
}
//-----------------------------NEW-------------------------------------
@Override
public void CorrectColumnsSizes() {
if ((Global.db != null) && CurrentName() != Current.Undefined && Global.db.grids.containsKey(CurrentName())) {
//Undefined может оказаться в таблице, например если енум устарел. Поэтому надо проверять.
if (!getColumnsProfile().equalsIgnoreCase(colNamesAndSizes)) {
Grid grid = Global.db.grids.get(CurrentName());
String[] data = grid.sizes.split("\\|");
for (int i = 0; i < columns.size(); ++i) {
if (i <= (data.length - 1)) {
int width = Integer.parseInt(data[i]);
getColumnModel().getColumn(i).setPreferredWidth(width);
getColumnModel().getColumn(i).setWidth(width);
}
}
}
} else
super.CorrectColumnsSizes(); //обычный авторазмер.
}
public String getColumnsProfile() {
String res = "";
for (int i = 0; i < getColumnModel().getColumnCount(); i++) {
if (i > 0) res += ",";
TableColumn column = getColumnModel().getColumn(i);
res += column.getHeaderValue();
res += ":";
res += column.getWidth();
}
return res;
}
@Override
public void Init() {
for (int i = 0; i < columns.size(); i++) {
ColumnInfo columnInfo = columns.get(i);
if (columnInfo.isVisible()) {
if (columnInfo.hasRenderer())
getColumnModel().getColumn(i).setCellRenderer(UI.TableRenderers.get(columnInfo.getRenderer()));
if (columnInfo.hasEditor())
getColumnModel().getColumn(i).setCellEditor(UI.TableEditors.get(columnInfo.getEditor()));
if (columnInfo.hasMaxWidth())
getColumnModel().getColumn((i)).setMaxWidth(columnInfo.getMaxWidth());
if (columnInfo.hasMinWidth())
getColumnModel().getColumn((i)).setMinWidth(columnInfo.getMinWidth());
} else {
getColumnModel().getColumn(i).setMinWidth(0);
getColumnModel().getColumn(i).setMaxWidth(0);
}
}
//обновление в БД при ручном изменении размера столбиков.--------->>
getTableHeader().addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent arg0) {
System.out.println("Header mouse released");
String new_colNamesAndSizes = getColumnsProfile();
// check if changed, if yes, persist...
if (!colNamesAndSizes.equals(new_colNamesAndSizes)) {
colNamesAndSizes = new_colNamesAndSizes;
SaveColumns();
System.out.println("columns updated");
}
}
});
//------------------------->>
}
};
if (CurrentName() != Current.Undefined) {
current_row_i = Constants.Nan;
ListSelectionModel selModel = control.getSelectionModel();
selModel.addListSelectionListener(e -> {
int row = control.getSelectedRow();
if ((row >= 0)) {
if (row != current_row_i) {
current_row_i = row;
// System.out.println("current row_i="+current_row_i);
getDataSource().setCurrent(control.getRowObject(row));
if (events_on) {
try {
ShowCurrentObject();
} catch (Exception ex) {
Global.Log.PrintException(ex);
}
}
}
} else {
current_row_i = Constants.Nan;
// System.out.println("no current row_i="+current_row_i);
getDataSource().dropCurrent();
if (events_on) {
try {
ShowNoCurrentObject();
} catch (Exception ex) {
Global.Log.PrintException(ex);
}
}
}
});
//двойной клик мыши.------------------------------------------------------
control.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if ((e.getClickCount() == 2) && (dataSource.getCurrent() != null)) {
try {
MouseAction2();
} catch (Exception ex) {
Global.Log.PrintException(ex);
}
}
}
});
//----------------------------------------------------------------------------
//при переотображении таблицы скидываем текущий объект!!
getDataSource().dropCurrent();
try {
ShowNoCurrentObject();
} catch (Exception e) {
Global.Log.PrintException(e);
}
}
//---
/*
if (hasCheckBox()) {
TableColumn column = control.getColumnModel().getColumn(1)
column.setHeaderRenderer(new TableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
return null;
}
});
}
*/
}
@Override
protected void refresh() {
control.CorrectSizes();
}
public void Show(Object pk) {
Show();
Select(pk);
}
public void Select(Object pk) {
if (isShown())
control.SelectRowByPK(pk);
}
public void ClearSelection() {
if (isShown())
control.clearSelection(); //строка сбросится сама. благодаря сбросу события выбора
}
public int getRowCount() {
return control.getRowCount();
}
@Override
public void ShowCurrentObject() throws Exception {
if (dataSource instanceof DBTable) {
DBTable table = (DBTable) dataSource;
for (Class dep : table.getFKDependencies().keySet()) {
FKBehaviour behaviour = table.getFKDependencies().get(dep);
switch (behaviour.ui) {
case ACTIVE:
table.getDb().tables.get(dep).ShowUI();
break;
case PASSIVE:
break;
}
}
}
}
@Override
public void ShowNoCurrentObject() throws Exception {
if (dataSource instanceof DBTable) {
DBTable table = (DBTable) dataSource;
for (Class dep : table.getFKDependencies().keySet()) {
FKBehaviour behaviour = table.getFKDependencies().get(dep);
switch (behaviour.ui) {
case ACTIVE:
table.getDb().tables.get(dep).ClearUI();
break;
case PASSIVE:
break;
}
}
}
}
}

View File

@@ -1,17 +0,0 @@
package Common.UI;
public enum DebugPrintLevel {
Undefined,
Passes,
Project;
public String getDescription() {
return toString();
}
public boolean isEnabled() {
switch (this) {
case Passes:
return true;
default:
return false;
}
}
}

View File

@@ -1,12 +0,0 @@
package Common.UI;
import Common.UI.Windows.Dialog.DialogFields;
import javax.swing.*;
import java.awt.*;
public class EmptyDialogFields implements DialogFields {
private JPanel content;
@Override
public Component getContent() {
return content;
}
}

View File

@@ -1,10 +0,0 @@
package Common.UI.List;
import Common.Current;
import Common.UI.Themes.VisualiserFonts;
public class HyperlinksStyledList extends StyledList {
@Override
public void applyTheme() {
super.applyTheme();
setFont(Current.getTheme().Fonts.get(VisualiserFonts.Hyperlink));
}
}

View File

@@ -1,17 +0,0 @@
package Common.UI.List;
import Common.Current;
import Common.UI.Themes.ThemeElement;
import Common.UI.Themes.VisualiserFonts;
import javax.swing.*;
public class StyledList extends JList implements ThemeElement {
public StyledList() {
setFont(Current.getTheme().Fonts.get(VisualiserFonts.TreePlain));
applyTheme();
}
@Override
public void applyTheme() {
setBackground(Current.getTheme().table_background);
setForeground(Current.getTheme().foreground);
}
}

View File

@@ -1,18 +0,0 @@
package Common.UI.Menus;
import Common.Current;
import Common.UI.Themes.VisualiserFonts;
import Common.Utils.Utils;
import Visual_DVM_2021.Passes.PassCode_2021;
import Visual_DVM_2021.Passes.Pass_2021;
import javax.swing.*;
public class PassesSubMenu extends JMenu {
public PassesSubMenu(String title, String icon, PassCode_2021... passes) {
super(title);
setIcon(Utils.getIcon(icon));
setFont(Current.getTheme().Fonts.get(VisualiserFonts.Menu));
for (PassCode_2021 code : passes) {
add(Pass_2021.passes.get(code).createMenuItem());
}
}
}

View File

@@ -1,135 +0,0 @@
package Common.UI.Menus;
import Common.Current;
import Common.Global;
import Common.UI.Menus_2023.LanguagesSubmenu;
import Common.UI.Menus_2023.StableMenuItem;
import Common.UI.Menus_2023.StylesSubmenu;
import Common.UI.Menus_2023.TypesSubmenu;
import Common.UI.Trees.StyledTree;
import Common.UI.UI;
import Common.Utils.Utils;
import ProjectData.Files.FileType;
import ProjectData.Files.LanguageStyle;
import ProjectData.LanguageName;
import Visual_DVM_2021.Passes.PassCode_2021;
import Visual_DVM_2021.Passes.Pass_2021;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
public class ProjectFilesMenu extends GraphMenu {
VisualiserMenuItem m_select_all;
VisualiserMenuItem m_unselect_all;
VisualiserMenuItem m_multiselection;
JMenu mLanguage;
JMenu mStyle;
JMenu mType;
public ProjectFilesMenu(StyledTree tree) {
super(tree, "подпапки");
addSeparator();
JMenuItem m = new VisualiserMenuItem("Открыть в проводнике...", "/icons/Explorer.png");
m.addActionListener(
new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
try {
Desktop.getDesktop().open(Current.getProject().Home);
} catch (Exception ex) {
Global.Log.PrintException(ex);
}
}
});
add(m);
addSeparator();
add(new PassesSubMenu("Добавить", "/icons/RedAdd.png",
PassCode_2021.AddFile,
PassCode_2021.CreateEmptyDirectory,
PassCode_2021.ImportFiles));
addSeparator();
add(new PassesSubMenu("Переименовать", "/icons/Menu/Rename.png",
PassCode_2021.RenameFile,
PassCode_2021.RenameDirectory));
add(new VisualiserMenuItem("Удалить текущий проект", "/icons/Delete.png") {
{
addActionListener(e -> {
if (Current.HasProject()) {
UI.getVersionsWindow().getVersionsForm().getTree().SelectNode(Current.getProject().node);
Pass_2021.passes.get(PassCode_2021.DeleteVersion).Do();
}
});
}
});
addSeparator();
m_multiselection = new VisualiserMenuItem("Массовый режим работы с файлами");
m_multiselection.setIcon(Utils.getIcon(Global.files_multiselection ? "/icons/Pick.png" : "/icons/NotPick.png"));
m_multiselection.addActionListener(e -> {
Global.files_multiselection = !Global.files_multiselection;
m_multiselection.setIcon(Utils.getIcon(Global.files_multiselection ? "/icons/Pick.png" : "/icons/NotPick.png"));
Current.getProject().SelectAllFiles(false);
UI.getMainWindow().getProjectWindow().RefreshProjectFiles();
//-
});
add(m_multiselection);
addSeparator();
//-
m_select_all = new StableMenuItem("Выбрать всё", "/icons/SelectAll.png");
m_select_all.addActionListener(e -> {
Current.getProject().SelectAllFiles(true);
tree.updateUI();
});
add(m_select_all);
m_unselect_all = new StableMenuItem("Отменить всё", "/icons/UnselectAll.png");
m_unselect_all.addActionListener(e -> {
Current.getProject().SelectAllFiles(false);
tree.updateUI();
});
add(m_unselect_all);
//--------------------------------------------------
add(mLanguage = new LanguagesSubmenu(PassCode_2021.SetSelectedFilesLanguage.getDescription()) {
@Override
public void action(LanguageName languageName) {
Pass_2021.passes.get(PassCode_2021.SetSelectedFilesLanguage).Do(languageName);
}
});
add(mStyle = new StylesSubmenu(PassCode_2021.SetSelectedFilesStyle.getDescription()) {
@Override
public void action(LanguageStyle languageStyle) {
Pass_2021.passes.get(PassCode_2021.SetSelectedFilesStyle).Do(languageStyle);
}
});
add(mType = new TypesSubmenu(PassCode_2021.SetSelectedFilesType.getDescription()) {
@Override
public void action(FileType fileType) {
Pass_2021.passes.get(PassCode_2021.SetSelectedFilesType).Do(fileType);
}
});
//--------------------------------------------------
add(Pass_2021.passes.get(PassCode_2021.ExcludeSelectedFiles).createMenuItem());
add(Pass_2021.passes.get(PassCode_2021.IncludeSelectedFiles).createMenuItem());
add(Pass_2021.passes.get(PassCode_2021.ExcludeFile).createMenuItem());
add(Pass_2021.passes.get(PassCode_2021.IncludeFile).createMenuItem());
add(Pass_2021.passes.get(PassCode_2021.DeleteFile).createMenuItem());
add(Pass_2021.passes.get(PassCode_2021.DeleteDirectory).createMenuItem());
add(Pass_2021.passes.get(PassCode_2021.DeleteSelectedFiles).createMenuItem());
}
@Override
public void CheckElementsVisibility() {
m_select_all.setVisible(Global.files_multiselection);
m_unselect_all.setVisible(Global.files_multiselection);
mLanguage.setVisible(Global.files_multiselection);
mStyle.setVisible(Global.files_multiselection);
mType.setVisible(Global.files_multiselection);
//-
Pass_2021.passes.get(PassCode_2021.ExcludeFile).setControlsVisible(!Global.files_multiselection);
Pass_2021.passes.get(PassCode_2021.IncludeFile).setControlsVisible(!Global.files_multiselection);
//-
Pass_2021.passes.get(PassCode_2021.DeleteFile).setControlsVisible(!Global.files_multiselection);
Pass_2021.passes.get(PassCode_2021.DeleteDirectory).setControlsVisible(!Global.files_multiselection);
//--
Pass_2021.passes.get(PassCode_2021.ExcludeSelectedFiles).setControlsVisible(Global.files_multiselection);
Pass_2021.passes.get(PassCode_2021.IncludeSelectedFiles).setControlsVisible(Global.files_multiselection);
Pass_2021.passes.get(PassCode_2021.DeleteSelectedFiles).setControlsVisible(Global.files_multiselection);
}
}

View File

@@ -1,18 +0,0 @@
package Common.UI.Menus;
import Common.Current;
import Common.Global;
import Common.UI.Themes.VisualiserFonts;
import Common.Utils.Utils;
import javax.swing.*;
public class PropertiesSubmenu extends JMenu {
public PropertiesSubmenu(String title, String icon, String... settings) {
super(title);
if (icon != null)
setIcon(Utils.getIcon(icon));
setFont(Current.getTheme().Fonts.get(VisualiserFonts.Menu));
for (String name : settings) {
Global.properties.addFlagMenuItem(this, name);
}
}
}

View File

@@ -1,30 +0,0 @@
package Common.UI.Menus;
import Common.Constants;
import Common.Utils.Utils;
import javax.swing.*;
public class TableMenu extends StyledPopupMenu {
int row = Constants.Nan;
int column = Constants.Nan;
Object target = null;
//-
JTable owner = null;
VisualiserMenuItem mcopy;
public TableMenu(JTable owner_in) {
owner = owner_in;
mcopy = new VisualiserMenuItem("Копировать текст текущей ячейки", "/icons/Editor/Copy.png");
//если удалось нажать значит все условия выполнены
mcopy.addActionListener(e -> Utils.CopyToClipboard(target.toString()));
add(mcopy);
}
@Override
public void CheckElementsVisibility() {
row = owner.getSelectedRow();
column = owner.getSelectedColumn();
if ((row >= 0) && (column >= 0)) {
target = owner.getValueAt(row, column);
mcopy.setVisible(true);
} else mcopy.setVisible(false);
super.CheckElementsVisibility();
}
}

View File

@@ -1,53 +0,0 @@
package Common.UI.Menus;
import Common.Current;
import Common.Global;
import Common.UI.Menus_2023.StableMenuItem;
import Common.UI.Trees.DataTree;
import Common.UI.UI;
import Common.Utils.Utils;
import Visual_DVM_2021.Passes.PassCode_2021;
import Visual_DVM_2021.Passes.Pass_2021;
public class VersionsMenu extends GraphMenu<DataTree> {
VisualiserMenuItem m_select_all;
VisualiserMenuItem m_unselect_all;
VisualiserMenuItem m_multiselection;
public VersionsMenu(DataTree tree) {
super(tree, "подверсии");
add(Pass_2021.passes.get(PassCode_2021.DeleteSubversions).createMenuItem());
add(Pass_2021.passes.get(PassCode_2021.DeleteLonelyM).createMenuItem());
addSeparator();
m_multiselection = new VisualiserMenuItem("Массовый режим работы с версиями");
m_multiselection.setIcon(Utils.getIcon(Global.versions_multiselection ? "/icons/Pick.png" : "/icons/NotPick.png"));
m_multiselection.addActionListener(e -> {
Global.versions_multiselection = !Global.versions_multiselection;
m_multiselection.setIcon(Utils.getIcon(Global.versions_multiselection ? "/icons/Pick.png" : "/icons/NotPick.png"));
Current.getRoot().SelectAllVersions(false);
UI.getVersionsWindow().getVersionsForm().getTree().updateUI();
});
add(m_multiselection);
addSeparator();
add(Pass_2021.passes.get(PassCode_2021.DeleteVersion).createMenuItem());
//-
m_select_all = new StableMenuItem("Выбрать всё, кроме резервных копий","/icons/SelectAll.png");
m_select_all.addActionListener(e -> {
Current.getRoot().SelectAllVersions(true);
tree.updateUI();
});
add(m_select_all);
m_unselect_all = new StableMenuItem("Отменить всё","/icons/UnselectAll.png");
m_unselect_all.addActionListener(e -> {
Current.getRoot().SelectAllVersions(false);
tree.updateUI();
});
add(m_unselect_all);
add(Pass_2021.passes.get(PassCode_2021.DeleteSelectedVersions).createMenuItem());
}
@Override
public void CheckElementsVisibility() {
Pass_2021.passes.get(PassCode_2021.DeleteSelectedVersions).setControlsVisible(!Global.versions_multiselection);
Pass_2021.passes.get(PassCode_2021.DeleteSelectedVersions).setControlsVisible(Global.versions_multiselection);
Pass_2021.passes.get(PassCode_2021.DeleteVersion).setControlsVisible(!Global.versions_multiselection);
m_select_all.setVisible(Global.versions_multiselection);
m_unselect_all.setVisible(Global.versions_multiselection);
}
}

View File

@@ -1,21 +0,0 @@
package Common.UI.Menus;
import Common.Current;
import Common.UI.Themes.VisualiserFonts;
import Common.Utils.Utils;
import javax.swing.*;
public class VisualiserMenuItem extends JMenuItem {
public VisualiserMenuItem(String text) {
super(text, null);
setFont(Current.getTheme().Fonts.get(VisualiserFonts.Menu));
}
public VisualiserMenuItem(String text, String icon_path) {
super(text);
setFont(Current.getTheme().Fonts.get(VisualiserFonts.Menu));
if (icon_path != null)
setIcon(Utils.getIcon(icon_path));
}
public VisualiserMenuItem(){
setFont(Current.getTheme().Fonts.get(VisualiserFonts.Menu));
}
}

View File

@@ -1,17 +0,0 @@
package Common.UI.Menus_2023.BugReportsMenuBar;
import Common.UI.Menus_2023.DataMenuBar;
import Visual_DVM_2021.Passes.PassCode_2021;
public class BugReportsMenuBar extends DataMenuBar {
public BugReportsMenuBar() {
super("отчёты об ошибках",
PassCode_2021.SynchronizeBugReports,
PassCode_2021.DownloadAllBugReportsArchives,
PassCode_2021.AddBugReport,
PassCode_2021.PublishBugReport,
PassCode_2021.OpenBugReportTestProject,
PassCode_2021.OpenBugReport,
PassCode_2021.UpdateBugReportProgress,
PassCode_2021.CloseBugReport,
PassCode_2021.DeleteBugReport);
}
}

View File

@@ -1,13 +0,0 @@
package Common.UI.Menus_2023.CompilersMenuBar;
import Common.UI.Menus_2023.DataMenuBar;
import Visual_DVM_2021.Passes.PassCode_2021;
public class CompilersMenuBar extends DataMenuBar {
public CompilersMenuBar() {
super("компиляторы",
PassCode_2021.AddCompiler,
PassCode_2021.EditCompiler,
PassCode_2021.DeleteCompiler,
PassCode_2021.ShowCompilerVersion,
PassCode_2021.ShowCompilerHelp);
}
}

View File

@@ -1,27 +0,0 @@
package Common.UI.Menus_2023.ComponentsMenuBar;
import Common.Current;
import Common.UI.Menus_2023.DataMenuBar;
import Common.UI.Menus_2023.VisualiserMenu;
import Common.UI.Themes.VisualiserFonts;
import Visual_DVM_2021.Passes.PassCode_2021;
import Visual_DVM_2021.Passes.Pass_2021;
public class ComponentsMenuBar extends DataMenuBar {
public ComponentsMenuBar() {
super("компоненты");
addMenus(
new VisualiserMenu(
"Восстановление предыдущей версии компонента", "/icons/Resurrect.png") {
{
setFont(Current.getTheme().Fonts.get(VisualiserFonts.Menu));
add(Pass_2021.passes.get(PassCode_2021.ResurrectComponent).createMenuItem());
add(Pass_2021.passes.get(PassCode_2021.ResurrectComponentFromServer).createMenuItem());
}
}
);
addPasses(PassCode_2021.InstallComponentFromFolder,
PassCode_2021.UpdateSelectedComponents,
PassCode_2021.PublishComponent,
PassCode_2021.ShowComponentChangesLog);
Pass_2021.passes.get(PassCode_2021.PublishComponent).setControlsVisible(false);
}
}

View File

@@ -1,14 +0,0 @@
package Common.UI.Menus_2023.ConfigurationsMenuBar;
import Common.UI.Menus_2023.DataMenuBar;
import Visual_DVM_2021.Passes.PassCode_2021;
public class ConfigurationsMenuBar extends DataMenuBar {
public ConfigurationsMenuBar() {
super("конфигурации");
addPasses(
PassCode_2021.StartTests,
PassCode_2021.PublishConfiguration,
PassCode_2021.EditConfiguration,
PassCode_2021.DeleteConfiguration
);
}
}

View File

@@ -1,11 +0,0 @@
package Common.UI.Menus_2023.DVMParametersMenuBar;
import Common.UI.Menus_2023.DataMenuBar;
import Visual_DVM_2021.Passes.PassCode_2021;
public class DVMParametersMenuBar extends DataMenuBar {
public DVMParametersMenuBar() {
super("параметры",
PassCode_2021.AddDVMParameter,
PassCode_2021.EditDVMParameter,
PassCode_2021.DeleteDVMParameter);
}
}

View File

@@ -1,12 +0,0 @@
package Common.UI.Menus_2023.EnvironmentValuesMenuBar;
import Common.UI.Menus_2023.DataMenuBar;
import Visual_DVM_2021.Passes.PassCode_2021;
public class EnvironmentValuesMenuBar extends DataMenuBar {
public EnvironmentValuesMenuBar() {
super("переменные окружения", PassCode_2021.AddEnvironmentValue,
PassCode_2021.EditEnvironmentValue,
PassCode_2021.DeleteEnvironmentValue,
PassCode_2021.PickCompilerEnvironments
);
}
}

View File

@@ -1,49 +0,0 @@
package Common.UI.Menus_2023.FastAccessMenuBar;
import Common.Global;
import Common.UI.Menus_2023.VisualiserMenuBar;
import Common.UI.UI;
import GlobalData.Settings.SettingName;
import Visual_DVM_2021.Passes.PassCode_2021;
import Visual_DVM_2021.Passes.Pass_2021;
import javax.swing.*;
import java.awt.*;
import java.util.LinkedHashMap;
public class FastAccessMenuBar extends VisualiserMenuBar {
LinkedHashMap<PassCode_2021, JButton> passesButtons = new LinkedHashMap<>();
public FastAccessMenuBar() {
Refresh();
}
@Override
public void setSizeLimits() {
//если задавать PreffredSize 0, скролл НЕ РАБОТАЕТ. Магия!
}
public void showPass(Pass_2021 pass) {
JButton button = null;
if (passesButtons.containsKey(pass.code()))
button = passesButtons.get((pass.code()));
else {
button = pass.createButton();
passesButtons.put(pass.code(), button);
}
add(button);
Dimension d = button.getPreferredSize();
button.setPreferredSize(new Dimension(d.width, 30));
revalidate();
repaint();
}
public void Refresh() {
UI.Clear(this);
int i = 1;
for (Pass_2021 pass : Pass_2021.FAPasses) {
if (pass.stats.HasUsages()) {
showPass(pass);
++i;
if (i > (Global.db.settings.get(SettingName.FastAccessPassesCount).toInt32())) break;
}
}
}
public void Drop(){
UI.Clear(this);
}
}

View File

@@ -1,63 +0,0 @@
package Common.UI.Menus_2023.FileMenuBar;
import Common.Current;
import Common.UI.Menus_2023.LanguagesSubmenu;
import Common.UI.Menus_2023.StylesSubmenu;
import Common.UI.Menus_2023.TypesSubmenu;
import Common.UI.Menus_2023.VisualiserMenu;
import Common.UI.UI;
import ProjectData.Files.FileType;
import ProjectData.Files.LanguageStyle;
import ProjectData.LanguageName;
import javax.swing.*;
public class FileSettingsMenu extends VisualiserMenu {
JMenu mLanguage;
JMenu mStyle;
JMenu mType;
public FileSettingsMenu() {
super("Настройки файла", "/icons/Settings.png");
add(mLanguage = new LanguagesSubmenu() {
@Override
public void action(LanguageName languageName) {
if (Current.getFile().UpdateLanguage(languageName)) {
Current.getSapfor().ResetAllAnalyses();
Current.getFile().form.ShowLanguage();
UI.getMainWindow().getProjectWindow().getFilesTreeForm().getTree().RefreshNode(Current.getFile().node);
}
}
});
ShowLanguage();
//--
add(mStyle = new StylesSubmenu() {
@Override
public void action(LanguageStyle languageStyle) {
if (Current.getFile().UpdateStyle(languageStyle)) {
Current.getSapfor().ResetAllAnalyses();
Current.getFile().form.ShowStyle();
}
}
});
ShowStyle();
//--
add(mType = new TypesSubmenu() {
@Override
public void action(FileType fileType) {
if (Current.getFile().UpdateType(fileType)) {
Current.getSapfor().ResetAllAnalyses();
UI.getMainWindow().getProjectWindow().getFilesTreeForm().getTree().RefreshNode(Current.getFile().node);
Current.getFile().form.ShowType();
}
}
});
ShowType();
}
public void ShowLanguage() {
mLanguage.setText("Язык: " + Current.getFile().languageName.getDescription());
}
public void ShowStyle() {
mStyle.setText("Стиль: " + Current.getFile().style.getDescription());
}
public void ShowType() {
mType.setText("Тип: " + Current.getFile().fileType.getDescription());
}
}

View File

@@ -1,48 +0,0 @@
package Common.UI.Menus_2023.GroupsMenuBar;
import Common.Global;
import Common.UI.Menus_2023.DataMenuBar;
import Common.UI.Menus_2023.MenuBarButton;
import Common.Utils.Utils;
import TestingSystem.Common.Group.GroupsDBTable;
import Visual_DVM_2021.Passes.PassCode_2021;
import javax.swing.*;
public class GroupsMenuBar extends DataMenuBar {
public GroupsMenuBar() {
super("группы", PassCode_2021.SynchronizeTests, PassCode_2021.ConvertCorrectnessTests,
PassCode_2021.PublishGroup,
PassCode_2021.CreateGroupFromDirectory,
PassCode_2021.CreateGroupFromFiles,
PassCode_2021.EditGroup,
PassCode_2021.DeleteGroup
);
add(new JSeparator());
add(new MenuBarButton() {
{
setText("Свои");
setToolTipText("Отображать только группы тестов авторства пользователя");
Mark();
addActionListener(e -> {
GroupsDBTable.filterMyOnly = !GroupsDBTable.filterMyOnly;
Mark();
Global.testingServer.db.groups.ShowUI();
});
}
public void Mark() {
setIcon(Utils.getIcon(GroupsDBTable.filterMyOnly ? "/icons/Pick.png" : "/icons/NotPick.png"));
}
});
}
public void addFilters(JMenu typesFilterMenu, JMenu languagesFilterMenu) {
filters = addMenus(typesFilterMenu, languagesFilterMenu);
}
JMenuBar filters= null;
public void DropFilters() {
if (filters != null) {
remove(filters);
filters = null;
}
revalidate();
repaint();
}
}

View File

@@ -1,11 +0,0 @@
package Common.UI.Menus_2023.MachinesMenuBar;
import Common.UI.Menus_2023.DataMenuBar;
import Visual_DVM_2021.Passes.PassCode_2021;
public class MachinesMenuBar extends DataMenuBar {
public MachinesMenuBar() {
super("машины",
PassCode_2021.AddMachine,
PassCode_2021.EditMachine,
PassCode_2021.DeleteMachine);
}
}

View File

@@ -1,14 +0,0 @@
package Common.UI.Menus_2023.MainMenuBar;
import Common.UI.Menus_2023.VisualiserMenu;
import Repository.Component.Sapfor.Sapfor;
import Visual_DVM_2021.Passes.PassCode_2021;
import Visual_DVM_2021.Passes.Pass_2021;
public class AnalysesMenu extends VisualiserMenu {
public AnalysesMenu() {
super("Анализаторы","/icons/Analyses.png" );
for (PassCode_2021 code : Sapfor.getAnalysesCodes())
add(Pass_2021.passes.get(code).createMenuItem());
addSeparator();
add(Pass_2021.passes.get(PassCode_2021.SPF_GetGCovInfo).createMenuItem());
}
}

View File

@@ -1,20 +0,0 @@
package Common.UI.Menus_2023.MainMenuBar;
import Common.UI.Menus_2023.VisualiserMenu;
import Visual_DVM_2021.Passes.PassCode_2021;
import Visual_DVM_2021.Passes.Pass_2021;
public class GlobalCleaningMenu extends VisualiserMenu {
public GlobalCleaningMenu() {
super("Очистка", "/icons/Clean.png", false);
add(Pass_2021.passes.get(PassCode_2021.DropLastProjects).createMenuItem());
add(Pass_2021.passes.get(PassCode_2021.DropFastAccess).createMenuItem());
addSeparator();
add(Pass_2021.passes.get(PassCode_2021.DeleteDownloadedBugReports).createMenuItem());
addSeparator();
add(Pass_2021.passes.get(PassCode_2021.DropAnalyses).createMenuItem());
add(Pass_2021.passes.get(PassCode_2021.CleanAnalyses).createMenuItem());
add(Pass_2021.passes.get(PassCode_2021.DropSavedArrays).createMenuItem());
add(Pass_2021.passes.get(PassCode_2021.DeleteDebugResults).createMenuItem());
addSeparator();
add(Pass_2021.passes.get(PassCode_2021.ResetCurrentProject).createMenuItem());
}
}

View File

@@ -1,90 +0,0 @@
package Common.UI.Menus_2023.MainMenuBar;
import Common.Global;
import Common.UI.Menus_2023.MenuBarButton;
import Common.UI.Menus_2023.VisualiserMenuBar;
import Common.UI.UI;
import Repository.Component.PerformanceAnalyzer.PerformanceAnalyzer;
import Visual_DVM_2021.Passes.PassCode_2021;
import Visual_DVM_2021.Passes.Pass_2021;
import javax.swing.*;
import java.awt.*;
public class MainMenuBar extends VisualiserMenuBar {
JMenu analyses;
JMenu transformations;
MenuBarButton components;
public MainMenuBar() {
addMenus(new LastOpenedProjectsMenu());
addPasses(PassCode_2021.OpenCurrentProject, PassCode_2021.CreateEmptyProject);
addMenus(
analyses = new AnalysesMenu(),
transformations = new TransformationsMenu(),
new GlobalCleaningMenu(),
new VisualiserSettingsMenu()
);
add(components = new MenuBarButton() {
{
setToolTipText("Компоненты");
setIcon("/icons/ComponentsActual.png");
addActionListener(e -> {
if (PerformanceAnalyzer.isActive) {
UI.Info("Перед работой с компонентами закройте анализатор производительности!");
} else {
Pass_2021.passes.get(PassCode_2021.GetComponentsActualVersions).Do();
Global.RefreshUpdatesStatus();
UI.ShowComponentsWindow();
}
});
}
});
/*
add(new MenuBarButton() {
{
setIcon("/icons/Comparsion.png");
setToolTipText("Анализатор статистик");
addActionListener(e -> {
Global.performanceAnalyzer.Start();
});
}
});
*/
addPasses(PassCode_2021.ShowInstruction);
//-
setPreferredSize(new Dimension(0, 30));
//---
/*
add(new MenuBarButton() {
{
setIcon("/icons/Apply.png");
setToolTipText("Test");
addActionListener(e -> {
Pass_2021.passes.get(PassCode_2021.TestPass).Do();
});
}
});
*/
//---
ShowProject(false);
}
public void ShowUpdatesIcon() {
components.setIcon(
(Global.need_update > 0) || (Global.bad_state > 0)
? "/icons/ComponentsNeedUpdate.gif"
: (Global.need_publish > 0 ? "/icons/ComponentsNeedPublish_2023.gif" : "/icons/ComponentsActual.png"));
}
public void ShowProject(boolean flag) {
analyses.setEnabled(flag);
transformations.setEnabled(flag);
Pass_2021[] cleaningPasses = new Pass_2021[]{
Pass_2021.passes.get(PassCode_2021.DropAnalyses),
Pass_2021.passes.get(PassCode_2021.DropSavedArrays),
Pass_2021.passes.get(PassCode_2021.CleanAnalyses),
Pass_2021.passes.get(PassCode_2021.DeleteDebugResults),
Pass_2021.passes.get(PassCode_2021.ResetCurrentProject)
};
for (Pass_2021 pass : cleaningPasses) {
pass.setControlsEnabled(flag);
}
}
}

View File

@@ -1,47 +0,0 @@
package Common.UI.Menus_2023.MainMenuBar;
import Common.Global;
import Common.UI.Menus.PropertiesSubmenu;
import Common.UI.Menus_2023.SettingsSubmenu;
import Common.UI.Menus_2023.VisualiserMenu;
import GlobalData.Settings.SettingName;
public class VisualiserSettingsMenu extends VisualiserMenu {
public VisualiserSettingsMenu() {
super("Настройки визуализатора", "/icons/Settings.png");
//-
add(new PropertiesSubmenu("Подтверждения и уведомления", null,
"ShowPassesDone",
"ConfirmPassesStart",
"FocusPassesResult"
));
add(new SettingsSubmenu("Компактность отображения", null,
SettingName.SmallScreen,
SettingName.ShowFullTabsNames,
SettingName.ShowFullArraysDeclarations,
SettingName.FastAccessPassesCount,
SettingName.LastOpenedProjectsCount
));
if (Global.isWindows) {
add(new SettingsSubmenu("Компиляция на локальной машине", null,
SettingName.LocalMakePathWindows,
SettingName.Kernels
));
} else {
add(new SettingsSubmenu("Компиляция на локальной машине", null,
SettingName.Kernels
));
}
add(new SettingsSubmenu("Синхронизация", null,
SettingName.AutoBugReportsLoad,
SettingName.AutoTestsLoad
));
add(new SettingsSubmenu("Сравнение", null,
SettingName.ExtensionsOn,
SettingName.RegisterOn,
SettingName.SpacesOn,
SettingName.EmptyLinesOn,
SettingName.FortranWrapsOn,
SettingName.ComparsionDiffMergeOn
));
add(Global.db.settings.get(SettingName.Workspace).getMenuItem());
}
}

View File

@@ -1,14 +0,0 @@
package Common.UI.Menus_2023.MakefilesMenuBar;
import Common.UI.Menus_2023.DataMenuBar;
import Visual_DVM_2021.Passes.PassCode_2021;
public class MakefilesMenuBar extends DataMenuBar {
public MakefilesMenuBar() {
super("мейкфайлы",
PassCode_2021.Compile,
PassCode_2021.AddMakefile,
PassCode_2021.EditMakefile,
PassCode_2021.DeleteMakefile);
addSeparator();
addPasses(PassCode_2021.ShowMakefilePreview, PassCode_2021.EditProjectCompilationMaxtime);
}
}

View File

@@ -1,8 +0,0 @@
package Common.UI.Menus_2023.ModulesMenuBar;
import Common.UI.Menus_2023.DataMenuBar;
import Visual_DVM_2021.Passes.PassCode_2021;
public class ModulesMenuBar extends DataMenuBar {
public ModulesMenuBar() {
super("языковые модули", PassCode_2021.EditModule);
}
}

View File

@@ -1,25 +0,0 @@
package Common.UI.Menus_2023;
import Visual_DVM_2021.Passes.Pass_2021;
import java.awt.*;
public class PassButton extends MenuBarButton implements PassControl {
public PassButton(Pass_2021 pass, boolean tab) {
setText(pass.getButtonText());
setToolTipText(pass.getDescription());
if (pass.getIconPath() != null) {
if (tab) {
setIcon(pass.getTabIcon());
setPreferredSize(new Dimension(18,18));
setMaximumSize(new Dimension(18,18));
setMinimumSize(new Dimension(18,18));
}
else
setIcon(pass.getIconPath());
}
addActionListener(pass.getControlAction());
pass.controls.add(this);
}
public PassButton(Pass_2021 pass) {
this(pass, false);
}
}

View File

@@ -1,72 +0,0 @@
package Common.UI.Menus_2023.ProjectMenuBar;
import Common.Current;
import Common.Global;
import Common.UI.Menus_2023.LanguagesSubmenu;
import Common.UI.Menus_2023.SettingsSubmenu;
import Common.UI.Menus_2023.StylesSubmenu;
import Common.UI.Menus_2023.VisualiserMenu;
import GlobalData.Settings.SettingName;
import ProjectData.Files.LanguageStyle;
import ProjectData.LanguageName;
import javax.swing.*;
public class ProjectSettingsMenu extends VisualiserMenu {
JMenu mLanguage;
JMenu mStyle;
public ProjectSettingsMenu() {
super("Настройки проекта", "/icons/Settings.png");
add(mLanguage = new LanguagesSubmenu() {
@Override
public void action(LanguageName languageName) {
if (Current.getProject().UpdateLanguage(languageName)) {
Current.getSapfor().ResetAllAnalyses();
ShowLanguage();
}
}
});
ShowLanguage();
//--
add(mStyle = new StylesSubmenu() {
@Override
public void action(LanguageStyle languageStyle) {
if (Current.getProject().UpdateStyle(languageStyle))
ShowStyle();
}
});
ShowStyle();
addSeparator();
add(new SettingsSubmenu("Анализ", null,
SettingName.Precompilation,
SettingName.STATIC_SHADOW_ANALYSIS,
SettingName.KEEP_DVM_DIRECTIVES,
SettingName.IGNORE_IO_SAPFOR,
SettingName.MPI_PROGRAM,
SettingName.ANALYSIS_OPTIONS
));
addSeparator();
add(new SettingsSubmenu("Построение системы интервалов", null,
SettingName.KEEP_LOOPS_CLOSE_NESTING,
SettingName.KEEP_GCOV
));
addSeparator();
add(new SettingsSubmenu("Построение версий", null,
SettingName.FREE_FORM,
SettingName.KEEP_SPF_DIRECTIVES,
SettingName.KEEP_SPF_DIRECTIVES_AMONG_TRANSFORMATIONS,
SettingName.OUTPUT_UPPER,
SettingName.MAX_SHADOW_WIDTH,
SettingName.DVMConvertationOptions,
SettingName.SaveModifications
));
addSeparator();
add(Global.db.settings.get(SettingName.TRANSLATE_MESSAGES).getMenuItem());
add(Global.db.settings.get(SettingName.DEBUG_PRINT_ON).getMenuItem());
add(Global.db.settings.get(SettingName.GCOVLimit).getMenuItem());
}
public void ShowLanguage() {
mLanguage.setText("Язык: " + Current.getProject().languageName.getDescription());
}
public void ShowStyle() {
mStyle.setText("Стиль: " + Current.getProject().style.getDescription());
}
}

View File

@@ -1,34 +0,0 @@
package Common.UI.Menus_2023.ProjectMenuBar;
import Common.Current;
import Common.UI.Menus_2023.VisualiserMenu;
import Common.UI.Themes.VisualiserFonts;
import Common.UI.UI;
import Common.Utils.Utils;
import ProjectData.ProjectView;
import javax.swing.*;
import java.util.LinkedHashMap;
public class ProjectViewMenu extends VisualiserMenu {
LinkedHashMap<ProjectView, JMenuItem> views;
public ProjectViewMenu() {
super("", "");
views = new LinkedHashMap<>();
for (ProjectView view : ProjectView.values()) {
JMenuItem m = new JMenuItem(view.getDescription()) {
{
setIcon(Utils.getIcon(view.getIcon()));
setFont(Current.getTheme().Fonts.get(VisualiserFonts.TreeItalic));
addActionListener(e -> {
Current.set(Current.ProjectView, view);
UI.getMainWindow().getProjectWindow().ShowProjectView();
});
}
};
add(m);
views.put(view, m);
}
}
public void SelectView(ProjectView view){
views.get(view).doClick();
}
}

View File

@@ -1,13 +0,0 @@
package Common.UI.Menus_2023.RunConfigurationsMenuBar;
import Common.UI.Menus_2023.DataMenuBar;
import Visual_DVM_2021.Passes.PassCode_2021;
import javax.swing.*;
public class RunConfigurationsMenuBar extends DataMenuBar {
public RunConfigurationsMenuBar() {
super("конфигурации запуска", PassCode_2021.Run,
PassCode_2021.AddRunConfiguration, PassCode_2021.EditRunConfiguration, PassCode_2021.DeleteRunConfiguration);
add(new JSeparator());
addPasses(PassCode_2021.EditProjectRunMaxtime);
}
}

View File

@@ -1,12 +0,0 @@
package Common.UI.Menus_2023.SapforConfigurationCommandsMenuBar;
import Common.UI.Menus_2023.DataMenuBar;
import Visual_DVM_2021.Passes.PassCode_2021;
public class SapforConfigurationCommandsMenuBar extends DataMenuBar {
public SapforConfigurationCommandsMenuBar() {
super("команды",
PassCode_2021.PublishSapforConfigurationCommand,
PassCode_2021.EditSapforConfigurationCommand,
PassCode_2021.DeleteSapforConfigurationCommand
);
}
}

Some files were not shown because too many files have changed in this diff Show More