Omaha #3608 improved error handling in lightning frame retriever
Change-Id: I02784a7f2d23bf37d56294e55cb9ec759d1f9080 Former-commit-id:7ff7c235e8
[formerlyce24dad434
] [formerlyb9dd6d798b
] [formerly7ff7c235e8
[formerlyce24dad434
] [formerlyb9dd6d798b
] [formerlyc56645dd01
[formerlyb9dd6d798b
[formerly 0551b91b995c893fddee52cabdfbdccf83121a31]]]] Former-commit-id:c56645dd01
Former-commit-id:25667d5118
[formerly6a333bde00
] [formerly 9b6ea83663e975004ebb1c19cdbeebcd018f9fa6 [formerly07b48207a2
]] Former-commit-id: 79358852df6492b2e74356e9c5cf360a1b0d60c1 [formerlyb4b45c0152
] Former-commit-id:f3d1bf85b4
This commit is contained in:
parent
be4a570d16
commit
155084d533
1 changed files with 101 additions and 44 deletions
|
@ -26,6 +26,7 @@ import java.util.Date;
|
|||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import com.raytheon.uf.common.dataplugin.HDF5Util;
|
||||
import com.raytheon.uf.common.dataplugin.annotations.DataURI;
|
||||
|
@ -60,6 +61,7 @@ import com.raytheon.uf.viz.core.cache.CacheObject.IObjectRetrieverAndDisposer;
|
|||
* ------------ ---------- ----------- --------------------------
|
||||
* Jul 09, 2014 3333 bclement moved from LightningResource
|
||||
* Jul 22, 2014 3214 bclement fixed typos in populatePulseData() and updateAndGet()
|
||||
* Sep 11, 2014 3608 bclement index records by group and dataset name for better error handling
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -216,24 +218,40 @@ public class LightningFrameRetriever implements
|
|||
long tDS1 = System.currentTimeMillis();
|
||||
dsTime += (tDS1 - tDS0);
|
||||
// Throw in a map for easy accessibility
|
||||
Map<String, List<IDataRecord>> recordMap = createRecordMap(records);
|
||||
Map<String, Map<String, IDataRecord>> groupedRecords = createRecordMap(records);
|
||||
|
||||
List<IDataRecord> times = recordMap
|
||||
.get(LightningConstants.TIME_DATASET);
|
||||
List<IDataRecord> intensities = recordMap
|
||||
.get(LightningConstants.INTENSITY_DATASET);
|
||||
List<IDataRecord> lats = recordMap
|
||||
.get(LightningConstants.LAT_DATASET);
|
||||
List<IDataRecord> lons = recordMap
|
||||
.get(LightningConstants.LON_DATASET);
|
||||
List<IDataRecord> types = recordMap
|
||||
.get(LightningConstants.STRIKE_TYPE_DATASET);
|
||||
List<IDataRecord> pulseIndexes = recordMap
|
||||
.get(LightningConstants.PULSE_INDEX_DATASET);
|
||||
for (Entry<String, Map<String, IDataRecord>> entry : groupedRecords
|
||||
.entrySet()) {
|
||||
Map<String, IDataRecord> recordMap = entry.getValue();
|
||||
|
||||
int k = 0;
|
||||
for (IDataRecord timeRec : times) {
|
||||
if (hasPulseData(pulseIndexes, k)) {
|
||||
IDataRecord timeRec = recordMap
|
||||
.get(LightningConstants.TIME_DATASET);
|
||||
IDataRecord intensities = recordMap
|
||||
.get(LightningConstants.INTENSITY_DATASET);
|
||||
IDataRecord lats = recordMap
|
||||
.get(LightningConstants.LAT_DATASET);
|
||||
IDataRecord lons = recordMap
|
||||
.get(LightningConstants.LON_DATASET);
|
||||
IDataRecord types = recordMap
|
||||
.get(LightningConstants.STRIKE_TYPE_DATASET);
|
||||
IDataRecord pulseIndexes = recordMap
|
||||
.get(LightningConstants.PULSE_INDEX_DATASET);
|
||||
|
||||
if (timeRec == null || intensities == null || lats == null
|
||||
|| lons == null || types == null
|
||||
|| pulseIndexes == null) {
|
||||
List<String> missing = getMissingDatasets(recordMap);
|
||||
statusHandler.error("Group '" + entry.getKey()
|
||||
+ "' missing dataset(s): " + missing);
|
||||
continue;
|
||||
}
|
||||
if (!allSameLength(timeRec, intensities, lats, lons, types,
|
||||
pulseIndexes)) {
|
||||
statusHandler.error("Group '" + entry.getKey()
|
||||
+ "' has mismatched dataset lengths");
|
||||
continue;
|
||||
}
|
||||
if (hasPulseData(pulseIndexes)) {
|
||||
populatePulseData(frame, bundle, timeRec.getGroup(), ds);
|
||||
}
|
||||
LongDataRecord time = (LongDataRecord) timeRec;
|
||||
|
@ -243,14 +261,13 @@ public class LightningFrameRetriever implements
|
|||
|
||||
long[] timeData = time.getLongData();
|
||||
|
||||
int[] intensityData = ((IntegerDataRecord) intensities
|
||||
.get(k)).getIntData();
|
||||
float[] latitudeData = ((FloatDataRecord) lats.get(k))
|
||||
int[] intensityData = ((IntegerDataRecord) intensities)
|
||||
.getIntData();
|
||||
float[] latitudeData = ((FloatDataRecord) lats)
|
||||
.getFloatData();
|
||||
float[] longitudeData = ((FloatDataRecord) lons.get(k))
|
||||
float[] longitudeData = ((FloatDataRecord) lons)
|
||||
.getFloatData();
|
||||
byte[] typeData = ((ByteDataRecord) types.get(k))
|
||||
.getByteData();
|
||||
byte[] typeData = ((ByteDataRecord) types).getByteData();
|
||||
|
||||
for (int i = 0; i < numRecords; i++) {
|
||||
|
||||
|
@ -282,7 +299,6 @@ public class LightningFrameRetriever implements
|
|||
}
|
||||
|
||||
}
|
||||
k++;
|
||||
}
|
||||
} catch (StorageException e) {
|
||||
statusHandler.handle(Priority.PROBLEM,
|
||||
|
@ -301,23 +317,69 @@ public class LightningFrameRetriever implements
|
|||
}
|
||||
|
||||
/**
|
||||
* Unpack records into map keyed by record name
|
||||
* @param records
|
||||
* @return true if all the records are the same length
|
||||
*/
|
||||
private static boolean allSameLength(IDataRecord... records) {
|
||||
if (records.length == 0) {
|
||||
return true;
|
||||
}
|
||||
boolean rval = true;
|
||||
long size = records[0].getSizes()[0];
|
||||
for (IDataRecord rec : records) {
|
||||
if (rec.getSizes()[0] != size) {
|
||||
rval = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return rval;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param recordMap
|
||||
* @return list of lightning datasets that are not in map
|
||||
*/
|
||||
private static List<String> getMissingDatasets(
|
||||
Map<String, IDataRecord> recordMap) {
|
||||
String[] datasets = { LightningConstants.TIME_DATASET,
|
||||
LightningConstants.INTENSITY_DATASET,
|
||||
LightningConstants.LAT_DATASET, LightningConstants.LON_DATASET,
|
||||
LightningConstants.STRIKE_TYPE_DATASET,
|
||||
LightningConstants.PULSE_INDEX_DATASET };
|
||||
List<String> rval = new ArrayList<>(datasets.length);
|
||||
for (String ds : datasets) {
|
||||
if (!recordMap.containsKey(ds)) {
|
||||
rval.add(ds);
|
||||
}
|
||||
}
|
||||
return rval;
|
||||
}
|
||||
|
||||
/**
|
||||
* Index records first by datastore group then by dataset name
|
||||
*
|
||||
* @param records
|
||||
* @return
|
||||
*/
|
||||
public static Map<String, List<IDataRecord>> createRecordMap(
|
||||
public static Map<String, Map<String, IDataRecord>> createRecordMap(
|
||||
IDataRecord[] records) {
|
||||
Map<String, List<IDataRecord>> recordMap = new HashMap<String, List<IDataRecord>>();
|
||||
Map<String, Map<String, IDataRecord>> rval = new HashMap<String, Map<String, IDataRecord>>();
|
||||
for (IDataRecord rec : records) {
|
||||
List<IDataRecord> recordList = recordMap.get(rec.getName());
|
||||
if (recordList == null) {
|
||||
recordList = new ArrayList<IDataRecord>();
|
||||
recordMap.put(rec.getName(), recordList);
|
||||
String group = rec.getGroup();
|
||||
String name = rec.getName();
|
||||
Map<String, IDataRecord> datasets = rval.get(group);
|
||||
if (datasets == null) {
|
||||
datasets = new HashMap<>();
|
||||
rval.put(group, datasets);
|
||||
}
|
||||
IDataRecord prevEntry = datasets.put(name, rec);
|
||||
if (prevEntry != null) {
|
||||
/* this should never happen */
|
||||
statusHandler.warn("Group '" + group
|
||||
+ "' hash multiple datasets with name " + name);
|
||||
}
|
||||
recordList.add(rec);
|
||||
}
|
||||
return recordMap;
|
||||
return rval;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -339,19 +401,14 @@ public class LightningFrameRetriever implements
|
|||
}
|
||||
|
||||
/**
|
||||
* @param pulseIndexes
|
||||
* @param recordIndex
|
||||
* @return true if any data record in list has a valid pulse index
|
||||
* @param record
|
||||
* @return true if data record has a valid pulse index
|
||||
*/
|
||||
private static boolean hasPulseData(List<IDataRecord> pulseIndexes,
|
||||
int recordIndex) {
|
||||
if (pulseIndexes != null) {
|
||||
IDataRecord record = pulseIndexes.get(recordIndex);
|
||||
int[] indexData = ((IntegerDataRecord) record).getIntData();
|
||||
for (int i = 0; i < indexData.length; ++i) {
|
||||
if (indexData[i] >= 0) {
|
||||
return true;
|
||||
}
|
||||
private static boolean hasPulseData(IDataRecord record) {
|
||||
int[] indexData = ((IntegerDataRecord) record).getIntData();
|
||||
for (int i = 0; i < indexData.length; ++i) {
|
||||
if (indexData[i] >= 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
|
Loading…
Add table
Reference in a new issue