Merge branch 'master_14.1.1' into omaha_14.1.1

Conflicts:
	nativeLib/files.native/files.native.ecl
	nativeLib/ncep_grib2module/.cproject
	nativeLib/rary.cots.g2clib/.project
	nativeLib/rary.cots.g2clib/g2_unpack3.c
	rpms/awips2.core/Installer.python/component.spec
	rpms/awips2.core/Installer.python/nativeLib/x86_64/grib2.so
	rpms/awips2.core/Installer.python/nativeLib/x86_64/libjasper.so
	rpms/awips2.core/Installer.python/nativeLib/x86_64/libjasper.so.1

Former-commit-id: 665911b033 [formerly 665911b033 [formerly 412bcb0f21b7385a170d14b3a88dd67c91a301a2]]
Former-commit-id: c76c856340
Former-commit-id: 0954490a5a
This commit is contained in:
Bryan Kowal 2013-10-31 15:23:08 -05:00
commit 6e08dc72c0
784 changed files with 4318 additions and 905 deletions

View file

@ -52,7 +52,7 @@
<resourceData xsi:type="plotResourceData" plotSource="METAR Plot" <resourceData xsi:type="plotResourceData" plotSource="METAR Plot"
plotModelFile="stdObsDesign.svg" spiFile="basemaps/MTR.spi" plotModelFile="stdObsDesign.svg" spiFile="basemaps/MTR.spi"
isUpdatingOnMetadataOnly="true" retrieveData="false" isUpdatingOnMetadataOnly="true" retrieveData="false"
isRequeryNecessaryOnTimeMatch="true" pixelSizeHint="45"> isRequeryNecessaryOnTimeMatch="true" isTopOfTheHour="true" pixelSizeHint="45">
<binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/> <binOffset posOffset="1800" negOffset="1800" virtualOffset="0"/>
<metadataMap> <metadataMap>
<mapping key="reportType"> <mapping key="reportType">

View file

@ -46,6 +46,7 @@
# Cleaned up some constants # Cleaned up some constants
# Jun 21, 2013 14983 ryu Fixed encodeEditArea() to evaluate query # Jun 21, 2013 14983 ryu Fixed encodeEditArea() to evaluate query
# when necessary # when necessary
# Oct 07, 2013 2424 randerso remove use of pytz
# #
######################################################################## ########################################################################
import types, string, time, sys import types, string, time, sys
@ -1479,14 +1480,14 @@ class SmartScript(BaseTool.BaseTool):
This should be used instead of time.localtime() This should be used instead of time.localtime()
''' '''
from pytz import timezone import dateutil.tz
if tz is None: if tz is None:
tzname = self.__dataMgr.getClient().getSiteTimeZone() tzname = self.__dataMgr.getClient().getSiteTimeZone()
tz = timezone(tzname) tz = dateutil.tz.gettz(tzname)
utczone = timezone('UTC') utczone = dateutil.tz.gettz('UTC')
gmdt = utczone.localize(self._gmtime(date)) gmdt = self._gmtime(date).replace(tzinfo=utczone)
tzdt = gmdt.astimezone(tz) tzdt = gmdt.astimezone(tz)
return tzdt return tzdt

View file

@ -17,7 +17,6 @@ FINT=
FLINE= FLINE=
HILO= HILO=
HLSYM= HLSYM=
CLRBAR=0
WIND= WIND=
TITLE=5/-1/~ 1000-500 MB THICKNESS!0 TITLE=5/-1/~ 1000-500 MB THICKNESS!0
COLORS=2 COLORS=2

View file

