Merge branch 'master_14.2.1' into omaha_14.2.1
Former-commit-id:da2d7fc334
[formerly068297b90a
] [formerly92232fa063
] [formerlyda2d7fc334
[formerly068297b90a
] [formerly92232fa063
] [formerly40b543f9a8
[formerly92232fa063
[formerly 81f446dbc2ae8f8c54cba5b29ed57f113d318160]]]] Former-commit-id:40b543f9a8
Former-commit-id:a94f800324
[formerly4d1fbf8743
] [formerly b74d7aa4530a565aa9b8f8596b6981c8ead91adb [formerlyf992a6b046
]] Former-commit-id: 0b70d2b7739772b630136c56408866dc53a2bdcd [formerlyea01373320
] Former-commit-id:e29b96b6bd
This commit is contained in:
commit
3348f6857a
158 changed files with 2384 additions and 1834 deletions
|
@ -268,7 +268,7 @@
|
||||||
|
|
||||||
<sequential>
|
<sequential>
|
||||||
<property name="___memorySettingsVersion___"
|
<property name="___memorySettingsVersion___"
|
||||||
value="3.0"/>
|
value="4.0"/>
|
||||||
<if>
|
<if>
|
||||||
<not>
|
<not>
|
||||||
<equals
|
<equals
|
||||||
|
@ -392,6 +392,37 @@
|
||||||
append="true" />
|
append="true" />
|
||||||
</actions>
|
</actions>
|
||||||
</call>
|
</call>
|
||||||
|
<!-- site type specific overrides (wfo, ncep, etc) -->
|
||||||
|
<call path="//${cave.arch}/site-type-override">
|
||||||
|
<param name="site-type"
|
||||||
|
path="site-type/text()" />
|
||||||
|
|
||||||
|
<param name="max-memory"
|
||||||
|
path="ini-substitutions/max-memory/value/text()" />
|
||||||
|
<param name="max-perm"
|
||||||
|
path="ini-substitutions/max-perm/value/text()" />
|
||||||
|
|
||||||
|
<actions>
|
||||||
|
<!-- Create a site-type-specific ini file -->
|
||||||
|
<copy verbose="true"
|
||||||
|
file="/tmp/cave/cave.ini"
|
||||||
|
tofile="/tmp/cave/@{site-type}.ini"
|
||||||
|
overwrite="true" />
|
||||||
|
|
||||||
|
<!-- Update the ini file -->
|
||||||
|
<update.ini
|
||||||
|
ini.file="@{site-type}.ini"
|
||||||
|
jvm.arg="${cave-memory-settings.default-memory-setting.default-max-memory.jvm-arg}"
|
||||||
|
current.value="${cave-memory-settings.default-memory-setting.default-max-memory.value}"
|
||||||
|
new.value="@{max-memory}" />
|
||||||
|
|
||||||
|
<update.ini
|
||||||
|
ini.file="@{site-type}.ini"
|
||||||
|
jvm.arg="${cave-memory-settings.default-memory-setting.default-max-perm.jvm-arg}"
|
||||||
|
current.value="${cave-memory-settings.default-memory-setting.default-max-perm.value}"
|
||||||
|
new.value="@{max-perm}" />
|
||||||
|
</actions>
|
||||||
|
</call>
|
||||||
</xmltask>
|
</xmltask>
|
||||||
|
|
||||||
<!-- Finish the iniLookup.sh script -->
|
<!-- Finish the iniLookup.sh script -->
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<cave-memory-settings>
|
<cave-memory-settings>
|
||||||
<!-- The version should be incremented whenever
|
<!-- The version should be incremented whenever
|
||||||
the file layout changes. -->
|
the file layout changes. -->
|
||||||
<file-version>3.0</file-version>
|
<file-version>4.0</file-version>
|
||||||
|
|
||||||
<!-- Example Entry ... See Below. -->
|
<!-- Example Entry ... See Below. -->
|
||||||
<!--
|
<!--
|
||||||
|
@ -141,6 +141,7 @@
|
||||||
</max-perm>
|
</max-perm>
|
||||||
</ini-substitutions>
|
</ini-substitutions>
|
||||||
</memory-setting>
|
</memory-setting>
|
||||||
|
|
||||||
</arch.x86>
|
</arch.x86>
|
||||||
|
|
||||||
<arch.x86_64>
|
<arch.x86_64>
|
||||||
|
@ -250,6 +251,61 @@
|
||||||
</max-perm>
|
</max-perm>
|
||||||
</ini-substitutions>
|
</ini-substitutions>
|
||||||
</memory-setting>
|
</memory-setting>
|
||||||
|
|
||||||
|
<!-- memory default overrides for a particular site type (wfo, ncep, etc) -->
|
||||||
|
<!-- site-type names need to be all lower case -->
|
||||||
|
<site-type-override>
|
||||||
|
<site-type>wfo</site-type>
|
||||||
|
<ini-substitutions>
|
||||||
|
<max-memory>
|
||||||
|
<value>3072M</value>
|
||||||
|
</max-memory>
|
||||||
|
|
||||||
|
<max-perm>
|
||||||
|
<value>DEFAULT</value>
|
||||||
|
</max-perm>
|
||||||
|
</ini-substitutions>
|
||||||
|
</site-type-override>
|
||||||
|
|
||||||
|
<site-type-override>
|
||||||
|
<site-type>rfc</site-type>
|
||||||
|
<ini-substitutions>
|
||||||
|
<max-memory>
|
||||||
|
<value>2048M</value>
|
||||||
|
</max-memory>
|
||||||
|
|
||||||
|
<max-perm>
|
||||||
|
<value>DEFAULT</value>
|
||||||
|
</max-perm>
|
||||||
|
</ini-substitutions>
|
||||||
|
</site-type-override>
|
||||||
|
|
||||||
|
<site-type-override>
|
||||||
|
<site-type>ncep</site-type>
|
||||||
|
<ini-substitutions>
|
||||||
|
<max-memory>
|
||||||
|
<value>2048M</value>
|
||||||
|
</max-memory>
|
||||||
|
|
||||||
|
<max-perm>
|
||||||
|
<value>DEFAULT</value>
|
||||||
|
</max-perm>
|
||||||
|
</ini-substitutions>
|
||||||
|
</site-type-override>
|
||||||
|
|
||||||
|
<site-type-override>
|
||||||
|
<site-type>cwsu</site-type>
|
||||||
|
<ini-substitutions>
|
||||||
|
<max-memory>
|
||||||
|
<value>3072M</value>
|
||||||
|
</max-memory>
|
||||||
|
|
||||||
|
<max-perm>
|
||||||
|
<value>DEFAULT</value>
|
||||||
|
</max-perm>
|
||||||
|
</ini-substitutions>
|
||||||
|
</site-type-override>
|
||||||
|
|
||||||
</arch.x86_64>
|
</arch.x86_64>
|
||||||
|
|
||||||
</cave-memory-settings>
|
</cave-memory-settings>
|
||||||
|
|
BIN
cave/build/static/common/cave/etc/aviation/thresholds/KUES.hdf5
Normal file
BIN
cave/build/static/common/cave/etc/aviation/thresholds/KUES.hdf5
Normal file
Binary file not shown.
|
@ -29,6 +29,7 @@
|
||||||
# Jan 30, 2014 #2593 bclement extracted generic part of getPidsOfMyRunningCaves into forEachRunningCave
|
# Jan 30, 2014 #2593 bclement extracted generic part of getPidsOfMyRunningCaves into forEachRunningCave
|
||||||
# added methods for reading max memory from .ini files
|
# added methods for reading max memory from .ini files
|
||||||
# fixes for INI files with spaces
|
# fixes for INI files with spaces
|
||||||
|
# Feb 20, 2014 #2780 bclement added site type ini file check
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
||||||
|
@ -68,7 +69,13 @@ function lookupINI()
|
||||||
if [ ${RC} -eq 0 ]; then
|
if [ ${RC} -eq 0 ]; then
|
||||||
export CAVE_INI_ARG="--launcher.ini /awips2/cave/${ASSOCIATED_INI}"
|
export CAVE_INI_ARG="--launcher.ini /awips2/cave/${ASSOCIATED_INI}"
|
||||||
else
|
else
|
||||||
export CAVE_INI_ARG="--launcher.ini /awips2/cave/cave.ini"
|
siteTypeIni="/awips2/cave/${SITE_TYPE}.ini"
|
||||||
|
if [[ -e ${siteTypeIni} ]]
|
||||||
|
then
|
||||||
|
export CAVE_INI_ARG="--launcher.ini ${siteTypeIni}"
|
||||||
|
else
|
||||||
|
export CAVE_INI_ARG="--launcher.ini /awips2/cave/cave.ini"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
@ -294,7 +301,7 @@ function logExitStatus()
|
||||||
hostPath="$basePath/$hostName/"
|
hostPath="$basePath/$hostName/"
|
||||||
mkdir -p $hostPath
|
mkdir -p $hostPath
|
||||||
if [ -d "$hostPath" ]; then
|
if [ -d "$hostPath" ]; then
|
||||||
cp $coreFile $hostPath
|
mv $coreFile $hostPath
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
69
cave/build/static/win32.x86/alertviz/alertviz.bat
Normal file
69
cave/build/static/win32.x86/alertviz/alertviz.bat
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
@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
|
||||||
|
|
72
cave/build/static/win32.x86/cave/cave.bat
Normal file
72
cave/build/static/win32.x86/cave/cave.bat
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
@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
|
|
@ -13,7 +13,8 @@ Require-Bundle: com.raytheon.uf.viz.core,
|
||||||
com.raytheon.viz.core;bundle-version="1.12.1174",
|
com.raytheon.viz.core;bundle-version="1.12.1174",
|
||||||
com.raytheon.viz.ui;bundle-version="1.12.1174",
|
com.raytheon.viz.ui;bundle-version="1.12.1174",
|
||||||
com.raytheon.viz.alerts;bundle-version="1.12.1174",
|
com.raytheon.viz.alerts;bundle-version="1.12.1174",
|
||||||
com.raytheon.uf.viz.thinclient;bundle-version="1.0.0"
|
com.raytheon.uf.viz.thinclient;bundle-version="1.0.0",
|
||||||
|
com.raytheon.viz.grid;bundle-version="1.12.1174"
|
||||||
Import-Package: com.raytheon.uf.common.comm,
|
Import-Package: com.raytheon.uf.common.comm,
|
||||||
com.raytheon.uf.common.datastorage,
|
com.raytheon.uf.common.datastorage,
|
||||||
com.raytheon.uf.viz.core.maps.rsc,
|
com.raytheon.uf.viz.core.maps.rsc,
|
||||||
|
|
|
@ -19,12 +19,17 @@
|
||||||
**/
|
**/
|
||||||
package com.raytheon.uf.viz.thinclient.cave.refresh;
|
package com.raytheon.uf.viz.thinclient.cave.refresh;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
import org.eclipse.jface.preference.IPreferenceStore;
|
import org.eclipse.jface.preference.IPreferenceStore;
|
||||||
|
|
||||||
|
import com.raytheon.uf.viz.core.alerts.AlertMessage;
|
||||||
import com.raytheon.uf.viz.thinclient.Activator;
|
import com.raytheon.uf.viz.thinclient.Activator;
|
||||||
import com.raytheon.uf.viz.thinclient.preferences.ThinClientPreferenceConstants;
|
import com.raytheon.uf.viz.thinclient.preferences.ThinClientPreferenceConstants;
|
||||||
import com.raytheon.uf.viz.thinclient.refresh.TimedRefresher.RefreshTimerTask;
|
import com.raytheon.uf.viz.thinclient.refresh.TimedRefresher.RefreshTimerTask;
|
||||||
import com.raytheon.viz.alerts.jobs.AutoUpdater;
|
import com.raytheon.viz.alerts.jobs.AutoUpdater;
|
||||||
|
import com.raytheon.viz.alerts.observers.ProductAlertObserver;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Timer task responsible for refreshing IEditorParts that implement
|
* Timer task responsible for refreshing IEditorParts that implement
|
||||||
|
@ -38,6 +43,7 @@ import com.raytheon.viz.alerts.jobs.AutoUpdater;
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Nov 10, 2011 mschenke Initial creation
|
* Nov 10, 2011 mschenke Initial creation
|
||||||
|
* Feb 21, 2014 DR 16744 D. Friedman Update all alert observers
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -56,8 +62,17 @@ public class DataRefreshTask implements RefreshTimerTask {
|
||||||
public void run() {
|
public void run() {
|
||||||
IPreferenceStore store = Activator.getDefault().getPreferenceStore();
|
IPreferenceStore store = Activator.getDefault().getPreferenceStore();
|
||||||
if (store.getBoolean(ThinClientPreferenceConstants.P_DISABLE_JMS)) {
|
if (store.getBoolean(ThinClientPreferenceConstants.P_DISABLE_JMS)) {
|
||||||
new AutoUpdater().alertArrived(ThinClientDataUpdateTree
|
Collection<AlertMessage> alerts = ThinClientDataUpdateTree
|
||||||
.getInstance().updateAllData());
|
.getInstance().updateAllData();
|
||||||
|
|
||||||
|
// Make sure it gets to GridUpdater
|
||||||
|
ArrayList<String> s = new ArrayList<String>(alerts.size());
|
||||||
|
for (AlertMessage am : alerts) {
|
||||||
|
s.add(am.dataURI);
|
||||||
|
}
|
||||||
|
ProductAlertObserver.processDataURIAlerts(s);
|
||||||
|
|
||||||
|
new AutoUpdater().alertArrived(alerts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,8 +29,10 @@ import java.util.Set;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
|
|
||||||
import com.raytheon.uf.common.dataplugin.PluginDataObject;
|
import com.raytheon.uf.common.dataplugin.PluginDataObject;
|
||||||
|
import com.raytheon.uf.common.dataquery.requests.DbQueryRequest;
|
||||||
import com.raytheon.uf.common.dataquery.requests.RequestConstraint;
|
import com.raytheon.uf.common.dataquery.requests.RequestConstraint;
|
||||||
import com.raytheon.uf.common.dataquery.requests.RequestConstraint.ConstraintType;
|
import com.raytheon.uf.common.dataquery.requests.RequestConstraint.ConstraintType;
|
||||||
|
import com.raytheon.uf.common.dataquery.responses.DbQueryResponse;
|
||||||
import com.raytheon.uf.common.status.IUFStatusHandler;
|
import com.raytheon.uf.common.status.IUFStatusHandler;
|
||||||
import com.raytheon.uf.common.status.UFStatus;
|
import com.raytheon.uf.common.status.UFStatus;
|
||||||
import com.raytheon.uf.common.status.UFStatus.Priority;
|
import com.raytheon.uf.common.status.UFStatus.Priority;
|
||||||
|
@ -44,6 +46,8 @@ import com.raytheon.uf.viz.core.requests.ThriftClient;
|
||||||
import com.raytheon.uf.viz.core.rsc.AbstractRequestableResourceData;
|
import com.raytheon.uf.viz.core.rsc.AbstractRequestableResourceData;
|
||||||
import com.raytheon.uf.viz.core.rsc.AbstractResourceData;
|
import com.raytheon.uf.viz.core.rsc.AbstractResourceData;
|
||||||
import com.raytheon.uf.viz.core.rsc.updater.DataUpdateTree;
|
import com.raytheon.uf.viz.core.rsc.updater.DataUpdateTree;
|
||||||
|
import com.raytheon.viz.grid.inv.RadarUpdater;
|
||||||
|
import com.raytheon.viz.grid.util.RadarAdapter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO Add Description
|
* TODO Add Description
|
||||||
|
@ -55,6 +59,7 @@ import com.raytheon.uf.viz.core.rsc.updater.DataUpdateTree;
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Dec 13, 2011 bsteffen Initial creation
|
* Dec 13, 2011 bsteffen Initial creation
|
||||||
|
* Feb 21, 2014 DR 16744 D. Friedman Add radar/grid updates
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -63,7 +68,7 @@ import com.raytheon.uf.viz.core.rsc.updater.DataUpdateTree;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class ThinClientDataUpdateTree extends DataUpdateTree {
|
public class ThinClientDataUpdateTree extends DataUpdateTree {
|
||||||
private IUFStatusHandler statusHandler = UFStatus
|
private final IUFStatusHandler statusHandler = UFStatus
|
||||||
.getHandler(ThinClientDataUpdateTree.class);
|
.getHandler(ThinClientDataUpdateTree.class);
|
||||||
|
|
||||||
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat(
|
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat(
|
||||||
|
@ -95,8 +100,9 @@ public class ThinClientDataUpdateTree extends DataUpdateTree {
|
||||||
for (DataPair pair : getDataPairs()) {
|
for (DataPair pair : getDataPairs()) {
|
||||||
AbstractResourceData resourceData = pair.data.getResourceData();
|
AbstractResourceData resourceData = pair.data.getResourceData();
|
||||||
if (!(resourceData instanceof AbstractRequestableResourceData)
|
if (!(resourceData instanceof AbstractRequestableResourceData)
|
||||||
|| resourceData.isFrozen())
|
|| resourceData.isFrozen()) {
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
Map<String, RequestConstraint> metadata = pair.metadata;
|
Map<String, RequestConstraint> metadata = pair.metadata;
|
||||||
metadata = new HashMap<String, RequestConstraint>(metadata);
|
metadata = new HashMap<String, RequestConstraint>(metadata);
|
||||||
metadata.put("insertTime", new RequestConstraint(time,
|
metadata.put("insertTime", new RequestConstraint(time,
|
||||||
|
@ -115,9 +121,70 @@ public class ThinClientDataUpdateTree extends DataUpdateTree {
|
||||||
e);
|
e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
getRadarUpdates(time, messages);
|
||||||
|
getGridUpdates(time, messages);
|
||||||
return messages;
|
return messages;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get radar update messages. This is needed to update the
|
||||||
|
* radar-as-gridded-data inventory.
|
||||||
|
*/
|
||||||
|
private void getRadarUpdates(String time, Set<AlertMessage> messages) {
|
||||||
|
Set<AlertMessage> radarMessages = new HashSet<AlertMessage>();
|
||||||
|
Map<String, RequestConstraint> metadata = RadarAdapter.getInstance()
|
||||||
|
.getUpdateConstraints();
|
||||||
|
metadata = new HashMap<String, RequestConstraint>(metadata);
|
||||||
|
metadata.put("insertTime", new RequestConstraint(time,
|
||||||
|
ConstraintType.GREATER_THAN));
|
||||||
|
try {
|
||||||
|
PluginDataObject[] pdos = DataCubeContainer.getData(metadata);
|
||||||
|
for (PluginDataObject pdo : pdos) {
|
||||||
|
AlertMessage am = new AlertMessage();
|
||||||
|
am.dataURI = pdo.getDataURI();
|
||||||
|
am.decodedAlert = RecordFactory.getInstance().loadMapFromUri(
|
||||||
|
am.dataURI);
|
||||||
|
radarMessages.add(am);
|
||||||
|
}
|
||||||
|
messages.addAll(radarMessages);
|
||||||
|
for (String dataURI : RadarUpdater.getInstance()
|
||||||
|
.convertRadarAlertsToGridDatauris(radarMessages)) {
|
||||||
|
AlertMessage am = new AlertMessage();
|
||||||
|
am.dataURI = dataURI;
|
||||||
|
am.decodedAlert = RecordFactory.getInstance().loadMapFromUri(
|
||||||
|
am.dataURI);
|
||||||
|
messages.add(am);
|
||||||
|
}
|
||||||
|
} catch (VizException e) {
|
||||||
|
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get gridded data update messages. */
|
||||||
|
private void getGridUpdates(String time, Set<AlertMessage> messages) {
|
||||||
|
Map<String, RequestConstraint> newQuery = new HashMap<String, RequestConstraint>();
|
||||||
|
DbQueryRequest dbRequest = new DbQueryRequest();
|
||||||
|
newQuery.put("pluginName", new RequestConstraint("grid"));
|
||||||
|
newQuery.put("insertTime", new RequestConstraint(time,
|
||||||
|
ConstraintType.GREATER_THAN));
|
||||||
|
dbRequest.setConstraints(newQuery);
|
||||||
|
dbRequest.addRequestField("dataURI");
|
||||||
|
DbQueryResponse response = null;
|
||||||
|
try {
|
||||||
|
response = (DbQueryResponse) ThriftClient.sendRequest(dbRequest);
|
||||||
|
for (String dataURI : response.getFieldObjects("dataURI",
|
||||||
|
String.class)) {
|
||||||
|
AlertMessage am = new AlertMessage();
|
||||||
|
am.dataURI = dataURI;
|
||||||
|
am.decodedAlert = RecordFactory.getInstance().loadMapFromUri(
|
||||||
|
am.dataURI);
|
||||||
|
messages.add(am);
|
||||||
|
}
|
||||||
|
} catch (VizException e) {
|
||||||
|
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the estimated difference between the clock on the server and the
|
* Get the estimated difference between the clock on the server and the
|
||||||
* local clock. The offset returned from this method will always be slightly
|
* local clock. The offset returned from this method will always be slightly
|
||||||
|
|
11
cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/editor/EditorTafTabComp.java
Executable file → Normal file
11
cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/editor/EditorTafTabComp.java
Executable file → Normal file
|
@ -73,7 +73,8 @@ import com.raytheon.viz.aviation.resource.ResourceConfigMgr.ResourceTag;
|
||||||
* text height and width.
|
* text height and width.
|
||||||
* 12/9/2010 7380 rferrel Adjust text size to be more like AWIPS I.
|
* 12/9/2010 7380 rferrel Adjust text size to be more like AWIPS I.
|
||||||
* 1/17/2011 7782 rferrel Added qcSkipCheck to mimic A1.
|
* 1/17/2011 7782 rferrel Added qcSkipCheck to mimic A1.
|
||||||
* 3/18/2011 7888 rferrel Added getLargeTF method.
|
* 3/18/2011 7888 rferrel Added getLargeTF method.
|
||||||
|
* 02/19/2014 16980 zhao added getter and setter for the Alt flag
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -1368,4 +1369,12 @@ public class EditorTafTabComp extends Composite {
|
||||||
rtdRdo.setEnabled(editable);
|
rtdRdo.setEnabled(editable);
|
||||||
corRdo.setEnabled(editable);
|
corRdo.setEnabled(editable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean getAlt() {
|
||||||
|
return alt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAlt(boolean b) {
|
||||||
|
alt = b;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,8 +80,10 @@ import org.eclipse.swt.widgets.Combo;
|
||||||
import org.eclipse.swt.widgets.Composite;
|
import org.eclipse.swt.widgets.Composite;
|
||||||
import org.eclipse.swt.widgets.Control;
|
import org.eclipse.swt.widgets.Control;
|
||||||
import org.eclipse.swt.widgets.Display;
|
import org.eclipse.swt.widgets.Display;
|
||||||
|
import org.eclipse.swt.widgets.Event;
|
||||||
import org.eclipse.swt.widgets.FileDialog;
|
import org.eclipse.swt.widgets.FileDialog;
|
||||||
import org.eclipse.swt.widgets.Label;
|
import org.eclipse.swt.widgets.Label;
|
||||||
|
import org.eclipse.swt.widgets.Listener;
|
||||||
import org.eclipse.swt.widgets.Menu;
|
import org.eclipse.swt.widgets.Menu;
|
||||||
import org.eclipse.swt.widgets.MenuItem;
|
import org.eclipse.swt.widgets.MenuItem;
|
||||||
import org.eclipse.swt.widgets.MessageBox;
|
import org.eclipse.swt.widgets.MessageBox;
|
||||||
|
@ -227,6 +229,8 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback;
|
||||||
* 08/09/2013 2033 mschenke Switched File.separator to IPathManager.SEPARATOR
|
* 08/09/2013 2033 mschenke Switched File.separator to IPathManager.SEPARATOR
|
||||||
* 09/04/2013 2322 lvenable Added CAVE style so this dialog is perspective independent
|
* 09/04/2013 2322 lvenable Added CAVE style so this dialog is perspective independent
|
||||||
* 10/24/2013 16478 zhao add syntax check for extra '=' sign
|
* 10/24/2013 16478 zhao add syntax check for extra '=' sign
|
||||||
|
* 02/12/2014 17076 lvenable Mark guidance tabs as not current so they get refreshed
|
||||||
|
* 02/19/2014 16980 zhao add code to ensure the Alt flag is false after the Alt kay is released
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -674,6 +678,10 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable,
|
||||||
populateTafViewer();
|
populateTafViewer();
|
||||||
// Update the metar and mos guidance in the viewer tab.
|
// Update the metar and mos guidance in the viewer tab.
|
||||||
updateViewerTab(stationName);
|
updateViewerTab(stationName);
|
||||||
|
|
||||||
|
// Mark the tabs as not current so they get updated.
|
||||||
|
markTabsAsNotCurrent();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPEN_RTN:
|
case OPEN_RTN:
|
||||||
|
@ -769,7 +777,19 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
|
/**
|
||||||
|
* Mark the tabs as not current so they get refreshed.
|
||||||
|
*/
|
||||||
|
private void markTabsAsNotCurrent() {
|
||||||
|
for (TabItem tbi : guidanceViewerFolder.getItems()) {
|
||||||
|
if (tbi.getControl() instanceof ViewerTab) {
|
||||||
|
((ViewerTab) tbi.getControl()).setDisplayCurrent(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void clearAll() {
|
public void clearAll() {
|
||||||
if (shell == null) {
|
if (shell == null) {
|
||||||
return;
|
return;
|
||||||
|
@ -1073,6 +1093,11 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable,
|
||||||
// Create the File menu item with a File "dropdown" menu
|
// Create the File menu item with a File "dropdown" menu
|
||||||
Menu fileMenu = new Menu(menuBar);
|
Menu fileMenu = new Menu(menuBar);
|
||||||
fileMenuItem.setMenu(fileMenu);
|
fileMenuItem.setMenu(fileMenu);
|
||||||
|
fileMenu.addListener(SWT.Show, new Listener() {
|
||||||
|
public void handleEvent(Event event) {
|
||||||
|
setAltFlagForEditorTafTabComp();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// -------------------------------------------------
|
// -------------------------------------------------
|
||||||
// Create all the items in the File dropdown menu
|
// Create all the items in the File dropdown menu
|
||||||
|
@ -1179,6 +1204,11 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable,
|
||||||
// Create the Options menu item with a Options "dropdown" menu
|
// Create the Options menu item with a Options "dropdown" menu
|
||||||
Menu optionsMenu = new Menu(menuBar);
|
Menu optionsMenu = new Menu(menuBar);
|
||||||
optionsMenuItem.setMenu(optionsMenu);
|
optionsMenuItem.setMenu(optionsMenu);
|
||||||
|
optionsMenu.addListener(SWT.Show, new Listener() {
|
||||||
|
public void handleEvent(Event event) {
|
||||||
|
setAltFlagForEditorTafTabComp();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// ----------------------------------------------------
|
// ----------------------------------------------------
|
||||||
// Create all the items in the Options dropdown menu
|
// Create all the items in the Options dropdown menu
|
||||||
|
@ -1253,7 +1283,12 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable,
|
||||||
// Create the File menu item with a File "dropdown" menu
|
// Create the File menu item with a File "dropdown" menu
|
||||||
Menu editMenu = new Menu(menuBar);
|
Menu editMenu = new Menu(menuBar);
|
||||||
editMenuItem.setMenu(editMenu);
|
editMenuItem.setMenu(editMenu);
|
||||||
|
editMenu.addListener(SWT.Show, new Listener() {
|
||||||
|
public void handleEvent(Event event) {
|
||||||
|
setAltFlagForEditorTafTabComp();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// -------------------------------------------------
|
// -------------------------------------------------
|
||||||
// Create all the items in the Edit dropdown menu
|
// Create all the items in the Edit dropdown menu
|
||||||
// -------------------------------------------------
|
// -------------------------------------------------
|
||||||
|
@ -1327,6 +1362,19 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When respectively using alt+'f', alt+'e', alt+'o' and alt+'h'
|
||||||
|
* to open/display menus 'File', 'Edit', 'Options' and 'Help',
|
||||||
|
* the alt flag of the editorTafTabComp object is set to true;
|
||||||
|
* it needs to be re-set to false
|
||||||
|
* (DR16980)
|
||||||
|
*/
|
||||||
|
private void setAltFlagForEditorTafTabComp() {
|
||||||
|
if ( editorTafTabComp.getAlt() ) {
|
||||||
|
editorTafTabComp.setAlt(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create the Help menu.
|
* Create the Help menu.
|
||||||
|
@ -1344,6 +1392,11 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable,
|
||||||
// Create the File menu item with a File "dropdown" menu
|
// Create the File menu item with a File "dropdown" menu
|
||||||
Menu helpMenu = new Menu(menuBar);
|
Menu helpMenu = new Menu(menuBar);
|
||||||
helpMenuItem.setMenu(helpMenu);
|
helpMenuItem.setMenu(helpMenu);
|
||||||
|
helpMenu.addListener(SWT.Show, new Listener() {
|
||||||
|
public void handleEvent(Event event) {
|
||||||
|
setAltFlagForEditorTafTabComp();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// -------------------------------------------------
|
// -------------------------------------------------
|
||||||
// Create all the items in the Help dropdown menu
|
// Create all the items in the Help dropdown menu
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
# Apr 03,2012 436 randerso Converted to Python procedure to allow some
|
# Apr 03,2012 436 randerso Converted to Python procedure to allow some
|
||||||
# level of site customization
|
# level of site customization
|
||||||
# Apr 09,2012 436 randerso Merged RNK's MakeHazards_Elevation procedure
|
# Apr 09,2012 436 randerso Merged RNK's MakeHazards_Elevation procedure
|
||||||
|
# Feb 12,2014 17058 ryu Extend converter for Collections$EmptyList objects.
|
||||||
#
|
#
|
||||||
# Author: randerso
|
# Author: randerso
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
|
@ -307,6 +308,8 @@ def converter(obj):
|
||||||
objtype = obj.jclassname
|
objtype = obj.jclassname
|
||||||
if objtype == "java.util.Date":
|
if objtype == "java.util.Date":
|
||||||
retVal = AbsTime.AbsTime(obj)
|
retVal = AbsTime.AbsTime(obj)
|
||||||
|
elif objtype == "java.util.Collections$EmptyList":
|
||||||
|
retVal = []
|
||||||
elif objtype == "com.raytheon.uf.common.time.TimeRange":
|
elif objtype == "com.raytheon.uf.common.time.TimeRange":
|
||||||
retVal = TimeRange.TimeRange(obj)
|
retVal = TimeRange.TimeRange(obj)
|
||||||
return retVal
|
return retVal
|
||||||
|
|
|
@ -1,61 +1,70 @@
|
||||||
##
|
##
|
||||||
# This software was developed and / or modified by Raytheon Company,
|
# This software was developed and / or modified by Raytheon Company,
|
||||||
# pursuant to Contract DG133W-05-CQ-1067 with the US Government.
|
# pursuant to Contract DG133W-05-CQ-1067 with the US Government.
|
||||||
#
|
#
|
||||||
# U.S. EXPORT CONTROLLED TECHNICAL DATA
|
# U.S. EXPORT CONTROLLED TECHNICAL DATA
|
||||||
# This software product contains export-restricted data whose
|
# This software product contains export-restricted data whose
|
||||||
# export/transfer/disclosure is restricted by U.S. law. Dissemination
|
# export/transfer/disclosure is restricted by U.S. law. Dissemination
|
||||||
# to non-U.S. persons whether in the United States or abroad requires
|
# to non-U.S. persons whether in the United States or abroad requires
|
||||||
# an export license or other authorization.
|
# an export license or other authorization.
|
||||||
#
|
#
|
||||||
# Contractor Name: Raytheon Company
|
# Contractor Name: Raytheon Company
|
||||||
# Contractor Address: 6825 Pine Street, Suite 340
|
# Contractor Address: 6825 Pine Street, Suite 340
|
||||||
# Mail Stop B8
|
# Mail Stop B8
|
||||||
# Omaha, NE 68106
|
# Omaha, NE 68106
|
||||||
# 402.291.0100
|
# 402.291.0100
|
||||||
#
|
#
|
||||||
# See the AWIPS II Master Rights File ("Master Rights File.pdf") for
|
# See the AWIPS II Master Rights File ("Master Rights File.pdf") for
|
||||||
# further licensing information.
|
# further licensing information.
|
||||||
##
|
##
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
# This software is in the public domain, furnished "as is", without technical
|
# This software is in the public domain, furnished "as is", without technical
|
||||||
# support, and with no warranty, express or implied, as to its usefulness for
|
# support, and with no warranty, express or implied, as to its usefulness for
|
||||||
# any purpose.
|
# any purpose.
|
||||||
#
|
#
|
||||||
# MergeHazards
|
# MergeHazards
|
||||||
#
|
#
|
||||||
# Author: lefebvre
|
# Author: lefebvre
|
||||||
#
|
#
|
||||||
# This procedure reads all of the temporary hazard grids and selectively
|
# This procedure reads all of the temporary hazard grids and selectively
|
||||||
# loads them in the the "Hazards" grid.
|
# loads them in the the "Hazards" grid.
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
|
#
|
||||||
# The MenuItems list defines the GFE menu item(s) under which the
|
# SOFTWARE HISTORY
|
||||||
# Procedure is to appear.
|
#
|
||||||
# Possible items are: Populate, Edit, Consistency, Verify, Hazards
|
# Date Ticket# Engineer Description
|
||||||
MenuItems = ["Hazards"]
|
# ------------ ---------- ----------- --------------------------
|
||||||
|
# Dec 23, 2013 16893 ryu Check in njensen's change to removeTempHazards()
|
||||||
#import Tkinter
|
# to call SmartScript.unloadWEs().
|
||||||
import SmartScript
|
#
|
||||||
import string
|
########################################################################
|
||||||
import HazardUtils
|
|
||||||
import VTECTable
|
# The MenuItems list defines the GFE menu item(s) under which the
|
||||||
import LogStream
|
# Procedure is to appear.
|
||||||
import numpy
|
# Possible items are: Populate, Edit, Consistency, Verify, Hazards
|
||||||
|
MenuItems = ["Hazards"]
|
||||||
|
|
||||||
from HazardUtils import MODEL
|
#import Tkinter
|
||||||
from HazardUtils import ELEMENT
|
import SmartScript
|
||||||
from HazardUtils import LEVEL
|
import string
|
||||||
|
import HazardUtils
|
||||||
######################### CONFIGURATION SECTION ######################
|
import VTECTable
|
||||||
#
|
import LogStream
|
||||||
# This dictionary defines which hazards cannot be combined with other
|
import numpy
|
||||||
# Hazards. The structure lists each hazard in the VTECTable followed
|
|
||||||
# by a list of VTEC codes that may not be combined with it at the same
|
|
||||||
# grid point. For example "DS.W" : ["DU.Y"] means that DS.W may not
|
from HazardUtils import MODEL
|
||||||
# be combined with a DU.Y hazard at the same grid point.
|
from HazardUtils import ELEMENT
|
||||||
|
from HazardUtils import LEVEL
|
||||||
|
|
||||||
|
######################### CONFIGURATION SECTION ######################
|
||||||
|
#
|
||||||
|
# This dictionary defines which hazards cannot be combined with other
|
||||||
|
# Hazards. The structure lists each hazard in the VTECTable followed
|
||||||
|
# by a list of VTEC codes that may not be combined with it at the same
|
||||||
|
# grid point. For example "DS.W" : ["DU.Y"] means that DS.W may not
|
||||||
|
# be combined with a DU.Y hazard at the same grid point.
|
||||||
|
|
||||||
HazardsConflictDict = {
|
HazardsConflictDict = {
|
||||||
"AF.W" : ["AF.Y"],
|
"AF.W" : ["AF.Y"],
|
||||||
"AF.Y" : ["AF.W"],
|
"AF.Y" : ["AF.W"],
|
||||||
|
@ -187,302 +196,304 @@ HazardsConflictDict = {
|
||||||
"ZR.Y" : ["BZ.A", "LE.A", "WS.A", "BZ.W", "IS.W", "WS.W", "LE.W",
|
"ZR.Y" : ["BZ.A", "LE.A", "WS.A", "BZ.W", "IS.W", "WS.W", "LE.W",
|
||||||
"WW.Y", "LE.Y"],
|
"WW.Y", "LE.Y"],
|
||||||
}
|
}
|
||||||
|
|
||||||
########################## END OF CONFIGURATION SECTION ########################
|
########################## END OF CONFIGURATION SECTION ########################
|
||||||
|
|
||||||
class Procedure(SmartScript.SmartScript):
|
class Procedure(SmartScript.SmartScript):
|
||||||
def __init__(self, dbss):
|
def __init__(self, dbss):
|
||||||
SmartScript.SmartScript.__init__(self, dbss)
|
SmartScript.SmartScript.__init__(self, dbss)
|
||||||
self._dbss = dbss
|
self._dbss = dbss
|
||||||
|
|
||||||
##
|
##
|
||||||
# Get the list of loaded temporary hazard parms
|
# Get the list of loaded temporary hazard parms
|
||||||
# @return: Temporary hazard parm names, i.e., ["hazAFY"]
|
# @return: Temporary hazard parm names, i.e., ["hazAFY"]
|
||||||
# @rtype: List of Strings
|
# @rtype: List of Strings
|
||||||
def getHazardParmNames(self):
|
def getHazardParmNames(self):
|
||||||
parms = self.loadedParms()
|
parms = self.loadedParms()
|
||||||
hazParms = []
|
hazParms = []
|
||||||
for weName, level, dbID in parms:
|
for weName, level, dbID in parms:
|
||||||
if string.find(weName, "haz") == 0:
|
if string.find(weName, "haz") == 0:
|
||||||
# TODO: Why is this back/forth xform needed?
|
# TODO: Why is this back/forth xform needed?
|
||||||
key = self._hazUtils._tempWENameToKey(weName)
|
key = self._hazUtils._tempWENameToKey(weName)
|
||||||
index = string.find(key, ":")
|
index = string.find(key, ":")
|
||||||
if index != -1:
|
if index != -1:
|
||||||
mkey = key[0:index]
|
mkey = key[0:index]
|
||||||
segNum = key[index+1:]
|
segNum = key[index+1:]
|
||||||
else:
|
else:
|
||||||
mkey = key
|
mkey = key
|
||||||
segNum = ""
|
segNum = ""
|
||||||
|
|
||||||
# append the hazard and a description
|
# append the hazard and a description
|
||||||
parmName = "haz" + key
|
parmName = "haz" + key
|
||||||
parmName = string.replace(parmName, ".", "")
|
parmName = string.replace(parmName, ".", "")
|
||||||
parmName = string.replace(parmName, ":", "")
|
parmName = string.replace(parmName, ":", "")
|
||||||
hazParms.append(parmName)
|
hazParms.append(parmName)
|
||||||
|
|
||||||
return hazParms
|
return hazParms
|
||||||
|
|
||||||
##
|
##
|
||||||
# Unload (delete) all the temporary hazards
|
# Unload (delete) all the temporary hazards
|
||||||
def removeTempHazards(self):
|
def removeTempHazards(self):
|
||||||
parms = self.loadedParms()
|
parms = self.loadedParms()
|
||||||
|
|
||||||
for weName, level, dbID in parms:
|
toRemovePairs = []
|
||||||
if string.find(weName, "haz") == 0:
|
for weName, level, dbID in parms:
|
||||||
self.unloadWE(MODEL, weName, level)
|
if string.find(weName, "haz") == 0:
|
||||||
|
toRemovePairs.append((weName, level))
|
||||||
return
|
self.unloadWEs(MODEL, toRemovePairs)
|
||||||
|
|
||||||
##
|
return
|
||||||
# The action performed when the user opts to cancel a merge.
|
|
||||||
# This was a callback under Tcl/tk; now displayDialog invokes
|
##
|
||||||
# it directly.
|
# The action performed when the user opts to cancel a merge.
|
||||||
def cancelCommand(self):
|
# This was a callback under Tcl/tk; now displayDialog invokes
|
||||||
LogStream.logEvent("MergeHazards: cancel")
|
# it directly.
|
||||||
return
|
def cancelCommand(self):
|
||||||
|
LogStream.logEvent("MergeHazards: cancel")
|
||||||
##
|
return
|
||||||
# The action performed when the user opts to continue a merge.
|
|
||||||
# This was a callback under Tcl/tk; now displayDialog invokes
|
##
|
||||||
# it directly.
|
# The action performed when the user opts to continue a merge.
|
||||||
def continueCommand(self):
|
# This was a callback under Tcl/tk; now displayDialog invokes
|
||||||
LogStream.logEvent("MergeHazards: continue")
|
# it directly.
|
||||||
parm = self.getParm(MODEL, ELEMENT, LEVEL)
|
def continueCommand(self):
|
||||||
parm.setMutable(True)
|
LogStream.logEvent("MergeHazards: continue")
|
||||||
self.mergeHazardGrids()
|
parm = self.getParm(MODEL, ELEMENT, LEVEL)
|
||||||
return
|
parm.setMutable(True)
|
||||||
|
self.mergeHazardGrids()
|
||||||
##
|
return
|
||||||
# Displays a dialog box and queries the user to continue to merge or
|
|
||||||
# abort the merge
|
##
|
||||||
|
# Displays a dialog box and queries the user to continue to merge or
|
||||||
|
# abort the merge
|
||||||
def displayDialog(self, message):
|
def displayDialog(self, message):
|
||||||
from MessageBox import MessageBox
|
from MessageBox import MessageBox
|
||||||
messageBox = MessageBox(style=MessageBox.ICON_WARNING)
|
messageBox = MessageBox(style=MessageBox.ICON_WARNING)
|
||||||
messageBox.setText("MakeHazard")
|
messageBox.setText("MakeHazard")
|
||||||
messageBox.setMessage(message)
|
messageBox.setMessage(message)
|
||||||
messageBox.setButtonLabels(["Continue Merge", "Cancel Merge"])
|
messageBox.setButtonLabels(["Continue Merge", "Cancel Merge"])
|
||||||
messageBox.setDefaultIndex(1)
|
messageBox.setDefaultIndex(1)
|
||||||
if (messageBox.open() == 0):
|
if (messageBox.open() == 0):
|
||||||
self.continueCommand()
|
self.continueCommand()
|
||||||
else:
|
else:
|
||||||
self.cancelCommand()
|
self.cancelCommand()
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
##
|
##
|
||||||
# Returns the set of hazParms grids that overlap with the specified
|
# Returns the set of hazParms grids that overlap with the specified
|
||||||
# timeRange.
|
# timeRange.
|
||||||
# @param hazParms: Hazard parm names to check
|
# @param hazParms: Hazard parm names to check
|
||||||
# @type hazParms: Sequence of string
|
# @type hazParms: Sequence of string
|
||||||
# @param timeRange: The time range to check for overlap with
|
# @param timeRange: The time range to check for overlap with
|
||||||
# @type timeRange: Python TimeRange
|
# @type timeRange: Python TimeRange
|
||||||
# @return: Byte grids and keys of the overlapping parms
|
# @return: Byte grids and keys of the overlapping parms
|
||||||
# @rtype: 2-tuple: list of byte arrays, list of list of strings
|
# @rtype: 2-tuple: list of byte arrays, list of list of strings
|
||||||
def getOverlappingHazGrids(self, hazParms, timeRange):
|
def getOverlappingHazGrids(self, hazParms, timeRange):
|
||||||
byteGridList = []
|
byteGridList = []
|
||||||
keyList = []
|
keyList = []
|
||||||
for hazParm in hazParms:
|
for hazParm in hazParms:
|
||||||
trList = self._hazUtils._getWEInventory(hazParm)
|
trList = self._hazUtils._getWEInventory(hazParm)
|
||||||
for tr in trList:
|
for tr in trList:
|
||||||
if tr.overlaps(timeRange):
|
if tr.overlaps(timeRange):
|
||||||
byteGrid, hazKey = self.getGrids(MODEL, hazParm, LEVEL,
|
byteGrid, hazKey = self.getGrids(MODEL, hazParm, LEVEL,
|
||||||
tr, mode="First")
|
tr, mode="First")
|
||||||
if isinstance(hazKey, str):
|
if isinstance(hazKey, str):
|
||||||
hazKey = eval(hazKey)
|
hazKey = eval(hazKey)
|
||||||
byteGridList.append(byteGrid)
|
byteGridList.append(byteGrid)
|
||||||
keyList.append(hazKey)
|
keyList.append(hazKey)
|
||||||
|
|
||||||
return byteGridList, keyList
|
return byteGridList, keyList
|
||||||
|
|
||||||
##
|
##
|
||||||
# Returns the first non-None key it finds in the keyList
|
# Returns the first non-None key it finds in the keyList
|
||||||
# @param keyList: Keys to search
|
# @param keyList: Keys to search
|
||||||
# @type keyList: Sequence of string
|
# @type keyList: Sequence of string
|
||||||
# @return: First key that is not "<None>"
|
# @return: First key that is not "<None>"
|
||||||
# @rtype: string
|
# @rtype: string
|
||||||
def getHazardKey(self, keyList):
|
def getHazardKey(self, keyList):
|
||||||
for k in keyList:
|
for k in keyList:
|
||||||
if k != "<None>":
|
if k != "<None>":
|
||||||
return k
|
return k
|
||||||
|
|
||||||
##
|
##
|
||||||
# Checks the specified hazard grids to see if they are conflicting
|
# Checks the specified hazard grids to see if they are conflicting
|
||||||
# Each grid is a tuple (byteGrid, key). Uses the configurable
|
# Each grid is a tuple (byteGrid, key). Uses the configurable
|
||||||
# HazardConflictDict to determine whether two hazards can be combined
|
# HazardConflictDict to determine whether two hazards can be combined
|
||||||
# at the same grid point. Returns an empty list if no conflict or
|
# at the same grid point. Returns an empty list if no conflict or
|
||||||
# the list of hazards if they do.
|
# the list of hazards if they do.
|
||||||
#
|
#
|
||||||
# This method should really only be used internally; it assumes that
|
# This method should really only be used internally; it assumes that
|
||||||
# there is at most one key other than "<None>", and that it contains
|
# there is at most one key other than "<None>", and that it contains
|
||||||
# a single subkey.
|
# a single subkey.
|
||||||
#
|
#
|
||||||
# @param hazGrid1: The first hazard grid
|
# @param hazGrid1: The first hazard grid
|
||||||
# @type hazGrid1: 2-tuple: numpy array of int8, list of String
|
# @type hazGrid1: 2-tuple: numpy array of int8, list of String
|
||||||
# @param hazGrid2: The second hazard grid
|
# @param hazGrid2: The second hazard grid
|
||||||
# @type hazGrid2: 2-tuple: numpy array of int8, list of String
|
# @type hazGrid2: 2-tuple: numpy array of int8, list of String
|
||||||
# @return: conflicting hazard names or empty list
|
# @return: conflicting hazard names or empty list
|
||||||
# @rtype: list
|
# @rtype: list
|
||||||
def conflictingHazards(self, hazGrid1, hazGrid2):
|
def conflictingHazards(self, hazGrid1, hazGrid2):
|
||||||
byteGrid1, hazKey1 = hazGrid1
|
byteGrid1, hazKey1 = hazGrid1
|
||||||
byteGrid2, hazKey2 = hazGrid2
|
byteGrid2, hazKey2 = hazGrid2
|
||||||
|
|
||||||
key1 = self.getHazardKey(hazKey1)
|
key1 = self.getHazardKey(hazKey1)
|
||||||
key2 = self.getHazardKey(hazKey2)
|
key2 = self.getHazardKey(hazKey2)
|
||||||
phenSig1 = key1[0:4] # remove the etn
|
phenSig1 = key1[0:4] # remove the etn
|
||||||
phenSig2 = key2[0:4]
|
phenSig2 = key2[0:4]
|
||||||
|
|
||||||
keyConflict = False
|
keyConflict = False
|
||||||
if phenSig1 == phenSig2 and key1 != key2:
|
if phenSig1 == phenSig2 and key1 != key2:
|
||||||
keyConflict = True
|
keyConflict = True
|
||||||
elif HazardsConflictDict.has_key(phenSig1):
|
elif HazardsConflictDict.has_key(phenSig1):
|
||||||
if phenSig2 in HazardsConflictDict[phenSig1]:
|
if phenSig2 in HazardsConflictDict[phenSig1]:
|
||||||
keyConflict = True
|
keyConflict = True
|
||||||
|
|
||||||
if keyConflict:
|
if keyConflict:
|
||||||
# calculate the overlap, adding the grids together will tell us if
|
# calculate the overlap, adding the grids together will tell us if
|
||||||
# there is any overlap. Any grid points > 1 are overlapped
|
# there is any overlap. Any grid points > 1 are overlapped
|
||||||
totalGrid = byteGrid1 + byteGrid2
|
totalGrid = byteGrid1 + byteGrid2
|
||||||
overlapMask = numpy.greater(totalGrid, 1)
|
overlapMask = numpy.greater(totalGrid, 1)
|
||||||
if numpy.any(overlapMask):
|
if numpy.any(overlapMask):
|
||||||
return [key1, key2]
|
return [key1, key2]
|
||||||
|
|
||||||
return []
|
return []
|
||||||
|
|
||||||
##
|
##
|
||||||
# See if there are any temporary hazards for the same position and time
|
# See if there are any temporary hazards for the same position and time
|
||||||
# that conflict with one another.
|
# that conflict with one another.
|
||||||
#
|
#
|
||||||
# @param hazParms: Temporary hazard parm names to check.
|
# @param hazParms: Temporary hazard parm names to check.
|
||||||
# @type hazParms: sequence of string
|
# @type hazParms: sequence of string
|
||||||
# @return: The first conflict, or None if there are no conflicts
|
# @return: The first conflict, or None if there are no conflicts
|
||||||
# @rtype: 2-tuple(TimeRange, list of string) or NoneType
|
# @rtype: 2-tuple(TimeRange, list of string) or NoneType
|
||||||
def checkForHazardConflicts(self, hazParms):
|
def checkForHazardConflicts(self, hazParms):
|
||||||
timeList = []
|
timeList = []
|
||||||
for hazParm in hazParms:
|
for hazParm in hazParms:
|
||||||
trList = self._hazUtils._getWEInventory(hazParm)
|
trList = self._hazUtils._getWEInventory(hazParm)
|
||||||
for tr in trList:
|
for tr in trList:
|
||||||
if tr.startTime().unixTime() not in timeList:
|
if tr.startTime().unixTime() not in timeList:
|
||||||
timeList.append(tr.startTime().unixTime())
|
timeList.append(tr.startTime().unixTime())
|
||||||
if tr.endTime().unixTime() not in timeList:
|
if tr.endTime().unixTime() not in timeList:
|
||||||
timeList.append(tr.endTime().unixTime())
|
timeList.append(tr.endTime().unixTime())
|
||||||
|
|
||||||
timeList.sort() # sort the list
|
timeList.sort() # sort the list
|
||||||
|
|
||||||
for t in xrange(len(timeList) - 1):
|
for t in xrange(len(timeList) - 1):
|
||||||
start = timeList[t]
|
start = timeList[t]
|
||||||
end = timeList[t+1]
|
end = timeList[t+1]
|
||||||
timeRange = self._hazUtils._makeTimeRange(start, end)
|
timeRange = self._hazUtils._makeTimeRange(start, end)
|
||||||
byteGridList = []
|
byteGridList = []
|
||||||
keyList = []
|
keyList = []
|
||||||
byteGridList, keyList = self.getOverlappingHazGrids(hazParms, timeRange)
|
byteGridList, keyList = self.getOverlappingHazGrids(hazParms, timeRange)
|
||||||
# compare each grid to all other grids at this timeRange
|
# compare each grid to all other grids at this timeRange
|
||||||
for firstIndex in xrange(len(byteGridList) - 1):
|
for firstIndex in xrange(len(byteGridList) - 1):
|
||||||
for secondIndex in xrange(firstIndex + 1, len(byteGridList)):
|
for secondIndex in xrange(firstIndex + 1, len(byteGridList)):
|
||||||
grid1 = (byteGridList[firstIndex], keyList[firstIndex])
|
grid1 = (byteGridList[firstIndex], keyList[firstIndex])
|
||||||
grid2 = (byteGridList[secondIndex], keyList[secondIndex])
|
grid2 = (byteGridList[secondIndex], keyList[secondIndex])
|
||||||
conflictList = self.conflictingHazards(grid1, grid2)
|
conflictList = self.conflictingHazards(grid1, grid2)
|
||||||
if conflictList != []:
|
if conflictList != []:
|
||||||
return (timeRange, conflictList)
|
return (timeRange, conflictList)
|
||||||
|
|
||||||
# if we made it to here, all is well
|
# if we made it to here, all is well
|
||||||
return None
|
return None
|
||||||
|
|
||||||
##
|
##
|
||||||
# Perform checks to see if it's OK to merge hazards. If there are no conflicting
|
# Perform checks to see if it's OK to merge hazards. If there are no conflicting
|
||||||
# locks or incompatible hazards, do the merge. If there are conflicting locks,
|
# locks or incompatible hazards, do the merge. If there are conflicting locks,
|
||||||
# generate a status bar message and quit. If there incompatible
|
# generate a status bar message and quit. If there incompatible
|
||||||
# hazards, show a warning and let the user decide whether to continue.
|
# hazards, show a warning and let the user decide whether to continue.
|
||||||
def checkForMerge(self):
|
def checkForMerge(self):
|
||||||
# get the hazards selected by the forecaster
|
# get the hazards selected by the forecaster
|
||||||
hazParms = self.getHazardParmNames()
|
hazParms = self.getHazardParmNames()
|
||||||
|
|
||||||
# check for empty list of hazards
|
# check for empty list of hazards
|
||||||
if hazParms == []:
|
if hazParms == []:
|
||||||
self.statusBarMsg("No temporary grids to merge.", "S")
|
self.statusBarMsg("No temporary grids to merge.", "S")
|
||||||
return
|
return
|
||||||
|
|
||||||
# FIXME: Lock race condition
|
# FIXME: Lock race condition
|
||||||
# check for conflicting locks
|
# check for conflicting locks
|
||||||
if self._hazUtils._conflictingLocks(hazParms):
|
if self._hazUtils._conflictingLocks(hazParms):
|
||||||
self.statusBarMsg("There are conflicting locks. " +
|
self.statusBarMsg("There are conflicting locks. " +
|
||||||
"Please resolve these before merging any hazards", "S")
|
"Please resolve these before merging any hazards", "S")
|
||||||
return
|
return
|
||||||
|
|
||||||
conflicts = self.checkForHazardConflicts(hazParms)
|
conflicts = self.checkForHazardConflicts(hazParms)
|
||||||
if conflicts is None:
|
if conflicts is None:
|
||||||
# if no conflicts, merge the grids
|
# if no conflicts, merge the grids
|
||||||
# We made the hazards parm immutable when we separated hazard grids.
|
# We made the hazards parm immutable when we separated hazard grids.
|
||||||
# It has to be made mutable to do the merge.
|
# It has to be made mutable to do the merge.
|
||||||
parm = self.getParm(MODEL, ELEMENT, LEVEL)
|
parm = self.getParm(MODEL, ELEMENT, LEVEL)
|
||||||
parm.setMutable(True)
|
parm.setMutable(True)
|
||||||
self.mergeHazardGrids()
|
self.mergeHazardGrids()
|
||||||
else:
|
else:
|
||||||
haz1 = string.replace(conflicts[1][0], ".", "")
|
haz1 = string.replace(conflicts[1][0], ".", "")
|
||||||
haz2 = string.replace(conflicts[1][1], ".", "")
|
haz2 = string.replace(conflicts[1][1], ".", "")
|
||||||
timeRange = str(conflicts[0])
|
timeRange = str(conflicts[0])
|
||||||
msg = "Hazard conflict detected!\n\n"
|
msg = "Hazard conflict detected!\n\n"
|
||||||
msg += "Time: " + timeRange + " \n\n"
|
msg += "Time: " + timeRange + " \n\n"
|
||||||
msg += "with Hazard grids haz" + haz1 + " and haz" + haz2 + ".\n"
|
msg += "with Hazard grids haz" + haz1 + " and haz" + haz2 + ".\n"
|
||||||
|
|
||||||
LogStream.logEvent("Merge conflict: "+ msg)
|
LogStream.logEvent("Merge conflict: "+ msg)
|
||||||
self.displayDialog(msg)
|
self.displayDialog(msg)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
##
|
##
|
||||||
# Performs the actual merge of the temp hazards grids into the "Hazards" grid.
|
# Performs the actual merge of the temp hazards grids into the "Hazards" grid.
|
||||||
def mergeHazardGrids(self):
|
def mergeHazardGrids(self):
|
||||||
# get the hazards selected by the forecaster
|
# get the hazards selected by the forecaster
|
||||||
hazParms = self.getHazardParmNames()
|
hazParms = self.getHazardParmNames()
|
||||||
|
|
||||||
self._hazUtils._removeAllHazardsGrids()
|
self._hazUtils._removeAllHazardsGrids()
|
||||||
|
|
||||||
for hazParm in hazParms:
|
for hazParm in hazParms:
|
||||||
trList = self._hazUtils._getWEInventory(hazParm)
|
trList = self._hazUtils._getWEInventory(hazParm)
|
||||||
|
|
||||||
for tr in trList:
|
for tr in trList:
|
||||||
byteGrid, hazKey = self.getGrids(MODEL, hazParm, LEVEL, tr,
|
byteGrid, hazKey = self.getGrids(MODEL, hazParm, LEVEL, tr,
|
||||||
mode="First")
|
mode="First")
|
||||||
if isinstance(hazKey, str):
|
if isinstance(hazKey, str):
|
||||||
hazKey = eval(hazKey)
|
hazKey = eval(hazKey)
|
||||||
|
|
||||||
uniqueKeys = self._hazUtils._getUniqueKeys(byteGrid, hazKey)
|
uniqueKeys = self._hazUtils._getUniqueKeys(byteGrid, hazKey)
|
||||||
for uKey in uniqueKeys:
|
for uKey in uniqueKeys:
|
||||||
if uKey == "<None>":
|
if uKey == "<None>":
|
||||||
continue
|
continue
|
||||||
subKeys = self._hazUtils._getSubKeys(uKey)
|
subKeys = self._hazUtils._getSubKeys(uKey)
|
||||||
for subKey in subKeys:
|
for subKey in subKeys:
|
||||||
# make the mask - find all areas that contain the subKey
|
# make the mask - find all areas that contain the subKey
|
||||||
mask = numpy.zeros(byteGrid.shape)
|
mask = numpy.zeros(byteGrid.shape)
|
||||||
for haz in hazKey:
|
for haz in hazKey:
|
||||||
if string.find(haz, subKey) >= 0:
|
if string.find(haz, subKey) >= 0:
|
||||||
hazIndex = self.getIndex(haz, hazKey)
|
hazIndex = self.getIndex(haz, hazKey)
|
||||||
mask = numpy.logical_or(numpy.equal(byteGrid, hazIndex), mask)
|
mask = numpy.logical_or(numpy.equal(byteGrid, hazIndex), mask)
|
||||||
|
|
||||||
# make the grid
|
# make the grid
|
||||||
self._hazUtils._addHazard(ELEMENT, tr, subKey, mask)
|
self._hazUtils._addHazard(ELEMENT, tr, subKey, mask)
|
||||||
LogStream.logEvent("merge: " + \
|
LogStream.logEvent("merge: " + \
|
||||||
str(self._hazUtils._printTime(tr.startTime().unixTime())) + " " + \
|
str(self._hazUtils._printTime(tr.startTime().unixTime())) + " " + \
|
||||||
str(self._hazUtils._printTime(tr.endTime().unixTime())) + " " + \
|
str(self._hazUtils._printTime(tr.endTime().unixTime())) + " " + \
|
||||||
subKey + "\n")
|
subKey + "\n")
|
||||||
|
|
||||||
self.removeTempHazards()
|
self.removeTempHazards()
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
##
|
##
|
||||||
# The main entry point of the procedure.
|
# The main entry point of the procedure.
|
||||||
def execute(self):
|
def execute(self):
|
||||||
self.setToolType("numeric")
|
self.setToolType("numeric")
|
||||||
|
|
||||||
self._hazUtils = HazardUtils.HazardUtils(self._dbss, None)
|
self._hazUtils = HazardUtils.HazardUtils(self._dbss, None)
|
||||||
|
|
||||||
# see if the Hazards WE is loaded in the GFE, if not abort the tool
|
# see if the Hazards WE is loaded in the GFE, if not abort the tool
|
||||||
if not self._hazUtils._hazardsLoaded():
|
if not self._hazUtils._hazardsLoaded():
|
||||||
self.statusBarMsg("Hazards Weather Element must be loaded in " +\
|
self.statusBarMsg("Hazards Weather Element must be loaded in " +\
|
||||||
"the GFE before running MergeHazards", "S")
|
"the GFE before running MergeHazards", "S")
|
||||||
self.cancel()
|
self.cancel()
|
||||||
|
|
||||||
self.checkForMerge()
|
self.checkForMerge()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
|
@ -1,19 +1,19 @@
|
||||||
##
|
##
|
||||||
# This software was developed and / or modified by Raytheon Company,
|
# This software was developed and / or modified by Raytheon Company,
|
||||||
# pursuant to Contract DG133W-05-CQ-1067 with the US Government.
|
# pursuant to Contract DG133W-05-CQ-1067 with the US Government.
|
||||||
#
|
#
|
||||||
# U.S. EXPORT CONTROLLED TECHNICAL DATA
|
# U.S. EXPORT CONTROLLED TECHNICAL DATA
|
||||||
# This software product contains export-restricted data whose
|
# This software product contains export-restricted data whose
|
||||||
# export/transfer/disclosure is restricted by U.S. law. Dissemination
|
# export/transfer/disclosure is restricted by U.S. law. Dissemination
|
||||||
# to non-U.S. persons whether in the United States or abroad requires
|
# to non-U.S. persons whether in the United States or abroad requires
|
||||||
# an export license or other authorization.
|
# an export license or other authorization.
|
||||||
#
|
#
|
||||||
# Contractor Name: Raytheon Company
|
# Contractor Name: Raytheon Company
|
||||||
# Contractor Address: 6825 Pine Street, Suite 340
|
# Contractor Address: 6825 Pine Street, Suite 340
|
||||||
# Mail Stop B8
|
# Mail Stop B8
|
||||||
# Omaha, NE 68106
|
# Omaha, NE 68106
|
||||||
# 402.291.0100
|
# 402.291.0100
|
||||||
#
|
#
|
||||||
# See the AWIPS II Master Rights File ("Master Rights File.pdf") for
|
# See the AWIPS II Master Rights File ("Master Rights File.pdf") for
|
||||||
# further licensing information.
|
# further licensing information.
|
||||||
##
|
##
|
||||||
|
@ -27,16 +27,25 @@
|
||||||
#
|
#
|
||||||
# Author: hansen
|
# Author: hansen
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# SOFTWARE HISTORY
|
||||||
|
#
|
||||||
|
# Date Ticket# Engineer Description
|
||||||
|
# ------------ ---------- ----------- --------------------------
|
||||||
|
# 02/12/2014 #2591 randerso Added retry when loading combinations fails
|
||||||
|
|
||||||
import string, getopt, sys, time, os, types, math
|
import string, getopt, sys, time, os, types, math
|
||||||
import ModuleAccessor
|
import ModuleAccessor
|
||||||
import Utility, logging, traceback
|
import Utility, logging, traceback
|
||||||
|
import AbsTime
|
||||||
from java.lang import ThreadDeath
|
from java.lang import ThreadDeath
|
||||||
from com.raytheon.uf.common.dataplugin.gfe.reference import ReferenceID, ReferenceData
|
from com.raytheon.uf.common.dataplugin.gfe.reference import ReferenceID, ReferenceData
|
||||||
|
|
||||||
GridLoc = None
|
GridLoc = None
|
||||||
LatLonIds = []
|
LatLonIds = []
|
||||||
|
|
||||||
|
MAX_TRIES = 2
|
||||||
|
|
||||||
# If someone imports TextFormatter and needs this instance
|
# If someone imports TextFormatter and needs this instance
|
||||||
# they should either be fixed to use the IFPImporter module
|
# they should either be fixed to use the IFPImporter module
|
||||||
# or turn this line on (which is a kludge but should make
|
# or turn this line on (which is a kludge but should make
|
||||||
|
@ -44,19 +53,19 @@ LatLonIds = []
|
||||||
#IFPImporter = IFPImporter.IFPImporter
|
#IFPImporter = IFPImporter.IFPImporter
|
||||||
|
|
||||||
class TextFormatter:
|
class TextFormatter:
|
||||||
def __init__(self, dataManager):
|
def __init__(self, dataManager):
|
||||||
# Variable for unique combinations
|
# Variable for unique combinations
|
||||||
self.__comboNumber = -1
|
self.__comboNumber = -1
|
||||||
self.dataMgr = dataManager
|
self.dataMgr = dataManager
|
||||||
self.log = logging.getLogger("FormatterRunner.TextFormatter.TextFormatter")
|
self.log = logging.getLogger("FormatterRunner.TextFormatter.TextFormatter")
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# def __del__(self):
|
# def __del__(self):
|
||||||
# for i in LatLonIds:
|
# for i in LatLonIds:
|
||||||
# self.dataMgr.getRefManager().deleteRefSet(i, False)
|
# self.dataMgr.getRefManager().deleteRefSet(i, False)
|
||||||
|
|
||||||
def getForecast(self, fcstName, argDict):
|
def getForecast(self, fcstName, argDict):
|
||||||
" Create the forecast "
|
" Create the forecast "
|
||||||
|
|
||||||
ForecastNarrative = argDict["ForecastNarrative"]
|
ForecastNarrative = argDict["ForecastNarrative"]
|
||||||
ForecastTable = argDict["ForecastTable"]
|
ForecastTable = argDict["ForecastTable"]
|
||||||
|
@ -71,7 +80,7 @@ class TextFormatter:
|
||||||
argDict["getForecast"] = self.getForecast
|
argDict["getForecast"] = self.getForecast
|
||||||
argDict["getFcstDef"] = self.getFcstDef
|
argDict["getFcstDef"] = self.getFcstDef
|
||||||
argDict["dataMgr"] = self.dataMgr
|
argDict["dataMgr"] = self.dataMgr
|
||||||
self.__ut = argDict["utility"]
|
self.__ut = argDict["utility"]
|
||||||
|
|
||||||
# Get the Forecast Definition and type from the server
|
# Get the Forecast Definition and type from the server
|
||||||
#print "finding", fcstName
|
#print "finding", fcstName
|
||||||
|
@ -79,11 +88,11 @@ class TextFormatter:
|
||||||
#print "found ", found
|
#print "found ", found
|
||||||
if found == 0:
|
if found == 0:
|
||||||
text = "Text Product Definition Not Found: " + fcstName + " " + \
|
text = "Text Product Definition Not Found: " + fcstName + " " + \
|
||||||
traceback.format_exc()
|
traceback.format_exc()
|
||||||
self.log.error("Text Product Definition Not Found: Caught Exception: " + fcstName, exc_info=True)
|
self.log.error("Text Product Definition Not Found: Caught Exception: " + fcstName, exc_info=True)
|
||||||
raise Exception, text
|
raise Exception, text
|
||||||
forecastDef = argDict["forecastDef"]
|
forecastDef = argDict["forecastDef"]
|
||||||
fcstType = self.__ut.set(forecastDef,"type",None)
|
fcstType = self.__ut.set(forecastDef, "type", None)
|
||||||
argDict["fcstType"] = fcstType
|
argDict["fcstType"] = fcstType
|
||||||
if fcstType is None:
|
if fcstType is None:
|
||||||
text = "Text Product Type Not Found: " + fcstName + " " + \
|
text = "Text Product Type Not Found: " + fcstName + " " + \
|
||||||
|
@ -101,16 +110,16 @@ class TextFormatter:
|
||||||
# Must have at least one edit area and time range specified
|
# Must have at least one edit area and time range specified
|
||||||
if fcstType != "smart" and fcstType != "component":
|
if fcstType != "smart" and fcstType != "component":
|
||||||
if argDict["editAreas"] == []:
|
if argDict["editAreas"] == []:
|
||||||
text= "No Edit Areas Specified over which to generate product."
|
text = "No Edit Areas Specified over which to generate product."
|
||||||
text=text+'\nTry setting "defaultEditAreas" in the product Definition'
|
text = text + '\nTry setting "defaultEditAreas" in the product Definition'
|
||||||
text=text+'\nOr, if running from the command line, add a -r flag.'
|
text = text + '\nOr, if running from the command line, add a -r flag.'
|
||||||
text = text + '\n' + string.join(traceback.format_exc())
|
text = text + '\n' + string.join(traceback.format_exc())
|
||||||
self.log.error("Caught Exception: " + text)
|
self.log.error("Caught Exception: " + text)
|
||||||
raise Exception, text
|
raise Exception, text
|
||||||
if argDict["rawRanges"] == []:
|
if argDict["rawRanges"] == []:
|
||||||
text= "No Time Ranges Specified over which to generate product."
|
text = "No Time Ranges Specified over which to generate product."
|
||||||
text=text+'\nTry setting "defaultRanges" in the product Definition'
|
text = text + '\nTry setting "defaultRanges" in the product Definition'
|
||||||
text=text+'\nOr, if running from the command line, add a -w flag.'
|
text = text + '\nOr, if running from the command line, add a -w flag.'
|
||||||
text = text + '\n' + string.join(traceback.format_exc())
|
text = text + '\n' + string.join(traceback.format_exc())
|
||||||
self.log.error("Caught Exception: " + text)
|
self.log.error("Caught Exception: " + text)
|
||||||
raise Exception, text
|
raise Exception, text
|
||||||
|
@ -153,7 +162,7 @@ class TextFormatter:
|
||||||
argDict["module"] = module
|
argDict["module"] = module
|
||||||
product.setUp("T", argDict)
|
product.setUp("T", argDict)
|
||||||
product._argDict = argDict
|
product._argDict = argDict
|
||||||
|
|
||||||
try:
|
try:
|
||||||
text = product.generateForecast(argDict)
|
text = product.generateForecast(argDict)
|
||||||
except RuntimeError, e:
|
except RuntimeError, e:
|
||||||
|
@ -166,11 +175,11 @@ class TextFormatter:
|
||||||
|
|
||||||
# requirement for TEST phrasing for TEST products
|
# requirement for TEST phrasing for TEST products
|
||||||
if argDict.get('testMode', 0):
|
if argDict.get('testMode', 0):
|
||||||
testMsg = "\nTHIS IS A TEST MESSAGE. DO NOT TAKE ACTION" +\
|
testMsg = "\nTHIS IS A TEST MESSAGE. DO NOT TAKE ACTION" + \
|
||||||
" BASED ON THIS TEST\nMESSAGE.\n"
|
" BASED ON THIS TEST\nMESSAGE.\n"
|
||||||
#split by "$$"
|
#split by "$$"
|
||||||
segs = text.split('\n$$')
|
segs = text.split('\n$$')
|
||||||
for i in xrange(len(segs)-1): #never the last one
|
for i in xrange(len(segs) - 1): #never the last one
|
||||||
if text.find(testMsg) == -1: #not found, add it in
|
if text.find(testMsg) == -1: #not found, add it in
|
||||||
segs[i] = segs[i] + testMsg
|
segs[i] = segs[i] + testMsg
|
||||||
text = '\n$$'.join(segs) #put text back together again
|
text = '\n$$'.join(segs) #put text back together again
|
||||||
|
@ -185,7 +194,7 @@ class TextFormatter:
|
||||||
if not forecastDef.get('lowerCase', 0):
|
if not forecastDef.get('lowerCase', 0):
|
||||||
text = text.upper()
|
text = text.upper()
|
||||||
else:
|
else:
|
||||||
text="Text Product Type Invalid "+\
|
text = "Text Product Type Invalid " + \
|
||||||
"(must be 'table', 'component' or 'narrative'): ", fcstName, type
|
"(must be 'table', 'component' or 'narrative'): ", fcstName, type
|
||||||
text = text + '\n' + string.join(traceback.format_exc())
|
text = text + '\n' + string.join(traceback.format_exc())
|
||||||
self.log.error("Caught Exception: " + text)
|
self.log.error("Caught Exception: " + text)
|
||||||
|
@ -196,18 +205,18 @@ class TextFormatter:
|
||||||
def __createNarrativeDef(self, fcstName, timeRange):
|
def __createNarrativeDef(self, fcstName, timeRange):
|
||||||
return {
|
return {
|
||||||
"methodList": [self.assembleChildWords],
|
"methodList": [self.assembleChildWords],
|
||||||
"narrativeDef": [(fcstName, timeRange.duration()/3600)],
|
"narrativeDef": [(fcstName, timeRange.duration() / 3600)],
|
||||||
}
|
}
|
||||||
|
|
||||||
def __loop(self, argDict, forecast, forecastDef):
|
def __loop(self, argDict, forecast, forecastDef):
|
||||||
# Loop through product by edit areas and time ranges
|
# Loop through product by edit areas and time ranges
|
||||||
|
|
||||||
begText = self.__ut.set(forecastDef,"beginningText","")
|
begText = self.__ut.set(forecastDef, "beginningText", "")
|
||||||
endText = self.__ut.set(forecastDef,"endingText","")
|
endText = self.__ut.set(forecastDef, "endingText", "")
|
||||||
editAreaLoopBegText = self.__ut.set(forecastDef,"editAreaLoopBegText","")
|
editAreaLoopBegText = self.__ut.set(forecastDef, "editAreaLoopBegText", "")
|
||||||
timeRangeLoopBegText = self.__ut.set(forecastDef,"timeRangeLoopBegText","")
|
timeRangeLoopBegText = self.__ut.set(forecastDef, "timeRangeLoopBegText", "")
|
||||||
editAreaLoopEndText = self.__ut.set(forecastDef,"editAreaLoopEndText","")
|
editAreaLoopEndText = self.__ut.set(forecastDef, "editAreaLoopEndText", "")
|
||||||
timeRangeLoopEndText = self.__ut.set(forecastDef,"timeRangeLoopEndText","")
|
timeRangeLoopEndText = self.__ut.set(forecastDef, "timeRangeLoopEndText", "")
|
||||||
outerLoop = self.__ut.set(forecastDef, "outerLoop", "EditArea")
|
outerLoop = self.__ut.set(forecastDef, "outerLoop", "EditArea")
|
||||||
|
|
||||||
editAreas = argDict["editAreas"]
|
editAreas = argDict["editAreas"]
|
||||||
|
@ -274,10 +283,10 @@ class TextFormatter:
|
||||||
#print "varDict", varDict
|
#print "varDict", varDict
|
||||||
|
|
||||||
for item, default in [
|
for item, default in [
|
||||||
("language","english"),
|
("language", "english"),
|
||||||
("appendFile",None),
|
("appendFile", None),
|
||||||
("lineLength",69), # no command line option
|
("lineLength", 69), # no command line option
|
||||||
("timePeriod",3),
|
("timePeriod", 3),
|
||||||
]:
|
]:
|
||||||
try: # Try the varDict
|
try: # Try the varDict
|
||||||
#print "trying varDict", item
|
#print "trying varDict", item
|
||||||
|
@ -362,19 +371,28 @@ class TextFormatter:
|
||||||
# (["Zones37","Zones38"], "/37/38"),"/37/38"),
|
# (["Zones37","Zones38"], "/37/38"),"/37/38"),
|
||||||
# (["Zones57","Zones58","Zones59"],"57/58/59")
|
# (["Zones57","Zones58","Zones59"],"57/58/59")
|
||||||
# ]
|
# ]
|
||||||
|
|
||||||
# RWA-05/19/11: added this check here to force Combinations files
|
comboName = dfEditAreas
|
||||||
# to be reloaded since we removed a similar check from ModuleAccessor
|
for retryCount in xrange(MAX_TRIES):
|
||||||
# to preserve the magicCodeChanges. Perhaps we should be doing something
|
accessor = ModuleAccessor.ModuleAccessor()
|
||||||
# similar to magicCodeChanges for Combinations files as well.
|
dfEditAreas = accessor.variable(comboName, "Combinations")
|
||||||
if sys.modules.has_key(dfEditAreas):
|
if dfEditAreas is None:
|
||||||
del sys.modules[dfEditAreas]
|
if sys.modules.has_key(comboName):
|
||||||
|
comboMod = sys.modules[comboName]
|
||||||
accessor = ModuleAccessor.ModuleAccessor()
|
if comboMod.__file__.endswith(".pyo"):
|
||||||
dfEditAreas = accessor.variable(dfEditAreas, "Combinations")
|
os.remove(comboMod.__file__)
|
||||||
if dfEditAreas is None:
|
comboMod = None
|
||||||
return "COMBINATION FILE NOT FOUND: " + \
|
del sys.modules[comboName]
|
||||||
self.__ut.set(forecastDef, "defaultEditAreas", [])
|
|
||||||
|
# if not last try, log and try again
|
||||||
|
if retryCount < MAX_TRIES - 1:
|
||||||
|
# log but don't pop up
|
||||||
|
self.log.error("Error loading combinations file: %s, retrying", comboName)
|
||||||
|
else:
|
||||||
|
return "COMBINATION FILE NOT FOUND: " + \
|
||||||
|
self.__ut.set(forecastDef, "defaultEditAreas", [])
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
|
||||||
elif len(dfEditAreas) > 0:
|
elif len(dfEditAreas) > 0:
|
||||||
refDataList = []
|
refDataList = []
|
||||||
|
@ -411,7 +429,7 @@ class TextFormatter:
|
||||||
filterMethod = product.filterMethod
|
filterMethod = product.filterMethod
|
||||||
except:
|
except:
|
||||||
allowedHazards = None
|
allowedHazards = None
|
||||||
|
|
||||||
if allowedHazards is not None and allowedHazards != []:
|
if allowedHazards is not None and allowedHazards != []:
|
||||||
# Set up editAreas as a list of combinations
|
# Set up editAreas as a list of combinations
|
||||||
# Cases:
|
# Cases:
|
||||||
|
@ -440,7 +458,7 @@ class TextFormatter:
|
||||||
"AreaDictionary")
|
"AreaDictionary")
|
||||||
editAreas = self._separateByTimeZone(editAreas,
|
editAreas = self._separateByTimeZone(editAreas,
|
||||||
areaDictName, argDict['creationTime'],
|
areaDictName, argDict['creationTime'],
|
||||||
effectiveTZ = separateByTZ)
|
effectiveTZ=separateByTZ)
|
||||||
|
|
||||||
accurateCities = product.Definition.get('accurateCities', 0)
|
accurateCities = product.Definition.get('accurateCities', 0)
|
||||||
cityRefData = []
|
cityRefData = []
|
||||||
|
@ -464,7 +482,7 @@ class TextFormatter:
|
||||||
"contain entry for edit area: "
|
"contain entry for edit area: "
|
||||||
self.log.error(msg + `ean`)
|
self.log.error(msg + `ean`)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
for city, llrec in citydict[ean].iteritems():
|
for city, llrec in citydict[ean].iteritems():
|
||||||
# Create a referenceData given lat, lon, dim
|
# Create a referenceData given lat, lon, dim
|
||||||
area = (llrec[0], llrec[1], 0)
|
area = (llrec[0], llrec[1], 0)
|
||||||
|
@ -490,8 +508,8 @@ class TextFormatter:
|
||||||
filterMethod, argDict["databaseID"], stationID4,
|
filterMethod, argDict["databaseID"], stationID4,
|
||||||
argDict["vtecActiveTable"], argDict["vtecMode"],
|
argDict["vtecActiveTable"], argDict["vtecMode"],
|
||||||
sampleThreshold, creationTime=argDict["creationTime"], dataMgr=self.dataMgr,
|
sampleThreshold, creationTime=argDict["creationTime"], dataMgr=self.dataMgr,
|
||||||
accurateCities=accurateCities,
|
accurateCities=accurateCities,
|
||||||
cityEditAreas=cityRefData)
|
cityEditAreas=cityRefData)
|
||||||
|
|
||||||
# Store hazards object for later use
|
# Store hazards object for later use
|
||||||
argDict["hazards"] = hazards
|
argDict["hazards"] = hazards
|
||||||
|
@ -540,7 +558,7 @@ class TextFormatter:
|
||||||
except:
|
except:
|
||||||
trName = ""
|
trName = ""
|
||||||
if tr is not None:
|
if tr is not None:
|
||||||
rawRanges.append((tr,trName))
|
rawRanges.append((tr, trName))
|
||||||
elif len(dfRanges) == 0:
|
elif len(dfRanges) == 0:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
|
@ -548,13 +566,13 @@ class TextFormatter:
|
||||||
forecast = TimeRangeUtils.TimeRangeUtils()
|
forecast = TimeRangeUtils.TimeRangeUtils()
|
||||||
for rangeName in dfRanges:
|
for rangeName in dfRanges:
|
||||||
rawRange = forecast.getTimeRange(rangeName, argDict)
|
rawRange = forecast.getTimeRange(rangeName, argDict)
|
||||||
rawRanges.append((rawRange,rangeName))
|
rawRanges.append((rawRange, rangeName))
|
||||||
argDict["rawRanges"] = rawRanges
|
argDict["rawRanges"] = rawRanges
|
||||||
#print "rawRanges", rawRanges
|
#print "rawRanges", rawRanges
|
||||||
|
|
||||||
# Row Label
|
# Row Label
|
||||||
areaType = self.__ut.set(forecastDef,"areaType","")
|
areaType = self.__ut.set(forecastDef, "areaType", "")
|
||||||
rowVariable = self.__ut.set(forecastDef,"rowVariable","EditArea")
|
rowVariable = self.__ut.set(forecastDef, "rowVariable", "EditArea")
|
||||||
if rowVariable == "EditArea":
|
if rowVariable == "EditArea":
|
||||||
rowLabel = areaType
|
rowLabel = areaType
|
||||||
elif rowVariable == "WeatherElement":
|
elif rowVariable == "WeatherElement":
|
||||||
|
@ -566,7 +584,7 @@ class TextFormatter:
|
||||||
def __pairAreaWithLabel(self, chosenAreas, defaultEditAreas):
|
def __pairAreaWithLabel(self, chosenAreas, defaultEditAreas):
|
||||||
# Pair the chosen edit areas with associated labels from
|
# Pair the chosen edit areas with associated labels from
|
||||||
# default list and return new list
|
# default list and return new list
|
||||||
dfEditAreas= []
|
dfEditAreas = []
|
||||||
for area in chosenAreas:
|
for area in chosenAreas:
|
||||||
for name, label in defaultEditAreas:
|
for name, label in defaultEditAreas:
|
||||||
if area == name:
|
if area == name:
|
||||||
|
@ -620,8 +638,8 @@ class TextFormatter:
|
||||||
def __getLatLonAreaName(self, latLonTuple):
|
def __getLatLonAreaName(self, latLonTuple):
|
||||||
lat, lon, dim = latLonTuple
|
lat, lon, dim = latLonTuple
|
||||||
name = "Ref" + '%s%s%s' % (lat, lon, dim)
|
name = "Ref" + '%s%s%s' % (lat, lon, dim)
|
||||||
name = name.replace(".","")
|
name = name.replace(".", "")
|
||||||
name = name.replace("-","")
|
name = name.replace("-", "")
|
||||||
return name
|
return name
|
||||||
|
|
||||||
def getCombinations(self, combinations, argDict):
|
def getCombinations(self, combinations, argDict):
|
||||||
|
@ -635,7 +653,7 @@ class TextFormatter:
|
||||||
newArea = self.getEditArea(editArea, argDict)
|
newArea = self.getEditArea(editArea, argDict)
|
||||||
if comboList.index(editArea) == 0:
|
if comboList.index(editArea) == 0:
|
||||||
comboNumber = self.getComboNumber()
|
comboNumber = self.getComboNumber()
|
||||||
label = "Combo"+`comboNumber`
|
label = "Combo" + `comboNumber`
|
||||||
refId = ReferenceID(label)
|
refId = ReferenceID(label)
|
||||||
#global GridLoc
|
#global GridLoc
|
||||||
#GridLoc = newArea.getGloc()
|
#GridLoc = newArea.getGloc()
|
||||||
|
@ -680,7 +698,7 @@ class TextFormatter:
|
||||||
|
|
||||||
try:
|
try:
|
||||||
product = argDict["self"]
|
product = argDict["self"]
|
||||||
exec "fcstDef = product."+fcstName+"()"
|
exec "fcstDef = product." + fcstName + "()"
|
||||||
module = argDict["module"]
|
module = argDict["module"]
|
||||||
except:
|
except:
|
||||||
# See if fcstName is variable in imported modules e.g. MyTable = {}
|
# See if fcstName is variable in imported modules e.g. MyTable = {}
|
||||||
|
@ -699,7 +717,7 @@ class TextFormatter:
|
||||||
try:
|
try:
|
||||||
# Look for fcstName = {}
|
# Look for fcstName = {}
|
||||||
# This can be removed eventually
|
# This can be removed eventually
|
||||||
exec "fcstDef = module."+fcstName
|
exec "fcstDef = module." + fcstName
|
||||||
except:
|
except:
|
||||||
try:
|
try:
|
||||||
# Try to instantiate smart text product class
|
# Try to instantiate smart text product class
|
||||||
|
@ -750,7 +768,7 @@ class TextFormatter:
|
||||||
|
|
||||||
def getEditArea(self, editAreaName, argDict):
|
def getEditArea(self, editAreaName, argDict):
|
||||||
# Returns an AFPS.ReferenceData object given an edit area name
|
# Returns an AFPS.ReferenceData object given an edit area name
|
||||||
# as defined in the GFE
|
# as defined in the GFE
|
||||||
# Apply suffix if appropriate
|
# Apply suffix if appropriate
|
||||||
refID = ReferenceID(editAreaName)
|
refID = ReferenceID(editAreaName)
|
||||||
#print "Getting edit area"
|
#print "Getting edit area"
|
||||||
|
@ -779,7 +797,7 @@ class TextFormatter:
|
||||||
return tmp
|
return tmp
|
||||||
|
|
||||||
def _separateByTimeZone(self, editAreaGroups, areaDictName, creationTime,
|
def _separateByTimeZone(self, editAreaGroups, areaDictName, creationTime,
|
||||||
effectiveTZ = "effectiveTZ"):
|
effectiveTZ="effectiveTZ"):
|
||||||
#takes the list of areas, and based on the time zones breaks
|
#takes the list of areas, and based on the time zones breaks
|
||||||
#them up to ensure that each grouping using the same time zone.
|
#them up to ensure that each grouping using the same time zone.
|
||||||
#areaDictName is name of the area dictionary. creationTime is the
|
#areaDictName is name of the area dictionary. creationTime is the
|
||||||
|
@ -817,7 +835,7 @@ class TextFormatter:
|
||||||
zoneTZ = localTZ
|
zoneTZ = localTZ
|
||||||
tzid = localTZid
|
tzid = localTZid
|
||||||
#print "falling back to WFOtz: ", zoneTZ
|
#print "falling back to WFOtz: ", zoneTZ
|
||||||
self.log.warning("WARNING: Entry " + area +
|
self.log.warning("WARNING: Entry " + area +
|
||||||
" missing from AreaDictionary. Using default time zone.")
|
" missing from AreaDictionary. Using default time zone.")
|
||||||
|
|
||||||
zones = tzDir.get(zoneTZ, [])
|
zones = tzDir.get(zoneTZ, [])
|
||||||
|
@ -835,7 +853,7 @@ class TextFormatter:
|
||||||
elif effectiveTZ == "actualTZ":
|
elif effectiveTZ == "actualTZ":
|
||||||
dict = tzDir
|
dict = tzDir
|
||||||
else:
|
else:
|
||||||
self.log.error("Invalid effectiveTZ for separateByTZ() " +
|
self.log.error("Invalid effectiveTZ for separateByTZ() " +
|
||||||
effectiveTZ)
|
effectiveTZ)
|
||||||
return editAreaGroups
|
return editAreaGroups
|
||||||
keys = dict.keys()
|
keys = dict.keys()
|
||||||
|
@ -850,39 +868,39 @@ class TextFormatter:
|
||||||
#################################################################
|
#################################################################
|
||||||
def makeSquare(lat, lon, km):
|
def makeSquare(lat, lon, km):
|
||||||
" Make a list of square of given km around lat,lon"
|
" Make a list of square of given km around lat,lon"
|
||||||
latinc = km/222.0
|
latinc = km / 222.0
|
||||||
loninc = math.cos(lat/57.17) * km / 222.0
|
loninc = math.cos(lat / 57.17) * km / 222.0
|
||||||
|
|
||||||
latTop = lat + latinc
|
latTop = lat + latinc
|
||||||
latBottom =lat - latinc
|
latBottom = lat - latinc
|
||||||
lonLeft = lon - loninc
|
lonLeft = lon - loninc
|
||||||
lonRight = lon + loninc
|
lonRight = lon + loninc
|
||||||
|
|
||||||
points = []
|
points = []
|
||||||
points.append(`latTop`+","+ `lonRight`)
|
points.append(`latTop` + "," + `lonRight`)
|
||||||
points.append(`latTop`+","+ `lonLeft`)
|
points.append(`latTop` + "," + `lonLeft`)
|
||||||
points.append(`latBottom`+","+ `lonLeft`)
|
points.append(`latBottom` + "," + `lonLeft`)
|
||||||
points.append(`latBottom`+","+`lonRight`)
|
points.append(`latBottom` + "," + `lonRight`)
|
||||||
return points
|
return points
|
||||||
|
|
||||||
def makePoint(point):
|
def makePoint(point):
|
||||||
" Make a CartCoord2D from the point in format: x,y"
|
" Make a CartCoord2D from the point in format: x,y"
|
||||||
from com.vividsolutions.jts.geom import Coordinate
|
from com.vividsolutions.jts.geom import Coordinate
|
||||||
ind = string.find(point,",")
|
ind = string.find(point, ",")
|
||||||
latStr = point[0:ind-1]
|
latStr = point[0:ind - 1]
|
||||||
lonStr = point[ind+1:len(point)]
|
lonStr = point[ind + 1:len(point)]
|
||||||
lat = float(latStr)
|
lat = float(latStr)
|
||||||
lon = float(lonStr)
|
lon = float(lonStr)
|
||||||
return Coordinate(lon,lat)
|
return Coordinate(lon, lat)
|
||||||
|
|
||||||
def makeArea(gridLoc, pointList, refname=None):
|
def makeArea(gridLoc, pointList, refname=None):
|
||||||
" Make a Reference Area with a unique ReferenceID"
|
" Make a Reference Area with a unique ReferenceID"
|
||||||
from com.vividsolutions.jts.geom import GeometryFactory, LinearRing, Coordinate, Polygon
|
from com.vividsolutions.jts.geom import GeometryFactory, LinearRing, Coordinate, Polygon
|
||||||
from com.raytheon.uf.common.dataplugin.gfe.reference import ReferenceData_CoordinateType as CoordinateType
|
from com.raytheon.uf.common.dataplugin.gfe.reference import ReferenceData_CoordinateType as CoordinateType
|
||||||
geomFactory = GeometryFactory()
|
geomFactory = GeometryFactory()
|
||||||
import jep
|
import jep
|
||||||
size = len(pointList)
|
size = len(pointList)
|
||||||
if pointList[0] != pointList[size-1]: # closing the loop
|
if pointList[0] != pointList[size - 1]: # closing the loop
|
||||||
pointList.append(pointList[0])
|
pointList.append(pointList[0])
|
||||||
pointArray = jep.jarray(len(pointList), Coordinate)
|
pointArray = jep.jarray(len(pointList), Coordinate)
|
||||||
for i in range(len(pointList)):
|
for i in range(len(pointList)):
|
||||||
|
@ -893,7 +911,7 @@ def makeArea(gridLoc, pointList, refname=None):
|
||||||
polyArray[0] = poly
|
polyArray[0] = poly
|
||||||
region = geomFactory.createMultiPolygon(polyArray)
|
region = geomFactory.createMultiPolygon(polyArray)
|
||||||
if refname is None:
|
if refname is None:
|
||||||
refname = "Ref" + getTime()
|
refname = "Ref" + getTime()
|
||||||
refId = ReferenceID(refname)
|
refId = ReferenceID(refname)
|
||||||
refData = ReferenceData(gridLoc, refId, region, CoordinateType.LATLON)
|
refData = ReferenceData(gridLoc, refId, region, CoordinateType.LATLON)
|
||||||
# randerso: I don't think this is necessary
|
# randerso: I don't think this is necessary
|
||||||
|
@ -913,8 +931,8 @@ def storeReferenceData(refSetMgr, refData, temp=True):
|
||||||
|
|
||||||
def getTime():
|
def getTime():
|
||||||
"Return an ascii string for the current time without spaces or :'s"
|
"Return an ascii string for the current time without spaces or :'s"
|
||||||
timeStr = `time.time()`
|
timeStr = `time.time()`
|
||||||
timeStr = string.replace(timeStr,".","_")
|
timeStr = string.replace(timeStr, ".", "_")
|
||||||
return timeStr
|
return timeStr
|
||||||
|
|
||||||
def getAbsTime(timeStr):
|
def getAbsTime(timeStr):
|
||||||
|
@ -926,7 +944,7 @@ def getAbsTime(timeStr):
|
||||||
hour = string.atoi(timeStr[9:11])
|
hour = string.atoi(timeStr[9:11])
|
||||||
minute = string.atoi(timeStr[11:13])
|
minute = string.atoi(timeStr[11:13])
|
||||||
|
|
||||||
return AFPSSup.AbsTimeYMD(year,month,day,hour,minute)
|
return AbsTime.absTimeYMD(year, month, day, hour, minute)
|
||||||
|
|
||||||
def usage():
|
def usage():
|
||||||
print """
|
print """
|
||||||
|
|
|
@ -54,6 +54,7 @@
|
||||||
# Oct 31, 2013 2508 randerso Change to use DiscreteGridSlice.getKeys()
|
# Oct 31, 2013 2508 randerso Change to use DiscreteGridSlice.getKeys()
|
||||||
# Nov 07, 2013 2476 dgilling Fix _getGridsResult() for retrieving
|
# Nov 07, 2013 2476 dgilling Fix _getGridsResult() for retrieving
|
||||||
# Wx/Discrete in First mode.
|
# Wx/Discrete in First mode.
|
||||||
|
# Dec 23, 2013 16893 ryu Added unloadWEs() method (created by njensen)
|
||||||
#
|
#
|
||||||
########################################################################
|
########################################################################
|
||||||
import types, string, time, sys
|
import types, string, time, sys
|
||||||
|
@ -1500,7 +1501,6 @@ class SmartScript(BaseTool.BaseTool):
|
||||||
tzname = self.__dataMgr.getClient().getSiteTimeZone()
|
tzname = self.__dataMgr.getClient().getSiteTimeZone()
|
||||||
tz = dateutil.tz.gettz(tzname)
|
tz = dateutil.tz.gettz(tzname)
|
||||||
|
|
||||||
|
|
||||||
utczone = dateutil.tz.gettz('UTC')
|
utczone = dateutil.tz.gettz('UTC')
|
||||||
gmdt = self._gmtime(date).replace(tzinfo=utczone)
|
gmdt = self._gmtime(date).replace(tzinfo=utczone)
|
||||||
tzdt = gmdt.astimezone(tz)
|
tzdt = gmdt.astimezone(tz)
|
||||||
|
@ -1803,6 +1803,19 @@ class SmartScript(BaseTool.BaseTool):
|
||||||
parmJA[0] = parm
|
parmJA[0] = parm
|
||||||
self.__parmMgr.deleteParm(parmJA)
|
self.__parmMgr.deleteParm(parmJA)
|
||||||
|
|
||||||
|
def unloadWEs(self, model, elementLevelPairs, mostRecent=0):
|
||||||
|
jparms = []
|
||||||
|
for element, level in elementLevelPairs:
|
||||||
|
exprName = self.getExprName(model, element, level, mostRecent)
|
||||||
|
parm = self.__parmMgr.getParmInExpr(exprName, 1)
|
||||||
|
if parm:
|
||||||
|
jparms.append(parm)
|
||||||
|
if jparms:
|
||||||
|
parmJA = jep.jarray(len(jparms), jparms[0])
|
||||||
|
for i in xrange(len(jparms)):
|
||||||
|
parmJA[i] = jparms[i]
|
||||||
|
self.__parmMgr.deleteParm(parmJA)
|
||||||
|
|
||||||
def saveElements(self, elementList):
|
def saveElements(self, elementList):
|
||||||
# Save the given Fcst elements to the server
|
# Save the given Fcst elements to the server
|
||||||
# Example:
|
# Example:
|
||||||
|
|
|
@ -28,6 +28,7 @@ import java.util.Set;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
|
|
||||||
import org.eclipse.jface.dialogs.IDialogConstants;
|
import org.eclipse.jface.dialogs.IDialogConstants;
|
||||||
|
import org.eclipse.jface.dialogs.MessageDialog;
|
||||||
import org.eclipse.jface.resource.ImageRegistry;
|
import org.eclipse.jface.resource.ImageRegistry;
|
||||||
import org.eclipse.swt.SWT;
|
import org.eclipse.swt.SWT;
|
||||||
import org.eclipse.swt.events.MenuAdapter;
|
import org.eclipse.swt.events.MenuAdapter;
|
||||||
|
@ -97,6 +98,7 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback;
|
||||||
* up warnings.
|
* up warnings.
|
||||||
* May 15, 2013 1842 dgilling Pass DataManager instance down to sub-
|
* May 15, 2013 1842 dgilling Pass DataManager instance down to sub-
|
||||||
* components.
|
* components.
|
||||||
|
* Feb 12, 2014 2801 randerso Added prompting if formatter is run against non-normal database
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -106,6 +108,12 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback;
|
||||||
|
|
||||||
public class FormatterLauncherDialog extends CaveJFACEDialog implements
|
public class FormatterLauncherDialog extends CaveJFACEDialog implements
|
||||||
IProductTab {
|
IProductTab {
|
||||||
|
|
||||||
|
// formatter data sources. Fcst must be first
|
||||||
|
private static enum FormatterDataSource {
|
||||||
|
Fcst, ISC, Official, Default,
|
||||||
|
}
|
||||||
|
|
||||||
private final transient IUFStatusHandler statusHandler = UFStatus
|
private final transient IUFStatusHandler statusHandler = UFStatus
|
||||||
.getHandler(FormatterLauncherDialog.class);
|
.getHandler(FormatterLauncherDialog.class);
|
||||||
|
|
||||||
|
@ -161,24 +169,9 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements
|
||||||
private Image failedImg;
|
private Image failedImg;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fcst data source menu item.
|
* data source menu items
|
||||||
*/
|
*/
|
||||||
private MenuItem fcstMI = null;
|
private java.util.List<MenuItem> dataSourceMI;
|
||||||
|
|
||||||
/**
|
|
||||||
* Official data source menu item.
|
|
||||||
*/
|
|
||||||
private MenuItem officialMI = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ISC data source menu item.
|
|
||||||
*/
|
|
||||||
private MenuItem iscMI = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Default data source menu item.
|
|
||||||
*/
|
|
||||||
private MenuItem defaultMI = null;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Products menu.
|
* Products menu.
|
||||||
|
@ -212,8 +205,6 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements
|
||||||
|
|
||||||
private DataManager dataMgr;
|
private DataManager dataMgr;
|
||||||
|
|
||||||
private String selectedDataSource = null;
|
|
||||||
|
|
||||||
private boolean doClose = false;
|
private boolean doClose = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -338,59 +329,47 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements
|
||||||
// Get the CAVE operating mode
|
// Get the CAVE operating mode
|
||||||
CAVEMode mode = dataMgr.getOpMode();
|
CAVEMode mode = dataMgr.getOpMode();
|
||||||
|
|
||||||
// Forecast menu item, set text based on operating mode
|
this.dataSourceMI = new ArrayList<MenuItem>();
|
||||||
fcstMI = new MenuItem(dataSourceMenu, SWT.RADIO);
|
// create menu items
|
||||||
if (mode.equals(CAVEMode.OPERATIONAL)) {
|
for (FormatterDataSource source : FormatterDataSource.values()) {
|
||||||
fcstMI.setText("Fcst");
|
MenuItem item = new MenuItem(dataSourceMenu, SWT.RADIO);
|
||||||
} else if (mode.equals(CAVEMode.PRACTICE)) {
|
item.setData(source);
|
||||||
fcstMI.setText("Fcst_Prac");
|
this.dataSourceMI.add(item);
|
||||||
fcstMI.setSelection(true);
|
String text = source.toString();
|
||||||
} else {
|
if (source.equals(FormatterDataSource.Fcst)) {
|
||||||
fcstMI.setText("Fcst_Test");
|
if (mode.equals(CAVEMode.PRACTICE)) {
|
||||||
fcstMI.setSelection(true);
|
text += "_Prac";
|
||||||
}
|
} else if (mode.equals(CAVEMode.TEST)) {
|
||||||
fcstMI.addSelectionListener(new SelectionAdapter() {
|
text += "_Test";
|
||||||
@Override
|
}
|
||||||
public void widgetSelected(SelectionEvent event) {
|
|
||||||
selectedDataSource = dataMgr.getParmManager()
|
|
||||||
.getMutableDatabase().toString();
|
|
||||||
}
|
}
|
||||||
});
|
item.setText(text);
|
||||||
|
item.addSelectionListener(new SelectionAdapter() {
|
||||||
|
|
||||||
// Only show these menu items when in operational mode
|
|
||||||
if (mode.equals(CAVEMode.OPERATIONAL)) {
|
|
||||||
// ISC menu item
|
|
||||||
iscMI = new MenuItem(dataSourceMenu, SWT.RADIO);
|
|
||||||
iscMI.setText("ISC");
|
|
||||||
iscMI.addSelectionListener(new SelectionAdapter() {
|
|
||||||
@Override
|
@Override
|
||||||
public void widgetSelected(SelectionEvent event) {
|
public void widgetSelected(SelectionEvent e) {
|
||||||
getIscDataSource();
|
MenuItem item = (MenuItem) e.getSource();
|
||||||
|
if (item.getSelection()) {
|
||||||
|
statusHandler.handle(
|
||||||
|
Priority.EVENTB,
|
||||||
|
"User selected formatter data source: "
|
||||||
|
+ item.getText());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Official menu item
|
if (!mode.equals(CAVEMode.OPERATIONAL)) {
|
||||||
officialMI = new MenuItem(dataSourceMenu, SWT.RADIO);
|
item.setSelection(true);
|
||||||
officialMI.setText("Official");
|
statusHandler.handle(Priority.EVENTB,
|
||||||
officialMI.addSelectionListener(new SelectionAdapter() {
|
"Formatter default data source: " + item.getText());
|
||||||
@Override
|
break;
|
||||||
public void widgetSelected(SelectionEvent event) {
|
}
|
||||||
selectedDataSource = getOfficialDataSource();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Default menu item
|
if (source.equals(FormatterDataSource.Default)) {
|
||||||
defaultMI = new MenuItem(dataSourceMenu, SWT.RADIO);
|
item.setSelection(true);
|
||||||
defaultMI.setText("Default");
|
statusHandler.handle(Priority.EVENTB,
|
||||||
defaultMI.setSelection(true);
|
"Formatter default data source: " + item.getText());
|
||||||
defaultMI.addSelectionListener(new SelectionAdapter() {
|
}
|
||||||
@Override
|
|
||||||
public void widgetSelected(SelectionEvent event) {
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
selectedDataSource = dataMgr.getParmManager().getMutableDatabase()
|
|
||||||
.toString();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -731,32 +710,108 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements
|
||||||
* The name of the product
|
* The name of the product
|
||||||
* @return The data source
|
* @return The data source
|
||||||
*/
|
*/
|
||||||
public String getSelectedDataSource(String productName) {
|
public DatabaseID getSelectedDataSource(String productName) {
|
||||||
if (fcstMI.getSelection()) {
|
FormatterDataSource menuDataSource = FormatterDataSource.Default;
|
||||||
selectedDataSource = getFcstDataSource();
|
for (MenuItem item : dataSourceMI) {
|
||||||
} else if (iscMI.getSelection()) {
|
if (item.getSelection()) {
|
||||||
selectedDataSource = getIscDataSource();
|
menuDataSource = (FormatterDataSource) item.getData();
|
||||||
} else if (officialMI.getSelection()) {
|
break;
|
||||||
selectedDataSource = getOfficialDataSource();
|
|
||||||
} else {
|
|
||||||
// Default value
|
|
||||||
ProductDefinition prodDef = textProductMgr
|
|
||||||
.getProductDefinition(productName);
|
|
||||||
String dataSource = (String) prodDef.get("database");
|
|
||||||
if (dataSource == null) {
|
|
||||||
dataSource = "Official";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dataSource.equals("ISC")) {
|
|
||||||
selectedDataSource = getIscDataSource();
|
|
||||||
} else if (dataSource.equals("Official")) {
|
|
||||||
selectedDataSource = getOfficialDataSource();
|
|
||||||
} else {
|
|
||||||
selectedDataSource = getFcstDataSource();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return selectedDataSource;
|
// Default value
|
||||||
|
ProductDefinition prodDef = textProductMgr
|
||||||
|
.getProductDefinition(productName);
|
||||||
|
String dbString = (String) prodDef.get("database");
|
||||||
|
FormatterDataSource productDataSource;
|
||||||
|
if (dbString == null) {
|
||||||
|
productDataSource = FormatterDataSource.Default;
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
productDataSource = FormatterDataSource.valueOf(dbString);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
StringBuilder msg = new StringBuilder();
|
||||||
|
msg.append("The ");
|
||||||
|
msg.append(productName);
|
||||||
|
msg.append(" product definition contains an invalid database selection: \"");
|
||||||
|
msg.append(dbString);
|
||||||
|
msg.append("\". Valid values are: [");
|
||||||
|
for (FormatterDataSource src : FormatterDataSource.values()) {
|
||||||
|
if (!src.equals(FormatterDataSource.Default)) {
|
||||||
|
msg.append(src).append(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
msg.delete(msg.length() - 2, msg.length());
|
||||||
|
msg.append("]");
|
||||||
|
statusHandler.error(msg.toString());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FormatterDataSource dataSource;
|
||||||
|
if (menuDataSource.equals(FormatterDataSource.Default)) {
|
||||||
|
if (productDataSource.equals(FormatterDataSource.Default)) {
|
||||||
|
dataSource = FormatterDataSource.Official;
|
||||||
|
} else {
|
||||||
|
dataSource = productDataSource;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
dataSource = menuDataSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!productDataSource.equals(FormatterDataSource.Default)) {
|
||||||
|
if (!dataSource.equals(productDataSource)) {
|
||||||
|
// A check should be made that a hazard formatter is actually
|
||||||
|
// being run on the database specified in the Local or
|
||||||
|
// Definition file (Definition["database"] entry). If the
|
||||||
|
// database being run is different, provide a warning to the
|
||||||
|
// forecaster that requires acknowledgment before running.
|
||||||
|
MessageDialog dlg = new MessageDialog(getShell(),
|
||||||
|
"Confirm Data Source", null,
|
||||||
|
"The product definition indicates the " + productName
|
||||||
|
+ " formatter should be run against the "
|
||||||
|
+ productDataSource
|
||||||
|
+ " database, but you have selected the "
|
||||||
|
+ dataSource
|
||||||
|
+ " database.\n\nDo you wish to continue?",
|
||||||
|
MessageDialog.WARNING, new String[] { "Yes", "No" }, 1);
|
||||||
|
int retVal = dlg.open();
|
||||||
|
if (retVal != 0) {
|
||||||
|
dataSource = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (dataSource.equals(FormatterDataSource.ISC)) {
|
||||||
|
// If the database is not explicitly defined (default), provide
|
||||||
|
// a a warning to the forecaster that requires acknowledgment
|
||||||
|
// before running if the database being used is ISC
|
||||||
|
MessageDialog dlg = new MessageDialog(
|
||||||
|
getShell(),
|
||||||
|
"Confirm Data Source",
|
||||||
|
null,
|
||||||
|
"You are about to run the "
|
||||||
|
+ productName
|
||||||
|
+ " formatter against the ISC database.\n\nDo you wish to continue?",
|
||||||
|
MessageDialog.WARNING, new String[] { "Yes", "No" }, 1);
|
||||||
|
int retVal = dlg.open();
|
||||||
|
if (retVal != 0) {
|
||||||
|
dataSource = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DatabaseID selectedDbId;
|
||||||
|
if (dataSource == null) {
|
||||||
|
selectedDbId = null;
|
||||||
|
} else if (dataSource.equals(FormatterDataSource.ISC)) {
|
||||||
|
selectedDbId = getIscDataSource();
|
||||||
|
} else if (dataSource.equals(FormatterDataSource.Official)) {
|
||||||
|
selectedDbId = getOfficialDataSource();
|
||||||
|
} else {
|
||||||
|
selectedDbId = getFcstDataSource();
|
||||||
|
}
|
||||||
|
|
||||||
|
return selectedDbId;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1009,8 +1064,8 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements
|
||||||
*
|
*
|
||||||
* @return The FcstDataSource
|
* @return The FcstDataSource
|
||||||
*/
|
*/
|
||||||
private String getFcstDataSource() {
|
private DatabaseID getFcstDataSource() {
|
||||||
return dataMgr.getParmManager().getMutableDatabase().toString();
|
return dataMgr.getParmManager().getMutableDatabase();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1021,13 +1076,13 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements
|
||||||
*
|
*
|
||||||
* @return The ISC Data Source
|
* @return The ISC Data Source
|
||||||
*/
|
*/
|
||||||
private String getIscDataSource() {
|
private DatabaseID getIscDataSource() {
|
||||||
java.util.List<DatabaseID> dbs = dataMgr.getParmManager()
|
java.util.List<DatabaseID> dbs = dataMgr.getParmManager()
|
||||||
.getIscDatabases();
|
.getIscDatabases();
|
||||||
|
|
||||||
if (dbs.size() > 0) {
|
if (dbs.size() > 0) {
|
||||||
// Always return the last one in the list
|
// Always return the last one in the list
|
||||||
return dbs.get(dbs.size() - 1).toString();
|
return dbs.get(dbs.size() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
@ -1038,12 +1093,12 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements
|
||||||
*
|
*
|
||||||
* @return The Official Data source
|
* @return The Official Data source
|
||||||
*/
|
*/
|
||||||
private String getOfficialDataSource() {
|
private DatabaseID getOfficialDataSource() {
|
||||||
String source = null;
|
DatabaseID source = null;
|
||||||
try {
|
try {
|
||||||
ServerResponse<java.util.List<DatabaseID>> sr = dataMgr.getClient()
|
ServerResponse<java.util.List<DatabaseID>> sr = dataMgr.getClient()
|
||||||
.getOfficialDBName();
|
.getOfficialDBName();
|
||||||
source = sr.getPayload().get(0).toString();
|
source = sr.getPayload().get(0);
|
||||||
} catch (GFEServerException e) {
|
} catch (GFEServerException e) {
|
||||||
statusHandler.handle(Priority.PROBLEM,
|
statusHandler.handle(Priority.PROBLEM,
|
||||||
"Unable to determine official db", e);
|
"Unable to determine official db", e);
|
||||||
|
|
|
@ -34,6 +34,7 @@ import org.eclipse.swt.widgets.Label;
|
||||||
import org.eclipse.swt.widgets.ProgressBar;
|
import org.eclipse.swt.widgets.ProgressBar;
|
||||||
import org.eclipse.swt.widgets.TabFolder;
|
import org.eclipse.swt.widgets.TabFolder;
|
||||||
|
|
||||||
|
import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID;
|
||||||
import com.raytheon.viz.gfe.Activator;
|
import com.raytheon.viz.gfe.Activator;
|
||||||
import com.raytheon.viz.gfe.core.DataManager;
|
import com.raytheon.viz.gfe.core.DataManager;
|
||||||
import com.raytheon.viz.gfe.dialogs.FormatterLauncherDialog;
|
import com.raytheon.viz.gfe.dialogs.FormatterLauncherDialog;
|
||||||
|
@ -64,6 +65,8 @@ import com.raytheon.viz.gfe.textformatter.TextProductManager;
|
||||||
* 05 SEP 2013 2329 randerso Added call to ZoneCombinerComp.applyZoneCombo when
|
* 05 SEP 2013 2329 randerso Added call to ZoneCombinerComp.applyZoneCombo when
|
||||||
* when run formatter button is clicked.
|
* when run formatter button is clicked.
|
||||||
* 05 FEB 2014 2591 randerso Added dataManager to ZoneCombinerComp constructor
|
* 05 FEB 2014 2591 randerso Added dataManager to ZoneCombinerComp constructor
|
||||||
|
* Passed dataMgr instance to FormatterUtil.runFormatterScript
|
||||||
|
* 12 FEB 2014 2801 randerso Added prompting if formatter is run against non-normal database
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -365,36 +368,37 @@ public class ProductAreaComp extends Composite implements
|
||||||
productEditorBtnSelected();
|
productEditorBtnSelected();
|
||||||
|
|
||||||
if (okToLoseText()) {
|
if (okToLoseText()) {
|
||||||
productEditorComp.clearProductText();
|
DatabaseID dbId = ((FormatterLauncherDialog) productTabCB)
|
||||||
abortFormatterBtn.setEnabled(true);
|
.getSelectedDataSource(productName);
|
||||||
// closeTabBtn.setEnabled(false);
|
|
||||||
runFormatterBtn.setEnabled(false);
|
if (dbId != null) {
|
||||||
String vtecMode = "";
|
productEditorComp.clearProductText();
|
||||||
if (formattingCbo.isVisible()) {
|
abortFormatterBtn.setEnabled(true);
|
||||||
vtecMode = formattingCbo.getText();
|
// closeTabBtn.setEnabled(false);
|
||||||
} else {
|
runFormatterBtn.setEnabled(false);
|
||||||
int hazIndex = productName.indexOf("Hazard_");
|
String vtecMode = "";
|
||||||
if (hazIndex > -1) {
|
if (formattingCbo.isVisible()) {
|
||||||
String category = productName.substring(
|
vtecMode = formattingCbo.getText();
|
||||||
hazIndex + 7, hazIndex + 10);
|
} else {
|
||||||
vtecMode = textProductMgr
|
int hazIndex = productName.indexOf("Hazard_");
|
||||||
.getVtecMessageType(category);
|
if (hazIndex > -1) {
|
||||||
if (vtecMode == null) {
|
String category = productName.substring(
|
||||||
vtecMode = "";
|
hazIndex + 7, hazIndex + 10);
|
||||||
|
vtecMode = textProductMgr
|
||||||
|
.getVtecMessageType(category);
|
||||||
|
if (vtecMode == null) {
|
||||||
|
vtecMode = "";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Check the data source menus, if one is selected then
|
// Get the source database
|
||||||
// use
|
zoneCombiner.applyZoneCombo();
|
||||||
// it, else use the default
|
FormatterUtil.runFormatterScript(dataMgr,
|
||||||
String dbId = null;
|
textProductMgr, productName,
|
||||||
zoneCombiner.applyZoneCombo();
|
dbId.toString(), vtecMode,
|
||||||
dbId = ((FormatterLauncherDialog) productTabCB)
|
ProductAreaComp.this);
|
||||||
.getSelectedDataSource(productName);
|
}
|
||||||
FormatterUtil.runFormatterScript(textProductMgr,
|
|
||||||
productName, dbId, vtecMode,
|
|
||||||
ProductAreaComp.this);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -22,6 +22,7 @@ package com.raytheon.viz.gfe.textformatter;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -223,12 +224,18 @@ public class CombinationsFileUtil {
|
||||||
// retrieve combinations file if it's changed
|
// retrieve combinations file if it's changed
|
||||||
LocalizationFile lf = pm.getStaticLocalizationFile(FileUtil.join(
|
LocalizationFile lf = pm.getStaticLocalizationFile(FileUtil.join(
|
||||||
COMBO_DIR_PATH, comboName + ".py"));
|
COMBO_DIR_PATH, comboName + ".py"));
|
||||||
File pyFile;
|
File pyFile = null;
|
||||||
try {
|
if (lf != null) {
|
||||||
pyFile = lf.getFile(true);
|
try {
|
||||||
} catch (LocalizationException e) {
|
pyFile = lf.getFile(true);
|
||||||
throw new GfeException("Error retrieving combinations file: "
|
} catch (LocalizationException e) {
|
||||||
+ comboName, e);
|
throw new GfeException("Error retrieving combinations file: "
|
||||||
|
+ comboName, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pyFile == null || !pyFile.exists()) {
|
||||||
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
LocalizationContext baseContext = pm.getContext(
|
LocalizationContext baseContext = pm.getContext(
|
||||||
|
|
|
@ -24,7 +24,6 @@ import java.util.TimeZone;
|
||||||
|
|
||||||
import com.raytheon.uf.common.status.IUFStatusHandler;
|
import com.raytheon.uf.common.status.IUFStatusHandler;
|
||||||
import com.raytheon.uf.common.status.UFStatus;
|
import com.raytheon.uf.common.status.UFStatus;
|
||||||
import com.raytheon.uf.common.status.UFStatus.Priority;
|
|
||||||
import com.raytheon.uf.common.time.SimulatedTime;
|
import com.raytheon.uf.common.time.SimulatedTime;
|
||||||
import com.raytheon.uf.common.time.TimeRange;
|
import com.raytheon.uf.common.time.TimeRange;
|
||||||
import com.raytheon.viz.core.mode.CAVEMode;
|
import com.raytheon.viz.core.mode.CAVEMode;
|
||||||
|
@ -42,6 +41,8 @@ import com.raytheon.viz.gfe.tasks.TaskManager;
|
||||||
* Sep 8, 2008 njensen Initial creation
|
* Sep 8, 2008 njensen Initial creation
|
||||||
* Jan 15, 2010 3395 ryu Fix "issued by" functionality
|
* Jan 15, 2010 3395 ryu Fix "issued by" functionality
|
||||||
* Sep 05, 2013 2329 randerso Removed save of combinations file
|
* Sep 05, 2013 2329 randerso Removed save of combinations file
|
||||||
|
* Feb 12, 2014 2591 randerso Passed dataMgr instance to FormatterUtil.runFormatterScript
|
||||||
|
* Removed call to TextProductManager.reloadModule
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -59,6 +60,9 @@ public class FormatterUtil {
|
||||||
/**
|
/**
|
||||||
* Runs a text formatter script for a given product
|
* Runs a text formatter script for a given product
|
||||||
*
|
*
|
||||||
|
* @param dataMgr
|
||||||
|
* the DataManager instance to use
|
||||||
|
*
|
||||||
* @param productMgr
|
* @param productMgr
|
||||||
* the formatter instance to use
|
* the formatter instance to use
|
||||||
* @param productName
|
* @param productName
|
||||||
|
@ -70,22 +74,12 @@ public class FormatterUtil {
|
||||||
* @param finish
|
* @param finish
|
||||||
* listener to fire when formatter finishes generating product
|
* listener to fire when formatter finishes generating product
|
||||||
*/
|
*/
|
||||||
public static void runFormatterScript(TextProductManager productMgr,
|
public static void runFormatterScript(DataManager dataMgr,
|
||||||
String productName, String dbId, String vtecMode,
|
TextProductManager productMgr, String productName, String dbId,
|
||||||
TextProductFinishListener finish) {
|
String vtecMode, TextProductFinishListener finish) {
|
||||||
try {
|
|
||||||
String filename = productMgr.getCombinationsFileName(productName);
|
|
||||||
boolean mapRequired = productMgr.mapRequired(productName);
|
|
||||||
if (filename != null && mapRequired) {
|
|
||||||
productMgr.reloadModule(filename);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
statusHandler.handle(Priority.PROBLEM,
|
|
||||||
"Cannot generate combinations file", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
int testMode = 0;
|
int testMode = 0;
|
||||||
if (DataManager.getCurrentInstance().getOpMode().equals(CAVEMode.TEST)) {
|
if (dataMgr.getOpMode().equals(CAVEMode.TEST)) {
|
||||||
testMode = 1;
|
testMode = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,8 +100,7 @@ public class FormatterUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
String name = productMgr.getModuleName(productName);
|
String name = productMgr.getModuleName(productName);
|
||||||
String varDict = productMgr.getVarDict(productName,
|
String varDict = productMgr.getVarDict(productName, dataMgr, dbId);
|
||||||
DataManager.getCurrentInstance(), dbId);
|
|
||||||
|
|
||||||
if (varDict != null) {
|
if (varDict != null) {
|
||||||
// run the formatter with the normal active table
|
// run the formatter with the normal active table
|
||||||
|
|
|
@ -55,9 +55,10 @@ import com.raytheon.viz.gfe.core.DataManager;
|
||||||
* SOFTWARE HISTORY
|
* SOFTWARE HISTORY
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* May 1, 2009 njensen Initial creation
|
* May 1, 2009 njensen Initial creation
|
||||||
* Jan 15, 2010 3395 ryu Fix "issued by" functionality
|
* Jan 15, 2010 3395 ryu Fix "issued by" functionality
|
||||||
* Apr 24, 2013 1936 dgilling Remove unused imports.
|
* Apr 24, 2013 1936 dgilling Remove unused imports.
|
||||||
|
* Feb 12, 2014 2591 randerso Removed reloadModule method
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -269,17 +270,6 @@ public class TextProductManager {
|
||||||
return mapName;
|
return mapName;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void reloadModule(String moduleName) {
|
|
||||||
Map<String, Object> args = new HashMap<String, Object>(1);
|
|
||||||
args.put("moduleName", moduleName);
|
|
||||||
try {
|
|
||||||
script.execute("reloadModule", args);
|
|
||||||
} catch (JepException e) {
|
|
||||||
statusHandler.handle(Priority.PROBLEM,
|
|
||||||
"Exception reloading module " + moduleName, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setIssuedBy(String issuedBy) {
|
public void setIssuedBy(String issuedBy) {
|
||||||
if (LocalizationManager.getInstance().getCurrentSite().equals(issuedBy)) {
|
if (LocalizationManager.getInstance().getCurrentSite().equals(issuedBy)) {
|
||||||
this.issuedBy = "";
|
this.issuedBy = "";
|
||||||
|
|
|
@ -40,6 +40,7 @@ import com.raytheon.viz.grid.util.RadarProductCodeMapping;
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Sep 20, 2012 bsteffen Initial creation
|
* Sep 20, 2012 bsteffen Initial creation
|
||||||
* Aug 30, 2013 2298 rjpeter Make getPluginName abstract
|
* Aug 30, 2013 2298 rjpeter Make getPluginName abstract
|
||||||
|
* Feb 21, 2014 DR 16744 D. Friedman Support thin client updates
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -150,10 +151,14 @@ public class RadarUpdater implements IAlertObserver {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void alertArrived(Collection<AlertMessage> alertMessages) {
|
public void alertArrived(Collection<AlertMessage> alertMessages) {
|
||||||
|
ProductAlertObserver.processDataURIAlerts(convertRadarAlertsToGridDatauris(alertMessages));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<String> convertRadarAlertsToGridDatauris(Collection<AlertMessage> alertMessages) {
|
||||||
RadarStation configuredRadar = RadarAdapter.getInstance()
|
RadarStation configuredRadar = RadarAdapter.getInstance()
|
||||||
.getConfiguredRadar();
|
.getConfiguredRadar();
|
||||||
if (configuredRadar == null) {
|
if (configuredRadar == null) {
|
||||||
return;
|
return new HashSet<String>();
|
||||||
}
|
}
|
||||||
Set<String> datauris = new HashSet<String>();
|
Set<String> datauris = new HashSet<String>();
|
||||||
for (AlertMessage alertMessage : alertMessages) {
|
for (AlertMessage alertMessage : alertMessages) {
|
||||||
|
@ -209,7 +214,7 @@ public class RadarUpdater implements IAlertObserver {
|
||||||
"Unable to generate updates for derived product", e);
|
"Unable to generate updates for derived product", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ProductAlertObserver.processDataURIAlerts(datauris);
|
return datauris;
|
||||||
}
|
}
|
||||||
|
|
||||||
private CacheKey getCacheKey(RadarRequestableLevelNode rNode) {
|
private CacheKey getCacheKey(RadarRequestableLevelNode rNode) {
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
package com.raytheon.viz.grid.util;
|
package com.raytheon.viz.grid.util;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -81,6 +82,7 @@ import com.raytheon.viz.radar.util.StationUtils;
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Mar 23, 2010 #4473 rjpeter Initial creation
|
* Mar 23, 2010 #4473 rjpeter Initial creation
|
||||||
|
* Feb 21, 2014 DR 16744 D. Friedman Add getUpdateConstraints
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -400,4 +402,23 @@ public class RadarAdapter {
|
||||||
|
|
||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Map<String, RequestConstraint> getUpdateConstraints() {
|
||||||
|
RadarProductCodeMapping rpcMap = RadarProductCodeMapping.getInstance();
|
||||||
|
HashSet<Integer> productCodes = new HashSet<Integer>();
|
||||||
|
for (String abbrev : rpcMap.getParameterAbbrevs()) {
|
||||||
|
productCodes.addAll(rpcMap.getProductCodesForAbbrev(abbrev));
|
||||||
|
}
|
||||||
|
Map<String, RequestConstraint> rcMap = new HashMap<String, RequestConstraint>();
|
||||||
|
rcMap.put(RadarAdapter.PLUGIN_NAME_QUERY, new RequestConstraint(
|
||||||
|
RADAR_SOURCE));
|
||||||
|
rcMap.put(ICAO_QUERY, new RequestConstraint(getConfiguredRadar()
|
||||||
|
.getRdaId().toLowerCase()));
|
||||||
|
rcMap.put(
|
||||||
|
PRODUCT_CODE_QUERY,
|
||||||
|
new RequestConstraint(Arrays.toString(new ArrayList<Integer>(
|
||||||
|
productCodes).toArray()),
|
||||||
|
RequestConstraint.ConstraintType.IN));
|
||||||
|
return rcMap;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -178,7 +178,7 @@
|
||||||
</appender>
|
</appender>
|
||||||
|
|
||||||
<appender name="ThreadBasedLog" class="com.raytheon.uf.common.status.logback.ThreadBasedAppender">
|
<appender name="ThreadBasedLog" class="com.raytheon.uf.common.status.logback.ThreadBasedAppender">
|
||||||
<threadPatterns>RadarLog:radarThreadPool.*;SatelliteLog:satelliteThreadPool.*;ShefLog:shefThreadPool.*;TextLog:textThreadPool.*;SmartInitLog:smartInit.*;PurgeLog:Purge.*;ArchiveLog:Archive.*</threadPatterns>
|
<threadPatterns>RadarLog:Ingest.Radar.*;SatelliteLog:Ingest.Satellite.*;ShefLog:Ingest.Shef.*;TextLog:Ingest.Text.*;SmartInitLog:smartInit.*;PurgeLog:Purge.*;ArchiveLog:Archive.*</threadPatterns>
|
||||||
<defaultAppender>asyncConsole</defaultAppender>
|
<defaultAppender>asyncConsole</defaultAppender>
|
||||||
<appender-ref ref="asyncConsole"/>
|
<appender-ref ref="asyncConsole"/>
|
||||||
<appender-ref ref="RadarLog"/>
|
<appender-ref ref="RadarLog"/>
|
||||||
|
|
|
@ -90,11 +90,10 @@
|
||||||
</appender>
|
</appender>
|
||||||
|
|
||||||
<appender name="ThreadBasedLog" class="com.raytheon.uf.common.status.logback.ThreadBasedAppender">
|
<appender name="ThreadBasedLog" class="com.raytheon.uf.common.status.logback.ThreadBasedAppender">
|
||||||
<threadPatterns>HarvesterLog:harvesterThreadPool.*,crawlerThreadPool.*,Crawler.*,RetrievalLog:retrievalThreadPool.*,retrievalThreadPool.*,Retrieval.*</threadPatterns>
|
<threadPatterns>HarvesterLog:harvester.*,crawlerThreadPool.*,Crawler.*</threadPatterns>
|
||||||
<defaultAppender>console</defaultAppender>
|
<defaultAppender>console</defaultAppender>
|
||||||
<appender-ref ref="console"/>
|
<appender-ref ref="console"/>
|
||||||
<appender-ref ref="HarvesterLog"/>
|
<appender-ref ref="HarvesterLog"/>
|
||||||
<appender-ref ref="RetrievalLog"/>
|
|
||||||
</appender>
|
</appender>
|
||||||
|
|
||||||
<logger name="com.raytheon">
|
<logger name="com.raytheon">
|
||||||
|
|
|
@ -87,6 +87,7 @@
|
||||||
<exclude>.*datadelivery.*</exclude>
|
<exclude>.*datadelivery.*</exclude>
|
||||||
<exclude>.*bandwidth.*</exclude>
|
<exclude>.*bandwidth.*</exclude>
|
||||||
<includeMode>excludeDpaAndOgc</includeMode>
|
<includeMode>excludeDpaAndOgc</includeMode>
|
||||||
|
<exclude>obs-ingest-metarshef.xml</exclude>
|
||||||
<!-- ncep excludes until tested -->
|
<!-- ncep excludes until tested -->
|
||||||
<exclude>aww-ingest.xml</exclude>
|
<exclude>aww-ingest.xml</exclude>
|
||||||
<exclude>ncep-util-on-edex-ingest</exclude>
|
<exclude>ncep-util-on-edex-ingest</exclude>
|
||||||
|
@ -117,10 +118,12 @@
|
||||||
<include>shef-ingest.xml</include>
|
<include>shef-ingest.xml</include>
|
||||||
<include>persist-ingest.xml</include>
|
<include>persist-ingest.xml</include>
|
||||||
<include>obs-common.xml</include>
|
<include>obs-common.xml</include>
|
||||||
<include>obs-ingest.xml</include>
|
<include>obs-ingest.xml</include>
|
||||||
<include>metartohmdb-plugin.xml</include>
|
<include>obs-ingest-metarshef.xml</include>
|
||||||
<include>pointdata-common.xml</include>
|
<include>metartohmdb-plugin.xml</include>
|
||||||
|
<include>pointdata-common.xml</include>
|
||||||
<include>shef-common.xml</include>
|
<include>shef-common.xml</include>
|
||||||
|
<include>ohd-common-database.xml</include>
|
||||||
<include>ohd-common.xml</include>
|
<include>ohd-common.xml</include>
|
||||||
<include>alarmWhfs-spring.xml</include>
|
<include>alarmWhfs-spring.xml</include>
|
||||||
<include>arealffgGenerator-spring.xml</include>
|
<include>arealffgGenerator-spring.xml</include>
|
||||||
|
@ -145,6 +148,7 @@
|
||||||
<exclude>fssobs-common.xml</exclude>
|
<exclude>fssobs-common.xml</exclude>
|
||||||
</mode>
|
</mode>
|
||||||
<mode name="requestHydro">
|
<mode name="requestHydro">
|
||||||
|
<include>ohd-common-database.xml</include>
|
||||||
<include>ohd-common.xml</include>
|
<include>ohd-common.xml</include>
|
||||||
<include>database-common.xml</include>
|
<include>database-common.xml</include>
|
||||||
<include>ohd-request.xml</include>
|
<include>ohd-request.xml</include>
|
||||||
|
@ -227,6 +231,7 @@
|
||||||
<include>shef-common.xml</include>
|
<include>shef-common.xml</include>
|
||||||
<include>satellite-common.xml</include>
|
<include>satellite-common.xml</include>
|
||||||
<include>satellite-dataplugin-common.xml</include>
|
<include>satellite-dataplugin-common.xml</include>
|
||||||
|
<include>ohd-common-database.xml</include>
|
||||||
<include>ohd-common.xml</include>
|
<include>ohd-common.xml</include>
|
||||||
<include>management-common.xml</include>
|
<include>management-common.xml</include>
|
||||||
<include>auth-common.xml</include>
|
<include>auth-common.xml</include>
|
||||||
|
|
|
@ -27,17 +27,17 @@
|
||||||
|
|
||||||
<bean id="genericThreadPool"
|
<bean id="genericThreadPool"
|
||||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
||||||
<property name="corePoolSize" value="${JMS_POOL_MIN}" />
|
<property name="corePoolSize" value="0" />
|
||||||
<property name="maxPoolSize" value="${JMS_POOL_MAX}" />
|
<property name="maxPoolSize" value="1" />
|
||||||
<property name="queueCapacity" value="0" />
|
<property name="queueCapacity" value="0" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="jms-generic" class="org.apache.camel.component.jms.JmsComponent">
|
<bean id="jms-generic" class="com.raytheon.uf.edex.esb.camel.jms.DedicatedThreadJmsComponent">
|
||||||
<constructor-arg ref="jmsGenericConfig" />
|
<constructor-arg ref="jmsGenericConfig" />
|
||||||
<property name="taskExecutor" ref="genericThreadPool" />
|
<property name="taskExecutor" ref="genericThreadPool" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="jms-durable" class="org.apache.camel.component.jms.JmsComponent">
|
<bean id="jms-durable" class="com.raytheon.uf.edex.esb.camel.jms.DedicatedThreadJmsComponent">
|
||||||
<constructor-arg ref="jmsDurableConfig" />
|
<constructor-arg ref="jmsDurableConfig" />
|
||||||
<property name="taskExecutor" ref="genericThreadPool" />
|
<property name="taskExecutor" ref="genericThreadPool" />
|
||||||
</bean>
|
</bean>
|
||||||
|
@ -63,13 +63,13 @@
|
||||||
|
|
||||||
<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
|
<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
|
||||||
<property name="cacheLevelName" value="CACHE_NONE"/>
|
<property name="cacheLevelName" value="CACHE_NONE"/>
|
||||||
<property name="recoveryInterval" value="1000"/>
|
<property name="recoveryInterval" value="10000"/>
|
||||||
<property name="requestTimeout" value="5000"/>
|
<property name="requestTimeout" value="5000"/>
|
||||||
|
|
||||||
<!-- receiveTimeout is amount of time thread waits to receive a message before recycling -->
|
<!-- receiveTimeout is amount of time thread waits to receive a message before recycling -->
|
||||||
<!-- receiveTimeout also affects how fast a JMSConsumer will shut down, because the
|
<!-- receiveTimeout also affects how fast a JMSConsumer will shut down, because the
|
||||||
thread may be stuck polling for the duration of receiveTimeout before shutting down -->
|
thread may be stuck polling for the duration of receiveTimeout before shutting down -->
|
||||||
<property name="receiveTimeout" value="10000"/>
|
<property name="receiveTimeout" value="10000"/>
|
||||||
<property name="transacted" value="false"/>
|
<property name="transacted" value="false"/>
|
||||||
|
|
||||||
<!-- force maxMessagesPerTask so that the threads don't keep disconnecting and reconnecting.
|
<!-- force maxMessagesPerTask so that the threads don't keep disconnecting and reconnecting.
|
||||||
|
@ -80,6 +80,7 @@
|
||||||
<property name="destinationResolver" ref="qpidNoDurableResolver" />
|
<property name="destinationResolver" ref="qpidNoDurableResolver" />
|
||||||
<property name="disableReplyTo" value="true" />
|
<property name="disableReplyTo" value="true" />
|
||||||
<property name="deliveryPersistent" value="false"/>
|
<property name="deliveryPersistent" value="false"/>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
<property name="transacted" value="true" />
|
<property name="transacted" value="true" />
|
||||||
<property name="acknowledgementModeName" value="TRANSACTED"/>
|
<property name="acknowledgementModeName" value="TRANSACTED"/>
|
||||||
|
@ -240,7 +241,7 @@
|
||||||
**
|
**
|
||||||
** http://camel.apache.org/enterprise-integration-patterns.html
|
** http://camel.apache.org/enterprise-integration-patterns.html
|
||||||
-->
|
-->
|
||||||
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring" errorHandlerRef="errorHandler">
|
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring" errorHandlerRef="errorHandler">
|
||||||
|
|
||||||
<!-- Route for edex to listen for utility updates -->
|
<!-- Route for edex to listen for utility updates -->
|
||||||
<route id="edexUtilityNotify">
|
<route id="edexUtilityNotify">
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
<bean id="binlightningDistRegistry" factory-bean="distributionSrv"
|
<bean id="binlightningDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="binlightning" />
|
<constructor-arg value="binlightning" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.binlightning" />
|
<constructor-arg value="jms-durable:queue:Ingest.binlightning" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="binlightningCamelRegistered" factory-bean="clusteredCamelContextMgr"
|
<bean id="binlightningCamelRegistered" factory-bean="clusteredCamelContextMgr"
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
<bean id="bufrmosDistRegistry" factory-bean="distributionSrv"
|
<bean id="bufrmosDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="bufrmos" />
|
<constructor-arg value="bufrmos" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.bufrmos" />
|
<constructor-arg value="jms-durable:queue:Ingest.bufrmos" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="bufrmosCamelRegistered" factory-bean="contextManager"
|
<bean id="bufrmosCamelRegistered" factory-bean="contextManager"
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
<bean id="bufruaDistRegistry" factory-bean="distributionSrv"
|
<bean id="bufruaDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg ref="bufruaPluginName" />
|
<constructor-arg ref="bufruaPluginName" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.bufrua" />
|
<constructor-arg value="jms-durable:queue:Ingest.bufrua" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="bufruaCamelRegistered" factory-bean="contextManager"
|
<bean id="bufruaCamelRegistered" factory-bean="contextManager"
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
<bean id="ccfpDistRegistry" factory-bean="distributionSrv"
|
<bean id="ccfpDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="ccfp" />
|
<constructor-arg value="ccfp" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.ccfp" />
|
<constructor-arg value="jms-durable:queue:Ingest.ccfp" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="ccfpCamelRegistered" factory-bean="contextManager"
|
<bean id="ccfpCamelRegistered" factory-bean="contextManager"
|
||||||
|
|
|
@ -53,7 +53,7 @@
|
||||||
</route>
|
</route>
|
||||||
|
|
||||||
<route id="notifyIfpServer">
|
<route id="notifyIfpServer">
|
||||||
<from uri="jms-generic:topic:edex.alerts.gfe"/>
|
<from uri="jms-generic:topic:edex.alerts.gfe?threadName=notifyIfpServer-edex.alerts.gfe" />
|
||||||
<doTry>
|
<doTry>
|
||||||
<bean ref="serializationUtil" method="transformFromThrift"/>
|
<bean ref="serializationUtil" method="transformFromThrift"/>
|
||||||
<bean ref="ifpServer" method="processNotification"/>
|
<bean ref="ifpServer" method="processNotification"/>
|
||||||
|
|
|
@ -346,19 +346,13 @@
|
||||||
<!-- ISC Send Beans -->
|
<!-- ISC Send Beans -->
|
||||||
|
|
||||||
<bean id="iscSendQueue" class="com.raytheon.edex.plugin.gfe.isc.IscSendQueue" factory-method="getInstance"/>
|
<bean id="iscSendQueue" class="com.raytheon.edex.plugin.gfe.isc.IscSendQueue" factory-method="getInstance"/>
|
||||||
<bean id="jms-iscsend" class="org.apache.camel.component.jms.JmsComponent">
|
|
||||||
<constructor-arg ref="jmsIscSendConfig"/>
|
|
||||||
<property name="taskExecutor" ref="iscSendThreadPool"/>
|
|
||||||
</bean>
|
|
||||||
<bean id="jmsIscSendConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
|
||||||
factory-bean="jmsDurableConfig" factory-method="copy"/>
|
|
||||||
<bean id="iscSendThreadPool" class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
<bean id="iscSendThreadPool" class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
||||||
<property name="corePoolSize" value="2"/>
|
<property name="corePoolSize" value="1" />
|
||||||
<property name="maxPoolSize" value="2"/>
|
<property name="maxPoolSize" value="1" />
|
||||||
</bean>
|
</bean>
|
||||||
<bean id="iscSendSrvCfg" class="com.raytheon.edex.plugin.gfe.isc.SendIscSrvConfig">
|
<bean id="iscSendSrvCfg" class="com.raytheon.edex.plugin.gfe.isc.SendIscSrvConfig">
|
||||||
<property name="executor" ref="iscSendThreadPool"/>
|
<property name="executor" ref="iscSendThreadPool"/>
|
||||||
<!-- Threads should be 1 less than the size of the pool to account for the iscSendJobQueueAggr route. -->
|
<!-- Threads should be same size as the iscSendThreadPool -->
|
||||||
<property name="threads" value="1"/>
|
<property name="threads" value="1"/>
|
||||||
<property name="runningTimeOutMillis" value="300000"/>
|
<property name="runningTimeOutMillis" value="300000"/>
|
||||||
<property name="threadSleepInterval" value="5000"/>
|
<property name="threadSleepInterval" value="5000"/>
|
||||||
|
@ -370,16 +364,6 @@
|
||||||
|
|
||||||
<!-- ISC Receive Beans -->
|
<!-- ISC Receive Beans -->
|
||||||
|
|
||||||
<bean id="jms-iscrec" class="org.apache.camel.component.jms.JmsComponent">
|
|
||||||
<constructor-arg ref="jmsIscReceiveConfig"/>
|
|
||||||
<property name="taskExecutor" ref="iscReceiveThreadPool"/>
|
|
||||||
</bean>
|
|
||||||
<bean id="jmsIscReceiveConfig" class="org.apache.camel.component.jms.JmsConfiguration" factory-bean="jmsDurableConfig"
|
|
||||||
factory-method="copy"/>
|
|
||||||
<bean id="iscReceiveThreadPool" class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
|
||||||
<property name="corePoolSize" value="2"/>
|
|
||||||
<property name="maxPoolSize" value="2"/>
|
|
||||||
</bean>
|
|
||||||
<bean id="IscReceiveSrv" class="com.raytheon.edex.plugin.gfe.isc.IscReceiveSrv">
|
<bean id="IscReceiveSrv" class="com.raytheon.edex.plugin.gfe.isc.IscReceiveSrv">
|
||||||
<constructor-arg ref="iscDataRecPythonThreadPool"/>
|
<constructor-arg ref="iscDataRecPythonThreadPool"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
@ -455,7 +439,7 @@
|
||||||
</route>
|
</route>
|
||||||
|
|
||||||
<route id="gfeSiteActivationNotification">
|
<route id="gfeSiteActivationNotification">
|
||||||
<from uri="jms-generic:topic:edex.alerts.siteActivate"/>
|
<from uri="jms-generic:topic:edex.alerts.siteActivate?threadName=gfe-edex.alerts.siteActivate"/>
|
||||||
<bean ref="serializationUtil" method="transformFromThrift"/>
|
<bean ref="serializationUtil" method="transformFromThrift"/>
|
||||||
<bean ref="sbLockMgr" method="handleSiteActivationNotification"/>
|
<bean ref="sbLockMgr" method="handleSiteActivationNotification"/>
|
||||||
</route>
|
</route>
|
||||||
|
@ -494,8 +478,7 @@
|
||||||
|
|
||||||
<!-- ISC Data Receive route -->
|
<!-- ISC Data Receive route -->
|
||||||
<route id="iscReceiveRoute">
|
<route id="iscReceiveRoute">
|
||||||
<from
|
<from uri="jms-durable:queue:gfeIscDataReceive?concurrentConsumers=2"/>
|
||||||
uri="jms-iscrec:queue:gfeIscDataReceive?concurrentConsumers=2"/>
|
|
||||||
<doTry>
|
<doTry>
|
||||||
<pipeline>
|
<pipeline>
|
||||||
<bean ref="serializationUtil" method="transformFromThrift"/>
|
<bean ref="serializationUtil" method="transformFromThrift"/>
|
||||||
|
@ -503,8 +486,7 @@
|
||||||
</pipeline>
|
</pipeline>
|
||||||
<doCatch>
|
<doCatch>
|
||||||
<exception>java.lang.Throwable</exception>
|
<exception>java.lang.Throwable</exception>
|
||||||
<to
|
<to uri="log:iscDataRec?level=ERROR"/>
|
||||||
uri="log:iscDataRec?level=ERROR"/>
|
|
||||||
</doCatch>
|
</doCatch>
|
||||||
</doTry>
|
</doTry>
|
||||||
</route>
|
</route>
|
||||||
|
@ -515,7 +497,7 @@
|
||||||
autoStartup="false">
|
autoStartup="false">
|
||||||
|
|
||||||
<route id="iscSendJobQueueAggr">
|
<route id="iscSendJobQueueAggr">
|
||||||
<from uri="jms-iscsend:queue:iscSendNotification"/>
|
<from uri="jms-durable:queue:iscSendNotification" />
|
||||||
<doTry>
|
<doTry>
|
||||||
<bean ref="serializationUtil" method="transformFromThrift"/>
|
<bean ref="serializationUtil" method="transformFromThrift"/>
|
||||||
<bean ref="iscSendQueue" method="addSendJobs"/>
|
<bean ref="iscSendQueue" method="addSendJobs"/>
|
||||||
|
|
|
@ -4,15 +4,9 @@
|
||||||
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
|
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
|
||||||
|
|
||||||
<bean id="smartInitQueue" class="com.raytheon.edex.plugin.gfe.smartinit.SmartInitQueue" factory-method="createQueue"/>
|
<bean id="smartInitQueue" class="com.raytheon.edex.plugin.gfe.smartinit.SmartInitQueue" factory-method="createQueue"/>
|
||||||
<bean id="jms-smartinit" class="org.apache.camel.component.jms.JmsComponent">
|
|
||||||
<constructor-arg ref="jmsSmartInitConfig"/>
|
|
||||||
<property name="taskExecutor" ref="smartInitThreadPool"/>
|
|
||||||
</bean>
|
|
||||||
<bean id="jmsSmartInitConfig" class="org.apache.camel.component.jms.JmsConfiguration" factory-bean="jmsDurableConfig"
|
|
||||||
factory-method="copy"/>
|
|
||||||
<bean id="smartInitThreadPool" class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
<bean id="smartInitThreadPool" class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
||||||
<property name="corePoolSize" value="${smartinit.threadpoolsize}"/>
|
<property name="corePoolSize" value="${smartinit.threads}" />
|
||||||
<property name="maxPoolSize" value="${smartinit.threadpoolsize}"/>
|
<property name="maxPoolSize" value="${smartinit.threads}" />
|
||||||
</bean>
|
</bean>
|
||||||
<bean id="smartInitSrvCfg" class="com.raytheon.edex.plugin.gfe.smartinit.SmartInitSrvConfig">
|
<bean id="smartInitSrvCfg" class="com.raytheon.edex.plugin.gfe.smartinit.SmartInitSrvConfig">
|
||||||
<property name="executor" ref="smartInitThreadPool"/>
|
<property name="executor" ref="smartInitThreadPool"/>
|
||||||
|
@ -114,7 +108,7 @@
|
||||||
<!-- Smart Init Routes -->
|
<!-- Smart Init Routes -->
|
||||||
<!-- main route now handled through the gfeIngestNotification -->
|
<!-- main route now handled through the gfeIngestNotification -->
|
||||||
<route id="manualSmartInit">
|
<route id="manualSmartInit">
|
||||||
<from uri="jms-smartinit:queue:manualSmartInit"/>
|
<from uri="jms-durable:queue:manualSmartInit?threadName=smartInitManual" />
|
||||||
<doTry>
|
<doTry>
|
||||||
<bean ref="smartInitQueue" method="addManualInit"/>
|
<bean ref="smartInitQueue" method="addManualInit"/>
|
||||||
<doCatch>
|
<doCatch>
|
||||||
|
@ -126,7 +120,7 @@
|
||||||
</route>
|
</route>
|
||||||
|
|
||||||
<route id="gfeVtecChangeNotification">
|
<route id="gfeVtecChangeNotification">
|
||||||
<from uri="jms-generic:topic:edex.alerts.vtec"/>
|
<from uri="jms-generic:topic:edex.alerts.vtec?threadName=gfe-edex.alerts.vtec"/>
|
||||||
<doTry>
|
<doTry>
|
||||||
<bean ref="serializationUtil" method="transformFromThrift"/>
|
<bean ref="serializationUtil" method="transformFromThrift"/>
|
||||||
<bean ref="vtecChangeListener" method="handleNotification"/>
|
<bean ref="vtecChangeListener" method="handleNotification"/>
|
||||||
|
@ -138,7 +132,6 @@
|
||||||
</doTry>
|
</doTry>
|
||||||
</route>
|
</route>
|
||||||
|
|
||||||
<!-- Convert the topic into a queue so only one consumer gets each message and we still have competing consumers. -->
|
|
||||||
</camelContext>
|
</camelContext>
|
||||||
|
|
||||||
<bean factory-bean="clusteredCamelContextMgr" factory-method="register">
|
<bean factory-bean="clusteredCamelContextMgr" factory-method="register">
|
||||||
|
|
|
@ -59,9 +59,10 @@ import com.raytheon.uf.edex.database.dao.DaoConfig;
|
||||||
*
|
*
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Oct 20, 2011 dgilling Initial creation
|
* Oct 20, 2011 dgilling Initial creation
|
||||||
* May 08, 2012 #600 dgilling Re-work logic for handling PENDING
|
* May 08, 2012 600 dgilling Re-work logic for handling PENDING
|
||||||
* records.
|
* records.
|
||||||
|
* Feb 07, 2014 2357 rjpeter iscSendNotification uri.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -74,9 +75,9 @@ public class IscSendQueue {
|
||||||
// how we'll organize the temporary queue
|
// how we'll organize the temporary queue
|
||||||
private class JobSetQueueKey {
|
private class JobSetQueueKey {
|
||||||
|
|
||||||
private ParmID pid;
|
private final ParmID pid;
|
||||||
|
|
||||||
private IscSendState state;
|
private final IscSendState state;
|
||||||
|
|
||||||
public JobSetQueueKey(ParmID pid, IscSendState state) {
|
public JobSetQueueKey(ParmID pid, IscSendState state) {
|
||||||
this.pid = pid;
|
this.pid = pid;
|
||||||
|
@ -92,8 +93,9 @@ public class IscSendQueue {
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
final int prime = 31;
|
final int prime = 31;
|
||||||
int result = 1;
|
int result = 1;
|
||||||
result = prime * result + ((pid == null) ? 0 : pid.hashCode());
|
result = (prime * result) + ((pid == null) ? 0 : pid.hashCode());
|
||||||
result = prime * result + ((state == null) ? 0 : state.hashCode());
|
result = (prime * result)
|
||||||
|
+ ((state == null) ? 0 : state.hashCode());
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,7 +150,7 @@ public class IscSendQueue {
|
||||||
|
|
||||||
private int timeoutMillis = 60000;
|
private int timeoutMillis = 60000;
|
||||||
|
|
||||||
private Map<JobSetQueueKey, List<IscSendRecord>> jobSet = new HashMap<JobSetQueueKey, List<IscSendRecord>>();
|
private final Map<JobSetQueueKey, List<IscSendRecord>> jobSet = new HashMap<JobSetQueueKey, List<IscSendRecord>>();
|
||||||
|
|
||||||
private static final IscSendQueue instance = new IscSendQueue();
|
private static final IscSendQueue instance = new IscSendQueue();
|
||||||
|
|
||||||
|
@ -168,7 +170,7 @@ public class IscSendQueue {
|
||||||
try {
|
try {
|
||||||
byte[] messages = SerializationUtil.transformToThrift(sendJobs);
|
byte[] messages = SerializationUtil.transformToThrift(sendJobs);
|
||||||
EDEXUtil.getMessageProducer().sendAsyncUri(
|
EDEXUtil.getMessageProducer().sendAsyncUri(
|
||||||
"jms-iscsend:queue:iscSendNotification", messages);
|
"jms-durable:queue:iscSendNotification", messages);
|
||||||
} catch (SerializationException e) {
|
} catch (SerializationException e) {
|
||||||
handler.error("Unable to serialize IscSendRecords.", e);
|
handler.error("Unable to serialize IscSendRecords.", e);
|
||||||
} catch (EdexException e) {
|
} catch (EdexException e) {
|
||||||
|
@ -238,7 +240,7 @@ public class IscSendQueue {
|
||||||
|
|
||||||
// Now combine time ranges if we can
|
// Now combine time ranges if we can
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (i <= pending.size() - 2) {
|
while (i <= (pending.size() - 2)) {
|
||||||
TimeRange time = pending.get(i).getTimeRange();
|
TimeRange time = pending.get(i).getTimeRange();
|
||||||
TimeRange time1 = pending.get(i + 1).getTimeRange();
|
TimeRange time1 = pending.get(i + 1).getTimeRange();
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
<bean id="goessoundingDistRegistry" factory-bean="distributionSrv"
|
<bean id="goessoundingDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg ref="goessoundingPluginName" />
|
<constructor-arg ref="goessoundingPluginName" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.goessounding"/>
|
<constructor-arg value="jms-durable:queue:Ingest.goessounding"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="goessoundingCamelRegistered" factory-bean="contextManager"
|
<bean id="goessoundingCamelRegistered" factory-bean="contextManager"
|
||||||
|
|
|
@ -5,20 +5,6 @@
|
||||||
|
|
||||||
<bean id="gribDecoder" class="com.raytheon.edex.plugin.grib.GribDecoder" />
|
<bean id="gribDecoder" class="com.raytheon.edex.plugin.grib.GribDecoder" />
|
||||||
|
|
||||||
<bean id="ingest-grib" class="org.apache.camel.component.jms.JmsComponent">
|
|
||||||
<constructor-arg ref="jmsGribConfig" />
|
|
||||||
<property name="taskExecutor" ref="gribThreadPool" />
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<bean id="jmsGribConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
|
||||||
factory-bean="jmsDurableConfig" factory-method="copy"/>
|
|
||||||
|
|
||||||
<bean id="gribThreadPool"
|
|
||||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
|
||||||
<property name="corePoolSize" value="${grib-decode.count.threads}" />
|
|
||||||
<property name="maxPoolSize" value="${grib-decode.count.threads}" />
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<bean id="gribGridPointLock" class="com.raytheon.edex.plugin.grib.GribGridPointLock">
|
<bean id="gribGridPointLock" class="com.raytheon.edex.plugin.grib.GribGridPointLock">
|
||||||
<constructor-arg value="${grib-decode.count.gridpoints}"/>
|
<constructor-arg value="${grib-decode.count.gridpoints}"/>
|
||||||
<constructor-arg value="${grib-decode.count.threads}"/>
|
<constructor-arg value="${grib-decode.count.threads}"/>
|
||||||
|
@ -53,7 +39,7 @@
|
||||||
autoStartup="false">
|
autoStartup="false">
|
||||||
|
|
||||||
<endpoint id="gribSplitJmsEndpoint" uri="jms-durable:queue:Ingest.GribSplit?concurrentConsumers=${grib-split.count.threads}"/>
|
<endpoint id="gribSplitJmsEndpoint" uri="jms-durable:queue:Ingest.GribSplit?concurrentConsumers=${grib-split.count.threads}"/>
|
||||||
<endpoint id="gribDecodeJmsEndpoint" uri="ingest-grib:queue:Ingest.GribDecode?concurrentConsumers=${grib-decode.count.threads}"/>
|
<endpoint id="gribDecodeJmsEndpoint" uri="jms-durable:queue:Ingest.GribDecode?concurrentConsumers=${grib-decode.count.threads}"/>
|
||||||
|
|
||||||
<!-- Begin Grib Decode Route -->
|
<!-- Begin Grib Decode Route -->
|
||||||
<route id="gribSplitIngestRoute">
|
<route id="gribSplitIngestRoute">
|
||||||
|
@ -66,7 +52,7 @@
|
||||||
<bean ref="stringToFile" />
|
<bean ref="stringToFile" />
|
||||||
<!-- strategyRef is needed because of camel bug https://issues.apache.org/activemq/browse/CAMEL-3333,
|
<!-- strategyRef is needed because of camel bug https://issues.apache.org/activemq/browse/CAMEL-3333,
|
||||||
without the strategy it uses the original message in the multicast and it loses the largeFileLock header -->
|
without the strategy it uses the original message in the multicast and it loses the largeFileLock header -->
|
||||||
<split strategyRef="useLatestAggregationStrategy">
|
<split strategyRef="useLatestAggregationStrategy" streaming="true">
|
||||||
<method bean="gribSplitter" method="split" />
|
<method bean="gribSplitter" method="split" />
|
||||||
<to uri="jms-durable:queue:Ingest.GribDecode" />
|
<to uri="jms-durable:queue:Ingest.GribDecode" />
|
||||||
</split>
|
</split>
|
||||||
|
@ -97,6 +83,5 @@
|
||||||
</doFinally>
|
</doFinally>
|
||||||
</doTry>
|
</doTry>
|
||||||
</route>
|
</route>
|
||||||
|
|
||||||
</camelContext>
|
</camelContext>
|
||||||
</beans>
|
</beans>
|
||||||
|
|
|
@ -4,6 +4,6 @@
|
||||||
<bean id="gribDistRegistry" factory-bean="distributionSrv"
|
<bean id="gribDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="grib" />
|
<constructor-arg value="grib" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.GribSplit" />
|
<constructor-arg value="jms-durable:queue:Ingest.GribSplit" />
|
||||||
</bean>
|
</bean>
|
||||||
</beans>
|
</beans>
|
|
@ -8,7 +8,7 @@
|
||||||
<bean id="ldadDistRegistry" factory-bean="distributionSrv"
|
<bean id="ldadDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="ldad" />
|
<constructor-arg value="ldad" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.ldad" />
|
<constructor-arg value="jms-durable:queue:Ingest.ldad" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<camelContext id="ldad-camel"
|
<camelContext id="ldad-camel"
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
<bean id="ldadhydroDistRegistry" factory-bean="distributionSrv"
|
<bean id="ldadhydroDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="ldadhydro" />
|
<constructor-arg value="ldadhydro" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.ldadhydro" />
|
<constructor-arg value="jms-durable:queue:Ingest.ldadhydro" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="ldadhydroPointData" class="com.raytheon.edex.plugin.ldadhydro.dao.LdadhydroPointDataTransform"/>
|
<bean id="ldadhydroPointData" class="com.raytheon.edex.plugin.ldadhydro.dao.LdadhydroPointDataTransform"/>
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
<bean id="ldadmanualDistRegistry" factory-bean="distributionSrv"
|
<bean id="ldadmanualDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="ldadmanual" />
|
<constructor-arg value="ldadmanual" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.ldadmanual"/>
|
<constructor-arg value="jms-durable:queue:Ingest.ldadmanual"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="ldadmanualCamelRegistered" factory-bean="contextManager"
|
<bean id="ldadmanualCamelRegistered" factory-bean="contextManager"
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
<bean id="ldadprofilerDistRegistry" factory-bean="distributionSrv"
|
<bean id="ldadprofilerDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="ldadprofiler" />
|
<constructor-arg value="ldadprofiler" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.ldadprofiler"/>
|
<constructor-arg value="jms-durable:queue:Ingest.ldadprofiler"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="ldadprofilerCamelRegistered" factory-bean="contextManager"
|
<bean id="ldadprofilerCamelRegistered" factory-bean="contextManager"
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
<beans
|
||||||
|
xmlns="http://www.springframework.org/schema/beans"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
|
||||||
|
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
|
||||||
|
|
||||||
|
<bean id="obsCamelRegistered" factory-bean="contextManager" factory-method="register"
|
||||||
|
depends-on="persistCamelRegistered,
|
||||||
|
shefCamelRegistered,
|
||||||
|
metarToHMDBCamelRegistered">
|
||||||
|
<constructor-arg ref="obs-camel" />
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<camelContext id="obs-camel" xmlns="http://camel.apache.org/schema/spring"
|
||||||
|
errorHandlerRef="errorHandler" autoStartup="false">
|
||||||
|
|
||||||
|
<!-- Begin METAR routes -->
|
||||||
|
<route id="metarIngestRoute">
|
||||||
|
<from uri="jms-durable:queue:Ingest.obs" />
|
||||||
|
<setHeader headerName="pluginName">
|
||||||
|
<constant>obs</constant>
|
||||||
|
</setHeader>
|
||||||
|
<doTry>
|
||||||
|
<pipeline>
|
||||||
|
<bean ref="stringToFile" />
|
||||||
|
<bean ref="obsDecoder" method="decode" />
|
||||||
|
<bean ref="dupElim" />
|
||||||
|
<bean ref="metarPointData" method="toPointData" />
|
||||||
|
<multicast>
|
||||||
|
<to uri="direct-vm:persistIndexAlert" />
|
||||||
|
<to uri="direct-vm:metarToShef" />
|
||||||
|
<to uri="direct-vm:metarToHMDB" />
|
||||||
|
</multicast>
|
||||||
|
</pipeline>
|
||||||
|
<doCatch>
|
||||||
|
<exception>java.lang.Throwable</exception>
|
||||||
|
<to uri="log:metar?level=ERROR" />
|
||||||
|
</doCatch>
|
||||||
|
</doTry>
|
||||||
|
</route>
|
||||||
|
</camelContext>
|
||||||
|
</beans>
|
|
@ -0,0 +1,41 @@
|
||||||
|
<beans
|
||||||
|
xmlns="http://www.springframework.org/schema/beans"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
|
||||||
|
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
|
||||||
|
|
||||||
|
<!-- This spring configuration is currently only used by the ingestHydro EDEX instance. -->
|
||||||
|
|
||||||
|
<bean id="obsCamelRegistered" factory-bean="contextManager" factory-method="register"
|
||||||
|
depends-on="shefCamelRegistered,
|
||||||
|
metarToHMDBCamelRegistered">
|
||||||
|
<constructor-arg ref="obs-camel" />
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<camelContext id="obs-camel" xmlns="http://camel.apache.org/schema/spring"
|
||||||
|
errorHandlerRef="errorHandler" autoStartup="false">
|
||||||
|
|
||||||
|
<!-- Begin METAR routes -->
|
||||||
|
<route id="metarIngestRoute">
|
||||||
|
<from uri="jms-durable:queue:Ingest.obs" />
|
||||||
|
<setHeader headerName="pluginName">
|
||||||
|
<constant>obs</constant>
|
||||||
|
</setHeader>
|
||||||
|
<doTry>
|
||||||
|
<pipeline>
|
||||||
|
<bean ref="stringToFile" />
|
||||||
|
<bean ref="obsDecoder" method="decode" />
|
||||||
|
<bean ref="metarPointData" method="toPointData" />
|
||||||
|
<multicast>
|
||||||
|
<to uri="direct-vm:metarToShef" />
|
||||||
|
<to uri="direct-vm:metarToHMDB" />
|
||||||
|
</multicast>
|
||||||
|
</pipeline>
|
||||||
|
<doCatch>
|
||||||
|
<exception>java.lang.Throwable</exception>
|
||||||
|
<to uri="log:metar?level=ERROR" />
|
||||||
|
</doCatch>
|
||||||
|
</doTry>
|
||||||
|
</route>
|
||||||
|
</camelContext>
|
||||||
|
</beans>
|
|
@ -3,7 +3,7 @@
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
|
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
|
||||||
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
|
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
|
||||||
|
|
||||||
<bean id="obsDecoder" class="com.raytheon.edex.plugin.obs.ObsDecoder" />
|
<bean id="obsDecoder" class="com.raytheon.edex.plugin.obs.ObsDecoder" />
|
||||||
|
|
||||||
<bean id="metarPointData" class="com.raytheon.edex.plugin.obs.metar.MetarPointDataTransform" />
|
<bean id="metarPointData" class="com.raytheon.edex.plugin.obs.metar.MetarPointDataTransform" />
|
||||||
|
@ -12,42 +12,7 @@
|
||||||
|
|
||||||
<bean id="obsDistRegistry" factory-bean="distributionSrv" factory-method="register">
|
<bean id="obsDistRegistry" factory-bean="distributionSrv" factory-method="register">
|
||||||
<constructor-arg value="obs" />
|
<constructor-arg value="obs" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.obs" />
|
<constructor-arg value="jms-durable:queue:Ingest.obs" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="obsCamelRegistered" factory-bean="contextManager" factory-method="register"
|
|
||||||
depends-on="persistCamelRegistered,
|
|
||||||
shefCamelRegistered,
|
|
||||||
metarToHMDBCamelRegistered">
|
|
||||||
<constructor-arg ref="obs-camel" />
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<camelContext id="obs-camel" xmlns="http://camel.apache.org/schema/spring"
|
|
||||||
errorHandlerRef="errorHandler" autoStartup="false">
|
|
||||||
|
|
||||||
<!-- Begin METAR routes -->
|
|
||||||
<route id="metarIngestRoute">
|
|
||||||
<from uri="jms-durable:queue:Ingest.obs" />
|
|
||||||
<setHeader headerName="pluginName">
|
|
||||||
<constant>obs</constant>
|
|
||||||
</setHeader>
|
|
||||||
<doTry>
|
|
||||||
<pipeline>
|
|
||||||
<bean ref="stringToFile" />
|
|
||||||
<bean ref="obsDecoder" method="decode" />
|
|
||||||
<bean ref="dupElim" />
|
|
||||||
<bean ref="metarPointData" method="toPointData" />
|
|
||||||
<multicast>
|
|
||||||
<to uri="direct-vm:persistIndexAlert" />
|
|
||||||
<to uri="direct-vm:metarToShef" />
|
|
||||||
<to uri="direct-vm:metarToHMDB" />
|
|
||||||
</multicast>
|
|
||||||
</pipeline>
|
|
||||||
<doCatch>
|
|
||||||
<exception>java.lang.Throwable</exception>
|
|
||||||
<to uri="log:metar?level=ERROR" />
|
|
||||||
</doCatch>
|
|
||||||
</doTry>
|
|
||||||
</route>
|
|
||||||
</camelContext>
|
|
||||||
</beans>
|
</beans>
|
|
@ -9,7 +9,7 @@
|
||||||
<bean id="poessoundingDistRegistry" factory-bean="distributionSrv"
|
<bean id="poessoundingDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg ref="poessoundingPluginName" />
|
<constructor-arg ref="poessoundingPluginName" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.poessounding"/>
|
<constructor-arg value="jms-durable:queue:Ingest.poessounding"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="poessoundingCamelRegistered" factory-bean="contextManager"
|
<bean id="poessoundingCamelRegistered" factory-bean="contextManager"
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
<bean id="profilerDistRegistry" factory-bean="distributionSrv"
|
<bean id="profilerDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg ref="profilerPluginName" />
|
<constructor-arg ref="profilerPluginName" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.profiler"/>
|
<constructor-arg value="jms-durable:queue:Ingest.profiler"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="profilerCamelRegistered" factory-bean="contextManager"
|
<bean id="profilerCamelRegistered" factory-bean="contextManager"
|
||||||
|
|
|
@ -5,28 +5,17 @@
|
||||||
|
|
||||||
<bean id="radarDecompressor" class="com.raytheon.edex.plugin.radar.RadarDecompressor"/>
|
<bean id="radarDecompressor" class="com.raytheon.edex.plugin.radar.RadarDecompressor"/>
|
||||||
<bean id="radarDecoder" class="com.raytheon.edex.plugin.radar.RadarDecoder"/>
|
<bean id="radarDecoder" class="com.raytheon.edex.plugin.radar.RadarDecoder"/>
|
||||||
<bean id="jms-radar" class="org.apache.camel.component.jms.JmsComponent">
|
|
||||||
<constructor-arg ref="jmsRadarConfig" />
|
|
||||||
<property name="taskExecutor" ref="radarThreadPool" />
|
|
||||||
</bean>
|
|
||||||
<bean id="jmsRadarConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
|
||||||
factory-bean="jmsDurableConfig" factory-method="copy"/>
|
|
||||||
<bean id="radarThreadPool"
|
|
||||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
|
||||||
<property name="corePoolSize" value="2" />
|
|
||||||
<property name="maxPoolSize" value="2" />
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<bean id="radarDistRegistry" factory-bean="distributionSrv"
|
<bean id="radarDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="radar" />
|
<constructor-arg value="radar" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.Radar" />
|
<constructor-arg value="jms-durable:queue:Ingest.Radar" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="radarRadarServerDistRegistry" factory-bean="radarserverDistributionSrv"
|
<bean id="radarRadarServerDistRegistry" factory-bean="radarserverDistributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="radar" />
|
<constructor-arg value="radar" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.RadarRadarServer" />
|
<constructor-arg value="jms-durable:queue:Ingest.RadarRadarServer" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="radarCamelRegistered" factory-bean="contextManager"
|
<bean id="radarCamelRegistered" factory-bean="contextManager"
|
||||||
|
@ -47,13 +36,13 @@
|
||||||
<setHeader headerName="pluginName">
|
<setHeader headerName="pluginName">
|
||||||
<constant>radar</constant>
|
<constant>radar</constant>
|
||||||
</setHeader>
|
</setHeader>
|
||||||
<to uri="jms-radar:queue:Ingest.Radar" />
|
<to uri="jms-durable:queue:Ingest.Radar" />
|
||||||
</route>
|
</route>
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<!-- Begin Radar routes -->
|
<!-- Begin Radar routes -->
|
||||||
<route id="radarIngestRoute">
|
<route id="radarIngestRoute">
|
||||||
<from uri="jms-radar:queue:Ingest.Radar"/>
|
<from uri="jms-durable:queue:Ingest.Radar"/>
|
||||||
<setHeader headerName="dataType">
|
<setHeader headerName="dataType">
|
||||||
<constant>radar-sbn</constant>
|
<constant>radar-sbn</constant>
|
||||||
</setHeader>
|
</setHeader>
|
||||||
|
@ -61,7 +50,7 @@
|
||||||
</route>
|
</route>
|
||||||
|
|
||||||
<route id="radarRadarServerIngestRoute">
|
<route id="radarRadarServerIngestRoute">
|
||||||
<from uri="jms-radar:queue:Ingest.RadarRadarServer"/>
|
<from uri="jms-durable:queue:Ingest.RadarRadarServer"/>
|
||||||
<setHeader headerName="dataType">
|
<setHeader headerName="dataType">
|
||||||
<constant>radar-local</constant>
|
<constant>radar-local</constant>
|
||||||
</setHeader>
|
</setHeader>
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
<bean id="reccoDistRegistry" factory-bean="distributionSrv"
|
<bean id="reccoDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg ref="reccoPluginName" />
|
<constructor-arg ref="reccoPluginName" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.recco" />
|
<constructor-arg value="jms-durable:queue:Ingest.recco" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="reccoCamelRegistered" factory-bean="contextManager"
|
<bean id="reccoCamelRegistered" factory-bean="contextManager"
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
<bean id="redbookDistRegistry" factory-bean="distributionSrv"
|
<bean id="redbookDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="redbook" />
|
<constructor-arg value="redbook" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.redbook"/>
|
<constructor-arg value="jms-durable:queue:Ingest.redbook"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
|
|
|
@ -3,18 +3,6 @@
|
||||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
|
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
|
||||||
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
|
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
|
||||||
|
|
||||||
<bean id="jms-satellite" class="org.apache.camel.component.jms.JmsComponent">
|
|
||||||
<constructor-arg ref="jmsSatelliteConfig" />
|
|
||||||
<property name="taskExecutor" ref="satelliteThreadPool" />
|
|
||||||
</bean>
|
|
||||||
<bean id="jmsSatelliteConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
|
||||||
factory-bean="jmsDurableConfig" factory-method="copy"/>
|
|
||||||
<bean id="satelliteThreadPool"
|
|
||||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
|
||||||
<property name="corePoolSize" value="1" />
|
|
||||||
<property name="maxPoolSize" value="1" />
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<bean id="satelliteDecoder" class="com.raytheon.edex.plugin.satellite.SatelliteDecoder">
|
<bean id="satelliteDecoder" class="com.raytheon.edex.plugin.satellite.SatelliteDecoder">
|
||||||
<property name="dao" ref="satelliteDao" />
|
<property name="dao" ref="satelliteDao" />
|
||||||
</bean>
|
</bean>
|
||||||
|
@ -26,7 +14,7 @@
|
||||||
<bean id="satDistRegistry" factory-bean="distributionSrv"
|
<bean id="satDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="satellite" />
|
<constructor-arg value="satellite" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.Satellite" />
|
<constructor-arg value="jms-durable:queue:Ingest.Satellite" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="satCamelRegistered" factory-bean="contextManager"
|
<bean id="satCamelRegistered" factory-bean="contextManager"
|
||||||
|
@ -53,7 +41,7 @@
|
||||||
|
|
||||||
<!-- Begin Sat routes -->
|
<!-- Begin Sat routes -->
|
||||||
<route id="satIngestRoute">
|
<route id="satIngestRoute">
|
||||||
<from uri="jms-satellite:queue:Ingest.Satellite"/>
|
<from uri="jms-durable:queue:Ingest.Satellite"/>
|
||||||
<setHeader headerName="pluginName">
|
<setHeader headerName="pluginName">
|
||||||
<constant>satellite</constant>
|
<constant>satellite</constant>
|
||||||
</setHeader>
|
</setHeader>
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
|
|
||||||
<bean id="sfcobsDistRegistry" factory-bean="distributionSrv" factory-method="register">
|
<bean id="sfcobsDistRegistry" factory-bean="distributionSrv" factory-method="register">
|
||||||
<constructor-arg value="sfcobs" />
|
<constructor-arg value="sfcobs" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.sfcobs" />
|
<constructor-arg value="jms-durable:queue:Ingest.sfcobs" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="sfcobsCamelRegistered" factory-bean="contextManager" factory-method="register"
|
<bean id="sfcobsCamelRegistered" factory-bean="contextManager" factory-method="register"
|
||||||
|
|
|
@ -3,18 +3,6 @@
|
||||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
|
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
|
||||||
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
|
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
|
||||||
|
|
||||||
<bean id="jms-shef" class="org.apache.camel.component.jms.JmsComponent">
|
|
||||||
<constructor-arg ref="jmsShefConfig" />
|
|
||||||
<property name="taskExecutor" ref="shefThreadPool" />
|
|
||||||
</bean>
|
|
||||||
<bean id="jmsShefConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
|
||||||
factory-bean="jmsDurableConfig" factory-method="copy"/>
|
|
||||||
<bean id="shefThreadPool"
|
|
||||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
|
||||||
<property name="corePoolSize" value="3" />
|
|
||||||
<property name="maxPoolSize" value="3" />
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<bean id="shefDecoder" class="com.raytheon.edex.plugin.shef.ShefDecoder">
|
<bean id="shefDecoder" class="com.raytheon.edex.plugin.shef.ShefDecoder">
|
||||||
<constructor-arg value="shef" />
|
<constructor-arg value="shef" />
|
||||||
</bean>
|
</bean>
|
||||||
|
@ -47,13 +35,13 @@
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="shef" />
|
<constructor-arg value="shef" />
|
||||||
<constructor-arg
|
<constructor-arg
|
||||||
value="jms-dist:queue:Ingest.Shef"/>
|
value="jms-durable:queue:Ingest.Shef"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="shefHandleoupDistRegistry" factory-bean="handleoupDistributionSrv"
|
<bean id="shefHandleoupDistRegistry" factory-bean="handleoupDistributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="shef" />
|
<constructor-arg value="shef" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.Shef"/>
|
<constructor-arg value="jms-durable:queue:Ingest.Shef"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="shefCamelRegistered" factory-bean="contextManager"
|
<bean id="shefCamelRegistered" factory-bean="contextManager"
|
||||||
|
@ -92,7 +80,7 @@
|
||||||
<!-- Begin shef routes -->
|
<!-- Begin shef routes -->
|
||||||
<route id="shefIngestRoute">
|
<route id="shefIngestRoute">
|
||||||
<from
|
<from
|
||||||
uri="jms-shef:queue:Ingest.Shef"/>
|
uri="jms-durable:queue:Ingest.Shef"/>
|
||||||
<setHeader headerName="pluginName">
|
<setHeader headerName="pluginName">
|
||||||
<constant>shef</constant>
|
<constant>shef</constant>
|
||||||
</setHeader>
|
</setHeader>
|
||||||
|
@ -103,7 +91,7 @@
|
||||||
</route>
|
</route>
|
||||||
<route id="shefStagedRoute">
|
<route id="shefStagedRoute">
|
||||||
<from
|
<from
|
||||||
uri="jms-shef:queue:Ingest.ShefStaged"/>
|
uri="jms-durable:queue:Ingest.ShefStaged"/>
|
||||||
<setHeader headerName="pluginName">
|
<setHeader headerName="pluginName">
|
||||||
<constant>shef</constant>
|
<constant>shef</constant>
|
||||||
</setHeader>
|
</setHeader>
|
||||||
|
@ -155,7 +143,7 @@
|
||||||
|
|
||||||
<route id="shefManualIngestRoute">
|
<route id="shefManualIngestRoute">
|
||||||
<from
|
<from
|
||||||
uri="jms-shef:queue:Ingest.ShefManual"/>
|
uri="jms-durable:queue:Ingest.ShefManual"/>
|
||||||
<setHeader headerName="pluginName">
|
<setHeader headerName="pluginName">
|
||||||
<constant>shef</constant>
|
<constant>shef</constant>
|
||||||
</setHeader>
|
</setHeader>
|
||||||
|
|
|
@ -9,13 +9,13 @@
|
||||||
<bean id="tafDistRegistry" factory-bean="distributionSrv"
|
<bean id="tafDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="taf" />
|
<constructor-arg value="taf" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.taf"/>
|
<constructor-arg value="jms-durable:queue:Ingest.taf"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="tafHandleoupDistRegistry" factory-bean="handleoupDistributionSrv"
|
<bean id="tafHandleoupDistRegistry" factory-bean="handleoupDistributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="taf" />
|
<constructor-arg value="taf" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.taf"/>
|
<constructor-arg value="jms-durable:queue:Ingest.taf"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="tafCamelRegistered" factory-bean="contextManager"
|
<bean id="tafCamelRegistered" factory-bean="contextManager"
|
||||||
|
|
|
@ -82,6 +82,7 @@ import com.raytheon.uf.edex.decodertools.time.TimeTools;
|
||||||
* Jun 28, 2012 #827 dgilling Annotate id field for
|
* Jun 28, 2012 #827 dgilling Annotate id field for
|
||||||
* serialization.
|
* serialization.
|
||||||
* Nov 01, 2013 2361 njensen Remove XML annotations
|
* Nov 01, 2013 2361 njensen Remove XML annotations
|
||||||
|
* Feb 10, 2014 2777 rferrel set the parentId when assinging sets.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -102,7 +103,6 @@ public class ChangeGroup extends PersistableDataObject {
|
||||||
|
|
||||||
@Id
|
@Id
|
||||||
@GeneratedValue
|
@GeneratedValue
|
||||||
@DynamicSerializeElement
|
|
||||||
private int id;
|
private int id;
|
||||||
|
|
||||||
/** A String containing the change group */
|
/** A String containing the change group */
|
||||||
|
@ -885,6 +885,11 @@ public class ChangeGroup extends PersistableDataObject {
|
||||||
|
|
||||||
public void setTurbulence_layers(Set<TurbulenceLayer> turbulence_layers) {
|
public void setTurbulence_layers(Set<TurbulenceLayer> turbulence_layers) {
|
||||||
this.turbulence_layers = turbulence_layers;
|
this.turbulence_layers = turbulence_layers;
|
||||||
|
if ((turbulence_layers != null) && (turbulence_layers.size() > 0)) {
|
||||||
|
for (TurbulenceLayer turbulence_layer : turbulence_layers) {
|
||||||
|
turbulence_layer.setParentID(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<IcingLayer> getIcing_layers() {
|
public Set<IcingLayer> getIcing_layers() {
|
||||||
|
@ -893,6 +898,11 @@ public class ChangeGroup extends PersistableDataObject {
|
||||||
|
|
||||||
public void setIcing_layers(Set<IcingLayer> icing_layers) {
|
public void setIcing_layers(Set<IcingLayer> icing_layers) {
|
||||||
this.icing_layers = icing_layers;
|
this.icing_layers = icing_layers;
|
||||||
|
if ((icing_layers != null) && (icing_layers.size() > 0)) {
|
||||||
|
for (IcingLayer icing_layer : icing_layers) {
|
||||||
|
icing_layer.setParentID(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<TemperatureForecast> getTemp_forecasts() {
|
public Set<TemperatureForecast> getTemp_forecasts() {
|
||||||
|
@ -901,6 +911,11 @@ public class ChangeGroup extends PersistableDataObject {
|
||||||
|
|
||||||
public void setTemp_forecasts(Set<TemperatureForecast> temp_forecasts) {
|
public void setTemp_forecasts(Set<TemperatureForecast> temp_forecasts) {
|
||||||
this.temp_forecasts = temp_forecasts;
|
this.temp_forecasts = temp_forecasts;
|
||||||
|
if ((temp_forecasts != null) && (temp_forecasts.size() > 0)) {
|
||||||
|
for (TemperatureForecast temForecast : temp_forecasts) {
|
||||||
|
temForecast.setParentID(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<TafWeatherCondition> getWeather() {
|
public Set<TafWeatherCondition> getWeather() {
|
||||||
|
@ -909,6 +924,11 @@ public class ChangeGroup extends PersistableDataObject {
|
||||||
|
|
||||||
public void setWeather(Set<TafWeatherCondition> weather) {
|
public void setWeather(Set<TafWeatherCondition> weather) {
|
||||||
this.weather = weather;
|
this.weather = weather;
|
||||||
|
if ((weather != null) && (weather.size() > 0)) {
|
||||||
|
for (TafWeatherCondition twc : weather) {
|
||||||
|
twc.setParentID(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<TafSkyCover> getSky_cover() {
|
public Set<TafSkyCover> getSky_cover() {
|
||||||
|
@ -917,6 +937,11 @@ public class ChangeGroup extends PersistableDataObject {
|
||||||
|
|
||||||
public void setSky_cover(Set<TafSkyCover> sky_cover) {
|
public void setSky_cover(Set<TafSkyCover> sky_cover) {
|
||||||
this.sky_cover = sky_cover;
|
this.sky_cover = sky_cover;
|
||||||
|
if ((sky_cover != null) && (sky_cover.size() > 0)) {
|
||||||
|
for (TafSkyCover tsc : sky_cover) {
|
||||||
|
tsc.setParentID(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkGroupDataEnd(StringBuilder group) {
|
private void checkGroupDataEnd(StringBuilder group) {
|
||||||
|
|
|
@ -65,6 +65,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
|
||||||
* PluginDataObject.
|
* PluginDataObject.
|
||||||
* Aug 30, 2013 2298 rjpeter Make getPluginName abstract
|
* Aug 30, 2013 2298 rjpeter Make getPluginName abstract
|
||||||
* Nov 01, 2013 2361 njensen Remove XML annotations
|
* Nov 01, 2013 2361 njensen Remove XML annotations
|
||||||
|
* Feb 10, 2014 2777 rferrel Assign parent id when setting ChangeGroup.
|
||||||
|
* Feb 11, 2014 2784 rferrel Remove override of setIdentifier.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -277,6 +279,11 @@ public class TafRecord extends PluginDataObject implements ISpatialEnabled {
|
||||||
*/
|
*/
|
||||||
public void setChangeGroups(Set<ChangeGroup> changeGroups) {
|
public void setChangeGroups(Set<ChangeGroup> changeGroups) {
|
||||||
this.changeGroups = changeGroups;
|
this.changeGroups = changeGroups;
|
||||||
|
if ((changeGroups != null) && (changeGroups.size() > 0)) {
|
||||||
|
for (ChangeGroup changeGroup : changeGroups) {
|
||||||
|
changeGroup.setParentID(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -324,19 +331,6 @@ public class TafRecord extends PluginDataObject implements ISpatialEnabled {
|
||||||
this.remarks = remarks;
|
this.remarks = remarks;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setIdentifier(Object dataURI) {
|
|
||||||
|
|
||||||
this.identifier = dataURI;
|
|
||||||
|
|
||||||
if ((this.changeGroups != null) && (this.changeGroups.size() > 0)) {
|
|
||||||
for (ChangeGroup group : this.changeGroups) {
|
|
||||||
group.setParentID(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ObStation getSpatialObject() {
|
public ObStation getSpatialObject() {
|
||||||
return location;
|
return location;
|
||||||
|
|
|
@ -11,13 +11,13 @@
|
||||||
<bean id="textDistRegistry" factory-bean="distributionSrv"
|
<bean id="textDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="text" />
|
<constructor-arg value="text" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.Text"/>
|
<constructor-arg value="jms-durable:queue:Ingest.Text"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="textHandleoupDistRegistry" factory-bean="handleoupDistributionSrv"
|
<bean id="textHandleoupDistRegistry" factory-bean="handleoupDistributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="text" />
|
<constructor-arg value="text" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.Text"/>
|
<constructor-arg value="jms-durable:queue:Ingest.Text"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<!-- define the bean that handles automatic faxing of products. -->
|
<!-- define the bean that handles automatic faxing of products. -->
|
||||||
|
@ -27,18 +27,6 @@
|
||||||
<!-- verify text product info for site, spawns in separate thread to not delay start up -->
|
<!-- verify text product info for site, spawns in separate thread to not delay start up -->
|
||||||
<bean id="textVersionPurge" class="com.raytheon.edex.plugin.text.TextVersionPurge" depends-on="textRegistered"/>
|
<bean id="textVersionPurge" class="com.raytheon.edex.plugin.text.TextVersionPurge" depends-on="textRegistered"/>
|
||||||
|
|
||||||
<bean id="jms-text" class="org.apache.camel.component.jms.JmsComponent">
|
|
||||||
<constructor-arg ref="jmsTextConfig" />
|
|
||||||
<property name="taskExecutor" ref="textThreadPool" />
|
|
||||||
</bean>
|
|
||||||
<bean id="jmsTextConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
|
||||||
factory-bean="jmsDurableConfig" factory-method="copy"/>
|
|
||||||
<bean id="textThreadPool"
|
|
||||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
|
||||||
<property name="corePoolSize" value="2" />
|
|
||||||
<property name="maxPoolSize" value="2" />
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<!-- Special handler for text plugin archives that bases filenames off
|
<!-- Special handler for text plugin archives that bases filenames off
|
||||||
creation time-->
|
creation time-->
|
||||||
<bean id="textArchiveNamer" class="com.raytheon.edex.plugin.text.maintenance.archiver.TextArchiveFileNameFormatter" />
|
<bean id="textArchiveNamer" class="com.raytheon.edex.plugin.text.maintenance.archiver.TextArchiveFileNameFormatter" />
|
||||||
|
@ -118,7 +106,7 @@
|
||||||
</route>
|
</route>
|
||||||
|
|
||||||
<route id="textUndecodedIngestRoute">
|
<route id="textUndecodedIngestRoute">
|
||||||
<from uri="jms-text:queue:Ingest.Text?concurrentConsumers=2" />
|
<from uri="jms-durable:queue:Ingest.Text?concurrentConsumers=2" />
|
||||||
<setHeader headerName="pluginName">
|
<setHeader headerName="pluginName">
|
||||||
<constant>text</constant>
|
<constant>text</constant>
|
||||||
</setHeader>
|
</setHeader>
|
||||||
|
@ -145,7 +133,7 @@
|
||||||
<route id="textToWatchWarnRoute">
|
<route id="textToWatchWarnRoute">
|
||||||
<from uri="direct:textToWatchWarn" />
|
<from uri="direct:textToWatchWarn" />
|
||||||
<bean ref="textDecoder" method="transformToProductIds" />
|
<bean ref="textDecoder" method="transformToProductIds" />
|
||||||
<to uri="jms-text:queue:watchwarn" />
|
<to uri="jms-durable:queue:watchwarn" />
|
||||||
</route>
|
</route>
|
||||||
|
|
||||||
<route id="textSerializationRoute">
|
<route id="textSerializationRoute">
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
<bean id="textlightningDistRegistry" factory-bean="distributionSrv"
|
<bean id="textlightningDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="textlightning" />
|
<constructor-arg value="textlightning" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.textlightning"/>
|
<constructor-arg value="jms-durable:queue:Ingest.textlightning"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="textlightningCamelRegistered" factory-bean="contextManager"
|
<bean id="textlightningCamelRegistered" factory-bean="contextManager"
|
||||||
|
|
|
@ -8,13 +8,13 @@
|
||||||
<bean id="warningDistRegistry" factory-bean="distributionSrv"
|
<bean id="warningDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="warning" />
|
<constructor-arg value="warning" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.Warning"/>
|
<constructor-arg value="jms-durable:queue:Ingest.Warning"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="warningHandleoupDistRegistry" factory-bean="handleoupDistributionSrv"
|
<bean id="warningHandleoupDistRegistry" factory-bean="handleoupDistributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="warning" />
|
<constructor-arg value="warning" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.Warning"/>
|
<constructor-arg value="jms-durable:queue:Ingest.Warning"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="warningCamelRegistered" factory-bean="contextManager"
|
<bean id="warningCamelRegistered" factory-bean="contextManager"
|
||||||
|
@ -22,18 +22,6 @@
|
||||||
<constructor-arg ref="warning-camel"/>
|
<constructor-arg ref="warning-camel"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="jms-warning" class="org.apache.camel.component.jms.JmsComponent">
|
|
||||||
<constructor-arg ref="jmsWarningConfig" />
|
|
||||||
<property name="taskExecutor" ref="warningThreadPool" />
|
|
||||||
</bean>
|
|
||||||
<bean id="jmsWarningConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
|
||||||
factory-bean="jmsDurableConfig" factory-method="copy"/>
|
|
||||||
<bean id="warningThreadPool"
|
|
||||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
|
||||||
<property name="corePoolSize" value="1" />
|
|
||||||
<property name="maxPoolSize" value="1" />
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<camelContext id="warning-camel"
|
<camelContext id="warning-camel"
|
||||||
xmlns="http://camel.apache.org/schema/spring"
|
xmlns="http://camel.apache.org/schema/spring"
|
||||||
errorHandlerRef="errorHandler"
|
errorHandlerRef="errorHandler"
|
||||||
|
@ -56,7 +44,7 @@
|
||||||
Warning routes
|
Warning routes
|
||||||
-->
|
-->
|
||||||
<route id="warningIngestRoute">
|
<route id="warningIngestRoute">
|
||||||
<from uri="jms-warning:queue:Ingest.Warning"/>
|
<from uri="jms-durable:queue:Ingest.Warning"/>
|
||||||
<setHeader headerName="pluginName">
|
<setHeader headerName="pluginName">
|
||||||
<constant>warning</constant>
|
<constant>warning</constant>
|
||||||
</setHeader>
|
</setHeader>
|
||||||
|
@ -67,10 +55,10 @@
|
||||||
<bean ref="index" method="index" />
|
<bean ref="index" method="index" />
|
||||||
<bean ref="processUtil" method="log" />
|
<bean ref="processUtil" method="log" />
|
||||||
<multicast parallelProcessing="false">
|
<multicast parallelProcessing="false">
|
||||||
<to uri="direct-vm:warningIngestAlert" />
|
<to uri="direct-vm:stageNotification" />
|
||||||
<filter>
|
<filter>
|
||||||
<method bean="vtecFilter" method="hasVTEC" />
|
<method bean="vtecFilter" method="hasVTEC" />
|
||||||
<to uri="jms-warning:queue:activeTablePending"/>
|
<to uri="jms-durable:queue:activeTablePending"/>
|
||||||
</filter>
|
</filter>
|
||||||
</multicast>
|
</multicast>
|
||||||
</pipeline>
|
</pipeline>
|
||||||
|
@ -80,10 +68,5 @@
|
||||||
</doCatch>
|
</doCatch>
|
||||||
</doTry>
|
</doTry>
|
||||||
</route>
|
</route>
|
||||||
|
|
||||||
<route id="warningIngestAlert">
|
|
||||||
<from uri="direct-vm:warningIngestAlert" />
|
|
||||||
<to uri="direct-vm:stageNotification" />
|
|
||||||
</route>
|
|
||||||
</camelContext>
|
</camelContext>
|
||||||
</beans>
|
</beans>
|
||||||
|
|
|
@ -41,12 +41,18 @@
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<!-- JmsPooled* do not work... -->
|
<!-- JmsPooled* do not work... -->
|
||||||
<bean id="jms-alt" class="org.apache.camel.component.jms.JmsComponent">
|
<bean id="jms-mhs" class="org.apache.camel.component.jms.JmsComponent">
|
||||||
<constructor-arg ref="jmsAltConfig" />
|
<constructor-arg ref="jmsMhsConfig" />
|
||||||
<property name="taskExecutor" ref="genericThreadPool" />
|
<property name="taskExecutor" ref="mhsThreadPool" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="jmsAltConfig" class="org.apache.camel.component.jms.JmsConfiguration">
|
<bean id="mhsThreadPool"
|
||||||
|
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
||||||
|
<property name="corePoolSize" value="1" />
|
||||||
|
<property name="maxPoolSize" value="1" />
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<bean id="jmsMhsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
|
||||||
<property name="recoveryInterval" value="1000"/>
|
<property name="recoveryInterval" value="1000"/>
|
||||||
<property name="connectionFactory" ref="amqConnectionFactory" />
|
<property name="connectionFactory" ref="amqConnectionFactory" />
|
||||||
<property name="destinationResolver" ref="qpidNoDurableResolver"/>
|
<property name="destinationResolver" ref="qpidNoDurableResolver"/>
|
||||||
|
@ -64,7 +70,7 @@
|
||||||
<!-- Convert from BeanInvocation if needed. -->
|
<!-- Convert from BeanInvocation if needed. -->
|
||||||
<convertBodyTo type="com.raytheon.uf.common.dataplugin.text.request.RemoteRetrievalRequest" />
|
<convertBodyTo type="com.raytheon.uf.common.dataplugin.text.request.RemoteRetrievalRequest" />
|
||||||
<bean ref="serializationUtil" method="transformToThrift" />
|
<bean ref="serializationUtil" method="transformToThrift" />
|
||||||
<to uri="jms-alt:queue:fxa.mhs.request?requestTimeout=122000" pattern="InOut" />
|
<to uri="jms-mhs:queue:fxa.mhs.request?requestTimeout=122000" pattern="InOut" />
|
||||||
<bean ref="serializationUtil" method="transformFromThrift" />
|
<bean ref="serializationUtil" method="transformFromThrift" />
|
||||||
</route>
|
</route>
|
||||||
</camelContext>
|
</camelContext>
|
||||||
|
|
|
@ -97,6 +97,7 @@ import com.raytheon.uf.common.time.util.TimeUtil;
|
||||||
* May 07, 2013 1869 bsteffen Remove dataURI column from
|
* May 07, 2013 1869 bsteffen Remove dataURI column from
|
||||||
* PluginDataObject.
|
* PluginDataObject.
|
||||||
* Aug 30, 2013 2298 rjpeter Make getPluginName abstract
|
* Aug 30, 2013 2298 rjpeter Make getPluginName abstract
|
||||||
|
* Feb 11, 2014 2784 rferrel Remove override of setIdentifier.
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author bphillip
|
* @author bphillip
|
||||||
|
@ -984,6 +985,11 @@ public class MetarRecord extends PersistablePluginDataObject implements
|
||||||
*/
|
*/
|
||||||
public void setSkyCoverage(Set<SkyCover> skyCoverage) {
|
public void setSkyCoverage(Set<SkyCover> skyCoverage) {
|
||||||
this.skyCoverage = skyCoverage;
|
this.skyCoverage = skyCoverage;
|
||||||
|
if ((skyCoverage != null) && (skyCoverage.size() > 0)) {
|
||||||
|
for (SkyCover cover : skyCoverage) {
|
||||||
|
cover.setParentMetar(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addSkyCoverage(SkyCover cover) {
|
public void addSkyCoverage(SkyCover cover) {
|
||||||
|
@ -1019,6 +1025,11 @@ public class MetarRecord extends PersistablePluginDataObject implements
|
||||||
*/
|
*/
|
||||||
public void setWeatherCondition(List<WeatherCondition> weatherCondition) {
|
public void setWeatherCondition(List<WeatherCondition> weatherCondition) {
|
||||||
this.weatherCondition = weatherCondition;
|
this.weatherCondition = weatherCondition;
|
||||||
|
if ((weatherCondition != null) && (weatherCondition.size() > 0)) {
|
||||||
|
for (WeatherCondition cond : weatherCondition) {
|
||||||
|
cond.setParentMetar(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addWeatherCondition(WeatherCondition condition) {
|
public void addWeatherCondition(WeatherCondition condition) {
|
||||||
|
@ -1116,30 +1127,6 @@ public class MetarRecord extends PersistablePluginDataObject implements
|
||||||
this.snowWater = snowWater;
|
this.snowWater = snowWater;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Override existing set method to modify any classes that use the dataURI
|
|
||||||
* as a foreign key
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void setIdentifier(Object dataURI) {
|
|
||||||
this.identifier = dataURI;
|
|
||||||
// set the parentID to the dataURI for all values
|
|
||||||
if ((this.getWeatherCondition() != null)
|
|
||||||
&& (this.getWeatherCondition().size() > 0)) {
|
|
||||||
for (WeatherCondition cond : this.getWeatherCondition()) {
|
|
||||||
cond.setParentMetar(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// set the parentID to the dataURI for all values
|
|
||||||
if ((this.getSkyCoverage() != null)
|
|
||||||
&& (this.getSkyCoverage().size() > 0)) {
|
|
||||||
for (SkyCover cover : this.getSkyCoverage()) {
|
|
||||||
cover.setParentMetar(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getReportType() {
|
public String getReportType() {
|
||||||
return reportType;
|
return reportType;
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,6 @@ import javax.xml.bind.annotation.XmlElement;
|
||||||
|
|
||||||
import com.raytheon.uf.common.serialization.ISerializableObject;
|
import com.raytheon.uf.common.serialization.ISerializableObject;
|
||||||
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
|
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
|
||||||
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is the root class for any object being persisted in the database using
|
* This is the root class for any object being persisted in the database using
|
||||||
|
@ -50,6 +49,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
|
||||||
* 7/24/07 353 bphillip Initial Check in
|
* 7/24/07 353 bphillip Initial Check in
|
||||||
* 20080408 1039 jkorman Added traceId for tracing data.
|
* 20080408 1039 jkorman Added traceId for tracing data.
|
||||||
* Oct 10, 2012 1261 djohnson Add generic for identifier.
|
* Oct 10, 2012 1261 djohnson Add generic for identifier.
|
||||||
|
* Feb 11, 2014 2784 rferrel Identifier no longer a DynamicSerializeElement.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -59,8 +59,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
|
||||||
@XmlAccessorType(XmlAccessType.NONE)
|
@XmlAccessorType(XmlAccessType.NONE)
|
||||||
@DynamicSerialize
|
@DynamicSerialize
|
||||||
public abstract class PersistableDataObject<IDENTIFIER_TYPE> implements
|
public abstract class PersistableDataObject<IDENTIFIER_TYPE> implements
|
||||||
IPersistableDataObject<IDENTIFIER_TYPE>,
|
IPersistableDataObject<IDENTIFIER_TYPE>, Serializable,
|
||||||
Serializable, ISerializableObject {
|
ISerializableObject {
|
||||||
|
|
||||||
private static final long serialVersionUID = -6747395152869923909L;
|
private static final long serialVersionUID = -6747395152869923909L;
|
||||||
|
|
||||||
|
@ -69,7 +69,6 @@ public abstract class PersistableDataObject<IDENTIFIER_TYPE> implements
|
||||||
* key for the associated database table.
|
* key for the associated database table.
|
||||||
*/
|
*/
|
||||||
@XmlElement
|
@XmlElement
|
||||||
@DynamicSerializeElement
|
|
||||||
protected IDENTIFIER_TYPE identifier;
|
protected IDENTIFIER_TYPE identifier;
|
||||||
|
|
||||||
private String traceId = "";
|
private String traceId = "";
|
||||||
|
|
|
@ -5,6 +5,7 @@ Bundle-SymbolicName: com.raytheon.uf.common.jms
|
||||||
Bundle-Version: 1.12.1174.qualifier
|
Bundle-Version: 1.12.1174.qualifier
|
||||||
Bundle-Vendor: Raytheon
|
Bundle-Vendor: Raytheon
|
||||||
Require-Bundle: javax.jms,
|
Require-Bundle: javax.jms,
|
||||||
com.raytheon.uf.common.status
|
com.raytheon.uf.common.status,
|
||||||
|
org.apache.qpid
|
||||||
Export-Package: com.raytheon.uf.common.jms
|
Export-Package: com.raytheon.uf.common.jms
|
||||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
|
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
|
||||||
|
|
|
@ -39,7 +39,8 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
|
||||||
* connection can be released to the pool. Any exception will close pooled
|
* connection can be released to the pool. Any exception will close pooled
|
||||||
* session instead of returning to the pool. The sessions are tracked in both
|
* session instead of returning to the pool. The sessions are tracked in both
|
||||||
* active and available states. An available session can be reused by the next
|
* active and available states. An available session can be reused by the next
|
||||||
* client.
|
* client. The connection is pinned to Thread that creates the connection and
|
||||||
|
* cannot be used/reused by any other thread.
|
||||||
*
|
*
|
||||||
* Synchronization Principle To prevent deadlocks: Chained sync blocks can only
|
* Synchronization Principle To prevent deadlocks: Chained sync blocks can only
|
||||||
* happen in a downward direction. A manager has a synchronized lock can make a
|
* happen in a downward direction. A manager has a synchronized lock can make a
|
||||||
|
@ -52,9 +53,11 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
|
||||||
*
|
*
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Apr 15, 2011 rjpeter Initial creation
|
* Apr 15, 2011 rjpeter Initial creation.
|
||||||
* Mar 08, 2012 194 njensen Improved safety of close()
|
* Mar 08, 2012 194 njensen Improved safety of close().
|
||||||
* Feb 21, 2013 1642 rjpeter Fix deadlock scenario
|
* Feb 21, 2013 1642 rjpeter Fix deadlock scenario.
|
||||||
|
* Feb 07, 2014 2357 rjpeter Track by Thread, close session is it has no
|
||||||
|
* producers/consumers.
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author rjpeter
|
* @author rjpeter
|
||||||
|
@ -86,7 +89,7 @@ public class JmsPooledConnection implements ExceptionListener {
|
||||||
|
|
||||||
private volatile AvailableJmsPooledObject<JmsPooledSession> availableSession = null;
|
private volatile AvailableJmsPooledObject<JmsPooledSession> availableSession = null;
|
||||||
|
|
||||||
private volatile String key = null;
|
private final Thread thread;
|
||||||
|
|
||||||
private final String clientId;
|
private final String clientId;
|
||||||
|
|
||||||
|
@ -94,8 +97,10 @@ public class JmsPooledConnection implements ExceptionListener {
|
||||||
|
|
||||||
private volatile boolean exceptionOccurred = false;
|
private volatile boolean exceptionOccurred = false;
|
||||||
|
|
||||||
public JmsPooledConnection(JmsPooledConnectionFactory connFactory) {
|
public JmsPooledConnection(JmsPooledConnectionFactory connFactory,
|
||||||
|
Thread thread) {
|
||||||
this.connFactory = connFactory;
|
this.connFactory = connFactory;
|
||||||
|
this.thread = thread;
|
||||||
this.clientId = null;
|
this.clientId = null;
|
||||||
getConnection();
|
getConnection();
|
||||||
}
|
}
|
||||||
|
@ -123,7 +128,8 @@ public class JmsPooledConnection implements ExceptionListener {
|
||||||
if (availableSession != null) {
|
if (availableSession != null) {
|
||||||
JmsPooledSession availSess = availableSession.getPooledObject();
|
JmsPooledSession availSess = availableSession.getPooledObject();
|
||||||
synchronized (availSess.getStateLock()) {
|
synchronized (availSess.getStateLock()) {
|
||||||
if (availSess.isValid()) {
|
if (availSess.isValid()
|
||||||
|
&& availSess.hasProducersOrConsumers()) {
|
||||||
availSess.setState(State.InUse);
|
availSess.setState(State.InUse);
|
||||||
session = availSess;
|
session = availSess;
|
||||||
} else {
|
} else {
|
||||||
|
@ -185,6 +191,7 @@ public class JmsPooledConnection implements ExceptionListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (canClose) {
|
if (canClose) {
|
||||||
|
statusHandler.info("Closing connection: " + this.toString());
|
||||||
// njensen: I moved removing the connection from the pool to be
|
// njensen: I moved removing the connection from the pool to be
|
||||||
// the first thing in this block instead of last thing so
|
// the first thing in this block instead of last thing so
|
||||||
// there's no chance it could be closed and then retrieved from
|
// there's no chance it could be closed and then retrieved from
|
||||||
|
@ -283,6 +290,8 @@ public class JmsPooledConnection implements ExceptionListener {
|
||||||
// safe since conn is volatile
|
// safe since conn is volatile
|
||||||
synchronized (stateLock) {
|
synchronized (stateLock) {
|
||||||
if (conn == null) {
|
if (conn == null) {
|
||||||
|
statusHandler.info("Creating connection: "
|
||||||
|
+ this.toString());
|
||||||
long exceptionLastHandled = 0;
|
long exceptionLastHandled = 0;
|
||||||
boolean connected = false;
|
boolean connected = false;
|
||||||
while (!connected) {
|
while (!connected) {
|
||||||
|
@ -298,7 +307,7 @@ public class JmsPooledConnection implements ExceptionListener {
|
||||||
connectionStartTime = System.currentTimeMillis();
|
connectionStartTime = System.currentTimeMillis();
|
||||||
connected = true;
|
connected = true;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
if (exceptionLastHandled + ERROR_BROADCAST_INTERVAL < System
|
if ((exceptionLastHandled + ERROR_BROADCAST_INTERVAL) < System
|
||||||
.currentTimeMillis()) {
|
.currentTimeMillis()) {
|
||||||
exceptionLastHandled = System
|
exceptionLastHandled = System
|
||||||
.currentTimeMillis();
|
.currentTimeMillis();
|
||||||
|
@ -502,12 +511,8 @@ public class JmsPooledConnection implements ExceptionListener {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setKey(String key) {
|
public Thread getThread() {
|
||||||
this.key = key;
|
return thread;
|
||||||
}
|
|
||||||
|
|
||||||
public String getKey() {
|
|
||||||
return key;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -57,7 +57,8 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Apr 15, 2011 rjpeter Initial creation
|
* Apr 15, 2011 rjpeter Initial creation
|
||||||
* Oct 04, 2013 2357 rjpeter Removed pooling, keeps resources open for the
|
* Oct 04, 2013 2357 rjpeter Removed pooling, keeps resources open for the
|
||||||
* thread that created them for a configured amount of time
|
* thread that created them for a configured amount of time.
|
||||||
|
* Feb 07, 2014 2357 rjpeter Track by Thread object, periodly check that tracked Threads are still alive.
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author rjpeter
|
* @author rjpeter
|
||||||
|
@ -72,11 +73,11 @@ public class JmsPooledConnectionFactory implements ConnectionFactory {
|
||||||
|
|
||||||
private String provider = "QPID";
|
private String provider = "QPID";
|
||||||
|
|
||||||
// connections in use, key is "threadId-threadName"
|
// connections in use
|
||||||
private final Map<String, JmsPooledConnection> inUseConnections = new HashMap<String, JmsPooledConnection>();
|
private final Map<Thread, JmsPooledConnection> inUseConnections = new HashMap<Thread, JmsPooledConnection>();
|
||||||
|
|
||||||
// connections that were recently returned, key is "threadId-threadName"
|
// connections that were recently returned
|
||||||
private final Map<String, AvailableJmsPooledObject<JmsPooledConnection>> pendingConnections = new HashMap<String, AvailableJmsPooledObject<JmsPooledConnection>>();
|
private final Map<Thread, AvailableJmsPooledObject<JmsPooledConnection>> pendingConnections = new HashMap<Thread, AvailableJmsPooledObject<JmsPooledConnection>>();
|
||||||
|
|
||||||
private final ConcurrentLinkedQueue<JmsPooledConnection> deadConnections = new ConcurrentLinkedQueue<JmsPooledConnection>();
|
private final ConcurrentLinkedQueue<JmsPooledConnection> deadConnections = new ConcurrentLinkedQueue<JmsPooledConnection>();
|
||||||
|
|
||||||
|
@ -95,24 +96,23 @@ public class JmsPooledConnectionFactory implements ConnectionFactory {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Connection createConnection() throws JMSException {
|
public Connection createConnection() throws JMSException {
|
||||||
String threadKey = "" + Thread.currentThread().getId() + "-"
|
Thread thread = Thread.currentThread();
|
||||||
+ Thread.currentThread().getName();
|
|
||||||
JmsPooledConnection conn = null;
|
JmsPooledConnection conn = null;
|
||||||
|
|
||||||
synchronized (inUseConnections) {
|
synchronized (inUseConnections) {
|
||||||
conn = inUseConnections.get(threadKey);
|
conn = inUseConnections.get(thread);
|
||||||
|
|
||||||
if (conn != null) {
|
if (conn != null) {
|
||||||
JmsConnectionWrapper ref = conn.createReference();
|
JmsConnectionWrapper ref = conn.createReference();
|
||||||
if (ref != null) {
|
if (ref != null) {
|
||||||
statusHandler
|
statusHandler
|
||||||
.info(threadKey
|
.info(thread.getName()
|
||||||
+ " already has a connection in use, returning previous connection thread, references="
|
+ " already has a connection in use, returning previous connection thread, references="
|
||||||
+ conn.getReferenceCount());
|
+ conn.getReferenceCount());
|
||||||
return ref;
|
return ref;
|
||||||
} else {
|
} else {
|
||||||
deadConnections.add(conn);
|
deadConnections.add(conn);
|
||||||
inUseConnections.remove(threadKey);
|
inUseConnections.remove(thread);
|
||||||
conn = null;
|
conn = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -122,13 +122,13 @@ public class JmsPooledConnectionFactory implements ConnectionFactory {
|
||||||
|
|
||||||
// check connections by Thread
|
// check connections by Thread
|
||||||
synchronized (pendingConnections) {
|
synchronized (pendingConnections) {
|
||||||
wrapper = pendingConnections.remove(threadKey);
|
wrapper = pendingConnections.remove(thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
// was retrieved connection valid
|
// was retrieved connection valid
|
||||||
if (wrapper != null) {
|
if (wrapper != null) {
|
||||||
conn = wrapper.getPooledObject();
|
conn = wrapper.getPooledObject();
|
||||||
JmsConnectionWrapper ref = getConnectionWrapper(threadKey, conn);
|
JmsConnectionWrapper ref = getConnectionWrapper(conn);
|
||||||
|
|
||||||
if (ref != null) {
|
if (ref != null) {
|
||||||
return ref;
|
return ref;
|
||||||
|
@ -140,22 +140,20 @@ public class JmsPooledConnectionFactory implements ConnectionFactory {
|
||||||
|
|
||||||
// create new connection?
|
// create new connection?
|
||||||
if (conn == null) {
|
if (conn == null) {
|
||||||
conn = new JmsPooledConnection(this);
|
conn = new JmsPooledConnection(this, thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
return getConnectionWrapper(threadKey, conn);
|
return getConnectionWrapper(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
private JmsConnectionWrapper getConnectionWrapper(String threadKey,
|
private JmsConnectionWrapper getConnectionWrapper(JmsPooledConnection conn) {
|
||||||
JmsPooledConnection conn) {
|
|
||||||
synchronized (conn.getStateLock()) {
|
synchronized (conn.getStateLock()) {
|
||||||
if (conn.isValid()) {
|
if (conn.isValid()) {
|
||||||
conn.setState(State.InUse);
|
conn.setState(State.InUse);
|
||||||
JmsConnectionWrapper ref = conn.createReference();
|
JmsConnectionWrapper ref = conn.createReference();
|
||||||
if (ref != null) {
|
if (ref != null) {
|
||||||
conn.setKey(threadKey);
|
|
||||||
synchronized (inUseConnections) {
|
synchronized (inUseConnections) {
|
||||||
inUseConnections.put(threadKey, conn);
|
inUseConnections.put(conn.getThread(), conn);
|
||||||
}
|
}
|
||||||
return ref;
|
return ref;
|
||||||
}
|
}
|
||||||
|
@ -207,13 +205,13 @@ public class JmsPooledConnectionFactory implements ConnectionFactory {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeConnectionFromPool(JmsPooledConnection conn) {
|
public void removeConnectionFromPool(JmsPooledConnection conn) {
|
||||||
String threadKey = conn.getKey();
|
Thread thread = conn.getThread();
|
||||||
boolean success = false;
|
boolean success = false;
|
||||||
|
|
||||||
// remove it from inUseConnections if it was in use, theoretically could
|
// remove it from inUseConnections if it was in use, theoretically could
|
||||||
// go by connection state, but may miss something due to threading
|
// go by connection state, but may miss something due to threading
|
||||||
synchronized (inUseConnections) {
|
synchronized (inUseConnections) {
|
||||||
JmsPooledConnection inUse = inUseConnections.remove(threadKey);
|
JmsPooledConnection inUse = inUseConnections.remove(thread);
|
||||||
|
|
||||||
// make sure the one we removed is indeed this connection, 99%
|
// make sure the one we removed is indeed this connection, 99%
|
||||||
// of time this is correct
|
// of time this is correct
|
||||||
|
@ -228,7 +226,7 @@ public class JmsPooledConnectionFactory implements ConnectionFactory {
|
||||||
// really only here for bullet proofing code against bad
|
// really only here for bullet proofing code against bad
|
||||||
// use of pool
|
// use of pool
|
||||||
if (inUse != null) {
|
if (inUse != null) {
|
||||||
inUseConnections.put(threadKey, inUse);
|
inUseConnections.put(thread, inUse);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -236,13 +234,13 @@ public class JmsPooledConnectionFactory implements ConnectionFactory {
|
||||||
// remove it from pendingConnections
|
// remove it from pendingConnections
|
||||||
AvailableJmsPooledObject<JmsPooledConnection> pooledObj = null;
|
AvailableJmsPooledObject<JmsPooledConnection> pooledObj = null;
|
||||||
synchronized (pendingConnections) {
|
synchronized (pendingConnections) {
|
||||||
pooledObj = pendingConnections.remove(threadKey);
|
pooledObj = pendingConnections.remove(thread);
|
||||||
if (pooledObj != null) {
|
if (pooledObj != null) {
|
||||||
if (pooledObj.getPooledObject() == conn) {
|
if (pooledObj.getPooledObject() == conn) {
|
||||||
// found conn, done
|
// found conn, done
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
pendingConnections.put(threadKey, pooledObj);
|
pendingConnections.put(thread, pooledObj);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -250,10 +248,10 @@ public class JmsPooledConnectionFactory implements ConnectionFactory {
|
||||||
|
|
||||||
public boolean returnConnectionToPool(JmsPooledConnection conn) {
|
public boolean returnConnectionToPool(JmsPooledConnection conn) {
|
||||||
boolean success = false;
|
boolean success = false;
|
||||||
String threadKey = conn.getKey();
|
Thread thread = conn.getThread();
|
||||||
|
|
||||||
synchronized (inUseConnections) {
|
synchronized (inUseConnections) {
|
||||||
JmsPooledConnection inUse = inUseConnections.remove(threadKey);
|
JmsPooledConnection inUse = inUseConnections.remove(thread);
|
||||||
|
|
||||||
// make sure the one we removed is indeed this connection, 99%
|
// make sure the one we removed is indeed this connection, 99%
|
||||||
// of time this is correct
|
// of time this is correct
|
||||||
|
@ -265,7 +263,7 @@ public class JmsPooledConnectionFactory implements ConnectionFactory {
|
||||||
// really only here for bullet proofing code against bad
|
// really only here for bullet proofing code against bad
|
||||||
// use of pool
|
// use of pool
|
||||||
if (inUse != null) {
|
if (inUse != null) {
|
||||||
inUseConnections.put(threadKey, inUse);
|
inUseConnections.put(thread, inUse);
|
||||||
statusHandler
|
statusHandler
|
||||||
.handle(Priority.INFO,
|
.handle(Priority.INFO,
|
||||||
"Another connection already in use for this thread, not returning this connection to pool");
|
"Another connection already in use for this thread, not returning this connection to pool");
|
||||||
|
@ -279,7 +277,7 @@ public class JmsPooledConnectionFactory implements ConnectionFactory {
|
||||||
AvailableJmsPooledObject<JmsPooledConnection> prev = null;
|
AvailableJmsPooledObject<JmsPooledConnection> prev = null;
|
||||||
synchronized (pendingConnections) {
|
synchronized (pendingConnections) {
|
||||||
prev = pendingConnections
|
prev = pendingConnections
|
||||||
.put(threadKey,
|
.put(thread,
|
||||||
new AvailableJmsPooledObject<JmsPooledConnection>(
|
new AvailableJmsPooledObject<JmsPooledConnection>(
|
||||||
conn));
|
conn));
|
||||||
}
|
}
|
||||||
|
@ -317,6 +315,19 @@ public class JmsPooledConnectionFactory implements ConnectionFactory {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check for dead threads
|
||||||
|
synchronized (inUseConnections) {
|
||||||
|
Iterator<Map.Entry<Thread, JmsPooledConnection>> iter = inUseConnections
|
||||||
|
.entrySet().iterator();
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
Map.Entry<Thread, JmsPooledConnection> entry = iter.next();
|
||||||
|
if (!entry.getKey().isAlive()) {
|
||||||
|
iter.remove();
|
||||||
|
deadConnections.add(entry.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
while (!deadConnections.isEmpty()) {
|
while (!deadConnections.isEmpty()) {
|
||||||
JmsPooledConnection conn = deadConnections.poll();
|
JmsPooledConnection conn = deadConnections.poll();
|
||||||
if (conn != null) {
|
if (conn != null) {
|
||||||
|
|
|
@ -26,6 +26,8 @@ import javax.jms.Destination;
|
||||||
import javax.jms.JMSException;
|
import javax.jms.JMSException;
|
||||||
import javax.jms.MessageConsumer;
|
import javax.jms.MessageConsumer;
|
||||||
|
|
||||||
|
import org.apache.qpid.client.BasicMessageConsumer;
|
||||||
|
|
||||||
import com.raytheon.uf.common.jms.wrapper.JmsConsumerWrapper;
|
import com.raytheon.uf.common.jms.wrapper.JmsConsumerWrapper;
|
||||||
import com.raytheon.uf.common.status.IUFStatusHandler;
|
import com.raytheon.uf.common.status.IUFStatusHandler;
|
||||||
import com.raytheon.uf.common.status.UFStatus;
|
import com.raytheon.uf.common.status.UFStatus;
|
||||||
|
@ -47,9 +49,10 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
|
||||||
*
|
*
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Apr 18, 2011 rjpeter Initial creation
|
* Apr 18, 2011 rjpeter Initial creation.
|
||||||
* Mar 08, 2012 194 njensen Improved logging
|
* Mar 08, 2012 194 njensen Improved logging.
|
||||||
* Feb 26, 2013 1642 rjpeter Removed lazy initialization
|
* Feb 26, 2013 1642 rjpeter Removed lazy initialization.
|
||||||
|
* Feb 07, 2014 2357 rjpeter Updated logging.
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author rjpeter
|
* @author rjpeter
|
||||||
|
@ -87,6 +90,14 @@ public class JmsPooledConsumer {
|
||||||
this.destKey = destKey;
|
this.destKey = destKey;
|
||||||
consumer = sess.getSession().createConsumer(destination,
|
consumer = sess.getSession().createConsumer(destination,
|
||||||
messageSelector);
|
messageSelector);
|
||||||
|
|
||||||
|
if (consumer instanceof BasicMessageConsumer) {
|
||||||
|
statusHandler.info("Creating AMQ consumer "
|
||||||
|
+ ((BasicMessageConsumer) consumer).getDestination()
|
||||||
|
.getQueueName()); // njensen
|
||||||
|
} else {
|
||||||
|
statusHandler.info("Creating consumer " + destKey); // njensen
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getDestKey() {
|
public String getDestKey() {
|
||||||
|
@ -164,7 +175,13 @@ public class JmsPooledConsumer {
|
||||||
|
|
||||||
if (close) {
|
if (close) {
|
||||||
try {
|
try {
|
||||||
statusHandler.info("Closing consumer " + destKey); // njensen
|
if (consumer instanceof BasicMessageConsumer) {
|
||||||
|
statusHandler.info("Closing AMQ consumer "
|
||||||
|
+ ((BasicMessageConsumer) consumer)
|
||||||
|
.getDestination().getQueueName()); // njensen
|
||||||
|
} else {
|
||||||
|
statusHandler.info("Closing consumer " + destKey); // njensen
|
||||||
|
}
|
||||||
consumer.close();
|
consumer.close();
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
statusHandler.handle(Priority.WARN, "Failed to close consumer "
|
statusHandler.handle(Priority.WARN, "Failed to close consumer "
|
||||||
|
|
|
@ -25,6 +25,9 @@ import java.util.List;
|
||||||
import javax.jms.JMSException;
|
import javax.jms.JMSException;
|
||||||
import javax.jms.MessageProducer;
|
import javax.jms.MessageProducer;
|
||||||
|
|
||||||
|
import org.apache.qpid.client.AMQDestination;
|
||||||
|
import org.apache.qpid.client.BasicMessageProducer;
|
||||||
|
|
||||||
import com.raytheon.uf.common.jms.wrapper.JmsProducerWrapper;
|
import com.raytheon.uf.common.jms.wrapper.JmsProducerWrapper;
|
||||||
import com.raytheon.uf.common.status.IUFStatusHandler;
|
import com.raytheon.uf.common.status.IUFStatusHandler;
|
||||||
import com.raytheon.uf.common.status.UFStatus;
|
import com.raytheon.uf.common.status.UFStatus;
|
||||||
|
@ -46,9 +49,10 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
|
||||||
*
|
*
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Apr 18, 2011 rjpeter Initial creation
|
* Apr 18, 2011 rjpeter Initial creation.
|
||||||
* Mar 08, 2012 194 njensen Improved logging
|
* Mar 08, 2012 194 njensen Improved logging.
|
||||||
* Feb 26, 2013 1642 rjpeter Removed lazy initialization
|
* Feb 26, 2013 1642 rjpeter Removed lazy initialization.
|
||||||
|
* Feb 07, 2014 2357 rjpeter Updated logging.
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author rjpeter
|
* @author rjpeter
|
||||||
|
@ -84,6 +88,19 @@ public class JmsPooledProducer {
|
||||||
this.sess = sess;
|
this.sess = sess;
|
||||||
this.destKey = destKey;
|
this.destKey = destKey;
|
||||||
this.producer = producer;
|
this.producer = producer;
|
||||||
|
if (producer instanceof BasicMessageProducer) {
|
||||||
|
try {
|
||||||
|
statusHandler.info("Creating AMQ producer "
|
||||||
|
+ ((AMQDestination) ((BasicMessageProducer) producer)
|
||||||
|
.getDestination()).getQueueName());
|
||||||
|
} catch (Exception e) {
|
||||||
|
statusHandler
|
||||||
|
.error("Could not get producer destination for key "
|
||||||
|
+ destKey, e);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
statusHandler.info("Creating producer " + destKey); // njensen
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getDestKey() {
|
public String getDestKey() {
|
||||||
|
@ -161,7 +178,14 @@ public class JmsPooledProducer {
|
||||||
|
|
||||||
if (close) {
|
if (close) {
|
||||||
try {
|
try {
|
||||||
statusHandler.info("Closing producer " + destKey); // njensen
|
if (producer instanceof BasicMessageProducer) {
|
||||||
|
statusHandler
|
||||||
|
.info("Closing AMQ producer "
|
||||||
|
+ ((AMQDestination) ((BasicMessageProducer) producer)
|
||||||
|
.getDestination()).getQueueName()); // njensen
|
||||||
|
} else {
|
||||||
|
statusHandler.info("Closing producer " + destKey); // njensen
|
||||||
|
}
|
||||||
producer.close();
|
producer.close();
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
statusHandler.handle(Priority.WARN, "Failed to close producer",
|
statusHandler.handle(Priority.WARN, "Failed to close producer",
|
||||||
|
|
|
@ -44,7 +44,9 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
|
||||||
* can be released to the pool. Any exception will close pooled session instead
|
* can be released to the pool. Any exception will close pooled session instead
|
||||||
* of returning to the pool. The consumers/producers are tracked in both active
|
* of returning to the pool. The consumers/producers are tracked in both active
|
||||||
* and available states. An available consumer/producer can be reused by the
|
* and available states. An available consumer/producer can be reused by the
|
||||||
* next client.
|
* next client. Once a consumer has been closed the entire session is closed at
|
||||||
|
* next opportunity since QPID tracks consumers at the session level. Not doing
|
||||||
|
* this can leave a topic with no consumers on the qpid broker.
|
||||||
*
|
*
|
||||||
* Synchronization Principle To prevent deadlocks: Chained sync blocks can only
|
* Synchronization Principle To prevent deadlocks: Chained sync blocks can only
|
||||||
* happen in a downward direction. A manager has a synchronized lock can make a
|
* happen in a downward direction. A manager has a synchronized lock can make a
|
||||||
|
@ -61,6 +63,8 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
|
||||||
* Mar 08, 2012 194 njensen Improved logging
|
* Mar 08, 2012 194 njensen Improved logging
|
||||||
* Feb 21, 2013 1642 rjpeter Fix deadlock scenario
|
* Feb 21, 2013 1642 rjpeter Fix deadlock scenario
|
||||||
* Jan 26, 2014 2357 rjpeter Close a session when it has no producers or consumers.
|
* Jan 26, 2014 2357 rjpeter Close a session when it has no producers or consumers.
|
||||||
|
* Feb 07, 2014 2357 rjpeter Close session at next return to pool after a
|
||||||
|
* consumer has closed.
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author rjpeter
|
* @author rjpeter
|
||||||
|
@ -78,7 +82,7 @@ public class JmsPooledSession {
|
||||||
|
|
||||||
// The thread this session was most recently used by for tracking a pending
|
// The thread this session was most recently used by for tracking a pending
|
||||||
// session that is being reserved for a given thread.
|
// session that is being reserved for a given thread.
|
||||||
private String threadKey;
|
private final Thread thread;
|
||||||
|
|
||||||
private volatile boolean exceptionOccurred = false;
|
private volatile boolean exceptionOccurred = false;
|
||||||
|
|
||||||
|
@ -86,6 +90,10 @@ public class JmsPooledSession {
|
||||||
|
|
||||||
private volatile State state = State.InUse;
|
private volatile State state = State.InUse;
|
||||||
|
|
||||||
|
// flag to stat that session should be closed instead of returned to pool on
|
||||||
|
// next iteration
|
||||||
|
private volatile boolean shouldClose = false;
|
||||||
|
|
||||||
// keeps track of number of creates vs. closes to know when it can be
|
// keeps track of number of creates vs. closes to know when it can be
|
||||||
// returned to the pool
|
// returned to the pool
|
||||||
private final List<JmsSessionWrapper> references = new ArrayList<JmsSessionWrapper>(
|
private final List<JmsSessionWrapper> references = new ArrayList<JmsSessionWrapper>(
|
||||||
|
@ -102,6 +110,8 @@ public class JmsPooledSession {
|
||||||
public JmsPooledSession(JmsPooledConnection conn, Session sess) {
|
public JmsPooledSession(JmsPooledConnection conn, Session sess) {
|
||||||
this.conn = conn;
|
this.conn = conn;
|
||||||
this.sess = sess;
|
this.sess = sess;
|
||||||
|
this.thread = conn.getThread();
|
||||||
|
statusHandler.info("Opening session: " + this.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getCreateTime() {
|
public long getCreateTime() {
|
||||||
|
@ -121,12 +131,8 @@ public class JmsPooledSession {
|
||||||
return conn;
|
return conn;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getThreadKey() {
|
public Thread getThread() {
|
||||||
return threadKey;
|
return thread;
|
||||||
}
|
|
||||||
|
|
||||||
public void setThreadKey(String threadKey) {
|
|
||||||
this.threadKey = threadKey;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isValid() {
|
public boolean isValid() {
|
||||||
|
@ -437,6 +443,9 @@ public class JmsPooledSession {
|
||||||
String destKey = consumer.getDestKey();
|
String destKey = consumer.getDestKey();
|
||||||
boolean removed = false;
|
boolean removed = false;
|
||||||
|
|
||||||
|
// a consumer was closed, close the session at next opportunity
|
||||||
|
shouldClose = true;
|
||||||
|
|
||||||
synchronized (inUseConsumers) {
|
synchronized (inUseConsumers) {
|
||||||
JmsPooledConsumer inUse = inUseConsumers.remove(destKey);
|
JmsPooledConsumer inUse = inUseConsumers.remove(destKey);
|
||||||
removed = inUse == consumer;
|
removed = inUse == consumer;
|
||||||
|
@ -463,6 +472,7 @@ public class JmsPooledSession {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (canClose) {
|
if (canClose) {
|
||||||
|
statusHandler.info("Closing session: " + this.toString());
|
||||||
closePooledConsumersProducers();
|
closePooledConsumersProducers();
|
||||||
|
|
||||||
// need to close down all wrappers
|
// need to close down all wrappers
|
||||||
|
@ -628,7 +638,7 @@ public class JmsPooledSession {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean valid = isValid() && hasProducersOrConsumers();
|
boolean valid = isValid() && !shouldClose && hasProducersOrConsumers();
|
||||||
if (valid && returnToPool) {
|
if (valid && returnToPool) {
|
||||||
valid = conn.returnSessionToPool(this);
|
valid = conn.returnSessionToPool(this);
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,8 +37,9 @@ import com.raytheon.uf.common.jms.JmsPooledConsumer;
|
||||||
*
|
*
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Apr 18, 2011 rjpeter Initial creation
|
* Apr 18, 2011 rjpeter Initial creation.
|
||||||
* Feb 26, 2013 1642 rjpeter Added volatile references for better concurrency handling.
|
* Feb 26, 2013 1642 rjpeter Added volatile references for better concurrency handling.
|
||||||
|
* Feb 07, 2014 2357 rjpeter Set linked exception in exception handling.
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author rjpeter
|
* @author rjpeter
|
||||||
|
@ -124,8 +125,11 @@ public class JmsConsumerWrapper implements MessageConsumer {
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
exceptionOccurred = true;
|
exceptionOccurred = true;
|
||||||
JMSException exc = new JMSException(
|
JMSException exc = new JMSException(
|
||||||
"Exception occurred on pooled consumer");
|
"Exception occurred on pooled consumer in getMessageListener");
|
||||||
exc.initCause(e);
|
exc.initCause(e);
|
||||||
|
if (e instanceof Exception) {
|
||||||
|
exc.setLinkedException((Exception) e);
|
||||||
|
}
|
||||||
throw exc;
|
throw exc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -144,8 +148,11 @@ public class JmsConsumerWrapper implements MessageConsumer {
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
exceptionOccurred = true;
|
exceptionOccurred = true;
|
||||||
JMSException exc = new JMSException(
|
JMSException exc = new JMSException(
|
||||||
"Exception occurred on pooled consumer");
|
"Exception occurred on pooled consumer in getMessageSelector");
|
||||||
exc.initCause(e);
|
exc.initCause(e);
|
||||||
|
if (e instanceof Exception) {
|
||||||
|
exc.setLinkedException((Exception) e);
|
||||||
|
}
|
||||||
throw exc;
|
throw exc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -164,8 +171,11 @@ public class JmsConsumerWrapper implements MessageConsumer {
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
exceptionOccurred = true;
|
exceptionOccurred = true;
|
||||||
JMSException exc = new JMSException(
|
JMSException exc = new JMSException(
|
||||||
"Exception occurred on pooled consumer");
|
"Exception occurred on pooled consumer in receive");
|
||||||
exc.initCause(e);
|
exc.initCause(e);
|
||||||
|
if (e instanceof Exception) {
|
||||||
|
exc.setLinkedException((Exception) e);
|
||||||
|
}
|
||||||
throw exc;
|
throw exc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -184,8 +194,11 @@ public class JmsConsumerWrapper implements MessageConsumer {
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
exceptionOccurred = true;
|
exceptionOccurred = true;
|
||||||
JMSException exc = new JMSException(
|
JMSException exc = new JMSException(
|
||||||
"Exception occurred on pooled consumer");
|
"Exception occurred on pooled consumer in receive(timeout)");
|
||||||
exc.initCause(e);
|
exc.initCause(e);
|
||||||
|
if (e instanceof Exception) {
|
||||||
|
exc.setLinkedException((Exception) e);
|
||||||
|
}
|
||||||
throw exc;
|
throw exc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -204,8 +217,11 @@ public class JmsConsumerWrapper implements MessageConsumer {
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
exceptionOccurred = true;
|
exceptionOccurred = true;
|
||||||
JMSException exc = new JMSException(
|
JMSException exc = new JMSException(
|
||||||
"Exception occurred on pooled consumer");
|
"Exception occurred on pooled consumer in receiveNoWait");
|
||||||
exc.initCause(e);
|
exc.initCause(e);
|
||||||
|
if (e instanceof Exception) {
|
||||||
|
exc.setLinkedException((Exception) e);
|
||||||
|
}
|
||||||
throw exc;
|
throw exc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -226,8 +242,11 @@ public class JmsConsumerWrapper implements MessageConsumer {
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
exceptionOccurred = true;
|
exceptionOccurred = true;
|
||||||
JMSException exc = new JMSException(
|
JMSException exc = new JMSException(
|
||||||
"Exception occurred on pooled consumer");
|
"Exception occurred on pooled consumer in setMessageLister");
|
||||||
exc.initCause(e);
|
exc.initCause(e);
|
||||||
|
if (e instanceof Exception) {
|
||||||
|
exc.setLinkedException((Exception) e);
|
||||||
|
}
|
||||||
throw exc;
|
throw exc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,9 +37,10 @@ import com.raytheon.uf.common.jms.JmsPooledProducer;
|
||||||
*
|
*
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Dec fi8, 2011 rjpeter Initial creation
|
* Dec 08, 2011 rjpeter Initial creation.
|
||||||
* Feb 26, 2013 1642 rjpeter Added volatile references for better concurrency handling.
|
* Feb 26, 2013 1642 rjpeter Added volatile references for better concurrency handling.
|
||||||
* Jun 07, 2013 DR 16316 rjpeter Fix memory leak
|
* Jun 07, 2013 DR 16316 rjpeter Fix memory leak.
|
||||||
|
* Feb 07, 2014 2357 rjpeter Set linked exception in exception handling.
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author rjpeter
|
* @author rjpeter
|
||||||
|
@ -122,6 +123,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
||||||
JMSException exc = new JMSException(
|
JMSException exc = new JMSException(
|
||||||
"Exception occurred on pooled producer");
|
"Exception occurred on pooled producer");
|
||||||
exc.initCause(e);
|
exc.initCause(e);
|
||||||
|
if (e instanceof Exception) {
|
||||||
|
exc.setLinkedException((Exception) e);
|
||||||
|
}
|
||||||
throw exc;
|
throw exc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -142,6 +146,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
||||||
JMSException exc = new JMSException(
|
JMSException exc = new JMSException(
|
||||||
"Exception occurred on pooled producer");
|
"Exception occurred on pooled producer");
|
||||||
exc.initCause(e);
|
exc.initCause(e);
|
||||||
|
if (e instanceof Exception) {
|
||||||
|
exc.setLinkedException((Exception) e);
|
||||||
|
}
|
||||||
throw exc;
|
throw exc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -162,6 +169,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
||||||
JMSException exc = new JMSException(
|
JMSException exc = new JMSException(
|
||||||
"Exception occurred on pooled producer");
|
"Exception occurred on pooled producer");
|
||||||
exc.initCause(e);
|
exc.initCause(e);
|
||||||
|
if (e instanceof Exception) {
|
||||||
|
exc.setLinkedException((Exception) e);
|
||||||
|
}
|
||||||
throw exc;
|
throw exc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -182,6 +192,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
||||||
JMSException exc = new JMSException(
|
JMSException exc = new JMSException(
|
||||||
"Exception occurred on pooled producer");
|
"Exception occurred on pooled producer");
|
||||||
exc.initCause(e);
|
exc.initCause(e);
|
||||||
|
if (e instanceof Exception) {
|
||||||
|
exc.setLinkedException((Exception) e);
|
||||||
|
}
|
||||||
throw exc;
|
throw exc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -202,6 +215,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
||||||
JMSException exc = new JMSException(
|
JMSException exc = new JMSException(
|
||||||
"Exception occurred on pooled producer");
|
"Exception occurred on pooled producer");
|
||||||
exc.initCause(e);
|
exc.initCause(e);
|
||||||
|
if (e instanceof Exception) {
|
||||||
|
exc.setLinkedException((Exception) e);
|
||||||
|
}
|
||||||
throw exc;
|
throw exc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -222,6 +238,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
||||||
JMSException exc = new JMSException(
|
JMSException exc = new JMSException(
|
||||||
"Exception occurred on pooled producer");
|
"Exception occurred on pooled producer");
|
||||||
exc.initCause(e);
|
exc.initCause(e);
|
||||||
|
if (e instanceof Exception) {
|
||||||
|
exc.setLinkedException((Exception) e);
|
||||||
|
}
|
||||||
throw exc;
|
throw exc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -242,6 +261,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
||||||
JMSException exc = new JMSException(
|
JMSException exc = new JMSException(
|
||||||
"Exception occurred on pooled producer");
|
"Exception occurred on pooled producer");
|
||||||
exc.initCause(e);
|
exc.initCause(e);
|
||||||
|
if (e instanceof Exception) {
|
||||||
|
exc.setLinkedException((Exception) e);
|
||||||
|
}
|
||||||
throw exc;
|
throw exc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -264,6 +286,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
||||||
JMSException exc = new JMSException(
|
JMSException exc = new JMSException(
|
||||||
"Exception occurred on pooled producer");
|
"Exception occurred on pooled producer");
|
||||||
exc.initCause(e);
|
exc.initCause(e);
|
||||||
|
if (e instanceof Exception) {
|
||||||
|
exc.setLinkedException((Exception) e);
|
||||||
|
}
|
||||||
throw exc;
|
throw exc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -285,6 +310,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
||||||
JMSException exc = new JMSException(
|
JMSException exc = new JMSException(
|
||||||
"Exception occurred on pooled producer");
|
"Exception occurred on pooled producer");
|
||||||
exc.initCause(e);
|
exc.initCause(e);
|
||||||
|
if (e instanceof Exception) {
|
||||||
|
exc.setLinkedException((Exception) e);
|
||||||
|
}
|
||||||
throw exc;
|
throw exc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -309,6 +337,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
||||||
JMSException exc = new JMSException(
|
JMSException exc = new JMSException(
|
||||||
"Exception occurred on pooled producer");
|
"Exception occurred on pooled producer");
|
||||||
exc.initCause(e);
|
exc.initCause(e);
|
||||||
|
if (e instanceof Exception) {
|
||||||
|
exc.setLinkedException((Exception) e);
|
||||||
|
}
|
||||||
throw exc;
|
throw exc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -329,6 +360,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
||||||
JMSException exc = new JMSException(
|
JMSException exc = new JMSException(
|
||||||
"Exception occurred on pooled producer");
|
"Exception occurred on pooled producer");
|
||||||
exc.initCause(e);
|
exc.initCause(e);
|
||||||
|
if (e instanceof Exception) {
|
||||||
|
exc.setLinkedException((Exception) e);
|
||||||
|
}
|
||||||
throw exc;
|
throw exc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -349,6 +383,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
||||||
JMSException exc = new JMSException(
|
JMSException exc = new JMSException(
|
||||||
"Exception occurred on pooled producer");
|
"Exception occurred on pooled producer");
|
||||||
exc.initCause(e);
|
exc.initCause(e);
|
||||||
|
if (e instanceof Exception) {
|
||||||
|
exc.setLinkedException((Exception) e);
|
||||||
|
}
|
||||||
throw exc;
|
throw exc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -369,6 +406,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
||||||
JMSException exc = new JMSException(
|
JMSException exc = new JMSException(
|
||||||
"Exception occurred on pooled producer");
|
"Exception occurred on pooled producer");
|
||||||
exc.initCause(e);
|
exc.initCause(e);
|
||||||
|
if (e instanceof Exception) {
|
||||||
|
exc.setLinkedException((Exception) e);
|
||||||
|
}
|
||||||
throw exc;
|
throw exc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -389,6 +429,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
||||||
JMSException exc = new JMSException(
|
JMSException exc = new JMSException(
|
||||||
"Exception occurred on pooled producer");
|
"Exception occurred on pooled producer");
|
||||||
exc.initCause(e);
|
exc.initCause(e);
|
||||||
|
if (e instanceof Exception) {
|
||||||
|
exc.setLinkedException((Exception) e);
|
||||||
|
}
|
||||||
throw exc;
|
throw exc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -409,6 +452,9 @@ public class JmsProducerWrapper implements MessageProducer {
|
||||||
JMSException exc = new JMSException(
|
JMSException exc = new JMSException(
|
||||||
"Exception occurred on pooled producer");
|
"Exception occurred on pooled producer");
|
||||||
exc.initCause(e);
|
exc.initCause(e);
|
||||||
|
if (e instanceof Exception) {
|
||||||
|
exc.setLinkedException((Exception) e);
|
||||||
|
}
|
||||||
throw exc;
|
throw exc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,17 +15,6 @@
|
||||||
<constructor-arg value="com.raytheon.uf.common.activetable"/>
|
<constructor-arg value="com.raytheon.uf.common.activetable"/>
|
||||||
<constructor-arg ref="activeTableDatabaseProperties"/>
|
<constructor-arg ref="activeTableDatabaseProperties"/>
|
||||||
</bean>
|
</bean>
|
||||||
<bean id="jms-activetable" class="org.apache.camel.component.jms.JmsComponent">
|
|
||||||
<constructor-arg ref="jmsActiveTableConfig" />
|
|
||||||
<property name="taskExecutor" ref="activeTableMergeThreadPool" />
|
|
||||||
</bean>
|
|
||||||
<bean id="jmsActiveTableConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
|
||||||
factory-bean="jmsConfig" factory-method="copy" />
|
|
||||||
<bean id="activeTableMergeThreadPool"
|
|
||||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
|
||||||
<property name="corePoolSize" value="2" />
|
|
||||||
<property name="maxPoolSize" value="2" />
|
|
||||||
</bean>
|
|
||||||
<bean id="timeOffsetDecoder" class="com.raytheon.uf.edex.python.decoder.TimeOffsetDecoder">
|
<bean id="timeOffsetDecoder" class="com.raytheon.uf.edex.python.decoder.TimeOffsetDecoder">
|
||||||
<property name="pluginName" value="warning" />
|
<property name="pluginName" value="warning" />
|
||||||
<property name="pluginFQN" value="com.raytheon.edex.plugin.warning" />
|
<property name="pluginFQN" value="com.raytheon.edex.plugin.warning" />
|
||||||
|
@ -45,7 +34,7 @@
|
||||||
<to uri="jms-generic:topic:edex.alerts.vtec?timeToLive=60000" />
|
<to uri="jms-generic:topic:edex.alerts.vtec?timeToLive=60000" />
|
||||||
</route>
|
</route>
|
||||||
<route id="practiceVtecRoute">
|
<route id="practiceVtecRoute">
|
||||||
<from uri="jms-activetable:queue:practiceActiveTable?concurrentConsumers=1" />
|
<from uri="jms-generic:queue:practiceActiveTable" />
|
||||||
<doTry>
|
<doTry>
|
||||||
<bean ref="activeTable" method="dumpProductToTempFile" />
|
<bean ref="activeTable" method="dumpProductToTempFile" />
|
||||||
<bean ref="practiceWarningDecoder" method="decode" />
|
<bean ref="practiceWarningDecoder" method="decode" />
|
||||||
|
|
|
@ -25,8 +25,8 @@
|
||||||
<from uri="jms-generic:queue:practiceNotify" />
|
<from uri="jms-generic:queue:practiceNotify" />
|
||||||
<doTry>
|
<doTry>
|
||||||
<multicast parallelProcessing="false">
|
<multicast parallelProcessing="false">
|
||||||
<to uri="jms-warning:queue:edex.spcWatch" />
|
<to uri="jms-durable:queue:edex.spcWatch" />
|
||||||
<to uri="jms-warning:queue:edex.tpcWatch" />
|
<to uri="jms-durable:queue:edex.tpcWatch" />
|
||||||
</multicast>
|
</multicast>
|
||||||
<doCatch>
|
<doCatch>
|
||||||
<exception>java.lang.Throwable</exception>
|
<exception>java.lang.Throwable</exception>
|
||||||
|
|
|
@ -77,6 +77,7 @@ import com.raytheon.uf.edex.database.processor.IDatabaseProcessor;
|
||||||
* Dec 10, 2013 2555 rjpeter Initial creation.
|
* Dec 10, 2013 2555 rjpeter Initial creation.
|
||||||
* Jan 23, 2014 2555 rjpeter Updated to be a row at a time using ScrollableResults.
|
* Jan 23, 2014 2555 rjpeter Updated to be a row at a time using ScrollableResults.
|
||||||
* Feb 04, 2014 2770 rferrel The dumpPdos now dumps all PluginDataObjects.
|
* Feb 04, 2014 2770 rferrel The dumpPdos now dumps all PluginDataObjects.
|
||||||
|
* Feb 12, 2014 2784 rjpeter Update logging for dup elim scenarios.
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author rjpeter
|
* @author rjpeter
|
||||||
|
@ -194,6 +195,7 @@ public class DatabaseArchiveProcessor<T extends PersistableDataObject<?>>
|
||||||
if (entriesInMemory > 0) {
|
if (entriesInMemory > 0) {
|
||||||
try {
|
try {
|
||||||
savePdoMap(pdosByFile);
|
savePdoMap(pdosByFile);
|
||||||
|
pdosByFile.clear();
|
||||||
int prev = recordsSaved;
|
int prev = recordsSaved;
|
||||||
recordsSaved += entriesInMemory;
|
recordsSaved += entriesInMemory;
|
||||||
statusHandler.info(pluginName + ": Processed rows " + prev
|
statusHandler.info(pluginName + ": Processed rows " + prev
|
||||||
|
@ -436,74 +438,93 @@ public class DatabaseArchiveProcessor<T extends PersistableDataObject<?>>
|
||||||
}
|
}
|
||||||
|
|
||||||
List<PersistableDataObject<?>> pdosFromDisk = readDataFromDisk(dataFile);
|
List<PersistableDataObject<?>> pdosFromDisk = readDataFromDisk(dataFile);
|
||||||
if (statusHandler.isPriorityEnabled(Priority.DEBUG)) {
|
if (pdosFromDisk.size() > 0) {
|
||||||
statusHandler.debug(pluginName + ": Checking "
|
|
||||||
+ pdosFromDisk.size() + " old records from file: "
|
|
||||||
+ dataFile.getAbsolutePath());
|
|
||||||
}
|
|
||||||
Iterator<PersistableDataObject<?>> pdoIter = pdosFromDisk
|
|
||||||
.iterator();
|
|
||||||
boolean needsUpdate = false;
|
|
||||||
int dupsRemoved = 0;
|
|
||||||
int index = 0;
|
|
||||||
while (pdoIter.hasNext() && (index < dupElimUntil)) {
|
|
||||||
PersistableDataObject<?> pdo = pdoIter.next();
|
|
||||||
|
|
||||||
if (identifierSet.contains(pdo.getIdentifier())) {
|
|
||||||
pdoIter.remove();
|
|
||||||
needsUpdate = true;
|
|
||||||
dupsRemoved++;
|
|
||||||
}
|
|
||||||
|
|
||||||
index++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (statusHandler.isPriorityEnabled(Priority.DEBUG)
|
|
||||||
&& (dupsRemoved > 0)) {
|
|
||||||
statusHandler.debug(pluginName + ": Removed " + dupsRemoved
|
|
||||||
+ " old records from file: "
|
|
||||||
+ dataFile.getAbsolutePath());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!fileIter.hasNext() && (pdosFromDisk.size() < fetchSize)) {
|
|
||||||
// last file, add more data to it
|
|
||||||
needsUpdate = true;
|
|
||||||
|
|
||||||
if (prevFileStatus == null) {
|
|
||||||
prevFileStatus = new FileStatus();
|
|
||||||
prevFileStatus.dupElimUntilIndex = pdosFromDisk.size();
|
|
||||||
prevFileStatus.fileFull = pdos.size() >= fetchSize;
|
|
||||||
filesCreatedThisSession.put(dataFile.getAbsolutePath(),
|
|
||||||
prevFileStatus);
|
|
||||||
}
|
|
||||||
|
|
||||||
int numToAdd = fetchSize - pdosFromDisk.size();
|
|
||||||
numToAdd = Math.min(numToAdd, pdos.size());
|
|
||||||
|
|
||||||
if (statusHandler.isPriorityEnabled(Priority.DEBUG)) {
|
if (statusHandler.isPriorityEnabled(Priority.DEBUG)) {
|
||||||
statusHandler.debug(pluginName + ": Adding " + numToAdd
|
statusHandler.debug(pluginName + ": Checking "
|
||||||
+ " records to file: "
|
+ pdosFromDisk.size()
|
||||||
|
+ " old records from file: "
|
||||||
+ dataFile.getAbsolutePath());
|
+ dataFile.getAbsolutePath());
|
||||||
}
|
}
|
||||||
|
|
||||||
pdosFromDisk.addAll(pdos.subList(0, numToAdd));
|
Iterator<PersistableDataObject<?>> pdoIter = pdosFromDisk
|
||||||
if (numToAdd < pdos.size()) {
|
.iterator();
|
||||||
pdos = pdos.subList(numToAdd, pdos.size());
|
int dupsRemoved = 0;
|
||||||
} else {
|
int index = 0;
|
||||||
pdos = Collections.emptyList();
|
boolean needsUpdate = false;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (needsUpdate) {
|
while (pdoIter.hasNext() && (index < dupElimUntil)) {
|
||||||
if (!pdosFromDisk.isEmpty()) {
|
PersistableDataObject<?> pdo = pdoIter.next();
|
||||||
writeDataToDisk(dataFile, pdosFromDisk);
|
|
||||||
if (prevFileStatus != null) {
|
if (identifierSet.contains(pdo.getIdentifier())) {
|
||||||
prevFileStatus.fileFull = pdosFromDisk.size() >= fetchSize;
|
pdoIter.remove();
|
||||||
|
needsUpdate = true;
|
||||||
|
dupsRemoved++;
|
||||||
|
}
|
||||||
|
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dupsRemoved > 0) {
|
||||||
|
statusHandler.info(pluginName + ": Removed "
|
||||||
|
+ dupsRemoved + " old records from file: "
|
||||||
|
+ dataFile.getAbsolutePath());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!fileIter.hasNext()
|
||||||
|
&& (pdosFromDisk.size() < fetchSize)) {
|
||||||
|
// last file, add more data to it
|
||||||
|
needsUpdate = true;
|
||||||
|
|
||||||
|
if (prevFileStatus == null) {
|
||||||
|
prevFileStatus = new FileStatus();
|
||||||
|
prevFileStatus.dupElimUntilIndex = pdosFromDisk
|
||||||
|
.size();
|
||||||
|
prevFileStatus.fileFull = pdos.size() >= fetchSize;
|
||||||
|
filesCreatedThisSession.put(
|
||||||
|
dataFile.getAbsolutePath(), prevFileStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
int numToAdd = fetchSize - pdosFromDisk.size();
|
||||||
|
numToAdd = Math.min(numToAdd, pdos.size());
|
||||||
|
|
||||||
|
if (statusHandler.isPriorityEnabled(Priority.DEBUG)) {
|
||||||
|
statusHandler.debug(pluginName + ": Adding "
|
||||||
|
+ numToAdd + " records to file: "
|
||||||
|
+ dataFile.getAbsolutePath());
|
||||||
|
}
|
||||||
|
|
||||||
|
pdosFromDisk.addAll(pdos.subList(0, numToAdd));
|
||||||
|
if (numToAdd < pdos.size()) {
|
||||||
|
pdos = pdos.subList(numToAdd, pdos.size());
|
||||||
|
} else {
|
||||||
|
pdos = Collections.emptyList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needsUpdate) {
|
||||||
|
if (!pdosFromDisk.isEmpty()) {
|
||||||
|
writeDataToDisk(dataFile, pdosFromDisk);
|
||||||
|
if (prevFileStatus != null) {
|
||||||
|
prevFileStatus.fileFull = pdosFromDisk.size() >= fetchSize;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
dirsToCheckNumbering.add(dataFile.getParentFile());
|
||||||
|
if (dataFile.exists() && !dataFile.delete()) {
|
||||||
|
statusHandler
|
||||||
|
.error(pluginName
|
||||||
|
+ ": Failed to delete file ["
|
||||||
|
+ dataFile.getAbsolutePath()
|
||||||
|
+ "], all entries have been updated in later files.");
|
||||||
|
if (!dataFile.renameTo(new File(dataFile
|
||||||
|
.getAbsoluteFile() + ".bad"))) {
|
||||||
|
statusHandler.error(pluginName + ": file ["
|
||||||
|
+ dataFile.getAbsoluteFile()
|
||||||
|
+ "] cannot be renamed to .bad");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fileIter.remove();
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
dirsToCheckNumbering.add(dataFile.getParentFile());
|
|
||||||
dataFile.delete();
|
|
||||||
fileIter.remove();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -543,7 +564,13 @@ public class DatabaseArchiveProcessor<T extends PersistableDataObject<?>>
|
||||||
} finally {
|
} finally {
|
||||||
if (!successful) {
|
if (!successful) {
|
||||||
// couldn't read in file, move it to bad
|
// couldn't read in file, move it to bad
|
||||||
file.renameTo(new File(file.getAbsoluteFile() + ".bad"));
|
if (file.exists()
|
||||||
|
&& !file.renameTo(new File(file.getAbsoluteFile()
|
||||||
|
+ ".bad"))) {
|
||||||
|
statusHandler.error(pluginName + ": file ["
|
||||||
|
+ file.getAbsoluteFile()
|
||||||
|
+ "] cannot be renamed to .bad");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (is != null) {
|
if (is != null) {
|
||||||
try {
|
try {
|
||||||
|
@ -668,8 +695,9 @@ public class DatabaseArchiveProcessor<T extends PersistableDataObject<?>>
|
||||||
writer = new BufferedWriter(new FileWriter(dumpFile));
|
writer = new BufferedWriter(new FileWriter(dumpFile));
|
||||||
|
|
||||||
if (statusHandler.isPriorityEnabled(Priority.INFO)) {
|
if (statusHandler.isPriorityEnabled(Priority.INFO)) {
|
||||||
statusHandler.info(String.format("%s: Dumping records to: %s",
|
statusHandler.info(String.format("%s: Dumping " + pdos.size()
|
||||||
pluginName, dumpFile.getAbsolutePath()));
|
+ " records to: %s", pluginName,
|
||||||
|
dumpFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
while (pdoIter.hasNext()) {
|
while (pdoIter.hasNext()) {
|
||||||
|
@ -753,6 +781,8 @@ public class DatabaseArchiveProcessor<T extends PersistableDataObject<?>>
|
||||||
} while (size > 0);
|
} while (size > 0);
|
||||||
|
|
||||||
DecimalFormat format = new DecimalFormat(formatString.toString());
|
DecimalFormat format = new DecimalFormat(formatString.toString());
|
||||||
|
statusHandler.info("Checking file numbering consistency for "
|
||||||
|
+ dir.getAbsolutePath());
|
||||||
|
|
||||||
for (Map.Entry<Integer, File> entry : fileMap.entrySet()) {
|
for (Map.Entry<Integer, File> entry : fileMap.entrySet()) {
|
||||||
int fileNum = entry.getKey();
|
int fileNum = entry.getKey();
|
||||||
|
@ -771,7 +801,15 @@ public class DatabaseArchiveProcessor<T extends PersistableDataObject<?>>
|
||||||
}
|
}
|
||||||
|
|
||||||
File newFile = new File(oldFile.getParent(), newFileName);
|
File newFile = new File(oldFile.getParent(), newFileName);
|
||||||
oldFile.renameTo(newFile);
|
if (!oldFile.renameTo(newFile)) {
|
||||||
|
statusHandler
|
||||||
|
.error("Failed rename file "
|
||||||
|
+ oldFile.getAbsolutePath()
|
||||||
|
+ " to "
|
||||||
|
+ newFile.getAbsolutePath()
|
||||||
|
+ ". Stopping file number consistency checking.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nextFileCount++;
|
nextFileCount++;
|
||||||
|
|
|
@ -58,6 +58,7 @@ import com.raytheon.uf.edex.database.plugin.PluginFactory;
|
||||||
* Nov 05, 2013 2499 rjpeter Repackaged, removed config files, always compresses hdf5.
|
* Nov 05, 2013 2499 rjpeter Repackaged, removed config files, always compresses hdf5.
|
||||||
* Nov 11, 2013 2478 rjpeter Updated data store copy to always copy hdf5.
|
* Nov 11, 2013 2478 rjpeter Updated data store copy to always copy hdf5.
|
||||||
* Dec 13, 2013 2555 rjpeter Refactored logic into DatabaseArchiveProcessor.
|
* Dec 13, 2013 2555 rjpeter Refactored logic into DatabaseArchiveProcessor.
|
||||||
|
* Feb 12, 2014 2784 rjpeter Fixed clusterLock to not update the time by default.
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author rjpeter
|
* @author rjpeter
|
||||||
|
@ -145,14 +146,16 @@ public class DatabaseArchiver implements IPluginArchiver {
|
||||||
|
|
||||||
// cluster lock, grabbing time of last successful archive
|
// cluster lock, grabbing time of last successful archive
|
||||||
CurrentTimeClusterLockHandler lockHandler = new CurrentTimeClusterLockHandler(
|
CurrentTimeClusterLockHandler lockHandler = new CurrentTimeClusterLockHandler(
|
||||||
CLUSTER_LOCK_TIMEOUT, dateFormat.format(runTime.getTime()),
|
CLUSTER_LOCK_TIMEOUT, false);
|
||||||
false);
|
|
||||||
ClusterTask ct = ClusterLockUtils.lock(TASK_NAME, pluginName,
|
ClusterTask ct = ClusterLockUtils.lock(TASK_NAME, pluginName,
|
||||||
lockHandler, false);
|
lockHandler, false);
|
||||||
if (!LockState.SUCCESSFUL.equals(ct.getLockState())) {
|
if (!LockState.SUCCESSFUL.equals(ct.getLockState())) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// keep extra info the same until processing updates the time.
|
||||||
|
lockHandler.setExtraInfo(ct.getExtraInfo());
|
||||||
|
|
||||||
Calendar startTime = null;
|
Calendar startTime = null;
|
||||||
long timimgStartMillis = System.currentTimeMillis();
|
long timimgStartMillis = System.currentTimeMillis();
|
||||||
int recordCount = 0;
|
int recordCount = 0;
|
||||||
|
@ -226,12 +229,6 @@ public class DatabaseArchiver implements IPluginArchiver {
|
||||||
.info(pluginName + ": Found no records to archive");
|
.info(pluginName + ": Found no records to archive");
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
// previous run time needs to be reset
|
|
||||||
if (startTime != null) {
|
|
||||||
lockHandler
|
|
||||||
.setExtraInfo(dateFormat.format(startTime.getTime()));
|
|
||||||
}
|
|
||||||
|
|
||||||
statusHandler.error(pluginName + ": Error occurred archiving data",
|
statusHandler.error(pluginName + ": Error occurred archiving data",
|
||||||
e);
|
e);
|
||||||
} finally {
|
} finally {
|
||||||
|
|
|
@ -20,9 +20,9 @@
|
||||||
|
|
||||||
package com.raytheon.uf.edex.database;
|
package com.raytheon.uf.edex.database;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
@ -120,7 +120,7 @@ public class DatabaseSessionFactoryBean extends AnnotationSessionFactoryBean {
|
||||||
public void setDatabaseSessionConfiguration(
|
public void setDatabaseSessionConfiguration(
|
||||||
DatabaseSessionConfiguration databaseSessionConfiguration) {
|
DatabaseSessionConfiguration databaseSessionConfiguration) {
|
||||||
// make own copy so can modify it
|
// make own copy so can modify it
|
||||||
List<Class<?>> annotatedClasses = new ArrayList<Class<?>>(
|
List<Class<?>> annotatedClasses = new LinkedList<Class<?>>(
|
||||||
databaseSessionConfiguration.getAnnotatedClasses());
|
databaseSessionConfiguration.getAnnotatedClasses());
|
||||||
|
|
||||||
if (databaseSessionConfiguration != null) {
|
if (databaseSessionConfiguration != null) {
|
||||||
|
|
|
@ -3,21 +3,6 @@
|
||||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
|
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
|
||||||
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
|
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
|
||||||
|
|
||||||
<bean id="jmsIngestHarvesterConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
|
||||||
factory-bean="jmsGenericConfig" factory-method="copy">
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<bean id="jms-harvester" class="org.apache.camel.component.jms.JmsComponent">
|
|
||||||
<constructor-arg ref="jmsIngestHarvesterConfig" />
|
|
||||||
<property name="taskExecutor" ref="harvesterThreadPool" />
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<bean id="harvesterThreadPool"
|
|
||||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
|
||||||
<property name="corePoolSize" value="${metadata-process.threads}" />
|
|
||||||
<property name="maxPoolSize" value="${metadata-process.threads}" />
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<bean id="crawlerCommunicationStrategy" class="com.raytheon.uf.edex.datadelivery.harvester.crawler.FileCommunicationStrategy" />
|
<bean id="crawlerCommunicationStrategy" class="com.raytheon.uf.edex.datadelivery.harvester.crawler.FileCommunicationStrategy" />
|
||||||
|
|
||||||
<bean id="MetaDataProcessor" class="com.raytheon.uf.edex.datadelivery.harvester.CrawlMetaDataHandler" depends-on="registryInit">
|
<bean id="MetaDataProcessor" class="com.raytheon.uf.edex.datadelivery.harvester.CrawlMetaDataHandler" depends-on="registryInit">
|
||||||
|
@ -30,11 +15,11 @@
|
||||||
errorHandlerRef="errorHandler">
|
errorHandlerRef="errorHandler">
|
||||||
|
|
||||||
<endpoint id="metaDataCron" uri="quartz://datadelivery/harvester/?cron=${metadata-process.cron}"/>
|
<endpoint id="metaDataCron" uri="quartz://datadelivery/harvester/?cron=${metadata-process.cron}"/>
|
||||||
<endpoint id="harvesterProcessWorkEndpoint" uri="jms-harvester:queue:metaDataProcessWork?concurrentConsumers=${metadata-process.threads}"/>
|
<endpoint id="harvesterProcessWorkEndpoint" uri="jms-generic:queue:metaDataProcessWork?concurrentConsumers=${metadata-process.threads}&threadName=harvester"/>
|
||||||
|
|
||||||
<route id="metaDataProcess">
|
<route id="metaDataProcess">
|
||||||
<from uri="metaDataCron" />
|
<from uri="metaDataCron" />
|
||||||
<to uri="jms-harvester:queue:metaDataProcessWork" />
|
<to uri="jms-generic:queue:metaDataProcessWork" />
|
||||||
</route>
|
</route>
|
||||||
|
|
||||||
<route id="metaDataProcessWork">
|
<route id="metaDataProcessWork">
|
||||||
|
|
|
@ -8,19 +8,6 @@
|
||||||
<bean id="handleoupDistributionSrv" class="com.raytheon.uf.edex.distribution.DistributionSrv" />
|
<bean id="handleoupDistributionSrv" class="com.raytheon.uf.edex.distribution.DistributionSrv" />
|
||||||
<bean id="radarserverDistributionSrv" class="com.raytheon.uf.edex.distribution.DistributionSrv" />
|
<bean id="radarserverDistributionSrv" class="com.raytheon.uf.edex.distribution.DistributionSrv" />
|
||||||
|
|
||||||
<bean id="jms-dist" class="org.apache.camel.component.jms.JmsComponent">
|
|
||||||
<!-- All initial distribution queues are durable -->
|
|
||||||
<constructor-arg ref="jmsDistConfig" />
|
|
||||||
<property name="taskExecutor" ref="distributionThreadPool" />
|
|
||||||
</bean>
|
|
||||||
<bean id="jmsDistConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
|
||||||
factory-bean="jmsDurableConfig" factory-method="copy"/>
|
|
||||||
<bean id="distributionThreadPool"
|
|
||||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
|
||||||
<property name="corePoolSize" value="7" />
|
|
||||||
<property name="maxPoolSize" value="7" />
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<camelContext id="distro"
|
<camelContext id="distro"
|
||||||
xmlns="http://camel.apache.org/schema/spring"
|
xmlns="http://camel.apache.org/schema/spring"
|
||||||
errorHandlerRef="errorHandler"
|
errorHandlerRef="errorHandler"
|
||||||
|
@ -29,7 +16,7 @@
|
||||||
<endpoint id="refreshDistributionCron" uri="quartz://refreshDist/refreshDistRoute/?cron=${distribution.cron}"/>
|
<endpoint id="refreshDistributionCron" uri="quartz://refreshDist/refreshDistRoute/?cron=${distribution.cron}"/>
|
||||||
|
|
||||||
<route id="distribution">
|
<route id="distribution">
|
||||||
<from uri="jms-dist:queue:external.dropbox?concurrentConsumers=5&maxConcurrentConsumers=5"/>
|
<from uri="jms-durable:queue:external.dropbox?concurrentConsumers=5&maxConcurrentConsumers=5"/>
|
||||||
<doTry>
|
<doTry>
|
||||||
<bean ref="distributionSrv" method="route" />
|
<bean ref="distributionSrv" method="route" />
|
||||||
<doCatch>
|
<doCatch>
|
||||||
|
@ -40,7 +27,7 @@
|
||||||
</route>
|
</route>
|
||||||
|
|
||||||
<route id="handleoupDistribution">
|
<route id="handleoupDistribution">
|
||||||
<from uri="jms-dist:queue:handleoup.dropbox"/>
|
<from uri="jms-durable:queue:handleoup.dropbox"/>
|
||||||
<doTry>
|
<doTry>
|
||||||
<bean ref="handleoupDistributionSrv" method="route" />
|
<bean ref="handleoupDistributionSrv" method="route" />
|
||||||
<doCatch>
|
<doCatch>
|
||||||
|
@ -51,7 +38,7 @@
|
||||||
</route>
|
</route>
|
||||||
|
|
||||||
<route id="radarserverDistribution">
|
<route id="radarserverDistribution">
|
||||||
<from uri="jms-dist:queue:radarserver.dropbox" />
|
<from uri="jms-durable:queue:radarserver.dropbox" />
|
||||||
<doTry>
|
<doTry>
|
||||||
<bean ref="radarserverDistributionSrv" method="route" />
|
<bean ref="radarserverDistributionSrv" method="route" />
|
||||||
<doCatch>
|
<doCatch>
|
||||||
|
|
|
@ -0,0 +1,101 @@
|
||||||
|
/**
|
||||||
|
* This software was developed and / or modified by Raytheon Company,
|
||||||
|
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
|
||||||
|
*
|
||||||
|
* U.S. EXPORT CONTROLLED TECHNICAL DATA
|
||||||
|
* This software product contains export-restricted data whose
|
||||||
|
* export/transfer/disclosure is restricted by U.S. law. Dissemination
|
||||||
|
* to non-U.S. persons whether in the United States or abroad requires
|
||||||
|
* an export license or other authorization.
|
||||||
|
*
|
||||||
|
* Contractor Name: Raytheon Company
|
||||||
|
* Contractor Address: 6825 Pine Street, Suite 340
|
||||||
|
* Mail Stop B8
|
||||||
|
* Omaha, NE 68106
|
||||||
|
* 402.291.0100
|
||||||
|
*
|
||||||
|
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
|
||||||
|
* further licensing information.
|
||||||
|
**/
|
||||||
|
package com.raytheon.uf.edex.esb.camel.jms;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.camel.Endpoint;
|
||||||
|
import org.apache.camel.component.jms.JmsComponent;
|
||||||
|
import org.apache.camel.component.jms.JmsEndpoint;
|
||||||
|
|
||||||
|
import com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom JMS component that makes dedicated thread pools for each JmsEndpoint
|
||||||
|
* based on the concurrent consumers needed. Each pool is named based on the JMS
|
||||||
|
* endpoint. Each endpoint also overrides the message listener container factory
|
||||||
|
* to monitor the created containers to see if they need to be restarted in a
|
||||||
|
* disconnect scenario.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
*
|
||||||
|
* SOFTWARE HISTORY
|
||||||
|
* Date Ticket# Engineer Description
|
||||||
|
* ------------ ---------- ----------- --------------------------
|
||||||
|
* Feb 07, 2014 2357 rjpeter Initial creation.
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @author rjpeter
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
public class DedicatedThreadJmsComponent extends JmsComponent {
|
||||||
|
|
||||||
|
public DedicatedThreadJmsComponent(
|
||||||
|
org.apache.camel.component.jms.JmsConfiguration jmsconfig) {
|
||||||
|
super(jmsconfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see
|
||||||
|
* org.apache.camel.component.jms.JmsComponent#createEndpoint(java.lang.
|
||||||
|
* String, java.lang.String, java.util.Map)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected Endpoint createEndpoint(String uri, String remaining,
|
||||||
|
Map<String, Object> parameters) throws Exception {
|
||||||
|
String threadName = (String) parameters.remove("threadName");
|
||||||
|
Endpoint e = super.createEndpoint(uri, remaining, parameters);
|
||||||
|
if (e instanceof JmsEndpoint) {
|
||||||
|
JmsEndpoint jmsE = (JmsEndpoint) e;
|
||||||
|
if ((threadName != null) && (threadName.length() > 0)
|
||||||
|
&& !threadName.endsWith("-")) {
|
||||||
|
threadName += "-";
|
||||||
|
} else {
|
||||||
|
threadName = jmsE.getDestinationName() + "-";
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* This is used for a SimpleMessageListenerContainer use case.
|
||||||
|
*
|
||||||
|
* JmsSimpleMessageListenerTaskExecutor executor = new
|
||||||
|
* JmsSimpleMessageListenerTaskExecutor(
|
||||||
|
* jmsE.getConcurrentConsumers(), threadName);
|
||||||
|
*/
|
||||||
|
// DefaultMessageListenerContainer use case
|
||||||
|
JmsThreadPoolTaskExecutor executor = new JmsThreadPoolTaskExecutor();
|
||||||
|
executor.setThreadNamePrefix(threadName);
|
||||||
|
executor.setCorePoolSize(jmsE.getConcurrentConsumers());
|
||||||
|
executor.setMaxPoolSize(Math.max(jmsE.getConcurrentConsumers(),
|
||||||
|
jmsE.getMaxConcurrentConsumers()));
|
||||||
|
executor.setQueueCapacity(0);
|
||||||
|
executor.afterPropertiesSet();
|
||||||
|
|
||||||
|
jmsE.setTaskExecutor(executor);
|
||||||
|
jmsE.setMessageListenerContainerFactory(MonitoredDefaultMessageListenerContainerFactory
|
||||||
|
.getInstance());
|
||||||
|
|
||||||
|
return jmsE;
|
||||||
|
}
|
||||||
|
throw new Exception(
|
||||||
|
"JmsComponent did not create a JmsEnpoint. Check Camel Jms Override");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,142 @@
|
||||||
|
/**
|
||||||
|
* This software was developed and / or modified by Raytheon Company,
|
||||||
|
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
|
||||||
|
*
|
||||||
|
* U.S. EXPORT CONTROLLED TECHNICAL DATA
|
||||||
|
* This software product contains export-restricted data whose
|
||||||
|
* export/transfer/disclosure is restricted by U.S. law. Dissemination
|
||||||
|
* to non-U.S. persons whether in the United States or abroad requires
|
||||||
|
* an export license or other authorization.
|
||||||
|
*
|
||||||
|
* Contractor Name: Raytheon Company
|
||||||
|
* Contractor Address: 6825 Pine Street, Suite 340
|
||||||
|
* Mail Stop B8
|
||||||
|
* Omaha, NE 68106
|
||||||
|
* 402.291.0100
|
||||||
|
*
|
||||||
|
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
|
||||||
|
* further licensing information.
|
||||||
|
**/
|
||||||
|
package com.raytheon.uf.edex.esb.camel.jms;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
import org.apache.camel.component.jms.DefaultJmsMessageListenerContainer;
|
||||||
|
import org.apache.camel.component.jms.JmsEndpoint;
|
||||||
|
import org.apache.camel.component.jms.MessageListenerContainerFactory;
|
||||||
|
import org.springframework.jms.listener.AbstractMessageListenerContainer;
|
||||||
|
import org.springframework.jms.listener.DefaultMessageListenerContainer;
|
||||||
|
|
||||||
|
import com.raytheon.uf.common.status.IUFStatusHandler;
|
||||||
|
import com.raytheon.uf.common.status.UFStatus;
|
||||||
|
import com.raytheon.uf.common.time.util.TimeUtil;
|
||||||
|
import com.raytheon.uf.edex.core.EDEXUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates DefaultMessageListenerContainer instances that are then monitored
|
||||||
|
* once a minute for paused tasks. If a paused task is found the container is
|
||||||
|
* restarted. This is necessary in broker restart scenarios.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
*
|
||||||
|
* SOFTWARE HISTORY
|
||||||
|
*
|
||||||
|
* Date Ticket# Engineer Description
|
||||||
|
* ------------ ---------- ----------- --------------------------
|
||||||
|
* Feb 8, 2014 2357 rjpeter Initial creation.
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @author rjpeter
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
public class MonitoredDefaultMessageListenerContainerFactory implements
|
||||||
|
MessageListenerContainerFactory {
|
||||||
|
private static final AtomicInteger threadCount = new AtomicInteger(1);
|
||||||
|
|
||||||
|
private final Collection<DefaultJmsMessageListenerContainer> containers = new ConcurrentLinkedQueue<DefaultJmsMessageListenerContainer>();
|
||||||
|
|
||||||
|
private final IUFStatusHandler statusHandler = UFStatus
|
||||||
|
.getHandler(MonitoredDefaultMessageListenerContainerFactory.class);
|
||||||
|
|
||||||
|
private static final MonitoredDefaultMessageListenerContainerFactory instance = new MonitoredDefaultMessageListenerContainerFactory();
|
||||||
|
|
||||||
|
public static MonitoredDefaultMessageListenerContainerFactory getInstance() {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
private MonitoredDefaultMessageListenerContainerFactory() {
|
||||||
|
Thread containerChecker = new Thread("MessageListenerContainerMonitor-"
|
||||||
|
+ threadCount.getAndIncrement()) {
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see java.lang.Thread#run()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
while (!EDEXUtil.isRunning()) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(TimeUtil.MILLIS_PER_MINUTE);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
try {
|
||||||
|
for (DefaultMessageListenerContainer container : containers) {
|
||||||
|
if (container.getPausedTaskCount() > 0) {
|
||||||
|
StringBuilder msg = new StringBuilder(160);
|
||||||
|
msg.append("Container[")
|
||||||
|
.append(container.getDestinationName())
|
||||||
|
.append("] has paused tasks. Container is ");
|
||||||
|
if (!container.isRunning()) {
|
||||||
|
msg.append("not ");
|
||||||
|
}
|
||||||
|
msg.append("running. Container is ");
|
||||||
|
if (container.isActive()) {
|
||||||
|
msg.append("not ");
|
||||||
|
}
|
||||||
|
msg.append("active. Restarting container.");
|
||||||
|
statusHandler.warn(msg.toString());
|
||||||
|
container.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
Thread.sleep(TimeUtil.MILLIS_PER_MINUTE);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
} catch (Throwable e) {
|
||||||
|
statusHandler
|
||||||
|
.error("Error occurred in checking message listener containers",
|
||||||
|
e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
containerChecker.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.apache.camel.component.jms.MessageListenerContainerFactory#
|
||||||
|
* createMessageListenerContainer
|
||||||
|
* (org.apache.camel.component.jms.JmsEndpoint)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public AbstractMessageListenerContainer createMessageListenerContainer(
|
||||||
|
JmsEndpoint endpoint) {
|
||||||
|
// track the container for monitoring in the case of a provider
|
||||||
|
// reconnect
|
||||||
|
DefaultJmsMessageListenerContainer container = new DefaultJmsMessageListenerContainer(
|
||||||
|
endpoint);
|
||||||
|
containers.add(container);
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,21 +0,0 @@
|
||||||
<beans
|
|
||||||
xmlns="http://www.springframework.org/schema/beans"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.springframework.org/schema/beans
|
|
||||||
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
|
|
||||||
|
|
||||||
<bean id="jms-notify" class="org.apache.camel.component.jms.JmsComponent">
|
|
||||||
<constructor-arg ref="jmsIngestNotifyConfig" />
|
|
||||||
<property name="taskExecutor" ref="notifyThreadPool" />
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<bean id="jmsIngestNotifyConfig" class="org.apache.camel.component.jms.JmsConfiguration"
|
|
||||||
factory-bean="jmsConfig" factory-method="copy">
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<bean id="notifyThreadPool"
|
|
||||||
class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor">
|
|
||||||
<property name="corePoolSize" value="1" />
|
|
||||||
<property name="maxPoolSize" value="1" />
|
|
||||||
</bean>
|
|
||||||
</beans>
|
|
|
@ -13,7 +13,7 @@
|
||||||
<!-- Begin Grid Process Route -->
|
<!-- Begin Grid Process Route -->
|
||||||
<route id="gridStaticDataGenerationRoute">
|
<route id="gridStaticDataGenerationRoute">
|
||||||
<!-- Fed from plugin notification -->
|
<!-- Fed from plugin notification -->
|
||||||
<from uri="vm:grid-staticdata-generate" />
|
<from uri="jms-durable:grid-staticdata-generate" />
|
||||||
<doTry>
|
<doTry>
|
||||||
<bean ref="staticDataGenerator" method="processNotification"/>
|
<bean ref="staticDataGenerator" method="processNotification"/>
|
||||||
<to uri="direct-vm:stageNotification"/>
|
<to uri="direct-vm:stageNotification"/>
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
<pluginNotificationList>
|
<pluginNotificationList>
|
||||||
<pluginNotification>
|
<pluginNotification>
|
||||||
<endpointName>grid-staticdata-generate</endpointName>
|
<endpointName>grid-staticdata-generate</endpointName>
|
||||||
<endpointType>VM</endpointType>
|
<endpointType>QUEUE</endpointType>
|
||||||
<format>DATAURI</format>
|
<format>DATAURI</format>
|
||||||
|
<durable>true</durable>
|
||||||
|
<timeToLive>600000</timeToLive>
|
||||||
<metadataMap>
|
<metadataMap>
|
||||||
<mapping key="pluginName">
|
<mapping key="pluginName">
|
||||||
<constraint constraintValue="grid" constraintType="EQUALS"/>
|
<constraint constraintValue="grid" constraintType="EQUALS"/>
|
||||||
|
|
|
@ -9,13 +9,13 @@
|
||||||
<bean id="dpaDistRegistry" factory-bean="distributionSrv"
|
<bean id="dpaDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="dpa" />
|
<constructor-arg value="dpa" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.dpa"/>
|
<constructor-arg value="jms-durable:queue:Ingest.dpa"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="dpaRadarServerDistRegistry" factory-bean="radarserverDistributionSrv"
|
<bean id="dpaRadarServerDistRegistry" factory-bean="radarserverDistributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="dpa" />
|
<constructor-arg value="dpa" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.dpa"/>
|
<constructor-arg value="jms-durable:queue:Ingest.dpa"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<camelContext id="dpa-camel"
|
<camelContext id="dpa-camel"
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
<bean id="arealffgDistRegistry" class="com.raytheon.uf.edex.distribution.DistributionSrv"
|
<bean id="arealffgDistRegistry" class="com.raytheon.uf.edex.distribution.DistributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="arealffg" />
|
<constructor-arg value="arealffg" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.arealffg" />
|
<constructor-arg value="jms-durable:queue:Ingest.arealffg" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<camelContext id="arealffg-camel"
|
<camelContext id="arealffg-camel"
|
||||||
|
|
|
@ -9,13 +9,13 @@
|
||||||
<bean id="dhrDistRegistry" factory-bean="distributionSrv"
|
<bean id="dhrDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="dhr" />
|
<constructor-arg value="dhr" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.dhr"/>
|
<constructor-arg value="jms-durable:queue:Ingest.dhr"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="dhrRadarServerDistRegistry" factory-bean="radarserverDistributionSrv"
|
<bean id="dhrRadarServerDistRegistry" factory-bean="radarserverDistributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="dhr" />
|
<constructor-arg value="dhr" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.dhr"/>
|
<constructor-arg value="jms-durable:queue:Ingest.dhr"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<camelContext id="nonClusteredDHRroutes" xmlns="http://camel.apache.org/schema/spring"
|
<camelContext id="nonClusteredDHRroutes" xmlns="http://camel.apache.org/schema/spring"
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
|
||||||
|
|
||||||
|
<!-- IHFS Database Configuration-->
|
||||||
|
<bean id="ihfsDbSessionConfig" class="com.raytheon.uf.edex.database.DatabaseSessionConfiguration">
|
||||||
|
<property name="classFinder" ref="dbClassFinder"/>
|
||||||
|
<property name="includes">
|
||||||
|
<list>
|
||||||
|
<value>com.raytheon.uf.common.dataplugin.shef</value>
|
||||||
|
<value>com.raytheon.edex.plugin.shef</value>
|
||||||
|
</list>
|
||||||
|
</property>
|
||||||
|
</bean>
|
||||||
|
<bean id="ihfsSessionFactory"
|
||||||
|
class="com.raytheon.uf.edex.database.DatabaseSessionFactoryBean">
|
||||||
|
|
||||||
|
<property name="configLocation">
|
||||||
|
<value>file:///${edex.home}/conf/db/hibernateConfig/ihfs/hibernate.cfg.xml</value>
|
||||||
|
</property>
|
||||||
|
<property name="databaseSessionConfiguration" ref="ihfsDbSessionConfig"/>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<bean id="ihfsTxManager"
|
||||||
|
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
|
||||||
|
<property name="sessionFactory" ref="ihfsSessionFactory" />
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<!-- Dam Catalog Database Configuration-->
|
||||||
|
<bean id="damSessionFactory"
|
||||||
|
class="com.raytheon.uf.edex.database.DatabaseSessionFactoryBean">
|
||||||
|
<!-- No hibernate annotations should be loaded -->
|
||||||
|
<property name="configLocation">
|
||||||
|
<value>file:///${edex.home}/conf/db/hibernateConfig/damCatalog/hibernate.cfg.xml</value>
|
||||||
|
</property>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<bean id="damTxManager"
|
||||||
|
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
|
||||||
|
<property name="sessionFactory" ref="damSessionFactory" />
|
||||||
|
</bean>
|
||||||
|
</beans>
|
|
@ -1,45 +1,6 @@
|
||||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
|
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
|
||||||
|
|
||||||
<!-- IHFS Database Configuration-->
|
|
||||||
<bean id="ihfsDbSessionConfig" class="com.raytheon.uf.edex.database.DatabaseSessionConfiguration">
|
|
||||||
<property name="classFinder" ref="dbClassFinder" />
|
|
||||||
<property name="includes">
|
|
||||||
<list>
|
|
||||||
<value>com.raytheon.uf.common.dataplugin.shef</value>
|
|
||||||
<value>com.raytheon.edex.plugin.shef</value>
|
|
||||||
</list>
|
|
||||||
</property>
|
|
||||||
</bean>
|
|
||||||
<bean id="ihfsSessionFactory"
|
|
||||||
class="com.raytheon.uf.edex.database.DatabaseSessionFactoryBean">
|
|
||||||
|
|
||||||
<property name="configLocation">
|
|
||||||
<value>file:///${edex.home}/conf/db/hibernateConfig/ihfs/hibernate.cfg.xml</value>
|
|
||||||
</property>
|
|
||||||
<property name="databaseSessionConfiguration" ref="ihfsDbSessionConfig"/>
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<bean id="ihfsTxManager"
|
|
||||||
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
|
|
||||||
<property name="sessionFactory" ref="ihfsSessionFactory" />
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<!-- Dam Catalog Database Configuration-->
|
|
||||||
<bean id="damSessionFactory"
|
|
||||||
class="com.raytheon.uf.edex.database.DatabaseSessionFactoryBean">
|
|
||||||
<!-- No hibernate annotations should be loaded -->
|
|
||||||
<property name="configLocation">
|
|
||||||
<value>file:///${edex.home}/conf/db/hibernateConfig/damCatalog/hibernate.cfg.xml</value>
|
|
||||||
</property>
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<bean id="damTxManager"
|
|
||||||
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
|
|
||||||
<property name="sessionFactory" ref="damSessionFactory" />
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<bean id="mpeFieldGenService" class="com.raytheon.uf.edex.ohd.pproc.MpeFieldGenSrv" />
|
<bean id="mpeFieldGenService" class="com.raytheon.uf.edex.ohd.pproc.MpeFieldGenSrv" />
|
||||||
|
|
||||||
<bean factory-bean="manualProc"
|
<bean factory-bean="manualProc"
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
<bean id="q2DistRegistry" factory-bean="distributionSrv"
|
<bean id="q2DistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="q2" />
|
<constructor-arg value="q2" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.q2"/>
|
<constructor-arg value="jms-durable:queue:Ingest.q2"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<camelContext id="q2Proc-context"
|
<camelContext id="q2Proc-context"
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
<bean id="acarsDistRegistry" factory-bean="distributionSrv"
|
<bean id="acarsDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg ref="acarsPluginName" />
|
<constructor-arg ref="acarsPluginName" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.acars"/>
|
<constructor-arg value="jms-durable:queue:Ingest.acars"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="acarsCamelRegistered" factory-bean="contextManager"
|
<bean id="acarsCamelRegistered" factory-bean="contextManager"
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
<bean id="bufrascatDistRegistry" factory-bean="distributionSrv"
|
<bean id="bufrascatDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="bufrascat" />
|
<constructor-arg value="bufrascat" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.bufrascat" />
|
<constructor-arg value="jms-durable:queue:Ingest.bufrascat" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="bufrascatCamelRegistered" factory-bean="contextManager"
|
<bean id="bufrascatCamelRegistered" factory-bean="contextManager"
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
<bean id="bufrhdwDistRegistry" factory-bean="distributionSrv"
|
<bean id="bufrhdwDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg ref="bufrhdwPluginName" />
|
<constructor-arg ref="bufrhdwPluginName" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.bufrhdw"/>
|
<constructor-arg value="jms-durable:queue:Ingest.bufrhdw"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="bufrhdwCamelRegistered" factory-bean="contextManager"
|
<bean id="bufrhdwCamelRegistered" factory-bean="contextManager"
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
<bean id="bufrmthdwDistRegistry" factory-bean="distributionSrv"
|
<bean id="bufrmthdwDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg ref="bufrmthdwPluginName" />
|
<constructor-arg ref="bufrmthdwPluginName" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.bufrmthdw"/>
|
<constructor-arg value="jms-durable:queue:Ingest.bufrmthdw"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="bufrmthdwCamelRegistered" factory-bean="contextManager"
|
<bean id="bufrmthdwCamelRegistered" factory-bean="contextManager"
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
<bean id="bufrncwfDistRegistry" factory-bean="distributionSrv"
|
<bean id="bufrncwfDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg ref="bufrncwfPluginName" />
|
<constructor-arg ref="bufrncwfPluginName" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.bufrncwf"/>
|
<constructor-arg value="jms-durable:queue:Ingest.bufrncwf"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="bufrncwfCamelRegistered" factory-bean="contextManager"
|
<bean id="bufrncwfCamelRegistered" factory-bean="contextManager"
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
<bean id="bufrquikscatDistRegistry" factory-bean="distributionSrv"
|
<bean id="bufrquikscatDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg ref="bufrquikscatPluginName" />
|
<constructor-arg ref="bufrquikscatPluginName" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.bufrquikscat"/>
|
<constructor-arg value="jms-durable:queue:Ingest.bufrquikscat"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="bufrquikscatCamelRegistered" factory-bean="contextManager"
|
<bean id="bufrquikscatCamelRegistered" factory-bean="contextManager"
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
<bean id="bufrsigwxDistRegistry" factory-bean="distributionSrv"
|
<bean id="bufrsigwxDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg ref="bufrsigwxPluginName" />
|
<constructor-arg ref="bufrsigwxPluginName" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.bufrsigwx" />
|
<constructor-arg value="jms-durable:queue:Ingest.bufrsigwx" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="bufrsigwxCamelRegistered" factory-bean="contextManager"
|
<bean id="bufrsigwxCamelRegistered" factory-bean="contextManager"
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
<bean id="bufrssmiDistRegistry" factory-bean="distributionSrv"
|
<bean id="bufrssmiDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg ref="bufrssmiPluginName" />
|
<constructor-arg ref="bufrssmiPluginName" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.bufrssmi"/>
|
<constructor-arg value="jms-durable:queue:Ingest.bufrssmi"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="bufrssmiCamelRegistered" factory-bean="contextManager"
|
<bean id="bufrssmiCamelRegistered" factory-bean="contextManager"
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
<bean id="cwaDistRegistry" factory-bean="distributionSrv"
|
<bean id="cwaDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg ref="cwaPluginName" />
|
<constructor-arg ref="cwaPluginName" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.cwa" />
|
<constructor-arg value="jms-durable:queue:Ingest.cwa" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="cwaCamelRegistered" factory-bean="contextManager"
|
<bean id="cwaCamelRegistered" factory-bean="contextManager"
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<bean factory-bean="distributionSrv" factory-method="register">
|
<bean factory-bean="distributionSrv" factory-method="register">
|
||||||
<constructor-arg ref="dataDeliveryRetrievalPluginName" />
|
<constructor-arg ref="dataDeliveryRetrievalPluginName" />
|
||||||
<constructor-arg
|
<constructor-arg
|
||||||
value="jms-dist:queue:dataDeliveryRetrievalProcess?destinationResolver=#qpidDurableResolver" />
|
value="jms-durable:queue:dataDeliveryRetrievalProcess"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
</beans>
|
</beans>
|
|
@ -15,7 +15,7 @@
|
||||||
<bean id="ldadmesonetDistRegistry" factory-bean="distributionSrv"
|
<bean id="ldadmesonetDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg value="ldadmesonet" />
|
<constructor-arg value="ldadmesonet" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.ldadmesonet"/>
|
<constructor-arg value="jms-durable:queue:Ingest.ldadmesonet"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="ldadmesonetPointData" class="com.raytheon.uf.common.dataplugin.ldadmesonet.LdadmesonetPointDataTransform"/>
|
<bean id="ldadmesonetPointData" class="com.raytheon.uf.common.dataplugin.ldadmesonet.LdadmesonetPointDataTransform"/>
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
<bean id="loctablesDistRegistry" factory-bean="distributionSrv"
|
<bean id="loctablesDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg ref="loctablesPluginName" />
|
<constructor-arg ref="loctablesPluginName" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.loctables" />
|
<constructor-arg value="jms-durable:queue:Ingest.loctables" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<camelContext id="loctables-camel"
|
<camelContext id="loctables-camel"
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
<bean id="lsrDistRegistry" factory-bean="distributionSrv"
|
<bean id="lsrDistRegistry" factory-bean="distributionSrv"
|
||||||
factory-method="register">
|
factory-method="register">
|
||||||
<constructor-arg ref="lclstrmrptPluginName" />
|
<constructor-arg ref="lclstrmrptPluginName" />
|
||||||
<constructor-arg value="jms-dist:queue:Ingest.lsr" />
|
<constructor-arg value="jms-durable:queue:Ingest.lsr" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="lclstrmrptCamelRegistered" factory-bean="contextManager"
|
<bean id="lclstrmrptCamelRegistered" factory-bean="contextManager"
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue