Ensures default timeout is used when calling from JsonToSimpl modules

This commit is contained in:
Neil Dorin
2020-09-14 16:49:53 -06:00
parent 0ed2180464
commit db2f86aede
3 changed files with 228 additions and 219 deletions

View File

@@ -104,7 +104,7 @@ namespace PepperDash.Core.JsonToSimpl
} }
public void setDebugLevel(int level) public void setDebugLevel(int level)
{ {
Debug.SetDebugLevel(level); Debug.SetDebugLevel(level, Debug.DebugTimoutMs);
} }
public override void Save() public override void Save()

View File

@@ -1,221 +1,221 @@
using System; using System;
//using System.IO; //using System.IO;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using Crestron.SimplSharp; using Crestron.SimplSharp;
using Crestron.SimplSharp.CrestronIO; using Crestron.SimplSharp.CrestronIO;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using PepperDash.Core.Config; using PepperDash.Core.Config;
namespace PepperDash.Core.JsonToSimpl namespace PepperDash.Core.JsonToSimpl
{ {
public class JsonToSimplPortalFileMaster : JsonToSimplMaster public class JsonToSimplPortalFileMaster : JsonToSimplMaster
{ {
/// <summary> /// <summary>
/// Sets the filepath as well as registers this with the Global.Masters list /// Sets the filepath as well as registers this with the Global.Masters list
/// </summary> /// </summary>
public string PortalFilepath { get; private set; } public string PortalFilepath { get; private set; }
public string ActualFilePath { get; private set; } public string ActualFilePath { get; private set; }
/*****************************************************************************************/ /*****************************************************************************************/
/** Privates **/ /** Privates **/
// To prevent multiple same-file access // To prevent multiple same-file access
object StringBuilderLock = new object(); object StringBuilderLock = new object();
static object FileLock = new object(); static object FileLock = new object();
/*****************************************************************************************/ /*****************************************************************************************/
/// <summary> /// <summary>
/// SIMPL+ default constructor. /// SIMPL+ default constructor.
/// </summary> /// </summary>
public JsonToSimplPortalFileMaster() public JsonToSimplPortalFileMaster()
{ {
} }
/// <summary> /// <summary>
/// Read, evaluate and udpate status /// Read, evaluate and udpate status
/// </summary> /// </summary>
public void EvaluateFile(string portalFilepath) public void EvaluateFile(string portalFilepath)
{ {
PortalFilepath = portalFilepath; PortalFilepath = portalFilepath;
OnBoolChange(false, 0, JsonToSimplConstants.JsonIsValidBoolChange); OnBoolChange(false, 0, JsonToSimplConstants.JsonIsValidBoolChange);
if (string.IsNullOrEmpty(PortalFilepath)) if (string.IsNullOrEmpty(PortalFilepath))
{ {
CrestronConsole.PrintLine("Cannot evaluate file. JSON file path not set"); CrestronConsole.PrintLine("Cannot evaluate file. JSON file path not set");
return; return;
} }
// Resolve possible wildcarded filename // Resolve possible wildcarded filename
// If the portal file is xyz.json, then // If the portal file is xyz.json, then
// the file we want to check for first will be called xyz.local.json // the file we want to check for first will be called xyz.local.json
var localFilepath = Path.ChangeExtension(PortalFilepath, "local.json"); var localFilepath = Path.ChangeExtension(PortalFilepath, "local.json");
Debug.Console(0, this, "Checking for local file {0}", localFilepath); Debug.Console(0, this, "Checking for local file {0}", localFilepath);
var actualLocalFile = GetActualFileInfoFromPath(localFilepath); var actualLocalFile = GetActualFileInfoFromPath(localFilepath);
if (actualLocalFile != null) if (actualLocalFile != null)
{ {
ActualFilePath = actualLocalFile.FullName; ActualFilePath = actualLocalFile.FullName;
OnStringChange(ActualFilePath, 0, JsonToSimplConstants.ActualFilePathChange); OnStringChange(ActualFilePath, 0, JsonToSimplConstants.ActualFilePathChange);
} }
// If the local file does not exist, then read the portal file xyz.json // If the local file does not exist, then read the portal file xyz.json
// and create the local. // and create the local.
else else
{ {
Debug.Console(1, this, "Local JSON file not found {0}\rLoading portal JSON file", localFilepath); Debug.Console(1, this, "Local JSON file not found {0}\rLoading portal JSON file", localFilepath);
var actualPortalFile = GetActualFileInfoFromPath(portalFilepath); var actualPortalFile = GetActualFileInfoFromPath(portalFilepath);
if (actualPortalFile != null) if (actualPortalFile != null)
{ {
var newLocalPath = Path.ChangeExtension(actualPortalFile.FullName, "local.json"); var newLocalPath = Path.ChangeExtension(actualPortalFile.FullName, "local.json");
// got the portal file, hand off to the merge / save method // got the portal file, hand off to the merge / save method
PortalConfigReader.ReadAndMergeFileIfNecessary(actualPortalFile.FullName, newLocalPath); PortalConfigReader.ReadAndMergeFileIfNecessary(actualPortalFile.FullName, newLocalPath);
ActualFilePath = newLocalPath; ActualFilePath = newLocalPath;
OnStringChange(ActualFilePath, 0, JsonToSimplConstants.ActualFilePathChange); OnStringChange(ActualFilePath, 0, JsonToSimplConstants.ActualFilePathChange);
} }
else else
{ {
var msg = string.Format("Portal JSON file not found: {0}", PortalFilepath); var msg = string.Format("Portal JSON file not found: {0}", PortalFilepath);
Debug.Console(1, this, msg); Debug.Console(1, this, msg);
ErrorLog.Error(msg); ErrorLog.Error(msg);
return; return;
} }
} }
// At this point we should have a local file. Do it. // At this point we should have a local file. Do it.
Debug.Console(1, "Reading local JSON file {0}", ActualFilePath); Debug.Console(1, "Reading local JSON file {0}", ActualFilePath);
string json = File.ReadToEnd(ActualFilePath, System.Text.Encoding.ASCII); string json = File.ReadToEnd(ActualFilePath, System.Text.Encoding.ASCII);
try try
{ {
JsonObject = JObject.Parse(json); JsonObject = JObject.Parse(json);
foreach (var child in Children) foreach (var child in Children)
child.ProcessAll(); child.ProcessAll();
OnBoolChange(true, 0, JsonToSimplConstants.JsonIsValidBoolChange); OnBoolChange(true, 0, JsonToSimplConstants.JsonIsValidBoolChange);
} }
catch (Exception e) catch (Exception e)
{ {
var msg = string.Format("JSON parsing failed:\r{0}", e); var msg = string.Format("JSON parsing failed:\r{0}", e);
CrestronConsole.PrintLine(msg); CrestronConsole.PrintLine(msg);
ErrorLog.Error(msg); ErrorLog.Error(msg);
return; return;
} }
} }
/// <summary> /// <summary>
/// Returns the FileInfo object for a given path, with possible wildcards /// Returns the FileInfo object for a given path, with possible wildcards
/// </summary> /// </summary>
/// <param name="path"></param> /// <param name="path"></param>
/// <returns></returns> /// <returns></returns>
FileInfo GetActualFileInfoFromPath(string path) FileInfo GetActualFileInfoFromPath(string path)
{ {
var dir = Path.GetDirectoryName(path); var dir = Path.GetDirectoryName(path);
var localFilename = Path.GetFileName(path); var localFilename = Path.GetFileName(path);
var directory = new DirectoryInfo(dir); var directory = new DirectoryInfo(dir);
// search the directory for the file w/ wildcards // search the directory for the file w/ wildcards
return directory.GetFiles(localFilename).FirstOrDefault(); return directory.GetFiles(localFilename).FirstOrDefault();
} }
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
/// <param name="level"></param> /// <param name="level"></param>
public void setDebugLevel(int level) public void setDebugLevel(int level)
{ {
Debug.SetDebugLevel(level); Debug.SetDebugLevel(level, Debug.DebugTimoutMs);
} }
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public override void Save() public override void Save()
{ {
// this code is duplicated in the other masters!!!!!!!!!!!!! // this code is duplicated in the other masters!!!!!!!!!!!!!
UnsavedValues = new Dictionary<string, JValue>(); UnsavedValues = new Dictionary<string, JValue>();
// Make each child update their values into master object // Make each child update their values into master object
foreach (var child in Children) foreach (var child in Children)
{ {
Debug.Console(1, "Master [{0}] checking child [{1}] for updates to save", UniqueID, child.Key); Debug.Console(1, "Master [{0}] checking child [{1}] for updates to save", UniqueID, child.Key);
child.UpdateInputsForMaster(); child.UpdateInputsForMaster();
} }
if (UnsavedValues == null || UnsavedValues.Count == 0) if (UnsavedValues == null || UnsavedValues.Count == 0)
{ {
Debug.Console(1, "Master [{0}] No updated values to save. Skipping", UniqueID); Debug.Console(1, "Master [{0}] No updated values to save. Skipping", UniqueID);
return; return;
} }
lock (FileLock) lock (FileLock)
{ {
Debug.Console(1, "Saving"); Debug.Console(1, "Saving");
foreach (var path in UnsavedValues.Keys) foreach (var path in UnsavedValues.Keys)
{ {
var tokenToReplace = JsonObject.SelectToken(path); var tokenToReplace = JsonObject.SelectToken(path);
if (tokenToReplace != null) if (tokenToReplace != null)
{// It's found {// It's found
tokenToReplace.Replace(UnsavedValues[path]); tokenToReplace.Replace(UnsavedValues[path]);
Debug.Console(1, "JSON Master[{0}] Updating '{1}'", UniqueID, path); Debug.Console(1, "JSON Master[{0}] Updating '{1}'", UniqueID, path);
} }
else // No token. Let's make one else // No token. Let's make one
{ {
//http://stackoverflow.com/questions/17455052/how-to-set-the-value-of-a-json-path-using-json-net //http://stackoverflow.com/questions/17455052/how-to-set-the-value-of-a-json-path-using-json-net
Debug.Console(1, "JSON Master[{0}] Cannot write value onto missing property: '{1}'", UniqueID, path); Debug.Console(1, "JSON Master[{0}] Cannot write value onto missing property: '{1}'", UniqueID, path);
// JContainer jpart = JsonObject; // JContainer jpart = JsonObject;
// // walk down the path and find where it goes // // walk down the path and find where it goes
//#warning Does not handle arrays. //#warning Does not handle arrays.
// foreach (var part in path.Split('.')) // foreach (var part in path.Split('.'))
// { // {
// var openPos = part.IndexOf('['); // var openPos = part.IndexOf('[');
// if (openPos > -1) // if (openPos > -1)
// { // {
// openPos++; // move to number // openPos++; // move to number
// var closePos = part.IndexOf(']'); // var closePos = part.IndexOf(']');
// var arrayName = part.Substring(0, openPos - 1); // get the name // var arrayName = part.Substring(0, openPos - 1); // get the name
// var index = Convert.ToInt32(part.Substring(openPos, closePos - openPos)); // var index = Convert.ToInt32(part.Substring(openPos, closePos - openPos));
// // Check if the array itself exists and add the item if so // // Check if the array itself exists and add the item if so
// if (jpart[arrayName] != null) // if (jpart[arrayName] != null)
// { // {
// var arrayObj = jpart[arrayName] as JArray; // var arrayObj = jpart[arrayName] as JArray;
// var item = arrayObj[index]; // var item = arrayObj[index];
// if (item == null) // if (item == null)
// arrayObj.Add(new JObject()); // arrayObj.Add(new JObject());
// } // }
// Debug.Console(0, "IGNORING MISSING ARRAY VALUE FOR NOW"); // Debug.Console(0, "IGNORING MISSING ARRAY VALUE FOR NOW");
// continue; // continue;
// } // }
// // Build the // // Build the
// if (jpart[part] == null) // if (jpart[part] == null)
// jpart.Add(new JProperty(part, new JObject())); // jpart.Add(new JProperty(part, new JObject()));
// jpart = jpart[part] as JContainer; // jpart = jpart[part] as JContainer;
// } // }
// jpart.Replace(UnsavedValues[path]); // jpart.Replace(UnsavedValues[path]);
} }
} }
using (StreamWriter sw = new StreamWriter(ActualFilePath)) using (StreamWriter sw = new StreamWriter(ActualFilePath))
{ {
try try
{ {
sw.Write(JsonObject.ToString()); sw.Write(JsonObject.ToString());
sw.Flush(); sw.Flush();
} }
catch (Exception e) catch (Exception e)
{ {
string err = string.Format("Error writing JSON file:\r{0}", e); string err = string.Format("Error writing JSON file:\r{0}", e);
Debug.Console(0, err); Debug.Console(0, err);
ErrorLog.Warn(err); ErrorLog.Warn(err);
return; return;
} }
} }
} }
} }
} }
} }

View File

@@ -26,8 +26,14 @@ namespace PepperDash.Core
/// </summary> /// </summary>
public static string FileName = string.Format(@"app{0}Debug.json", InitialParametersClass.ApplicationNumber); public static string FileName = string.Format(@"app{0}Debug.json", InitialParametersClass.ApplicationNumber);
/// <summary>
/// Current debgu level
/// </summary>
public static int Level { get; private set; } public static int Level { get; private set; }
/// <summary>
/// Indicates if config should be loaded on next boot
/// </summary>
public static bool DoNotLoadOnNextBoot { get; private set; } public static bool DoNotLoadOnNextBoot { get; private set; }
static DebugContextCollection Contexts; static DebugContextCollection Contexts;
@@ -37,8 +43,11 @@ namespace PepperDash.Core
/// <summary> /// <summary>
/// Default debug timeout (30 min) /// Default debug timeout (30 min)
/// </summary> /// </summary>
static long DebugTimoutMs = 1800000; public static long DebugTimoutMs = 1800000;
/// <summary>
/// Current version string
/// </summary>
public static string PepperDashCoreVersion { get; private set; } public static string PepperDashCoreVersion { get; private set; }
static CTimer SaveTimer; static CTimer SaveTimer;