package _VisualDVM.ProjectData.Project; import Common.CommonConstants; import Common.Database.Objects.DBObject; import Common.Passes.PassException; import Common.Utils.Index; import Common.Utils.TextLog; import Common.Utils.Utils_; import Common.Visual.UI_; import _VisualDVM.Constants; import _VisualDVM.Current; import _VisualDVM.Global; import _VisualDVM.GlobalData.DBLastProject.DBLastProject; import _VisualDVM.GlobalData.Settings.SettingName; import _VisualDVM.Passes.PassCode; import _VisualDVM.ProjectData.DBArray.DBArray; import _VisualDVM.ProjectData.Files.DBProjectFile; import _VisualDVM.ProjectData.Files.FileState; import _VisualDVM.ProjectData.Files.FileType; import _VisualDVM.ProjectData.Files.LanguageStyle; import _VisualDVM.ProjectData.LanguageName; import _VisualDVM.ProjectData.Messages.Errors.MessageError; import _VisualDVM.ProjectData.Messages.Notes.MessageNote; import _VisualDVM.ProjectData.Messages.Recommendations.MessageRecommendation; import _VisualDVM.ProjectData.Messages.Warnings.MessageWarning; import _VisualDVM.ProjectData.ProjectDatabase; import _VisualDVM.ProjectData.SapforData.Arrays.ArraysSet; import _VisualDVM.ProjectData.SapforData.Arrays.ProjectArray; import _VisualDVM.ProjectData.SapforData.Functions.FuncCall; import _VisualDVM.ProjectData.SapforData.Functions.FuncCallH; import _VisualDVM.ProjectData.SapforData.Functions.FuncInfo; import _VisualDVM.ProjectData.SapforData.Functions.UI.Graph.GraphInfo; import _VisualDVM.ProjectData.SapforData.Includes.FileInfo; import _VisualDVM.ProjectData.SapforData.Regions.ParallelRegion; import _VisualDVM.ProjectData.SapforData.Regions.RegionsSet; import _VisualDVM.ProjectData.SapforData.Variants.ParallelVariant; import _VisualDVM.ProjectData.SapforData.Variants.VariantsSet; import _VisualDVM.TestingSystem.Common.Test.ProjectFiles_json; import _VisualDVM.Utils; import _VisualDVM.Visual.UI; import com.mxgraph.swing.mxGraphComponent; import com.sun.org.glassfish.gmbal.Description; import javafx.util.Pair; import org.apache.commons.io.FileUtils; import javax.swing.tree.DefaultMutableTreeNode; import java.io.File; import java.math.BigInteger; import java.nio.file.Files; import java.nio.file.Paths; import java.util.*; import java.util.stream.Collectors; public class db_project_info extends DBObject { public static Vector newVersions = new Vector<>(); //-- public DefaultMutableTreeNode align_rules_root = new DefaultMutableTreeNode(""); public DefaultMutableTreeNode includes_root = new DefaultMutableTreeNode(""); //- public DefaultMutableTreeNode inline_root = new DefaultMutableTreeNode(""); public DefaultMutableTreeNode inline_root2 = new DefaultMutableTreeNode(""); // @Description("PRIMARY KEY,NOT NULL") public String name = ""; public String original = ""; public String description = ""; public LanguageName languageName = LanguageName.fortran; @Description("DEFAULT 'fixed'") public LanguageStyle style = LanguageStyle.fixed; public String Log = "";//текст выдаваемый сапфором //----------------------------------------------- @Description("DEFAULT -1") public long creationDate = CommonConstants.Nan; //--------------------------------------------------NEW. @Description("DEFAULT ''") public String compilation_output = ""; @Description("DEFAULT ''") public String compilation_errors = ""; @Description("DEFAULT ''") public String run_output = ""; @Description("DEFAULT ''") public String run_errors = ""; @Description("DEFAULT ''") public String Scenario = "";//трассировка вызываемых визуализатором проходов. @Description("DEFAULT ''") public String VersionBuilding = ""; public int filter_distributed = 0; public int filter_multiplied = 0; @Description("DEFAULT 40") public int compilation_maxtime = 40; @Description("DEFAULT 120") public int run_maxtime = 120; @Description("DEFAULT 0") public int maxdim = 0; // @Description("DEFAULT -1") public int numLines = CommonConstants.Nan; @Description("DEFAULT -1") public int numSPF = CommonConstants.Nan; @Description("DEFAULT -1") public int numDVM = CommonConstants.Nan; @Description("DEFAULT -1") public int numArrays = CommonConstants.Nan; @Description("DEFAULT -1") public int numLoops = CommonConstants.Nan; @Description("DEFAULT -1") public int numFunctions = CommonConstants.Nan; @Description("DEFAULT -1") public int numAddicted = CommonConstants.Nan; //------------------------------------- //параметры графа функций. храним для каждого проекта. @Description("DEFAULT 500") public int fgIterations = 500; @Description("DEFAULT 300") public int fgResistance = 300; @Description("DEFAULT 1.0") public double fgScreen = 1.0; //------------------------------------ @Description("IGNORE") public int testMaxDim = 0; @Description("IGNORE") public boolean isNew = false; //для выделения только что построенных версий. //------------------------------------ //тут ключ - идентификатор. не меняем. public ArraysSet declaratedArrays = new ArraysSet(); //new - все объявленные в проекте функции. public FuncInfo main_function = null; public FuncCallH main_functionH = null; //- public LinkedHashMap allFunctions = new LinkedHashMap<>(); //- public LinkedHashMap addictedFiles = new LinkedHashMap<>(); //тут ключ -адрес. меняем public Vector templates = new Vector<>(); public RegionsSet parallelRegions = new RegionsSet(); public VariantsSet parallelVariants = new VariantsSet(); public GraphInfo functionsGraph = new GraphInfo(); public Vector files_order = new Vector<>(); public db_project_info last_modification = null; public db_project_info last_version = null; //-------------------------------------------------------------------------------------->>>>> public DefaultMutableTreeNode node = null; public db_project_info parent = null; //родительская версия. public LinkedHashMap versions = new LinkedHashMap<>(); //подверсии. public Vector subdirectories = new Vector();///подпапки. public File Home = null; public DefaultMutableTreeNode filesTreeRoot = null; public ProjectDatabase db = null; public LinkedHashMap allIncludes = new LinkedHashMap<>(); DBLastProject info = null; //обновляется при открытии проекта. public db_project_info() { } //---------------------------------- // в случае восстановления после полной очистки //восстановление при полной очистке. public db_project_info(db_project_info to_restore) throws Exception { Home = to_restore.Home; name = to_restore.name; description = to_restore.description; original = to_restore.original; fgIterations = to_restore.fgIterations; fgResistance = to_restore.fgResistance; fgScreen = to_restore.fgScreen; creationDate = to_restore.creationDate; //- CreateVisualiserData(); } //конструктор для пустой версии (cо структурой папок) public db_project_info(db_project_info parent_in, String letter_in, String description_in, String original_in) throws Exception { parent = parent_in; name = parent.GenerateVersionName(letter_in); languageName = parent.languageName; style = ((Global.mainModule.getDb()).settings.get(SettingName.FREE_FORM).toBoolean() ? LanguageStyle.free : LanguageStyle.fixed); description = description_in; original = original_in; Home = Paths.get(parent_in.Home.getAbsolutePath(), name).toFile(); parent.SaveVersionToBuild(name); if (!Home.mkdir()) throw new PassException("Не удалось создать папку для версии"); creationDate = Utils_.getDateNumber(); //----------------------------------------------------------------------------->>> CreateVisualiserData(); parent.AddVersion(this); //если это делать раньше, папка версии учтется как подпапка. parent.CopySubdirectories(Home); } //------------------------------ //если бд не существует. только для конверсии тестов на корректность. public db_project_info(File Directory, String description_, boolean create_data) throws Exception { Home = Directory; name = Home.getName(); description = description_; if (create_data) { creationDate = Utils_.getDateNumber(); //----------------------------------------------------------------------------->>> CreateVisualiserData(); } } //обычное открытие. public db_project_info(File dir) throws Exception { Home = dir; //- CheckVisualiserDirectories(); db = new ProjectDatabase(this); db.Connect(); db.CreateAllTables(); db.prepareTablesStatements(); db_project_info stored_info = db.LoadOnlyProjectInfo(); if (stored_info == null) { name = Home.getName(); description = ""; creationDate = Utils_.getDateNumber(); //----------------------------------------------------------------------------->>> db.Insert(this); } else ExtractStoredInfo(stored_info); db.Disconnect(); } //- public static File get_db_file(File project_home) { return new File(Paths.get(project_home.toString(), Constants.data, Global.properties.ProjectDBName).toString()); } public static String recommendAnalysis(PassCode code_in) { return Constants.unknown_metric + " примените анализатор \"" + code_in.getDescription() + "\""; } public static void ResetNewVersions() { for (db_project_info version : newVersions) { version.isNew = false; } newVersions.clear(); } public static int extractVersionNumber(db_project_info version) { int res = 0; try { res = Integer.parseInt(version.name.substring(1)); } catch (Exception ex) { ex.printStackTrace(); } return res; } public static void sortVersionsByNumber(Vector versions) { versions.sort(Comparator.comparingInt(db_project_info::extractVersionNumber)); } //- public void Open() throws Exception { db.Connect(); db.prepareTablesStatements(); db.Synchronize(); } public void Close() throws Exception { db.Disconnect(); dropLastModification(); } //-исходная public void CreateVisualiserData() throws Exception { CheckVisualiserDirectories(); db = new ProjectDatabase(this); db.Connect(); db.CreateAllTables(); db.prepareTablesStatements(); db.Insert(this); db.Disconnect(); } /* public boolean isGCOVDone() { return gcov_is_done != 0; }*/ //------------------------------------ public void UpdatefgIterations(int iterations_in) { fgIterations = iterations_in; try { db.Update(this); } catch (Exception e) { Utils_.MainLog.PrintException(e); } } public void UpdatefgResistance(int resistance_in) { fgResistance = resistance_in; try { db.Update(this); } catch (Exception e) { Utils_.MainLog.PrintException(e); } } public void UpdatefgScreen(double screen_in) { fgScreen = screen_in; try { db.Update(this); } catch (Exception e) { Utils_.MainLog.PrintException(e); } } public void UpdateCompilationMaxtime(int ct_in) { compilation_maxtime = ct_in; try { db.Update(this); } catch (Exception e) { Utils_.MainLog.PrintException(e); } } public void UpdateRunMaxtime(int rt_in) { run_maxtime = rt_in; try { db.Update(this); } catch (Exception e) { Utils_.MainLog.PrintException(e); } } // // //----------------------------------- public boolean f_distributed() { return filter_distributed != 0; } public boolean f_multiplied() { return filter_multiplied != 0; } public void SwitchFilterDistributed() { filter_distributed = f_distributed() ? 0 : 1; try { db.Update(this); } catch (Exception e) { Utils_.MainLog.PrintException(e); } } public void SwitchFilterMultiplied() { filter_multiplied = f_multiplied() ? 0 : 1; try { db.Update(this); } catch (Exception e) { Utils_.MainLog.PrintException(e); } } public boolean IsMCopy() { String lname = name.toLowerCase(); return (lname.startsWith("m") && Utils_.isIntegerValue(lname.substring(1))); } public String getTitle() { return name + " " + Utils_.DQuotes(description); } public File getProjFile() { return Paths.get(Home.getAbsolutePath(), Constants.data, Constants.spf).toFile(); } public File getDataDirectory() { return Paths.get(Home.getAbsolutePath(), Constants.data).toFile(); } public File getOptionsDirectory() { return Paths.get(Home.getAbsolutePath(), Constants.data, Constants.options).toFile(); } public File getGCOVDirectory() { return Paths.get(Home.getAbsolutePath(), Constants.data, Constants.gcov).toFile(); } public File getAttachmentsDirectory() { return Paths.get(Home.getAbsolutePath(), Constants.data, Constants.attachments).toFile(); } public File getAnalyzerDirectory() { return Paths.get(Home.getAbsolutePath(), Constants.data, Constants.PerformanceAnalyzerDirectoryName).toFile(); } public Vector getScreenShots() { Vector res = new Vector<>(); File[] files = getAttachmentsDirectory().listFiles(); if (files != null) { for (File file : files) { if (!file.isDirectory() && file.getName().startsWith("screenshot")) res.add(file); } } return res; } public File getStatisticDirectory() { return Paths.get(Home.getAbsolutePath(), Constants.data, Constants.statistic).toFile(); } public db_project_info find_version_r(File v_home) { if (Home.equals(v_home)) return this; for (db_project_info version : versions.values()) if (version.Home.equals(v_home)) return version; for (db_project_info version : versions.values()) { db_project_info res = version.find_version_r(v_home); if (res != null) return res; } return null; } public DBProjectFile getLastOpenedFile() { long max = 0; DBProjectFile res = null; for (DBProjectFile f : db.files.Data.values()) { if (!f.state.equals(FileState.Excluded)) { if (f.file.lastModified() > max) { res = f; max = f.file.lastModified(); } } } return res; } public void CreateParserOptionsDirs() throws Exception { Utils_.forceDeleteWithCheck(getOptionsDirectory()); FileUtils.forceMkdir(getOptionsDirectory()); CopySubdirectories(getOptionsDirectory()); } public void CreateGCOVDirs() throws Exception { Utils_.forceDeleteWithCheck(getGCOVDirectory()); FileUtils.forceMkdir(getGCOVDirectory()); CopySubdirectories(getGCOVDirectory()); } public void ClearGCOV() throws Exception { CreateGCOVDirs(); //updateGCOV_status(0); for (DBProjectFile file : db.files.Data.values()) { file.GCOVLog = ""; db.Update(file); } } public DBProjectFile getFirstBadFile() { for (DBProjectFile f : db.files.Data.values()) { if (f.state.equals(FileState.HasErrors)) return f; } return null; } public void CleanAnalyses() throws Exception { allIncludes.clear(); files_order.clear(); functionsGraph.Clear(); numLines = CommonConstants.Nan; numSPF = CommonConstants.Nan; numDVM = CommonConstants.Nan; numArrays = CommonConstants.Nan; numFunctions = CommonConstants.Nan; numAddicted = CommonConstants.Nan; numLoops = CommonConstants.Nan; Log = ""; Scenario = ""; declaratedArrays.clear(); main_function = null; main_functionH = null; allFunctions.clear(); RefreshInlineRoot(); parallelRegions.clear(); addictedFiles.clear(); templates.clear(); parallelVariants.clear(); align_rules_root.removeAllChildren(); inline_root.removeAllChildren(); inline_root2.removeAllChildren(); includes_root.removeAllChildren(); Update(); for (DBProjectFile file : db.files.Data.values()) file.CleanAll(); db.DeleteAll(MessageRecommendation.class); //в таблице сообщений скинуть счетчик. db.ResetAI(MessageNote.class); db.ResetAI(MessageError.class); db.ResetAI(MessageWarning.class); db.ResetAI(MessageRecommendation.class); //- Global.mainModule.set(Current.Function, null); Global.mainModule.set(Current.SelectedFunction, null); } public void CleanVersions() throws Exception { node.removeAllChildren(); for (db_project_info v : versions.values()) Utils_.forceDeleteWithCheck(v.Home); versions.clear(); dropLastModification(); } public void dropLastModification() { last_modification = null; } public void Update() { try { db.Update(this); } catch (Exception ex) { Utils_.MainLog.PrintException(ex); } } public boolean UpdateLanguage(LanguageName lang_in) { if (!languageName.equals(lang_in)) { languageName = lang_in; Update(); return true; } return false; } public boolean UpdateStyle(LanguageStyle s) { if (!style.equals(s)) { style = s; Update(); return true; } return false; } public void UpdateMaxDim() { Update(); } public void GenRules() { align_rules_root.removeAllChildren(); maxdim = 0; UpdateMaxDim(); if (templates.size() > 0) { for (ParallelRegion p : parallelRegions.Data.values()) { DefaultMutableTreeNode pn = new DefaultMutableTreeNode(p); p.dataDirectives.genRules(p.arrays); for (String r : p.dataDirectives.rules) pn.add(new DefaultMutableTreeNode(r)); maxdim = Math.max(maxdim, p.maxdim); align_rules_root.add(pn); } UpdateMaxDim(); for (ProjectArray t : templates) t.CreateDimensions(); } } public void gen_rec(Vector templates, Vector> res, int index) { if (index >= 0) { ProjectArray current = templates.get(index); Vector> old = new Vector<>(); for (Vector L : res) old.add(L); res.clear(); Vector varIDs = current.get_varIDs(); for (Long varID : varIDs) { for (Vector L : old) { for (BigInteger regID : current.regIDs) //тройки для всех областей. { Vector buf = new Vector<>(); buf.add(current.address); buf.add(BigInteger.valueOf(varID)); buf.add(regID); for (BigInteger l : L) buf.add(l); res.add(buf); } } } gen_rec(templates, res, index - 1); } } public String LinesCount() { return numLines == ParallelVariant.statNaN ? recommendAnalysis(PassCode.SPF_GetFileLineInfo) : String.valueOf(numLines); } public String SPFCount() { return numSPF == ParallelVariant.statNaN ? recommendAnalysis(PassCode.SPF_GetFileLineInfo) : String.valueOf(numSPF); } public String DVMCount() { return numDVM == ParallelVariant.statNaN ? recommendAnalysis(PassCode.SPF_GetFileLineInfo) : String.valueOf(numDVM); } public String ArraysCount() { return numArrays == ParallelVariant.statNaN ? recommendAnalysis(PassCode.SPF_GetAllDeclaratedArrays) : String.valueOf(numArrays); } public String LoopsCount() { return numLoops == ParallelVariant.statNaN ? recommendAnalysis(PassCode.SPF_GetGraphLoops) : String.valueOf(numLoops); } public String FunctionsCount() { return numFunctions == CommonConstants.Nan ? recommendAnalysis(PassCode.SPF_GetGraphFunctions) : String.valueOf(numFunctions); } public String AddictedCount() { return numAddicted == CommonConstants.Nan ? recommendAnalysis(PassCode.SPF_GetIncludeDependencies) : String.valueOf(numAddicted); } public boolean UpdateLinesCount() { try { db.Update(this); return true; } catch (Exception e) { Utils_.MainLog.PrintException(e); } return false; } public void UpdateSPFCount() { try { db.Update(this); } catch (Exception e) { Utils_.MainLog.PrintException(e); } } public void UpdateDVMCount() { try { db.Update(this); } catch (Exception e) { Utils_.MainLog.PrintException(e); } } public boolean UpdateAddictedCount() { try { db.Update(this); return true; } catch (Exception e) { Utils_.MainLog.PrintException(e); } return false; } // https://javarush.ru/groups/posts/2274-kak-ispoljhzovatjh-bigdecimal-v-java public BigInteger getFilteredVariantsCount() { if (templates.isEmpty()) return BigInteger.ZERO; BigInteger amount = BigInteger.ONE; for (ProjectArray template : templates) amount = amount.multiply(BigInteger.valueOf(template.get_varIDs().size())); return amount; } public BigInteger getTotalVariantsCount() { if (templates.isEmpty()) return BigInteger.ZERO; BigInteger amount = BigInteger.ONE; for (ProjectArray template : templates) amount = amount.multiply(BigInteger.valueOf(template.get_varIDs(false).size())); return amount; } //получить имя относительно папки проекта. public String getInnerName(File file) { return file.getAbsolutePath().substring(Home.getAbsolutePath().length() + 1).replace('/', '\\'); } public LinkedHashMap> getPrograms() { LinkedHashMap> res = new LinkedHashMap<>(); //----------------------------------------------- res.put(LanguageName.fortran, new Vector<>()); res.put(LanguageName.c, new Vector<>()); res.put(LanguageName.cpp, new Vector<>()); for (DBProjectFile file : db.files.Data.values()) { if (!file.state.equals(FileState.Excluded) && file.fileType.equals(FileType.program) && (!file.languageName.equals(LanguageName.n))) res.get(file.languageName).add(file); } return res; } public String getUniqKey() { return Home.getAbsolutePath().replace("\\", "").replace(":", "").replace("/", ""); } //получить все подпапки проекта на указанном уровне. public Vector getSubdirectoriesSimple(File dir) { Vector res = new Vector<>(); for (File d : Objects.requireNonNull(dir.listFiles())) { if (isProjectDirectory(d)) res.add(d); } return res; } //получить файлы относящиеся к проекту, лежащие в данной папке. public Vector getFiles(File dir) { Vector res = new Vector<>(); for (DBProjectFile file : db.files.Data.values()) { if (file.file.getParentFile().getAbsolutePath().equals(dir.getAbsolutePath())) res.add(file.file); } return res; } public Vector getActiveFilesForSynchronization(File dir, boolean data) { Vector res = new Vector<>(); for (DBProjectFile file : db.files.Data.values()) { if (file.file.getParentFile().getAbsolutePath().equals(dir.getAbsolutePath()) && (!file.state.equals(FileState.Excluded)) && !file.file.getName().equalsIgnoreCase("MAKEFILE") && (!data || file.fileType.equals(FileType.data)) ) res.add(file.file); //мейкфайлы если они есть все будут игнорироваться. имеет право на существование на машине //только технический мейкфайл. } return res; } public DBLastProject getInfo() { return info; } public void setInfo(DBLastProject info_in) { info = info_in; } public File getStsFile() { return Paths.get(getStatisticDirectory().getAbsolutePath(), "statistic.txt").toFile(); } public String getStsText() { return getStsFile().exists() ? Utils.ReadAllText(getStsFile()) : "файла статистики не существует.\nЗапустите проект на DVM системе, чтобы его получить"; } public void check_files_r(File file, Vector res) { if (isProjectDirectory(file)) { for (File f : Objects.requireNonNull(file.listFiles())) check_files_r(f, res); } else if (file.isFile()) { DBProjectFile pf = new DBProjectFile(file, this); if (pf.fileType != FileType.forbidden) res.add(pf); } } public Vector getFilesForComparsion() { Vector res = new Vector<>(); if (Global.mainModule.HasProject() && this.Home.equals(Global.mainModule.getProject().Home)) { // res = db.files.Data.values().stream().filter(file -> !file.state.equals(FileState.Excluded)).collect(Collectors.toCollection(Vector::new)); } else { try { //версия для сравнения - не текущий проект. придется лезть в ее бд. Предполагаем что она всегда есть. Open(); res = db.files.Data.values().stream().filter(file -> !file.state.equals(FileState.Excluded)).collect(Collectors.toCollection(Vector::new)); Close(); } catch (Exception ex) { ex.printStackTrace(); } } return res; } public boolean FolderNotExists(File new_directory, File subdir, TextLog passLog) { for (File pf : getSubdirectoriesSimple(subdir)) { if (pf.getName().equals(new_directory.getName())) { passLog.Writeln("В папке " + Utils_.Brackets(subdir.getAbsolutePath()) + "\n" + "уже существует папка с именем " + Utils_.Brackets(new_directory.getName())); return false; } } return true; } public File getInterruptFile() { return Paths.get(getDataDirectory().getAbsolutePath(), Constants.INTERRUPT).toFile(); } public void CleanInterruptFile() throws Exception { File file = getInterruptFile(); Utils_.forceDeleteWithCheck(file); } public void CreateInterruptFile() throws Exception { FileUtils.write(getInterruptFile(), Global.mode.toString()); } public void AppendScenario(String line_in) { Scenario += (line_in + "\n"); try { db.Update(this); } catch (Exception ex) { Utils_.MainLog.PrintException(ex); } } public mxGraphComponent DrawFunctionsGraph() { return functionsGraph.Draw(); } public DefaultMutableTreeNode getAttachmentsTree() { File[] attachments = getAttachmentsDirectory().listFiles(); DefaultMutableTreeNode root = new DefaultMutableTreeNode( (attachments != null) ? ("Файлов: " + attachments.length) : "Файлов: 0"); if (attachments != null) { for (File a : attachments) root.add(new DefaultMutableTreeNode(a)); } return root; } public boolean CheckAttachmentFile(File f, TextLog Log) { Utils.validateFileShortNewName(f.getName(), Log); if (Utils_.getFileSizeMegaBytes(f) > 2) Log.Writeln_("Размер вложения " + Utils_.Brackets(f.getName()) + " превышает 2 Мb"); return Log.isEmpty(); } public boolean CheckAllAttachments(TextLog Log) { File[] attachments = getAttachmentsDirectory().listFiles(); if (attachments != null) { for (File a : attachments) CheckAttachmentFile(a, Log); } return Log.isEmpty(); } public void RefreshInlineRoot() { inline_root.setUserObject("Отметьте вызовы для подстановки"); } public void RefreshInlineRoot2() { inline_root2.setUserObject("Отметьте полные цепочки вызовов для подстановки"); } public void BuildInlineGraph() { Vector sortedFunctions = new Vector<>(allFunctions.values()); sortedFunctions.sort(Comparator.comparing(o -> o.funcName)); for (FuncInfo decl1 : sortedFunctions) { if (decl1.isDeclared()) { DefaultMutableTreeNode node = new DefaultMutableTreeNode(decl1); inline_root.add(node); //- for (FuncInfo decl2 : allFunctions.values()) { for (FuncCall call : decl2.calls) { if (call.funcName.equals(decl1.funcName)) { if (!decl1.own_calls.containsKey(call.file)) decl1.own_calls.put(call.file, new Vector<>()); if (decl1.needToInline) call.Select(true); call.canBeInlined = !decl1.doNotInline; decl1.own_calls.get(call.file).add(call); node.add(new DefaultMutableTreeNode(call)); } } } } } } public void BuildInlineGraph2() { if (main_function != null) { //особый случай. main_functionH = new FuncCallH(main_function); DefaultMutableTreeNode main_node = new DefaultMutableTreeNode(main_functionH); for (FuncCall call : main_function.calls) { Vector chain = new Vector<>(); chain.add(main_functionH.funcName); // UI.Info("start new chain"); DefaultMutableTreeNode node = BuildInlineGraph2_r(call, chain); if (node != null) { main_node.add(node); main_functionH.calls.add((FuncCallH) node.getUserObject()); } } inline_root2.add(main_node); } } public DefaultMutableTreeNode BuildInlineGraph2_r(FuncCall funcCall, Vector chain) { chain.add(funcCall.funcName); //-- FuncCallH funcCallH = new FuncCallH(funcCall); DefaultMutableTreeNode res = null; FuncInfo funcInfo = allFunctions.get(funcCall.funcName); res = new DefaultMutableTreeNode(funcCallH); for (FuncCall call : funcInfo.calls) { if (!chain.contains(call.funcName)) { DefaultMutableTreeNode node = BuildInlineGraph2_r(call, chain); if (node != null) { res.add(node); funcCallH.calls.add((FuncCallH) node.getUserObject()); } } else System.out.println("RECURSION " + String.join("->", chain) + "->" + call.funcName); } return res; } @Override public Object getPK() { return name; } //---------------------------------------------------- private void CheckVisualiserDirectories() { Utils_.CheckDirectory(getDataDirectory()); Utils_.CheckDirectory(getOptionsDirectory()); Utils_.CheckDirectory(getStatisticDirectory()); Utils_.CheckDirectory(getAttachmentsDirectory()); Utils_.CheckDirectory(getGCOVDirectory()); Utils_.CheckDirectory(getAnalyzerDirectory()); } //загрузка инфы из бд проекта. private void ExtractStoredInfo(db_project_info to_restore) { name = to_restore.name; original = to_restore.original; description = to_restore.description; languageName = to_restore.languageName; style = to_restore.style; Log = to_restore.Log; creationDate = to_restore.creationDate; Scenario = to_restore.Scenario; filter_distributed = to_restore.filter_distributed; filter_multiplied = to_restore.filter_multiplied; compilation_maxtime = to_restore.compilation_maxtime; run_maxtime = to_restore.run_maxtime; compilation_output = to_restore.compilation_output; compilation_errors = to_restore.compilation_errors; run_output = to_restore.run_output; run_errors = to_restore.run_errors; //---------------------------------- numLines = to_restore.numLines; numArrays = to_restore.numArrays; numFunctions = to_restore.numFunctions; numAddicted = to_restore.numAddicted; numLoops = to_restore.numLoops; numSPF = to_restore.numSPF; numDVM = to_restore.numDVM; ///-- fgIterations = to_restore.fgIterations; fgResistance = to_restore.fgResistance; fgScreen = to_restore.fgScreen; maxdim = to_restore.maxdim; } //- public String GenerateVersionName(String letter) { String res = ""; int max_vn = 0; if (versions.keySet().size() > 0) { for (String key_ : versions.keySet()) { String[] data_ = key_.split(letter); String last = data_[data_.length - 1]; if (Utils_.isIntegerValue(last)) { int vn = Integer.parseInt(last); if (vn > max_vn) max_vn = vn; } } } File version_folder = null; do { res = letter + ++max_vn; version_folder = Paths.get(Home.getAbsolutePath(), res).toFile(); } while (version_folder.exists()); return res; } public void CloneParent() throws Exception { for (DBProjectFile file : parent.db.files.Data.values()) { Files.copy(file.file.toPath(), Paths.get(Home.getAbsolutePath(), Utils_.isWindows() ? file.name : file.name.replace('\\', '/'))); } } public void AddVersion(db_project_info version) throws Exception { version.isNew = true; newVersions.add(version); //--->> versions.put(version.name, version); UI.getVersionsWindow().getVersionsForm().getTree().AddNode(node, version.node = new DefaultMutableTreeNode(version)); SaveVersionToBuild(""); } public void SaveVersionToBuild(String v_name) throws Exception { if (!v_name.equalsIgnoreCase(VersionBuilding)) { VersionBuilding = v_name; db.Update(this); } } public void DeleteCrushedVersionIfNeed() throws Exception { if (!VersionBuilding.equals("")) { Utils_.forceDeleteWithCheck(Paths.get(Home.getAbsolutePath(), VersionBuilding).toFile()); SaveVersionToBuild(""); } } public void createModification() throws Exception { if (last_modification == null) { last_modification = new db_project_info(this, "m", "копия от " + new Date(), ""); last_modification.CloneParent(); } } public void createEmptyVersion(String versionLetter, String versionDescription) throws Exception { boolean needsM = (Global.mainModule.getDb()).settings.get(SettingName.SaveModifications).toBoolean(); if (needsM) createModification(); last_version = new db_project_info( this, versionLetter, versionDescription, needsM ? last_modification.name : "" ); } public void joinExistingVersion(File versionDirectory, String description_in) throws Exception { last_version = new db_project_info(); last_version.parent = this; last_version.name = versionDirectory.getName(); last_version.languageName = this.languageName; last_version.description = description_in; last_version.original = last_modification.name; last_version.Home = versionDirectory; last_version.creationDate = Utils_.getDateNumber(); //----------------------------------------------------------------------------->>> last_version.CreateVisualiserData(); this.AddVersion(last_version); } //не является ли текущая версия последней модификацией public void checkLastModification(db_project_info version) { if ((last_modification != null) && version.Home.equals(last_modification.Home)) last_modification = null; } public boolean isProjectDirectory(File dir) { if (!dir.isDirectory()) return false; if (dir.getName().equals(Constants.data)) return false; for (db_project_info version : versions.values()) { if (version.Home.equals(dir)) return false; } return true; } private void getSubdirectoriesR(File dir) { File[] files_ = dir.listFiles(); if (files_ != null) for (File d : files_) { if (isProjectDirectory(d)) { subdirectories.add(d); getSubdirectoriesR(d); } } } public void CopySubdirectories(File dir) throws Exception { subdirectories.clear(); getSubdirectoriesR(Home); for (File d : subdirectories) { String path = d.getAbsolutePath().substring(Home.getAbsolutePath().length()); File cd = Paths.get(dir.getAbsolutePath(), path).toFile(); FileUtils.forceMkdir(cd); } } //-- private void getLonelyM_r(Vector res) { Vector ms = new Vector<>(); Vector vs = new Vector<>(); for (db_project_info version : versions.values()) { if (version.IsMCopy()) ms.add(version); else vs.add(version); } for (db_project_info m : ms) { boolean lonely = true; for (db_project_info v : vs) { if (v.original.equalsIgnoreCase(m.name)) { lonely = false; break; } } if (lonely) { res.add(m); } } for (db_project_info version : vs) { version.getLonelyM_r(res); } } public Vector getLonelyM() { Vector res = new Vector<>(); this.getLonelyM_r(res); return res; } public void cleanDepAndGCOVR() throws Exception { Utils_.forceDeleteWithCheck(getOptionsDirectory()); Utils_.forceDeleteWithCheck(getGCOVDirectory()); Utils_.forceDeleteWithCheck(getStatisticDirectory()); for (db_project_info version : versions.values()) version.cleanDepAndGCOVR(); } //--- public Pair, LinkedHashMap> sortFiles() { LinkedHashMap active_programs = new LinkedHashMap<>(); LinkedHashMap others = new LinkedHashMap<>(); //--- for (DBProjectFile file : db.files.Data.values()) { if (file.isActiveProgram()) active_programs.put(file.name, file); else others.put(file.name, file); } //--- return new Pair<>(active_programs, others); } public DBProjectFile getFileByNameIgnoreCase(String name_in) { for (DBProjectFile file : db.files.Data.values()) { if (file.name.equalsIgnoreCase(name_in)) { return file; } } return null; } public void migrateFilesSettings(db_project_info target, boolean migrate_arrays, boolean sapforStyle) throws Exception { Pair, LinkedHashMap> sortedFiles = sortFiles(); //-- LinkedHashMap programs = sortedFiles.getKey(); LinkedHashMap files = sortedFiles.getValue(); //-- target.Open(); target.db.BeginTransaction(); Pair, LinkedHashMap> sortedVersionFiles = target.sortFiles(); LinkedHashMap version_programs = sortedVersionFiles.getKey(); //-- for (DBProjectFile program : programs.values()) { for (DBProjectFile version_program : version_programs.values()) { boolean same_names = program.getProjectNameWithoutExtension().equals(version_program.getProjectNameWithoutExtension()); if (same_names) { version_program.importSettings(program, sapforStyle); target.db.Update(version_program); } } } for (DBProjectFile file : files.values()) { DBProjectFile version_file = target.getFileByNameIgnoreCase(file.name); if (version_file != null) { version_file.importSettings(file, sapforStyle); target.db.Update(version_file); } else { File toCopy = Paths.get(target.Home.getAbsolutePath(), file.name).toFile(); if (!toCopy.exists()) Files.copy(file.file.toPath(), toCopy.toPath()); //-- DBProjectFile new_version_file = new DBProjectFile(toCopy, target); new_version_file.importSettings(file, sapforStyle); target.db.Insert(new_version_file); } } //--- target.languageName = this.languageName; target.maxdim = this.maxdim; target.db.Update(target); //------------------------ if (migrate_arrays) { //миграция массивов. for (DBArray a : db.savedArrays.Data.values()) target.db.Insert(a); } //--- target.db.Commit(); target.Close(); } public void undoLastTransformation() throws Exception { Global.mainModule.set(Current.Version, null); //--- UI.getVersionsWindow().getVersionsForm().getTree().RemoveNode(last_version.node); Utils_.forceDeleteWithCheck(last_version.Home); versions.remove(last_version.name); last_version = null; //--- if (last_modification != null) { Utils_.forceDeleteWithCheck(last_modification.Home); UI.getVersionsWindow().getVersionsForm().getTree().RemoveNode(last_modification.node); versions.remove(last_modification.name); last_modification = null; } //--- } public void Clone(File dst, boolean cloneData) throws Exception { CopySubdirectories(dst); //-> for (DBProjectFile file : db.files.Data.values()) { File src_file = file.file; File dst_file = Paths.get(dst.getAbsolutePath(), Utils_.isWindows() ? file.name : file.name.replace('\\', '/')).toFile(); Files.copy(src_file.toPath(), dst_file.toPath()); } //теперь копируем инфу по файлам. if (cloneData) { db_project_info res = new db_project_info(dst); migrateFilesSettings(res, true, false); } } public void Clone(File dst) throws Exception { Clone(dst, true); } public void ResetDB() throws Exception { Utils.CleanDirectory(getDataDirectory()); db_project_info to_restore = new db_project_info(); //- to_restore.name = name; to_restore.description = description; to_restore.original = original; // to_restore.fgIterations = fgIterations; // to_restore.fgResistance = fgResistance; // to_restore.fgScreen = fgScreen; //- CheckVisualiserDirectories(); db.Connect(); db.CreateAllTables(); db.prepareTablesStatements(); db.Insert(to_restore); db.Disconnect(); } ///------------------------------------------------------------------------------------------->>>>> public void unpackMessagesAndLog(String packed_messages, String log_in) throws Exception { if (packed_messages.length() > 0) { int idx = 0; String[] splited = packed_messages.split("\\|"); int numberOfFiles = Integer.parseInt(splited[idx++]); for (int i = 0; i < numberOfFiles; ++i) { String message_file = Utils_.toW(splited[idx++]); //для ключа. int numberOfMessages = Integer.parseInt(splited[idx++]); if (!db.files.Data.containsKey(message_file)) { throw new PassException("Ошибка при распаковке сообщений: файл: [" + message_file + "] не найден"); } DBProjectFile messageFile = db.files.Data.get(message_file); //0-1-2 for (int k = 0; k < numberOfMessages; ++k) { String[] localSplit = splited[idx++].split(" "); int m_type = Integer.parseInt(localSplit[0]); int m_line = Integer.parseInt(localSplit[1]); int m_group = Integer.parseInt(localSplit[2]); String m_value = splited[idx++]; messageFile.CreateAndAddNewMessage(m_type, m_value, m_line, m_group); } messageFile.father.db.Update(messageFile); } } Log = log_in; Update(); } public boolean hasErrorMessages(String packed_messages) throws Exception { if (packed_messages.length() > 0) { int idx = 0; String[] splited = packed_messages.split("\\|"); int numberOfFiles = Integer.parseInt(splited[idx++]); for (int i = 0; i < numberOfFiles; ++i) { int numberOfMessages = Integer.parseInt(splited[idx++]); for (int k = 0; k < numberOfMessages; ++k) { String[] localSplit = splited[idx++].split(" "); int m_type = Integer.parseInt(localSplit[0]); if (m_type == 1) { UI_.Info(packed_messages); return true; } } } } return false; } public void updateLog(String log_in) throws Exception { Log = log_in; Update(); } public void updateCompilationOut(String text_in) throws Exception { compilation_output = text_in; db.Update(this); } public void updateRunOut(String text_in) throws Exception { run_output = text_in; db.Update(this); } public boolean CheckSameStyle(TextLog log) { boolean res = false; Vector fixed = new Vector<>(); Vector extended = new Vector<>(); Vector free = new Vector<>(); for (String fileName : files_order) { DBProjectFile file = db.files.get(fileName); switch (file.style) { case fixed: fixed.add(fileName); break; case extended: extended.add(fileName); break; case free: free.add(fileName); break; } } res = (!fixed.isEmpty() && extended.isEmpty() && free.isEmpty()) || (fixed.isEmpty() && !extended.isEmpty() && free.isEmpty()) || (fixed.isEmpty() && extended.isEmpty() && !free.isEmpty()); if (!res) { log.Writeln_( "Найдены файлы с различным стилем Fortran:\n" + "Фиксированный: " + fixed.size() + "\n" + String.join("\n", fixed) + "\n" + "Расширенный: " + extended.size() + "\n" + String.join("\n", extended) + "\n" + "Свободный: " + free.size() + "\n" + String.join("\n", free) ); } return res; } public void findVersion_r(Vector res, File file) { for (db_project_info version : versions.values()) { if (version.Home.getAbsolutePath().equals(file.getAbsolutePath())) { res.add(version); } else version.findVersion_r(res, file); } } public db_project_info findVersion(File file) { Vector res = new Vector<>(); findVersion_r(res, file); return res.isEmpty() ? null : res.get(0); } //- public void UpdateLoopsCount() { try { db.Update(this); } catch (Exception e) { Utils_.MainLog.PrintException(e); } for (ParallelRegion parallelRegion : parallelRegions.Data.values()) parallelRegion.UpdateLoopsCount(); } public void UpdateFunctionsCount() { try { db.Update(this); } catch (Exception e) { Utils_.MainLog.PrintException(e); } for (ParallelRegion parallelRegion : parallelRegions.Data.values()) parallelRegion.UpdateFunctionsCount(); } public void UpdateArraysCount() { numArrays = declaratedArrays.size(); try { db.Update(this); } catch (Exception e) { Utils_.MainLog.PrintException(e); } for (ParallelRegion parallelRegion : parallelRegions.Data.values()) parallelRegion.UpdateArraysCount(); } //имя файла: число совпадений. ( ненулевое) public LinkedHashMap getMatches(String keyword_in, boolean registerOn, boolean wholeWord) throws Exception { //--------------------------- LinkedHashMap res = new LinkedHashMap<>(); for (DBProjectFile file : db.files.Data.values()) { if (!file.state.equals(FileState.Excluded)) { long matches_count = Utils.findInFile(keyword_in, registerOn, wholeWord, file.file); if (matches_count > 0) { res.put(file.name, matches_count); } } } return res; } public db_project_info CreateVersionsTree() throws Exception { File anchestor_file = find_anchestor(); db_project_info root_ = createVersionsTree_r(anchestor_file); return root_; } public db_project_info createVersionsTree_r(File dir) throws Exception { db_project_info result = null; File[] files_ = dir.listFiles(); if (files_ != null) { LinkedHashMap subdirs = new LinkedHashMap<>(); //определить проект ли данная папка. и выделить его подпапки. for (File file : files_) { if (file.isDirectory()) { if (file.getName().equals(Constants.data)) { result = dir.equals(this.Home) ? this : new db_project_info(dir); result.node = new DefaultMutableTreeNode(result); //узел в древе версий. //не является нарушением разделения графики и данных. за графику все равно отвечает рендерер. } else subdirs.put(file.getName(), file); } } //- //если проект, то рекурсивно ищем его подверсии. if (result != null) { Vector sorted_versions = new Vector<>(); for (File subdir : subdirs.values()) { db_project_info v = createVersionsTree_r(subdir); if (v != null) { v.parent = result; sorted_versions.add(v); } } sorted_versions.sort((o1, o2) -> { Long d1 = o1.creationDate; Long d2 = o2.creationDate; return d1.compareTo(d2); }); //-- добавляем рассортированные версии. for (db_project_info version : sorted_versions) { result.versions.put(version.name, version); result.node.add(version.node); } } } return result; } public File find_anchestor() { File child = Home; //так как мы открыли проект, гарантированно родитель существует. File parent = new File(child.getParent()); while (db_project_info.get_db_file(parent).exists()) { child = parent; parent = new File(parent.getParent()); } //смягчение требования /* while (new File(parent, db_project_info.data).exists()) { child = parent; parent = new File(parent.getParent()); } */ return child; } public void PrintVersions_r() { System.out.println(Home.getAbsolutePath()); for (db_project_info version : versions.values()) version.PrintVersions_r(); //-- } public String getVersionTooltip() { return description; } //--- public void gen_variants_vectors() { //заполнить первыми тройками чтобы рекурсия работала. берем последний шаблон. Vector> res = templates.get(templates.size() - 1).get_triples(true); if (templates.size() > 1) gen_rec(templates, res, templates.size() - 2); //теперь надо создать из этого списка варианты. for (Vector vector : res) { ParallelVariant variant = new ParallelVariant(this, vector); // if (!parallelVariants.containsKey(variant.UniqKey)) parallelVariants.put(variant.UniqKey, variant); } } //--- public int getVariantsCoverageCount() { if (templates.isEmpty()) return 0; int res = 0; //-- // тут сортируем по размеру. Vector sortedSizeTemplates = new Vector<>(templates); sortedSizeTemplates.sort((o1, o2) -> o2.dimSize - o1.dimSize); //-- ProjectArray mainTemplate = sortedSizeTemplates.get(0); for (long mVarId : mainTemplate.get_varIDs(false)) { String main_binary = mainTemplate.get_binary(mVarId); boolean variantEnabled = true; for (int i = 1; i < sortedSizeTemplates.size(); ++i) { ProjectArray template = sortedSizeTemplates.get(i); String template_binary = (mainTemplate.dimSize > template.dimSize) ? main_binary.substring(0, template.dimSize) : main_binary; //сконвертировать из двоичной в long, чтобы получить varId long varID = Long.parseLong(template_binary, 2); //-- проверить на пригодность этот самый varID if (!template.checkVarID(varID, false)) { variantEnabled = false; break; } } if (variantEnabled) res++; } return res; } //минимальное покрытие. public void gen_variants_coverage() { Vector> res = new Vector<>(); //1. найти шаблон максимального размера. для этого получаем сортировку из списка по убыванию. Vector sortedBySizeTemplates = new Vector<>(templates); sortedBySizeTemplates.sort((o1, o2) -> o2.dimSize - o1.dimSize); if (!sortedBySizeTemplates.isEmpty()) { ProjectArray mainTemplate = sortedBySizeTemplates.get(0); Vector> main_template_triples = mainTemplate.get_triples(false); //для каждой тройки от главного (максимального) шаблона, берем по одной подходящей от остальных. for (Vector triple : main_template_triples) { //двоичное представление максимального шаблона. 1111 String main_binary = mainTemplate.get_binary(triple.get(1).longValueExact()); boolean variantEnabled = true; Vector variantVector = new Vector<>(triple); //перебор остальных шаблонов for (int i = 1; i < sortedBySizeTemplates.size(); ++i) { ProjectArray template = sortedBySizeTemplates.get(i); String template_binary = (mainTemplate.dimSize > template.dimSize) ? main_binary.substring(0, template.dimSize) : main_binary; //сконвертировать из двоичной в long, чтобы получить varId long varID = Long.parseLong(template_binary, 2); //-- проверить на пригодность этот самый varID if (template.checkVarID(varID, false)) { //вар ИД подошел, составляем вектор для очередного варианта. for (BigInteger regID : template.regIDs) //для всех областей { variantVector.add(template.address); variantVector.add(BigInteger.valueOf(varID)); variantVector.add(regID); } } else { //вар ид не подошел. значит. этого варианта, не будет вообще. нужно идти к следующей тройке лидера. variantEnabled = false; break; } } if (variantEnabled) { res.add(variantVector); } } } //-- //теперь надо создать из этого списка варианты. for (Vector vector : res) { ParallelVariant variant = new ParallelVariant(this, vector); parallelVariants.put(variant.UniqKey, variant); } } public ProjectArray getTemplateByAddress(BigInteger address_in) { for (ProjectArray template : templates) { if (template.address.equals(address_in)) return template; } return null; } public void SelectAllVersions(boolean b) { this.Select(b && !this.IsMCopy()); for (db_project_info version : versions.values()) version.SelectAllVersions(b); } private void getSelectedVersionsForDeletionR(Index count, Vector target, boolean needs_versions) { if (needs_versions) { if (this.isSelected()) { target.add(this); count.Inc(); //версия отмечена. подверсии больше не нужны. for (db_project_info version : versions.values()) { version.getSelectedVersionsForDeletionR(count, null, false); } } else { // не отмечена. проверяем дочерние. for (db_project_info version : versions.values()) { version.getSelectedVersionsForDeletionR(count, target, true); } } } else { //просто считаем все без разбору, так как это подверсии уже отмеченной версии. count.Inc(); for (db_project_info version : versions.values()) { version.getSelectedVersionsForDeletionR(count, null, false); } } } public int getSelectedVersionsForDeletion(Vector target) { Index count = new Index(); getSelectedVersionsForDeletionR(count, target, true); return count.getValue(); } public void getSelectedVersions(Vector target) { if (this.isSelected()) target.add(this); for (db_project_info version : versions.values()) version.getSelectedVersions(target); } public String getLocalName() { //требует отображения рута. без него работать не будет. if (Global.mainModule.HasRoot()) return Home.getAbsolutePath().substring(Global.mainModule.getRoot().Home.getParentFile().getAbsolutePath().length() + 1); else return Home.getName(); } public void SelectAllFiles(boolean b) { for (DBProjectFile file : db.files.Data.values()) file.Select(b); } public ProjectFiles_json filesToJson() { ProjectFiles_json res = new ProjectFiles_json(); LinkedHashMap> programs = getPrograms(); if (programs.containsKey(this.languageName)) res.files.addAll(programs.get(this.languageName)); return res; } public boolean hasSubdirectories() { subdirectories.clear(); getSubdirectoriesR(Home); return !subdirectories.isEmpty(); } public boolean checkSubdirectories(TextLog Log) { if (hasSubdirectories()) { Log.Writeln_("Проект содержит вложенные папки!"); return false; } return true; } }