package TestingSystem.SAPFOR.Json; import Common.Constants; import Common.Global; import Common.Utils.Utils; import ProjectData.Files.DBProjectFile; import ProjectData.Files.FileType; import ProjectData.Files.ProjectFile; import ProjectData.LanguageName; import ProjectData.Messages.Errors.MessageError; import ProjectData.Project.db_project_info; import TestingSystem.SAPFOR.SapforTask.SapforTask; import com.google.gson.annotations.Expose; import org.apache.commons.io.FileUtils; import java.io.File; import java.io.Serializable; import java.nio.charset.Charset; import java.nio.file.Paths; import java.util.LinkedHashMap; import java.util.Vector; import static java.lang.Character.isDigit; public class SapforVersion_json implements Serializable { @Expose public String version = ""; @Expose public String description = ""; public boolean success = true; //поля для отображения деревьев. public File Home = null; public LinkedHashMap files = new LinkedHashMap<>(); //-- public ProjectFile parse_out = null; public ProjectFile parse_err = null; public ProjectFile out = null; public ProjectFile err = null; //-- public SapforTask task = null; //родная задача. Нужна для построения дерева версий. public db_project_info project = null; //-- public SapforVersion_json(String version_in, String description_in) { version = version_in; description = description_in; } public SapforVersion_json(String root_in, String version_in, String description_in) { version = version_in.substring(root_in.length() + 1); description = description_in; } @Override public String toString() { return Home.getName() + " : " + Utils.Brackets(description); } public void init(File configurationRoot) { String relativePath = Global.isWindows ? Utils.toW(version) : version; Home = Paths.get(configurationRoot.getAbsolutePath(), relativePath).toFile(); files = new LinkedHashMap<>(); //-- File[] files_ = Home.listFiles(); if (files_ != null) { for (File file : files_) { if (file.isFile()) { ProjectFile projectFile = new ProjectFile(file); if (!projectFile.fileType.equals(FileType.forbidden) ) { files.put(projectFile.file.getName(), projectFile); } } } } parse_out = new ProjectFile(Paths.get(Home.getAbsolutePath(), Constants.data, Constants.parse_out_file).toFile()); parse_err = new ProjectFile(Paths.get(Home.getAbsolutePath(), Constants.data, Constants.parse_err_file).toFile()); out = new ProjectFile(Paths.get(Home.getAbsolutePath(), Constants.data, Constants.out_file).toFile()); err = new ProjectFile(Paths.get(Home.getAbsolutePath(), Constants.data, Constants.err_file).toFile()); } public boolean isMatch(SapforVersion_json version_json) { if (!description.equals(version_json.description)) { System.out.println("не совпадение описания версии"); return false; } if (files.size() != version_json.files.size()) { System.out.println("не совпадение количества файлов"); return false; } for (String name1 : files.keySet()) { if (!version_json.files.containsKey(name1)) { System.out.println("Файл " + Utils.Brackets(name1) + " не найден в версии " + version_json.Home); return false; } } for (String name1 : files.keySet()) { ProjectFile file1 = files.get(name1); ProjectFile file2 = version_json.files.get(name1); //--- String text1 = ""; String text2 = ""; try { text1 = FileUtils.readFileToString(file1.file, Charset.defaultCharset()); } catch (Exception ex) { ex.printStackTrace(); } try { text2 = FileUtils.readFileToString(file2.file, Charset.defaultCharset()); } catch (Exception ex) { ex.printStackTrace(); } if (!text1.equals(text2)) { System.out.println("различие текста файла " + Utils.Brackets(file1.file.getName())); return false; } } return true; } public MessageError unpackMessage(String line_in) throws Exception { MessageError res = new MessageError(); res.file = ""; res.line = Constants.Nan; res.value = ""; String line = line_in.substring(9); //System.out.println(line); int i = 0; int s = 0; String lexeme = ""; //#1020: red43.fdv: line 988]: Active DVM directives are not supported (turn on DVM-directive support option) for (char c : line.toCharArray()) { // System.out.print(""); // System.out.println(c); switch (s) { case 0: //поиск groups_s if (c == '#') { s = 1; lexeme = ""; } else return null; break; case 1: //group_s if (isDigit(c)) { res.group_s += c; lexeme += c; } else if (c == ':') { s = 2; res.group = Integer.parseInt(lexeme); } else return null; break; case 2: //поиск filename if (c == ' ') { s = 3; } else return null; break; case 3: //filename if (c == ':') { s = 4; } else { res.file += c; } break; case 4: //поиск line if (c == ' ') { s = 5; lexeme = ""; } else return null; break; case 5: //line if (c == ' ') { if (!lexeme.equals("line")) return null; else { s = 6; lexeme = ""; } } else { lexeme += c; } break; case 6: //line number if (isDigit(c)) { lexeme += c; } else if (c == ']') { res.line = Integer.parseInt(lexeme); s = 7; } else return null; break; case 7: //Поиск value if (c == ':') { s = 8; } else return null; break; case 8: if (c == ' ') { s = 9; } else return null; break; case 9: //value res.value += c; break; } ; ++i; } //-- if (s != 9) return null; //-- return res; } public void readMessagesFromFileDump(File file, Vector messages) { try { //Образец запакованного сообщения //ERROR - [#1020: red43.fdv: line 988]: Active DVM directives are not supported (turn on DVM-directive support option) Vector lines = new Vector<>(FileUtils.readLines(file)); if (!lines.isEmpty()) { for (int i = lines.size() - 1; i >= 0; --i) { String line = lines.get(i); if (line.startsWith("ERROR - ")) { MessageError message = unpackMessage(line); if (message != null) messages.add(message); //-- } else break; } } } catch (Exception ex) { ex.printStackTrace(); } } //-- public void createProject(File rootHome) throws Exception { project = null; String version_ = Global.isWindows ? Utils.toW(version) : Utils.toU(version); project = new db_project_info(); project.Home = Paths.get(rootHome.getAbsolutePath(), version_).toFile(); project.name = project.Home.getName(); project.description = description; project.languageName = LanguageName.fortran; project.creationDate = Utils.getDateNumber(); //--- FileUtils.copyDirectory(Home, project.Home); ///-------------------------------------- project.CreateVisualiserData(); } public void ReadMessages() throws Exception { if (project != null) { Vector messages = new Vector<>(); //-- File p_out = Paths.get(project.Home.getAbsolutePath(), Constants.data, Constants.parse_out_file).toFile(); File p_err = Paths.get(project.Home.getAbsolutePath(), Constants.data, Constants.parse_err_file).toFile(); File out = Paths.get(project.Home.getAbsolutePath(), Constants.data, Constants.out_file).toFile(); File err = Paths.get(project.Home.getAbsolutePath(), Constants.data, Constants.err_file).toFile(); //-- if (p_out.exists()) { project.Log += (FileUtils.readFileToString(p_out)); readMessagesFromFileDump(p_out, messages); } if (out.exists()) { project.Log += "\n" + FileUtils.readFileToString(out); readMessagesFromFileDump(out, messages); } //в потоки ошибок идет информация от операционной системы. сообщений там быть не должно. if (p_err.exists()) project.Log += (FileUtils.readFileToString(p_err)); if (err.exists()) project.Log += "\n" + FileUtils.readFileToString(err); //-- project.Open(); project.Update(); //Журнал //а так же, убрать dep и txt project.db.BeginTransaction(); for (MessageError m : messages) { if (project.db.files.containsKey(m.file)) { DBProjectFile file = project.db.files.Data.get(m.file); file.CreateAndAddNewMessage(1, m.value, m.line, m.group); //update file project.db.Update(file); } } project.db.Commit(); project.db.Disconnect(); } } }