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