package TestingSystem.Common; import Common.Constants; import Common.Utils.Utils; import Repository.EmailMessage; import Repository.Server.ServerCode; import Repository.Server.ServerExchangeUnit_2021; import TestingSystem.Common.TestingPackage.TestingPackage; import TestingSystem.Common.TestingPackageToKill.TestingPackageToKill; import Visual_DVM_2021.Passes.PassException; import Visual_DVM_2021.Passes.Server.TestingSystemPass; import javafx.util.Pair; import java.io.FileWriter; import java.io.Serializable; import java.util.Date; import java.util.Vector; public abstract class TestingPlanner

{ protected P testingPackage; protected int getSleepMillis() { return 2000; } //--- protected Object ServerCommand(ServerCode code_in, String arg, Serializable object_in) throws Exception { TestingSystemPass pass = new TestingSystemPass() { @Override public String getDescription() { return ""; } @Override protected void ServerAction() throws Exception { Command(new ServerExchangeUnit_2021(code_in, arg, object_in)); target = response.object; } }; if (!pass.Do()) throw new PassException("Ошибка взаимодействия с сервером " + code_in); return pass.target; } protected Object ServerCommand(ServerCode code_in, Serializable object_in) throws Exception { return ServerCommand(code_in, "", object_in); } protected Object ServerCommand(ServerCode code_in) throws Exception { return ServerCommand(code_in, "", null); } //--- protected boolean isPrintOn() { return true; } protected void Print(String message) { try { if (isPrintOn()) { FileWriter testLog = new FileWriter(getClass().getSimpleName() + "_Log.txt", true); String dmessage = Utils.Brackets(new Date()) + " " + message; System.out.println(dmessage); testLog.write(dmessage + "\n"); testLog.close(); } } catch (Exception ex) { ex.printStackTrace(); } } //--- void UpdatePackageState(TasksPackageState state_in) throws Exception { testingPackage.state = state_in; testingPackage.ChangeDate = new Date().getTime(); ServerCommand(ServerCode.EditObject, testingPackage); switch (testingPackage.state) { case Done: case Aborted: case CompilationExecution: case RunningExecution: EmailPackage(); break; } } void UpdatePackage() throws Exception { testingPackage.ChangeDate = new Date().getTime(); ServerCommand(ServerCode.EditObject, testingPackage); } void EmailPackage() throws Exception { if (testingPackage.needsEmail == 1) { EmailMessage message = new EmailMessage(); message.subject = "Состояние пакета задач " + Utils.Brackets(testingPackage) + " изменилось на " + Utils.Brackets(testingPackage.state.getDescription()); message.text = testingPackage.description; message.targets.add(testingPackage.sender_address); ServerCommand(ServerCode.Email, message); } } //--- protected abstract ServerCode getActivePackagesCode(); protected abstract ServerCode getCheckIfNeedsKillCode(); protected abstract TasksPackageState getStateAfterStart(); protected void InitSessionCredentials() { } protected abstract void TestsSynchronize() throws Exception; protected abstract void PackageWorkspaceCreation() throws Exception; protected abstract void AnalyseResults() throws Exception; protected abstract void PackageStart() throws Exception; protected abstract boolean CheckNextState() throws Exception; protected abstract void DownloadResults() throws Exception; protected abstract void Kill() throws Exception; protected boolean Connect() { return true; } protected void Disconnect() { } //жизненный цикл планировщика protected void Session() throws Exception { switch (testingPackage.state) { case TestsSynchronize: TestsSynchronize(); UpdatePackageState(TasksPackageState.PackageWorkspaceCreation); break; case PackageWorkspaceCreation: PackageWorkspaceCreation(); UpdatePackageState(TasksPackageState.PackageStart); break; case PackageStart: PackageStart(); testingPackage.StartDate = new Date().getTime(); UpdatePackageState(getStateAfterStart()); break; case RunningEnd: DownloadResults(); UpdatePackageState(TasksPackageState.Analysis); break; default: if (CheckNextState()) UpdatePackage(); break; } } // --- protected void PerformPackage(TestingPackage package_in) throws Exception{ testingPackage = (P) package_in; //-- Print(testingPackage.id + ":" + testingPackage.state.getDescription()); //-- if (testingPackage.connectionErrosCount>=10){ Print(testingPackage.id+" had 10 connection errors. stop"); UpdatePackageState(TasksPackageState.ConnectionError); }else { //-- InitSessionCredentials(); if (testingPackage.state.equals(TasksPackageState.Analysis)) { AnalyseResults(); UpdatePackageState(TasksPackageState.Done); } else { try { if (Connect()) { int ptk_id = (int) ServerCommand(getCheckIfNeedsKillCode(), testingPackage.id); if (ptk_id != Constants.Nan) { Print("package " + testingPackage.id + " NEEDS TO KILL"); Kill(); UpdatePackageState(TasksPackageState.Aborted); ServerCommand(ServerCode.DeleteObjectByPK, new Pair(TestingPackageToKill.class, ptk_id)); } else { Session(); } } else { testingPackage.connectionErrosCount++; UpdatePackage(); } } catch (Exception ex) { Print("Ошибка сеанса. Соединение будет разорвано."); ex.printStackTrace(); Print(ex.getMessage()); // testingPackage.connectionErrosCount++; UpdatePackage(); } finally { Disconnect(); } } } //-- testingPackage.destructor(); testingPackage = null; System.gc(); //-- } public void Perform() { try { testingPackage = null; Vector

activePackages = (Vector

) ServerCommand(getActivePackagesCode()); // System.out.println(this.getClass().getSimpleName()+": found "+activePackages.size()+" active packages"); //Тесты: for (P activePackage: activePackages) PerformPackage(activePackage); } catch (Exception ex) { ex.printStackTrace(); } finally { Utils.sleep(getSleepMillis()); } } }