12.11.1-3 baseline
Former-commit-id:a65c057df5
[formerly196afa0e5f
] [formerly2d0c424713
] [formerlya65c057df5
[formerly196afa0e5f
] [formerly2d0c424713
] [formerly5d796f775c
[formerly2d0c424713
[formerly 33ddeff32d02d6302c7e9e61a3b5d8cbf0440b86]]]] Former-commit-id:5d796f775c
Former-commit-id:7fcbb49a3e
[formerly725b2f8ba5
] [formerly 0e268084394b033a5de6dba694d14423a1da3040 [formerly5723fb0031
]] Former-commit-id: eaae8c3b883f287ffd1c17522c62444fa45a6410 [formerlybf1f88482b
] Former-commit-id:c25ebcdc41
This commit is contained in:
parent
75d99f4e93
commit
e42c12350b
36 changed files with 842 additions and 477 deletions
|
@ -71,6 +71,8 @@ import com.vividsolutions.jts.geom.Coordinate;
|
||||||
* Feb 04, 2011 7953 bkowal Fill values will now be placed
|
* Feb 04, 2011 7953 bkowal Fill values will now be placed
|
||||||
* in the data array for anything
|
* in the data array for anything
|
||||||
* below 300MB for RUC80.
|
* below 300MB for RUC80.
|
||||||
|
* Oct 2, 2012 DR 15259 M.Porricelli Allow plotting when 3 levels
|
||||||
|
* available (DGEX)
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -145,7 +147,7 @@ public class GribCSAdapter extends AbstractCrossSectionAdapter<GribRecord> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xMap.size() < 4) {
|
if (xMap.size() < 3) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -159,7 +161,7 @@ public class GribCSAdapter extends AbstractCrossSectionAdapter<GribRecord> {
|
||||||
xMap.keySet().retainAll(yMap.keySet());
|
xMap.keySet().retainAll(yMap.keySet());
|
||||||
yMap.keySet().retainAll(xMap.keySet());
|
yMap.keySet().retainAll(xMap.keySet());
|
||||||
|
|
||||||
if (xMap.size() < 4) {
|
if (xMap.size() < 3) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,7 @@ import com.raytheon.viz.core.gl.SharedCoordMap.SharedCoordinateKey;
|
||||||
*
|
*
|
||||||
* SOFTWARE HISTORY Date Ticket# Engineer Description ------------ ----------
|
* SOFTWARE HISTORY Date Ticket# Engineer Description ------------ ----------
|
||||||
* ----------- -------------------------- Jun 10, 2010 mschenke Initial creation
|
* ----------- -------------------------- Jun 10, 2010 mschenke Initial creation
|
||||||
*
|
* OCT 09, 2012 15018 kshresth
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author mschenke
|
* @author mschenke
|
||||||
|
@ -408,6 +408,12 @@ public class RadarRadialMesh extends AbstractGLMesh {
|
||||||
if (jStart == null) {
|
if (jStart == null) {
|
||||||
jStart = 0;
|
jStart = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//check if numBins and numRadials equals to zero, then angleData does not exist
|
||||||
|
if (numBins == 0 && numRadials == 0 ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
float[] angleData = radarData.getAngleData();
|
float[] angleData = radarData.getAngleData();
|
||||||
CacheKey key = new CacheKey(latitude, longitude, numBins, numRadials,
|
CacheKey key = new CacheKey(latitude, longitude, numBins, numRadials,
|
||||||
gateResolution, trueElevationAngle, jStart, angleData,
|
gateResolution, trueElevationAngle, jStart, angleData,
|
||||||
|
|
|
@ -10,6 +10,18 @@ import java.util.List;
|
||||||
import com.raytheon.uf.viz.xy.graph.IGraph;
|
import com.raytheon.uf.viz.xy.graph.IGraph;
|
||||||
import com.raytheon.viz.core.graphing.xy.XYData;
|
import com.raytheon.viz.core.graphing.xy.XYData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SOFTWARE HISTORY
|
||||||
|
* Date Ticket# Engineer Description
|
||||||
|
* ------------ ---------- ----------- --------------------------
|
||||||
|
* ?? ?? Initial creation
|
||||||
|
* Oct 2, 2012 DR 15259 M.Porricelli Interpolate below 850MB
|
||||||
|
*
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @author mschenke
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
public class InterpUtils {
|
public class InterpUtils {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -55,6 +67,10 @@ public class InterpUtils {
|
||||||
double maxYAxisVal = ((Number) dataList.get(0).getY()).doubleValue();
|
double maxYAxisVal = ((Number) dataList.get(0).getY()).doubleValue();
|
||||||
double minYAxisVal = ((Number) dataList.get(dataList.size() - 1).getY())
|
double minYAxisVal = ((Number) dataList.get(dataList.size() - 1).getY())
|
||||||
.doubleValue();
|
.doubleValue();
|
||||||
|
// Allow interpolation below 850 when this is lowest level
|
||||||
|
if (maxYAxisVal == 850.0){
|
||||||
|
maxYAxisVal = 1000.0;
|
||||||
|
}
|
||||||
|
|
||||||
if (maxYAxisVal < minYAxisVal) {
|
if (maxYAxisVal < minYAxisVal) {
|
||||||
double tmp = maxYAxisVal;
|
double tmp = maxYAxisVal;
|
||||||
|
|
|
@ -96,7 +96,12 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
|
||||||
* The actionListeners for certain controls
|
* The actionListeners for certain controls
|
||||||
* have been updated so that they will set it
|
* have been updated so that they will set it
|
||||||
* to true when an update is actually required.
|
* to true when an update is actually required.
|
||||||
*
|
*
|
||||||
|
* 03 OCT 2012 #15395 Added code to handle TimeStep when default is set
|
||||||
|
* to be "30 minutes Instantaneous" in the database.
|
||||||
|
* 09 OCT 2012 #15396 Fixed Instantaneous precip index so legend and map display
|
||||||
|
* will change each time duration is incremented or decremented
|
||||||
|
* for the "30 minutes Instantaneous" rainfall map .
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author lvenable
|
* @author lvenable
|
||||||
|
@ -599,6 +604,20 @@ public class PointDataControlDlg extends CaveSWTDialog {
|
||||||
timeTF.setText(dateTimeFmt.format(cal.getTime()));
|
timeTF.setText(dateTimeFmt.format(cal.getTime()));
|
||||||
|
|
||||||
populatePresetData(null);
|
populatePresetData(null);
|
||||||
|
|
||||||
|
/* this is when in the database, the timeStep is set to be the
|
||||||
|
default one */
|
||||||
|
|
||||||
|
if (timeStepRdo.getSelection() == true) {
|
||||||
|
handleQueryModeSelection(PDCConstants.QueryMode.TIME_STEP_MODE);
|
||||||
|
previousQueryMode = PDCConstants.QueryMode.TIME_STEP_MODE;
|
||||||
|
shell.setCursor(waitCursor);
|
||||||
|
updateData = true;
|
||||||
|
drawMap();
|
||||||
|
shell.setCursor(arrowCursor);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -853,11 +872,18 @@ public class PointDataControlDlg extends CaveSWTDialog {
|
||||||
upPrecipBtn.addSelectionListener(new SelectionAdapter() {
|
upPrecipBtn.addSelectionListener(new SelectionAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void widgetSelected(SelectionEvent event) {
|
public void widgetSelected(SelectionEvent event) {
|
||||||
|
PDCOptionData pcOptions = PDCOptionData.getInstance();
|
||||||
if (precipIndex >= HydroConstants.InstPrecipSelection.values().length - 1) {
|
if (precipIndex >= HydroConstants.InstPrecipSelection.values().length - 1) {
|
||||||
precipIndex = 0;
|
precipIndex = 0;
|
||||||
} else {
|
} else {
|
||||||
precipIndex++;
|
precipIndex++;
|
||||||
|
if (precipIndex == HydroConstants.InstPrecipSelection.
|
||||||
|
values().length - 1) {
|
||||||
|
precipIndex=0;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
pcOptions.setInstPrecipAccumTimeSelection(precipIndex);
|
||||||
setInstPrecipAccumText();
|
setInstPrecipAccumText();
|
||||||
shell.setCursor(waitCursor);
|
shell.setCursor(waitCursor);
|
||||||
updateData = true;
|
updateData = true;
|
||||||
|
@ -871,11 +897,21 @@ public class PointDataControlDlg extends CaveSWTDialog {
|
||||||
downPrecipBtn.addSelectionListener(new SelectionAdapter() {
|
downPrecipBtn.addSelectionListener(new SelectionAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void widgetSelected(SelectionEvent event) {
|
public void widgetSelected(SelectionEvent event) {
|
||||||
|
PDCOptionData pcOptions = PDCOptionData.getInstance();
|
||||||
if (precipIndex == 0) {
|
if (precipIndex == 0) {
|
||||||
precipIndex = HydroConstants.InstPrecipSelection.values().length - 1;
|
precipIndex = HydroConstants.InstPrecipSelection.
|
||||||
|
values().length - 1;
|
||||||
|
if (precipIndex == HydroConstants.InstPrecipSelection.
|
||||||
|
values().length - 1) {
|
||||||
|
precipIndex=HydroConstants.InstPrecipSelection.
|
||||||
|
values().length - 2;
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
precipIndex--;
|
precipIndex--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pcOptions.setInstPrecipAccumTimeSelection(precipIndex);
|
||||||
setInstPrecipAccumText();
|
setInstPrecipAccumText();
|
||||||
shell.setCursor(waitCursor);
|
shell.setCursor(waitCursor);
|
||||||
updateData = true;
|
updateData = true;
|
||||||
|
|
|
@ -43,7 +43,10 @@ import com.raytheon.viz.hydrocommon.data.LocationData;
|
||||||
* Sep 09, 2009 2769 mpduff Added copyTableData method and the calls
|
* Sep 09, 2009 2769 mpduff Added copyTableData method and the calls
|
||||||
* to it for copying data from one table to another.
|
* to it for copying data from one table to another.
|
||||||
* Oct 20, 2011 11266 lbousaidi added getHSAsForFilter() method to query from
|
* Oct 20, 2011 11266 lbousaidi added getHSAsForFilter() method to query from
|
||||||
* location table instead of hsa table.
|
* location table instead of hsa table.
|
||||||
|
* Oct 05, 2011 15333 lbousaidi changed the queries that retrieves the HSAs from
|
||||||
|
* the database.
|
||||||
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author askripsky
|
* @author askripsky
|
||||||
|
@ -170,15 +173,14 @@ public class AddModifyLocationDataManager extends HydroDataManager {
|
||||||
public ArrayList<String> getHSAs() throws VizException {
|
public ArrayList<String> getHSAs() throws VizException {
|
||||||
ArrayList<String> rval = new ArrayList<String>();
|
ArrayList<String> rval = new ArrayList<String>();
|
||||||
|
|
||||||
String query = "Select hsa from hsa order by hsa";
|
String query= "SELECT DISTINCT upper(hsa) from hsa order by upper (hsa)";
|
||||||
|
|
||||||
QueryResult data = HydroDBDataManager.getInstance().runMappedQuery(
|
QueryResult data = HydroDBDataManager.getInstance().runMappedQuery(
|
||||||
query);
|
query);
|
||||||
|
|
||||||
if (data != null) {
|
if (data != null) {
|
||||||
for (QueryResultRow currNet : data.getRows()) {
|
for (QueryResultRow currNet : data.getRows()) {
|
||||||
rval.add((String) currNet.getColumn(data.getColumnNames().get(
|
rval.add((String) currNet.getColumn(data.getColumnNames().get(
|
||||||
"hsa")));
|
"upper")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -217,16 +219,16 @@ public class AddModifyLocationDataManager extends HydroDataManager {
|
||||||
*/
|
*/
|
||||||
public ArrayList<String> getWFOs() throws VizException {
|
public ArrayList<String> getWFOs() throws VizException {
|
||||||
ArrayList<String> rval = new ArrayList<String>();
|
ArrayList<String> rval = new ArrayList<String>();
|
||||||
|
|
||||||
String query = "Select wfo from wfo order by wfo";
|
String query= "SELECT DISTINCT upper(wfo) from wfo order by upper (wfo)";
|
||||||
|
|
||||||
QueryResult data = HydroDBDataManager.getInstance().runMappedQuery(
|
QueryResult data = HydroDBDataManager.getInstance().runMappedQuery(
|
||||||
query);
|
query);
|
||||||
|
|
||||||
if (data != null) {
|
if (data != null) {
|
||||||
for (QueryResultRow currNet : data.getRows()) {
|
for (QueryResultRow currNet : data.getRows()) {
|
||||||
rval.add((String) currNet.getColumn(data.getColumnNames().get(
|
rval.add((String) currNet.getColumn(data.getColumnNames().get(
|
||||||
"wfo")));
|
"upper")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@ import com.raytheon.uf.common.time.DataTime;
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Sep 15, 2009 mschenke Initial creation
|
* Sep 15, 2009 mschenke Initial creation
|
||||||
|
* OCT 04, 2012 15132 kshresth Restored "MSAS/LDAD QC plots" display data
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -38,7 +39,8 @@ import com.raytheon.uf.common.time.DataTime;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class PlotInfo {
|
public class PlotInfo {
|
||||||
|
public Integer id;
|
||||||
|
|
||||||
public String stationId;
|
public String stationId;
|
||||||
|
|
||||||
public Double latitude;
|
public Double latitude;
|
||||||
|
@ -76,4 +78,16 @@ public class PlotInfo {
|
||||||
this.plotQueued = false;
|
this.plotQueued = false;
|
||||||
this.sampleQueued = false;
|
this.sampleQueued = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PlotInfo(String stationId, Double latitude,
|
||||||
|
Double longitude, DataTime dataTime, String dataURI, Integer id) {
|
||||||
|
this.stationId = stationId;
|
||||||
|
this.latitude = latitude;
|
||||||
|
this.longitude = longitude;
|
||||||
|
this.dataTime = dataTime;
|
||||||
|
this.dataURI = dataURI;
|
||||||
|
this.id = id;
|
||||||
|
this.plotQueued = false;
|
||||||
|
this.sampleQueued = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,6 +57,7 @@ import com.raytheon.viz.pointdata.thread.PlotSampleGeneratorJob;
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Apr 22, 2011 njensen Initial creation
|
* Apr 22, 2011 njensen Initial creation
|
||||||
|
* OCT 04, 2012 15132 kshresth Restored "MSAS/LDAD QC plots" display data
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -179,7 +180,7 @@ public class PlotModelDataRequestJob extends Job {
|
||||||
|
|
||||||
private void requestData(List<PlotInfo[]> stationQuery,
|
private void requestData(List<PlotInfo[]> stationQuery,
|
||||||
List<PlotModelElement> pme) {
|
List<PlotModelElement> pme) {
|
||||||
Map<String, PlotInfo> plotMap = new HashMap<String, PlotInfo>();
|
Map<Integer, PlotInfo> plotMap = new HashMap<Integer, PlotInfo>();
|
||||||
List<String> params = new ArrayList<String>();
|
List<String> params = new ArrayList<String>();
|
||||||
|
|
||||||
for (PlotModelElement p : pme) {
|
for (PlotModelElement p : pme) {
|
||||||
|
@ -204,8 +205,8 @@ public class PlotModelDataRequestJob extends Job {
|
||||||
List<String> str = new ArrayList<String>(stationQuery.size());
|
List<String> str = new ArrayList<String>(stationQuery.size());
|
||||||
for (PlotInfo[] infos : stationQuery) {
|
for (PlotInfo[] infos : stationQuery) {
|
||||||
for (PlotInfo info : infos) {
|
for (PlotInfo info : infos) {
|
||||||
str.add(info.dataURI);
|
str.add(Integer.toString(info.id));
|
||||||
plotMap.put(info.dataURI, info);
|
plotMap.put(info.id, info);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,7 +220,7 @@ public class PlotModelDataRequestJob extends Job {
|
||||||
index++;
|
index++;
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
map.put("dataURI", rc);
|
map.put("id", rc);
|
||||||
try {
|
try {
|
||||||
// Try and get data from datacube
|
// Try and get data from datacube
|
||||||
long t0 = System.currentTimeMillis();
|
long t0 = System.currentTimeMillis();
|
||||||
|
@ -243,8 +244,8 @@ public class PlotModelDataRequestJob extends Job {
|
||||||
for (int uriCounter = 0; uriCounter < pdc.getAllocatedSz(); uriCounter++) {
|
for (int uriCounter = 0; uriCounter < pdc.getAllocatedSz(); uriCounter++) {
|
||||||
PointDataView pdv = pdc.readRandom(uriCounter);
|
PointDataView pdv = pdc.readRandom(uriCounter);
|
||||||
if (pdv != null) {
|
if (pdv != null) {
|
||||||
String dataURI = pdv.getString("dataURI");
|
int id = pdv.getInt("id");
|
||||||
PlotInfo info = plotMap.get(dataURI);
|
PlotInfo info = plotMap.get(id);
|
||||||
// If the id doesn't match, try to match by
|
// If the id doesn't match, try to match by
|
||||||
// location
|
// location
|
||||||
if (info == null) {
|
if (info == null) {
|
||||||
|
@ -257,6 +258,8 @@ public class PlotModelDataRequestJob extends Job {
|
||||||
- pdv.getFloat("longitude"));
|
- pdv.getFloat("longitude"));
|
||||||
if (diffLat < 0.01 && diffLon < 0.01) {
|
if (diffLat < 0.01 && diffLon < 0.01) {
|
||||||
info = pi;
|
info = pi;
|
||||||
|
pdv.setInt("id", pi.id);
|
||||||
|
id = pi.id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,7 @@ import com.raytheon.viz.pointdata.PlotInfo;
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Oct 9, 2009 bsteffen Initial creation
|
* Oct 9, 2009 bsteffen Initial creation
|
||||||
*
|
* OCT 4, 2012 15132 kshresth Restored "MSAS/LDAD QC plots" display data
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author bsteffen
|
* @author bsteffen
|
||||||
|
@ -76,6 +76,7 @@ public class PointDataPlotInfoRetriever extends AbstractDbPlotInfoRetriever {
|
||||||
} else {
|
} else {
|
||||||
dq.addColumn("dataTime");
|
dq.addColumn("dataTime");
|
||||||
}
|
}
|
||||||
|
dq.addColumn("id");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -103,7 +104,7 @@ public class PointDataPlotInfoRetriever extends AbstractDbPlotInfoRetriever {
|
||||||
statusHandler.handle(Priority.CRITICAL, message, new Exception(
|
statusHandler.handle(Priority.CRITICAL, message, new Exception(
|
||||||
message));
|
message));
|
||||||
}
|
}
|
||||||
|
stationInfo.id = (Integer) data[5];
|
||||||
return stationInfo;
|
return stationInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -288,6 +288,8 @@ import com.raytheon.viz.ui.dialogs.SWTMessageBox;
|
||||||
* 10Sep2012 15103 M.Gamazaychikov DR15103 -do not clear AFOS command from the text box
|
* 10Sep2012 15103 M.Gamazaychikov DR15103 -do not clear AFOS command from the text box
|
||||||
* when obs are updated and refactored executeCommand
|
* when obs are updated and refactored executeCommand
|
||||||
* 10SEP2012 15401 D.Friedman Fix QC problem caused by DR 15340.
|
* 10SEP2012 15401 D.Friedman Fix QC problem caused by DR 15340.
|
||||||
|
* 27SEP2012 15424 S.Naples Set focus on AFOS command text field after executing retrieval of product.
|
||||||
|
* 09Oct2012 14889 M.Gamazaychikov Add call to checkAndWrapPreviousLine
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author lvenable
|
* @author lvenable
|
||||||
|
@ -337,6 +339,12 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
* When auto wrapping the last line that needs to be wrapped.
|
* When auto wrapping the last line that needs to be wrapped.
|
||||||
*/
|
*/
|
||||||
private int endWrapLine = -1;
|
private int endWrapLine = -1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Last line was wrapped backwards
|
||||||
|
*/
|
||||||
|
private boolean isPreviousLineWrapped = false;
|
||||||
|
|
||||||
|
|
||||||
private static final String PARAGRAPH_DELIMITERS = "*$.-/^#";
|
private static final String PARAGRAPH_DELIMITERS = "*$.-/^#";
|
||||||
|
|
||||||
|
@ -926,7 +934,7 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
/**
|
/**
|
||||||
* Redraw flag indicating if the window should redraw on a resize.
|
* Redraw flag indicating if the window should redraw on a resize.
|
||||||
*/
|
*/
|
||||||
private boolean canRedraw = true;
|
private final boolean canRedraw = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Flag indicating if the editor is in edit mode.
|
* Flag indicating if the editor is in edit mode.
|
||||||
|
@ -956,7 +964,7 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
/**
|
/**
|
||||||
* flag to indicate it a product request is from the GUI or an updated ob.
|
* flag to indicate it a product request is from the GUI or an updated ob.
|
||||||
*/
|
*/
|
||||||
private AtomicInteger updateCount = new AtomicInteger(0);
|
private final AtomicInteger updateCount = new AtomicInteger(0);
|
||||||
|
|
||||||
private NotifyExpiration notify;
|
private NotifyExpiration notify;
|
||||||
|
|
||||||
|
@ -2858,11 +2866,13 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
});
|
});
|
||||||
|
|
||||||
afosCmdTF.addSelectionListener(new SelectionListener() {
|
afosCmdTF.addSelectionListener(new SelectionListener() {
|
||||||
public void widgetSelected(SelectionEvent event) {
|
@Override
|
||||||
|
public void widgetSelected(SelectionEvent event) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void widgetDefaultSelected(SelectionEvent event) {
|
@Override
|
||||||
|
public void widgetDefaultSelected(SelectionEvent event) {
|
||||||
String tmp = afosCmdTF.getText();
|
String tmp = afosCmdTF.getText();
|
||||||
tmp = tmp.trim();
|
tmp = tmp.trim();
|
||||||
afosCmdTF.setText(tmp);
|
afosCmdTF.setText(tmp);
|
||||||
|
@ -2883,8 +2893,8 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
executeCommand(CommandFactory.getAfosCommand(afosCmdTF
|
executeCommand(CommandFactory.getAfosCommand(afosCmdTF
|
||||||
.getText()));
|
.getText()));
|
||||||
|
|
||||||
// Highlight the text contained in the Afos Command Field.
|
// Place cursor back in the Afos Command Field.
|
||||||
afosCmdTF.selectAll();
|
afosCmdTF.setFocus();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -2936,7 +2946,8 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
});
|
});
|
||||||
|
|
||||||
wmoTtaaiiTF.addModifyListener(new ModifyListener() {
|
wmoTtaaiiTF.addModifyListener(new ModifyListener() {
|
||||||
public void modifyText(ModifyEvent event) {
|
@Override
|
||||||
|
public void modifyText(ModifyEvent event) {
|
||||||
if (wmoTtaaiiTF.getCaretPosition() == wmoTtaaiiTF
|
if (wmoTtaaiiTF.getCaretPosition() == wmoTtaaiiTF
|
||||||
.getTextLimit()) {
|
.getTextLimit()) {
|
||||||
ccccTF.setFocus();
|
ccccTF.setFocus();
|
||||||
|
@ -2945,11 +2956,13 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
});
|
});
|
||||||
|
|
||||||
wmoTtaaiiTF.addSelectionListener(new SelectionListener() {
|
wmoTtaaiiTF.addSelectionListener(new SelectionListener() {
|
||||||
public void widgetSelected(SelectionEvent event) {
|
@Override
|
||||||
|
public void widgetSelected(SelectionEvent event) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void widgetDefaultSelected(SelectionEvent event) {
|
@Override
|
||||||
|
public void widgetDefaultSelected(SelectionEvent event) {
|
||||||
wmoTtaaiiTF.setText(wmoTtaaiiTF.getText().toUpperCase());
|
wmoTtaaiiTF.setText(wmoTtaaiiTF.getText().toUpperCase());
|
||||||
ccccTF.setText(ccccTF.getText().toUpperCase());
|
ccccTF.setText(ccccTF.getText().toUpperCase());
|
||||||
wmoSearch();
|
wmoSearch();
|
||||||
|
@ -3003,11 +3016,13 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
});
|
});
|
||||||
|
|
||||||
ccccTF.addSelectionListener(new SelectionListener() {
|
ccccTF.addSelectionListener(new SelectionListener() {
|
||||||
public void widgetSelected(SelectionEvent event) {
|
@Override
|
||||||
|
public void widgetSelected(SelectionEvent event) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void widgetDefaultSelected(SelectionEvent event) {
|
@Override
|
||||||
|
public void widgetDefaultSelected(SelectionEvent event) {
|
||||||
wmoTtaaiiTF.setText(wmoTtaaiiTF.getText().toUpperCase());
|
wmoTtaaiiTF.setText(wmoTtaaiiTF.getText().toUpperCase());
|
||||||
ccccTF.setText(ccccTF.getText().toUpperCase());
|
ccccTF.setText(ccccTF.getText().toUpperCase());
|
||||||
wmoSearch();
|
wmoSearch();
|
||||||
|
@ -3064,11 +3079,13 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
});
|
});
|
||||||
|
|
||||||
awipsIdTF.addSelectionListener(new SelectionListener() {
|
awipsIdTF.addSelectionListener(new SelectionListener() {
|
||||||
public void widgetSelected(SelectionEvent event) {
|
@Override
|
||||||
|
public void widgetSelected(SelectionEvent event) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void widgetDefaultSelected(SelectionEvent event) {
|
@Override
|
||||||
|
public void widgetDefaultSelected(SelectionEvent event) {
|
||||||
awipsIdTF.setText(awipsIdTF.getText().trim().toUpperCase());
|
awipsIdTF.setText(awipsIdTF.getText().trim().toUpperCase());
|
||||||
int charCount = awipsIdTF.getCharCount();
|
int charCount = awipsIdTF.getCharCount();
|
||||||
if (charCount < 4 || charCount > 6) {
|
if (charCount < 4 || charCount > 6) {
|
||||||
|
@ -3462,7 +3479,8 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
// });
|
// });
|
||||||
|
|
||||||
textEditor.addVerifyKeyListener(new VerifyKeyListener() {
|
textEditor.addVerifyKeyListener(new VerifyKeyListener() {
|
||||||
public void verifyKey(VerifyEvent event) {
|
@Override
|
||||||
|
public void verifyKey(VerifyEvent event) {
|
||||||
if (event.keyCode == SWT.DEL || event.character == SWT.BS
|
if (event.keyCode == SWT.DEL || event.character == SWT.BS
|
||||||
|| event.keyCode == SWT.SHIFT) {
|
|| event.keyCode == SWT.SHIFT) {
|
||||||
// Do nothing...
|
// Do nothing...
|
||||||
|
@ -5233,7 +5251,8 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
return TextDisplayModel.getInstance().getStdTextProduct(token);
|
return TextDisplayModel.getInstance().getStdTextProduct(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAfosCmdField(String cmd) {
|
@Override
|
||||||
|
public void setAfosCmdField(String cmd) {
|
||||||
afosCmdTF.setText(cmd);
|
afosCmdTF.setText(cmd);
|
||||||
TextDisplayModel.getInstance().setAfosCommand(token, cmd);
|
TextDisplayModel.getInstance().setAfosCommand(token, cmd);
|
||||||
}
|
}
|
||||||
|
@ -5246,7 +5265,8 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
return addressee;
|
return addressee;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void executeCommand(ICommand command) {
|
@Override
|
||||||
|
public void executeCommand(ICommand command) {
|
||||||
executeCommand(command, false);
|
executeCommand(command, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6334,7 +6354,8 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
getDisplay().syncExec(new Runnable() {
|
getDisplay().syncExec(new Runnable() {
|
||||||
public void run() {
|
@Override
|
||||||
|
public void run() {
|
||||||
if (!shell.isDisposed()) {
|
if (!shell.isDisposed()) {
|
||||||
if (autoSave == AutoSaveTask.this) {
|
if (autoSave == AutoSaveTask.this) {
|
||||||
saveEditedProduct(true, false);
|
saveEditedProduct(true, false);
|
||||||
|
@ -6740,6 +6761,10 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
// performingWrap = true;
|
// performingWrap = true;
|
||||||
int lineNumber = textEditor.getLineAtOffset(start);
|
int lineNumber = textEditor.getLineAtOffset(start);
|
||||||
endWrapLine = textEditor.getLineAtOffset(end);
|
endWrapLine = textEditor.getLineAtOffset(end);
|
||||||
|
/*
|
||||||
|
* DR154889 - resetting isPreviousLineWrapped
|
||||||
|
*/
|
||||||
|
isPreviousLineWrapped = false;
|
||||||
rewrapInternal(lineNumber);
|
rewrapInternal(lineNumber);
|
||||||
|
|
||||||
// The rest of this method is adjusting the view of the display.
|
// The rest of this method is adjusting the view of the display.
|
||||||
|
@ -6973,6 +6998,11 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
wrapAtPositionOrLock(lineStartOffset + charWrapCol, padding);
|
wrapAtPositionOrLock(lineStartOffset + charWrapCol, padding);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* DR14889 - add call to checkAndWrapPreviousLine
|
||||||
|
*/
|
||||||
|
checkAndWrapPreviousLine(lineNumber);
|
||||||
|
|
||||||
checkAndWrapNextLine(lineNumber);
|
checkAndWrapNextLine(lineNumber);
|
||||||
}
|
}
|
||||||
|
@ -7067,11 +7097,54 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
// split at the column, no whitespace
|
// split at the column, no whitespace
|
||||||
wrapAtPositionOrLock(lineStartOffset + charWrapCol, padding);
|
wrapAtPositionOrLock(lineStartOffset + charWrapCol, padding);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* DR14889 - add call to checkAndWrapPreviousLine
|
||||||
|
*/
|
||||||
|
checkAndWrapPreviousLine(lineNumber);
|
||||||
|
|
||||||
checkAndWrapNextLine(lineNumber);
|
checkAndWrapNextLine(lineNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** checks if the previous line is part of the same paragraph and continues
|
||||||
|
* wrapping if it is
|
||||||
|
* @param line
|
||||||
|
*/
|
||||||
|
private void checkAndWrapPreviousLine(int line) {
|
||||||
|
// if there is a previous line
|
||||||
|
if ( isPreviousLineWrapped ){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (line - 1 > 0) {
|
||||||
|
// if the previous line does not start a new paragraph
|
||||||
|
if (!isParagraphStart(line - 1)) {
|
||||||
|
// if the previous line is not empty ( marks the end of a paragraph
|
||||||
|
// )
|
||||||
|
if (!textEditor.getLine(line - 1).trim().isEmpty()) {
|
||||||
|
// rewrap the previous line
|
||||||
|
isPreviousLineWrapped = true;
|
||||||
|
rewrapInternal(line - 1);
|
||||||
|
} else if (line - 1 < endWrapLine) {
|
||||||
|
// See if another paragraph needs to be wrapped.
|
||||||
|
int nextLine = line - 1;
|
||||||
|
while (nextLine <= endWrapLine
|
||||||
|
&& textEditor.getLine(nextLine).trim().isEmpty()) {
|
||||||
|
--nextLine;
|
||||||
|
}
|
||||||
|
if (nextLine <= endWrapLine) {
|
||||||
|
isPreviousLineWrapped = true;
|
||||||
|
rewrapInternal(nextLine);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (line - 1 <= endWrapLine) {
|
||||||
|
isPreviousLineWrapped = true;
|
||||||
|
rewrapInternal(line - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
* checks if the paragraph starting at the line passed in uses two space
|
* checks if the paragraph starting at the line passed in uses two space
|
||||||
* padding for subsequent lines
|
* padding for subsequent lines
|
||||||
*
|
*
|
||||||
|
|
|
@ -24,6 +24,16 @@ import com.raytheon.uf.viz.core.maps.rsc.DbMapQueryFactory;
|
||||||
import com.raytheon.viz.warngen.gis.ClosestPoint;
|
import com.raytheon.viz.warngen.gis.ClosestPoint;
|
||||||
import com.vividsolutions.jts.geom.Geometry;
|
import com.vividsolutions.jts.geom.Geometry;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* SOFTWARE HISTORY
|
||||||
|
*
|
||||||
|
* Date Ticket# Engineer Description
|
||||||
|
* ------------ ---------- ----------- --------------------------
|
||||||
|
* pre-history
|
||||||
|
* Sep 25, 2012 #15425 Qinglu Lin Added getGid().
|
||||||
|
*
|
||||||
|
*/
|
||||||
abstract public class AbstractDbSourceDataAdaptor {
|
abstract public class AbstractDbSourceDataAdaptor {
|
||||||
|
|
||||||
protected Set<String> sortFields = new HashSet<String>(
|
protected Set<String> sortFields = new HashSet<String>(
|
||||||
|
@ -160,4 +170,20 @@ abstract public class AbstractDbSourceDataAdaptor {
|
||||||
return warngenlev;
|
return warngenlev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected int getGid(Set<String> ptFields,
|
||||||
|
Map<String, Object> attributes) {
|
||||||
|
int gid = 0;
|
||||||
|
|
||||||
|
if (ptFields.contains("gid")) {
|
||||||
|
try {
|
||||||
|
gid = Integer.valueOf(String.valueOf(attributes
|
||||||
|
.get("gid")));
|
||||||
|
} catch (Exception e) {
|
||||||
|
// Ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return gid;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,12 @@ import com.vividsolutions.jts.geom.Geometry;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
* SOFTWARE HISTORY
|
||||||
|
*
|
||||||
|
* Date Ticket# Engineer Description
|
||||||
|
* ------------ ---------- ----------- --------------------------
|
||||||
* @author jsanchez
|
* @author jsanchez
|
||||||
|
* Sep 25, 2012 #15425 Qinglu Lin Updated createClosestPoint().
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class DbAreaSourceDataAdaptor extends AbstractDbSourceDataAdaptor {
|
public class DbAreaSourceDataAdaptor extends AbstractDbSourceDataAdaptor {
|
||||||
|
@ -73,8 +78,9 @@ public class DbAreaSourceDataAdaptor extends AbstractDbSourceDataAdaptor {
|
||||||
int warngenlev = getWangenlev(ptFields, attributes);
|
int warngenlev = getWangenlev(ptFields, attributes);
|
||||||
List<String> partOfArea = getPartOfArea(ptFields, attributes,
|
List<String> partOfArea = getPartOfArea(ptFields, attributes,
|
||||||
ptRslt.geometry);
|
ptRslt.geometry);
|
||||||
|
int gid = getGid(ptFields, attributes);
|
||||||
|
|
||||||
return new ClosestPoint(name, point, population, warngenlev, partOfArea);
|
return new ClosestPoint(name, point, population, warngenlev, partOfArea, gid);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -47,6 +47,7 @@ import com.vividsolutions.jts.geom.Coordinate;
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Oct 26, 2011 bgonzale Initial creation
|
* Oct 26, 2011 bgonzale Initial creation
|
||||||
|
* Sep 25, 2012 #15425 Qinglu Lin Updated createClosestPoint().
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -85,8 +86,9 @@ public class DbPointSourceDataAdaptor extends AbstractDbSourceDataAdaptor {
|
||||||
Coordinate point = ptRslt.geometry.getCoordinate();
|
Coordinate point = ptRslt.geometry.getCoordinate();
|
||||||
int population = getPopulation(ptFields, attributes);
|
int population = getPopulation(ptFields, attributes);
|
||||||
int warngenlev = getWangenlev(ptFields, attributes);
|
int warngenlev = getWangenlev(ptFields, attributes);
|
||||||
|
int gid = getGid(ptFields, attributes);
|
||||||
|
|
||||||
return new ClosestPoint(name, point, population, warngenlev, null);
|
return new ClosestPoint(name, point, population, warngenlev, null, gid);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -37,6 +37,7 @@ import com.vividsolutions.jts.geom.Coordinate;
|
||||||
* Dec 11, 2007 #601 chammack Initial Creation.
|
* Dec 11, 2007 #601 chammack Initial Creation.
|
||||||
* APr 18, 2012 #14733 Qinglu Lin David's fix is used, which adds
|
* APr 18, 2012 #14733 Qinglu Lin David's fix is used, which adds
|
||||||
* a copy constructor.
|
* a copy constructor.
|
||||||
|
* Sep 25, 2012 #15425 Qinglu Lin Updated two ClosestPoint() and added getGid().
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -72,6 +73,8 @@ public class ClosestPoint implements Comparable<ClosestPoint> {
|
||||||
|
|
||||||
protected List<String> partOfArea;
|
protected List<String> partOfArea;
|
||||||
|
|
||||||
|
protected int gid;
|
||||||
|
|
||||||
public ClosestPoint() {
|
public ClosestPoint() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -91,19 +94,21 @@ public class ClosestPoint implements Comparable<ClosestPoint> {
|
||||||
this.warngenlev = o.warngenlev;
|
this.warngenlev = o.warngenlev;
|
||||||
this.time = o.time;
|
this.time = o.time;
|
||||||
this.partOfArea = o.partOfArea;
|
this.partOfArea = o.partOfArea;
|
||||||
|
this.gid = o.gid;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ClosestPoint(String name, Coordinate point) {
|
public ClosestPoint(String name, Coordinate point) {
|
||||||
this(name, point, 0, 0, null);
|
this(name, point, 0, 0, null, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ClosestPoint(String name, Coordinate point, int population,
|
public ClosestPoint(String name, Coordinate point, int population,
|
||||||
int warngenlev, List<String> partOfArea) {
|
int warngenlev, List<String> partOfArea, int gid) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.point = point;
|
this.point = point;
|
||||||
this.population = population;
|
this.population = population;
|
||||||
this.warngenlev = warngenlev;
|
this.warngenlev = warngenlev;
|
||||||
this.partOfArea = partOfArea;
|
this.partOfArea = partOfArea;
|
||||||
|
this.gid = gid;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -173,6 +178,10 @@ public class ClosestPoint implements Comparable<ClosestPoint> {
|
||||||
return partOfArea;
|
return partOfArea;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getGid() {
|
||||||
|
return gid;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adjusts the angle from -360/360 to be between -180/180
|
* Adjusts the angle from -360/360 to be between -180/180
|
||||||
*
|
*
|
||||||
|
|
|
@ -37,6 +37,7 @@ import org.apache.commons.lang.ArrayUtils;
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Mar 3, 2011 jsanchez Initial creation
|
* Mar 3, 2011 jsanchez Initial creation
|
||||||
|
* Sep 25, 2012 15425 Qinglu Lin Implemented sorting on 'gid' in ascending order.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -47,7 +48,7 @@ import org.apache.commons.lang.ArrayUtils;
|
||||||
public class ClosestPointComparator implements Comparator<ClosestPoint> {
|
public class ClosestPointComparator implements Comparator<ClosestPoint> {
|
||||||
|
|
||||||
private enum Sort {
|
private enum Sort {
|
||||||
NAME, POPULATION, DISTANCE, LEVEL, LAT, LON, AREA, PARENT_AREA
|
NAME, POPULATION, DISTANCE, LEVEL, LAT, LON, AREA, PARENT_AREA, GID
|
||||||
}
|
}
|
||||||
|
|
||||||
private ArrayList<Sort> list;
|
private ArrayList<Sort> list;
|
||||||
|
@ -79,7 +80,9 @@ public class ClosestPointComparator implements Comparator<ClosestPoint> {
|
||||||
} else if (field.equalsIgnoreCase("area")) {
|
} else if (field.equalsIgnoreCase("area")) {
|
||||||
list.add(Sort.AREA);
|
list.add(Sort.AREA);
|
||||||
} else if (field.equalsIgnoreCase("parentArea")) {
|
} else if (field.equalsIgnoreCase("parentArea")) {
|
||||||
list.add(Sort.PARENT_AREA);
|
list.add(Sort.PARENT_AREA);
|
||||||
|
} else if (field.equalsIgnoreCase("gid")) {
|
||||||
|
list.add(Sort.GID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -147,6 +150,10 @@ public class ClosestPointComparator implements Comparator<ClosestPoint> {
|
||||||
value = new Integer(cp1.roundedDistance)
|
value = new Integer(cp1.roundedDistance)
|
||||||
.compareTo(cp2.roundedDistance);
|
.compareTo(cp2.roundedDistance);
|
||||||
break;
|
break;
|
||||||
|
case GID:
|
||||||
|
value = new Integer(cp1.gid)
|
||||||
|
.compareTo(cp2.gid);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (value == 0 && counter + 1 < list.size()) {
|
if (value == 0 && counter + 1 < list.size()) {
|
||||||
|
|
|
@ -97,6 +97,8 @@ import com.vividsolutions.jts.geom.Point;
|
||||||
* that loops over availablePoints.
|
* that loops over availablePoints.
|
||||||
* May 21, 2012 DR14480 Qinglu Lin Added code to prevent duplicate cities
|
* May 21, 2012 DR14480 Qinglu Lin Added code to prevent duplicate cities
|
||||||
* in pathcast.
|
* in pathcast.
|
||||||
|
* Oct 05, 2012 DR15429 Qinglu Lin Updated code to keep duplicate names of cities
|
||||||
|
* which are at different locations in pathcast.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -530,7 +532,7 @@ public class Wx {
|
||||||
// with first pathcast and goes through each point within maxCount,
|
// with first pathcast and goes through each point within maxCount,
|
||||||
// check for same point in other pathcast objects. If same point
|
// check for same point in other pathcast objects. If same point
|
||||||
// exists, remove from which ever pathcast is furthest away
|
// exists, remove from which ever pathcast is furthest away
|
||||||
Set<String> closestPtNames = new HashSet<String>(30);
|
Set<Coordinate> closestPtCoords = new HashSet<Coordinate>(30);
|
||||||
List<ClosestPoint> tmpPoints = new ArrayList<ClosestPoint>(maxCount);
|
List<ClosestPoint> tmpPoints = new ArrayList<ClosestPoint>(maxCount);
|
||||||
Queue<PathCast> tmp = new ArrayDeque<PathCast>(pathcasts);
|
Queue<PathCast> tmp = new ArrayDeque<PathCast>(pathcasts);
|
||||||
while (tmp.isEmpty() == false) {
|
while (tmp.isEmpty() == false) {
|
||||||
|
@ -562,12 +564,12 @@ public class Wx {
|
||||||
tmpPoints.clear();
|
tmpPoints.clear();
|
||||||
for (int i = 0; i < points.size() && i < maxCount; ++i) {
|
for (int i = 0; i < points.size() && i < maxCount; ++i) {
|
||||||
ClosestPoint point = points.get(i);
|
ClosestPoint point = points.get(i);
|
||||||
String name = point.getName();
|
Coordinate coord = point.getPoint();
|
||||||
if (!closestPtNames.contains(name)) {
|
if (!closestPtCoords.contains(coord)) {
|
||||||
// To prevent duplicate cities in pathcast,
|
// To prevent duplicate cities in pathcast,
|
||||||
// only unused point is added to tmpPoints
|
// only unused point is added to tmpPoints
|
||||||
tmpPoints.add(point);
|
tmpPoints.add(point);
|
||||||
closestPtNames.add(name);
|
closestPtCoords.add(coord);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (tmpPoints.size() > 0) {
|
if (tmpPoints.size() > 0) {
|
||||||
|
|
|
@ -121,6 +121,8 @@ import com.vividsolutions.jts.geom.Polygon;
|
||||||
* Jul 26, 2012 #15227 Qinglu Lin Added removeDuplicateVertices(), removeOverlaidSegments(),
|
* Jul 26, 2012 #15227 Qinglu Lin Added removeDuplicateVertices(), removeOverlaidSegments(),
|
||||||
* adjustLatLon(), etc.
|
* adjustLatLon(), etc.
|
||||||
* Sep 05, 2012 DR 15261 D. Friedman Prevent additional counties from being selected for EXPs
|
* Sep 05, 2012 DR 15261 D. Friedman Prevent additional counties from being selected for EXPs
|
||||||
|
* Oct 03, 2012 DR 15426 Qinglu Lin Unlock WarnGen GUI for COR, implemented in corSelected();
|
||||||
|
* but lock immediate cause, implemented in individual template.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -1852,7 +1854,6 @@ public class WarngenDialog extends CaveSWTDialog implements
|
||||||
allowsNewProduct = true;
|
allowsNewProduct = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bulletList.setEnabled(false);
|
|
||||||
// Special case - allows for Correction of Followups
|
// Special case - allows for Correction of Followups
|
||||||
if (!allowsNewProduct) {
|
if (!allowsNewProduct) {
|
||||||
newWarn = conSelected(data);
|
newWarn = conSelected(data);
|
||||||
|
|
|
@ -13,6 +13,7 @@ alarmwhfs.cron=0+7,17,27,37,47,57+*+*+*+?
|
||||||
arealqpegen.cron=0+10,25,40,55+*+*+*+?
|
arealqpegen.cron=0+10,25,40,55+*+*+*+?
|
||||||
subscription.cron=0+*+*+*+*+?
|
subscription.cron=0+*+*+*+*+?
|
||||||
dqcpreprocessor.cron=0+20+0,6,12,18+*+*+?
|
dqcpreprocessor.cron=0+20+0,6,12,18+*+*+?
|
||||||
|
freezingLevel.cron=0+5+2,8,14,20+*+*+?
|
||||||
rpggenvdata.envdata.cron=0+0+*+*+*+?
|
rpggenvdata.envdata.cron=0+0+*+*+*+?
|
||||||
rpggenvdata.biastable.cron=0+26,46+*+*+*+?
|
rpggenvdata.biastable.cron=0+26,46+*+*+*+?
|
||||||
metartohmdb.cron=0+14+*+*+*+?
|
metartohmdb.cron=0+14+*+*+*+?
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
Evan Bookbinder 2-24-2012
|
Evan Bookbinder 2-24-2012
|
||||||
Phil Kurimski 2-28-2012
|
Phil Kurimski 2-28-2012
|
||||||
Qinglu Lin 04-04-2012 DR 14691. Added <feAreaField> tag.
|
Qinglu Lin 04-04-2012 DR 14691. Added <feAreaField> tag.
|
||||||
|
Qinglu Lin 10-03-2012 DR 15426. Changed ic to pc in <lockedGroupsOnFollowup> tag.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<warngenConfig>
|
<warngenConfig>
|
||||||
|
@ -58,7 +59,7 @@
|
||||||
<duration>720</duration>
|
<duration>720</duration>
|
||||||
</durations>
|
</durations>
|
||||||
|
|
||||||
<lockedGroupsOnFollowup>ic</lockedGroupsOnFollowup>
|
<lockedGroupsOnFollowup>pc</lockedGroupsOnFollowup>
|
||||||
<bulletActionGroups>
|
<bulletActionGroups>
|
||||||
<bulletActionGroup action="NEW" phen="FA" sig="W">
|
<bulletActionGroup action="NEW" phen="FA" sig="W">
|
||||||
<bullets>
|
<bullets>
|
||||||
|
|
|
@ -5,7 +5,9 @@
|
||||||
Modified by Phil Kurimski 09-23-2011 for burn scars and mud slides
|
Modified by Phil Kurimski 09-23-2011 for burn scars and mud slides
|
||||||
Modified by Mike Dangelo 01-25-2012 at CRH TIM
|
Modified by Mike Dangelo 01-25-2012 at CRH TIM
|
||||||
Modified by Mike Dangelo 02-23-2012
|
Modified by Mike Dangelo 02-23-2012
|
||||||
Qinglu Lin 04-04-2012 DR 14691. Added <feAreaField> tag.
|
Qinglu Lin 04-04-2012 DR 14691. Added <feAreaField> tag.
|
||||||
|
Qinglu Lin 10-03-2012 DR 15426. Added <lockedGroupsOnFollowup> tag,
|
||||||
|
inserted bulletGroup="ic" after bulletText="Also snow melt".
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<warngenConfig>
|
<warngenConfig>
|
||||||
|
@ -63,6 +65,7 @@
|
||||||
<duration>480</duration>
|
<duration>480</duration>
|
||||||
</durations>
|
</durations>
|
||||||
|
|
||||||
|
<lockedGroupsOnFollowup>ic</lockedGroupsOnFollowup>
|
||||||
<bulletActionGroups>
|
<bulletActionGroups>
|
||||||
<bulletActionGroup action="NEW" phen="FF" sig="W">
|
<bulletActionGroup action="NEW" phen="FF" sig="W">
|
||||||
<bullets>
|
<bullets>
|
||||||
|
@ -115,7 +118,7 @@
|
||||||
<bulletActionGroup action="EXT" phen="FF" sig="W">
|
<bulletActionGroup action="EXT" phen="FF" sig="W">
|
||||||
<bullets>
|
<bullets>
|
||||||
<bullet bulletName="ffwEmergency" bulletText="**SELECT FOR FLASH FLOOD EMERGENCY**" parseString="FLASH FLOOD EMERGENCY"/>
|
<bullet bulletName="ffwEmergency" bulletText="**SELECT FOR FLASH FLOOD EMERGENCY**" parseString="FLASH FLOOD EMERGENCY"/>
|
||||||
<bullet bulletName="icrs" bulletText="Also snow melt" parseString=".RS." showString=".RS."/>
|
<bullet bulletName="icrs" bulletText="Also snow melt" bulletGroup="ic" parseString=".RS." showString=".RS."/>
|
||||||
<bullet bulletText="*********** SOURCE (CHOOSE 1) **********" bulletType="title"/>
|
<bullet bulletText="*********** SOURCE (CHOOSE 1) **********" bulletType="title"/>
|
||||||
<bullet bulletName="doppler" bulletText="Doppler radar indicated" bulletGroup="source" bulletDefault="true" parseString="DOPPLER RADAR INDICATED"/>
|
<bullet bulletName="doppler" bulletText="Doppler radar indicated" bulletGroup="source" bulletDefault="true" parseString="DOPPLER RADAR INDICATED"/>
|
||||||
<bullet bulletName="dopplerGauge" bulletText="Doppler radar and automated gauges" bulletGroup="source" parseString="DOPPLER RADAR AND AUTOMATED RAIN GAUGES"/>
|
<bullet bulletName="dopplerGauge" bulletText="Doppler radar and automated gauges" bulletGroup="source" parseString="DOPPLER RADAR AND AUTOMATED RAIN GAUGES"/>
|
||||||
|
@ -163,7 +166,7 @@
|
||||||
<bulletActionGroup action="COR" phen="FF" sig="W">
|
<bulletActionGroup action="COR" phen="FF" sig="W">
|
||||||
<bullets>
|
<bullets>
|
||||||
<bullet bulletName="ffwEmergency" bulletText="**SELECT FOR FLASH FLOOD EMERGENCY**" parseString="FLASH FLOOD EMERGENCY"/>
|
<bullet bulletName="ffwEmergency" bulletText="**SELECT FOR FLASH FLOOD EMERGENCY**" parseString="FLASH FLOOD EMERGENCY"/>
|
||||||
<bullet bulletName="icrs" bulletText="Also snow melt" parseString=".RS." showString=".RS."/>
|
<bullet bulletName="icrs" bulletText="Also snow melt" bulletGroup="ic" parseString=".RS." showString=".RS."/>
|
||||||
<bullet bulletText="*********** SOURCE (CHOOSE 1) **********" bulletType="title"/>
|
<bullet bulletText="*********** SOURCE (CHOOSE 1) **********" bulletType="title"/>
|
||||||
<bullet bulletName="doppler" bulletText="Doppler radar indicated" bulletGroup="source" bulletDefault="true" parseString="DOPPLER RADAR INDICATED"/>
|
<bullet bulletName="doppler" bulletText="Doppler radar indicated" bulletGroup="source" bulletDefault="true" parseString="DOPPLER RADAR INDICATED"/>
|
||||||
<bullet bulletName="dopplerGauge" bulletText="Doppler radar and automated gauges" bulletGroup="source" parseString="DOPPLER RADAR AND AUTOMATED RAIN GAUGES"/>
|
<bullet bulletName="dopplerGauge" bulletText="Doppler radar and automated gauges" bulletGroup="source" parseString="DOPPLER RADAR AND AUTOMATED RAIN GAUGES"/>
|
||||||
|
|
|
@ -5,7 +5,9 @@
|
||||||
Modified Phil Kurimski 09-23-2011 OB 11.0.8-8
|
Modified Phil Kurimski 09-23-2011 OB 11.0.8-8
|
||||||
Modified Phil Kurimski 01-26-2012 OB 12.1.1-1
|
Modified Phil Kurimski 01-26-2012 OB 12.1.1-1
|
||||||
Modified Qinglu Lin 04-04-2012 DR 14691. Added <feAreaField> tag.
|
Modified Qinglu Lin 04-04-2012 DR 14691. Added <feAreaField> tag.
|
||||||
Modified Phil Kurimski 04-27-2012 -->
|
Modified Phil Kurimski 04-27-2012
|
||||||
|
Modified Qinglu Lin 10-03-2012 DR 15426. Added damic to <lockedGroupsOnFollowup> tag.
|
||||||
|
-->
|
||||||
|
|
||||||
<!-- Config distance/speed units -->
|
<!-- Config distance/speed units -->
|
||||||
<unitDistance>mi</unitDistance>
|
<unitDistance>mi</unitDistance>
|
||||||
|
@ -65,7 +67,7 @@
|
||||||
<!-- Customized several sections in bullet section including:
|
<!-- Customized several sections in bullet section including:
|
||||||
Added Flash Flood Emergency Headline
|
Added Flash Flood Emergency Headline
|
||||||
Changed the CTA Bullet names for easier parsing in the vm file -->
|
Changed the CTA Bullet names for easier parsing in the vm file -->
|
||||||
<lockedGroupsOnFollowup>dam,ic</lockedGroupsOnFollowup>
|
<lockedGroupsOnFollowup>dam,ic,damic</lockedGroupsOnFollowup>
|
||||||
<bulletActionGroups>
|
<bulletActionGroups>
|
||||||
<bulletActionGroup action="NEW" phen="FF" sig="W">
|
<bulletActionGroup action="NEW" phen="FF" sig="W">
|
||||||
<bullets>
|
<bullets>
|
||||||
|
|
|
@ -4,7 +4,9 @@
|
||||||
Modified Phil Kurimski 09-23-2011 OB 11.0.8-8
|
Modified Phil Kurimski 09-23-2011 OB 11.0.8-8
|
||||||
Modified Phil Kurimski 01-26-2012 OB 12.1.1-1
|
Modified Phil Kurimski 01-26-2012 OB 12.1.1-1
|
||||||
Modified Qinglu Lin 04-04-2012 DR 14691. Added <feAreaField> tag.
|
Modified Qinglu Lin 04-04-2012 DR 14691. Added <feAreaField> tag.
|
||||||
Modified Phil Kurimski 04-27-2012 -->
|
Modified Phil Kurimski 04-27-2012
|
||||||
|
Modified Qinglu Lin 10-04-2012 DR 15426. Added damic to <lockedGroupsOnFollowup> tag.
|
||||||
|
-->
|
||||||
|
|
||||||
<warngenConfig>
|
<warngenConfig>
|
||||||
|
|
||||||
|
@ -57,7 +59,7 @@
|
||||||
Added Flash Flood Emergency Headline
|
Added Flash Flood Emergency Headline
|
||||||
Changed the CTA Bullet names for easier parsing in the vm file
|
Changed the CTA Bullet names for easier parsing in the vm file
|
||||||
Added the Primary Cause to CAN and EXP sections for correct headlines -->
|
Added the Primary Cause to CAN and EXP sections for correct headlines -->
|
||||||
<lockedGroupsOnFollowup>dam,ic</lockedGroupsOnFollowup>
|
<lockedGroupsOnFollowup>dam,ic,damic</lockedGroupsOnFollowup>
|
||||||
<bulletActionGroups>
|
<bulletActionGroups>
|
||||||
<bulletActionGroup>
|
<bulletActionGroup>
|
||||||
<bullets>
|
<bullets>
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
Modified Phil Kurimski 02-29-2012 OB 12.2.1-3
|
Modified Phil Kurimski 02-29-2012 OB 12.2.1-3
|
||||||
Modified Qinglu Lin 04-04-2012 DR 14691. Added <feAreaField> tag.
|
Modified Qinglu Lin 04-04-2012 DR 14691. Added <feAreaField> tag.
|
||||||
Modified Phil Kurimski 04-27-2012
|
Modified Phil Kurimski 04-27-2012
|
||||||
|
Modified Qinglu Lin 10-04-2012 DR 15426. Added damic to <lockedGroupsOnFollowup> tag.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<warngenConfig>
|
<warngenConfig>
|
||||||
|
@ -59,7 +60,7 @@
|
||||||
Added Flash Flood Emergency Headline
|
Added Flash Flood Emergency Headline
|
||||||
Changed the CTA Bullet names for easier parsing in the vm file
|
Changed the CTA Bullet names for easier parsing in the vm file
|
||||||
Added the Primary Cause to CAN and EXP sections for correct headlines -->
|
Added the Primary Cause to CAN and EXP sections for correct headlines -->
|
||||||
<lockedGroupsOnFollowup>dam,ic</lockedGroupsOnFollowup>
|
<lockedGroupsOnFollowup>dam,ic,damic</lockedGroupsOnFollowup>
|
||||||
<bulletActionGroups>
|
<bulletActionGroups>
|
||||||
<bulletActionGroup>
|
<bulletActionGroup>
|
||||||
<bullets>
|
<bullets>
|
||||||
|
|
|
@ -6,7 +6,9 @@
|
||||||
Modified Phil Kurimski 01-26-2012 OB 12.1.1-1
|
Modified Phil Kurimski 01-26-2012 OB 12.1.1-1
|
||||||
Modified Phil Kurimski 02-29-2012 OB 12.2.1-3
|
Modified Phil Kurimski 02-29-2012 OB 12.2.1-3
|
||||||
Modified Qinglu Lin 04-04-2012 DR 14691. Added <feAreaField> tag.
|
Modified Qinglu Lin 04-04-2012 DR 14691. Added <feAreaField> tag.
|
||||||
Modified Phil Kurimski 04-27-2012 -->
|
Modified Phil Kurimski 04-27-2012
|
||||||
|
Modified Qinglu Lin 10-04-2012 DR 15426. Added damic to <lockedGroupsOnFollowup> tag.
|
||||||
|
-->
|
||||||
|
|
||||||
<!-- Config distance/speed units -->
|
<!-- Config distance/speed units -->
|
||||||
<unitDistance>mi</unitDistance>
|
<unitDistance>mi</unitDistance>
|
||||||
|
@ -66,7 +68,7 @@
|
||||||
<!-- Customized several sections in bullet section including:
|
<!-- Customized several sections in bullet section including:
|
||||||
Added Flash Flood Emergency Headline
|
Added Flash Flood Emergency Headline
|
||||||
Changed the CTA Bullet names for easier parsing in the vm file -->
|
Changed the CTA Bullet names for easier parsing in the vm file -->
|
||||||
<lockedGroupsOnFollowup>dam,ic</lockedGroupsOnFollowup>
|
<lockedGroupsOnFollowup>dam,ic,damic</lockedGroupsOnFollowup>
|
||||||
<bulletActionGroups>
|
<bulletActionGroups>
|
||||||
<bulletActionGroup action="NEW" phen="FF" sig="W">
|
<bulletActionGroup action="NEW" phen="FF" sig="W">
|
||||||
<bullets>
|
<bullets>
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
# 02/16/12 14439 jdynina modified haines thresholds
|
# 02/16/12 14439 jdynina modified haines thresholds
|
||||||
# 02/16/12 13917 jdynina merged in changes from TRAC ticket 11391
|
# 02/16/12 13917 jdynina merged in changes from TRAC ticket 11391
|
||||||
# 07/25/12 #957 dgilling implement edit areas as args to calc methods.
|
# 07/25/12 #957 dgilling implement edit areas as args to calc methods.
|
||||||
#
|
# 10/5/12 15158 ryu add Forecaster.getDb()
|
||||||
#
|
#
|
||||||
##
|
##
|
||||||
import string, sys, re, time, types, getopt, fnmatch, LogStream, DatabaseID, JUtil, AbsTime, TimeRange
|
import string, sys, re, time, types, getopt, fnmatch, LogStream, DatabaseID, JUtil, AbsTime, TimeRange
|
||||||
|
@ -581,12 +581,17 @@ class Forecaster(GridUtilities):
|
||||||
+ ' #Grids=' + `numGrids`
|
+ ' #Grids=' + `numGrids`
|
||||||
self._client.sendUserMessage(msg, "SMARTINIT")
|
self._client.sendUserMessage(msg, "SMARTINIT")
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------------
|
||||||
|
# Returns the IFPDB object for the given db
|
||||||
|
#--------------------------------------------------------------------------
|
||||||
|
def getDb(self, dbString):
|
||||||
|
from com.raytheon.edex.plugin.gfe.smartinit import IFPDB
|
||||||
|
return IFPDB(dbString)
|
||||||
|
|
||||||
#--------------------------------------------------------------------------
|
#--------------------------------------------------------------------------
|
||||||
# Returns the source and destination databases, given the srcName.
|
# Returns the source and destination databases, given the srcName.
|
||||||
#--------------------------------------------------------------------------
|
#--------------------------------------------------------------------------
|
||||||
def _getLatest(self, client, srcNames, fcstName=None):
|
def _getLatest(self, client, srcNames, fcstName=None):
|
||||||
from com.raytheon.edex.plugin.gfe.smartinit import IFPDB
|
|
||||||
|
|
||||||
# ryu: Added/modified code to allow multiple sources. The srcdb is
|
# ryu: Added/modified code to allow multiple sources. The srcdb is
|
||||||
# now an MDB. This is needed for (AK)NAM40 init, which sources
|
# now an MDB. This is needed for (AK)NAM40 init, which sources
|
||||||
# from both NAM40 and NAM20.
|
# from both NAM40 and NAM20.
|
||||||
|
@ -600,7 +605,7 @@ class Forecaster(GridUtilities):
|
||||||
for src in srcNames:
|
for src in srcNames:
|
||||||
# source model at same model time
|
# source model at same model time
|
||||||
fullDBName = self.__dbName.replace(modelName, src)
|
fullDBName = self.__dbName.replace(modelName, src)
|
||||||
db = IFPDB(fullDBName)
|
db = self.getDb(fullDBName)
|
||||||
if db.getKeys().size() == 0:
|
if db.getKeys().size() == 0:
|
||||||
LogStream.logEvent("Source database " + fullDBName + \
|
LogStream.logEvent("Source database " + fullDBName + \
|
||||||
" is empty.")
|
" is empty.")
|
||||||
|
@ -633,7 +638,7 @@ class Forecaster(GridUtilities):
|
||||||
else:
|
else:
|
||||||
client.createDB(newdb)
|
client.createDB(newdb)
|
||||||
|
|
||||||
newdb = IFPDB(newdb)
|
newdb = self.getDb(newdb)
|
||||||
|
|
||||||
return srcdb, newdb
|
return srcdb, newdb
|
||||||
|
|
||||||
|
|
|
@ -76,7 +76,7 @@ class TextProduct(GenericHazards.TextProduct):
|
||||||
Definition["language"] = "english"
|
Definition["language"] = "english"
|
||||||
Definition["lineLength"] = 66 #Maximum line length
|
Definition["lineLength"] = 66 #Maximum line length
|
||||||
|
|
||||||
Definition["purgeTime"] = 24 # Default Expiration in hours if
|
Definition["purgeTime"] = 8 # Default Expiration in hours if
|
||||||
Definition["includeCities"] = 0 # Cities not included in area header
|
Definition["includeCities"] = 0 # Cities not included in area header
|
||||||
Definition["cityDescriptor"] = "INCLUDING THE CITIES OF"
|
Definition["cityDescriptor"] = "INCLUDING THE CITIES OF"
|
||||||
Definition["includeZoneNames"] = 1 # Zone names will be included in the area header
|
Definition["includeZoneNames"] = 1 # Zone names will be included in the area header
|
||||||
|
|
|
@ -86,6 +86,8 @@ import com.raytheon.uf.edex.wmo.message.AFOSProductId;
|
||||||
* 28Jul2010 2187 cjeanbap Fixed class exception in cccnnnxxxReadVersion.
|
* 28Jul2010 2187 cjeanbap Fixed class exception in cccnnnxxxReadVersion.
|
||||||
* 05Oct2010 cjeanbap Fixed a bug introduced on #2187; return distinct rows.
|
* 05Oct2010 cjeanbap Fixed a bug introduced on #2187; return distinct rows.
|
||||||
* 23May2012 14952 rferrel Added cccnnnxxxByRefTime.
|
* 23May2012 14952 rferrel Added cccnnnxxxByRefTime.
|
||||||
|
* 03Oct2012 15244 mgamazaychikov Added the fix to query the appropriate table
|
||||||
|
* (operational or practice)
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author garmendariz
|
* @author garmendariz
|
||||||
|
@ -133,7 +135,7 @@ public class StdTextProductDao extends CoreDao {
|
||||||
|
|
||||||
private static final String TM_QUERY_FMT = "select refTime from table_name where cccid='%s' and nnnid='%s' and xxxid='%s';";
|
private static final String TM_QUERY_FMT = "select refTime from table_name where cccid='%s' and nnnid='%s' and xxxid='%s';";
|
||||||
|
|
||||||
private static final String AFOS_QUERY_STMT = "from StdTextProduct prod where "
|
private static final String AFOS_QUERY_STMT = "from StdTextProduct where "
|
||||||
+ ProdCCC_ID
|
+ ProdCCC_ID
|
||||||
+ " = :"
|
+ " = :"
|
||||||
+ CCC_ID
|
+ CCC_ID
|
||||||
|
@ -309,7 +311,15 @@ public class StdTextProductDao extends CoreDao {
|
||||||
}
|
}
|
||||||
|
|
||||||
tx = session.beginTransaction();
|
tx = session.beginTransaction();
|
||||||
Query query = session.createQuery(AFOS_QUERY_STMT);
|
/*
|
||||||
|
* DR15244 - Make sure that the query is performed on the appropriate
|
||||||
|
* table based on what StdTextProduct is requested (ultimately on CAVE mode)
|
||||||
|
*/
|
||||||
|
Matcher m = Pattern.compile("StdTextProduct").matcher(AFOS_QUERY_STMT);
|
||||||
|
String tableName = stdTextProduct.getClass().getSimpleName();
|
||||||
|
String tableQuery = m.replaceAll(tableName);
|
||||||
|
Query query = session.createQuery(tableQuery);
|
||||||
|
|
||||||
|
|
||||||
if (version >= 0) {
|
if (version >= 0) {
|
||||||
query.setMaxResults(version + 1);
|
query.setMaxResults(version + 1);
|
||||||
|
|
|
@ -19,7 +19,9 @@ package com.raytheon.uf.edex.dat.utils;
|
||||||
* 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.
|
||||||
**/
|
**/
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Calendar;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
|
@ -68,6 +70,9 @@ public class FreezingLevel {
|
||||||
|
|
||||||
private int eighteenCount = 0;
|
private int eighteenCount = 0;
|
||||||
|
|
||||||
|
// reference time
|
||||||
|
Calendar refTime = null;
|
||||||
|
|
||||||
public FreezingLevel(String modelName) {
|
public FreezingLevel(String modelName) {
|
||||||
|
|
||||||
this.modelName = modelName;
|
this.modelName = modelName;
|
||||||
|
@ -76,14 +81,18 @@ public class FreezingLevel {
|
||||||
sixCount = 0;
|
sixCount = 0;
|
||||||
twelveCount = 0;
|
twelveCount = 0;
|
||||||
eighteenCount = 0;
|
eighteenCount = 0;
|
||||||
|
refTime = Calendar.getInstance();
|
||||||
|
// only for get data for hour 00z,06z,12z, or 18z
|
||||||
|
int adjustedHour = (refTime.get(Calendar.HOUR_OF_DAY) / 6) * 6;
|
||||||
|
refTime.set(Calendar.HOUR_OF_DAY, adjustedHour);
|
||||||
|
|
||||||
// populates what ever is missing, sets prevalent forecast hour
|
// populates what ever is missing, sets prevalent forecast hour
|
||||||
for (Entry<String, Integer> entry : getGHLevelMap().entrySet()) {
|
for (Entry<String, Integer> entry : getGHLevelMap().entrySet()) {
|
||||||
populateRecord(modelName, entry.getKey());
|
populateRecord(modelName, entry.getKey(), refTime.getTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Entry<String, Integer> entry : getTLevelMap().entrySet()) {
|
for (Entry<String, Integer> entry : getTLevelMap().entrySet()) {
|
||||||
populateRecord(modelName, entry.getKey());
|
populateRecord(modelName, entry.getKey(), refTime.getTime());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,40 +131,41 @@ public class FreezingLevel {
|
||||||
Integer jtopLevel = null;
|
Integer jtopLevel = null;
|
||||||
Integer ktopLevel = null;
|
Integer ktopLevel = null;
|
||||||
|
|
||||||
System.out
|
System.out
|
||||||
.println("********** Starting Freezing Level Calculations *****************");
|
.println("********** Starting Freezing Level Calculations *****************");
|
||||||
for (Integer level : ghValues.keySet()) {
|
for (Integer level : ghValues.keySet()) {
|
||||||
|
|
||||||
Double tValue = tValues.get(level);
|
Double tValue = tValues.get(level);
|
||||||
Double ghValue = ghValues.get(level);
|
Double ghValue = ghValues.get(level);
|
||||||
System.out.println("GH Value: "+ghValue+" TValue: "+tValue);
|
System.out.println("GH Value: " + ghValue + " TValue: "
|
||||||
|
+ tValue);
|
||||||
|
|
||||||
if (ghValue != null && ghValue > -9000) {
|
if (ghValue != null && ghValue > -9000) {
|
||||||
if (tValue != null && tValue > 273.16) {
|
if (tValue != null && tValue > 273.16) {
|
||||||
|
|
||||||
fLevel = (ghValues.get(ktopLevel) - ((ghValues
|
fLevel = (ghValues.get(ktopLevel) - ((ghValues
|
||||||
.get(ktopLevel) - ghValue) * ((273.16 - tValues
|
.get(ktopLevel) - ghValue) * ((273.16 - tValues
|
||||||
.get(jtopLevel)
|
.get(jtopLevel)) / (tValue - tValues
|
||||||
/ (tValue - tValues.get(jtopLevel)))))) * .00328;
|
.get(jtopLevel))))) * .00328;
|
||||||
System.out.println("Formula:");
|
System.out.println("Formula:");
|
||||||
System.out.println("(" + ghValues.get(ktopLevel)
|
System.out.println("(" + ghValues.get(ktopLevel)
|
||||||
+ " - ((" + ghValues.get(ktopLevel) + " - "
|
+ " - ((" + ghValues.get(ktopLevel) + " - "
|
||||||
+ ghValue + ") * ((273.16 - "
|
+ ghValue + ") * ((273.16 - "
|
||||||
+ tValues.get(jtopLevel) + " / (" + tValue
|
+ tValues.get(jtopLevel) + ") / (" + tValue
|
||||||
+ " - " + tValues.get(jtopLevel)
|
+ " - " + tValues.get(jtopLevel)
|
||||||
+ "))))) * .00328)");
|
+ ")))) * .00328");
|
||||||
System.out.println("*** FreezingLevel = " + fLevel);
|
System.out.println("*** FreezingLevel = " + fLevel);
|
||||||
freezingMap.put(coor, fLevel.floatValue());
|
freezingMap.put(coor, fLevel.floatValue());
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
jtopLevel = level;
|
jtopLevel = level;
|
||||||
ktopLevel = level;
|
ktopLevel = level;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
System.out
|
System.out
|
||||||
.println("********** Finished Freezing Level Calculations *****************");
|
.println("********** Finished Freezing Level Calculations *****************");
|
||||||
}
|
}
|
||||||
|
|
||||||
return freezingMap;
|
return freezingMap;
|
||||||
}
|
}
|
||||||
|
@ -235,12 +245,13 @@ public class FreezingLevel {
|
||||||
* @param param
|
* @param param
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private GribRecord populateRecord(String model, String param) {
|
private GribRecord populateRecord(String model, String param, Date refTime) {
|
||||||
int interval = 1440;
|
int interval = 1440;
|
||||||
|
|
||||||
SCANModelParameterXML paramXML = new SCANModelParameterXML();
|
SCANModelParameterXML paramXML = new SCANModelParameterXML();
|
||||||
paramXML.setModelName(model);
|
paramXML.setModelName(model);
|
||||||
paramXML.setParameterName(param);
|
paramXML.setParameterName(param);
|
||||||
String sql = getSQL(interval, model, param);
|
String sql = getSQL(interval, model, param, refTime);
|
||||||
GribRecord modelRec = DATUtils.getMostRecentGribRecord(interval, sql,
|
GribRecord modelRec = DATUtils.getMostRecentGribRecord(interval, sql,
|
||||||
paramXML);
|
paramXML);
|
||||||
|
|
||||||
|
@ -327,9 +338,12 @@ public class FreezingLevel {
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private String getSQL(int interval, String model, String param) {
|
private String getSQL(int interval, String model, String param, Date refTime) {
|
||||||
String paramName = null;
|
String paramName = null;
|
||||||
String level = null;
|
String level = null;
|
||||||
|
SimpleDateFormat sdt = new SimpleDateFormat("yyyy-MM-dd HH:00:00");
|
||||||
|
|
||||||
|
String refTimeStr = sdt.format(refTime);
|
||||||
if (param.startsWith("GH")) {
|
if (param.startsWith("GH")) {
|
||||||
paramName = "GH";
|
paramName = "GH";
|
||||||
level = param.substring(2, param.length());
|
level = param.substring(2, param.length());
|
||||||
|
@ -346,7 +360,9 @@ public class FreezingLevel {
|
||||||
+ "\' and level_id = (select id from level where masterlevel_name = 'MB' and levelonevalue = '"
|
+ "\' and level_id = (select id from level where masterlevel_name = 'MB' and levelonevalue = '"
|
||||||
+ level
|
+ level
|
||||||
+ "\'"
|
+ "\'"
|
||||||
+ " limit 1)) order by forecasttime desc limit 1";
|
+ " limit 1)) and reftime='"
|
||||||
|
+ refTimeStr
|
||||||
|
+ "' order by reftime desc, forecasttime desc limit 1";
|
||||||
return sql;
|
return sql;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
|
|
||||||
|
|
||||||
<bean id="dqcPreprocService" class="com.raytheon.uf.edex.ohd.pproc.DqcPreProcSrv" />
|
<bean id="dqcPreprocService" class="com.raytheon.uf.edex.ohd.pproc.DqcPreProcSrv" />
|
||||||
<bean id="mpeRucFreezingLevel" class="com.raytheon.uf.edex.ohd.pproc.MpeRUCFreezingLevel" />
|
|
||||||
|
|
||||||
<camelContext id="dqcPreproc-context"
|
<camelContext id="dqcPreproc-context"
|
||||||
xmlns="http://camel.apache.org/schema/spring"
|
xmlns="http://camel.apache.org/schema/spring"
|
||||||
|
@ -29,14 +28,6 @@
|
||||||
<to uri="log:dqcPreprocessor?level=ERROR&showBody=false&showCaughtException=true&showStackTrace=true"/>
|
<to uri="log:dqcPreprocessor?level=ERROR&showBody=false&showCaughtException=true&showStackTrace=true"/>
|
||||||
</doCatch>
|
</doCatch>
|
||||||
</doTry>
|
</doTry>
|
||||||
|
|
||||||
<doTry>
|
|
||||||
<bean ref="mpeRucFreezingLevel" method="processMpeRuc" />
|
|
||||||
<doCatch>
|
|
||||||
<exception>java.lang.Throwable</exception>
|
|
||||||
<to uri="log:dqcPreprocessor?level=ERROR&showBody=false&showCaughtException=true&showStackTrace=true"/>
|
|
||||||
</doCatch>
|
|
||||||
</doTry>
|
|
||||||
</route>
|
</route>
|
||||||
|
|
||||||
</camelContext>
|
</camelContext>
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||||
|
xmlns:amq="http://activemq.apache.org/schema/core" 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-2.0.xsd
|
||||||
|
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd
|
||||||
|
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
|
||||||
|
|
||||||
|
|
||||||
|
<bean id="mpeRucFreezingLevel" class="com.raytheon.uf.edex.ohd.pproc.MpeRUCFreezingLevel" />
|
||||||
|
|
||||||
|
<camelContext id="frzLvlProc-context"
|
||||||
|
xmlns="http://camel.apache.org/schema/spring"
|
||||||
|
errorHandlerRef="errorHandler">
|
||||||
|
|
||||||
|
<endpoint id="frzLvlProcCron" uri="clusteredquartz://pproc/frzLvlProcScheduled/?cron=${freezingLevel.cron}"/>
|
||||||
|
|
||||||
|
<!-- Run frzLvlProc on Scheduled timer -->
|
||||||
|
<route id="frzLvlProcScheduled">
|
||||||
|
<from uri="frzLvlProcCron" />
|
||||||
|
<to uri="jms-generic:queue:frzLvlProcScheduledWork" />
|
||||||
|
</route>
|
||||||
|
|
||||||
|
<route id="frzLvlProcScheduledWork">
|
||||||
|
<from uri="jms-generic:queue:frzLvlProcScheduledWork" />
|
||||||
|
<doTry>
|
||||||
|
<bean ref="mpeRucFreezingLevel" method="processMpeRuc" />
|
||||||
|
<doCatch>
|
||||||
|
<exception>java.lang.Throwable</exception>
|
||||||
|
<to uri="log:frzLvlProcessor?level=ERROR&showBody=false&showCaughtException=true&showStackTrace=true"/>
|
||||||
|
</doCatch>
|
||||||
|
</doTry>
|
||||||
|
</route>
|
||||||
|
|
||||||
|
</camelContext>
|
||||||
|
|
||||||
|
</beans>
|
|
@ -33,6 +33,7 @@ import java.io.InputStreamReader;
|
||||||
import java.io.OutputStreamWriter;
|
import java.io.OutputStreamWriter;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Calendar;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
|
@ -61,9 +62,10 @@ public class MpeRUCFreezingLevel {
|
||||||
*
|
*
|
||||||
* <pre>
|
* <pre>
|
||||||
* SOFTWARE HISTORY
|
* SOFTWARE HISTORY
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ -------- --------- --------------------------
|
||||||
* Nov 19, 2011 dhladky Initial Creation.
|
* Nov 19, 2011 dhladky Initial Creation.
|
||||||
|
* Oct 09, 2012 15168 wkwock Fix incorrect values.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -80,10 +82,15 @@ public class MpeRUCFreezingLevel {
|
||||||
public static String modelOutputFilePath = AppsDefaults.getInstance()
|
public static String modelOutputFilePath = AppsDefaults.getInstance()
|
||||||
.getToken("mpe_point_freezing_dir");
|
.getToken("mpe_point_freezing_dir");
|
||||||
|
|
||||||
|
public static String dqcPreprocessorBasetime = AppsDefaults.getInstance()
|
||||||
|
.getToken("DQC_PREPROCESSOR_BASETIME");
|
||||||
|
|
||||||
public File stationFile = null;
|
public File stationFile = null;
|
||||||
|
|
||||||
|
final String RUC2 = "RUC236";
|
||||||
|
|
||||||
// models used by MPE
|
// models used by MPE
|
||||||
public static String[] models = new String[] { "RUC130", "RUC80" };
|
public static String[] models = new String[] { "RUC236" };
|
||||||
|
|
||||||
public MpeRUCFreezingLevel() {
|
public MpeRUCFreezingLevel() {
|
||||||
File directory = new File(stationFilePath);
|
File directory = new File(stationFilePath);
|
||||||
|
@ -97,274 +104,342 @@ public class MpeRUCFreezingLevel {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// correct env vairiable dqcPreprocessorBasetime if needed
|
||||||
|
if (dqcPreprocessorBasetime == null) {
|
||||||
|
dqcPreprocessorBasetime = "00z";
|
||||||
|
}
|
||||||
|
|
||||||
|
dqcPreprocessorBasetime = dqcPreprocessorBasetime.toLowerCase();
|
||||||
|
if (!dqcPreprocessorBasetime.equals("00z")
|
||||||
|
&& !dqcPreprocessorBasetime.equals("06z")
|
||||||
|
&& !dqcPreprocessorBasetime.equals("12z")
|
||||||
|
&& !dqcPreprocessorBasetime.equals("18z")) {
|
||||||
|
dqcPreprocessorBasetime = "00z";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read freezing station list from file
|
||||||
|
* $mpe_station_list_dir/$SITENAME_freezing_station_list
|
||||||
|
*/
|
||||||
|
private LinkedHashMap<String, Coordinate> readFrzStnLst() {
|
||||||
|
if (stationFile == null) {
|
||||||
|
statusHandler.handle(Priority.ERROR,
|
||||||
|
"File freezing_station_list not found....");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
LinkedHashMap<String, Coordinate> freezingStations = new LinkedHashMap<String, Coordinate>();
|
||||||
|
|
||||||
|
FileInputStream ifstream = null;
|
||||||
|
DataInputStream in = null;
|
||||||
|
BufferedReader br = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
ifstream = new FileInputStream(stationFile);
|
||||||
|
in = new DataInputStream(ifstream);
|
||||||
|
br = new BufferedReader(new InputStreamReader(in));
|
||||||
|
String line;
|
||||||
|
Double lat = null;
|
||||||
|
Double lon = null;
|
||||||
|
while (br.ready()) {
|
||||||
|
line = br.readLine();
|
||||||
|
if (line != null) {
|
||||||
|
statusHandler.handle(Priority.INFO, line);
|
||||||
|
String[] aline = line.split("\\s+");
|
||||||
|
|
||||||
|
if (aline != null && aline.length > 0) {
|
||||||
|
try {
|
||||||
|
String stationId = aline[0].trim();
|
||||||
|
lat = Double.valueOf(aline[2].trim());
|
||||||
|
// take times negative 1 to make it true West
|
||||||
|
lon = Double.valueOf(aline[3].trim()) * (-1);
|
||||||
|
|
||||||
|
if (stationId != null && lat != null && lon != null) {
|
||||||
|
Coordinate coor = new Coordinate(lon, lat, 0.0);
|
||||||
|
freezingStations.put(stationId, coor);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
statusHandler.handle(
|
||||||
|
Priority.INFO,
|
||||||
|
"finished parsing "
|
||||||
|
+ stationFile.getAbsolutePath()
|
||||||
|
+ " \n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
statusHandler.handle(Priority.ERROR, "Unable to read file "
|
||||||
|
+ stationFile.getAbsolutePath() + " \n");
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
} finally {
|
||||||
|
if (br != null) {
|
||||||
|
try {
|
||||||
|
br.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in != null) {
|
||||||
|
try {
|
||||||
|
in.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ifstream != null) {
|
||||||
|
try {
|
||||||
|
ifstream.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return freezingStations;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void writeResult(
|
||||||
|
LinkedHashMap<String, Coordinate> freezingStations,
|
||||||
|
HashMap<String, HashMap<Integer, FreezingLevelXML>> freezingTimeMap) {
|
||||||
|
// Now write to the result file freezing_1_SITENAME_point_yyyymmdd
|
||||||
|
// compare first forecast hour list against all others
|
||||||
|
FileOutputStream ofstream = null;
|
||||||
|
DataOutputStream out = null;
|
||||||
|
BufferedWriter bw = null;
|
||||||
|
Calendar dates[] = getSortedDates(dqcPreprocessorBasetime);// get the
|
||||||
|
// dates and
|
||||||
|
// hours in
|
||||||
|
// order
|
||||||
|
|
||||||
|
try {
|
||||||
|
String site = PropertiesFactory.getInstance().getEnvProperties()
|
||||||
|
.getEnvValue("SITENAME");
|
||||||
|
ofstream = new FileOutputStream(getAbsoluteOutFileName(
|
||||||
|
dates[3].getTime(), site));
|
||||||
|
out = new DataOutputStream(ofstream);
|
||||||
|
bw = new BufferedWriter(new OutputStreamWriter(out));
|
||||||
|
|
||||||
|
String dhStr = "DH" + dqcPreprocessorBasetime.substring(0, 2);
|
||||||
|
|
||||||
|
for (Entry<String, Coordinate> entry : freezingStations.entrySet()) {
|
||||||
|
|
||||||
|
Coordinate coor = entry.getValue();
|
||||||
|
|
||||||
|
StringBuffer buf = new StringBuffer();
|
||||||
|
// ".E Z$stn $otdate1 DH18/HZIRZ/DIH+6/ $v0/ $v1/ $v2/ $v3\n"
|
||||||
|
|
||||||
|
buf.append(".E " + entry.getKey() + " "
|
||||||
|
+ getFormattedDate(dates[3].getTime()) + " " + dhStr
|
||||||
|
+ "/HZIRZ/DIH+6/");
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
for (int j = 0; j < dates.length; j++) {
|
||||||
|
|
||||||
|
FreezingLevelEntry fle = null;
|
||||||
|
|
||||||
|
// Does a preference for the first model defined. RUC130
|
||||||
|
// has higher resolution so it gets preference
|
||||||
|
if (fle == null) {
|
||||||
|
if (freezingTimeMap.containsKey(RUC2)) {
|
||||||
|
HashMap<Integer, FreezingLevelXML> modelFl = freezingTimeMap
|
||||||
|
.get(RUC2);
|
||||||
|
|
||||||
|
if (modelFl.containsKey(dates[j]
|
||||||
|
.get(Calendar.HOUR_OF_DAY))) {
|
||||||
|
FreezingLevelXML flx = modelFl.get(dates[j]
|
||||||
|
.get(Calendar.HOUR_OF_DAY));
|
||||||
|
if (flx != null && flx.getDate() != null) {
|
||||||
|
// same expected year,month,day,and hour
|
||||||
|
if (Math.floor(flx.getDate().getTime() / 1000 / 60 / 60) == Math
|
||||||
|
.floor(dates[j].getTimeInMillis() / 1000 / 60 / 60)) {
|
||||||
|
fle = flx.getEntry(coor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String fzlev = "M";
|
||||||
|
|
||||||
|
if (fle != null) {
|
||||||
|
fzlev = String.valueOf(fle.getFreezingLevel())
|
||||||
|
.substring(0, 4) + "S";
|
||||||
|
}
|
||||||
|
|
||||||
|
buf.append(" " + fzlev);
|
||||||
|
|
||||||
|
if (i < 3) {
|
||||||
|
buf.append("/");
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
statusHandler.handle(Priority.INFO, buf.toString());
|
||||||
|
bw.write(buf.toString() + "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
statusHandler.handle(Priority.ERROR,
|
||||||
|
"Processing Level SHEF output failed...");
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
|
||||||
|
if (bw != null) {
|
||||||
|
try {
|
||||||
|
bw.flush();
|
||||||
|
bw.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (out != null) {
|
||||||
|
try {
|
||||||
|
out.flush();
|
||||||
|
out.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ofstream != null) {
|
||||||
|
try {
|
||||||
|
ofstream.flush();
|
||||||
|
ofstream.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Process the MPE freezing Levels
|
* Process the MPE freezing Levels
|
||||||
*/
|
*/
|
||||||
public void processMpeRuc() {
|
public void processMpeRuc() {
|
||||||
|
Integer forecastHour = null;
|
||||||
|
HashMap<String, HashMap<Integer, FreezingLevelXML>> freezingTimeMap = new HashMap<String, HashMap<Integer, FreezingLevelXML>>();
|
||||||
|
LinkedHashMap<String, Coordinate> freezingStations = new LinkedHashMap<String, Coordinate>();
|
||||||
|
|
||||||
if (stationFile != null) {
|
// get the freezing station list from file
|
||||||
|
freezingStations = readFrzStnLst();
|
||||||
HashMap<String, FreezingLevel> FreezeLevelMap = new HashMap<String, FreezingLevel>();
|
if (freezingStations == null) {
|
||||||
|
return;
|
||||||
for (String model : models) {
|
|
||||||
FreezingLevel fl = new FreezingLevel(model);
|
|
||||||
if (fl != null) {
|
|
||||||
FreezeLevelMap.put(model, fl);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Integer forecastHour = null;
|
|
||||||
Date outputDate = null;
|
|
||||||
HashMap<String, HashMap<Integer, FreezingLevelXML>> freezingTimeMap = new HashMap<String, HashMap<Integer, FreezingLevelXML>>();
|
|
||||||
LinkedHashMap<String, Coordinate> freezingStations = new LinkedHashMap<String, Coordinate>();
|
|
||||||
|
|
||||||
FileInputStream ifstream = null;
|
|
||||||
DataInputStream in = null;
|
|
||||||
BufferedReader br = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
ifstream = new FileInputStream(stationFile);
|
|
||||||
in = new DataInputStream(ifstream);
|
|
||||||
br = new BufferedReader(new InputStreamReader(in));
|
|
||||||
String line;
|
|
||||||
Double lat = null;
|
|
||||||
Double lon = null;
|
|
||||||
while (br.ready()) {
|
|
||||||
line = br.readLine();
|
|
||||||
if (line != null) {
|
|
||||||
statusHandler.handle(Priority.INFO, line);
|
|
||||||
String[] aline = line.split("\\s+");
|
|
||||||
|
|
||||||
if (aline != null && aline.length > 0) {
|
|
||||||
try {
|
|
||||||
String stationId = aline[0].trim();
|
|
||||||
lat = Double.valueOf(aline[2].trim());
|
|
||||||
// take times negative 1 to make it true West
|
|
||||||
lon = Double.valueOf(aline[3].trim()) * (-1);
|
|
||||||
|
|
||||||
if (stationId != null && lat != null
|
|
||||||
&& lon != null) {
|
|
||||||
Coordinate coor = new Coordinate(lon, lat,
|
|
||||||
0.0);
|
|
||||||
freezingStations.put(stationId, coor);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
statusHandler.handle(
|
|
||||||
Priority.INFO,
|
|
||||||
"finished parsing "
|
|
||||||
+ stationFile.getAbsolutePath()
|
|
||||||
+ " \n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
statusHandler.handle(Priority.ERROR, "Unable to read file "
|
|
||||||
+ stationFile.getAbsolutePath() + " \n");
|
|
||||||
e.printStackTrace();
|
|
||||||
} finally {
|
|
||||||
if (br != null) {
|
|
||||||
try {
|
|
||||||
br.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in != null) {
|
|
||||||
try {
|
|
||||||
in.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ifstream != null) {
|
|
||||||
try {
|
|
||||||
ifstream.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
HashMap<Coordinate, Float> freezingLevels = null;
|
|
||||||
|
|
||||||
for (String model : models) {
|
|
||||||
if (FreezeLevelMap.containsKey(model)) {
|
|
||||||
FreezingLevel fl = FreezeLevelMap.get(model);
|
|
||||||
ArrayList<FreezingLevelEntry> freezes = null;
|
|
||||||
|
|
||||||
if (freezingLevels == null) {
|
|
||||||
freezingLevels = fl
|
|
||||||
.getFreezingLevel(getCoordinates(freezingStations));
|
|
||||||
|
|
||||||
freezes = new ArrayList<FreezingLevelEntry>();
|
|
||||||
|
|
||||||
for (Entry<Coordinate, Float> entry : freezingLevels
|
|
||||||
.entrySet()) {
|
|
||||||
FreezingLevelEntry fle = new FreezingLevelEntry(
|
|
||||||
entry.getKey(), entry.getValue());
|
|
||||||
freezes.add(fle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FreezingLevelXML flx = new FreezingLevelXML(freezes);
|
|
||||||
|
|
||||||
if (forecastHour == null && outputDate == null) {
|
|
||||||
forecastHour = getConvertedForecastHour(fl);
|
|
||||||
outputDate = fl.getReferenceTime(fl
|
|
||||||
.getForecastHour());
|
|
||||||
}
|
|
||||||
|
|
||||||
flx.setForecastHour(forecastHour);
|
|
||||||
HashMap<Integer, FreezingLevelXML> modelFl = new HashMap<Integer, FreezingLevelXML>();
|
|
||||||
modelFl.put(forecastHour, flx);
|
|
||||||
freezingTimeMap.put(model, modelFl);
|
|
||||||
writeFreezingLevelTemp(flx, model);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
statusHandler.handle(Priority.ERROR,
|
|
||||||
"Processing Freezing Level failed...");
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
FileOutputStream ofstream = null;
|
|
||||||
DataOutputStream out = null;
|
|
||||||
BufferedWriter bw = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
// Get other hour files read in
|
|
||||||
for (String model : models) {
|
|
||||||
|
|
||||||
HashMap<Integer, FreezingLevelXML> modelFl = freezingTimeMap
|
|
||||||
.get(model);
|
|
||||||
|
|
||||||
if (modelFl != null) {
|
|
||||||
for (RUC_TIME time : RUC_TIME.values()) {
|
|
||||||
|
|
||||||
int fileTime = Integer.valueOf(time.getTime());
|
|
||||||
|
|
||||||
if (!modelFl.containsKey(fileTime)) {
|
|
||||||
|
|
||||||
FreezingLevelXML flx1 = readFreezingLevel(
|
|
||||||
fileTime, model);
|
|
||||||
|
|
||||||
if (flx1 != null) {
|
|
||||||
modelFl.put(flx1.getForecastHour(), flx1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
freezingTimeMap.put(model, modelFl);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// compare first forecast hour list against all others
|
|
||||||
String site = PropertiesFactory.getInstance()
|
|
||||||
.getEnvProperties().getEnvValue("SITENAME");
|
|
||||||
ArrayList<Integer> orderedHours = getOrderedHours(forecastHour);
|
|
||||||
ofstream = new FileOutputStream(getAbsoluteOutFileName(
|
|
||||||
outputDate, site));
|
|
||||||
out = new DataOutputStream(ofstream);
|
|
||||||
bw = new BufferedWriter(new OutputStreamWriter(out));
|
|
||||||
|
|
||||||
for (Entry<String, Coordinate> entry : freezingStations
|
|
||||||
.entrySet()) {
|
|
||||||
|
|
||||||
Coordinate coor = entry.getValue();
|
|
||||||
|
|
||||||
StringBuffer buf = new StringBuffer();
|
|
||||||
// ".E Z$stn $otdate1 DH18/HZIRZ/DIH+6/ $v0/ $v1/ $v2/ $v3\n"
|
|
||||||
buf.append(".E " + entry.getKey() + " "
|
|
||||||
+ getFormattedDate(outputDate)
|
|
||||||
+ " DH18/HZIRZ/DIH+6/");
|
|
||||||
|
|
||||||
int i = 0;
|
|
||||||
for (Integer hour : orderedHours) {
|
|
||||||
|
|
||||||
FreezingLevelEntry fle = null;
|
|
||||||
|
|
||||||
// Does a preference for the first model defined. RUC130
|
|
||||||
// has higher resolution so it gets preference
|
|
||||||
for (String model : models) {
|
|
||||||
if (fle == null) {
|
|
||||||
if (freezingTimeMap.containsKey(model)) {
|
|
||||||
HashMap<Integer, FreezingLevelXML> modelFl = freezingTimeMap
|
|
||||||
.get(model);
|
|
||||||
|
|
||||||
if (modelFl.containsKey(hour)) {
|
|
||||||
FreezingLevelXML flx = modelFl
|
|
||||||
.get(hour);
|
|
||||||
fle = flx.getEntry(coor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String fzlev = "M";
|
|
||||||
|
|
||||||
if (fle != null) {
|
|
||||||
fzlev = "" + fle.getFreezingLevel();
|
|
||||||
}
|
|
||||||
|
|
||||||
buf.append(" " + fzlev);
|
|
||||||
|
|
||||||
if (i < 3) {
|
|
||||||
buf.append("/");
|
|
||||||
} else {
|
|
||||||
buf.append("\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
statusHandler.handle(Priority.INFO, buf.toString());
|
|
||||||
bw.write(buf.toString() + "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
statusHandler.handle(Priority.ERROR,
|
|
||||||
"Processing Level SHEF output failed...");
|
|
||||||
e.printStackTrace();
|
|
||||||
} finally {
|
|
||||||
|
|
||||||
if (bw != null) {
|
|
||||||
try {
|
|
||||||
bw.flush();
|
|
||||||
bw.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (out != null) {
|
|
||||||
try {
|
|
||||||
out.flush();
|
|
||||||
out.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ofstream != null) {
|
|
||||||
try {
|
|
||||||
ofstream.flush();
|
|
||||||
ofstream.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
statusHandler.handle(Priority.ERROR,
|
|
||||||
"File freezing_station_list not found....");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get data from hdf5 for this run
|
||||||
|
FreezingLevel fl = new FreezingLevel(RUC2);
|
||||||
|
|
||||||
|
// Save data for future use
|
||||||
|
try {
|
||||||
|
HashMap<Coordinate, Float> freezingLevels = null;
|
||||||
|
|
||||||
|
ArrayList<FreezingLevelEntry> freezes = null;
|
||||||
|
|
||||||
|
if (freezingLevels == null) {
|
||||||
|
freezingLevels = fl
|
||||||
|
.getFreezingLevel(getCoordinates(freezingStations));
|
||||||
|
|
||||||
|
freezes = new ArrayList<FreezingLevelEntry>();
|
||||||
|
|
||||||
|
for (Entry<Coordinate, Float> entry : freezingLevels.entrySet()) {
|
||||||
|
FreezingLevelEntry fle = new FreezingLevelEntry(
|
||||||
|
entry.getKey(), entry.getValue());
|
||||||
|
freezes.add(fle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FreezingLevelXML flx = new FreezingLevelXML(freezes);
|
||||||
|
|
||||||
|
Calendar refTime = Calendar.getInstance();
|
||||||
|
// only for get data for hour 00z,06z,12z, or 18z
|
||||||
|
int adjustedHour = (refTime.get(Calendar.HOUR_OF_DAY) / 6) * 6;
|
||||||
|
refTime.set(Calendar.HOUR_OF_DAY, adjustedHour);
|
||||||
|
flx.setDate(refTime.getTime());
|
||||||
|
flx.setForecastHour(adjustedHour);
|
||||||
|
|
||||||
|
HashMap<Integer, FreezingLevelXML> modelFl = new HashMap<Integer, FreezingLevelXML>();
|
||||||
|
modelFl.put(forecastHour, flx);
|
||||||
|
freezingTimeMap.put(RUC2, modelFl);
|
||||||
|
writeFreezingLevelTemp(flx, RUC2);
|
||||||
|
} catch (Exception e) {
|
||||||
|
statusHandler.handle(Priority.ERROR,
|
||||||
|
"Processing Freezing Level failed...");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
// get all data from previously saved data from
|
||||||
|
// mpe/dailyQC/freezing_level/point/RUC236[0,6,12,18]zFreezingLevel.bin
|
||||||
|
// Get other hour files read in
|
||||||
|
for (String model : models) {
|
||||||
|
|
||||||
|
HashMap<Integer, FreezingLevelXML> modelFl = freezingTimeMap
|
||||||
|
.get(model);
|
||||||
|
|
||||||
|
if (modelFl != null) {
|
||||||
|
for (RUC_TIME time : RUC_TIME.values()) {
|
||||||
|
|
||||||
|
int fileTime = Integer.valueOf(time.getTime());
|
||||||
|
|
||||||
|
if (!modelFl.containsKey(fileTime)) {
|
||||||
|
|
||||||
|
FreezingLevelXML flx1 = readFreezingLevel(fileTime,
|
||||||
|
model);
|
||||||
|
|
||||||
|
if (flx1 != null) {
|
||||||
|
modelFl.put(flx1.getForecastHour(), flx1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
freezingTimeMap.put(model, modelFl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// now write to result file freezing_1_SITENAME_point_yyyymmdd
|
||||||
|
writeResult(freezingStations, freezingTimeMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* setup dates
|
||||||
|
*/
|
||||||
|
private Calendar[] getSortedDates(String dqcPreprocessorBasetime) {
|
||||||
|
Calendar dates[] = new Calendar[4];
|
||||||
|
|
||||||
|
Calendar cdate = Calendar.getInstance();// start date
|
||||||
|
Calendar tdate = Calendar.getInstance();// end date
|
||||||
|
int currentHour = cdate.get(Calendar.HOUR_OF_DAY);
|
||||||
|
|
||||||
|
int dqcHour = Integer.parseInt(dqcPreprocessorBasetime.substring(0, 2));
|
||||||
|
if (currentHour < dqcHour && dqcHour != 0) {
|
||||||
|
cdate.add(Calendar.DATE, -1);
|
||||||
|
} else if (dqcHour != 0) {
|
||||||
|
tdate.add(Calendar.DATE, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Calendar startDate = tdate;
|
||||||
|
if (dqcPreprocessorBasetime.equalsIgnoreCase("00z")) {
|
||||||
|
startDate = (Calendar) tdate.clone();
|
||||||
|
} else {
|
||||||
|
startDate = (Calendar) cdate.clone();
|
||||||
|
}
|
||||||
|
|
||||||
|
startDate.set(Calendar.HOUR_OF_DAY, dqcHour);
|
||||||
|
|
||||||
|
for (int i = 0; i < dates.length; i++) {
|
||||||
|
dates[i] = (Calendar) startDate.clone();
|
||||||
|
startDate.add(Calendar.HOUR_OF_DAY, 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
return dates;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -468,41 +543,6 @@ public class MpeRUCFreezingLevel {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the ordering for the SHEF output
|
|
||||||
*
|
|
||||||
* @param forecastHour
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
private ArrayList<Integer> getOrderedHours(int forecastHour) {
|
|
||||||
|
|
||||||
ArrayList<Integer> orderedHours = new ArrayList<Integer>();
|
|
||||||
|
|
||||||
if (forecastHour == 0) {
|
|
||||||
orderedHours.add(0);
|
|
||||||
orderedHours.add(6);
|
|
||||||
orderedHours.add(12);
|
|
||||||
orderedHours.add(18);
|
|
||||||
} else if (forecastHour == 6) {
|
|
||||||
orderedHours.add(6);
|
|
||||||
orderedHours.add(12);
|
|
||||||
orderedHours.add(18);
|
|
||||||
orderedHours.add(0);
|
|
||||||
} else if (forecastHour == 12) {
|
|
||||||
orderedHours.add(12);
|
|
||||||
orderedHours.add(18);
|
|
||||||
orderedHours.add(0);
|
|
||||||
orderedHours.add(6);
|
|
||||||
} else if (forecastHour == 18) {
|
|
||||||
orderedHours.add(18);
|
|
||||||
orderedHours.add(0);
|
|
||||||
orderedHours.add(6);
|
|
||||||
orderedHours.add(12);
|
|
||||||
}
|
|
||||||
|
|
||||||
return orderedHours;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Formats the output date
|
* Formats the output date
|
||||||
*
|
*
|
||||||
|
@ -534,30 +574,4 @@ public class MpeRUCFreezingLevel {
|
||||||
|
|
||||||
return coors;
|
return coors;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Used only by the MPE RUC130 for SHEF output
|
|
||||||
*
|
|
||||||
* @param ft
|
|
||||||
*/
|
|
||||||
private int getConvertedForecastHour(FreezingLevel fl) {
|
|
||||||
|
|
||||||
int flTime = fl.getForecastHour();
|
|
||||||
int retVal = 0;
|
|
||||||
|
|
||||||
if (flTime >= 0 && flTime < 3) {
|
|
||||||
retVal = 0;
|
|
||||||
} else if (flTime >= 3 && flTime < 9) {
|
|
||||||
retVal = 6;
|
|
||||||
} else if (flTime >= 9 && flTime < 15) {
|
|
||||||
retVal = 12;
|
|
||||||
} else if (flTime >= 15 && flTime < 21) {
|
|
||||||
retVal = 18;
|
|
||||||
} else if (flTime >= 21) {
|
|
||||||
retVal = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@ XML_TEMPLATE = ""
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import os.path
|
import os.path
|
||||||
|
from os import path, access, R_OK
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
class MainData:
|
class MainData:
|
||||||
|
@ -92,6 +93,12 @@ fileName = os.path.split(file)[1]
|
||||||
|
|
||||||
if fileName == "spotters.dat":
|
if fileName == "spotters.dat":
|
||||||
workFile = "/tmp/spotters.dat"
|
workFile = "/tmp/spotters.dat"
|
||||||
|
if path.exists(workFile) and path.isfile(workFile) and access(workFile, R_OK):
|
||||||
|
print "Attempting to cleanup work directory"
|
||||||
|
os.system("rm /tmp/spotters.dat")
|
||||||
|
else:
|
||||||
|
print "No preliminary cleanup needed - continuing"
|
||||||
|
|
||||||
shutil.copy(file, workFile)
|
shutil.copy(file, workFile)
|
||||||
os.system("sed -i -e 's/spotterName/spottersName/g' /tmp/spotters.dat")
|
os.system("sed -i -e 's/spotterName/spottersName/g' /tmp/spotters.dat")
|
||||||
os.system("sed -i -e 's/spotterAddr/spottersAddr/g' /tmp/spotters.dat")
|
os.system("sed -i -e 's/spotterAddr/spottersAddr/g' /tmp/spotters.dat")
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
# Date Ticket# Engineer Description
|
# Date Ticket# Engineer Description
|
||||||
# ------------ ---------- ----------- --------------------------
|
# ------------ ---------- ----------- --------------------------
|
||||||
# 04/06/2012 10388 mhuang Initial creation
|
# 04/06/2012 10388 mhuang Initial creation
|
||||||
|
# 10/09/12 DR 13901 D. Friedman Add logging
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
# this allows you to run this script from outside of ./bin
|
# this allows you to run this script from outside of ./bin
|
||||||
|
@ -27,5 +28,10 @@ export PYTHONPATH=${RUN_FROM_DIR}/src:$PYTHONPATH
|
||||||
_PYTHON="${PYTHON_INSTALL}/bin/python"
|
_PYTHON="${PYTHON_INSTALL}/bin/python"
|
||||||
_MODULE="${RUN_FROM_DIR}/src/qpidNotify/mhsAckNotify.py"
|
_MODULE="${RUN_FROM_DIR}/src/qpidNotify/mhsAckNotify.py"
|
||||||
|
|
||||||
|
log_file=${LOG_DIR:-/data/logs/fxa}/$(date -u +%Y%m%d)/mhsAckNotify
|
||||||
|
if touch "$log_file"; then
|
||||||
|
exec >& "$log_file"
|
||||||
|
fi
|
||||||
|
|
||||||
# quoting of '$@' is used to prevent command line interpretation
|
# quoting of '$@' is used to prevent command line interpretation
|
||||||
$_PYTHON $_MODULE "$@"
|
$_PYTHON $_MODULE "$@"
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
# Date Ticket# Engineer Description
|
# Date Ticket# Engineer Description
|
||||||
# ------------ ---------- ----------- --------------------------
|
# ------------ ---------- ----------- --------------------------
|
||||||
# 09/19/11 8804 mhuang Initial creation
|
# 09/19/11 8804 mhuang Initial creation
|
||||||
|
# 10/09/12 DR 13901 D. Friedman Add logging
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
# this allows you to run this script from outside of ./bin
|
# this allows you to run this script from outside of ./bin
|
||||||
|
@ -49,5 +50,10 @@ export PYTHONPATH=${RUN_FROM_DIR}/src:$PYTHONPATH
|
||||||
_PYTHON="${PYTHON_INSTALL}/bin/python"
|
_PYTHON="${PYTHON_INSTALL}/bin/python"
|
||||||
_MODULE="${RUN_FROM_DIR}/src/qpidNotify/qpidNotify.py"
|
_MODULE="${RUN_FROM_DIR}/src/qpidNotify/qpidNotify.py"
|
||||||
|
|
||||||
|
log_file=${LOG_DIR:-/data/logs/fxa}/$(date -u +%Y%m%d)/qpidNotify
|
||||||
|
if touch "$log_file"; then
|
||||||
|
exec >& "$log_file"
|
||||||
|
fi
|
||||||
|
|
||||||
# quoting of '$@' is used to prevent command line interpretation
|
# quoting of '$@' is used to prevent command line interpretation
|
||||||
$_PYTHON $_MODULE "$@"
|
$_PYTHON $_MODULE "$@"
|
||||||
|
|
|
@ -25,8 +25,12 @@
|
||||||
# Date Ticket# Engineer Description
|
# Date Ticket# Engineer Description
|
||||||
# ------------ ---------- ----------- --------------------------
|
# ------------ ---------- ----------- --------------------------
|
||||||
# 10/28/08 1585 MW Fegan Initial Creation.
|
# 10/28/08 1585 MW Fegan Initial Creation.
|
||||||
|
# 10/09/12 DR 13901 D. Friedman Add doWithinTime
|
||||||
##############################################################################
|
##############################################################################
|
||||||
import sys
|
import sys
|
||||||
|
import Queue
|
||||||
|
import threading
|
||||||
|
import traceback
|
||||||
import types
|
import types
|
||||||
|
|
||||||
import InputOutput as IO
|
import InputOutput as IO
|
||||||
|
@ -104,3 +108,31 @@ def convListToDict(list):
|
||||||
temp.append(val)
|
temp.append(val)
|
||||||
retVal.append(temp)
|
retVal.append(temp)
|
||||||
return dict(retVal)
|
return dict(retVal)
|
||||||
|
|
||||||
|
def doWithinTime(target_function, description='complete the operation',
|
||||||
|
max_tries = 3, max_try_time = 10.0, args=(), kwargs={}):
|
||||||
|
q = Queue.Queue()
|
||||||
|
def threadFunc(q, target_function, args, kwargs):
|
||||||
|
try:
|
||||||
|
r = (True, target_function(*args, **kwargs))
|
||||||
|
except:
|
||||||
|
traceback.print_exc()
|
||||||
|
r = (False, sys.exc_info()[1])
|
||||||
|
q.put(r)
|
||||||
|
exc = None
|
||||||
|
for i in range(0, max_tries):
|
||||||
|
t = threading.Thread(target=threadFunc, args=(q, target_function, args, kwargs))
|
||||||
|
t.daemon = True
|
||||||
|
t.start()
|
||||||
|
try:
|
||||||
|
r, val = q.get(True, max_try_time)
|
||||||
|
if r:
|
||||||
|
return val
|
||||||
|
else:
|
||||||
|
exc = val
|
||||||
|
break
|
||||||
|
except Queue.Empty, e:
|
||||||
|
continue
|
||||||
|
reason = exc is None and " within the expected time" or (": " + str(exc))
|
||||||
|
raise StandardError("Failed to %s%s" % (description, reason))
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
# Date Ticket# Engineer Description
|
# Date Ticket# Engineer Description
|
||||||
# ------------ ---------- ----------- --------------------------
|
# ------------ ---------- ----------- --------------------------
|
||||||
# 04/06/2012 10388 D. Friedman Initial version
|
# 04/06/2012 10388 D. Friedman Initial version
|
||||||
|
# 10/09/12 DR 13901 D. Friedman Limit execution time
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
import getopt
|
import getopt
|
||||||
|
@ -13,6 +14,8 @@ import os
|
||||||
import os.path
|
import os.path
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
from lib.Util import doWithinTime
|
||||||
|
|
||||||
import qpid
|
import qpid
|
||||||
from qpid.util import connect
|
from qpid.util import connect
|
||||||
from qpid.connection import Connection
|
from qpid.connection import Connection
|
||||||
|
@ -32,6 +35,26 @@ def remove_file(*parts):
|
||||||
if os.path.exists(path):
|
if os.path.exists(path):
|
||||||
os.remove(path)
|
os.remove(path)
|
||||||
|
|
||||||
|
def get_qpid_connection(broker_addr):
|
||||||
|
try:
|
||||||
|
socket = connect(broker_addr, 5672)
|
||||||
|
connection = Connection (sock=socket)
|
||||||
|
connection.start()
|
||||||
|
return connection
|
||||||
|
except:
|
||||||
|
sys.stderr.write("mhsAckNotify: connect to %s: %s\n" % (broker_addr, sys.exc_info()[1],))
|
||||||
|
return None
|
||||||
|
|
||||||
|
def send_message(connection, notif):
|
||||||
|
session = connection.session(str(uuid4()))
|
||||||
|
|
||||||
|
props = session.delivery_properties(routing_key=TOPIC_NAME)
|
||||||
|
head = session.message_properties(application_headers={'sender':notif.sender,
|
||||||
|
'response':notif.response})
|
||||||
|
session.message_transfer(destination=DESTINATION, message=Message(props, head, notif.messageId))
|
||||||
|
session.close(timeout=10)
|
||||||
|
connection.close()
|
||||||
|
|
||||||
def run():
|
def run():
|
||||||
mhs_data_dir = os.getenv('MHS_DATA', '/data/fxa/mhs')
|
mhs_data_dir = os.getenv('MHS_DATA', '/data/fxa/mhs')
|
||||||
notif = MhsAckNotification()
|
notif = MhsAckNotification()
|
||||||
|
@ -60,32 +83,19 @@ def run():
|
||||||
except:
|
except:
|
||||||
sys.stderr.write("mhsAckNotify: error removing MHS file: %s\n" % (sys.exc_info()[1],))
|
sys.stderr.write("mhsAckNotify: error removing MHS file: %s\n" % (sys.exc_info()[1],))
|
||||||
|
|
||||||
try:
|
# TODO: Should have BROKER_ADDR in CLI setup.env.
|
||||||
# TODO: Should have BROKER_ADDR in CLI setup.env.
|
broker_addr = os.getenv('BROKER_ADDR')
|
||||||
broker_addr = os.getenv('BROKER_ADDR')
|
if broker_addr is None:
|
||||||
if broker_addr is None:
|
broker_addr = os.getenv('DEFAULT_HOST')
|
||||||
broker_addr = os.getenv('DEFAULT_HOST')
|
if broker_addr == 'ec':
|
||||||
if broker_addr == 'ec':
|
broker_addr = 'cp1f'
|
||||||
broker_addr = 'cp1f'
|
if broker_addr is None:
|
||||||
if broker_addr is None:
|
broker_addr = 'localhost'
|
||||||
broker_addr = 'localhost'
|
|
||||||
|
|
||||||
socket = connect(broker_addr, 5672)
|
|
||||||
except:
|
|
||||||
sys.stderr.write("mhsAckNotify: connect to %s: %s\n" % (broker_addr, sys.exc_info()[1],))
|
|
||||||
return 1
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
connection = Connection (sock=socket)
|
connection = doWithinTime(get_qpid_connection, args=(broker_addr,))
|
||||||
connection.start()
|
if connection:
|
||||||
session = connection.session(str(uuid4()))
|
doWithinTime(send_message, max_tries=1, args=(connection, notif))
|
||||||
|
|
||||||
props = session.delivery_properties(routing_key=TOPIC_NAME)
|
|
||||||
head = session.message_properties(application_headers={'sender':notif.sender,
|
|
||||||
'response':notif.response})
|
|
||||||
session.message_transfer(destination=DESTINATION, message=Message(props, head, notif.messageId))
|
|
||||||
session.close(timeout=10)
|
|
||||||
connection.close()
|
|
||||||
except:
|
except:
|
||||||
sys.stderr.write("mhsAckNotify: error sending message: %s\n" % (sys.exc_info()[1],))
|
sys.stderr.write("mhsAckNotify: error sending message: %s\n" % (sys.exc_info()[1],))
|
||||||
return 1
|
return 1
|
||||||
|
|
|
@ -30,21 +30,21 @@
|
||||||
# Date Ticket# Engineer Description
|
# Date Ticket# Engineer Description
|
||||||
# ------------ ---------- ----------- --------------------------
|
# ------------ ---------- ----------- --------------------------
|
||||||
# 09/19/11 8804 MHuang Initial creation
|
# 09/19/11 8804 MHuang Initial creation
|
||||||
|
# 10/09/12 DR 13901 D. Friedman Limit execution time
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
from ufpy import qpidingest
|
from ufpy import qpidingest
|
||||||
|
from lib.Util import doWithinTime
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import os.path
|
import os.path
|
||||||
import sys
|
import sys
|
||||||
|
import traceback
|
||||||
|
|
||||||
class mhsFileIngest:
|
class mhsFileIngest:
|
||||||
def __init__(self):
|
def startConnection(self):
|
||||||
print "Initializing mhsFileIngest object"
|
|
||||||
|
|
||||||
def qpidNotify(*args):
|
|
||||||
#Find current QPID running hostname
|
#Find current QPID running hostname
|
||||||
server=os.getenv('DEFAULT_HOST')
|
server=os.getenv('DEFAULT_HOST')
|
||||||
# print "Current EDEX server:", server
|
|
||||||
|
|
||||||
#Make connection to QPID
|
#Make connection to QPID
|
||||||
try:
|
try:
|
||||||
|
@ -52,6 +52,11 @@ class mhsFileIngest:
|
||||||
except:
|
except:
|
||||||
print "Cannot connect qpid server:", server
|
print "Cannot connect qpid server:", server
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
self.conn = cnn
|
||||||
|
|
||||||
|
def qpidNotify(self):
|
||||||
|
cnn = self.conn
|
||||||
|
|
||||||
#Get uplink files
|
#Get uplink files
|
||||||
size=len(sys.argv) - 1
|
size=len(sys.argv) - 1
|
||||||
|
@ -85,14 +90,24 @@ class mhsFileIngest:
|
||||||
cnn.close()
|
cnn.close()
|
||||||
if fileCount == size:
|
if fileCount == size:
|
||||||
print "Successfully sent", fileCount, "file(s) to EDEX via qpidingest"
|
print "Successfully sent", fileCount, "file(s) to EDEX via qpidingest"
|
||||||
sys.exit(0)
|
return 0
|
||||||
elif errCount == size:
|
elif errCount == size:
|
||||||
print "Failed to send", fileCount, "file(s) to EDEX via qpidingest"
|
print "Failed to send", fileCount, "file(s) to EDEX via qpidingest"
|
||||||
sys.exit(1)
|
return 1
|
||||||
elif errCount > 0 and fileCount < size:
|
elif errCount > 0 and fileCount < size:
|
||||||
print errcount, "out of", size, "failed to be sent to EDEX via qpidingest"
|
print errcount, "out of", size, "failed to be sent to EDEX via qpidingest"
|
||||||
sys.exit(2)
|
return 2
|
||||||
|
|
||||||
|
def run():
|
||||||
|
try:
|
||||||
|
m = mhsFileIngest()
|
||||||
|
doWithinTime(m.startConnection, description='connect to qpid')
|
||||||
|
exit_code = doWithinTime(m.qpidNotify, description='send messages', max_tries=1)
|
||||||
|
except:
|
||||||
|
traceback.print_exc()
|
||||||
|
sys.exit(1)
|
||||||
|
else:
|
||||||
|
sys.exit(exit_code)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
q = mhsFileIngest()
|
run()
|
||||||
q.qpidNotify()
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue