using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using NDT40Addin.Forms; using EAAddinFramework; using System.IO; using NDT40Addin.util; using NDT40Addin.quality; using NDT40Addin.driver; using NDT40Addin.report; using NDT40Addin.NDTAddin.driver; using System.Diagnostics; namespace NDT40Addin { class NDT40AddinHandler { public static void doShowExceptionError(Exception ex) { MessageBox.Show(ex.Message, "NDT4.0 Error:"); } public static string getTopLevelMenu() { return NDT40Const.MenuHeader; } public static string[] getMainMenuList(EA.Repository repository) { if (NDT40Profile.getPackageCurrentProject(repository) != null) { return new string[] { NDT40Const.MenuNewProject, NDT40Const.MenuAddProject, NDT40Const.MenuQuality, NDT40Const.MenuDriver, NDT40Const.MenuReport, NDT40Const.MenuSeparator, NDT40Const.MenuAbout }; } else { return new string[] { NDT40Const.MenuNewProject, NDT40Const.MenuAddProject, NDT40Const.MenuQuality.Substring(1), NDT40Const.MenuDriver.Substring(1), NDT40Const.MenuReport, NDT40Const.MenuSeparator, NDT40Const.MenuAbout }; } } public static string[] getQualityMenuList(EA.Repository repository) { EA.Diagram currentDiagram = repository.GetCurrentDiagram(); if (NDT40Profile.isDiagramUseCase(currentDiagram)) return new string[] { NDT40Const.MenuCheckUseCases, NDT40Const.MenuSeparator, NDT40Const.MenuCheckProject }; else if (NDT40Profile.isDiagramScenario(currentDiagram)) return new string[] { NDT40Const.MenuCheckScenario, NDT40Const.MenuSeparator, NDT40Const.MenuCheckProject }; else if (NDT40Profile.isDiagramIFM(currentDiagram)) return new string[] { NDT40Const.MenuCheckIFM, NDT40Const.MenuSeparator, NDT40Const.MenuCheckProject }; else if (NDT40Profile.isDiagramGUI(currentDiagram)) return new string[] { NDT40Const.MenuCheckGUI, NDT40Const.MenuSeparator, NDT40Const.MenuCheckProject }; return new string[] { NDT40Const.MenuCheckProject}; } public static string[] getDriverMenuList(EA.Repository repository) { if (NDT40Profile.isDiagramScenario(repository.GetCurrentDiagram())) return new string[] { NDT40Const.MenuUpdateIFMfromCurrentScenario, NDT40Const.MenuBuildCurrentScenarioTestCases, NDT40Const.MenuSeparator, NDT40Const.MenuBuildScenarios, NDT40Const.MenuBuildTestCases, NDT40Const.MenuUpdateIFMfromScenarios, NDT40Const.MenuUpdateIFMfromGUI, NDT40Const.MenuUpdateMockupfromIFM, NDT40Const.MenuUpdateSRfromIFM }; else return new string[] { NDT40Const.MenuBuildScenarios, NDT40Const.MenuBuildTestCases, NDT40Const.MenuUpdateIFMfromScenarios, NDT40Const.MenuUpdateIFMfromGUI, NDT40Const.MenuUpdateMockupfromIFM, NDT40Const.MenuUpdateSRfromIFM }; } public static void doAbout() { MessageBox.Show( NDT40Const.AboutText, NDT40Const.AboutTitle); } public static void doNewProject(EA.Repository repository) { NewProjectForm dlg = new NewProjectForm(); if (dlg.ShowDialog() == DialogResult.OK) { string filePath = Path.Combine(dlg._projectPath, string.Concat(dlg._projectName, ".eap")); if (repository.CreateModel( EA.CreateModelType.cmEAPFromBase, filePath, 0) == true) { if (repository.OpenFile(filePath)) { EA.Package rootPackage = (EA.Package)repository.Models.GetAt(0); EAHandler.renamePackage(repository, rootPackage, NDT40Const.PackageRoot); NDT40Profile.addProjectStructure(repository, rootPackage, dlg._projectName, dlg._guiDiagramType); } } } } public static void doNewReport(EA.Repository repository) { FormNDTReport dlg = new FormNDTReport(repository); if (dlg.ShowDialog() == DialogResult.OK) { } } public static void doAddProject(EA.Repository repository) { EA.Package rootPackage = NDT40Profile.getPackageRootNDT40(repository); if (rootPackage != null) { AddProjectForm dlg = new AddProjectForm(); if (dlg.ShowDialog() == DialogResult.OK) { if (string.IsNullOrEmpty(dlg.getProjectName()) == false) NDT40Profile.addProjectStructure(repository, rootPackage, dlg.getProjectName(), dlg.getGUIDiagramType()); } } } public static void doCheckUseCases(EA.Repository repository) { EA.Package projectPackage = NDT40Profile.getPackageCurrentProject(repository); NDT40QualityUseCases qualityUseCases = new NDT40QualityUseCases(); NDT40Log logList = qualityUseCases.checkUseCases(repository, projectPackage, false); logList.showDialog(repository); } public static void doCheckScenario(EA.Repository repository) { EA.Diagram currentDiagram = repository.GetCurrentDiagram(); if (NDT40Profile.isDiagramScenario(currentDiagram) == false) return; EA.Element usecase = repository.GetElementByID(currentDiagram.ParentID); if (NDT40Profile.isElementUseCase(usecase) == false) return; NDT40QualityScenario scenarioQuality = new NDT40QualityScenario(); NDT40Log logList = scenarioQuality.checkScenario(repository, usecase, false); logList.showDialog(repository); } public static void doCheckIFM(EA.Repository repository) { EA.Package projectPackage = NDT40Profile.getPackageCurrentProject(repository); NDT40QualityIFM qualityIFM = new NDT40QualityIFM(); NDT40Log logList = qualityIFM.checkIFM(repository, projectPackage, false); logList.showDialog(repository); } public static void doCheckGUI(EA.Repository repository) { EA.Package projectPackage = NDT40Profile.getPackageCurrentProject(repository); NDT40QualityGUI qualityGUI = new NDT40QualityGUI(); NDT40Log logList = qualityGUI.checkGUI(repository, projectPackage); logList.showDialog(repository); } public static void doCheckProject(EA.Repository repository) { NDT40Log logList = new NDT40Log(); EA.Package projectPackage = NDT40Profile.getPackageCurrentProject(repository); if (projectPackage == null) { logList.addLogEntry(NDT40LogEntry.Code.NoProjectPackage, "", null); return; } logList.addLogEntry(NDT40LogEntry.Code.StartCheckProject, projectPackage.Name, projectPackage); //usecases NDT40QualityUseCases qualityUC = new NDT40QualityUseCases(); logList.addLogList(qualityUC.checkUseCases(repository, projectPackage, false)); //scenarios NDT40QualityScenario qualityScenario = new NDT40QualityScenario(); foreach (EA.Element usecase in qualityUC.getScenarioList()) logList.addLogList(qualityScenario.checkScenario(repository, usecase, false)); //IFM NDT40QualityIFM qualityIFM = new NDT40QualityIFM(); logList.addLogList(qualityIFM.checkIFM(repository, projectPackage, false)); //GUI NDT40QualityGUI qualityGUI = new NDT40QualityGUI(); logList.addLogList(qualityGUI.checkGUI(repository, projectPackage)); logList.addLogEntry(NDT40LogEntry.Code.EndCheckProject, logList.ToString(), projectPackage); logList.showDialog(repository); } public static void doBuildScenarios(EA.Repository repository) { EA.Package projectPackage = NDT40Profile.getPackageCurrentProject(repository); NDT40QualityUseCases qualityUseCases = new NDT40QualityUseCases(); NDT40Log logList = qualityUseCases.checkUseCases(repository, projectPackage, true); if (logList.getErrorCount() < 1) { NDT40DriverUseCases2Scenarios driver = new NDT40DriverUseCases2Scenarios(); logList.addLogList(driver.buildScenarios(repository, qualityUseCases.getUsecaseWOScenarioList())); } logList.showDialog(repository); } public static void doBuildProjectTestCases(EA.Repository repository) { DateTime stampClock = DateTime.Now; EA.Package projectPackage = NDT40Profile.getPackageCurrentProject(repository); if (projectPackage == null) return; EA.Package reqPackage = EAHandler.getPackageByName(projectPackage, NDT40Const.PackageREQ, false); if (reqPackage == null) return; EA.Package rfPackage = EAHandler.getPackageByName(reqPackage, NDT40Const.PackageRF, false); if (rfPackage == null) return; EA.Package testPackage = EAHandler.getPackageByName(projectPackage, NDT40Const.PackageTest, false); if (testPackage == null) return; EA.Package functionalTestPackage = EAHandler.getPackageByName(testPackage, NDT40Const.PackageFunctionalTest, false); if (functionalTestPackage == null) return; // doQuality NDT40Log logList = new NDT40Log(); List treeList = new List(); List useCaseList = EAHandler.getElements(rfPackage, NDT40Profile.ElementMetaTypeUseCase, true); foreach (EA.Element usecase in useCaseList) { NDT40QualityScenario qualityScenario = new NDT40QualityScenario(); //necesitamos cada quality con su treeNodes logList.addLogList(qualityScenario.checkScenario(repository, usecase, false)); treeList.Add(qualityScenario.getTree()); } if (logList.getErrorCount() < 1) { EA.Package testStampPackage = EAHandler.newPackage(functionalTestPackage, stampClock.ToString("yyyyMMdd-HHmmss"), "", "", 0, ""); if (testStampPackage == null) return; NDT40DriverScenario2TestCases driver = new NDT40DriverScenario2TestCases(); int count = useCaseList.Count; for (int i = 0; i < count; i++) logList.addLogList(driver.buildScenarioTestCases(repository, useCaseList[i], treeList[i], testStampPackage)); } logList.showDialog(repository); } public static void doBuildScenarioTestCases(EA.Repository repository) { DateTime stampClock = DateTime.Now; EA.Diagram currentDiagram = repository.GetCurrentDiagram(); if (currentDiagram == null) return; EA.Element usecase = repository.GetElementByID(currentDiagram.ParentID); if (usecase == null || NDT40Profile.isElementUseCase(usecase) == false) return; EA.Package projectPackage = NDT40Profile.getPackageProject(repository, usecase); if (projectPackage == null) return; EA.Package testPackage = EAHandler.getPackageByName(projectPackage, NDT40Const.PackageTest, false); if (testPackage == null) return; EA.Package functionalTestPackage = EAHandler.getPackageByName(testPackage, NDT40Const.PackageFunctionalTest, false); if (functionalTestPackage == null) return; NDT40QualityScenario qualityScenario = new NDT40QualityScenario(); NDT40Log logList = qualityScenario.checkScenario(repository, usecase, false); if (logList.getErrorCount() < 1) { EA.Package testStampPackage = EAHandler.newPackage(functionalTestPackage, stampClock.ToString("yyyyMMdd-HHmmss"), "", "", 0, ""); if (testStampPackage == null) return; NDT40DriverScenario2TestCases driver = new NDT40DriverScenario2TestCases(); logList.addLogList(driver.buildScenarioTestCases(repository, usecase, qualityScenario.getTree(), testStampPackage)); } logList.showDialog(repository); } public static void doUpdateIFMfromProjectScenarios(EA.Repository repository) { NDT40Log logList = new NDT40Log(); EA.Package projectPackage = NDT40Profile.getPackageCurrentProject(repository); if (projectPackage == null) { logList.addLogEntry(NDT40LogEntry.Code.NoProjectPackage, "", null); } else { EA.Package ifmPackage = NDT40Profile.getPackageIFM(repository, projectPackage); if (ifmPackage == null) { logList.addLogEntry(NDT40LogEntry.Code.NoIFMPackage, "", null); } else { //usecases NDT40QualityUseCases qualityUC = new NDT40QualityUseCases(); logList.addLogList(qualityUC.checkUseCases(repository, projectPackage, false)); //scenarios List _scenarioElementList = new List(); NDT40QualityScenario qualityScenario = new NDT40QualityScenario(); foreach (EA.Element usecase in qualityUC.getScenarioList()) { logList.addLogList(qualityScenario.checkScenario(repository, usecase, true)); _scenarioElementList.AddRange(qualityScenario.getScenarioElementList()); } if (logList.getErrorCount() < 1) { NDT40DriverScenario2IFM driver = new NDT40DriverScenario2IFM(); foreach (EA.Element usecase in qualityUC.getScenarioList()) logList.addLogList(driver.updateIFMfromScenario(repository, projectPackage, ifmPackage, _scenarioElementList)); } } } logList.showDialog(repository); } public static void doUpdateIFMfromScenario(EA.Repository repository) { EA.Diagram currentDiagram = repository.GetCurrentDiagram(); if (NDT40Profile.isDiagramScenario(currentDiagram) == false) return; EA.Element usecase = repository.GetElementByID(currentDiagram.ParentID); if (NDT40Profile.isElementUseCase(usecase) == false) return; NDT40QualityScenario scenarioQuality = new NDT40QualityScenario(); NDT40Log logList = scenarioQuality.checkScenario(repository, usecase, true); NDT40QualityIFM ifmQuality = new NDT40QualityIFM(); logList.addLogList(ifmQuality.checkIFM(repository, NDT40Profile.getPackageCurrentProject(repository), true)); if (logList.getErrorCount() < 1) { NDT40DriverScenario2IFM driver = new NDT40DriverScenario2IFM(); logList.addLogList(driver.updateIFMfromScenario(repository, null, null, scenarioQuality.getScenarioElementList())); } logList.showDialog(repository); } public static void doUpdateIFMfromGUI(EA.Repository repository) { String filePath = String.Empty; using (OpenFileDialog openFileDialog = new OpenFileDialog()) { //openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);Environment.CurrentDirectory openFileDialog.Filter = "xml files (*.xml)|*.xml|All files (*.*)|*.*"; openFileDialog.FilterIndex = 1; openFileDialog.RestoreDirectory = true; if (openFileDialog.ShowDialog() == DialogResult.OK) { //Get the path of specified file filePath = openFileDialog.FileName; } } if (String.IsNullOrEmpty(filePath)) return; EA.Package projectPackage = NDT40Profile.getPackageCurrentProject(repository); NDT40QualityIFM qualityIFM = new NDT40QualityIFM(); NDT40Log logList = qualityIFM.checkIFM(repository, projectPackage, true); if (logList.getErrorCount() < 1) { EA.Package ifmPackage = qualityIFM.getIFMPackage(); if (ifmPackage == null) ifmPackage = NDT40Profile.getPackageIFM(repository, projectPackage); // sketch to mockup (load drawio file) logList.addLogEntry(NDT40LogEntry.Code.StartTransformSketch2Mockup, projectPackage.Name, ifmPackage); NDT40DriverMockup2IFM driver = new NDT40DriverMockup2IFM(); String errorString = driver.loadDrawioFile(filePath); // sketch quality + sketch to mockup driver (TODO: separar en su propia clase del driver) if (String.IsNullOrEmpty(errorString))// save XML in repository EAHandler.writeXMLinPackage(repository, ifmPackage, System.IO.File.ReadAllText(filePath)); else logList.addLogEntry(NDT40LogEntry.Code.DrawioSketchParsedError, errorString, ifmPackage); logList.addLogEntry(NDT40LogEntry.Code.EndTransformSketch2Mockup, string.Concat(projectPackage.Name, "::", driver.getStringToLog()), ifmPackage); // merge elements from mockup into IFM if (logList.getErrorCount() < 1) logList.addLogList(driver.updateIFMfromMockup(repository, projectPackage, ifmPackage, qualityIFM.getIdMockupToElementEATable(), qualityIFM.getIdMockupToPackageIFMTable())); } logList.showDialog(repository); } public static void doUpdateMockupFromIFM(EA.Repository repository) { EA.Package projectPackage = NDT40Profile.getPackageCurrentProject(repository); EA.Package ifmPackage = NDT40Profile.getPackageIFM(repository, projectPackage); String xmlContent = ""; if (String.IsNullOrEmpty(ifmPackage.Element.Header2)) xmlContent = basicnet.loadFromAssembly("NDT40Addin.blank.drawio"); else xmlContent = ifmPackage.Element.Header2; if (String.IsNullOrEmpty(xmlContent) == false) { NDT40QualityIFM qualityIFM = new NDT40QualityIFM(); NDT40Log logList = qualityIFM.checkIFM(repository, projectPackage, false); if (logList.getErrorCount() > 0) { logList.showDialog(repository); return; } Dictionary idMockupToIFMPackageTable = qualityIFM.getIdMockupToPackageIFMTable(); IDictionary idMockupToIFMElementTable = qualityIFM.getIdMockupToElementEATable(); //IList elementsToAdd = qualityIFM.getElementIdNotLinkedList(); Dictionary drawioIdToNameTable = new Dictionary(); foreach (String drawioId in idMockupToIFMPackageTable.Keys) drawioIdToNameTable.Add(drawioId, idMockupToIFMPackageTable[drawioId].Name); foreach (String drawioId in idMockupToIFMElementTable.Keys) drawioIdToNameTable.Add(drawioId, idMockupToIFMElementTable[drawioId].Name); xmlContent = drawioHandler.renameDiagramsAndObjects(xmlContent, drawioIdToNameTable); /* ADDNEW RECTANGLE BY NEW IFM COMPONENT if (elementsToAdd.Count > 0) { drawioHandler dio = new drawioHandler(); String logString = dio.parseXMLfromString(xmlContent); List drawioDiagramList = dio.getDiagramList(); EA.Diagram ifmDiagram = NDT40Profile.getDiagramIFM(repository, projectPackage); foreach (EA.Element ee in elementsToAdd) { EA.Package parentPackage = EAHandler.getPackage(repository, ee.PackageID); DrawioDiagram drawioDiagram = null; int drawioInd = -1; foreach (DrawioDiagram dd in drawioDiagramList) { drawioInd++; if (dd.Name.Equals(parentPackage.Name)) //TODO: utilizar idDiagram (cuando esté) { drawioDiagram = dd; break; } } // DrawioDiagram drawioDiagram = drawioDiagramList.Find(x => x.Name.Equals(parentPackage.Name)); //TODO: utilizar idDiagram (cuando esté) if (drawioDiagram == null) { MessageBox.Show("drawioDiagram not found"); //TODO: return; } EA.DiagramObject o = ifmDiagram.GetDiagramObjectByID(ee.ElementID, ""); if (o != null) { NDT4mockupElement mainContainer = drawioDiagram.MainContainer; EA.Element containerElement = idMockupToIFMElementTable[mainContainer.Id]; //TODO: utilizar idDiagram (cuando esté) EA.DiagramObject c = ifmDiagram.GetDiagramObjectByID(containerElement.ElementID, ""); xmlContent = drawioHandler.addRectangle(xmlContent, ee.ElementID.ToString(), drawioInd, mainContainer.Id, ee.Name, o.left - c.left, c.top - o.top, o.right - o.left, o.top - o.bottom); } } } * */ //TODO: documentar, se puede poner drawioPath como tag "drawioPath" en IFMpackage. Si no, valor por defecto. Si se quiere abrir dialogo poner un path inexistente (p.e. "disabled") String exePath = EAHandler.getTagValue(ifmPackage.Element, "drawioPath"); if (String.IsNullOrEmpty(exePath)) exePath = "C:\\Program Files\\draw.io\\draw.io.exe"; if (File.Exists(exePath)) { //String outFilePath = Path.GetTempFileName(); String outFilePath = Path.Combine(Path.GetTempPath(), "ndt40.tmp"); //String outFilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "out.xml"); System.IO.File.WriteAllText(outFilePath, xmlContent); System.Diagnostics.Process process = new System.Diagnostics.Process(); System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); startInfo.FileName = exePath; startInfo.Arguments = outFilePath; process.StartInfo = startInfo; process.Start(); } else { SaveFileDialog saveDialog = new SaveFileDialog(); saveDialog.Filter = "xml files (*.xml)|*.xml|All files (*.*)|*.*"; saveDialog.FilterIndex = 1; saveDialog.RestoreDirectory = true; if (saveDialog.ShowDialog() == DialogResult.OK) System.IO.File.WriteAllText(saveDialog.FileName, xmlContent); } /* Process pp = Process.Start("https://app.diagrams.net/"); //pp.WaitForInputIdle(5000); //if (IntPtr.Zero != pp.MainWindowHandle) //{ // DoDragDrop // TODO: ? //} */ } } public static void doUpdateSRfromIFM(EA.Repository repository) { EA.Package projectPackage = NDT40Profile.getPackageCurrentProject(repository); NDT40QualityIFM qualityIFM = new NDT40QualityIFM(); NDT40Log logList = qualityIFM.checkIFM(repository, projectPackage, false); NDT40QualitySR qualitySR = new NDT40QualitySR(); logList.addLogList(qualitySR.checkSR(repository, projectPackage)); if (logList.getErrorCount() < 1) { NDT40DriverUpdateSRFromIFM driver = new NDT40DriverUpdateSRFromIFM(); logList.addLogList(driver.updateSRFromIFM(repository, projectPackage, qualitySR.getSRPackage(), qualityIFM.getParameterBindingGroupList(), qualitySR.getClassTable())); } logList.showDialog(repository); } public static void doFileClose(EA.Repository repository) { EA.Package rootPackage = NDT40Profile.getPackageRootNDT40(repository); if (rootPackage != null) { BaselineForm dlg = new BaselineForm(); DialogResult res = dlg.ShowDialog(); if (res == DialogResult.OK) EAHandler.addBaseline(repository, rootPackage, dlg.getVersion(), dlg.getNotes()); } } } }