Issue #14 - Modified SHEF decoder components to respect the
ALLOW_ARCHIVE_DATA "flag" Former-commit-id:27e6dae839
[formerly017319df69
] [formerly91fe9b7d1d
] [formerly91fe9b7d1d
[formerly785e74370a
]] [formerly217d384449
[formerly91fe9b7d1d
[formerly785e74370a
] [formerly217d384449
[formerly 6edc7e3bbb8e2cf9ca3bea809308bfd760e3f799]]]] Former-commit-id:217d384449
Former-commit-id: 3b62d9b4754dcc60e2f24ae3a901d24af2e89f76 [formerly 1648c7430eb67bee96b2947aa6e7b87c12e83c9a] [formerlyf3a9004183
[formerly931e69f245
]] Former-commit-id:f3a9004183
Former-commit-id:ce32007bdb
This commit is contained in:
parent
900a30ee34
commit
968ed21b3f
23 changed files with 733 additions and 348 deletions
|
@ -22,6 +22,7 @@ package com.raytheon.edex.plugin.airep;
|
|||
import java.util.Calendar;
|
||||
import java.util.Map;
|
||||
|
||||
import com.raytheon.edex.esb.Headers;
|
||||
import com.raytheon.edex.exception.DecoderException;
|
||||
import com.raytheon.edex.plugin.AbstractDecoder;
|
||||
import com.raytheon.edex.plugin.airep.decoder.AIREPWeather;
|
||||
|
@ -46,7 +47,7 @@ import com.raytheon.uf.edex.wmo.message.WMOHeader;
|
|||
* }
|
||||
* </code>
|
||||
*
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
*
|
||||
* SOFTWARE HISTORY
|
||||
|
@ -89,7 +90,7 @@ public class AirepDecoder extends AbstractDecoder {
|
|||
* @throws DecoderException
|
||||
* Thrown if no data is available.
|
||||
*/
|
||||
public PluginDataObject[] decode(AirepDecoderInput input)
|
||||
public PluginDataObject[] decode(AirepDecoderInput input, Headers header)
|
||||
throws DecoderException {
|
||||
|
||||
PluginDataObject[] reports = null;
|
||||
|
@ -100,9 +101,14 @@ public class AirepDecoder extends AbstractDecoder {
|
|||
try {
|
||||
// traceId = getTraceId(hdrMap);
|
||||
logger.debug(traceId + "- AirepDecoder.decode()");
|
||||
|
||||
report = populateRecord(new AirepParser(input.report,
|
||||
input.wmoHeader), input.wmoHeader);
|
||||
WMOHeader wmoHeader = input.wmoHeader;
|
||||
if(wmoHeader != null) {
|
||||
Calendar refTime = TimeTools.findDataTime(
|
||||
wmoHeader.getYYGGgg(), header);
|
||||
if(refTime != null) {
|
||||
report = populateRecord(new AirepParser(input.report, refTime));
|
||||
}
|
||||
}
|
||||
if (report != null) {
|
||||
report.setTraceId(traceId);
|
||||
report.setPluginName(PLUGIN_NAME);
|
||||
|
@ -130,7 +136,7 @@ public class AirepDecoder extends AbstractDecoder {
|
|||
* The reccon parser that contains the decoded data.
|
||||
* @return The populated record.
|
||||
*/
|
||||
private AirepRecord populateRecord(AirepParser parser, WMOHeader wmoHeader) {
|
||||
private AirepRecord populateRecord(AirepParser parser) {
|
||||
|
||||
AirepRecord record = null;
|
||||
AircraftObsLocation location = null;
|
||||
|
|
|
@ -19,14 +19,17 @@
|
|||
**/
|
||||
package com.raytheon.edex.plugin.airep.decoder;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.TimeZone;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import com.raytheon.edex.esb.Headers;
|
||||
import com.raytheon.uf.edex.decodertools.aircraft.AircraftFlightLevel;
|
||||
import com.raytheon.uf.edex.decodertools.aircraft.AircraftLatitude;
|
||||
import com.raytheon.uf.edex.decodertools.aircraft.AircraftLongitude;
|
||||
|
@ -121,7 +124,8 @@ public class AirepParser {
|
|||
|
||||
private AircraftRemarks rptRemarks = null;
|
||||
|
||||
private WMOHeader wmoHeader;
|
||||
private Calendar refTime;
|
||||
|
||||
|
||||
/**
|
||||
* Create the parser for and decode an observation from a String.
|
||||
|
@ -129,21 +133,20 @@ public class AirepParser {
|
|||
* @param anObservation
|
||||
* A string containing the observation.
|
||||
*/
|
||||
public AirepParser(String anObservation, WMOHeader wmoHeader) {
|
||||
this.wmoHeader = wmoHeader;
|
||||
public AirepParser(String anObservation, Calendar refTime) {
|
||||
this.refTime = refTime;
|
||||
reportData = anObservation;
|
||||
parseElements();
|
||||
} // AirepParser()
|
||||
|
||||
/**
|
||||
* Create the parser for and decode an observation from a String.
|
||||
* Create the parser for and decode an observation from a byte array.
|
||||
*
|
||||
* @param anObservation
|
||||
* A string containing the observation.
|
||||
*/
|
||||
public AirepParser(byte[] anObservation) {
|
||||
reportData = new String(anObservation);
|
||||
parseElements();
|
||||
public AirepParser(byte[] anObservation, Calendar refTime) {
|
||||
this(new String(anObservation), refTime);
|
||||
} // AirepParser()
|
||||
|
||||
/**
|
||||
|
@ -263,11 +266,10 @@ public class AirepParser {
|
|||
for (int i = 0; i < theElements.size(); i++) {
|
||||
Object o = theElements.get(i);
|
||||
if (o instanceof String) {
|
||||
String[] latLon = null; // AircraftLatitude.splitLatLon((String)
|
||||
// o);
|
||||
if (latLon != null) {
|
||||
theElements.set(i, latLon[1]);
|
||||
String[] latLon = AircraftLatitude.splitLatLon((String) o);
|
||||
if ((latLon != null)&&(latLon.length ==2)) {
|
||||
theElements.add(i, latLon[0]);
|
||||
theElements.set(i, latLon[1]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -329,23 +331,25 @@ public class AirepParser {
|
|||
if (o instanceof String) {
|
||||
String s = (String) o;
|
||||
if (TIME.matcher(s).matches()) {
|
||||
|
||||
int hour = Integer.parseInt(s.substring(0, 2));
|
||||
int minute = Integer.parseInt(s.substring(2));
|
||||
Calendar oTime = TimeTools.getSystemCalendar(
|
||||
wmoHeader.getYear(), wmoHeader.getMonth(),
|
||||
wmoHeader.getDay());
|
||||
|
||||
observationTime = TimeTools.copy(oTime);
|
||||
observationTime.set(Calendar.HOUR_OF_DAY, hour);
|
||||
observationTime.set(Calendar.MINUTE, minute);
|
||||
observationTime.set(Calendar.SECOND, 0);
|
||||
observationTime.set(Calendar.MILLISECOND, 0);
|
||||
if (refTime != null) {
|
||||
|
||||
observationTime = TimeTools.copy(refTime);
|
||||
observationTime.set(Calendar.HOUR_OF_DAY, hour);
|
||||
observationTime.set(Calendar.MINUTE, minute);
|
||||
observationTime.set(Calendar.SECOND, 0);
|
||||
observationTime.set(Calendar.MILLISECOND, 0);
|
||||
// If the observation time ends up greater than
|
||||
// the reference time, back up a day.
|
||||
if (observationTime.compareTo(refTime) > 0) {
|
||||
observationTime.add(Calendar.DAY_OF_MONTH, -1);
|
||||
}
|
||||
|
||||
if (observationTime.compareTo(oTime) > 0) {
|
||||
observationTime.add(Calendar.DAY_OF_MONTH, -1);
|
||||
theElements.set(i, observationTime);
|
||||
}
|
||||
|
||||
theElements.set(i, observationTime);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -679,4 +683,24 @@ public class AirepParser {
|
|||
return (rptRemarks != null) ? rptRemarks.toString() : "";
|
||||
} // getRemarks()
|
||||
|
||||
|
||||
public static void main(String [] args) {
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
sdf.setTimeZone(TimeZone.getTimeZone("ZULU"));
|
||||
|
||||
Calendar refTime = TimeTools.getBaseCalendar(2011, 12, 14);
|
||||
refTime.set(Calendar.HOUR_OF_DAY, 17);
|
||||
refTime.set(Calendar.MINUTE, 15);
|
||||
refTime.set(Calendar.SECOND, 00);
|
||||
refTime.set(Calendar.MILLISECOND, 0);
|
||||
|
||||
String data = "ARP UAL121 4400N 05700W 1640 F390 MS00 000/099KT TB MOD SK CLEAR=";
|
||||
AirepParser p = new AirepParser(data,refTime);
|
||||
System.out.println(sdf.format(p.getObservationTime().getTime()));
|
||||
|
||||
data = "ARP UAL121 4400N 05700W 1840 F390 MS00 000/099KT TB MOD SK CLEAR=";
|
||||
p = new AirepParser(data,refTime);
|
||||
System.out.println(sdf.format(p.getObservationTime().getTime()));
|
||||
}
|
||||
|
||||
} // AirepParser
|
||||
|
|
|
@ -92,6 +92,8 @@ public class BinLightningDecoder extends AbstractDecoder {
|
|||
// Allow ingest up to 10 minutes into the future.
|
||||
private static final long TEN_MINUTES = 10 * 60 * 1000L;
|
||||
|
||||
private SimpleDateFormat SDF;
|
||||
|
||||
private Log logger = LogFactory.getLog(getClass());
|
||||
|
||||
/**
|
||||
|
@ -107,6 +109,8 @@ public class BinLightningDecoder extends AbstractDecoder {
|
|||
* will return false, decode() will return a null.
|
||||
*/
|
||||
public BinLightningDecoder() {
|
||||
SDF = new SimpleDateFormat("yyyyMMddHHmmss");
|
||||
SDF.setTimeZone(TimeZone.getTimeZone("Zulu"));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -119,14 +123,20 @@ public class BinLightningDecoder extends AbstractDecoder {
|
|||
public PluginDataObject[] decode(byte[] data, Headers headers)
|
||||
throws DecoderException {
|
||||
|
||||
|
||||
|
||||
String traceId = null;
|
||||
PluginDataObject[] reports = new PluginDataObject[0];
|
||||
if (data != null) {
|
||||
|
||||
traceId = (String) headers.get(DecoderTools.INGEST_FILE_NAME);
|
||||
|
||||
WMOHeader header = new WMOHeader(data);
|
||||
if (header.isValid()) {
|
||||
WMOHeader wmoHdr = new WMOHeader(data);
|
||||
if (wmoHdr.isValid()) {
|
||||
|
||||
Calendar baseTime = TimeTools.findDataTime(wmoHdr.getYYGGgg(), headers);
|
||||
|
||||
|
||||
byte[] pdata = DecoderTools.stripWMOHeader(data, SFUS_PATTERN);
|
||||
if (pdata == null) {
|
||||
pdata = DecoderTools.stripWMOHeader(data, SFPA_PATTERN);
|
||||
|
@ -174,7 +184,7 @@ public class BinLightningDecoder extends AbstractDecoder {
|
|||
return new PluginDataObject[0];
|
||||
}
|
||||
|
||||
Calendar c = TimeTools.getSystemCalendar();
|
||||
Calendar c = TimeTools.copy(baseTime);
|
||||
if (c == null) {
|
||||
throw new DecoderException(traceId
|
||||
+ "-Error decoding times");
|
||||
|
@ -184,11 +194,10 @@ public class BinLightningDecoder extends AbstractDecoder {
|
|||
Calendar cStart = report.getStartTime();
|
||||
if (cStart.getTimeInMillis() > c.getTimeInMillis()
|
||||
+ TEN_MINUTES) {
|
||||
SimpleDateFormat sdf = new SimpleDateFormat(
|
||||
"yyyyMMddHHmmss");
|
||||
sdf.setTimeZone(TimeZone.getTimeZone("Zulu"));
|
||||
logger.info("Discarding future data for " + traceId
|
||||
+ " at " + sdf.format(cStart.getTime()));
|
||||
synchronized(SDF) {
|
||||
logger.info("Discarding future data for " + traceId
|
||||
+ " at " + SDF.format(cStart.getTime()));
|
||||
}
|
||||
} else {
|
||||
Calendar cStop = report.getStopTime();
|
||||
|
||||
|
@ -206,8 +215,7 @@ public class BinLightningDecoder extends AbstractDecoder {
|
|||
report.constructDataURI();
|
||||
reports = new PluginDataObject[] { report };
|
||||
} catch (PluginException e) {
|
||||
throw new DecoderException(
|
||||
"Error constructing datauri", e);
|
||||
logger.error("Error constructing datauri", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,6 +24,7 @@ import java.util.Calendar;
|
|||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import com.raytheon.edex.esb.Headers;
|
||||
import com.raytheon.edex.exception.DecoderException;
|
||||
import com.raytheon.edex.plugin.AbstractDecoder;
|
||||
import com.raytheon.uf.common.dataplugin.PluginDataObject;
|
||||
|
@ -31,6 +32,7 @@ import com.raytheon.uf.common.dataplugin.PluginException;
|
|||
import com.raytheon.uf.common.time.DataTime;
|
||||
import com.raytheon.uf.common.time.TimeRange;
|
||||
import com.raytheon.uf.edex.decodertools.time.TimeTools;
|
||||
import com.raytheon.uf.edex.wmo.message.WMOHeader;
|
||||
import com.vividsolutions.jts.io.WKTReader;
|
||||
|
||||
/**
|
||||
|
@ -84,6 +86,7 @@ public class CcfpDecoder extends AbstractDecoder {
|
|||
|
||||
private static final String SPACE = " ";
|
||||
|
||||
private static final PluginDataObject [] EMPTY_PDO = new PluginDataObject [0];
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
|
@ -92,9 +95,18 @@ public class CcfpDecoder extends AbstractDecoder {
|
|||
public CcfpDecoder() throws DecoderException {
|
||||
}
|
||||
|
||||
public PluginDataObject[] decode(String msg) throws DecoderException,
|
||||
PluginException {
|
||||
public PluginDataObject[] decode(String msg, Headers headers) throws PluginException {
|
||||
|
||||
PluginDataObject [] data = null;
|
||||
|
||||
Calendar baseTime = null;
|
||||
WMOHeader wmoHdr = new WMOHeader(msg.getBytes());
|
||||
if (wmoHdr.isValid()) {
|
||||
baseTime = TimeTools.findDataTime(wmoHdr.getYYGGgg(), headers);
|
||||
} else {
|
||||
baseTime = TimeTools.getSystemCalendar();
|
||||
}
|
||||
|
||||
CcfpRecord record = new CcfpRecord();
|
||||
record.setMessageData(msg);
|
||||
CcfpLocation location = new CcfpLocation();
|
||||
|
@ -124,7 +136,7 @@ public class CcfpDecoder extends AbstractDecoder {
|
|||
} else {
|
||||
record.setCanadaflag(Boolean.FALSE);
|
||||
}
|
||||
record.setInsertTime(TimeTools.getSystemCalendar());
|
||||
record.setInsertTime(baseTime);
|
||||
}
|
||||
if (record.getProducttype().equals("AREA")) {
|
||||
matcher = AREA_PATTERN.matcher(msg);
|
||||
|
@ -205,15 +217,20 @@ public class CcfpDecoder extends AbstractDecoder {
|
|||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new DecoderException("Unable to decode CCFP", e);
|
||||
record = null;
|
||||
logger.error("Unable to decode CCFP", e);
|
||||
}
|
||||
if (record != null) {
|
||||
data = EMPTY_PDO;
|
||||
if(record != null) {
|
||||
record.setPluginName(PLUGIN_NAME);
|
||||
record.constructDataURI();
|
||||
return new PluginDataObject[] { record };
|
||||
} else {
|
||||
return new PluginDataObject[0];
|
||||
try {
|
||||
record.constructDataURI();
|
||||
record.setInsertTime(baseTime);
|
||||
data = new PluginDataObject[] { record };
|
||||
} catch (PluginException e) {
|
||||
logger.error("Error constructing datauri", e);
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -136,7 +136,6 @@ public class GOESSoundingDecoder extends AbstractDecoder implements
|
|||
WMOHeader wmoHeader = input.getWmoHeader();
|
||||
|
||||
if ((wmoHeader != null) && (wmoHeader.isValid())) {
|
||||
|
||||
try {
|
||||
byte[] messageData = input.getDocumentData();
|
||||
|
||||
|
|
|
@ -211,8 +211,7 @@ public class GOESSoundingDataAdapter {
|
|||
// seconds = (dp.getValue() != null) ? ((Double) dp.getValue())
|
||||
// .intValue() : null;
|
||||
|
||||
Calendar baseTime = TimeTools.getSystemCalendar();
|
||||
baseTime.set(Calendar.YEAR, year);
|
||||
Calendar baseTime = TimeTools.getBaseCalendar(year, 1, 1);
|
||||
baseTime.set(Calendar.DAY_OF_YEAR, day);
|
||||
baseTime.set(Calendar.HOUR_OF_DAY, hour);
|
||||
baseTime.set(Calendar.MINUTE, minute);
|
||||
|
|
|
@ -42,6 +42,7 @@ import com.raytheon.uf.common.time.DataTime;
|
|||
import com.raytheon.uf.edex.decodertools.core.DecoderTools;
|
||||
import com.raytheon.uf.edex.decodertools.core.IDecoderConstants;
|
||||
import com.raytheon.uf.edex.decodertools.time.TimeTools;
|
||||
import com.raytheon.uf.edex.wmo.message.WMOHeader;
|
||||
import com.vividsolutions.jts.geom.Coordinate;
|
||||
import com.vividsolutions.jts.geom.GeometryFactory;
|
||||
import com.vividsolutions.jts.geom.Point;
|
||||
|
@ -210,8 +211,22 @@ public class MetarDecoder extends AbstractDecoder {
|
|||
throws DecoderException {
|
||||
|
||||
MetarSeparator sep = MetarSeparator.separate(inputData, headers);
|
||||
|
||||
List<PluginDataObject> retVal = new ArrayList<PluginDataObject>();
|
||||
|
||||
// String fileName = null;
|
||||
// if (headers != null) {
|
||||
// fileName = (String) headers
|
||||
// .get(DecoderTools.INGEST_FILE_NAME);
|
||||
// }
|
||||
Calendar baseTime;
|
||||
WMOHeader wmoHdr = sep.getWMOHeader();
|
||||
if((wmoHdr != null)&&(wmoHdr.isValid())) {
|
||||
baseTime = TimeTools.findDataTime(wmoHdr.getYYGGgg(), headers);
|
||||
} else {
|
||||
baseTime = TimeTools.getSystemCalendar();
|
||||
}
|
||||
|
||||
while (sep.hasNext()) {
|
||||
byte[] messageData = sep.next();
|
||||
Pattern thePattern;
|
||||
|
@ -278,17 +293,26 @@ public class MetarDecoder extends AbstractDecoder {
|
|||
traceId, icao));
|
||||
continue;
|
||||
}
|
||||
String fileName = null;
|
||||
if (headers != null) {
|
||||
fileName = (String) headers
|
||||
.get(DecoderTools.INGEST_FILE_NAME);
|
||||
}
|
||||
Calendar obsTime = TimeTools.findCurrentTime(
|
||||
matcher.group(3), fileName);
|
||||
|
||||
|
||||
Calendar obsTime = null;
|
||||
Integer da = DecoderTools.getInt(timeGroup, 0, 2);
|
||||
Integer hr = DecoderTools.getInt(timeGroup, 2, 4);
|
||||
Integer mi = DecoderTools.getInt(timeGroup, 4, 6);
|
||||
if ((da != null) && (hr != null) && (mi != null)) {
|
||||
obsTime = TimeTools.copy(baseTime);
|
||||
obsTime.set(Calendar.DAY_OF_MONTH, da);
|
||||
obsTime.set(Calendar.HOUR_OF_DAY, hr);
|
||||
obsTime.set(Calendar.MINUTE, mi);
|
||||
}
|
||||
if (obsTime != null) {
|
||||
record.setTimeObs(obsTime);
|
||||
record.setDataTime(new DataTime(obsTime));
|
||||
record.setRefHour(Util.findReferenceHour(timeGroup));
|
||||
Calendar refHour = TimeTools.copyToNearestHour(obsTime);
|
||||
if(mi >= 45) {
|
||||
refHour.add(Calendar.HOUR_OF_DAY, 1);
|
||||
}
|
||||
record.setRefHour(refHour);
|
||||
// TODO :
|
||||
} else {
|
||||
// couldn't find observation time so exit.
|
||||
|
@ -301,7 +325,7 @@ public class MetarDecoder extends AbstractDecoder {
|
|||
// into the future
|
||||
Calendar obsTime = record.getTimeObs();
|
||||
if (obsTime != null) {
|
||||
Calendar currTime = TimeTools.getSystemCalendar();
|
||||
Calendar currTime = TimeTools.copy(baseTime);
|
||||
currTime.add(Calendar.MINUTE, METAR_FUTURE_LIMIT);
|
||||
|
||||
long diff = currTime.getTimeInMillis()
|
||||
|
|
|
@ -456,9 +456,7 @@ public class MetarPointDataTransform {
|
|||
mr.setPkWndSpd(pdv.getNumber(PK_WND_SPD).intValue());
|
||||
long t = pdv.getNumber(PK_WND_TIME).longValue();
|
||||
if (t >= 0) {
|
||||
Calendar c = TimeTools.getSystemCalendar();
|
||||
c.setTimeInMillis(t);
|
||||
mr.setPkWndTime(c);
|
||||
mr.setPkWndTime(TimeTools.newCalendar(t));
|
||||
}
|
||||
|
||||
return mr;
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
**/
|
||||
package com.raytheon.edex.plugin.shef;
|
||||
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
|
@ -34,7 +33,6 @@ import com.raytheon.edex.plugin.shef.database.PurgeText;
|
|||
import com.raytheon.uf.common.dataplugin.PluginDataObject;
|
||||
import com.raytheon.uf.common.ohd.AppsDefaults;
|
||||
import com.raytheon.uf.edex.decodertools.core.DecoderTools;
|
||||
import com.raytheon.uf.edex.wmo.message.WMOHeader;
|
||||
|
||||
/**
|
||||
* Decoder implementation for SHEF data
|
||||
|
@ -91,6 +89,8 @@ public class ShefDecoder {
|
|||
* @return
|
||||
*/
|
||||
public PluginDataObject[] decode(byte[] data, Headers headers) {
|
||||
boolean archiveMode = AppsDefaults.getInstance().getBoolean("ALLOW_ARCHIVE_DATA",false);
|
||||
|
||||
String traceId = null;
|
||||
|
||||
if (headers != null) {
|
||||
|
@ -108,8 +108,15 @@ public class ShefDecoder {
|
|||
separator = null;
|
||||
}
|
||||
if (separator != null) {
|
||||
|
||||
long startTime = System.currentTimeMillis();
|
||||
Date postDate = getPostTime(startTime);
|
||||
|
||||
Date postDate = null;
|
||||
if(archiveMode) {
|
||||
postDate = getPostTime(separator.getWmoHeader().getHeaderDate().getTimeInMillis());
|
||||
} else {
|
||||
postDate = getPostTime(startTime);
|
||||
}
|
||||
|
||||
PostShef postShef = new PostShef(postDate);
|
||||
if(separator.hasNext()) {
|
||||
|
@ -181,10 +188,6 @@ public class ShefDecoder {
|
|||
private void doDecode(ShefSeparator separator, String traceId, PostShef postShef) {
|
||||
|
||||
long startTime = System.currentTimeMillis();
|
||||
long endTime;
|
||||
|
||||
// Force time to nearest second.
|
||||
long t = startTime - (startTime % 1000);
|
||||
|
||||
AppsDefaults appDefaults = AppsDefaults.getInstance();
|
||||
boolean logSHEFOut = appDefaults.getBoolean("shef_out", false);
|
||||
|
@ -226,8 +229,7 @@ public class ShefDecoder {
|
|||
}
|
||||
} // while()
|
||||
if(dataProcessed) {
|
||||
endTime = System.currentTimeMillis();
|
||||
postShef.logStats(traceId, endTime - startTime);
|
||||
postShef.logStats(traceId, System.currentTimeMillis() - startTime);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -236,14 +238,15 @@ public class ShefDecoder {
|
|||
* @param startTime
|
||||
* @return
|
||||
*/
|
||||
private Date getPostTime(long startTime) {
|
||||
private static Date getPostTime(long startTime) {
|
||||
// Force time to nearest second.
|
||||
long t = startTime - (startTime % 1000);
|
||||
return new Date(t);
|
||||
return new Date(startTime - (startTime % 1000));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
*
|
||||
*/
|
||||
public static final void main(String [] args) {
|
||||
|
||||
long t = System.currentTimeMillis();
|
||||
|
|
|
@ -162,6 +162,7 @@ public class ShefSeparator extends AbstractRecordSeparator {
|
|||
traceId = wmoHeader.getWmoHeader();
|
||||
log.info("TraceId set to WMOHeader = " + traceId);
|
||||
}
|
||||
// TODO: DR 14 - Shef time changes.
|
||||
Calendar c = wmoHeader.getHeaderDate();
|
||||
if (c != null) {
|
||||
productTime = c.getTime();
|
||||
|
|
|
@ -27,15 +27,13 @@ import com.raytheon.uf.common.ohd.AppsDefaults;
|
|||
|
||||
public class ShefDao extends DefaultPluginDao {
|
||||
|
||||
|
||||
private AppsDefaults appsDefaults;
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @param pluginName
|
||||
* @throws PluginException
|
||||
*/
|
||||
public ShefDao(String pluginName) throws PluginException {
|
||||
super(pluginName);
|
||||
appsDefaults = AppsDefaults.getInstance();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -50,7 +48,7 @@ public class ShefDao extends DefaultPluginDao {
|
|||
* Purge the file system
|
||||
*/
|
||||
logger.info("Purging Hydro file system...");
|
||||
File metarInputFile = new File(appsDefaults
|
||||
File metarInputFile = new File(AppsDefaults.getInstance()
|
||||
.getToken("whfs_local_data_dir")
|
||||
+ "/metar_input");
|
||||
if (!metarInputFile.exists()) {
|
||||
|
|
|
@ -25,7 +25,6 @@ import java.text.SimpleDateFormat;
|
|||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.GregorianCalendar;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.TimeZone;
|
||||
|
@ -37,6 +36,12 @@ import org.apache.commons.logging.LogFactory;
|
|||
|
||||
import com.raytheon.edex.plugin.shef.data.ShefData;
|
||||
import com.raytheon.edex.plugin.shef.data.ShefRecord;
|
||||
import com.raytheon.edex.plugin.shef.util.BitUtils;
|
||||
import com.raytheon.edex.plugin.shef.util.SHEFDate;
|
||||
import com.raytheon.edex.plugin.shef.util.ShefStats;
|
||||
import com.raytheon.edex.plugin.shef.util.ShefUtil;
|
||||
import com.raytheon.edex.plugin.shef.util.StoreDisposition;
|
||||
import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject;
|
||||
import com.raytheon.uf.common.dataplugin.shef.tables.Alertalarmval;
|
||||
import com.raytheon.uf.common.dataplugin.shef.tables.AlertalarmvalId;
|
||||
import com.raytheon.uf.common.dataplugin.shef.tables.Arealfcst;
|
||||
|
@ -61,24 +66,17 @@ import com.raytheon.uf.common.dataplugin.shef.tables.Stnclass;
|
|||
import com.raytheon.uf.common.dataplugin.shef.tables.Unkstn;
|
||||
import com.raytheon.uf.common.dataplugin.shef.tables.Unkstnvalue;
|
||||
import com.raytheon.uf.common.dataplugin.shef.tables.UnkstnvalueId;
|
||||
|
||||
import com.raytheon.edex.plugin.shef.util.BitUtils;
|
||||
import com.raytheon.uf.common.dataplugin.shef.util.ParameterCode;
|
||||
import com.raytheon.uf.common.dataplugin.shef.util.ParameterCode.DataType;
|
||||
import com.raytheon.uf.common.dataplugin.shef.util.ParameterCode.Duration;
|
||||
import com.raytheon.uf.common.dataplugin.shef.util.ParameterCode.Extremum;
|
||||
import com.raytheon.uf.common.dataplugin.shef.util.ParameterCode.PhysicalElement;
|
||||
import com.raytheon.uf.common.dataplugin.shef.util.ParameterCode.PhysicalElementCategory;
|
||||
import com.raytheon.uf.common.dataplugin.shef.util.ParameterCode.TypeSource;
|
||||
import com.raytheon.uf.common.dataplugin.shef.util.ParameterCode;
|
||||
import com.raytheon.uf.common.dataplugin.shef.util.SHEFTimezone;
|
||||
import com.raytheon.edex.plugin.shef.util.SHEFDate;
|
||||
import com.raytheon.edex.plugin.shef.util.ShefStats;
|
||||
import com.raytheon.edex.plugin.shef.util.ShefUtil;
|
||||
import com.raytheon.edex.plugin.shef.util.StoreDisposition;
|
||||
import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject;
|
||||
import com.raytheon.uf.common.dataplugin.shef.util.ShefConstants;
|
||||
import com.raytheon.uf.common.dataplugin.shef.util.ShefQC;
|
||||
import com.raytheon.uf.common.dataplugin.shef.util.ShefConstants.IngestSwitch;
|
||||
import com.raytheon.uf.common.dataplugin.shef.util.ShefQC;
|
||||
import com.raytheon.uf.common.ohd.AppsDefaults;
|
||||
import com.raytheon.uf.edex.database.dao.CoreDao;
|
||||
import com.raytheon.uf.edex.database.dao.DaoConfig;
|
||||
|
@ -130,6 +128,11 @@ public class PostShef {
|
|||
QC_DEFAULT, QC_GROSSRANGE_FAILED, QC_REASONRANGE_FAILED, QC_ROC_FAILED, QC_ROC_PASSED, QC_OUTLIER_FAILED, QC_OUTLIER_PASSED, QC_SCC_FAILED, QC_SCC_PASSED, QC_MSC_FAILED, QC_MSC_PASSED, QC_EXTERN_FAILED, QC_EXTERN_QUEST, QC_MANUAL_PASSED, QC_MANUAL_QUEST, QC_MANUAL_FAILED, QC_MANUAL_NEW, QC_PASSED, QC_QUESTIONABLE, QC_FAILED, QC_NOT_PASSED, QC_NOT_FAILED
|
||||
};
|
||||
|
||||
private static final SimpleDateFormat DB_TIMESTAMP = new SimpleDateFormat(ShefConstants.POSTGRES_DATE_FORMAT.toPattern());
|
||||
static {
|
||||
DB_TIMESTAMP.setTimeZone(TimeZone.getTimeZone(ShefConstants.GMT));
|
||||
}
|
||||
|
||||
private static final Pattern Q_CODES = Pattern.compile("Q[^BEF]");
|
||||
|
||||
private static final String POST_START_MSG = "Posting process started for LID [%s] PEDTSEP [%s] value [%s]";
|
||||
|
@ -203,6 +206,8 @@ public class PostShef {
|
|||
|
||||
private boolean perfLog = false;
|
||||
|
||||
private boolean archiveMode = false;
|
||||
|
||||
private HashMap<String, Location> idLocations = new HashMap<String, Location>();
|
||||
|
||||
/**
|
||||
|
@ -256,6 +261,8 @@ public class PostShef {
|
|||
dataLog = appDefaults.getBoolean(ShefConstants.SHEF_DATA_LOG, false);
|
||||
// TODO need to implement this token and the performance logging
|
||||
perfLog = appDefaults.getBoolean(ShefConstants.SHEF_PERFLOG, false);
|
||||
|
||||
archiveMode = appDefaults.getBoolean("ALLOW_ARCHIVE_DATA",false);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -652,7 +659,7 @@ public class PostShef {
|
|||
start = System.currentTimeMillis();
|
||||
// Identifier has been set from the awipsHeader.
|
||||
|
||||
postProductLink(locId, identifier, obsTime, postDate);
|
||||
postProductLink(locId, identifier, obsTime);
|
||||
// postProductLink(locId, shefRecord.getIdentifier(), obsTime);
|
||||
stats.addElapsedTimeIngest(System.currentTimeMillis() - start);
|
||||
|
||||
|
@ -1112,9 +1119,13 @@ public class PostShef {
|
|||
String pe = null;
|
||||
String ts = null;
|
||||
|
||||
String query = "select lid,pe,ts " + "from " + tableName + " "
|
||||
+ "where validtime > CURRENT_TIMESTAMP and "
|
||||
+ "probability < 0.0";
|
||||
// String query = "select lid,pe,ts " + "from " + tableName + " "
|
||||
// + "where validtime > CURRENT_TIMESTAMP and "
|
||||
// + "probability < 0.0";
|
||||
|
||||
String query = String
|
||||
.format("select lid,pe,ts from %s where validtime > '%s' and probability < 0.0",
|
||||
tableName, toTimeStamp(postDate));
|
||||
|
||||
try {
|
||||
dao = new CoreDao(DaoConfig.forDatabase(ShefConstants.IHFS));
|
||||
|
@ -2553,8 +2564,7 @@ public class PostShef {
|
|||
* @param obsTime
|
||||
* - The observation time
|
||||
*/
|
||||
private void postProductLink(String locId, String productId, Date obsTime,
|
||||
Date postDate) {
|
||||
private void postProductLink(String locId, String productId, Date obsTime) {
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("PostShef.postProductLink() called...");
|
||||
}
|
||||
|
@ -3008,8 +3018,6 @@ public class PostShef {
|
|||
basisTime = new Date();
|
||||
}
|
||||
|
||||
// TODO fix the duplicate code below:
|
||||
|
||||
if (dataValue == "") {
|
||||
dataValue = "-9999";
|
||||
}
|
||||
|
@ -3251,6 +3259,29 @@ public class PostShef {
|
|||
return dataObj;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @param c
|
||||
* @return
|
||||
*/
|
||||
private static String toTimeStamp(Date d) {
|
||||
String timeStamp = null;
|
||||
if(d != null) {
|
||||
timeStamp = DB_TIMESTAMP.format(d);
|
||||
}
|
||||
return timeStamp;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param c
|
||||
* @return
|
||||
*/
|
||||
private static String toTimeStamp(Calendar c) {
|
||||
return toTimeStamp(c.getTime());
|
||||
}
|
||||
|
||||
public static final void main(String[] args) {
|
||||
|
||||
Calendar postDate = TimeTools.getBaseCalendar(2011, 1, 12);
|
||||
|
|
|
@ -28,7 +28,8 @@ import java.util.List;
|
|||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.hibernate.Session;
|
||||
import org.hibernate.connection.ConnectionProvider;
|
||||
import org.hibernate.engine.SessionFactoryImplementor;
|
||||
|
||||
import com.raytheon.edex.plugin.shef.data.ShefData;
|
||||
import com.raytheon.edex.plugin.shef.data.ShefRecord;
|
||||
|
@ -1036,15 +1037,16 @@ public class PostTables {
|
|||
CoreDao dao = null;
|
||||
Connection conn = null;
|
||||
CallableStatement cs = null;
|
||||
Session ses = null;
|
||||
int status = -1;
|
||||
if (dataValue == "") {
|
||||
dataValue = ShefConstants.SHEF_MISSING;
|
||||
}
|
||||
try {
|
||||
dao = new CoreDao(DaoConfig.forDatabase(ShefConstants.IHFS));
|
||||
ses = dao.getSessionFactory().openSession();
|
||||
conn = ses.connection();
|
||||
SessionFactoryImplementor impl = (SessionFactoryImplementor) dao.getSessionFactory();
|
||||
ConnectionProvider cp = impl.getConnectionProvider();
|
||||
conn = cp.getConnection();
|
||||
|
||||
cs = conn.prepareCall("{call " + functionName
|
||||
+ "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}");
|
||||
cs.setString(1, locId);
|
||||
|
@ -1128,14 +1130,8 @@ public class PostTables {
|
|||
} catch (Exception e) {
|
||||
// Intentionally empty
|
||||
}
|
||||
try {
|
||||
ses.close();
|
||||
} catch (Exception e) {
|
||||
// Intentionally empty
|
||||
}
|
||||
cs = null;
|
||||
conn = null;
|
||||
ses = null;
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
@ -1159,7 +1155,6 @@ public class PostTables {
|
|||
}
|
||||
CoreDao dao = null;
|
||||
Connection conn = null;
|
||||
Session ses = null;
|
||||
CallableStatement cs = null;
|
||||
int status = -1;
|
||||
if (dataValue == "") {
|
||||
|
@ -1167,8 +1162,10 @@ public class PostTables {
|
|||
}
|
||||
try {
|
||||
dao = new CoreDao(DaoConfig.forDatabase(ShefConstants.IHFS));
|
||||
ses = dao.getSessionFactory().openSession();
|
||||
conn = ses.connection();
|
||||
SessionFactoryImplementor impl = (SessionFactoryImplementor) dao.getSessionFactory();
|
||||
ConnectionProvider cp = impl.getConnectionProvider();
|
||||
conn = cp.getConnection();
|
||||
|
||||
cs = conn.prepareCall("{call " + functionName
|
||||
+ "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}");
|
||||
cs.setString(1, locId);
|
||||
|
@ -1258,11 +1255,6 @@ public class PostTables {
|
|||
} catch (Exception e) {
|
||||
// Intentionally empty
|
||||
}
|
||||
try {
|
||||
ses.close();
|
||||
} catch (Exception e) {
|
||||
// Intentionally empty
|
||||
}
|
||||
cs = null;
|
||||
conn = null;
|
||||
}
|
||||
|
@ -1286,7 +1278,6 @@ public class PostTables {
|
|||
long start = System.currentTimeMillis();
|
||||
CoreDao dao = null;
|
||||
Connection conn = null;
|
||||
Session ses = null;
|
||||
CallableStatement cs = null;
|
||||
java.sql.Timestamp timeStamp = null;
|
||||
int status = -1;
|
||||
|
@ -1296,8 +1287,10 @@ public class PostTables {
|
|||
|
||||
try {
|
||||
dao = new CoreDao(DaoConfig.forDatabase(ShefConstants.IHFS));
|
||||
ses = dao.getSessionFactory().openSession();
|
||||
conn = ses.connection();
|
||||
SessionFactoryImplementor impl = (SessionFactoryImplementor) dao.getSessionFactory();
|
||||
ConnectionProvider cp = impl.getConnectionProvider();
|
||||
conn = cp.getConnection();
|
||||
|
||||
cs = conn.prepareCall("{call " + functionName
|
||||
+ "(?, ?, ?, ?, ?, cast(? as real), ?, ?, ?, ?,"
|
||||
+ " ?, ?, ?, ?, ?, ?, ?)}");
|
||||
|
@ -1420,11 +1413,6 @@ public class PostTables {
|
|||
} catch (Exception e) {
|
||||
// Intentionally empty
|
||||
}
|
||||
try {
|
||||
ses.close();
|
||||
} catch (Exception e) {
|
||||
// Intentionally empty
|
||||
}
|
||||
cs = null;
|
||||
conn = null;
|
||||
}
|
||||
|
@ -1489,7 +1477,6 @@ public class PostTables {
|
|||
|
||||
CoreDao dao = null;
|
||||
Connection conn = null;
|
||||
Session ses = null;
|
||||
PreparedStatement ps = null;
|
||||
java.sql.Timestamp timeStamp = null;
|
||||
java.sql.Timestamp timeStamp2 = null;
|
||||
|
@ -1507,8 +1494,12 @@ public class PostTables {
|
|||
|
||||
try {
|
||||
dao = new CoreDao(DaoConfig.forDatabase(ShefConstants.IHFS));
|
||||
ses = dao.getSessionFactory().openSession();
|
||||
conn = ses.connection();
|
||||
|
||||
SessionFactoryImplementor impl = (SessionFactoryImplementor) dao.getSessionFactory();
|
||||
ConnectionProvider cp = impl.getConnectionProvider();
|
||||
|
||||
conn = cp.getConnection();
|
||||
|
||||
if (updateFlag) {
|
||||
ps = conn.prepareCall(updateQuery);
|
||||
} else {
|
||||
|
@ -1617,11 +1608,6 @@ public class PostTables {
|
|||
} catch (Exception e) {
|
||||
// Intentionally empty
|
||||
}
|
||||
try {
|
||||
ses.close();
|
||||
} catch (Exception e) {
|
||||
// Intentionally empty
|
||||
}
|
||||
ps = null;
|
||||
conn = null;
|
||||
}
|
||||
|
|
|
@ -89,8 +89,6 @@ public class GagePP {
|
|||
|
||||
private static Log logger = LogFactory.getLog(GagePP.class);
|
||||
|
||||
private SimpleDateFormat minSDF = new SimpleDateFormat("mm");
|
||||
|
||||
private GagePPWrite gagePPWrite = null;
|
||||
|
||||
private char pOffsetCode;
|
||||
|
@ -100,10 +98,6 @@ public class GagePP {
|
|||
private short p6HourSlot;
|
||||
|
||||
public GagePP() {
|
||||
// used_value_count = 0;
|
||||
// ignored_value_count = 0;
|
||||
// // total_value_count = 0;
|
||||
// group_count = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -135,7 +129,6 @@ public class GagePP {
|
|||
// double elapsed_time;
|
||||
|
||||
int prev_dur = 0;
|
||||
// String prev_key = null;
|
||||
int use_value;
|
||||
short precip_val;
|
||||
short hour = 1;
|
||||
|
@ -151,11 +144,8 @@ public class GagePP {
|
|||
int status = GPP_OK;
|
||||
|
||||
logger.info("Processing records at " + btime);
|
||||
|
||||
|
||||
|
||||
Calendar dt = Calendar.getInstance(SHEFTimezone.GMT_TIMEZONE);
|
||||
dt.setTime(rec.getObsTime());
|
||||
Calendar dt = TimeTools.newCalendar(rec.getObsTime().getTime());
|
||||
|
||||
HourlyppId id = new HourlyppId(rec.getLocationId(), rec.getTypeSource()
|
||||
.getCode(), btime);
|
||||
|
@ -545,8 +535,8 @@ public class GagePP {
|
|||
private void gage_pp_1hour_slot(final GagePPOptions pOptions,
|
||||
final String pPE, PrecipRecord rec) {
|
||||
Calendar dt = Calendar.getInstance(SHEFTimezone.GMT_TIMEZONE);
|
||||
Date datetime = rec.getObsTime();
|
||||
dt.setTime(datetime);
|
||||
dt.setTime(rec.getObsTime());
|
||||
|
||||
int hour = dt.get(Calendar.HOUR_OF_DAY);
|
||||
|
||||
int minute = dt.get(Calendar.MINUTE);
|
||||
|
@ -656,34 +646,30 @@ public class GagePP {
|
|||
final Calendar ansi_obstime_year_sec, String ansi_date_year_day,
|
||||
short [] p6HourSlot, char[] p6HourOffsetCode) {
|
||||
|
||||
float ppq_window;
|
||||
float ppq_window = pOptions.getIntppq();
|
||||
ppq_window *= SECONDS_PER_HOUR;
|
||||
|
||||
int bottom_6_hour_period;
|
||||
int diff1;
|
||||
int diff2;
|
||||
int hour;
|
||||
int minute;
|
||||
int hour = ansi_obstime_year_sec.get(Calendar.HOUR_OF_DAY);
|
||||
int minute = ansi_obstime_year_sec.get(Calendar.MINUTE);
|
||||
int num_periods;
|
||||
int remainder;
|
||||
int top_6_hour_period;
|
||||
Calendar num_seconds_since_00z = Calendar
|
||||
.getInstance(SHEFTimezone.GMT_TIMEZONE);
|
||||
// Calendar num_seconds_since_00z = Calendar
|
||||
// .getInstance(SHEFTimezone.GMT_TIMEZONE);
|
||||
|
||||
ppq_window = pOptions.getIntppq();
|
||||
ppq_window *= SECONDS_PER_HOUR;
|
||||
int num_seconds_since_00z = (hour * SECONDS_PER_HOUR)
|
||||
+ (minute * SECONDS_PER_MINUTE);
|
||||
|
||||
|
||||
hour = ansi_obstime_year_sec.get(Calendar.HOUR_OF_DAY);
|
||||
minute = ansi_obstime_year_sec.get(Calendar.MINUTE);
|
||||
|
||||
num_seconds_since_00z.setTimeInMillis((hour * SECONDS_PER_HOUR)
|
||||
+ (minute * SECONDS_PER_MINUTE));
|
||||
|
||||
bottom_6_hour_period = (int) (num_seconds_since_00z.getTimeInMillis() / SECONDS_IN_6HOUR_PERIOD);
|
||||
bottom_6_hour_period = num_seconds_since_00z / SECONDS_IN_6HOUR_PERIOD;
|
||||
top_6_hour_period = bottom_6_hour_period + 1;
|
||||
|
||||
diff1 = (int) (num_seconds_since_00z.getTimeInMillis() - (bottom_6_hour_period * SECONDS_IN_6HOUR_PERIOD));
|
||||
diff1 = num_seconds_since_00z
|
||||
- (bottom_6_hour_period * SECONDS_IN_6HOUR_PERIOD);
|
||||
diff2 = (top_6_hour_period * SECONDS_IN_6HOUR_PERIOD)
|
||||
- (int) num_seconds_since_00z.getTimeInMillis();
|
||||
- num_seconds_since_00z;
|
||||
|
||||
if (diff1 < diff2) {
|
||||
/*
|
||||
|
|
|
@ -28,6 +28,8 @@ import java.util.List;
|
|||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import com.raytheon.edex.plugin.shef.ohdlib.GagePPOptions.upd_action;
|
||||
import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject;
|
||||
import com.raytheon.uf.common.dataplugin.shef.tables.Dailypp;
|
||||
import com.raytheon.uf.common.dataplugin.shef.tables.DailyppId;
|
||||
import com.raytheon.uf.common.dataplugin.shef.tables.Hourlypc;
|
||||
|
@ -35,11 +37,8 @@ import com.raytheon.uf.common.dataplugin.shef.tables.HourlypcId;
|
|||
import com.raytheon.uf.common.dataplugin.shef.tables.Hourlypp;
|
||||
import com.raytheon.uf.common.dataplugin.shef.tables.HourlyppId;
|
||||
import com.raytheon.uf.common.dataplugin.shef.tables.IHourlyTS;
|
||||
import com.raytheon.edex.plugin.shef.ohdlib.GagePPOptions.upd_action;
|
||||
import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject;
|
||||
import com.raytheon.uf.common.dataplugin.shef.util.SHEFTimezone;
|
||||
import com.raytheon.uf.common.dataplugin.shef.util.ShefConstants;
|
||||
import com.raytheon.uf.common.dataplugin.shef.util.ShefQC;
|
||||
import com.raytheon.uf.edex.database.dao.CoreDao;
|
||||
import com.raytheon.uf.edex.database.dao.DaoConfig;
|
||||
import com.raytheon.uf.edex.decodertools.time.TimeTools;
|
||||
|
@ -63,10 +62,6 @@ import com.raytheon.uf.edex.decodertools.time.TimeTools;
|
|||
public final class GagePPWrite {
|
||||
private static Log logger = LogFactory.getLog(GagePPWrite.class);
|
||||
|
||||
private static final float MISSING_PRECIP = -9999f;
|
||||
|
||||
private Date datetime;
|
||||
|
||||
private char hourly_qc[] = new char[PrecipUtils.NUM_HOURLY_SLOTS];
|
||||
|
||||
private char minute_offset[] = new char[PrecipUtils.NUM_HOURLY_SLOTS];
|
||||
|
@ -81,8 +76,6 @@ public final class GagePPWrite {
|
|||
* Empty constructor.
|
||||
*/
|
||||
public GagePPWrite() {
|
||||
|
||||
|
||||
// sdf = new SimpleDateFormat(ShefConstants.POSTGRES_DATE_STRING);
|
||||
sdf = new SimpleDateFormat("yyyy-MM-dd");
|
||||
sdf.setTimeZone(SHEFTimezone.GMT_TIMEZONE);
|
||||
|
@ -106,9 +99,7 @@ public final class GagePPWrite {
|
|||
char manual_qc_code) {
|
||||
|
||||
|
||||
datetime = dtime;
|
||||
Calendar dt = TimeTools.getSystemCalendar();
|
||||
dt.setTime(datetime);
|
||||
Calendar dt = TimeTools.newCalendar(dtime.getTime());
|
||||
|
||||
int hour_slot = dt.get(Calendar.HOUR_OF_DAY);
|
||||
Arrays.fill(hourly_qc, '-');
|
||||
|
|
|
@ -45,8 +45,6 @@ public abstract class PrecipUtils {
|
|||
|
||||
private static final char ZERO_OFFSET = '0';
|
||||
|
||||
private static final AppsDefaults APPS_DEFAULTS = AppsDefaults.getInstance();
|
||||
|
||||
public static final int NUM_HOURLY_SLOTS = 24;
|
||||
|
||||
public static final int NUM_6HOURLY_SLOTS = 4;
|
||||
|
@ -71,6 +69,7 @@ public abstract class PrecipUtils {
|
|||
* @param options
|
||||
*/
|
||||
public static void get_precip_window(GagePPOptions options) {
|
||||
AppsDefaults APPS_DEFAULTS = AppsDefaults.getInstance();
|
||||
options.setIntpc(APPS_DEFAULTS.getInt("intpc",10));
|
||||
options.setIntlppp(APPS_DEFAULTS.getInt("intlppp",10));
|
||||
options.setIntuppp(APPS_DEFAULTS.getInt("intuppp",10));
|
||||
|
@ -109,7 +108,7 @@ public abstract class PrecipUtils {
|
|||
* @return
|
||||
*/
|
||||
public static float get_6hour_precip_window() {
|
||||
return APPS_DEFAULTS.getFloat("intppq", 2.0f);
|
||||
return AppsDefaults.getInstance().getFloat("intppq", 2.0f);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -771,7 +770,7 @@ public abstract class PrecipUtils {
|
|||
*/
|
||||
|
||||
/* Get the search window around local 7 AM. */
|
||||
int local_7am_window = APPS_DEFAULTS.getInt("ppp_ppd_local_7am_window", 3);
|
||||
int local_7am_window = AppsDefaults.getInstance().getInt("ppp_ppd_local_7am_window", 3);
|
||||
|
||||
Calendar c = new GregorianCalendar(SHEFTimezone.GMT_TIMEZONE);
|
||||
c.setTime(time12z);
|
||||
|
|
|
@ -35,6 +35,7 @@ import com.raytheon.uf.common.dataplugin.PluginDataObject;
|
|||
import com.raytheon.uf.common.ohd.AppsDefaults;
|
||||
import com.raytheon.uf.edex.decodertools.core.DecoderTools;
|
||||
import com.raytheon.uf.edex.decodertools.time.TimeTools;
|
||||
import com.raytheon.uf.edex.wmo.message.WMOHeader;
|
||||
|
||||
/**
|
||||
* Base class for observation data to SHEF conversions.
|
||||
|
@ -142,7 +143,6 @@ public abstract class AbstractShefTransformer<T extends PluginDataObject>
|
|||
* @param objects
|
||||
* @return
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static Iterator<?> iterate(PluginDataObject[] objects) {
|
||||
Iterator<PluginDataObject> it = null;
|
||||
if (objects != null) {
|
||||
|
@ -203,11 +203,15 @@ public abstract class AbstractShefTransformer<T extends PluginDataObject>
|
|||
* @return
|
||||
*/
|
||||
protected StringBuilder makeWMOHeader(StringBuilder buffer,
|
||||
String stationId, Headers headers) {
|
||||
|
||||
Calendar c = TimeTools.getSystemCalendar((String) headers
|
||||
.get(DecoderTools.INGEST_FILE_NAME));
|
||||
String stationId, Headers headers, WMOHeader hdr) {
|
||||
|
||||
Calendar c = null;
|
||||
|
||||
if((hdr != null)&&(headers != null)) {
|
||||
c = TimeTools.findDataTime(hdr.getYYGGgg(), headers);
|
||||
} else {
|
||||
c = TimeTools.getSystemCalendar();
|
||||
}
|
||||
buffer.append(String.format(WMO_HEADER_FMT, stationId, c));
|
||||
|
||||
return buffer;
|
||||
|
|
|
@ -116,7 +116,7 @@ public class MetarToShefTransformer extends
|
|||
String stnId = rec.getStationId();
|
||||
place = 2;
|
||||
StringBuilder sb = makeWMOHeader(openWMOMessage(0, 200),
|
||||
stnId, headers);
|
||||
stnId, headers, hdr);
|
||||
place = 3;
|
||||
|
||||
startMessageLine(sb);
|
||||
|
@ -414,6 +414,14 @@ public class MetarToShefTransformer extends
|
|||
newobs = writeObs(newobs,sb.toString());
|
||||
|
||||
System.out.println(newobs);
|
||||
|
||||
Calendar c = TimeTools.getBaseCalendar(2011, 11, 30);
|
||||
c.set(Calendar.HOUR_OF_DAY, 16);
|
||||
c.set(Calendar.MINUTE, 21);
|
||||
|
||||
|
||||
System.out.println(String.format(WMO_HEADER_FMT, "KOMA", c));
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,6 +30,7 @@ import com.raytheon.uf.common.dataplugin.sfcobs.ObsCommon;
|
|||
import com.raytheon.uf.edex.decodertools.core.DecoderTools;
|
||||
import com.raytheon.uf.edex.decodertools.core.IDecoderConstants;
|
||||
import com.raytheon.uf.edex.decodertools.time.TimeTools;
|
||||
import com.raytheon.uf.edex.wmo.message.WMOHeader;
|
||||
|
||||
/**
|
||||
* Transforms a decoded synoptic observation into a series of SHEF encoded data
|
||||
|
@ -84,8 +85,10 @@ public class SMToShefTransformer extends AbstractShefTransformer<ObsCommon> {
|
|||
// Currently returns false, so nothing is encoded at this time.
|
||||
if (encodeThisStation(rec)) {
|
||||
|
||||
WMOHeader hdr = new WMOHeader(rec.getObsText().getBytes());
|
||||
|
||||
StringBuilder sb = makeWMOHeader(openWMOMessage(0, 200),
|
||||
"KWOH", headers);
|
||||
"KWOH", headers, hdr);
|
||||
|
||||
startMessageLine(sb)
|
||||
.append(":SHEF derived data created by SMToShefTransformer");
|
||||
|
|
|
@ -128,11 +128,7 @@ public abstract class BUFRSection1 extends BUFRSection {
|
|||
* @return
|
||||
*/
|
||||
public Calendar getSectionDate() {
|
||||
Calendar cal = TimeTools.getSystemCalendar();
|
||||
|
||||
cal.set(Calendar.YEAR, year);
|
||||
cal.set(Calendar.MONTH, month - 1);
|
||||
cal.set(Calendar.DAY_OF_MONTH, day);
|
||||
Calendar cal = TimeTools.getBaseCalendar(year, month, day);
|
||||
cal.set(Calendar.HOUR_OF_DAY, hour);
|
||||
cal.set(Calendar.MINUTE, minute);
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
package com.raytheon.uf.edex.decodertools.time;
|
||||
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
import java.util.TimeZone;
|
||||
import java.util.regex.Matcher;
|
||||
|
@ -55,33 +56,63 @@ import com.raytheon.uf.edex.decodertools.core.DecoderTools;
|
|||
*/
|
||||
public class TimeTools {
|
||||
|
||||
/**
|
||||
* Time stamp that includes the receipt time
|
||||
* format : YYYYMMDD
|
||||
*/
|
||||
public static final Pattern FILE_TIMESTAMP = Pattern.compile("(.*\\.)(\\d{8}$)");
|
||||
|
||||
public static final Pattern WMO_TIMESTAMP = Pattern.compile("([0-3][0-9])(\\d{2})(\\d{2})[Zz]?");
|
||||
|
||||
public static final int HOURS_DAY = 24;
|
||||
|
||||
public static final int MINUTES_HOUR = 60;
|
||||
|
||||
public static final int SECONDS_HOUR = 3600;
|
||||
|
||||
public static final int SECONDS_DAY = 24 * SECONDS_HOUR;
|
||||
public static final int SECONDS_DAY = HOURS_DAY * SECONDS_HOUR;
|
||||
|
||||
public static final long MILLIS_HOUR = 1000L * SECONDS_HOUR;
|
||||
|
||||
public static final long MILLIS_DAY = MILLIS_HOUR * 24L;
|
||||
public static final long MILLIS_DAY = MILLIS_HOUR * HOURS_DAY;
|
||||
|
||||
public static final String ZULU_TIMEZONE = "Zulu";
|
||||
|
||||
private static ITimeService timeService = null;
|
||||
|
||||
private static final Log logger = LogFactory.getLog(TimeTools.class);
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public static boolean allowArchive() {
|
||||
return ("true".equalsIgnoreCase(System.getenv().get("ALLOW_ARCHIVE_DATA")));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a calendar that expresses the current system time. If an ITimeService
|
||||
* provider is registered, the time is retrieved from the service.
|
||||
*
|
||||
* @return The current time as a GMT Calendar.
|
||||
*/
|
||||
public static Calendar getSystemCalendar() {
|
||||
public static final Calendar getSystemCalendar() {
|
||||
Calendar retCal = null;
|
||||
if (timeService != null) {
|
||||
retCal = timeService.getCalendar();
|
||||
} else {
|
||||
retCal = Calendar.getInstance(TimeZone.getTimeZone(ZULU_TIMEZONE));
|
||||
}
|
||||
if(retCal != null) {
|
||||
TimeZone tz = retCal.getTimeZone();
|
||||
if(tz != null) {
|
||||
if (0 != tz.getRawOffset()) {
|
||||
retCal.setTimeZone(TimeZone.getTimeZone(ZULU_TIMEZONE));
|
||||
}
|
||||
} else {
|
||||
retCal.setTimeZone(TimeZone.getTimeZone(ZULU_TIMEZONE));
|
||||
}
|
||||
}
|
||||
return retCal;
|
||||
}
|
||||
|
||||
|
@ -91,46 +122,74 @@ public class TimeTools {
|
|||
*
|
||||
* @return The current time as a GMT Calendar.
|
||||
*/
|
||||
public static Calendar getSystemCalendar(int year, int month, int day) {
|
||||
public static final Calendar getSystemCalendar(int year, int month, int day) {
|
||||
return getSystemCalendar(year, month, day, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a calendar that expresses the current system time based from specified
|
||||
* date information if the
|
||||
* @param year Year to set.
|
||||
* @param month
|
||||
* @param day
|
||||
* @param hour
|
||||
* @param minute
|
||||
* @return The current time as a GMT Calendar.
|
||||
*/
|
||||
public static final Calendar getSystemCalendar(int year, int month,
|
||||
int day, int hour, int minute) {
|
||||
Calendar retCal = getSystemCalendar();
|
||||
String allow = System.getenv("ALLOW_ARCHIVE_DATA");
|
||||
if ("true".equalsIgnoreCase(allow)) {
|
||||
if (year != -1) {
|
||||
retCal.set(Calendar.YEAR, year);
|
||||
}
|
||||
if (month != -1) {
|
||||
retCal.set(Calendar.MONTH, month - 1);
|
||||
}
|
||||
if (day != -1) {
|
||||
retCal.set(Calendar.DATE, day);
|
||||
if (allowArchive()) {
|
||||
if (isValidDate(year, month, day)) {
|
||||
if (hour != -1) {
|
||||
if (minute != -1) {
|
||||
retCal.set(Calendar.YEAR, year);
|
||||
retCal.set(Calendar.MONTH, month - 1);
|
||||
retCal.set(Calendar.DAY_OF_MONTH, day);
|
||||
retCal.set(Calendar.HOUR_OF_DAY, hour);
|
||||
retCal.set(Calendar.MINUTE, minute);
|
||||
retCal.set(Calendar.SECOND, 0);
|
||||
retCal.set(Calendar.MILLISECOND, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return retCal;
|
||||
}
|
||||
|
||||
public static Calendar getSystemCalendar(String fileName) {
|
||||
/**
|
||||
*
|
||||
* @param fileName
|
||||
* @return
|
||||
*/
|
||||
public static final Calendar getSystemCalendar(String fileName) {
|
||||
int year = -1;
|
||||
int month = -1;
|
||||
int day = -1;
|
||||
if (fileName != null && fileName.matches(".*\\.\\d{8}$")) {
|
||||
Pattern pattern = Pattern.compile("(.*\\.)(\\d{8}$)");
|
||||
Matcher matcher = pattern.matcher(fileName);
|
||||
matcher.find();
|
||||
String yyyymmdd = matcher.group(2);
|
||||
year = Integer.parseInt(yyyymmdd.substring(0, 4));
|
||||
month = Integer.parseInt(yyyymmdd.substring(4, 6));
|
||||
day = Integer.parseInt(yyyymmdd.substring(6, 8));
|
||||
|
||||
if(fileName != null) {
|
||||
Matcher matcher = FILE_TIMESTAMP.matcher(fileName);
|
||||
if(matcher.find()) {
|
||||
String yyyymmdd = matcher.group(2);
|
||||
try {
|
||||
year = Integer.parseInt(yyyymmdd.substring(0, 4));
|
||||
month = Integer.parseInt(yyyymmdd.substring(4, 6));
|
||||
day = Integer.parseInt(yyyymmdd.substring(6, 8));
|
||||
} catch (NumberFormatException nfe) {
|
||||
year = -1;
|
||||
month = -1;
|
||||
day = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return getSystemCalendar(year, month, day);
|
||||
return getSystemCalendar(year, month, day, 0, 0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Converts a ddhhmm time group to a Calendar. Adjusts the calendar as
|
||||
* follows: Any time group with a day (dd) in the future is set back one
|
||||
* month.
|
||||
*
|
||||
* @param baseTime
|
||||
* @param wmoDateStamp
|
||||
* the time to convert
|
||||
*
|
||||
* @return the converted time
|
||||
|
@ -138,25 +197,52 @@ public class TimeTools {
|
|||
* @throws DataFormatException
|
||||
* if an error occurs
|
||||
*/
|
||||
public static Calendar findCurrentTime(String baseTime, String fileName)
|
||||
public static final Calendar findCurrentTime(String wmoDateStamp, String fileName)
|
||||
throws DataFormatException {
|
||||
Calendar retVal = getSystemCalendar(fileName);
|
||||
Calendar refCal = getSystemCalendar(fileName);
|
||||
try {
|
||||
String regexe = "(\\d{2})(\\d{2})(\\d{2})[Zz]?";
|
||||
Pattern pattern = Pattern.compile(regexe);
|
||||
Matcher matcher = pattern.matcher(baseTime);
|
||||
Matcher matcher = WMO_TIMESTAMP.matcher(wmoDateStamp);
|
||||
if (matcher.matches()) {
|
||||
adjustDayHourMinute(retVal, matcher.group(1), matcher.group(2),
|
||||
matcher.group(3));
|
||||
int iDay = Integer.parseInt(matcher.group(1));
|
||||
int iHour = Integer.parseInt(matcher.group(2));
|
||||
int iMinute = Integer.parseInt(matcher.group(3));
|
||||
|
||||
refCal = adjustDayHourMinute(refCal, iDay, iHour, iMinute);
|
||||
} else {
|
||||
throw new ParseException("Invalid format - does not match "
|
||||
+ regexe, 0);
|
||||
throw new ParseException("Invalid format - time does not match "
|
||||
+ WMO_TIMESTAMP.pattern(), 0);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new DataFormatException("Unable to find current time for "
|
||||
+ baseTime + ", exception was " + e.toString());
|
||||
+ wmoDateStamp + ", exception was " + e.toString());
|
||||
}
|
||||
return retVal;
|
||||
return refCal;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a string in ddhhmm format to a standard {@link Calendar} format
|
||||
* where ddhhmm is the GMT format while the standard time is in Calendar
|
||||
* format with Year and Month information. Usage: ddhhmm is the issue time
|
||||
* whereas utcTime can be the MDN time. The former comes "after" the latter.
|
||||
*
|
||||
* @parm ddhhmm day-hour-minute in GMT
|
||||
* @parm local Time UTC time in Calendar
|
||||
*/
|
||||
public static final Calendar findDataTime(String ddhhmm, Headers headers) {
|
||||
Calendar issueTime = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
|
||||
String fileName = null;
|
||||
if (headers != null) {
|
||||
fileName = (String) headers.get(DecoderTools.INGEST_FILE_NAME);
|
||||
}
|
||||
try {
|
||||
issueTime = findCurrentTime(ddhhmm, fileName);
|
||||
} catch (DataFormatException e) {
|
||||
if (logger.isInfoEnabled()) {
|
||||
logger.info(" Error in processing MND time; return current time ");
|
||||
}
|
||||
issueTime = null;
|
||||
}
|
||||
return issueTime;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -174,31 +260,78 @@ public class TimeTools {
|
|||
* @param minute
|
||||
* the new minute of the hour
|
||||
*/
|
||||
private static void adjustDayHourMinute(Calendar cal, String day,
|
||||
String hour, String minute) {
|
||||
int iDay = Integer.parseInt(day);
|
||||
int iHour = Integer.parseInt(hour);
|
||||
int iMinute = Integer.parseInt(minute);
|
||||
int iMonth = cal.get(Calendar.MONTH);
|
||||
int iYear = cal.get(Calendar.YEAR);
|
||||
// adjust the month and year for roll-over situations
|
||||
if (iDay > cal.get(Calendar.DAY_OF_MONTH)) {
|
||||
iMonth--;
|
||||
if (iMonth < 0) {
|
||||
iMonth = Calendar.DECEMBER;
|
||||
iYear--;
|
||||
private static Calendar adjustDayHourMinute(Calendar cal, int wmoDay,
|
||||
int wmoHour, int wmoMinute) {
|
||||
if (cal != null) {
|
||||
|
||||
int cDay = cal.get(Calendar.DAY_OF_MONTH);
|
||||
|
||||
cal.set(Calendar.SECOND, 0);
|
||||
cal.set(Calendar.MILLISECOND, 0);
|
||||
|
||||
// Range check hour/minute first. Have to wait for
|
||||
// checking the day
|
||||
if (isValidHour(wmoHour) && (isValidMinSec(wmoMinute))) {
|
||||
Calendar lastMonth = copy(cal);
|
||||
lastMonth.set(Calendar.DAY_OF_MONTH, 1);
|
||||
lastMonth.add(Calendar.MONTH, -1);
|
||||
|
||||
// Get the maximum day of the current month from the reference
|
||||
// calendar
|
||||
int maxDayThisMonth = cal
|
||||
.getActualMaximum(Calendar.DAY_OF_MONTH);
|
||||
// Set the day to one so all add/subtracts work correctly
|
||||
cal.set(Calendar.DAY_OF_MONTH, 1);
|
||||
cal.set(Calendar.HOUR_OF_DAY, wmoHour);
|
||||
cal.set(Calendar.MINUTE, wmoMinute);
|
||||
if (wmoDay == 1) {
|
||||
// the wmoDay is 1
|
||||
// and the reference calendar is the last
|
||||
// day of the month
|
||||
if (cDay == maxDayThisMonth) {
|
||||
// This is potentially next month's data received early
|
||||
// Allow three hours into the next day
|
||||
if (wmoHour < 3) {
|
||||
// Advance to the next month
|
||||
cal.add(Calendar.MONTH, 1);
|
||||
// and set the hour, minute
|
||||
}
|
||||
}
|
||||
} else if (wmoDay > cDay) {
|
||||
// Is the wmoDay valid for this month?
|
||||
if(wmoDay <= maxDayThisMonth) {
|
||||
// First allow up to 3 hours into the next day
|
||||
if ((cDay + 1) == wmoDay) {
|
||||
// This is potentially next month's data received early
|
||||
// Allow three hours into the next day
|
||||
if (wmoHour > 2) {
|
||||
// Back up a month
|
||||
cal.add(Calendar.MONTH, -1);
|
||||
}
|
||||
} else {
|
||||
// Back up a month
|
||||
cal.add(Calendar.MONTH, -1);
|
||||
int mDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
|
||||
if(mDay < wmoDay) {
|
||||
cal.add(Calendar.MONTH, -1);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// The wmoDay is greater than the maximum number
|
||||
// of days for the reference month. We can't back
|
||||
// up one month, but can always back up two months.
|
||||
cal.add(Calendar.MONTH, -2);
|
||||
}
|
||||
}
|
||||
cal.set(Calendar.DAY_OF_MONTH, wmoDay);
|
||||
} else {
|
||||
// bad
|
||||
cal = null;
|
||||
}
|
||||
}
|
||||
cal.set(Calendar.SECOND, 0);
|
||||
cal.set(Calendar.MILLISECOND, 0);
|
||||
cal.set(Calendar.YEAR, iYear);
|
||||
cal.set(Calendar.MONTH, iMonth);
|
||||
cal.set(Calendar.DAY_OF_MONTH, iDay);
|
||||
cal.set(Calendar.HOUR_OF_DAY, iHour);
|
||||
cal.set(Calendar.MINUTE, iMinute);
|
||||
|
||||
}
|
||||
|
||||
return cal;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the time service. To clear an existing service, set a null reference.
|
||||
*
|
||||
|
@ -207,7 +340,7 @@ public class TimeTools {
|
|||
* service.
|
||||
* @return The TimeService that had been previously defined.
|
||||
*/
|
||||
public static ITimeService setTimeService(ITimeService service) {
|
||||
public static final ITimeService setTimeService(ITimeService service) {
|
||||
ITimeService retService = null;
|
||||
// get the current service if any.
|
||||
retService = timeService;
|
||||
|
@ -227,7 +360,7 @@ public class TimeTools {
|
|||
* Day of the month [1..31] varies by month rules.
|
||||
* @return
|
||||
*/
|
||||
public static Calendar getBaseCalendar(int year, int month, int day) {
|
||||
public static final Calendar getBaseCalendar(int year, int month, int day) {
|
||||
Calendar calendar = null;
|
||||
|
||||
calendar = getSystemCalendar();
|
||||
|
@ -243,7 +376,7 @@ public class TimeTools {
|
|||
|
||||
return calendar;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a new GMT time-zone calendar set to a specified time in milliseconds.
|
||||
*
|
||||
|
@ -251,7 +384,7 @@ public class TimeTools {
|
|||
* The time to set in milliseconds.
|
||||
* @return The new calendar instance.
|
||||
*/
|
||||
public static Calendar newCalendar(long timeInMillis) {
|
||||
public static final Calendar newCalendar(long timeInMillis) {
|
||||
Calendar calendar = getSystemCalendar();
|
||||
|
||||
calendar.setTimeInMillis(timeInMillis);
|
||||
|
@ -266,22 +399,23 @@ public class TimeTools {
|
|||
* The calendar to copy.
|
||||
* @return The copied calendar.
|
||||
*/
|
||||
public static Calendar copy(Calendar calendar) {
|
||||
public static final Calendar copy(Calendar calendar) {
|
||||
Calendar retValue = null;
|
||||
if (calendar != null) {
|
||||
retValue = (Calendar) calendar.clone();
|
||||
retValue = newCalendar(calendar.getTimeInMillis());
|
||||
retValue.setTimeZone(calendar.getTimeZone());
|
||||
}
|
||||
return retValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make a copy of a calendar instance to the nearest hour.
|
||||
* Make a copy of a calendar instance truncated to the hour.
|
||||
*
|
||||
* @param calendar
|
||||
* The calendar to copy.
|
||||
* @return The copied calendar.
|
||||
*/
|
||||
public static Calendar copyToNearestHour(Calendar calendar) {
|
||||
public static final Calendar copyToNearestHour(Calendar calendar) {
|
||||
Calendar retValue = null;
|
||||
if (calendar != null) {
|
||||
retValue = (Calendar) calendar.clone();
|
||||
|
@ -299,7 +433,7 @@ public class TimeTools {
|
|||
* The calendar to copy.
|
||||
* @return The copied calendar.
|
||||
*/
|
||||
public static Calendar roundToNearestHour(Calendar calendar) {
|
||||
public static final Calendar roundToNearestHour(Calendar calendar) {
|
||||
Calendar retValue = null;
|
||||
if (calendar != null) {
|
||||
retValue = (Calendar) calendar.clone();
|
||||
|
@ -322,7 +456,7 @@ public class TimeTools {
|
|||
* Number of days to add or subtract.
|
||||
* @return The modified calendar.
|
||||
*/
|
||||
public static Calendar rollByDays(Calendar calendar, int byDays) {
|
||||
public static final Calendar rollByDays(Calendar calendar, int byDays) {
|
||||
if (calendar != null) {
|
||||
long millis = calendar.getTimeInMillis();
|
||||
|
||||
|
@ -342,7 +476,7 @@ public class TimeTools {
|
|||
* Number of hours to add or subtract.
|
||||
* @return The modified calendar.
|
||||
*/
|
||||
public static Calendar rollByHours(Calendar calendar, int byHours) {
|
||||
public static final Calendar rollByHours(Calendar calendar, int byHours) {
|
||||
if (calendar != null) {
|
||||
long millis = calendar.getTimeInMillis();
|
||||
|
||||
|
@ -354,28 +488,196 @@ public class TimeTools {
|
|||
}
|
||||
|
||||
/**
|
||||
* Convert a string in ddhhmm format to a standard {@link Calendar} format
|
||||
* where ddhhmm is the GMT format while the standard time is in Calendar
|
||||
* format with Year and Month information. Usage: ddhhmm is the issue time
|
||||
* whereas utcTime can be the MDN time. The former comes "after" the latter.
|
||||
*
|
||||
* @parm ddhhmm day-hour-minute in GMT
|
||||
* @parm local Time UTC time in Calendar
|
||||
* Is the year valid. This method supposes any positive year
|
||||
* value as valid.
|
||||
* @param year The year to check.
|
||||
* @return Is the year valid?
|
||||
*/
|
||||
public static Calendar findDataTime(String ddhhmm, Headers headers) {
|
||||
Calendar issueTime = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
|
||||
String fileName = null;
|
||||
if (headers != null) {
|
||||
fileName = (String) headers.get(DecoderTools.INGEST_FILE_NAME);
|
||||
}
|
||||
try {
|
||||
return issueTime = findCurrentTime(ddhhmm, fileName);
|
||||
} catch (DataFormatException e) {
|
||||
if (logger.isInfoEnabled()) {
|
||||
logger.info(" Error in processing MND time; return current time ");
|
||||
}
|
||||
return issueTime;
|
||||
}
|
||||
public static final boolean isValidYear(int year) {
|
||||
return (year >= 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* The the specified month of the year valid.
|
||||
* @param month Numeric value of the month.
|
||||
* @return Is the month valid?
|
||||
*/
|
||||
public static final boolean isValidMonth(int month) {
|
||||
return ((month > -1)&&(month <= 12));
|
||||
}
|
||||
|
||||
/**
|
||||
* Is the specified hour of the day valid? Range 0..23 inclusive.
|
||||
* @param hour The hour to check.
|
||||
* @return Is the hour valid?
|
||||
*/
|
||||
public static final boolean isValidHour(int hour) {
|
||||
return ((hour > -1)&&(hour < HOURS_DAY));
|
||||
}
|
||||
|
||||
/**
|
||||
* Is the specified minute/second valid? Range 0..59 inclusive.
|
||||
* @param hour The minute/second to check.
|
||||
* @return Is the minute/second valid?
|
||||
*/
|
||||
public static final boolean isValidMinSec(int value) {
|
||||
return ((value > -1)&&(value < MINUTES_HOUR));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Is a specified date valid? This method checks an entire
|
||||
* year, month, day timestamp.
|
||||
* @param year The year to check.
|
||||
* @param month Numeric value of the month.
|
||||
* @param day Is the month valid?
|
||||
* @return Is year, month, day timestamp valid.
|
||||
*/
|
||||
public static final boolean isValidDate(int year, int month, int day) {
|
||||
boolean validDay = false;
|
||||
if(day > -1) {
|
||||
if(isValidYear(year)) {
|
||||
if(isValidMonth(month)) {
|
||||
Calendar c = getBaseCalendar(year, month, 1);
|
||||
int lastDay = c.getActualMaximum(Calendar.DAY_OF_MONTH) + 1;
|
||||
|
||||
validDay = (day < lastDay);
|
||||
}
|
||||
}
|
||||
}
|
||||
return validDay;
|
||||
}
|
||||
|
||||
/**
|
||||
* End of month, end of year
|
||||
*
|
||||
* @return test passed status
|
||||
*/
|
||||
private static boolean test(String [] data) {
|
||||
String expected = data[3];
|
||||
System.out.print(String.format("Test Step %12s ", data[0]));
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
Headers header = new Headers();
|
||||
header.put(DecoderTools.INGEST_FILE_NAME, data[1]);
|
||||
|
||||
Calendar c = findDataTime(data[2],header);
|
||||
sdf.setTimeZone(c.getTimeZone());
|
||||
|
||||
String cs = sdf.format(c.getTime());
|
||||
System.out.print(String.format("%20s expected %20s ",cs, expected));
|
||||
return expected.equals(cs);
|
||||
}
|
||||
|
||||
public static final void main(String [] args) {
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
sdf.setTimeZone(TimeZone.getTimeZone(ZULU_TIMEZONE));
|
||||
|
||||
ITimeService service = new ITimeService() {
|
||||
@Override
|
||||
public Calendar getCalendar() {
|
||||
final Calendar c = Calendar.getInstance();
|
||||
c.setTimeZone(TimeZone.getTimeZone(ZULU_TIMEZONE));
|
||||
c.set(Calendar.YEAR, 2011);
|
||||
c.set(Calendar.MONTH, Calendar.JULY);
|
||||
c.set(Calendar.DAY_OF_MONTH,15);
|
||||
c.set(Calendar.HOUR_OF_DAY, 14);
|
||||
c.set(Calendar.MINUTE, 15);
|
||||
c.set(Calendar.SECOND, 32);
|
||||
c.set(Calendar.MILLISECOND, 268);
|
||||
|
||||
return c;
|
||||
}
|
||||
};
|
||||
TimeTools.setTimeService(service);
|
||||
|
||||
if(allowArchive()) {
|
||||
String [] [] archiveData = {
|
||||
{ "test001","UANT01_CWAO_171653_225472224.20110717", "171653","2011-07-17 16:53:00", },
|
||||
{ "test002","UANT01_CWAO_312315_225472224.20110731", "312315","2011-07-31 23:15:00", },
|
||||
{ "test003","UANT01_CWAO_312315_225472224.20110801", "312315","2011-07-31 23:15:00", },
|
||||
{ "test004","UANT01_CWAO_170000_225472224.20110716", "170000","2011-07-17 00:00:00", },
|
||||
{ "test005","UANT01_CWAO_170000_225472224.20110717", "170000","2011-07-17 00:00:00", },
|
||||
{ "test006","UANT01_CWAO_100000_225472224.20111109", "100000","2011-11-10 00:00:00", },
|
||||
{ "test007","UANT01_CWAO_010000_225472224.20111231", "010000","2012-01-01 00:00:00", },
|
||||
{ "test008","UANT01_CWAO_312350_225472224.20120101", "312350","2011-12-31 23:50:00", },
|
||||
{ "test009","UANT01_CWAO_010259_225472224.20111231", "010259","2012-01-01 02:59:00", },
|
||||
{ "test010","UANT01_CWAO_010300_225472224.20111231", "010300","2011-12-01 03:00:00", },
|
||||
{ "test011","UANT01_CWAO_290050_225472224.20120228", "290050","2012-02-29 00:50:00", },
|
||||
{ "test012","UANT01_CWAO_010100_225472224.20120229", "010100","2012-03-01 01:00:00", },
|
||||
};
|
||||
System.out.println("Performing archive mode data tests");
|
||||
for(String [] d : archiveData) {
|
||||
System.out.println(" status = " + (test(d) ? "passed" : "failed"));
|
||||
}
|
||||
}
|
||||
if(!allowArchive()) {
|
||||
System.out.println("Performing non-archive mode data tests");
|
||||
|
||||
System.out.println(String.format("Base time = %s", sdf.format(getSystemCalendar().getTime())));
|
||||
// 2011-07-15 14:15:32.268
|
||||
String[][] data = {
|
||||
{ "test001", "UANT01_CWAO_171653_225472224.20110717", "171653",
|
||||
"2011-06-17 16:53:00", },
|
||||
{ "test002", "UANT01_CWAO_312315_225472224.20110731", "312315",
|
||||
"2011-05-31 23:15:00", },
|
||||
};
|
||||
for (String[] d : data) {
|
||||
System.out.println(" status = " + (test(d) ? "passed" : "failed"));
|
||||
}
|
||||
//**********************************************************************
|
||||
service = new ITimeService() {
|
||||
@Override
|
||||
public Calendar getCalendar() {
|
||||
final Calendar c = Calendar.getInstance();
|
||||
c.setTimeZone(TimeZone.getTimeZone(ZULU_TIMEZONE));
|
||||
c.set(Calendar.YEAR, 2011);
|
||||
c.set(Calendar.MONTH, Calendar.AUGUST);
|
||||
c.set(Calendar.DAY_OF_MONTH,1);
|
||||
c.set(Calendar.HOUR_OF_DAY, 14);
|
||||
c.set(Calendar.MINUTE, 15);
|
||||
c.set(Calendar.SECOND, 32);
|
||||
c.set(Calendar.MILLISECOND, 268);
|
||||
|
||||
return c;
|
||||
}
|
||||
};
|
||||
TimeTools.setTimeService(service);
|
||||
System.out.println(String.format("Base time = %s", sdf.format(getSystemCalendar().getTime())));
|
||||
|
||||
data = new String [][] {
|
||||
{ "test011", "UANT01_CWAO_312353_225472224.20110717", "312353",
|
||||
"2011-07-31 23:53:00", },
|
||||
};
|
||||
for (String[] d : data) {
|
||||
System.out.println(" status = " + (test(d) ? "passed" : "failed"));
|
||||
}
|
||||
//**********************************************************************
|
||||
service = new ITimeService() {
|
||||
@Override
|
||||
public Calendar getCalendar() {
|
||||
final Calendar c = Calendar.getInstance();
|
||||
c.setTimeZone(TimeZone.getTimeZone(ZULU_TIMEZONE));
|
||||
c.set(Calendar.YEAR, 2011);
|
||||
c.set(Calendar.MONTH, Calendar.JULY);
|
||||
c.set(Calendar.DAY_OF_MONTH,31);
|
||||
c.set(Calendar.HOUR_OF_DAY, 22);
|
||||
c.set(Calendar.MINUTE, 45);
|
||||
c.set(Calendar.SECOND, 32);
|
||||
c.set(Calendar.MILLISECOND, 268);
|
||||
|
||||
return c;
|
||||
}
|
||||
};
|
||||
TimeTools.setTimeService(service);
|
||||
System.out.println(String.format("Base time = %s", sdf.format(getSystemCalendar().getTime())));
|
||||
|
||||
data = new String [][] {
|
||||
{ "test011", "UANT01_CWAO_010053_225472224.20110717", "010053",
|
||||
"2011-08-01 00:53:00", },
|
||||
};
|
||||
for (String[] d : data) {
|
||||
System.out.println(" status = " + (test(d) ? "passed" : "failed"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -169,10 +169,16 @@ public class WMOHeader {
|
|||
}
|
||||
YYGGgg = wmoHeader.substring(hdrIndex, hdrIndex + DTGROUP_SIZE);
|
||||
parseDateTime(YYGGgg);
|
||||
Calendar obsTime = TimeTools.findDataTime(YYGGgg, headers);
|
||||
headerYear = obsTime.get(Calendar.YEAR);
|
||||
headerMonth = obsTime.get(Calendar.MONTH) + 1;
|
||||
|
||||
headerDate = TimeTools.findDataTime(YYGGgg, headers);
|
||||
// At this point headerDate will either be the current time (non-archive) or
|
||||
// a time generated from the WMOHeader and filename dateStamp
|
||||
|
||||
headerYear = headerDate.get(Calendar.YEAR);
|
||||
headerMonth = headerDate.get(Calendar.MONTH) + 1;
|
||||
headerDay = headerDate.get(Calendar.DAY_OF_MONTH);
|
||||
headerHour = headerDate.get(Calendar.HOUR_OF_DAY);
|
||||
headerMinute = headerDate.get(Calendar.MINUTE);
|
||||
|
||||
hdrIndex += DTGROUP_SIZE;
|
||||
|
||||
// Everything else goes here for now. Leave it to the client to
|
||||
|
@ -346,10 +352,6 @@ public class WMOHeader {
|
|||
* @return the headerDate
|
||||
*/
|
||||
public Calendar getHeaderDate() {
|
||||
// Use lazy construction here.
|
||||
if (headerDate == null) {
|
||||
headerDate = createCalendarDate();
|
||||
}
|
||||
return headerDate;
|
||||
}
|
||||
|
||||
|
@ -402,53 +404,53 @@ public class WMOHeader {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Use the parsed date/time elements to create the Calendar date time info
|
||||
* for this WMO header. The logic in this method allows the WMO header time
|
||||
* to be set to the current day, the next day, or up to 25 days in the past.
|
||||
*
|
||||
* @return A Calendar instance based on the current system date time.
|
||||
*/
|
||||
private Calendar createCalendarDate() {
|
||||
Calendar msgDate = null;
|
||||
// check the internal data first
|
||||
if ((headerDay > -1) && (headerHour > -1) && (headerMinute > -1)) {
|
||||
Calendar currentClock = TimeTools.getSystemCalendar(headerYear,
|
||||
headerMonth, -1);
|
||||
|
||||
Calendar obsDate = null;
|
||||
Calendar tTime = TimeTools.copyToNearestHour(currentClock);
|
||||
// Set to the next day.
|
||||
TimeTools.rollByDays(tTime, 1);
|
||||
|
||||
if (headerDay == currentClock.get(Calendar.DAY_OF_MONTH)) {
|
||||
obsDate = TimeTools.copyToNearestHour(currentClock);
|
||||
obsDate.set(Calendar.HOUR_OF_DAY, headerHour);
|
||||
obsDate.set(Calendar.MINUTE, headerMinute);
|
||||
} else if (headerDay == tTime.get(Calendar.DAY_OF_MONTH)) {
|
||||
// Observation time is in the next day
|
||||
obsDate = TimeTools.copyToNearestHour(tTime);
|
||||
obsDate.set(Calendar.HOUR_OF_DAY, headerHour);
|
||||
obsDate.set(Calendar.MINUTE, headerMinute);
|
||||
} else {
|
||||
tTime = TimeTools.copyToNearestHour(currentClock);
|
||||
int i = 0;
|
||||
while (i++ < 25) {
|
||||
// Go back a day
|
||||
TimeTools.rollByDays(tTime, -1);
|
||||
if (headerDay == tTime.get(Calendar.DAY_OF_MONTH)) {
|
||||
// Day values are equal, so this is it.
|
||||
obsDate = TimeTools.copyToNearestHour(tTime);
|
||||
obsDate.set(Calendar.HOUR_OF_DAY, headerHour);
|
||||
obsDate.set(Calendar.MINUTE, headerMinute);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (obsDate != null) {
|
||||
msgDate = obsDate;
|
||||
}
|
||||
}
|
||||
return msgDate;
|
||||
}
|
||||
// /**
|
||||
// * Use the parsed date/time elements to create the Calendar date time info
|
||||
// * for this WMO header. The logic in this method allows the WMO header time
|
||||
// * to be set to the current day, the next day, or up to 25 days in the past.
|
||||
// *
|
||||
// * @return A Calendar instance based on the current system date time.
|
||||
// */
|
||||
// private Calendar createCalendarDate() {
|
||||
// Calendar msgDate = null;
|
||||
// // check the internal data first
|
||||
// if ((headerDay > -1) && (headerHour > -1) && (headerMinute > -1)) {
|
||||
// Calendar currentClock = TimeTools.getSystemCalendar(headerYear,
|
||||
// headerMonth, headerDay);
|
||||
//
|
||||
// Calendar obsDate = null;
|
||||
// Calendar tTime = TimeTools.copyToNearestHour(currentClock);
|
||||
// // Set to the next day.
|
||||
// TimeTools.rollByDays(tTime, 1);
|
||||
//
|
||||
// if (headerDay == currentClock.get(Calendar.DAY_OF_MONTH)) {
|
||||
// obsDate = TimeTools.copyToNearestHour(currentClock);
|
||||
// obsDate.set(Calendar.HOUR_OF_DAY, headerHour);
|
||||
// obsDate.set(Calendar.MINUTE, headerMinute);
|
||||
// } else if (headerDay == tTime.get(Calendar.DAY_OF_MONTH)) {
|
||||
// // Observation time is in the next day
|
||||
// obsDate = TimeTools.copyToNearestHour(tTime);
|
||||
// obsDate.set(Calendar.HOUR_OF_DAY, headerHour);
|
||||
// obsDate.set(Calendar.MINUTE, headerMinute);
|
||||
// } else {
|
||||
// tTime = TimeTools.copyToNearestHour(currentClock);
|
||||
// int i = 0;
|
||||
// while (i++ < 25) {
|
||||
// // Go back a day
|
||||
// TimeTools.rollByDays(tTime, -1);
|
||||
// if (headerDay == tTime.get(Calendar.DAY_OF_MONTH)) {
|
||||
// // Day values are equal, so this is it.
|
||||
// obsDate = TimeTools.copyToNearestHour(tTime);
|
||||
// obsDate.set(Calendar.HOUR_OF_DAY, headerHour);
|
||||
// obsDate.set(Calendar.MINUTE, headerMinute);
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// if (obsDate != null) {
|
||||
// msgDate = obsDate;
|
||||
// }
|
||||
// }
|
||||
// return msgDate;
|
||||
// }
|
||||
}
|
||||
|
|
|
@ -236,9 +236,9 @@ public class ACARSSounding {
|
|||
String msg = "attempting " + acftInfo.getTailNumber() + " ";
|
||||
String tailNumber = acftInfo.getTailNumber();
|
||||
|
||||
Calendar c = TimeTools.getSystemCalendar();
|
||||
c.setTimeInMillis(acftInfo.getStartTime());
|
||||
Calendar c = TimeTools.newCalendar(acftInfo.getStartTime());
|
||||
msg += String.format(ACARSSoundingTools.STD_TM_FMT,c);
|
||||
|
||||
c.setTimeInMillis(acftInfo.getStopTime());
|
||||
msg += "->";
|
||||
msg += String.format(ACARSSoundingTools.STD_TM_FMT,c);
|
||||
|
|
Loading…
Add table
Reference in a new issue