@ -349,19 +349,7 @@ public class PlotResource2 extends
plots.put(normTime, list); plots.put(normTime, list);
} }
list.add(info); list.add(info);
// Sort this data in "backwards" so that the most recent observation
// for a particular station display correctly
Collections.sort(list, new Comparator<PlotInfo>() {
@Override
public int compare(PlotInfo o1, PlotInfo o2) {
return o1.dataTime.compareTo(o2.dataTime);
}
});
Collections.reverse(list);
} }
} }
@ -373,6 +361,19 @@ public class PlotResource2 extends
DataTime time = entry.getKey(); DataTime time = entry.getKey();
List<PlotInfo> info = entry.getValue(); List<PlotInfo> info = entry.getValue();
FrameInformation frameInfo = frameMap.get(time); FrameInformation frameInfo = frameMap.get(time);
// Sort this data in "backwards" so that the most recent observation
// for a particular station display correctly
if (info.size() > 1) {
Collections.sort(info, new Comparator<PlotInfo>() {
@Override
public int compare(PlotInfo o1, PlotInfo o2) {
return o2.dataTime.compareTo(o1.dataTime);
}
});
}
if (frameInfo != null) { if (frameInfo != null) {
Map<String, Station> stationMap = frameInfo.stationMap; Map<String, Station> stationMap = frameInfo.stationMap;
for (PlotInfo plot : info) { for (PlotInfo plot : info) {

View file

@ -96,7 +96,8 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback;
* 07/26/2012 15171 rferrel Disable editor's send and clear AFOS PIL fields when * 07/26/2012 15171 rferrel Disable editor's send and clear AFOS PIL fields when
* invalid product Id and user want to edit it anyway. * invalid product Id and user want to edit it anyway.
* 09/20/2012 1196 rferrel Changing dialogs being called to not block. * 09/20/2012 1196 rferrel Changing dialogs being called to not block.
* 11/26/2012 14526 mgamazaychikov Added traverse listener for RETURN key * 11/26/2012 14526 mgamazaychikov Added traverse listener for RETURN key
* 10/07/2012 16664 mgamazaychikov Added padProdDesignatorText method
* </pre> * </pre>
* *
* @author lvenable * @author lvenable
@ -411,21 +412,7 @@ public class AWIPSHeaderBlockDlg extends CaveSWTDialog implements
@Override @Override
public void focusLost(FocusEvent e) { public void focusLost(FocusEvent e) {
StringBuilder sb = new StringBuilder(prodDesignatorTF.getText() padProdDesignatorText(prodDesignatorTF.getText());
.trim());
if (sb.length() > 0) {
// Pad field with trailing spaces.
while (sb.length() < 3) {
sb.append(' ');
}
// Only trigger the modification listener when there is a
// real change.
String value = sb.toString();
if (!value.equals(prodDesignatorTF.getText())) {
prodDesignatorTF.setText(value);
}
}
} }
@Override @Override
@ -462,7 +449,23 @@ public class AWIPSHeaderBlockDlg extends CaveSWTDialog implements
} }
} }
/** protected void padProdDesignatorText(String prodDesignatorText) {
StringBuilder sb = new StringBuilder(prodDesignatorText.trim());
if (sb.length() > 0) {
// Pad field with trailing spaces.
while (sb.length() < 3) {
sb.append(' ');
}
// Only trigger the modification listener when there is a
// real change.
String value = sb.toString();
if (!value.equals(prodDesignatorText)) {
prodDesignatorTF.setText(value);
}
}
}
/**
* Create the addressee control fields. * Create the addressee control fields.
*/ */
private void createAddresseeFields() { private void createAddresseeFields() {
@ -1041,6 +1044,7 @@ public class AWIPSHeaderBlockDlg extends CaveSWTDialog implements
@Override @Override
public void keyTraversed(TraverseEvent event) { public void keyTraversed(TraverseEvent event) {
if (event.detail == SWT.TRAVERSE_RETURN) { if (event.detail == SWT.TRAVERSE_RETURN) {
padProdDesignatorText(prodDesignatorTF.getText());
enterBtnPressed(); enterBtnPressed();
} }
} }

View file

@ -73,6 +73,7 @@ import com.vividsolutions.jts.geom.prep.PreparedGeometryFactory;
* the call to removeIntersectedSeg() with a call to adjustVertex(); updated * the call to removeIntersectedSeg() with a call to adjustVertex(); updated
* removeDuplicateCoordinate(), computeCoordinate(), adjustPolygon() prolog, and * removeDuplicateCoordinate(), computeCoordinate(), adjustPolygon() prolog, and
* removeOverlaidLinesegments(); added alterVertexes() and calcShortestDistance(). * removeOverlaidLinesegments(); added alterVertexes() and calcShortestDistance().
* 10/01/2013 DR 16632 Qinglu Lin Fixed the bug in for loop range.
* </pre> * </pre>
* *
* @author mschenke * @author mschenke
@ -1102,6 +1103,9 @@ public class PolygonUtil {
if (verts == null) { if (verts == null) {
return null; return null;
} }
if (verts.length <= 3)
return verts;
Set<Coordinate> coords = new LinkedHashSet<Coordinate>(); Set<Coordinate> coords = new LinkedHashSet<Coordinate>();
for (Coordinate c : verts) for (Coordinate c : verts)
coords.add(c); coords.add(c);
@ -1300,7 +1304,7 @@ public class PolygonUtil {
// of a straight line segment // of a straight line segment
coords = new Coordinate[coords.length - 1]; coords = new Coordinate[coords.length - 1];
if (i == m - 2) { if (i == m - 2) {
for (int j = 1; j < m - 2; j++) { for (int j = 1; j <= m - 2; j++) {
coords[j-1] = new Coordinate(expandedCoords[j]); coords[j-1] = new Coordinate(expandedCoords[j]);
} }
coords[coords.length-1] = new Coordinate(coords[0]); coords[coords.length-1] = new Coordinate(coords[0]);

View file

@ -149,6 +149,7 @@ import com.vividsolutions.jts.geom.Polygon;
* Aug 6, 2013 2243 jsanchez Refreshed the follow up list every minute. * Aug 6, 2013 2243 jsanchez Refreshed the follow up list every minute.
* Aug 15, 2013 DR 16418 D. Friedman Make dialog visibility match editable state. * Aug 15, 2013 DR 16418 D. Friedman Make dialog visibility match editable state.
* Sep 17, 2013 DR 16496 D. Friedman Make editable state more consistent. * Sep 17, 2013 DR 16496 D. Friedman Make editable state more consistent.
* Oct 01, 2013 DR16612 m.gamazaychikov Fixed inconsistencies with track locking and updateListSelected method
* </pre> * </pre>
* *
* @author chammack * @author chammack
@ -259,6 +260,8 @@ public class WarngenDialog extends CaveSWTDialog implements
private boolean polygonLocked = false; private boolean polygonLocked = false;
private boolean trackLocked = false;
private int totalSegments = 0; private int totalSegments = 0;
private String damBreakInstruct = null; private String damBreakInstruct = null;
@ -1066,7 +1069,7 @@ public class WarngenDialog extends CaveSWTDialog implements
if (((followupData == null) || ((WarningAction.valueOf(followupData if (((followupData == null) || ((WarningAction.valueOf(followupData
.getAct()) == WarningAction.CON) && warngenLayer .getAct()) == WarningAction.CON) && warngenLayer
.conWarnAreaChanged(followupData))) .conWarnAreaChanged(followupData)))
&& !polygonLocked) { && !polygonLocked && !trackLocked) {
redrawFromWarned(); redrawFromWarned();
} }
@ -1518,8 +1521,8 @@ public class WarngenDialog extends CaveSWTDialog implements
} }
warngenLayer.getStormTrackState().setInitiallyMotionless( warngenLayer.getStormTrackState().setInitiallyMotionless(
(warngenLayer.getConfiguration().isTrackEnabled() == false) (warngenLayer.getConfiguration().isTrackEnabled() == false)
|| (warngenLayer.getConfiguration() || (warngenLayer.getConfiguration()
.getPathcastConfig() == null)); .getPathcastConfig() == null));
if (warngenLayer.getStormTrackState().isInitiallyMotionless()) { if (warngenLayer.getStormTrackState().isInitiallyMotionless()) {
warngenLayer.getStormTrackState().speed = 0; warngenLayer.getStormTrackState().speed = 0;
warngenLayer.getStormTrackState().angle = 0; warngenLayer.getStormTrackState().angle = 0;
@ -1570,6 +1573,7 @@ public class WarngenDialog extends CaveSWTDialog implements
* @param b * @param b
*/ */
private void setTrackLocked(boolean b) { private void setTrackLocked(boolean b) {
trackLocked = b;
fromTrack.setEnabled(!b); fromTrack.setEnabled(!b);
warngenLayer.getStormTrackState().editable = !b; warngenLayer.getStormTrackState().editable = !b;
} }
@ -1624,7 +1628,7 @@ public class WarngenDialog extends CaveSWTDialog implements
if ((WarningAction if ((WarningAction
.valueOf(warngenLayer.state.followupData .valueOf(warngenLayer.state.followupData
.getAct()) == WarningAction.CON) .getAct()) == WarningAction.CON)
&& (totalSegments > 1)) { && (totalSegments > 1)) {
sameProductMessage(warngenLayer.state.followupData sameProductMessage(warngenLayer.state.followupData
.getEquvialentString()); .getEquvialentString());
} }
@ -1633,21 +1637,22 @@ public class WarngenDialog extends CaveSWTDialog implements
} }
} else { } else {
if (warngenLayer.state.followupData != null) { if (warngenLayer.state.followupData != null) {
// Sets the updatelist with the last selected vtec option // recreate updates before setting the updatelist to the
for (int i = 0; i < updateListCbo.getItemCount(); i++) { // last selected vtec option
String item = updateListCbo.getItem(i);
if (item.equals(warngenLayer.state.followupData
.getDisplayString())) {
updateListCbo.select(i);
updateListCbo.setText(item);
data = warngenLayer.state.followupData;
break;
}
}
} else {
recreateUpdates(); recreateUpdates();
recreateDurations(durationList); recreateDurations(durationList);
return; for (int i = 0; i < updateListCbo.getItemCount(); i++) {
FollowupData fd = (FollowupData) updateListCbo
.getData(updateListCbo.getItem(i));
if ( fd != null ) {
if (fd.equals(warngenLayer.state.followupData)) {
updateListCbo.select(i);
updateListCbo.setText(updateListCbo.getItem(i));
data = warngenLayer.state.followupData;
return;
}
}
}
} }
} }
if (currMode == Mode.DRAG_ME) { if (currMode == Mode.DRAG_ME) {
@ -2116,7 +2121,7 @@ public class WarngenDialog extends CaveSWTDialog implements
setPolygonLocked(false); setPolygonLocked(false);
AbstractWarningRecord newWarn = CurrentWarnings.getInstance( AbstractWarningRecord newWarn = CurrentWarnings.getInstance(
warngenLayer.getLocalizedSite()).getNewestByTracking( warngenLayer.getLocalizedSite()).getNewestByTracking(
data.getEtn(), data.getPhen() + "." + data.getSig()); data.getEtn(), data.getPhen() + "." + data.getSig());
updatePolygon(newWarn); updatePolygon(newWarn);
@ -2147,7 +2152,7 @@ public class WarngenDialog extends CaveSWTDialog implements
AbstractWarningRecord newWarn = CurrentWarnings.getInstance( AbstractWarningRecord newWarn = CurrentWarnings.getInstance(
warngenLayer.getLocalizedSite()).getNewestByTracking( warngenLayer.getLocalizedSite()).getNewestByTracking(
data.getEtn(), data.getPhen() + "." + data.getSig()); data.getEtn(), data.getPhen() + "." + data.getSig());
updatePolygon(newWarn); updatePolygon(newWarn);
@ -2459,7 +2464,7 @@ public class WarngenDialog extends CaveSWTDialog implements
public void realizeEditableState() { public void realizeEditableState() {
boolean layerEditable = warngenLayer.isEditable(); boolean layerEditable = warngenLayer.isEditable();
// TODO: Note there is no 'is track editing allowed' state yet. // TODO: Note there is no 'is track editing allowed' state yet.
warngenLayer.getStormTrackState().editable = layerEditable && trackEditable; warngenLayer.getStormTrackState().editable = layerEditable && trackEditable && !trackLocked;
warngenLayer.setBoxEditable(layerEditable && boxEditable && !polygonLocked); warngenLayer.setBoxEditable(layerEditable && boxEditable && !polygonLocked);
warngenLayer.issueRefresh(); warngenLayer.issueRefresh();
} }

View file

View file

0
deltaScripts/13.5.2/addBufrmosDataURI.sh Executable file → Normal file
View file

View file

@ -33,17 +33,12 @@
# Date Ticket# Engineer Description # Date Ticket# Engineer Description
# ------------ ---------- ----------- -------------------------- # ------------ ---------- ----------- --------------------------
# 01/17/13 dgilling Initial Creation. # 01/17/13 dgilling Initial Creation.
# 10/09/13 16614 njensen Fixed reloadModules()
# #
# #
# #
import os
import MasterInterface import MasterInterface
import RollBackImporter
rollbackImporter = RollBackImporter.RollBackImporter()
class RollbackMasterInterface(MasterInterface.MasterInterface): class RollbackMasterInterface(MasterInterface.MasterInterface):
@ -75,8 +70,6 @@ class RollbackMasterInterface(MasterInterface.MasterInterface):
def reloadModules(self): def reloadModules(self):
for script in self.scripts: for script in self.scripts:
super(RollbackMasterInterface, self).removeModule(script) super(RollbackMasterInterface, self).reloadModule(script)
rollbackImporter.rollback()
self.importModules()

View file

@ -19,6 +19,15 @@
## ##
# NOTE: THIS FILE SHOULD NOT BE USER-MODIFIED. INSTEAD REFER TO THE # NOTE: THIS FILE SHOULD NOT BE USER-MODIFIED. INSTEAD REFER TO THE
# LOCAL CONFIG DOCUMENTATION ON HOW TO OVERRIDE SETTINGS IN THIS FILE. # LOCAL CONFIG DOCUMENTATION ON HOW TO OVERRIDE SETTINGS IN THIS FILE.
#
# Baseline GFE server configuration
#
# SOFTWARE HISTORY
#
# Date Ticket# Engineer Description
# ------------ ---------- ----------- --------------------------
# 10/03/13 2424 randerso Change localTC to use dateutil instead of pytz
# to get correct offsets for Alaska
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
# USEFUL DEFINES # USEFUL DEFINES
@ -859,9 +868,10 @@ Persistent = (0, 0, 0) # special time constraint
# seconds local time, e.g., 6*HOUR would indicate 6am. # seconds local time, e.g., 6*HOUR would indicate 6am.
def localTC(start,repeat,duration,dst): def localTC(start,repeat,duration,dst):
timezone = SITES[GFESUITE_SITEID][3] timezone = SITES[GFESUITE_SITEID][3]
import pytz import dateutil.tz, datetime
tz = pytz.timezone(timezone) tz = dateutil.tz.gettz(timezone)
delta = tz.utcoffset(0) - tz.dst(0); dt = datetime.datetime.utcnow()
delta = tz.utcoffset(dt) + tz.dst(dt)
offset = delta.days*86400 + delta.seconds offset = delta.days*86400 + delta.seconds
start = start - offset start = start - offset
if dst == 1: if dst == 1:

0
edexOsgi/build.edex/opt/db/ddl/maps/importShapeFile.sh Executable file → Normal file
View file

View file

@ -66,6 +66,7 @@ from com.raytheon.uf.common.localization import LocalizationContext_Localization
# A1, big perf improvement. # A1, big perf improvement.
# 05/23/13 1759 dgilling Remove unnecessary imports. # 05/23/13 1759 dgilling Remove unnecessary imports.
# 07/25/13 2233 randerso Improved memory utilization and performance # 07/25/13 2233 randerso Improved memory utilization and performance
# 09/20/13 2405 dgilling Clip grids before inserting into cache.
# #
# #
@ -97,8 +98,9 @@ def logDebug(*msg):
class WECache(object): class WECache(object):
def __init__(self, we, inv): def __init__(self, we, inv, clipArea):
self._we = we self._we = we
self._clipArea = clipArea
self._inv = OrderedDict() self._inv = OrderedDict()
lst = list(inv) lst = list(inv)
while len(lst): while len(lst):
@ -109,7 +111,7 @@ class WECache(object):
gridsAndHist = self._we.get(javaTRs, True) gridsAndHist = self._we.get(javaTRs, True)
for idx, tr in enumerate(i): for idx, tr in enumerate(i):
pair = gridsAndHist.get(idx) pair = gridsAndHist.get(idx)
g = self.__encodeGridSlice(pair.getFirst()) g = self.__encodeGridSlice(pair.getFirst(), clipArea)
h = self.__encodeGridHistory(pair.getSecond()) h = self.__encodeGridHistory(pair.getSecond())
self._inv[tr] = (g, h) self._inv[tr] = (g, h)
lst = lst[BATCH_WRITE_COUNT:] lst = lst[BATCH_WRITE_COUNT:]
@ -122,31 +124,32 @@ class WECache(object):
try: try:
return self._inv[key] return self._inv[key]
except KeyError: except KeyError:
logEvent("Cache miss for key:", str(key))
grid = self._we.getItem(iscUtil.toJavaTimeRange(key)) grid = self._we.getItem(iscUtil.toJavaTimeRange(key))
pyGrid = self.__encodeGridSlice(grid) pyGrid = self.__encodeGridSlice(grid, self._clipArea)
history = grid.getGridDataHistory() history = grid.getGridDataHistory()
pyHist = self.__encodeGridHistory(history) pyHist = self.__encodeGridHistory(history)
return (pyGrid, pyHist) return (pyGrid, pyHist)
def __encodeGridSlice(self, grid): def __encodeGridSlice(self, grid, clipArea):
gridType = grid.getGridInfo().getGridType().toString() gridType = grid.getGridInfo().getGridType().toString()
if gridType == "SCALAR": if gridType == "SCALAR":
return grid.__numpy__[0] return clipToExtrema(grid.__numpy__[0], clipArea)
elif gridType == "VECTOR": elif gridType == "VECTOR":
vecGrids = grid.__numpy__ vecGrids = grid.__numpy__
return (vecGrids[0], vecGrids[1]) return (clipToExtrema(vecGrids[0], clipArea), clipToExtrema(vecGrids[1], clipArea))
elif gridType == "WEATHER": elif gridType == "WEATHER":
keys = grid.getKeys() keys = grid.getKeys()
keyList = [] keyList = []
for theKey in keys: for theKey in keys:
keyList.append(theKey.toString()) keyList.append(theKey.toString())
return (grid.__numpy__[0], keyList) return (clipToExtrema(grid.__numpy__[0], clipArea), keyList)
elif gridType =="DISCRETE": elif gridType =="DISCRETE":
keys = grid.getKey() keys = grid.getKey()
keyList = [] keyList = []
for theKey in keys: for theKey in keys:
keyList.append(theKey.toString()) keyList.append(theKey.toString())
return (grid.__numpy__[0], keyList) return (clipToExtrema(grid.__numpy__[0], clipArea), keyList)
def __encodeGridHistory(self, histories): def __encodeGridHistory(self, histories):
retVal = [] retVal = []
@ -524,55 +527,29 @@ def storeTopoGrid(client, file, databaseID, invMask, clipArea):
logEvent("Saved Topo Grid") logEvent("Saved Topo Grid")
def historyFunc(x, y):
return y[x][1]
###-------------------------------------------------------------------------### ###-------------------------------------------------------------------------###
### ###
def storeGridDataHistory(file, we, wec, trList, timeRange): def storeGridDataHistory(file, we, wec, trList):
"Stores the Grid Data history string for each grid in we." "Stores the Grid Data history string for each grid in we."
histories = []
for tr in trList:
histories.append(historyFunc(tr, wec))
#histories = map(lambda x, y=wec: y[x][1], trList)
# get the maximum size of the history string # get the maximum size of the history string
maxHistSize = 0 maxHistSize = 0
gridCount = 0 histList = []
firstSlot = -1 for tr in trList:
lastSlot = 0 his = wec[tr][1]
for x in xrange(len(trList)):
t = trList[x]
his = histories[x]
hisString = '' hisString = ''
for i in xrange(len(his)): for i,h in enumerate(his):
hisString = hisString + str(his[i]) hisString = hisString + str(h)
if i != len(his) - 1: if i != len(his) - 1:
hisString = hisString + " ^" hisString = hisString + " ^"
if overlaps(t, timeRange): histList.append(hisString)
if firstSlot == -1: maxHistSize = max(maxHistSize,len(hisString))
firstSlot = gridCount
lastSlot = gridCount
if len(hisString) > maxHistSize:
maxHistSize = len(hisString)
gridCount = gridCount + 1
# Make the history variable and fill it # Make the history variable and fill it
histShape = (lastSlot - firstSlot + 1, maxHistSize + 1) histShape = (len(histList), maxHistSize + 1)
if firstSlot != -1: histCube = numpy.zeros(histShape, 'c')
histCube = numpy.zeros(histShape, 'c') for slot, hisString in enumerate(histList):
slot = 0 histCube[slot:] = hisString
for i in xrange(firstSlot, lastSlot + 1):
his = histories[i]
hisString = ''
for h in range(len(his)):
hisString = hisString + str(his[h])
if h != len(his) - 1:
hisString = hisString + " ^"
histCube[slot:] = hisString
slot = slot + 1
# make the history variable anyway. iscMosaic needs it. # make the history variable anyway. iscMosaic needs it.
elemName = we.getParmid().getParmName() + "_" + we.getParmid().getParmLevel() elemName = we.getParmid().getParmName() + "_" + we.getParmid().getParmLevel()
@ -582,7 +559,7 @@ def storeGridDataHistory(file, we, wec, trList, timeRange):
var = file.createVariable(varName, 'c', dims) var = file.createVariable(varName, 'c', dims)
if firstSlot != -1: if len(histList) > 0:
# store the cube in the netCDF file # store the cube in the netCDF file
var[:] = histCube var[:] = histCube
return return
@ -756,9 +733,9 @@ def storeScalarWE(we, trList, file, timeRange, databaseID,
cube = numpy.empty(shape=(gridCount, clipSize[1], clipSize[0]), dtype=numpy.float32) cube = numpy.empty(shape=(gridCount, clipSize[1], clipSize[0]), dtype=numpy.float32)
wec = WECache(we, overlappingTimes) wec = WECache(we, overlappingTimes, clipArea)
for i,t in enumerate(overlappingTimes): for i,t in enumerate(overlappingTimes):
grid = clipToExtrema(wec[t][0], clipArea) grid = wec[t][0]
#adjust for time changes #adjust for time changes
if we.getGpi().isRateParm(): if we.getGpi().isRateParm():
durRatio = (float(timeList[i][1]-timeList[i][0]))/float((t[1]-t[0])) durRatio = (float(timeList[i][1]-timeList[i][0]))/float((t[1]-t[0]))
@ -818,7 +795,7 @@ def storeScalarWE(we, trList, file, timeRange, databaseID,
setattr(var, "fillValue", fillValue) setattr(var, "fillValue", fillValue)
## Extract the GridDataHistory info and save it ## Extract the GridDataHistory info and save it
storeGridDataHistory(file, we, wec, trList, timeRange) storeGridDataHistory(file, we, wec, overlappingTimes)
logEvent("Saved", gridCount, varName, " grids") logEvent("Saved", gridCount, varName, " grids")
@ -841,11 +818,11 @@ def storeVectorWE(we, trList, file, timeRange,
magCube = numpy.empty(shape=(gridCount, clipSize[1], clipSize[0]),dtype=numpy.float32) magCube = numpy.empty(shape=(gridCount, clipSize[1], clipSize[0]),dtype=numpy.float32)
dirCube = numpy.empty(shape=(gridCount, clipSize[1], clipSize[0]),dtype=numpy.float32) dirCube = numpy.empty(shape=(gridCount, clipSize[1], clipSize[0]),dtype=numpy.float32)
wec = WECache(we, overlappingTimes) wec = WECache(we, overlappingTimes, clipArea)
for i,t in enumerate(overlappingTimes): for i,t in enumerate(overlappingTimes):
vecData = wec[t][0] vecData = wec[t][0]
mag = clipToExtrema(vecData[0], clipArea) mag = vecData[0]
dir = clipToExtrema(vecData[1], clipArea) dir = vecData[1]
if we.getGpi().isRateParm(): if we.getGpi().isRateParm():
durRatio = (float(timeList[i][1]-timeList[i][0]))/float((t[1]-t[0])) durRatio = (float(timeList[i][1]-timeList[i][0]))/float((t[1]-t[0]))
mag *= durRatio mag *= durRatio
@ -947,7 +924,7 @@ def storeVectorWE(we, trList, file, timeRange,
setattr(dirVar, "fillValue", dfillValue) setattr(dirVar, "fillValue", dfillValue)
## Extract the GridDataHistory info and save it ## Extract the GridDataHistory info and save it
storeGridDataHistory(file, we, wec, trList, timeRange) storeGridDataHistory(file, we, wec, overlappingTimes)
logEvent("Saved", gridCount, varName, "grids") logEvent("Saved", gridCount, varName, "grids")
@ -1001,11 +978,10 @@ def storeWeatherWE(we, trList, file, timeRange, databaseID, invMask, clipArea):
byteCube = numpy.empty(shape=(gridCount, clipSize[1], clipSize[0]), dtype=numpy.int8) byteCube = numpy.empty(shape=(gridCount, clipSize[1], clipSize[0]), dtype=numpy.int8)
keyList = [] keyList = []
wec = WECache(we, overlappingTimes) wec = WECache(we, overlappingTimes, clipArea)
for i,t in enumerate(overlappingTimes): for i,t in enumerate(overlappingTimes):
wx = wec[t][0] wx = wec[t][0]
grid = clipToExtrema(wx[0], clipArea) byteCube[i] = wx[0]
byteCube[i] = grid
keyList.append(wx[1]) keyList.append(wx[1])
# make the variable name # make the variable name
@ -1070,7 +1046,7 @@ def storeWeatherWE(we, trList, file, timeRange, databaseID, invMask, clipArea):
setattr(var, "fillValue", fillValue) setattr(var, "fillValue", fillValue)
## Extract the GridDataHistory info and save it ## Extract the GridDataHistory info and save it
storeGridDataHistory(file, we, wec, trList, timeRange) storeGridDataHistory(file, we, wec, overlappingTimes)
logEvent("Saved", gridCount, varName, "grids") logEvent("Saved", gridCount, varName, "grids")
@ -1092,11 +1068,10 @@ def storeDiscreteWE(we, trList, file, timeRange, databaseID, invMask, clipArea):
byteCube = numpy.empty(shape=(gridCount, clipSize[1], clipSize[0]), dtype=numpy.int8) byteCube = numpy.empty(shape=(gridCount, clipSize[1], clipSize[0]), dtype=numpy.int8)
keyList = [] keyList = []
wec = WECache(we, overlappingTimes) wec = WECache(we, overlappingTimes, clipArea)
for i,t in enumerate(overlappingTimes): for i,t in enumerate(overlappingTimes):
dis = wec[t][0] dis = wec[t][0]
grid = clipToExtrema(dis[0], clipArea) byteCube[i] = dis[0]
byteCube[i] = grid
keyList.append(dis[1]) keyList.append(dis[1])
@ -1160,7 +1135,7 @@ def storeDiscreteWE(we, trList, file, timeRange, databaseID, invMask, clipArea):
setattr(var, "fillValue", fillValue) setattr(var, "fillValue", fillValue)
## Extract the GridDataHistory info and save it ## Extract the GridDataHistory info and save it
storeGridDataHistory(file, we, wec, trList, timeRange) storeGridDataHistory(file, we, wec, overlappingTimes)
logEvent("Saved", gridCount, varName, "grids") logEvent("Saved", gridCount, varName, "grids")
@ -1335,7 +1310,8 @@ def main(outputFilename, parmList, databaseID, startTime,
try: try:
timeRange = makeTimeRange(argDict['startTime'], argDict['endTime']) timeRange = makeTimeRange(argDict['startTime'], argDict['endTime'])
except: except:
sys.exit(1) logException("Unable to create TimeRange from arguments: startTime= " + str(argDict['startTime']) + ", endTime= " + argDict['endTime'])
return
# See if the databaseID is valid. An exception will be tossed # See if the databaseID is valid. An exception will be tossed
db = IFPDB(argDict['databaseID']) db = IFPDB(argDict['databaseID'])

View file

@ -2879,21 +2879,11 @@
<name>HPCGuide</name> <name>HPCGuide</name>
<center>7</center> <center>7</center>
<subcenter>5</subcenter> <subcenter>5</subcenter>
<grid>197</grid>
<process> <process>
<id>183</id> <id>183</id>
</process> </process>
</model> </model>
<model>
<name>HPCGuide-2.5km</name>
<center>7</center>
<subcenter>5</subcenter>
<process>
<id>183</id>
</process>
</model>
<model> <model>
<name>HPCGuide-AK</name> <name>HPCGuide-AK</name>
<center>7</center> <center>7</center>

View file

@ -81,15 +81,6 @@ public class MhsMessage {
*/ */
static public final String EnvMhsTrace = "MHS_SHOW_TRACE"; static public final String EnvMhsTrace = "MHS_SHOW_TRACE";
/**
* Environment variable to determine the MHS interface to use. If undefined,
* it is the same as defining it to "NO" or "FALSE". If set to "YES" or
* "TRUE", then the JNI interface to the MHS DWB functions is used to submit
* messages. Any other value results in message submission occurring via the
* command line utility msg_send.
*/
static public final String EnvMhsUseNative = "MHS_USE_NATIVE_INTERFACE";
/** /**
* Minimum message code value * Minimum message code value
*/ */
@ -194,7 +185,6 @@ public class MhsMessage {
* Valid time parameter formatted as a string (mm/dd/yyyy:HHMM). This value * Valid time parameter formatted as a string (mm/dd/yyyy:HHMM). This value
* is derived from {@link #validTime} during message submission. * is derived from {@link #validTime} during message submission.
*/ */
@SuppressWarnings("unused")
private String validTimeString; private String validTimeString;
/** /**
@ -207,7 +197,6 @@ public class MhsMessage {
* Timeout time parameter formatted as a string (mm/dd/yyyy:HHMM). This * Timeout time parameter formatted as a string (mm/dd/yyyy:HHMM). This
* value is derived from {@link #timeoutTime} during message submission. * value is derived from {@link #timeoutTime} during message submission.
*/ */
@SuppressWarnings("unused")
private String timeoutTimeString; private String timeoutTimeString;
/** /**
@ -259,11 +248,6 @@ public class MhsMessage {
*/ */
private String resultText; private String resultText;
/**
*
*/
private boolean useNativeInterface;
/** /**
* Sole constructor. Provides reasonable default values for a message * Sole constructor. Provides reasonable default values for a message
* object's fields as follows: * object's fields as follows:
@ -286,14 +270,10 @@ public class MhsMessage {
*/ */
public MhsMessage(int code) { public MhsMessage(int code) {
String traceString = System.getenv(EnvMhsTrace); String traceString = System.getenv(EnvMhsTrace);
String interfaceString = System.getenv(EnvMhsUseNative);
showTrace = (traceString != null) showTrace = (traceString != null)
&& ((traceString.equalsIgnoreCase("yes") || traceString && ((traceString.equalsIgnoreCase("yes")
.equalsIgnoreCase("true"))); || traceString.equalsIgnoreCase("true")));
useNativeInterface = (interfaceString != null)
&& ((interfaceString.equalsIgnoreCase("yes")) || interfaceString
.equalsIgnoreCase("true"));
actionCode = code; actionCode = code;
setRetryCount(0); setRetryCount(0);
@ -313,21 +293,6 @@ public class MhsMessage {
submitted = false; submitted = false;
} }
/**
* Submits a message to the message request server daemon. This is JNI code
* to translate a Java message object to a C MHS message object.
*
* @return 0 if successful; a positive integer if a MHS error is detected;
* -1 if an error occurs in a JNI call, which will usually result in
* a Java exception when control is returned toe the JVM.
* @see MhsMessage
*/
private native String submitMessage() throws MhsSubmitException;
static {
System.loadLibrary("coDDM_msg_send");
}
/** /**
* Gets the action code for this message object. * Gets the action code for this message object.
* *
@ -839,30 +804,6 @@ public class MhsMessage {
return retryCount; return retryCount;
} }
/**
* Call to force the MHS interface to be used for this message. The default
* value is determined by the environment variable MHS_USE_NATIVE_INTERFACE.
* Set to true to use the native C DWB functions. Set to false to use the
* command line utility msg_send.
*
* @param useNativeInterface
* the useNativeInterface to set
*/
public void setUseNativeInterface(boolean useNativeInterface) {
this.useNativeInterface = useNativeInterface;
}
/**
* Returns the MHS interface that will be used to submit this message. A
* true value indicates that the native C DWB functions will be used. False
* indicates that the command line utility msg_send will be used.
*
* @return the useNativeInterface
*/
public boolean isUseNativeInterface() {
return useNativeInterface;
}
/** /**
* Retrieves the message Id of this message. * Retrieves the message Id of this message.
* *
@ -1153,147 +1094,136 @@ public class MhsMessage {
String timeStamp = timeStampFormat.format(System.currentTimeMillis()); String timeStamp = timeStampFormat.format(System.currentTimeMillis());
System.out.println(timeStamp + ": Message submitted"); System.out.println(timeStamp + ": Message submitted");
if (useNativeInterface) { // Submit the message using the MHS and DWB LinkedList<String> command = new LinkedList<String>();
// native libraries.
try {
messageId = submitMessage();
} catch (MhsSubmitException e) {
resultText = e.toString();
throw new MhsSubmitException(resultText);
}
} else { // Submit the message by constructing a command line and
// execing a new msg_send process
LinkedList<String> command = new LinkedList<String>();
command.add("msg_send"); command.add("msg_send");
command.add("-c" + actionCode); command.add("-c" + actionCode);
String addrStr = ""; String addrStr = "";
String ackAddrStr = ""; String ackAddrStr = "";
String encList = ""; String encList = "";
for (int i = 0; i < addressees.getCount(); i++) { for (int i = 0; i < addressees.getCount(); i++) {
Addressee addr = addressees.get(i); Addressee addr = addressees.get(i);
if (addr.isAckRequired()) { if (addr.isAckRequired()) {
if (ackAddrStr.isEmpty()) { if (ackAddrStr.isEmpty()) {
ackAddrStr = addr.getAddress(); ackAddrStr = addr.getAddress();
} else {
ackAddrStr += "," + addr.getAddress();
}
} else { } else {
if (addrStr.isEmpty()) { ackAddrStr += "," + addr.getAddress();
addrStr = addr.getAddress();
} else {
addrStr += "," + addr.getAddress();
}
} }
} } else {
if (addrStr.isEmpty()) {
if (!addrStr.isEmpty()) { addrStr = addr.getAddress();
command.add("-a" + addrStr);
}
if (!ackAddrStr.isEmpty()) {
command.add("-A" + ackAddrStr);
}
if (retryCount != 0) {
command.add("-R" + retryCount);
}
for (int i = 0; i < enclosures.getCount(); i++) {
Enclosure enc = enclosures.get(i);
if (encList.isEmpty()) {
encList = enc.getEnclosureName();
} else { } else {
encList += "," + enc.getEnclosureName(); addrStr += "," + addr.getAddress();
}
}
if (!encList.isEmpty()) {
command.add("-e" + encList);
}
if (!timeoutTimeString.isEmpty()) {
command.add("-T" + timeoutTimeString);
}
if (!validTimeString.isEmpty()) {
command.add("-v" + validTimeString);
}
if (!bodyFile.isEmpty()) {
command.add("-b" + bodyFile);
}
if (!productId.isEmpty()) {
command.add("-i" + productId);
}
if (!subject.isEmpty()) {
command.add("-s" + subject);
}
if (priority != MhsMessagePriority.Default) {
command.add("-p" + priority.value());
}
if (type != MhsMessageType.Routine) {
command.add("-t" + type.text());
}
if (verifyAddressees) {
command.add("-C");
}
if (showTrace) {
System.out.print("Executing command: ");
for (int i = 0; i < command.size(); i++) {
System.out.print(command.get(i) + " ");
}
System.out.println();
}
Process proc = null;
try {
ProcessBuilder procDesc = new ProcessBuilder(command);
procDesc.redirectErrorStream(true);
proc = procDesc.start();
InputStream stdout = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(stdout);
BufferedReader br = new BufferedReader(isr);
String outp;
while ((outp = br.readLine()) != null) {
if (outp.length() > 0) {
// System.out.println(outp);
messageId = outp;
}
}
// System.out.println(line);
int exitVal = proc.waitFor();
if (exitVal != 0) {
// System.out.println("Abnormal exit code " + exitVal);
// resultText = messageId;
throw new MhsSubmitException(messageId);
}
if (showTrace) {
System.out
.println("Message successfully submitted. Message ID: "
+ messageId);
}
} catch (Throwable t) {
resultText = t.getMessage();
// System.out.println("Exception thrown: " + resultText);
throw new MhsSubmitException(resultText);
} finally {
// DR #10955
if (proc != null) {
proc.destroy();
} }
} }
} }
if (!addrStr.isEmpty()) {
command.add("-a" + addrStr);
}
if (!ackAddrStr.isEmpty()) {
command.add("-A" + ackAddrStr);
}
if (retryCount != 0) {
command.add("-R" + retryCount);
}
for (int i = 0; i < enclosures.getCount(); i++) {
Enclosure enc = enclosures.get(i);
if (encList.isEmpty()) {
encList = enc.getEnclosureName();
} else {
encList += "," + enc.getEnclosureName();
}
}
if (!encList.isEmpty()) {
command.add("-e" + encList);
}
if (!timeoutTimeString.isEmpty()) {
command.add("-T" + timeoutTimeString);
}
if (!validTimeString.isEmpty()) {
command.add("-v" + validTimeString);
}
if (!bodyFile.isEmpty()) {
command.add("-b" + bodyFile);
}
if (!productId.isEmpty()) {
command.add("-i" + productId);
}
if (!subject.isEmpty()) {
command.add("-s" + subject);
}
if (priority != MhsMessagePriority.Default) {
command.add("-p" + priority.value());
}
if (type != MhsMessageType.Routine) {
command.add("-t" + type.text());
}
if (verifyAddressees) {
command.add("-C");
}
if (showTrace) {
System.out.print("Executing command: ");
for (int i = 0; i < command.size(); i++) {
System.out.print(command.get(i) + " ");
}
System.out.println();
}
Process proc = null;
try {
ProcessBuilder procDesc = new ProcessBuilder(command);
procDesc.redirectErrorStream(true);
proc = procDesc.start();
InputStream stdout = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(stdout);
BufferedReader br = new BufferedReader(isr);
String outp;
while ((outp = br.readLine()) != null) {
if (outp.length() > 0) {
// System.out.println(outp);
messageId = outp;
}
}
// System.out.println(line);
int exitVal = proc.waitFor();
if (exitVal != 0) {
// System.out.println("Abnormal exit code " + exitVal);
// resultText = messageId;
throw new MhsSubmitException(messageId);
}
if (showTrace) {
System.out.println("Message successfully submitted. Message ID: "
+ messageId);
}
} catch (Throwable t) {
resultText = t.getMessage();
// System.out.println("Exception thrown: " + resultText);
throw new MhsSubmitException(resultText);
} finally {
// DR #10955
if (proc != null) {
proc.destroy();
}
}
return messageId; return messageId;
} }
} }

View file

@ -26,6 +26,7 @@ import com.vividsolutions.jts.geom.prep.PreparedGeometry;
* ------------ ---------- ----------- -------------------------- * ------------ ---------- ----------- --------------------------
* Nov 15, 2010 mschenke Initial creation * Nov 15, 2010 mschenke Initial creation
* Apr 28, 2013 1955 jsanchez Added an ignoreUserData flag to intersection method. * Apr 28, 2013 1955 jsanchez Added an ignoreUserData flag to intersection method.
* Oct 01, 2013 DR 16632 Qinglu Lin Catch exceptions thrown by intersection().
* *
* </pre> * </pre>
* *
@ -120,8 +121,13 @@ public class GeometryUtil {
if (g1Name == null || g2Name == null || g2Name.equals(g1Name) if (g1Name == null || g2Name == null || g2Name.equals(g1Name)
|| ignoreUserData) { || ignoreUserData) {
Geometry section = g1.intersection(g2); Geometry section = null;
if (section.isEmpty() == false) { try {
section = g1.intersection(g2);
} catch (Exception e) {
; //continue;
}
if (section != null && section.isEmpty() == false) {
if (g2.getUserData() != null) { if (g2.getUserData() != null) {
if (section instanceof GeometryCollection) { if (section instanceof GeometryCollection) {
for (int n = 0; n < section.getNumGeometries(); ++n) { for (int n = 0; n < section.getNumGeometries(); ++n) {

View file

@ -24,20 +24,21 @@ import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
/** /**
* Encapsulates the query parameters for a database query * Encapsulates the query parameters for a database query.
* *
* <pre> * <pre>
* SOFTWARE HISTORY * SOFTWARE HISTORY
* Date Ticket# Engineer Description * Date Ticket# Engineer Description
* ------------ ---------- ----------- -------------------------- * ------------ ---------- ----------- --------------------------
* 05/29/08 #875 bphillip Initial Creation * May 29, 2008 875 bphillip Initial Creation
* Oct 07, 2013 2392 rjpeter Updated to auto handle passing a null value to an equal operand.
* </pre> * </pre>
* *
* @author bphillip * @author bphillip
* @version 1.0 * @version 1.0
*/ */
public class QueryParam { public class QueryParam {
/** Enumeration containing the logic operands */ /** Enumeration containing the logic operands */
public enum QueryOperand { public enum QueryOperand {
EQUALS, NOTEQUALS, LESSTHAN, LESSTHANEQUALS, GREATERTHAN, GREATERTHANEQUALS, IN, LIKE, ILIKE, BETWEEN, ISNULL, ISNOTNULL EQUALS, NOTEQUALS, LESSTHAN, LESSTHANEQUALS, GREATERTHAN, GREATERTHANEQUALS, IN, LIKE, ILIKE, BETWEEN, ISNULL, ISNOTNULL
@ -71,11 +72,12 @@ public class QueryParam {
/** The query operand */ /** The query operand */
private String operand = "="; private String operand = "=";
private String className; private String className;
/** /**
* Creates a new QueryParam. Operand defaults to equals * Creates a new QueryParam. Operand defaults to equals, unless value is
* null, then operand is isNull.
* *
* @param field * @param field
* The field * The field
@ -83,12 +85,12 @@ public class QueryParam {
* The value * The value
*/ */
public QueryParam(String field, Object value) { public QueryParam(String field, Object value) {
this.field = field; this(field, value, "=", null);
this.value = value;
} }
/** /**
* Creates a new QueryParam. * Creates a new QueryParam. If value is null and operand is =, operand is
* updated to isNull.
* *
* @param field * @param field
* The field * The field
@ -98,31 +100,66 @@ public class QueryParam {
* The operand * The operand
*/ */
public QueryParam(String field, Object value, String operand) { public QueryParam(String field, Object value, String operand) {
this.field = field; this(field, value, operand, null);
this.value = value;
this.operand = operand;
} }
public QueryParam(String field, Object value, String operand,String className) { /**
* Creates a new QueryParam. If value is null and operand is =, operand is
* updated to isNull.
*
* @param field
* @param value
* @param operand
* @param className
*/
public QueryParam(String field, Object value, String operand,
String className) {
this.field = field; this.field = field;
this.value = value; this.value = value;
this.operand = operand;
if (value == null && "=".equals(operand)) {
this.operand = "isNull";
} else {
this.operand = operand;
}
this.className = className; this.className = className;
} }
/**
* Creates a new QueryParam. If value is null and operand is =, operand is
* updated to isNull.
*
* @param field
* @param value
* @param operand
*/
public QueryParam(String field, Object value, QueryOperand operand) { public QueryParam(String field, Object value, QueryOperand operand) {
this.field = field; this(field, value, operand, null);
this.value = value;
this.operand = QueryParam.reverseTranslateOperand(operand);
} }
public QueryParam(String field, Object value, QueryOperand operand,String className) { /**
* Creates a new QueryParam. If value is null and operand is =, operand is
* updated to isNull.
*
* @param field
* @param value
* @param operand
* @param className
*/
public QueryParam(String field, Object value, QueryOperand operand,
String className) {
this.field = field; this.field = field;
this.value = value; this.value = value;
this.operand = QueryParam.reverseTranslateOperand(operand);
if (value == null && QueryOperand.EQUALS.equals(operand)) {
this.operand = "isNull";
} else {
this.operand = QueryParam.reverseTranslateOperand(operand);
}
this.className = className; this.className = className;
} }
/** /**
* Translates the string representation of an operand to the enumeration * Translates the string representation of an operand to the enumeration
@ -147,6 +184,7 @@ public class QueryParam {
return "="; return "=";
} }
@Override
public String toString() { public String toString() {
return new StringBuffer().append(field).append(" ") return new StringBuffer().append(field).append(" ")
.append(this.operand).append(" ").append(this.value).toString(); .append(this.operand).append(" ").append(this.value).toString();

View file

@ -112,7 +112,7 @@ import com.raytheon.uf.edex.database.query.DatabaseQuery;
* May 07, 2013 1869 bsteffen Remove dataURI column from * May 07, 2013 1869 bsteffen Remove dataURI column from
* PluginDataObject. * PluginDataObject.
* May 16, 2013 1869 bsteffen Rewrite dataURI property mappings. * May 16, 2013 1869 bsteffen Rewrite dataURI property mappings.
* * Oct 07, 2013 2392 rjpeter Updated to pass null productKeys as actual null instead of string null.
* </pre> * </pre>
* *
* @author bphillip * @author bphillip
@ -1234,7 +1234,11 @@ public abstract class PluginDao extends CoreDao {
int index = 0; int index = 0;
for (Object obj : results) { for (Object obj : results) {
distinctValues[index] = new String[1]; distinctValues[index] = new String[1];
distinctValues[index++][0] = String.valueOf(obj); if (obj != null) {
distinctValues[index++][0] = String.valueOf(obj);
} else {
distinctValues[index++][0] = null;
}
} }
} else { } else {
List<Object[]> results = (List<Object[]>) this List<Object[]> results = (List<Object[]>) this
@ -1247,7 +1251,12 @@ public abstract class PluginDao extends CoreDao {
int cIndex = 0; int cIndex = 0;
for (Object obj : result) { for (Object obj : result) {
distinctValues[rIndex][cIndex++] = String.valueOf(obj); if (obj != null) {
distinctValues[rIndex][cIndex++] = String
.valueOf(obj);
} else {
distinctValues[rIndex][cIndex++] = null;
}
} }
rIndex++; rIndex++;

View file

View file

View file

View file

View file

View file

View file

View file

Some files were not shown because too many files have changed in this diff Show more