From d043d52eeeda1dd11e5231c2a245f7aa1a8b3956 Mon Sep 17 00:00:00 2001 From: Bryan Kowal Date: Thu, 8 Aug 2013 17:44:12 -0500 Subject: [PATCH] Issue #2198 - created a launcher that would start both AlertViz and CAVE; no extra windows are created now - Note: VizLauncher and AWIPSII.CAVE are NOT Eclipse projects. Former-commit-id: ff9dd063b9817e73f9a980d54d4c0f637b5ba905 [formerly b88d324aacff91a1b053851f2b78ddfad13049db] [formerly ff9dd063b9817e73f9a980d54d4c0f637b5ba905 [formerly b88d324aacff91a1b053851f2b78ddfad13049db] [formerly 620fb06773e479c680cdaf55c55f153d098fe42c [formerly a29d3008676c2291c27ceed4e7aad10289a64569]]] Former-commit-id: 620fb06773e479c680cdaf55c55f153d098fe42c Former-commit-id: 10af499f874af875c2faed90192822b46daa83c5 [formerly 083ca8211307d096ac67d417a7f5f3cd368110ab] Former-commit-id: 62fd3f947e58cceb7f13fd039192bbeaa847c747 --- .../static/win32.x86/alertviz/alertviz.bat | 69 --------- cave/build/static/win32.x86/cave/cave.bat | 72 --------- msi/AWIPSII.CAVE/AWIPSII.CAVE.suo | Bin 17920 -> 18432 bytes msi/AWIPSII.CAVE/AWIPSII.CAVE/AWIPSII.wxs | 39 ++--- msi/VizLauncher/VizLauncher.sln | 20 +++ msi/VizLauncher/VizLauncher.suo | Bin 0 -> 32768 bytes msi/VizLauncher/VizLauncher/Form1.Designer.cs | 79 ++++++++++ msi/VizLauncher/VizLauncher/Form1.cs | 20 +++ msi/VizLauncher/VizLauncher/Form1.resx | 120 +++++++++++++++ msi/VizLauncher/VizLauncher/Program.cs | 31 ++++ .../VizLauncher/Properties/AssemblyInfo.cs | 36 +++++ .../Properties/Resources.Designer.cs | 71 +++++++++ .../VizLauncher/Properties/Resources.resx | 117 +++++++++++++++ .../Properties/Settings.Designer.cs | 30 ++++ .../VizLauncher/Properties/Settings.settings | 7 + .../VizLauncher/VizLauncher.csproj | 94 ++++++++++++ .../VizLauncher/VizLauncher.csproj.user | 3 + .../com/raytheon/viz/launcher/VizLauncher.cs | 68 +++++++++ .../environment/EnvironmentProperties.cs | 34 +++++ .../launcher/environment/VizEnvironment.cs | 137 ++++++++++++++++++ .../process/AbstractProcessLauncher.cs | 129 +++++++++++++++++ .../viz/launcher/process/IProcessLauncher.cs | 16 ++ .../process/impl/AlertvizProcessLauncher.cs | 62 ++++++++ .../process/impl/CaveProcessLauncher.cs | 38 +++++ msi/build/A2Staging/Scripts/WiXBuild.ps1 | Bin 4372 -> 4396 bytes .../A2Staging/VisualStudio/VizLauncher.exe | Bin 0 -> 16384 bytes msi/build/A2Staging/VisualStudio/_DELETE_ME_ | 0 27 files changed, 1125 insertions(+), 167 deletions(-) delete mode 100644 cave/build/static/win32.x86/alertviz/alertviz.bat delete mode 100644 cave/build/static/win32.x86/cave/cave.bat create mode 100644 msi/VizLauncher/VizLauncher.sln create mode 100644 msi/VizLauncher/VizLauncher.suo create mode 100644 msi/VizLauncher/VizLauncher/Form1.Designer.cs create mode 100644 msi/VizLauncher/VizLauncher/Form1.cs create mode 100644 msi/VizLauncher/VizLauncher/Form1.resx create mode 100644 msi/VizLauncher/VizLauncher/Program.cs create mode 100644 msi/VizLauncher/VizLauncher/Properties/AssemblyInfo.cs create mode 100644 msi/VizLauncher/VizLauncher/Properties/Resources.Designer.cs create mode 100644 msi/VizLauncher/VizLauncher/Properties/Resources.resx create mode 100644 msi/VizLauncher/VizLauncher/Properties/Settings.Designer.cs create mode 100644 msi/VizLauncher/VizLauncher/Properties/Settings.settings create mode 100644 msi/VizLauncher/VizLauncher/VizLauncher.csproj create mode 100644 msi/VizLauncher/VizLauncher/VizLauncher.csproj.user create mode 100644 msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/VizLauncher.cs create mode 100644 msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/environment/EnvironmentProperties.cs create mode 100644 msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/environment/VizEnvironment.cs create mode 100644 msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/process/AbstractProcessLauncher.cs create mode 100644 msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/process/IProcessLauncher.cs create mode 100644 msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/process/impl/AlertvizProcessLauncher.cs create mode 100644 msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/process/impl/CaveProcessLauncher.cs create mode 100644 msi/build/A2Staging/VisualStudio/VizLauncher.exe delete mode 100644 msi/build/A2Staging/VisualStudio/_DELETE_ME_ diff --git a/cave/build/static/win32.x86/alertviz/alertviz.bat b/cave/build/static/win32.x86/alertviz/alertviz.bat deleted file mode 100644 index 5e4b50ee83..0000000000 --- a/cave/build/static/win32.x86/alertviz/alertviz.bat +++ /dev/null @@ -1,69 +0,0 @@ -@echo OFF - -REM Determine if we are running on a 32-bit or 64-bit OS. -IF NOT EXIST C:\Windows\SysWOW64\reg.exe ( - SET REG_EXE=C:\Windows\System32\reg.exe -) ELSE ( - SET REG_EXE=C:\Windows\SysWOW64\reg.exe -) - -REM Determine where we are located. -SET CONTAINING_DIRECTORY=%~dp0 - -REM Prepare the environment. - -REM Registry Query Variables. -SET A2_JAVA_REG="HKLM\Software\Raytheon\Runtime Environment\AWIPS II Java" -SET A2_PYTHON_REG="HKLM\Software\Raytheon\Runtime Environment\AWIPS II Python" -REM Determine where AWIPS II Java (the jre) is located. -%REG_EXE% QUERY %A2_JAVA_REG% /v JavaJreDirectory > NUL 2>&1 -IF ERRORLEVEL 1 (echo ENVIRONMENT ERROR - Unable to find AWIPS II Java. && PAUSE && EXIT) -FOR /F "tokens=2* delims= " %%A IN ( -'%REG_EXE% QUERY %A2_JAVA_REG% /v JavaJreDirectory') DO ( -SET JavaJreDirectory=%%B) -REM Determine where AWIPS II Python is located. -%REG_EXE% QUERY %A2_PYTHON_REG% /v PythonInstallDirectory > NUL 2>&1 -IF ERRORLEVEL 1 (echo ENVIRONMENT ERROR - Unable to find AWIPS II Python. && PAUSE && EXIT) -FOR /F "tokens=2* delims= " %%A IN ( -'%REG_EXE% QUERY %A2_PYTHON_REG% /v PythonInstallDirectory') DO ( -SET PythonInstallDirectory=%%B) - -REM Add Java and Python to the path. -SET Path=%PythonInstallDirectory%;%PythonInstallDirectory%\DLLs;%Path% -SET Path=%JavaJreDirectory%\bin;%Path% -REM Define 'PythonPath'. -SET PythonPath=%PythonInstallDirectory%\Lib\lib-tk;%PythonPath% -SET PythonPath=%PythonInstallDirectory%\DLLs;%PythonPath% -SET PythonPath=%PythonInstallDirectory%\Lib;%PythonPath% -SET PythonPath=%PythonInstallDirectory%;%PythonPath% - -REM Eliminate variables that will no longer be used. -SET PythonInstallDirectory= -SET JavaJreDirectory= -SET REG_EXE= -SET A2_JAVA_REG= -SET A2_PYTHON_REG= - -REM Determine where we will be logging to. -SET HOME_DIRECTORY=%HOMEDRIVE%%HOMEPATH% -SET CAVEDATA_LOG_DIRECTORY=%HOMEDRIVE%%HOMEPATH%\caveData\logs -SET CONSOLE_LOG_DIRECTORY=%CAVEDATA_LOG_DIRECTORY%\consoleLogs\%COMPUTERNAME% -IF NOT EXIST "%CONSOLE_LOG_DIRECTORY%" (MKDIR "%CONSOLE_LOG_DIRECTORY%") - -echo Starting ALERTVIZ; leave this CMD window open to enable AlertViz 'restart'. -REM Start AlertViz (and implement the alertviz restart capability). -:AlertVizLoopStart -SET RND=%random% -SET RND_DATETIME_FILE=%TMP%\awips2dt_%RND%.tmp -REM Python is used to retrieve the current date and time because the order -REM of the Windows date/time fields is not necessarily guaranteed and the -REM Windows date/time fields can only be extracted using substring operations -REM instead of -formatter- strings like Linux allows. -python -c "from datetime import datetime; print datetime.now().strftime('%%Y%%m%%d_%%H%%M%%S');" > %RND_DATETIME_FILE% -SET /p LOG_DATETIME= < %RND_DATETIME_FILE% -DEL %RND_DATETIME_FILE% -"%CONTAINING_DIRECTORY%alertviz.exe" %* > "%CONSOLE_LOG_DIRECTORY%\alertviz_%LOG_DATETIME%.log" 2>&1 -IF %ERRORLEVEL% == 0 (EXIT) -echo Restarting AlertViz. -GOTO AlertVizLoopStart - diff --git a/cave/build/static/win32.x86/cave/cave.bat b/cave/build/static/win32.x86/cave/cave.bat deleted file mode 100644 index 0b347287dd..0000000000 --- a/cave/build/static/win32.x86/cave/cave.bat +++ /dev/null @@ -1,72 +0,0 @@ -@echo OFF - -REM Determine if we are running on a 32-bit or 64-bit OS. -IF NOT EXIST C:\Windows\SysWOW64\reg.exe ( - SET REG_EXE=C:\Windows\System32\reg.exe -) ELSE ( - SET REG_EXE=C:\Windows\SysWOW64\reg.exe -) - -REM Determine where we are located. -SET CONTAINING_DIRECTORY=%~dp0 - -REM Prepare the environment. - -REM Registry Query Variables. -SET A2_JAVA_REG="HKLM\Software\Raytheon\Runtime Environment\AWIPS II Java" -SET A2_PYTHON_REG="HKLM\Software\Raytheon\Runtime Environment\AWIPS II Python" -REM Determine where AWIPS II Java (the jre) is located. -%REG_EXE% QUERY %A2_JAVA_REG% /v JavaJreDirectory > NUL 2>&1 -IF ERRORLEVEL 1 (echo ENVIRONMENT ERROR - Unable to find AWIPS II Java. && PAUSE && EXIT) -FOR /F "tokens=2* delims= " %%A IN ( -'%REG_EXE% QUERY %A2_JAVA_REG% /v JavaJreDirectory') DO ( -SET JavaJreDirectory=%%B) -REM Determine where AWIPS II Python is located. -%REG_EXE% QUERY %A2_PYTHON_REG% /v PythonInstallDirectory > NUL 2>&1 -IF ERRORLEVEL 1 (echo ENVIRONMENT ERROR - Unable to find AWIPS II Python. && PAUSE && EXIT) -FOR /F "tokens=2* delims= " %%A IN ( -'%REG_EXE% QUERY %A2_PYTHON_REG% /v PythonInstallDirectory') DO ( -SET PythonInstallDirectory=%%B) - -REM Add Java and Python to the path. -SET Path=%PythonInstallDirectory%;%PythonInstallDirectory%\DLLs;%Path% -SET Path=%JavaJreDirectory%\bin;%Path% -REM Add the CAVE lib directory to the path. -SET Path=%CONTAINING_DIRECTORY%lib;%Path% -REM Define 'PythonPath'. -SET PythonPath=%CONTAINING_DIRECTORY%lib;%PythonPath% -SET PythonPath=%PythonInstallDirectory%\Lib\lib-tk;%PythonPath% -SET PythonPath=%PythonInstallDirectory%\DLLs;%PythonPath% -SET PythonPath=%PythonInstallDirectory%\Lib;%PythonPath% -SET PythonPath=%PythonInstallDirectory%;%PythonPath% - -REM Eliminate variables that will no longer be used. -SET PythonInstallDirectory= -SET JavaJreDirectory= -SET REG_EXE= -SET A2_JAVA_REG= -SET A2_PYTHON_REG= - -REM Determine where we will be logging to. -SET HOME_DIRECTORY=%HOMEDRIVE%%HOMEPATH% -SET CAVEDATA_LOG_DIRECTORY=%HOMEDRIVE%%HOMEPATH%\caveData\logs -SET CONSOLE_LOG_DIRECTORY=%CAVEDATA_LOG_DIRECTORY%\consoleLogs\%COMPUTERNAME% -IF NOT EXIST "%CONSOLE_LOG_DIRECTORY%" (MKDIR "%CONSOLE_LOG_DIRECTORY%") - -SET RND=%random% -SET RND_DATETIME_FILE=%TMP%\awips2dt_%RND%.tmp -REM Python is used to retrieve the current date and time because the order -REM of the Windows date/time fields is not necessarily guaranteed and the -REM Windows date/time fields can only be extracted using substring operations -REM instead of -formatter- strings like Linux allows. -python -c "from datetime import datetime; print datetime.now().strftime('%%Y%%m%%d_%%H%%M%%S');" > %RND_DATETIME_FILE% -SET /p LOG_DATETIME= < %RND_DATETIME_FILE% -DEL %RND_DATETIME_FILE% - -echo THIS CMD WINDOW CAN BE CLOSED AT ANY TIME! -cd %HOMEPATH% -REM Start CAVE. -"%CONTAINING_DIRECTORY%cave.exe" %* > "%CONSOLE_LOG_DIRECTORY%\cave_%LOG_DATETIME%.log" 2>&1 -IF ERRORLEVEL 1 (echo CAVE ERROR - check the logs for additional information. && PAUSE) - -EXIT diff --git a/msi/AWIPSII.CAVE/AWIPSII.CAVE.suo b/msi/AWIPSII.CAVE/AWIPSII.CAVE.suo index 9728b7530319adc12098cba6b64c817aa7ead58f..34a3fcf7d8579ceb68152230636ef5c277b8190f 100644 GIT binary patch delta 1743 zcma)6ZA@EL7(VB6FDRdZa@KLKqw?Kr7rQ|ShJdl{fQ63= z4wp!ld0*6RKjx1m{xJS9xyB!h$w)NOnCP4_aZ#iGP@~CWVgkm^#QL1Bb^O`j+&uUF zIPW>cJ-A?WC( zP(|4=8)tErWHC0uA}j%J1ez&oX>%#Cft9_j&Ln48MxX5Jq!!t%J7gLtdY{T4DW`>^ zM%}K_N3xGQDQO?HaWjl-fSfC|VNdZ2O732?R6#AKF{rm#qrT!kx?S9;JDj?sJo9%_ z(9vfqz=0C`fMTUbOJl9^Y}8I?q87gwwdZk-`M%7*aQhf0Uixl2$R7OY5vlHO*t+5jIWN zT`JvjS;^{Z=N3{u*L8P-AEKmt(8g+UuIQ%wIdrF#PAFz*cJC|nmA8tjyg$>DCrVd* z`S~J<=e8@TFn#MOE)vz4Vp_&?m9UC?@TPUL^`Xbt4D7UHhX1)GzX+x&F^=J4=N;V({qNqf{ z=3-!3hVTb~L26@%{FGoG-b7(q_Y@j|eb@3VgDlLBvB%kqEJo=AV^stFp>PfnEv!XE zPiDpn-)>iP6PrecXBZ6y>Ip9aAEk=Gv-GQ3rSA_eklHq6_?usljCJ3fRQEb|eGSk7 z0@i@s%O>bW$d_ndsxe+}_bap<3exeWw<&F2CbhNw-|Skvx|%CWk(At^8%-``8kak-_RweDR^#))UwJkz=BuF=H1j6D17VD28ya{g zd21rd2;_H#oabXL9#4!|>o3o5DB2PU1fU=SPu2v={BQdr_=1 g1>Lf2#}fK6Bor3qG6b1!+McA4_96Xb3xWFo1LObz+5i9m delta 1164 zcmZ8gUrbw77(eH7FKsDZ3v}4k7Fvd^LkjmoN1+txrGJ!68FOYnteGNfNDaYeEpagB znr&)~iy8N~hb2pV*qe^TC3i3WNx*DR+oCQp#`s`JeDT2;ADD4lV*L&j(|B%v`Of#9 z@BGepzu!6KE4+M}-zrPyC257Pz9Ad(yyegNUq7zge_$5n_qg<%geS_B+QJz7r&6g1 zw9@<;f`_n=;3bH-uWH2{XX@kAy%gvpsMUpjvIB$&;Sgbv5G4!|h6ypk?jfTzAFKL_ zs)cMRyWb>dwi?LoE?l$x&J}EiZ{XY534CaaT5_|cVpf06+^}8b4rZam1_D)9!9%%I zX(HznEZL7(tu1oHe5*u7c{ooeS5L! zn!=s-QKPBEpT%O+dApz11vd?>J9Rh*tXOb%<8*T~esLs-&s_r#oe?rxCM=)Ij7jWA z@YYwLCR`XE-)p$Hls2OI9FN^k8#S7plmsmiPmK@aBfXpdT$8`FhcnK15?DS_OLbTz z%Mwe~=3j3RBGR!e_5a+&ffuVh!U#EM{_~GbPWC4C<7sO0oHDNGw^a*J;CT1&A0e?OBDf7bcD+^P+5R z#_0N6I-}r8*D^na#RF7?kXT&$-6HH4$@zmo1Hr))NCd42gj(wswi&)KZ-wsGiK{3E z&iBkAD0>m?ZO2QtQC#SK7kOI~{<3=UeC#X=fdH2KedcsuLBgF8x4EIMNXqv6SUs9F zFGb=CpF_Ss+`Mzma%@4gjb+(!h8bH39l;^0z(XWnXPi1)pw2GPqjInY`k$|m9qF`^ zimwY5;q>(2=2%C!co^bgr|$7oOr`Iv-k(WFBWW!>5seIlH7%uv^|Ypkjd)Tt5vBNd zJ9hN4S59P`K`U-^tqnZrZJVcgAp IeIq6P3;M!d1^@s6 diff --git a/msi/AWIPSII.CAVE/AWIPSII.CAVE/AWIPSII.wxs b/msi/AWIPSII.CAVE/AWIPSII.CAVE/AWIPSII.wxs index ff3181a90c..43f0b45823 100644 --- a/msi/AWIPSII.CAVE/AWIPSII.CAVE/AWIPSII.wxs +++ b/msi/AWIPSII.CAVE/AWIPSII.CAVE/AWIPSII.wxs @@ -24,30 +24,14 @@ - - - - - + + + + - - - - - - - - @@ -71,7 +55,6 @@ - @@ -80,16 +63,20 @@ - + + + + - diff --git a/msi/VizLauncher/VizLauncher.sln b/msi/VizLauncher/VizLauncher.sln new file mode 100644 index 0000000000..b9a96d5c02 --- /dev/null +++ b/msi/VizLauncher/VizLauncher.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual C# Express 2010 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VizLauncher", "VizLauncher\VizLauncher.csproj", "{45B15612-0725-479C-8E1B-9B63F2FB45A3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x86 = Debug|x86 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {45B15612-0725-479C-8E1B-9B63F2FB45A3}.Debug|x86.ActiveCfg = Debug|x86 + {45B15612-0725-479C-8E1B-9B63F2FB45A3}.Debug|x86.Build.0 = Debug|x86 + {45B15612-0725-479C-8E1B-9B63F2FB45A3}.Release|x86.ActiveCfg = Release|x86 + {45B15612-0725-479C-8E1B-9B63F2FB45A3}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/msi/VizLauncher/VizLauncher.suo b/msi/VizLauncher/VizLauncher.suo new file mode 100644 index 0000000000000000000000000000000000000000..610c195a0e9dd080ae3f9cbf916ca0b32fe2770f GIT binary patch literal 32768 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 Z>UAG%I(*|(r$4&p!D48aP07i5_J8Hh*0%rv literal 0 HcmV?d00001 diff --git a/msi/VizLauncher/VizLauncher/Form1.Designer.cs b/msi/VizLauncher/VizLauncher/Form1.Designer.cs new file mode 100644 index 0000000000..0f61ba1709 --- /dev/null +++ b/msi/VizLauncher/VizLauncher/Form1.Designer.cs @@ -0,0 +1,79 @@ +namespace VizLauncher +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.label1 = new System.Windows.Forms.Label(); + this.lblFailureDetail = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // label1 + // + this.label1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(128))))); + this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.Location = new System.Drawing.Point(12, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(337, 50); + this.label1.TabIndex = 0; + this.label1.Text = "Failed to Start AWIPS II Viz!"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // lblFailureDetail + // + this.lblFailureDetail.BackColor = System.Drawing.Color.White; + this.lblFailureDetail.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblFailureDetail.Location = new System.Drawing.Point(14, 59); + this.lblFailureDetail.Name = "lblFailureDetail"; + this.lblFailureDetail.Size = new System.Drawing.Size(335, 119); + this.lblFailureDetail.TabIndex = 1; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(361, 187); + this.Controls.Add(this.lblFailureDetail); + this.Controls.Add(this.label1); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "Form1"; + this.ShowInTaskbar = false; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Viz Launcher"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label lblFailureDetail; + } +} + diff --git a/msi/VizLauncher/VizLauncher/Form1.cs b/msi/VizLauncher/VizLauncher/Form1.cs new file mode 100644 index 0000000000..4c206c62fe --- /dev/null +++ b/msi/VizLauncher/VizLauncher/Form1.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace VizLauncher +{ + public partial class Form1 : Form + { + public Form1(String errorText) + { + InitializeComponent(); + this.lblFailureDetail.Text = errorText; + } + } +} \ No newline at end of file diff --git a/msi/VizLauncher/VizLauncher/Form1.resx b/msi/VizLauncher/VizLauncher/Form1.resx new file mode 100644 index 0000000000..29dcb1b3a3 --- /dev/null +++ b/msi/VizLauncher/VizLauncher/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/msi/VizLauncher/VizLauncher/Program.cs b/msi/VizLauncher/VizLauncher/Program.cs new file mode 100644 index 0000000000..dd5d415317 --- /dev/null +++ b/msi/VizLauncher/VizLauncher/Program.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; +using VizLauncher.com.raytheon.viz.launcher; + +namespace VizLauncher +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + VizLauncher.com.raytheon.viz.launcher.VizLauncher vizLauncher = + new VizLauncher.com.raytheon.viz.launcher.VizLauncher(); + bool success = vizLauncher.run(Application.StartupPath); + if (success == false) + { + // Display the "Failure" dialog. + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1(vizLauncher.getErrorDetail())); + } + + Application.Exit(); + } + } +} diff --git a/msi/VizLauncher/VizLauncher/Properties/AssemblyInfo.cs b/msi/VizLauncher/VizLauncher/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..5d149225c7 --- /dev/null +++ b/msi/VizLauncher/VizLauncher/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("VizLauncher")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("VizLauncher")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("7f929b46-b56e-47eb-b6e6-ff79e54f6572")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/msi/VizLauncher/VizLauncher/Properties/Resources.Designer.cs b/msi/VizLauncher/VizLauncher/Properties/Resources.Designer.cs new file mode 100644 index 0000000000..fb7e7281d0 --- /dev/null +++ b/msi/VizLauncher/VizLauncher/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.17929 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace VizLauncher.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("VizLauncher.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/msi/VizLauncher/VizLauncher/Properties/Resources.resx b/msi/VizLauncher/VizLauncher/Properties/Resources.resx new file mode 100644 index 0000000000..ffecec851a --- /dev/null +++ b/msi/VizLauncher/VizLauncher/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/msi/VizLauncher/VizLauncher/Properties/Settings.Designer.cs b/msi/VizLauncher/VizLauncher/Properties/Settings.Designer.cs new file mode 100644 index 0000000000..b5a088c6b6 --- /dev/null +++ b/msi/VizLauncher/VizLauncher/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.17929 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace VizLauncher.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/msi/VizLauncher/VizLauncher/Properties/Settings.settings b/msi/VizLauncher/VizLauncher/Properties/Settings.settings new file mode 100644 index 0000000000..abf36c5d3d --- /dev/null +++ b/msi/VizLauncher/VizLauncher/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/msi/VizLauncher/VizLauncher/VizLauncher.csproj b/msi/VizLauncher/VizLauncher/VizLauncher.csproj new file mode 100644 index 0000000000..ccd040c7b0 --- /dev/null +++ b/msi/VizLauncher/VizLauncher/VizLauncher.csproj @@ -0,0 +1,94 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {45B15612-0725-479C-8E1B-9B63F2FB45A3} + WinExe + Properties + VizLauncher + VizLauncher + v4.0 + Client + 512 + + + x86 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + x86 + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + \ No newline at end of file diff --git a/msi/VizLauncher/VizLauncher/VizLauncher.csproj.user b/msi/VizLauncher/VizLauncher/VizLauncher.csproj.user new file mode 100644 index 0000000000..695b5c78b9 --- /dev/null +++ b/msi/VizLauncher/VizLauncher/VizLauncher.csproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/VizLauncher.cs b/msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/VizLauncher.cs new file mode 100644 index 0000000000..f00af7eaf9 --- /dev/null +++ b/msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/VizLauncher.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using VizLauncher.com.raytheon.viz.launcher.environment; +using VizLauncher.com.raytheon.viz.launcher.process; +using VizLauncher.com.raytheon.viz.launcher.process.impl; + +namespace VizLauncher.com.raytheon.viz.launcher +{ + public class VizLauncher + { + private String errorDetail; + + public bool run(String location) + { + VizEnvironment vizEnvironment = new VizEnvironment(location); + if (vizEnvironment.isReady() == false) + { + this.errorDetail = vizEnvironment.getExceptionText(); + return false; + } + + /* Alternatively, we would be able to construct both process launchers using Spring and inject them. */ + + // Construct the AlertViz Process Launcher. + IProcessLauncher alertvizProcessLauncher = new AlertvizProcessLauncher(vizEnvironment); + if (alertvizProcessLauncher.isReady() == false) + { + this.errorDetail = alertvizProcessLauncher.getExceptionText(); + return false; + } + Thread alertvizThread = new Thread(alertvizProcessLauncher.launchProcess); + + // Construct the CAVE Process Launcher. + IProcessLauncher caveProcessLauncher = new CaveProcessLauncher(vizEnvironment); + if (caveProcessLauncher.isReady() == false) + { + this.errorDetail = caveProcessLauncher.getExceptionText(); + return false; + } + Thread caveThread = new Thread(caveProcessLauncher.launchProcess); + + // Start AlertViz. + alertvizThread.Start(); + + // Delay - Give Alertviz Time To Start. + Thread.Sleep(1000); + + // Start CAVE. + caveThread.Start(); + + // Wait for CAVE. + caveThread.Join(); + + // Wait for AlertViz. + alertvizThread.Join(); + + return true; + } + + public String getErrorDetail() + { + return this.errorDetail; + } + } +} \ No newline at end of file diff --git a/msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/environment/EnvironmentProperties.cs b/msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/environment/EnvironmentProperties.cs new file mode 100644 index 0000000000..6db871db40 --- /dev/null +++ b/msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/environment/EnvironmentProperties.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; + +namespace VizLauncher.com.raytheon.viz.launcher.environment +{ + public abstract class EnvironmentProperties + { + /* Environment Properties */ + public static readonly String USER_HOME_ENV_PROPERTY = "%HOMEDRIVE%%HOMEPATH%"; + public static readonly String COMPUTER_NAME_ENV_PROPERTY = "%COMPUTERNAME%"; + + /* Registry Constants */ + public static readonly String A2_JAVA_REG = @"Software\Raytheon\Runtime Environment\AWIPS II Java"; + public static readonly String A2_PYTHON_REG = @"Software\Raytheon\Runtime Environment\AWIPS II Python"; + + public static readonly String JAVA_JRE_VALUE_NAME = "JavaJreDirectory"; + public static readonly String PYTHON_INSTALL_NAME = "PythonInstallDirectory"; + + /* Environment Additions */ + public static readonly String ENVIRONMENT_VARIABLE_PATH = "Path"; + public static readonly String ENVIRONMENT_VARIABLE_PYTHON_PATH = "PythonPath"; + + public static readonly String PATH_PYTHON_DLLS = Path.DirectorySeparatorChar + "DLLs"; + public static readonly String PATH_JAVA_BIN = Path.DirectorySeparatorChar + "bin"; + + public static readonly String PYTHON_PATH_PYTHON_LIBTK = + Path.DirectorySeparatorChar + "Lib" + Path.DirectorySeparatorChar + "lib-tk"; + public static readonly String PYTHON_PATH_PYTHON_DLLS = Path.DirectorySeparatorChar + "DLLs"; + public static readonly String PYTHON_PATH_PYTHON_LIB = Path.DirectorySeparatorChar + "Lib"; + } +} diff --git a/msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/environment/VizEnvironment.cs b/msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/environment/VizEnvironment.cs new file mode 100644 index 0000000000..5172e046ee --- /dev/null +++ b/msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/environment/VizEnvironment.cs @@ -0,0 +1,137 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; +using Microsoft.Win32; + +namespace VizLauncher.com.raytheon.viz.launcher.environment +{ + public class VizEnvironment + { + private static readonly String CONSOLE_LOGS_DIRECTORY = + Path.DirectorySeparatorChar + "caveData" + Path.DirectorySeparatorChar + + "logs" + Path.DirectorySeparatorChar + "consoleLogs"; + private String location; + private String logDirectory = null; + private String path = null; + private String pythonPath = null; + + // did an error occur while initializing this object? + private bool ready; + // details about the error that has occurred. + private String exceptionText; + + public VizEnvironment(String location) + { + this.location = location; + this.init(); + } + + private void init() + { + /* For now we will assume that the environment properties will be available */ + // determine the location of the user's "home" directory. + String homeDirectory = + this.resolveEnvironmentProperty(EnvironmentProperties.USER_HOME_ENV_PROPERTY); + + // determine the computer name. + String computerName = + this.resolveEnvironmentProperty(EnvironmentProperties.COMPUTER_NAME_ENV_PROPERTY); + + // construct the path to the log directory. + this.logDirectory = homeDirectory + CONSOLE_LOGS_DIRECTORY + + Path.DirectorySeparatorChar + computerName; + + // retrieve the jdk directory from the registry. + String jdkDirectory = + this.retrieveRegistryProperty(EnvironmentProperties.A2_JAVA_REG, + EnvironmentProperties.JAVA_JRE_VALUE_NAME); + if (jdkDirectory == null) + { + this.notReady("Unable to retrieve the Java JDK Path from the registry!"); + return; + } + + // retrieve the python location from the registry. + String pythonLocation = + this.retrieveRegistryProperty(EnvironmentProperties.A2_PYTHON_REG, + EnvironmentProperties.PYTHON_INSTALL_NAME); + if (pythonLocation == null) + { + this.notReady("Unable to retrieve the Python Install Location from the registry!"); + return; + } + + // Construct the PATH. + this.path = pythonLocation + Path.PathSeparator; + this.path += pythonLocation + EnvironmentProperties.PATH_PYTHON_DLLS + Path.PathSeparator; + this.path += jdkDirectory + EnvironmentProperties.PATH_JAVA_BIN; + + // Construct the PYTHON_PATH. + this.pythonPath = pythonLocation + EnvironmentProperties.PYTHON_PATH_PYTHON_LIBTK + Path.PathSeparator; + this.pythonPath += pythonLocation + EnvironmentProperties.PYTHON_PATH_PYTHON_DLLS + Path.PathSeparator; + this.pythonPath += pythonLocation + EnvironmentProperties.PYTHON_PATH_PYTHON_LIB + Path.PathSeparator; + this.pythonPath += pythonLocation; + + this.ready = true; + } + + private String resolveEnvironmentProperty(String property) + { + return Environment.ExpandEnvironmentVariables(property); + } + + private String retrieveRegistryProperty(String registryKeyName, String valueName) + { + RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(registryKeyName); + if (registryKey == null) + { + return null; + } + Object registryValue = registryKey.GetValue(valueName, null); + if (registryValue == null) + { + return null; + } + + return registryValue.ToString(); + } + + private void notReady(String reason) + { + this.ready = false; + this.exceptionText = reason; + } + + public String getLocation() + { + return this.location; + } + + public String getLogDirectory() + { + return this.logDirectory; + } + + public String getPath() + { + return this.path; + } + + public String getPythonPath() + { + return this.pythonPath; + } + + public bool isReady() + { + return this.ready; + } + + public String getExceptionText() + { + return this.exceptionText; + } + } +} \ No newline at end of file diff --git a/msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/process/AbstractProcessLauncher.cs b/msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/process/AbstractProcessLauncher.cs new file mode 100644 index 0000000000..db02974126 --- /dev/null +++ b/msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/process/AbstractProcessLauncher.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; +using System.Diagnostics; +using VizLauncher.com.raytheon.viz.launcher.environment; + +namespace VizLauncher.com.raytheon.viz.launcher.process +{ + public abstract class AbstractProcessLauncher : IProcessLauncher + { + private static readonly String LOG_DATE_FORMAT = "yyyyMMdd_HHmmss"; + protected static readonly String LOG_SUFFIX = ".log"; + protected Process process = null; + private StreamWriter logFileWriter; + + private bool ready = false; + private String exceptionText = null; + + public AbstractProcessLauncher(VizEnvironment vizEnvironment) + { + // Prepare the log file. + if (Directory.Exists(vizEnvironment.getLogDirectory()) == false) + { + Directory.CreateDirectory(vizEnvironment.getLogDirectory()); + } + String logName = vizEnvironment.getLogDirectory() + + Path.DirectorySeparatorChar + this.constructLogName(this.determineLogDate()); + + // Prepare the process. + this.process = new Process(); + this.process.StartInfo = this.constructProcessStartInfo(vizEnvironment); + this.process.OutputDataReceived += new DataReceivedEventHandler(processOutputHandler); + this.validate(); + if (this.ready == false) + { + return; + } + + /* + * Access the log file for write access; other processes will have read-only access to + * the log file until it is closed. + **/ + this.logFileWriter = + new StreamWriter(File.Open(logName, FileMode.Append, + FileAccess.Write, FileShare.Read)); + } + + private String determineLogDate() + { + return DateTime.Now.ToString(LOG_DATE_FORMAT); + } + + private ProcessStartInfo constructProcessStartInfo(VizEnvironment vizEnvironment) + { + ProcessStartInfo processStartInfo = + new ProcessStartInfo(this.constructProcessName(vizEnvironment.getLocation())); + processStartInfo.EnvironmentVariables.Remove(EnvironmentProperties.ENVIRONMENT_VARIABLE_PATH); + processStartInfo.EnvironmentVariables.Add( + EnvironmentProperties.ENVIRONMENT_VARIABLE_PATH, vizEnvironment.getPath()); + processStartInfo.EnvironmentVariables.Add( + EnvironmentProperties.ENVIRONMENT_VARIABLE_PYTHON_PATH, vizEnvironment.getPythonPath()); + processStartInfo.UseShellExecute = false; + processStartInfo.Arguments = this.getCommandLineArguments(); + processStartInfo.RedirectStandardOutput = true; + + return processStartInfo; + } + + protected void validate() + { + String application = this.process.StartInfo.FileName; + /* ensure that the specified application exists. */ + if (File.Exists(application) == false) + { + this.ready = false; + this.exceptionText = "Unable to find the specified Viz application: " + application; + return; + } + + this.ready = true; + } + + public virtual void launchProcess() + { + this.runProcess(); + this.closeLog(); + } + + protected void runProcess() + { + this.process.Start(); + this.process.BeginOutputReadLine(); + this.process.WaitForExit(); + this.process.CancelOutputRead(); + } + + protected void closeLog() + { + this.logFileWriter.Close(); + } + + private void processOutputHandler(Object sendingProcess, DataReceivedEventArgs outline) + { + if (String.IsNullOrEmpty(outline.Data)) + { + return; + } + this.logFileWriter.WriteLine(outline.Data); + } + + public bool isReady() + { + return this.ready; + } + + public String getExceptionText() + { + return this.exceptionText; + } + + protected abstract String constructProcessName(String location); + + protected abstract String constructLogName(String logDate); + + protected abstract String getCommandLineArguments(); + } +} \ No newline at end of file diff --git a/msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/process/IProcessLauncher.cs b/msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/process/IProcessLauncher.cs new file mode 100644 index 0000000000..0540d4b4ab --- /dev/null +++ b/msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/process/IProcessLauncher.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Diagnostics; + +namespace VizLauncher.com.raytheon.viz.launcher.process +{ + public interface IProcessLauncher + { + void launchProcess(); + + bool isReady(); + String getExceptionText(); + } +} \ No newline at end of file diff --git a/msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/process/impl/AlertvizProcessLauncher.cs b/msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/process/impl/AlertvizProcessLauncher.cs new file mode 100644 index 0000000000..2b281391c9 --- /dev/null +++ b/msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/process/impl/AlertvizProcessLauncher.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Diagnostics; +using System.IO; +using VizLauncher.com.raytheon.viz.launcher.process; +using VizLauncher.com.raytheon.viz.launcher.environment; + +namespace VizLauncher.com.raytheon.viz.launcher.process.impl +{ + public class AlertvizProcessLauncher : AbstractProcessLauncher + { + private static readonly String LOG_PREFIX = "alertviz_"; + private static readonly String COMMAND_LINE_ARGUMENTS = "-component thinalertviz"; + private static readonly String ALERTVIZ_PROCESS_NAME = "alertviz"; + private static readonly String ALERTVIZ_EXECUTABLE = + Path.DirectorySeparatorChar + "AlertViz" + + Path.DirectorySeparatorChar + "alertviz.exe"; + + public AlertvizProcessLauncher(VizEnvironment vizEnvironment) : base(vizEnvironment) + { + } + + public override void launchProcess() + { + // need to verify that another AlertViz process is not already running. + if (this.isAlertVizAlreadyRunning()) + { + // do not start a new AlertViz process. + return; + } + + this.runProcess(); + while (this.process.ExitCode != 0) + { + this.runProcess(); + } + this.closeLog(); + } + + private Boolean isAlertVizAlreadyRunning() + { + return (Process.GetProcessesByName(ALERTVIZ_PROCESS_NAME).Length > 0); + } + + protected override String constructProcessName(String location) + { + return location + ALERTVIZ_EXECUTABLE; + } + + protected override String constructLogName(String logDate) + { + return LOG_PREFIX + logDate + AbstractProcessLauncher.LOG_SUFFIX; + } + + protected override String getCommandLineArguments() + { + return COMMAND_LINE_ARGUMENTS; + } + } +} \ No newline at end of file diff --git a/msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/process/impl/CaveProcessLauncher.cs b/msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/process/impl/CaveProcessLauncher.cs new file mode 100644 index 0000000000..ef7e113cc1 --- /dev/null +++ b/msi/VizLauncher/VizLauncher/com/raytheon/viz/launcher/process/impl/CaveProcessLauncher.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; +using VizLauncher.com.raytheon.viz.launcher.process; +using VizLauncher.com.raytheon.viz.launcher.environment; + +namespace VizLauncher.com.raytheon.viz.launcher.process.impl +{ + public class CaveProcessLauncher : AbstractProcessLauncher + { + private static readonly String LOG_PREFIX = "cave_"; + private static readonly String COMMAND_LINE_ARGUMENTS = "-component thinclient"; + private static readonly String CAVE_EXECUTABLE = + Path.DirectorySeparatorChar + "CAVE" + Path.DirectorySeparatorChar + "cave.exe"; + + public CaveProcessLauncher(VizEnvironment vizEnvironment) + : base(vizEnvironment) + { + } + + protected override String constructProcessName(String location) + { + return location + CAVE_EXECUTABLE; + } + + protected override String constructLogName(String logDate) + { + return LOG_PREFIX + logDate + AbstractProcessLauncher.LOG_SUFFIX; + } + + protected override String getCommandLineArguments() + { + return COMMAND_LINE_ARGUMENTS; + } + } +} \ No newline at end of file diff --git a/msi/build/A2Staging/Scripts/WiXBuild.ps1 b/msi/build/A2Staging/Scripts/WiXBuild.ps1 index 1e6006f90691528a9f6d02d05817f818e994d8e4..f246f81f19e4538a9adbc80e3416193913caa939 100644 GIT binary patch delta 162 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 literal 0 HcmV?d00001 diff --git a/msi/build/A2Staging/VisualStudio/_DELETE_ME_ b/msi/build/A2Staging/VisualStudio/_DELETE_ME_ deleted file mode 100644 index e69de29bb2..0000000000