diff --git a/WelsonJS.Toolkit/WelsonJS.Launcher/InstancesForm.cs b/WelsonJS.Toolkit/WelsonJS.Launcher/InstancesForm.cs
index 684da07..5b9c07d 100644
--- a/WelsonJS.Toolkit/WelsonJS.Launcher/InstancesForm.cs
+++ b/WelsonJS.Toolkit/WelsonJS.Launcher/InstancesForm.cs
@@ -5,6 +5,7 @@
//
using System;
using System.Collections.Generic;
+using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Forms;
@@ -14,16 +15,18 @@ namespace WelsonJS.Launcher
{
public partial class InstancesForm : Form
{
- private const string _timestampFormat = "yyyy-MM-dd HH:mm:ss";
-
private string _entryFileName;
private string _scriptName;
+ private readonly string _dateTimeFormat;
private readonly DataStore _dataStore;
public InstancesForm()
{
InitializeComponent();
+ // set the datetime format
+ _dateTimeFormat = Program.GetAppConfig("DateTimeFormat");
+
// set the entry file name to run the instance
_entryFileName = "bootstrap.bat";
@@ -45,74 +48,61 @@ namespace WelsonJS.Launcher
private void InstancesForm_Load(object sender, EventArgs e)
{
lvInstances.Items.Clear();
-
- LoadInstances(Program.GetAppDataPath());
- LoadInstances(Path.GetTempPath());
+ LoadInstances();
}
- private void LoadInstances(string instancesRoot)
+ private void LoadInstances()
{
- if (!Directory.Exists(instancesRoot))
- return;
-
- /*
- foreach (string dir in Directory.GetDirectories(instancesRoot))
- {
- string timestampFile = Path.Combine(dir, ".welsonjs_first_deploy_time");
- string entryScriptFile = Path.Combine(dir, "app.js");
- string firstDeployTime = null;
-
- if (File.Exists(timestampFile)
- && DateTime.TryParse(File.ReadAllText(timestampFile).Trim(), out DateTime parsedTimestamp))
- {
- firstDeployTime = parsedTimestamp.ToString(_timestampFormat);
- }
- else if (File.Exists(entryScriptFile))
- {
- firstDeployTime = File.GetCreationTime(entryScriptFile).ToString(_timestampFormat);
- }
-
- if (firstDeployTime != null)
- {
- lvInstances.Items.Add(new ListViewItem(new[]
- {
- Path.GetFileName(dir),
- firstDeployTime
- })
- {
- Tag = dir
- });
- }
- }
- */
-
var instances = _dataStore.FindAll();
foreach (var instance in instances)
{
- string instanceId = instance["InstanceId"].ToString();
- string firstDeployTime = instance.ContainsKey("FirstDeployTime")
- ? ((DateTime)instance["FirstDeployTime"]).ToString(_timestampFormat)
- : "Unknown";
+ try
+ {
+ string instanceId = instance["InstanceId"].ToString();
+ string firstDeployTime = instance.ContainsKey("FirstDeployTime")
+ ? ((DateTime)instance["FirstDeployTime"]).ToString(_dateTimeFormat)
+ : "Unknown";
- lvInstances.Items.Add(new ListViewItem(new[]
+ lvInstances.Items.Add(new ListViewItem(new[]
+ {
+ instanceId,
+ firstDeployTime
+ })
+ {
+ Tag = ResolveWorkingDirectory(instanceId)
+ });
+ }
+ catch (Exception ex)
{
- instanceId,
- firstDeployTime
- })
- {
- Tag = Path.Combine(instancesRoot, instanceId)
- });
+ Trace.TraceWarning(ex.Message);
+ }
}
}
+ private string ResolveWorkingDirectory(string instanceId)
+ {
+ string workingDirectory = Program.GetWorkingDirectory(instanceId, true);
+
+ if (!Directory.Exists(workingDirectory))
+ {
+ workingDirectory = Path.Combine(Path.GetTempPath(), instanceId);
+ }
+
+ if (!Directory.Exists(workingDirectory))
+ {
+ throw new DirectoryNotFoundException($"Working directory for instance '{instanceId}' does not exist: {workingDirectory}");
+ }
+
+ return workingDirectory;
+ }
+
private void btnStart_Click(object sender, EventArgs e)
{
if (lvInstances.SelectedItems.Count > 0)
{
_scriptName = txtUseSpecificScript.Text;
- string instanceId = lvInstances.SelectedItems[0].Text;
- string workingDirectory = Program.GetWorkingDirectory(instanceId, true);
+ string workingDirectory = (string)lvInstances.SelectedItems[0].Tag;
Task.Run(() =>
{
@@ -135,24 +125,25 @@ namespace WelsonJS.Launcher
private void btnDelete_Click(object sender, EventArgs e)
{
- if (lvInstances.SelectedItems.Count > 0)
+ var selectedItems = lvInstances.SelectedItems;
+
+ if (selectedItems.Count > 0)
{
- string instanceId = lvInstances.SelectedItems[0].Text;
- string workingDirectory = Program.GetWorkingDirectory(instanceId, false);
+ string workingDirectory = (string)selectedItems[0].Tag;
+ string instanceId = selectedItems[0].SubItems[0].Text;
- if (!Directory.Exists(workingDirectory))
- {
- workingDirectory = Path.Combine(Path.GetTempPath(), instanceId);
- }
-
- if (Directory.Exists(workingDirectory))
+ try
{
Directory.Delete(workingDirectory, true);
-
- lvInstances.Items.Clear();
- LoadInstances(Program.GetAppDataPath());
- LoadInstances(Path.GetTempPath());
+ _dataStore.DeleteById(instanceId);
}
+ catch (Exception ex)
+ {
+ Trace.TraceError(ex.Message);
+ }
+
+ lvInstances.Items.Clear();
+ LoadInstances();
}
else
{
@@ -164,8 +155,7 @@ namespace WelsonJS.Launcher
{
if (lvInstances.SelectedItems.Count > 0)
{
- string instanceId = lvInstances.SelectedItems[0].Text;
- string workingDirectory = Program.GetWorkingDirectory(instanceId, true);
+ string workingDirectory = (string)lvInstances.SelectedItems[0].Tag;
if (Directory.Exists(workingDirectory))
{
diff --git a/WelsonJS.Toolkit/WelsonJS.Launcher/Properties/Resources.Designer.cs b/WelsonJS.Toolkit/WelsonJS.Launcher/Properties/Resources.Designer.cs
index 034326f..c3ebefd 100644
--- a/WelsonJS.Toolkit/WelsonJS.Launcher/Properties/Resources.Designer.cs
+++ b/WelsonJS.Toolkit/WelsonJS.Launcher/Properties/Resources.Designer.cs
@@ -132,6 +132,15 @@ namespace WelsonJS.Launcher.Properties {
}
}
+ ///
+ /// yyyy-MM-dd HH:mm:ss과(와) 유사한 지역화된 문자열을 찾습니다.
+ ///
+ internal static string DateTimeFormat {
+ get {
+ return ResourceManager.GetString("DateTimeFormat", resourceCulture);
+ }
+ }
+
///
/// http://localhost:9222/과(와) 유사한 지역화된 문자열을 찾습니다.
///
diff --git a/WelsonJS.Toolkit/WelsonJS.Launcher/Properties/Resources.resx b/WelsonJS.Toolkit/WelsonJS.Launcher/Properties/Resources.resx
index 88786e0..7bf3635 100644
--- a/WelsonJS.Toolkit/WelsonJS.Launcher/Properties/Resources.resx
+++ b/WelsonJS.Toolkit/WelsonJS.Launcher/Properties/Resources.resx
@@ -196,4 +196,7 @@
https://api.criminalip.io/v1/
+
+ yyyy-MM-dd HH:mm:ss
+
\ No newline at end of file
diff --git a/WelsonJS.Toolkit/WelsonJS.Launcher/app.config b/WelsonJS.Toolkit/WelsonJS.Launcher/app.config
index a9f7f58..3e9cad8 100644
--- a/WelsonJS.Toolkit/WelsonJS.Launcher/app.config
+++ b/WelsonJS.Toolkit/WelsonJS.Launcher/app.config
@@ -17,6 +17,7 @@
+