From 92389956b97442f7c4cb3109fd12a05028ec5c58 Mon Sep 17 00:00:00 2001 From: Lucio Maranta Date: Mon, 1 Oct 2018 12:17:19 +0200 Subject: [PATCH] Fix client errors WIP job loading in the queue --- Client/Browser_Tools/BrowserJSObject.cs | 32 ++++++++++++--- Step.Model/Constants.cs | 30 +++++++------- Step.Model/DTOModels/JobModels/DTOJobModel.cs | 3 ++ Step.NC/NcHandler.cs | 41 +++++++++++++++---- Step.Utils/supportFunctions.cs | 26 ++++++------ Step/App_Start/Startup.cs | 8 ++-- Step/Controllers/WebApi/NcFileController.cs | 8 ++-- 7 files changed, 98 insertions(+), 50 deletions(-) diff --git a/Client/Browser_Tools/BrowserJSObject.cs b/Client/Browser_Tools/BrowserJSObject.cs index b82a8b65..47dc6995 100644 --- a/Client/Browser_Tools/BrowserJSObject.cs +++ b/Client/Browser_Tools/BrowserJSObject.cs @@ -636,7 +636,7 @@ namespace CMS_Client.Browser_Tools metasFromFile = JsonConvert.DeserializeObject(reader.ReadToEnd()); if (metasFromFile == null) { - e.SetReturnValue(null); + e.SetReturnValue(JsonConvert.SerializeObject(new ErrorContainer("corrupted_model"))); return; } else @@ -670,11 +670,11 @@ namespace CMS_Client.Browser_Tools { // Get file path string filePath = e.Arguments[0].StringValue; - - // Check if file exists - if (!System.IO.File.Exists(filePath)) + // Check if zip is valid + var zipIsValid = ValidateZip(filePath); + if (zipIsValid != null) { - e.SetReturnValue(JsonConvert.SerializeObject(new ErrorContainer("error_file_not_found"))); + e.SetReturnValue(JsonConvert.SerializeObject(zipIsValid)); return; } @@ -733,6 +733,26 @@ namespace CMS_Client.Browser_Tools } } + public static ErrorContainer ValidateZip(string filePath) + { + ErrorContainer result = null; + if (!System.IO.File.Exists(filePath)) + { + return new ErrorContainer("error_file_not_found"); + } + + try + { + using (var archive = ZipFile.OpenRead(filePath)) + result = null; + } + catch (Exception) + { + result = new ErrorContainer("error_file_not_found"); + } + return result; + } + public void updateJobMetadata(object sender, CfrV8HandlerExecuteEventArgs e) { MetadataToFile metafile = new MetadataToFile(); @@ -856,6 +876,7 @@ namespace CMS_Client.Browser_Tools e.SetReturnValue(JsonConvert.SerializeObject(job)); return; } + e.SetReturnValue(null); return; } @@ -922,6 +943,7 @@ namespace CMS_Client.Browser_Tools e.SetReturnValue(JsonConvert.SerializeObject(job)); return; } + e.SetReturnValue(null); return; } diff --git a/Step.Model/Constants.cs b/Step.Model/Constants.cs index 12d19947..1df468b3 100644 --- a/Step.Model/Constants.cs +++ b/Step.Model/Constants.cs @@ -6,17 +6,6 @@ namespace Step.Model { public static class Constants { - public static readonly string[] VALID_FILE_EXTENSIONS = { "", ".txt", ".cnc", ".ini", ".mpf", ".spf" }; - public static readonly string[] VALID_IMAGE_EXTENSIONS = { ".jpg", ".jpeg", ".png" }; - public const double EPSILON = 0.001; - public static string QUEUE_FILE_NAME = "pp"; - public const string JOB_MAIN_FILENAME = "main.cnc"; - public const string JOB_METADATA_FILENAME = "metadata.json"; - - public static String JOB_OPENING_PATH = BASE_PATH + "TempJob\\"; - - - public enum ROLE_IDS { CMS_SERVICE_ONLY = 1, @@ -213,10 +202,19 @@ namespace Step.Model } // File paths - public const string MAINTENANCE_ATTACHMENT_PATH = "C:\\CMS\\STEP\\attachment\\"; - public const string TEMP_FILE = @"C:\CMS\STEP\tmp\pp\"; - public const string JOB_TMP_DIRECTORY = @"C:\CMS\STEP\tmp\pp\job\"; - public const string QUEUE_TMP_FILE = @"C:\CMS\STEP\tmp\pp\queue\"; - public const string PART_PRG_IMAGES = @"C:\CMS\STEP\pp_img/"; + public const string MAINTENANCE_ATTACHMENT_PATH = @"C:\CMS\STEP\attachment\"; + public const string TEMP_FOLDER = @"C:\CMS\STEP\tmp\"; + public const string TEMP_PP_FOLDER = TEMP_FOLDER + @"pp\"; + public const string JOB_TMP_DIRECTORY = TEMP_PP_FOLDER + @"job\"; + public const string QUEUE_TMP_FOLDER = TEMP_PP_FOLDER + @"queue\"; + public const string PART_PRG_IMAGES = @"C:\CMS\STEP\pp_img\"; + + public static readonly string[] VALID_FILE_EXTENSIONS = { "", ".txt", ".cnc", ".ini", ".mpf", ".spf" }; + public static readonly string[] VALID_IMAGE_EXTENSIONS = { ".jpg", ".jpeg", ".png" }; + public const double EPSILON = 0.001; + public static string QUEUE_FILE_NAME = "pp"; + public const string JOB_MAIN_FILENAME = "main.cnc"; + public const string JOB_METADATA_FILENAME = "metadata.json"; + public static string[] JOB_EXTENSIONS = { ".job", ".zip" }; } } diff --git a/Step.Model/DTOModels/JobModels/DTOJobModel.cs b/Step.Model/DTOModels/JobModels/DTOJobModel.cs index 863ef5a5..03e0d3d5 100644 --- a/Step.Model/DTOModels/JobModels/DTOJobModel.cs +++ b/Step.Model/DTOModels/JobModels/DTOJobModel.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; namespace Step.Model.DTOModels.JobModels { @@ -8,10 +9,12 @@ namespace Step.Model.DTOModels.JobModels public DateTime LastEditTimestamp; public string IsoMainProgram; public DTOMetadataModel Metadata; + public List PartPrograms; public DTOJobModel() { Metadata = new DTOMetadataModel(); + PartPrograms = new List(); } } } \ No newline at end of file diff --git a/Step.NC/NcHandler.cs b/Step.NC/NcHandler.cs index 8c0b332f..e89119a5 100644 --- a/Step.NC/NcHandler.cs +++ b/Step.NC/NcHandler.cs @@ -207,21 +207,31 @@ namespace Step.NC { programData = new ActiveProgramDataModel(); - // Upload to NC - CmsError cmsError = UploadPartProgram(localPath, fileName, out string newFilePath); - if (cmsError.IsError()) - return cmsError; - // Get selectedProcess id ushort selectedProcess = 0; - cmsError = numericalControl.PROC_RSelectedProcess(ref selectedProcess); + CmsError cmsError = numericalControl.PROC_RSelectedProcess(ref selectedProcess); if (cmsError.IsError()) return cmsError; - // Activate updated program - return numericalControl.FILES_WSetActiveProgram(selectedProcess, newFilePath, ref programData); - } + if (!JOB_EXTENSIONS.Contains(Path.GetExtension(fileName))) + { + // Upload to NC + cmsError = UploadPartProgram(localPath, fileName, out string newFilePath); + if (cmsError.IsError()) + return cmsError; + + // Activate updated program + return numericalControl.FILES_WSetActiveProgram(selectedProcess, newFilePath, ref programData); + } + else + { + DTOJobModel job = SupportFunctions.UnpackJobAndReadMetadata(localPath + fileName); + } + + return NO_ERROR; + } + public CmsError UploadPartProgramAndAddToQueue(string localPath, string fileName, int reps, out DTOQueueModel queueItem) { queueItem = new DTOQueueModel(); @@ -294,6 +304,13 @@ namespace Step.NC // Set as finished actualItem.RemainingReps = 0; actualItem.Status = QUEUE_ITEM_STATUS.FINISHED; + + + //while(PartProgramQueue[item.ProcessId].ElementAtOrDefault(QueueRunningIndexes[item.ProcessId] + 1) != null && !File.Exists(PartProgramQueue[item.ProcessId][QueueRunningIndexes[item.ProcessId]].AbsolutePath)) + //{ + // QueueRunningIndexes[item.ProcessId] += 1; + //} + if (PartProgramQueue[item.ProcessId].ElementAtOrDefault(QueueRunningIndexes[item.ProcessId] + 1) != null) // if next part program exists, set next pp as current pp QueueRunningIndexes[item.ProcessId] += 1; @@ -459,6 +476,9 @@ namespace Step.NC if (tmpQueueItem != null) PartProgramQueue[processId].Remove(tmpQueueItem); + + if (File.Exists(tmpQueueItem.AbsolutePath)) + File.Delete(tmpQueueItem.AbsolutePath); } // Update database data @@ -478,6 +498,9 @@ namespace Step.NC using (QueueController queueController = new QueueController()) queueController.UpdateQueue(); + // Clean directory + SupportFunctions.EmptyFolder(JOB_TMP_DIRECTORY); + return NO_ERROR; } diff --git a/Step.Utils/supportFunctions.cs b/Step.Utils/supportFunctions.cs index 281ef922..14ba5e2d 100644 --- a/Step.Utils/supportFunctions.cs +++ b/Step.Utils/supportFunctions.cs @@ -126,37 +126,37 @@ namespace Step.Utils return 1; } - public static DTOJobModel UnpackJobAndReadMetadata(string path) + public static DTOJobModel UnpackJobAndReadMetadata(string filePath) { DTOJobModel job = new DTOJobModel(); // Check if job exists - if (!File.Exists(path)) + if (!File.Exists(filePath)) return null; - EmptyFolder(path); - - string fileName = Path.GetFileName(path); - - using (ZipArchive zipExtractor = ZipFile.OpenRead(fileName)) + EmptyFolder(JOB_TMP_DIRECTORY); + + using (ZipArchive zipExtractor = ZipFile.OpenRead(filePath)) { // Setup main job fields - job.Name = Path.GetFileName(fileName); - job.LastEditTimestamp = new FileInfo(fileName).LastAccessTime; + job.Name = Path.GetFileName(filePath); + job.LastEditTimestamp = new FileInfo(filePath).LastAccessTime; foreach (ZipArchiveEntry entry in zipExtractor.Entries) { + // Extract file + entry.ExtractToFile(JOB_TMP_DIRECTORY + entry.Name, true); + // Get main program content if (entry.Name.Equals(JOB_MAIN_FILENAME, StringComparison.OrdinalIgnoreCase)) { using (var reader = new StreamReader(entry.Open())) job.IsoMainProgram = (reader.ReadToEnd()); } - // Read images else if (VALID_IMAGE_EXTENSIONS.Contains(Path.GetExtension(entry.Name).ToLower())) { var bytes = default(byte[]); - entry.ExtractToFile(JOB_OPENING_PATH + entry.Name, true); + // Populate metadata using (var memstream = new MemoryStream()) { entry.Open().CopyTo(memstream); @@ -191,7 +191,9 @@ namespace Step.Utils } // Consider other file as part program else - entry.ExtractToFile(JOB_OPENING_PATH + entry.Name, true); + { + job.PartPrograms.Add(JOB_TMP_DIRECTORY + entry.Name); + } } return job; diff --git a/Step/App_Start/Startup.cs b/Step/App_Start/Startup.cs index b3f6053b..c899b894 100644 --- a/Step/App_Start/Startup.cs +++ b/Step/App_Start/Startup.cs @@ -144,8 +144,8 @@ namespace Step.App_Start if (!Directory.Exists(MAINTENANCE_ATTACHMENT_PATH)) Directory.CreateDirectory(MAINTENANCE_ATTACHMENT_PATH); - if (!Directory.Exists(TEMP_FILE)) - Directory.CreateDirectory(TEMP_FILE); + if (!Directory.Exists(TEMP_PP_FOLDER)) + Directory.CreateDirectory(TEMP_PP_FOLDER); if (!Directory.Exists(PART_PRG_IMAGES)) Directory.CreateDirectory(PART_PRG_IMAGES); @@ -153,8 +153,8 @@ namespace Step.App_Start if (!Directory.Exists(JOB_TMP_DIRECTORY)) Directory.CreateDirectory(JOB_TMP_DIRECTORY); - if (!Directory.Exists(QUEUE_TMP_FILE)) - Directory.CreateDirectory(QUEUE_TMP_FILE); + if (!Directory.Exists(QUEUE_TMP_FOLDER)) + Directory.CreateDirectory(QUEUE_TMP_FOLDER); } } } diff --git a/Step/Controllers/WebApi/NcFileController.cs b/Step/Controllers/WebApi/NcFileController.cs index 8d7bce5b..002c7dc3 100644 --- a/Step/Controllers/WebApi/NcFileController.cs +++ b/Step/Controllers/WebApi/NcFileController.cs @@ -101,9 +101,9 @@ namespace Step.Controllers.WebApi { ncHandler.Connect(); - File.WriteAllBytes(TEMP_FILE + item.FileName, item.Data); + File.WriteAllBytes(TEMP_PP_FOLDER + item.FileName, item.Data); - CmsError cmsError = ncHandler.UploadPartProgramAndActivate(TEMP_FILE, item.FileName, out ActiveProgramDataModel programData); + CmsError cmsError = ncHandler.UploadPartProgramAndActivate(TEMP_PP_FOLDER, item.FileName, out ActiveProgramDataModel programData); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); } @@ -182,7 +182,7 @@ namespace Step.Controllers.WebApi { ncHandler.Connect(); - File.WriteAllBytes(QUEUE_TMP_FILE + item.FileName, item.Data); + File.WriteAllBytes(QUEUE_TMP_FOLDER + item.FileName, item.Data); // Get reps var repsParam = formItems.Where(x => x.ParameterName == "reps").FirstOrDefault(); @@ -190,7 +190,7 @@ namespace Step.Controllers.WebApi if (repsParam == null || !Int32.TryParse(repsParam.Value, out int reps)) return BadRequest(); - CmsError cmsError = ncHandler.UploadPartProgramAndAddToQueue(QUEUE_TMP_FILE, item.FileName, reps, out queueItem); + CmsError cmsError = ncHandler.UploadPartProgramAndAddToQueue(QUEUE_TMP_FOLDER, item.FileName, reps, out queueItem); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); }