diff --git a/cave/build/static/common/cave/etc/gfe/userPython/procedures/MakeHazard.py b/cave/build/static/common/cave/etc/gfe/userPython/procedures/MakeHazard.py index 9b41e7087d..33e8e1eb08 100644 --- a/cave/build/static/common/cave/etc/gfe/userPython/procedures/MakeHazard.py +++ b/cave/build/static/common/cave/etc/gfe/userPython/procedures/MakeHazard.py @@ -11,6 +11,7 @@ # Apr 03,2012 436 randerso Converted to Python procedure to allow some # level of site customization # Apr 09,2012 436 randerso Merged RNK's MakeHazards_Elevation procedure +# Feb 12,2014 17058 ryu Extend converter for Collections$EmptyList objects. # # Author: randerso # ---------------------------------------------------------------------------- @@ -307,6 +308,8 @@ def converter(obj): objtype = obj.jclassname if objtype == "java.util.Date": retVal = AbsTime.AbsTime(obj) + elif objtype == "java.util.Collections$EmptyList": + retVal = [] elif objtype == "com.raytheon.uf.common.time.TimeRange": retVal = TimeRange.TimeRange(obj) return retVal diff --git a/cave/build/static/common/cave/etc/gfe/userPython/textUtilities/headline/TextFormatter.py b/cave/build/static/common/cave/etc/gfe/userPython/textUtilities/headline/TextFormatter.py index 80ed152ac4..d79a243c9a 100644 --- a/cave/build/static/common/cave/etc/gfe/userPython/textUtilities/headline/TextFormatter.py +++ b/cave/build/static/common/cave/etc/gfe/userPython/textUtilities/headline/TextFormatter.py @@ -1,19 +1,19 @@ ## # This software was developed and / or modified by Raytheon Company, -# pursuant to Contract DG133W-05-CQ-1067 with the US Government. -# -# U.S. EXPORT CONTROLLED TECHNICAL DATA +# pursuant to Contract DG133W-05-CQ-1067 with the US Government. +# +# U.S. EXPORT CONTROLLED TECHNICAL DATA # This software product contains export-restricted data whose # export/transfer/disclosure is restricted by U.S. law. Dissemination # to non-U.S. persons whether in the United States or abroad requires # an export license or other authorization. -# -# Contractor Name: Raytheon Company -# Contractor Address: 6825 Pine Street, Suite 340 -# Mail Stop B8 -# Omaha, NE 68106 -# 402.291.0100 -# +# +# Contractor Name: Raytheon Company +# Contractor Address: 6825 Pine Street, Suite 340 +# Mail Stop B8 +# Omaha, NE 68106 +# 402.291.0100 +# # See the AWIPS II Master Rights File ("Master Rights File.pdf") for # further licensing information. ## @@ -27,16 +27,25 @@ # # Author: hansen # ---------------------------------------------------------------------------- +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 02/12/2014 #2591 randerso Added retry when loading combinations fails import string, getopt, sys, time, os, types, math import ModuleAccessor import Utility, logging, traceback +import AbsTime from java.lang import ThreadDeath from com.raytheon.uf.common.dataplugin.gfe.reference import ReferenceID, ReferenceData GridLoc = None LatLonIds = [] +MAX_TRIES = 2 + # If someone imports TextFormatter and needs this instance # they should either be fixed to use the IFPImporter module # or turn this line on (which is a kludge but should make @@ -44,19 +53,19 @@ LatLonIds = [] #IFPImporter = IFPImporter.IFPImporter class TextFormatter: - def __init__(self, dataManager): + def __init__(self, dataManager): # Variable for unique combinations self.__comboNumber = -1 self.dataMgr = dataManager self.log = logging.getLogger("FormatterRunner.TextFormatter.TextFormatter") pass - + # def __del__(self): # for i in LatLonIds: # self.dataMgr.getRefManager().deleteRefSet(i, False) def getForecast(self, fcstName, argDict): - " Create the forecast " + " Create the forecast " ForecastNarrative = argDict["ForecastNarrative"] ForecastTable = argDict["ForecastTable"] @@ -71,7 +80,7 @@ class TextFormatter: argDict["getForecast"] = self.getForecast argDict["getFcstDef"] = self.getFcstDef argDict["dataMgr"] = self.dataMgr - self.__ut = argDict["utility"] + self.__ut = argDict["utility"] # Get the Forecast Definition and type from the server #print "finding", fcstName @@ -79,11 +88,11 @@ class TextFormatter: #print "found ", found if found == 0: text = "Text Product Definition Not Found: " + fcstName + " " + \ - traceback.format_exc() + traceback.format_exc() self.log.error("Text Product Definition Not Found: Caught Exception: " + fcstName, exc_info=True) raise Exception, text forecastDef = argDict["forecastDef"] - fcstType = self.__ut.set(forecastDef,"type",None) + fcstType = self.__ut.set(forecastDef, "type", None) argDict["fcstType"] = fcstType if fcstType is None: text = "Text Product Type Not Found: " + fcstName + " " + \ @@ -101,16 +110,16 @@ class TextFormatter: # Must have at least one edit area and time range specified if fcstType != "smart" and fcstType != "component": if argDict["editAreas"] == []: - text= "No Edit Areas Specified over which to generate product." - text=text+'\nTry setting "defaultEditAreas" in the product Definition' - text=text+'\nOr, if running from the command line, add a -r flag.' + text = "No Edit Areas Specified over which to generate product." + text = text + '\nTry setting "defaultEditAreas" in the product Definition' + text = text + '\nOr, if running from the command line, add a -r flag.' text = text + '\n' + string.join(traceback.format_exc()) self.log.error("Caught Exception: " + text) raise Exception, text if argDict["rawRanges"] == []: - text= "No Time Ranges Specified over which to generate product." - text=text+'\nTry setting "defaultRanges" in the product Definition' - text=text+'\nOr, if running from the command line, add a -w flag.' + text = "No Time Ranges Specified over which to generate product." + text = text + '\nTry setting "defaultRanges" in the product Definition' + text = text + '\nOr, if running from the command line, add a -w flag.' text = text + '\n' + string.join(traceback.format_exc()) self.log.error("Caught Exception: " + text) raise Exception, text @@ -153,7 +162,7 @@ class TextFormatter: argDict["module"] = module product.setUp("T", argDict) product._argDict = argDict - + try: text = product.generateForecast(argDict) except RuntimeError, e: @@ -166,11 +175,11 @@ class TextFormatter: # requirement for TEST phrasing for TEST products if argDict.get('testMode', 0): - testMsg = "\nTHIS IS A TEST MESSAGE. DO NOT TAKE ACTION" +\ + testMsg = "\nTHIS IS A TEST MESSAGE. DO NOT TAKE ACTION" + \ " BASED ON THIS TEST\nMESSAGE.\n" #split by "$$" segs = text.split('\n$$') - for i in xrange(len(segs)-1): #never the last one + for i in xrange(len(segs) - 1): #never the last one if text.find(testMsg) == -1: #not found, add it in segs[i] = segs[i] + testMsg text = '\n$$'.join(segs) #put text back together again @@ -185,7 +194,7 @@ class TextFormatter: if not forecastDef.get('lowerCase', 0): text = text.upper() else: - text="Text Product Type Invalid "+\ + text = "Text Product Type Invalid " + \ "(must be 'table', 'component' or 'narrative'): ", fcstName, type text = text + '\n' + string.join(traceback.format_exc()) self.log.error("Caught Exception: " + text) @@ -196,18 +205,18 @@ class TextFormatter: def __createNarrativeDef(self, fcstName, timeRange): return { "methodList": [self.assembleChildWords], - "narrativeDef": [(fcstName, timeRange.duration()/3600)], + "narrativeDef": [(fcstName, timeRange.duration() / 3600)], } def __loop(self, argDict, forecast, forecastDef): # Loop through product by edit areas and time ranges - begText = self.__ut.set(forecastDef,"beginningText","") - endText = self.__ut.set(forecastDef,"endingText","") - editAreaLoopBegText = self.__ut.set(forecastDef,"editAreaLoopBegText","") - timeRangeLoopBegText = self.__ut.set(forecastDef,"timeRangeLoopBegText","") - editAreaLoopEndText = self.__ut.set(forecastDef,"editAreaLoopEndText","") - timeRangeLoopEndText = self.__ut.set(forecastDef,"timeRangeLoopEndText","") + begText = self.__ut.set(forecastDef, "beginningText", "") + endText = self.__ut.set(forecastDef, "endingText", "") + editAreaLoopBegText = self.__ut.set(forecastDef, "editAreaLoopBegText", "") + timeRangeLoopBegText = self.__ut.set(forecastDef, "timeRangeLoopBegText", "") + editAreaLoopEndText = self.__ut.set(forecastDef, "editAreaLoopEndText", "") + timeRangeLoopEndText = self.__ut.set(forecastDef, "timeRangeLoopEndText", "") outerLoop = self.__ut.set(forecastDef, "outerLoop", "EditArea") editAreas = argDict["editAreas"] @@ -274,10 +283,10 @@ class TextFormatter: #print "varDict", varDict for item, default in [ - ("language","english"), - ("appendFile",None), - ("lineLength",69), # no command line option - ("timePeriod",3), + ("language", "english"), + ("appendFile", None), + ("lineLength", 69), # no command line option + ("timePeriod", 3), ]: try: # Try the varDict #print "trying varDict", item @@ -362,19 +371,28 @@ class TextFormatter: # (["Zones37","Zones38"], "/37/38"),"/37/38"), # (["Zones57","Zones58","Zones59"],"57/58/59") # ] - - # RWA-05/19/11: added this check here to force Combinations files - # to be reloaded since we removed a similar check from ModuleAccessor - # to preserve the magicCodeChanges. Perhaps we should be doing something - # similar to magicCodeChanges for Combinations files as well. - if sys.modules.has_key(dfEditAreas): - del sys.modules[dfEditAreas] - - accessor = ModuleAccessor.ModuleAccessor() - dfEditAreas = accessor.variable(dfEditAreas, "Combinations") - if dfEditAreas is None: - return "COMBINATION FILE NOT FOUND: " + \ - self.__ut.set(forecastDef, "defaultEditAreas", []) + + comboName = dfEditAreas + for retryCount in xrange(MAX_TRIES): + accessor = ModuleAccessor.ModuleAccessor() + dfEditAreas = accessor.variable(comboName, "Combinations") + if dfEditAreas is None: + if sys.modules.has_key(comboName): + comboMod = sys.modules[comboName] + if comboMod.__file__.endswith(".pyo"): + os.remove(comboMod.__file__) + comboMod = None + del sys.modules[comboName] + + # if not last try, log and try again + if retryCount < MAX_TRIES - 1: + # log but don't pop up + self.log.error("Error loading combinations file: %s, retrying", comboName) + else: + return "COMBINATION FILE NOT FOUND: " + \ + self.__ut.set(forecastDef, "defaultEditAreas", []) + else: + break elif len(dfEditAreas) > 0: refDataList = [] @@ -411,7 +429,7 @@ class TextFormatter: filterMethod = product.filterMethod except: allowedHazards = None - + if allowedHazards is not None and allowedHazards != []: # Set up editAreas as a list of combinations # Cases: @@ -440,7 +458,7 @@ class TextFormatter: "AreaDictionary") editAreas = self._separateByTimeZone(editAreas, areaDictName, argDict['creationTime'], - effectiveTZ = separateByTZ) + effectiveTZ=separateByTZ) accurateCities = product.Definition.get('accurateCities', 0) cityRefData = [] @@ -464,7 +482,7 @@ class TextFormatter: "contain entry for edit area: " self.log.error(msg + `ean`) continue - + for city, llrec in citydict[ean].iteritems(): # Create a referenceData given lat, lon, dim area = (llrec[0], llrec[1], 0) @@ -490,8 +508,8 @@ class TextFormatter: filterMethod, argDict["databaseID"], stationID4, argDict["vtecActiveTable"], argDict["vtecMode"], sampleThreshold, creationTime=argDict["creationTime"], dataMgr=self.dataMgr, - accurateCities=accurateCities, - cityEditAreas=cityRefData) + accurateCities=accurateCities, + cityEditAreas=cityRefData) # Store hazards object for later use argDict["hazards"] = hazards @@ -540,7 +558,7 @@ class TextFormatter: except: trName = "" if tr is not None: - rawRanges.append((tr,trName)) + rawRanges.append((tr, trName)) elif len(dfRanges) == 0: pass else: @@ -548,13 +566,13 @@ class TextFormatter: forecast = TimeRangeUtils.TimeRangeUtils() for rangeName in dfRanges: rawRange = forecast.getTimeRange(rangeName, argDict) - rawRanges.append((rawRange,rangeName)) + rawRanges.append((rawRange, rangeName)) argDict["rawRanges"] = rawRanges #print "rawRanges", rawRanges # Row Label - areaType = self.__ut.set(forecastDef,"areaType","") - rowVariable = self.__ut.set(forecastDef,"rowVariable","EditArea") + areaType = self.__ut.set(forecastDef, "areaType", "") + rowVariable = self.__ut.set(forecastDef, "rowVariable", "EditArea") if rowVariable == "EditArea": rowLabel = areaType elif rowVariable == "WeatherElement": @@ -566,7 +584,7 @@ class TextFormatter: def __pairAreaWithLabel(self, chosenAreas, defaultEditAreas): # Pair the chosen edit areas with associated labels from # default list and return new list - dfEditAreas= [] + dfEditAreas = [] for area in chosenAreas: for name, label in defaultEditAreas: if area == name: @@ -620,8 +638,8 @@ class TextFormatter: def __getLatLonAreaName(self, latLonTuple): lat, lon, dim = latLonTuple name = "Ref" + '%s%s%s' % (lat, lon, dim) - name = name.replace(".","") - name = name.replace("-","") + name = name.replace(".", "") + name = name.replace("-", "") return name def getCombinations(self, combinations, argDict): @@ -635,7 +653,7 @@ class TextFormatter: newArea = self.getEditArea(editArea, argDict) if comboList.index(editArea) == 0: comboNumber = self.getComboNumber() - label = "Combo"+`comboNumber` + label = "Combo" + `comboNumber` refId = ReferenceID(label) #global GridLoc #GridLoc = newArea.getGloc() @@ -680,7 +698,7 @@ class TextFormatter: try: product = argDict["self"] - exec "fcstDef = product."+fcstName+"()" + exec "fcstDef = product." + fcstName + "()" module = argDict["module"] except: # See if fcstName is variable in imported modules e.g. MyTable = {} @@ -699,7 +717,7 @@ class TextFormatter: try: # Look for fcstName = {} # This can be removed eventually - exec "fcstDef = module."+fcstName + exec "fcstDef = module." + fcstName except: try: # Try to instantiate smart text product class @@ -750,7 +768,7 @@ class TextFormatter: def getEditArea(self, editAreaName, argDict): # Returns an AFPS.ReferenceData object given an edit area name - # as defined in the GFE + # as defined in the GFE # Apply suffix if appropriate refID = ReferenceID(editAreaName) #print "Getting edit area" @@ -779,7 +797,7 @@ class TextFormatter: return tmp def _separateByTimeZone(self, editAreaGroups, areaDictName, creationTime, - effectiveTZ = "effectiveTZ"): + effectiveTZ="effectiveTZ"): #takes the list of areas, and based on the time zones breaks #them up to ensure that each grouping using the same time zone. #areaDictName is name of the area dictionary. creationTime is the @@ -817,7 +835,7 @@ class TextFormatter: zoneTZ = localTZ tzid = localTZid #print "falling back to WFOtz: ", zoneTZ - self.log.warning("WARNING: Entry " + area + + self.log.warning("WARNING: Entry " + area + " missing from AreaDictionary. Using default time zone.") zones = tzDir.get(zoneTZ, []) @@ -835,7 +853,7 @@ class TextFormatter: elif effectiveTZ == "actualTZ": dict = tzDir else: - self.log.error("Invalid effectiveTZ for separateByTZ() " + + self.log.error("Invalid effectiveTZ for separateByTZ() " + effectiveTZ) return editAreaGroups keys = dict.keys() @@ -850,39 +868,39 @@ class TextFormatter: ################################################################# def makeSquare(lat, lon, km): " Make a list of square of given km around lat,lon" - latinc = km/222.0 - loninc = math.cos(lat/57.17) * km / 222.0 + latinc = km / 222.0 + loninc = math.cos(lat / 57.17) * km / 222.0 latTop = lat + latinc - latBottom =lat - latinc + latBottom = lat - latinc lonLeft = lon - loninc lonRight = lon + loninc points = [] - points.append(`latTop`+","+ `lonRight`) - points.append(`latTop`+","+ `lonLeft`) - points.append(`latBottom`+","+ `lonLeft`) - points.append(`latBottom`+","+`lonRight`) + points.append(`latTop` + "," + `lonRight`) + points.append(`latTop` + "," + `lonLeft`) + points.append(`latBottom` + "," + `lonLeft`) + points.append(`latBottom` + "," + `lonRight`) return points def makePoint(point): " Make a CartCoord2D from the point in format: x,y" from com.vividsolutions.jts.geom import Coordinate - ind = string.find(point,",") - latStr = point[0:ind-1] - lonStr = point[ind+1:len(point)] + ind = string.find(point, ",") + latStr = point[0:ind - 1] + lonStr = point[ind + 1:len(point)] lat = float(latStr) - lon = float(lonStr) - return Coordinate(lon,lat) + lon = float(lonStr) + return Coordinate(lon, lat) def makeArea(gridLoc, pointList, refname=None): " Make a Reference Area with a unique ReferenceID" from com.vividsolutions.jts.geom import GeometryFactory, LinearRing, Coordinate, Polygon - from com.raytheon.uf.common.dataplugin.gfe.reference import ReferenceData_CoordinateType as CoordinateType + from com.raytheon.uf.common.dataplugin.gfe.reference import ReferenceData_CoordinateType as CoordinateType geomFactory = GeometryFactory() import jep size = len(pointList) - if pointList[0] != pointList[size-1]: # closing the loop + if pointList[0] != pointList[size - 1]: # closing the loop pointList.append(pointList[0]) pointArray = jep.jarray(len(pointList), Coordinate) for i in range(len(pointList)): @@ -893,7 +911,7 @@ def makeArea(gridLoc, pointList, refname=None): polyArray[0] = poly region = geomFactory.createMultiPolygon(polyArray) if refname is None: - refname = "Ref" + getTime() + refname = "Ref" + getTime() refId = ReferenceID(refname) refData = ReferenceData(gridLoc, refId, region, CoordinateType.LATLON) # randerso: I don't think this is necessary @@ -913,8 +931,8 @@ def storeReferenceData(refSetMgr, refData, temp=True): def getTime(): "Return an ascii string for the current time without spaces or :'s" - timeStr = `time.time()` - timeStr = string.replace(timeStr,".","_") + timeStr = `time.time()` + timeStr = string.replace(timeStr, ".", "_") return timeStr def getAbsTime(timeStr): @@ -926,7 +944,7 @@ def getAbsTime(timeStr): hour = string.atoi(timeStr[9:11]) minute = string.atoi(timeStr[11:13]) - return AFPSSup.AbsTimeYMD(year,month,day,hour,minute) + return AbsTime.absTimeYMD(year, month, day, hour, minute) def usage(): print """ diff --git a/cave/build/static/linux/cave/caveUtil.sh b/cave/build/static/linux/cave/caveUtil.sh index 0930433efe..b15bf1c132 100644 --- a/cave/build/static/linux/cave/caveUtil.sh +++ b/cave/build/static/linux/cave/caveUtil.sh @@ -294,7 +294,7 @@ function logExitStatus() hostPath="$basePath/$hostName/" mkdir -p $hostPath if [ -d "$hostPath" ]; then - cp $coreFile $hostPath + mv $coreFile $hostPath fi fi } diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/notification/jobs/NotificationManagerJob.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/notification/jobs/NotificationManagerJob.java index 09e372328f..e56ef77af2 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/notification/jobs/NotificationManagerJob.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/notification/jobs/NotificationManagerJob.java @@ -70,7 +70,8 @@ import com.raytheon.uf.viz.core.notification.NotificationMessage; * 05/08/08 1127 randerso Initial Creation * 09/03/08 1448 chammack Refactored notification observer interface * 04/23/13 1939 randerso Add separate connect method to allow application - * to complete initialization before connecting to JMS + * to complete initialization before connecting to JMS. + * 10/15/2013 2389 rjpeter Updated synchronization to remove session leaks. * * * @author randerso @@ -107,9 +108,10 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + result = (prime * result) + ((queryString == null) ? 0 : queryString.hashCode()); - result = prime * result + ((topic == null) ? 0 : topic.hashCode()); + result = (prime * result) + + ((topic == null) ? 0 : topic.hashCode()); return result; } @@ -156,11 +158,11 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable { private static NotificationManagerJob instance; /** The observer map of topic to listeners */ - protected Map listeners; + protected final Map listeners; private Connection connection; - private boolean connected = false; + private volatile boolean connected = false; /** * Get the active subscription manager job. If one does not exist, start an @@ -191,18 +193,29 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable { protected void connect(boolean notifyError) { boolean successful = true; - try { - ConnectionFactory connectionFactory = JMSConnection.getInstance() - .getFactory(); - disconnect(notifyError); + synchronized (this) { + try { + ConnectionFactory connectionFactory = JMSConnection + .getInstance().getFactory(); + disconnect(notifyError); - // Create a Connection - connection = connectionFactory.createConnection(); - connection.setExceptionListener(this); - // connection.setClientID(VizApp.getWsId().toString()); + // Create a Connection + connection = connectionFactory.createConnection(); + connection.setExceptionListener(this); + // connection.setClientID(VizApp.getWsId().toString()); - connection.start(); - connected = true; + connection.start(); + connected = true; + } catch (JMSException e) { + if (notifyError) { + statusHandler.handle(Priority.SIGNIFICANT, + "NotificationManager failed to connect.", e); + } + successful = false; + } + } + + synchronized (listeners) { for (NotificationListener listener : listeners.values()) { try { listener.setupConnection(this); @@ -216,12 +229,6 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable { } } } - } catch (JMSException e) { - if (notifyError) { - statusHandler.handle(Priority.SIGNIFICANT, - "NotificationManager failed to connect.", e); - } - successful = false; } if (!successful) { @@ -229,7 +236,22 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable { } } - protected void disconnect(boolean notifyError) { + /** + * Creates a new AUTO_ACKNOWLEDGE session if connected to JMS, otherwise + * returns null. + * + * @return + * @throws JMSException + */ + protected synchronized Session createSession() throws JMSException { + if (connected) { + return connection.createSession(false, Session.AUTO_ACKNOWLEDGE); + } else { + return null; + } + } + + protected synchronized void disconnect(boolean notifyError) { if (connection != null) { try { connection.stop(); @@ -271,9 +293,11 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable { new Timer().schedule(task, 5 * 1000); } - // Reset connected bool - for (NotificationListener listener : listeners.values()) { - listener.connected = false; + synchronized (listeners) { + // disconnect listeners + for (NotificationListener listener : listeners.values()) { + listener.disconnect(); + } } if (e != null) { @@ -282,33 +306,38 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable { } } - public static synchronized void addQueueObserver(String queue, - INotificationObserver obs) { + public static void addQueueObserver(String queue, INotificationObserver obs) { addQueueObserver(queue, obs, null); } - public static synchronized void addQueueObserver(String queue, + public static void addQueueObserver(String queue, INotificationObserver obs, String queryString) { NotificationManagerJob notifMgr = getInstance(); ListenerKey key = new ListenerKey(queue, queryString); - NotificationListener listener = notifMgr.listeners.get(key); - if (listener == null || listener.consumer == null) { - try { - listener = new NotificationListener(queue, queryString, - Type.QUEUE); - notifMgr.listeners.put(key, listener); - listener.addObserver(obs); - if (notifMgr.connected) { - listener.setupConnection(notifMgr); + + synchronized (notifMgr.listeners) { + NotificationListener listener = notifMgr.listeners.get(key); + if (listener == null) { + try { + listener = new NotificationListener(queue, queryString, + Type.QUEUE); + notifMgr.listeners.put(key, listener); + listener.addObserver(obs); + if (notifMgr.connected) { + listener.setupConnection(notifMgr); + } + } catch (JMSException e) { + Status s = new Status( + IStatus.ERROR, + Activator.PLUGIN_ID, + 0, + "NotificationManager failed to create queue consumer.", + e); + StatusManager.getManager().handle(s); } - } catch (JMSException e) { - Status s = new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0, - "NotificationManager failed to create queue consumer.", - e); - StatusManager.getManager().handle(s); + } else { + listener.addObserver(obs); } - } else { - listener.addObserver(obs); } } @@ -320,32 +349,35 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable { * @param obs * the alert observer callback */ - public static synchronized void addObserver(String topic, - INotificationObserver obs) { + public static void addObserver(String topic, INotificationObserver obs) { addObserver(topic, obs, null); } - public static synchronized void addObserver(String topic, - INotificationObserver obs, String queryString) { + public static void addObserver(String topic, INotificationObserver obs, + String queryString) { NotificationManagerJob notifMgr = getInstance(); ListenerKey key = new ListenerKey(topic, queryString); - NotificationListener listener = notifMgr.listeners.get(key); - if (listener == null) { - try { - listener = new NotificationListener(topic, queryString, - Type.TOPIC); - notifMgr.listeners.put(key, listener); - listener.addObserver(obs); - if (notifMgr.connected) { - listener.setupConnection(notifMgr); + + synchronized (notifMgr.listeners) { + NotificationListener listener = notifMgr.listeners.get(key); + if (listener == null) { + try { + listener = new NotificationListener(topic, queryString, + Type.TOPIC); + notifMgr.listeners.put(key, listener); + listener.addObserver(obs); + if (notifMgr.connected) { + listener.setupConnection(notifMgr); + } + } catch (JMSException e) { + Status s = new Status(IStatus.ERROR, Activator.PLUGIN_ID, + 0, + "NotificationManager failed to create consumer.", e); + StatusManager.getManager().handle(s); } - } catch (JMSException e) { - Status s = new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0, - "NotificationManager failed to create consumer.", e); - StatusManager.getManager().handle(s); + } else { + listener.addObserver(obs); } - } else { - listener.addObserver(obs); } } @@ -358,8 +390,7 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable { * @param obs * the observer to remove */ - public static synchronized void removeObserver(String topic, - INotificationObserver obs) { + public static void removeObserver(String topic, INotificationObserver obs) { removeObserver(topic, obs, null); } @@ -373,18 +404,20 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable { * the observer to remove * @param queryString */ - public static synchronized void removeObserver(String topic, - INotificationObserver obs, String queryString) { + public static void removeObserver(String topic, INotificationObserver obs, + String queryString) { NotificationManagerJob notifMgr = getInstance(); ListenerKey key = new ListenerKey(topic, queryString); - NotificationListener listener = notifMgr.listeners.get(key); - if (listener == null) { - return; - } - listener.removeObserver(obs); - if (listener.size() <= 0) { - listener.disconnect(); - notifMgr.listeners.remove(key); + synchronized (notifMgr.listeners) { + NotificationListener listener = notifMgr.listeners.get(key); + if (listener == null) { + return; + } + listener.removeObserver(obs); + if (listener.size() <= 0) { + listener.disconnect(); + notifMgr.listeners.remove(key); + } } } @@ -397,18 +430,20 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable { * @param obs * the observer to remove */ - public static synchronized void removeQueueObserver(String queue, - String queryString, INotificationObserver obs) { + public static void removeQueueObserver(String queue, String queryString, + INotificationObserver obs) { NotificationManagerJob notifMgr = getInstance(); ListenerKey key = new ListenerKey(queue, queryString); - NotificationListener listener = notifMgr.listeners.get(key); - if (listener == null) { - return; - } - listener.removeObserver(obs); - if (listener.size() <= 0) { - listener.disconnect(); - notifMgr.listeners.remove(key); + synchronized (notifMgr.listeners) { + NotificationListener listener = notifMgr.listeners.get(key); + if (listener == null) { + return; + } + listener.removeObserver(obs); + if (listener.size() <= 0) { + listener.disconnect(); + notifMgr.listeners.remove(key); + } } } @@ -428,24 +463,22 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable { private static class NotificationListener implements MessageListener { - private Type type; + private final Type type; - private String id; + private final String id; - private String queryString; + private final String queryString; /** The list of interested parties */ - protected List observers; + protected final List observers; /** The map of job threads from observers */ - protected Map jobWrappers; + protected final Map jobWrappers; protected MessageConsumer consumer; protected Session session; - protected boolean connected = false; - public NotificationListener(String id, String queryString, Type type) { this.observers = new ArrayList(); this.jobWrappers = new HashMap(); @@ -466,40 +499,34 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable { break; } } - // If we made it here we are good - connected = true; } - public void disconnect() { - if (connected) { - if (consumer != null) { - try { - consumer.close(); - } catch (JMSException e) { - statusHandler.handle(Priority.PROBLEM, - "Error closing consumer connection", e); - } - consumer = null; + public synchronized void disconnect() { + if (consumer != null) { + try { + consumer.close(); + } catch (JMSException e) { + statusHandler.handle(Priority.PROBLEM, + "Error closing consumer connection", e); } + consumer = null; + } - if (session != null) { - try { - session.close(); - } catch (JMSException e) { - statusHandler.handle(Priority.PROBLEM, - "Error closing session", e); - } - session = null; + if (session != null) { + try { + session.close(); + } catch (JMSException e) { + statusHandler.handle(Priority.PROBLEM, + "Error closing session", e); } - connected = false; + session = null; } } - private void setupQueue(NotificationManagerJob manager) + private synchronized void setupQueue(NotificationManagerJob manager) throws JMSException { disconnect(); - session = manager.connection.createSession(false, - Session.AUTO_ACKNOWLEDGE); + session = manager.createSession(); if (session != null) { String queueName = id; Queue t = session.createQueue(queueName); @@ -510,16 +537,14 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable { consumer = session.createConsumer(t); } - setConsumer(consumer); consumer.setMessageListener(this); } } - private void setupTopic(NotificationManagerJob manager) + private synchronized void setupTopic(NotificationManagerJob manager) throws JMSException { disconnect(); - session = manager.connection.createSession(false, - Session.AUTO_ACKNOWLEDGE); + session = manager.createSession(); if (session != null) { String topicName = id; Topic t = session.createTopic(topicName); @@ -534,10 +559,6 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable { } } - public void setConsumer(MessageConsumer consumer) { - this.consumer = consumer; - } - /* * (non-Javadoc) * @@ -545,48 +566,37 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable { */ @Override public void onMessage(Message msg) { - if (observers == null) { - return; - } - - for (INotificationObserver obs : observers) { - sendToObserver(obs, msg); - } - - // Iterator iterator = jobWrappers.values().iterator(); - // while (iterator.hasNext()) { - // JobWrapper wrapper = iterator.next(); - // if (!wrapper.isEmpty() && wrapper.getState() != Job.RUNNING) { - // wrapper.schedule(); - // } - // } - } - - public synchronized void addObserver(INotificationObserver obs) { - observers.add(obs); - } - - public synchronized void removeObserver(INotificationObserver obs) { - observers.remove(obs); - } - - protected void sendToObserver(INotificationObserver observer, - Message msg) { - // Get the corresponding job, creating the - // wrapper if necessary - JobWrapper wrapper = null; - synchronized (this) { - wrapper = jobWrappers.get(observer); - if (wrapper == null) { - wrapper = new JobWrapper(observer); - jobWrappers.put(observer, wrapper); + synchronized (observers) { + for (INotificationObserver obs : observers) { + // Get the corresponding job, creating the + // wrapper if necessary, really on observers lock for sync + // purposes + JobWrapper wrapper = jobWrappers.get(obs); + if (wrapper == null) { + wrapper = new JobWrapper(obs); + jobWrappers.put(obs, wrapper); + } + wrapper.put(msg); } } - wrapper.put(msg); + } + + public void addObserver(INotificationObserver obs) { + synchronized (observers) { + observers.add(obs); + } + } + + public void removeObserver(INotificationObserver obs) { + synchronized (observers) { + observers.remove(obs); + } } public int size() { - return observers.size(); + synchronized (observers) { + return observers.size(); + } } } @@ -669,7 +679,7 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable { if (messageCount.incrementAndGet() > IN_MEM_MESSAGE_LIMIT) { messageCount.decrementAndGet(); messages.remove(); - if (System.currentTimeMillis() - lastErrorPrintTime > 600000) { + if ((System.currentTimeMillis() - lastErrorPrintTime) > 600000) { final Status s = new Status( Status.ERROR, Activator.PLUGIN_ID, @@ -683,15 +693,6 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable { this.schedule(); } - /** - * Checks if is empty. - * - * @return true, if is empty - */ - public boolean isEmpty() { - return this.messages.isEmpty(); - } - } /* @@ -701,9 +702,12 @@ public class NotificationManagerJob implements ExceptionListener, IDisposable { */ @Override public void dispose() { - for (NotificationListener listener : listeners.values()) { - listener.disconnect(); + synchronized (listeners) { + for (NotificationListener listener : listeners.values()) { + listener.disconnect(); + } + listeners.clear(); } - listeners.clear(); + disconnect(true); } } diff --git a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/editor/TafViewerEditorDlg.java b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/editor/TafViewerEditorDlg.java index 419d1c11df..db32e1ef6a 100644 --- a/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/editor/TafViewerEditorDlg.java +++ b/cave/com.raytheon.viz.aviation/src/com/raytheon/viz/aviation/editor/TafViewerEditorDlg.java @@ -225,6 +225,7 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback; * 11/05/2012 15477 zhao Trim blank lines in text in Editor when check Syntax * 01/09/2013 15528 zhao Modified saveFile() and restoreFile() * 10/24/2013 16478 zhao add syntax check for extra '=' sign + * 02/12/2014 17076 lvenable Mark guidance tabs as not current so they get refreshed * * * @@ -672,6 +673,10 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, populateTafViewer(); // Update the metar and mos guidance in the viewer tab. updateViewerTab(stationName); + + // Mark the tabs as not current so they get updated. + markTabsAsNotCurrent(); + break; case OPEN_RTN: @@ -767,7 +772,19 @@ public class TafViewerEditorDlg extends CaveSWTDialog implements ITafSettable, } } - @Override + + /** + * Mark the tabs as not current so they get refreshed. + */ + private void markTabsAsNotCurrent() { + for (TabItem tbi : guidanceViewerFolder.getItems()) { + if (tbi.getControl() instanceof ViewerTab) { + ((ViewerTab) tbi.getControl()).setDisplayCurrent(false); + } + } + } + + @Override public void clearAll() { if (shell == null) { return; diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/dialogs/FormatterLauncherDialog.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/dialogs/FormatterLauncherDialog.java index 3b008d4387..81761361f2 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/dialogs/FormatterLauncherDialog.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/dialogs/FormatterLauncherDialog.java @@ -28,6 +28,7 @@ import java.util.Set; import java.util.TimeZone; import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MenuAdapter; @@ -97,6 +98,7 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback; * up warnings. * May 15, 2013 1842 dgilling Pass DataManager instance down to sub- * components. + * Feb 12, 2014 2801 randerso Added prompting if formatter is run against non-normal database * * * @@ -106,6 +108,12 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback; public class FormatterLauncherDialog extends CaveJFACEDialog implements IProductTab { + + // formatter data sources. Fcst must be first + private static enum FormatterDataSource { + Fcst, ISC, Official, Default, + } + private final transient IUFStatusHandler statusHandler = UFStatus .getHandler(FormatterLauncherDialog.class); @@ -161,24 +169,9 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements private Image failedImg; /** - * Fcst data source menu item. + * data source menu items */ - private MenuItem fcstMI = null; - - /** - * Official data source menu item. - */ - private MenuItem officialMI = null; - - /** - * ISC data source menu item. - */ - private MenuItem iscMI = null; - - /** - * Default data source menu item. - */ - private MenuItem defaultMI = null; + private java.util.List dataSourceMI; /** * Products menu. @@ -212,8 +205,6 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements private DataManager dataMgr; - private String selectedDataSource = null; - private boolean doClose = false; /** @@ -338,59 +329,47 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements // Get the CAVE operating mode CAVEMode mode = dataMgr.getOpMode(); - // Forecast menu item, set text based on operating mode - fcstMI = new MenuItem(dataSourceMenu, SWT.RADIO); - if (mode.equals(CAVEMode.OPERATIONAL)) { - fcstMI.setText("Fcst"); - } else if (mode.equals(CAVEMode.PRACTICE)) { - fcstMI.setText("Fcst_Prac"); - fcstMI.setSelection(true); - } else { - fcstMI.setText("Fcst_Test"); - fcstMI.setSelection(true); - } - fcstMI.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent event) { - selectedDataSource = dataMgr.getParmManager() - .getMutableDatabase().toString(); + this.dataSourceMI = new ArrayList(); + // create menu items + for (FormatterDataSource source : FormatterDataSource.values()) { + MenuItem item = new MenuItem(dataSourceMenu, SWT.RADIO); + item.setData(source); + this.dataSourceMI.add(item); + String text = source.toString(); + if (source.equals(FormatterDataSource.Fcst)) { + if (mode.equals(CAVEMode.PRACTICE)) { + text += "_Prac"; + } else if (mode.equals(CAVEMode.TEST)) { + text += "_Test"; + } } - }); + item.setText(text); + item.addSelectionListener(new SelectionAdapter() { - // Only show these menu items when in operational mode - if (mode.equals(CAVEMode.OPERATIONAL)) { - // ISC menu item - iscMI = new MenuItem(dataSourceMenu, SWT.RADIO); - iscMI.setText("ISC"); - iscMI.addSelectionListener(new SelectionAdapter() { @Override - public void widgetSelected(SelectionEvent event) { - getIscDataSource(); + public void widgetSelected(SelectionEvent e) { + MenuItem item = (MenuItem) e.getSource(); + if (item.getSelection()) { + statusHandler.handle( + Priority.EVENTB, + "User selected formatter data source: " + + item.getText()); + } } }); - // Official menu item - officialMI = new MenuItem(dataSourceMenu, SWT.RADIO); - officialMI.setText("Official"); - officialMI.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent event) { - selectedDataSource = getOfficialDataSource(); - } - }); + if (!mode.equals(CAVEMode.OPERATIONAL)) { + item.setSelection(true); + statusHandler.handle(Priority.EVENTB, + "Formatter default data source: " + item.getText()); + break; + } - // Default menu item - defaultMI = new MenuItem(dataSourceMenu, SWT.RADIO); - defaultMI.setText("Default"); - defaultMI.setSelection(true); - defaultMI.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent event) { - } - }); - } else { - selectedDataSource = dataMgr.getParmManager().getMutableDatabase() - .toString(); + if (source.equals(FormatterDataSource.Default)) { + item.setSelection(true); + statusHandler.handle(Priority.EVENTB, + "Formatter default data source: " + item.getText()); + } } } @@ -731,32 +710,108 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements * The name of the product * @return The data source */ - public String getSelectedDataSource(String productName) { - if (fcstMI.getSelection()) { - selectedDataSource = getFcstDataSource(); - } else if (iscMI.getSelection()) { - selectedDataSource = getIscDataSource(); - } else if (officialMI.getSelection()) { - selectedDataSource = getOfficialDataSource(); - } else { - // Default value - ProductDefinition prodDef = textProductMgr - .getProductDefinition(productName); - String dataSource = (String) prodDef.get("database"); - if (dataSource == null) { - dataSource = "Official"; - } - - if (dataSource.equals("ISC")) { - selectedDataSource = getIscDataSource(); - } else if (dataSource.equals("Official")) { - selectedDataSource = getOfficialDataSource(); - } else { - selectedDataSource = getFcstDataSource(); + public DatabaseID getSelectedDataSource(String productName) { + FormatterDataSource menuDataSource = FormatterDataSource.Default; + for (MenuItem item : dataSourceMI) { + if (item.getSelection()) { + menuDataSource = (FormatterDataSource) item.getData(); + break; } } - return selectedDataSource; + // Default value + ProductDefinition prodDef = textProductMgr + .getProductDefinition(productName); + String dbString = (String) prodDef.get("database"); + FormatterDataSource productDataSource; + if (dbString == null) { + productDataSource = FormatterDataSource.Default; + } else { + try { + productDataSource = FormatterDataSource.valueOf(dbString); + } catch (IllegalArgumentException e) { + StringBuilder msg = new StringBuilder(); + msg.append("The "); + msg.append(productName); + msg.append(" product definition contains an invalid database selection: \""); + msg.append(dbString); + msg.append("\". Valid values are: ["); + for (FormatterDataSource src : FormatterDataSource.values()) { + if (!src.equals(FormatterDataSource.Default)) { + msg.append(src).append(", "); + } + } + msg.delete(msg.length() - 2, msg.length()); + msg.append("]"); + statusHandler.error(msg.toString()); + return null; + } + } + + FormatterDataSource dataSource; + if (menuDataSource.equals(FormatterDataSource.Default)) { + if (productDataSource.equals(FormatterDataSource.Default)) { + dataSource = FormatterDataSource.Official; + } else { + dataSource = productDataSource; + } + } else { + dataSource = menuDataSource; + } + + if (!productDataSource.equals(FormatterDataSource.Default)) { + if (!dataSource.equals(productDataSource)) { + // A check should be made that a hazard formatter is actually + // being run on the database specified in the Local or + // Definition file (Definition["database"] entry). If the + // database being run is different, provide a warning to the + // forecaster that requires acknowledgment before running. + MessageDialog dlg = new MessageDialog(getShell(), + "Confirm Data Source", null, + "The product definition indicates the " + productName + + " formatter should be run against the " + + productDataSource + + " database, but you have selected the " + + dataSource + + " database.\n\nDo you wish to continue?", + MessageDialog.WARNING, new String[] { "Yes", "No" }, 1); + int retVal = dlg.open(); + if (retVal != 0) { + dataSource = null; + } + } + } else { + if (dataSource.equals(FormatterDataSource.ISC)) { + // If the database is not explicitly defined (default), provide + // a a warning to the forecaster that requires acknowledgment + // before running if the database being used is ISC + MessageDialog dlg = new MessageDialog( + getShell(), + "Confirm Data Source", + null, + "You are about to run the " + + productName + + " formatter against the ISC database.\n\nDo you wish to continue?", + MessageDialog.WARNING, new String[] { "Yes", "No" }, 1); + int retVal = dlg.open(); + if (retVal != 0) { + dataSource = null; + } + } + } + + DatabaseID selectedDbId; + if (dataSource == null) { + selectedDbId = null; + } else if (dataSource.equals(FormatterDataSource.ISC)) { + selectedDbId = getIscDataSource(); + } else if (dataSource.equals(FormatterDataSource.Official)) { + selectedDbId = getOfficialDataSource(); + } else { + selectedDbId = getFcstDataSource(); + } + + return selectedDbId; } /** @@ -1009,8 +1064,8 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements * * @return The FcstDataSource */ - private String getFcstDataSource() { - return dataMgr.getParmManager().getMutableDatabase().toString(); + private DatabaseID getFcstDataSource() { + return dataMgr.getParmManager().getMutableDatabase(); } /** @@ -1021,13 +1076,13 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements * * @return The ISC Data Source */ - private String getIscDataSource() { + private DatabaseID getIscDataSource() { java.util.List dbs = dataMgr.getParmManager() .getIscDatabases(); if (dbs.size() > 0) { // Always return the last one in the list - return dbs.get(dbs.size() - 1).toString(); + return dbs.get(dbs.size() - 1); } return null; @@ -1038,12 +1093,12 @@ public class FormatterLauncherDialog extends CaveJFACEDialog implements * * @return The Official Data source */ - private String getOfficialDataSource() { - String source = null; + private DatabaseID getOfficialDataSource() { + DatabaseID source = null; try { ServerResponse> sr = dataMgr.getClient() .getOfficialDBName(); - source = sr.getPayload().get(0).toString(); + source = sr.getPayload().get(0); } catch (GFEServerException e) { statusHandler.handle(Priority.PROBLEM, "Unable to determine official db", e); diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/dialogs/formatterlauncher/ProductAreaComp.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/dialogs/formatterlauncher/ProductAreaComp.java index ac377cd260..2f16d0d691 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/dialogs/formatterlauncher/ProductAreaComp.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/dialogs/formatterlauncher/ProductAreaComp.java @@ -34,6 +34,7 @@ import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.ProgressBar; import org.eclipse.swt.widgets.TabFolder; +import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID; import com.raytheon.viz.gfe.Activator; import com.raytheon.viz.gfe.core.DataManager; import com.raytheon.viz.gfe.dialogs.FormatterLauncherDialog; @@ -64,6 +65,8 @@ import com.raytheon.viz.gfe.textformatter.TextProductManager; * 05 SEP 2013 2329 randerso Added call to ZoneCombinerComp.applyZoneCombo when * when run formatter button is clicked. * 05 FEB 2014 2591 randerso Added dataManager to ZoneCombinerComp constructor + * Passed dataMgr instance to FormatterUtil.runFormatterScript + * 12 FEB 2014 2801 randerso Added prompting if formatter is run against non-normal database * * * @@ -365,36 +368,37 @@ public class ProductAreaComp extends Composite implements productEditorBtnSelected(); if (okToLoseText()) { - productEditorComp.clearProductText(); - abortFormatterBtn.setEnabled(true); - // closeTabBtn.setEnabled(false); - runFormatterBtn.setEnabled(false); - String vtecMode = ""; - if (formattingCbo.isVisible()) { - vtecMode = formattingCbo.getText(); - } else { - int hazIndex = productName.indexOf("Hazard_"); - if (hazIndex > -1) { - String category = productName.substring( - hazIndex + 7, hazIndex + 10); - vtecMode = textProductMgr - .getVtecMessageType(category); - if (vtecMode == null) { - vtecMode = ""; + DatabaseID dbId = ((FormatterLauncherDialog) productTabCB) + .getSelectedDataSource(productName); + + if (dbId != null) { + productEditorComp.clearProductText(); + abortFormatterBtn.setEnabled(true); + // closeTabBtn.setEnabled(false); + runFormatterBtn.setEnabled(false); + String vtecMode = ""; + if (formattingCbo.isVisible()) { + vtecMode = formattingCbo.getText(); + } else { + int hazIndex = productName.indexOf("Hazard_"); + if (hazIndex > -1) { + String category = productName.substring( + hazIndex + 7, hazIndex + 10); + vtecMode = textProductMgr + .getVtecMessageType(category); + if (vtecMode == null) { + vtecMode = ""; + } } } - } - // Check the data source menus, if one is selected then - // use - // it, else use the default - String dbId = null; - zoneCombiner.applyZoneCombo(); - dbId = ((FormatterLauncherDialog) productTabCB) - .getSelectedDataSource(productName); - FormatterUtil.runFormatterScript(textProductMgr, - productName, dbId, vtecMode, - ProductAreaComp.this); + // Get the source database + zoneCombiner.applyZoneCombo(); + FormatterUtil.runFormatterScript(dataMgr, + textProductMgr, productName, + dbId.toString(), vtecMode, + ProductAreaComp.this); + } } } }); diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/textformatter/CombinationsFileUtil.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/textformatter/CombinationsFileUtil.java index e0a9f44252..34b0b9ecbb 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/textformatter/CombinationsFileUtil.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/textformatter/CombinationsFileUtil.java @@ -22,6 +22,7 @@ package com.raytheon.viz.gfe.textformatter; import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -219,12 +220,18 @@ public class CombinationsFileUtil { // retrieve combinations file if it's changed LocalizationFile lf = pm.getStaticLocalizationFile(FileUtil.join( COMBO_DIR_PATH, comboName + ".py")); - File pyFile; - try { - pyFile = lf.getFile(true); - } catch (LocalizationException e) { - throw new GfeException("Error retrieving combinations file: " - + comboName, e); + File pyFile = null; + if (lf != null) { + try { + pyFile = lf.getFile(true); + } catch (LocalizationException e) { + throw new GfeException("Error retrieving combinations file: " + + comboName, e); + } + } + + if (pyFile == null || !pyFile.exists()) { + return Collections.emptyList(); } LocalizationContext baseContext = pm.getContext( diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/textformatter/FormatterUtil.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/textformatter/FormatterUtil.java index 1d0915d84f..9cb65090f9 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/textformatter/FormatterUtil.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/textformatter/FormatterUtil.java @@ -24,7 +24,6 @@ import java.util.TimeZone; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.common.time.SimulatedTime; import com.raytheon.uf.common.time.TimeRange; import com.raytheon.viz.core.mode.CAVEMode; @@ -42,6 +41,8 @@ import com.raytheon.viz.gfe.tasks.TaskManager; * Sep 8, 2008 njensen Initial creation * Jan 15, 2010 3395 ryu Fix "issued by" functionality * Sep 05, 2013 2329 randerso Removed save of combinations file + * Feb 12, 2014 2591 randerso Passed dataMgr instance to FormatterUtil.runFormatterScript + * Removed call to TextProductManager.reloadModule * * * @@ -59,6 +60,9 @@ public class FormatterUtil { /** * Runs a text formatter script for a given product * + * @param dataMgr + * the DataManager instance to use + * * @param productMgr * the formatter instance to use * @param productName @@ -70,22 +74,12 @@ public class FormatterUtil { * @param finish * listener to fire when formatter finishes generating product */ - public static void runFormatterScript(TextProductManager productMgr, - String productName, String dbId, String vtecMode, - TextProductFinishListener finish) { - try { - String filename = productMgr.getCombinationsFileName(productName); - boolean mapRequired = productMgr.mapRequired(productName); - if (filename != null && mapRequired) { - productMgr.reloadModule(filename); - } - } catch (Exception e) { - statusHandler.handle(Priority.PROBLEM, - "Cannot generate combinations file", e); - } + public static void runFormatterScript(DataManager dataMgr, + TextProductManager productMgr, String productName, String dbId, + String vtecMode, TextProductFinishListener finish) { int testMode = 0; - if (DataManager.getCurrentInstance().getOpMode().equals(CAVEMode.TEST)) { + if (dataMgr.getOpMode().equals(CAVEMode.TEST)) { testMode = 1; } @@ -106,8 +100,7 @@ public class FormatterUtil { } String name = productMgr.getModuleName(productName); - String varDict = productMgr.getVarDict(productName, - DataManager.getCurrentInstance(), dbId); + String varDict = productMgr.getVarDict(productName, dataMgr, dbId); if (varDict != null) { // run the formatter with the normal active table diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/textformatter/TextProductManager.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/textformatter/TextProductManager.java index 339d416024..b18878c0a6 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/textformatter/TextProductManager.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/textformatter/TextProductManager.java @@ -55,9 +55,10 @@ import com.raytheon.viz.gfe.core.DataManager; * SOFTWARE HISTORY * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * May 1, 2009 njensen Initial creation - * Jan 15, 2010 3395 ryu Fix "issued by" functionality - * Apr 24, 2013 1936 dgilling Remove unused imports. + * May 1, 2009 njensen Initial creation + * Jan 15, 2010 3395 ryu Fix "issued by" functionality + * Apr 24, 2013 1936 dgilling Remove unused imports. + * Feb 12, 2014 2591 randerso Removed reloadModule method * * * @@ -269,17 +270,6 @@ public class TextProductManager { return mapName; } - protected void reloadModule(String moduleName) { - Map args = new HashMap(1); - args.put("moduleName", moduleName); - try { - script.execute("reloadModule", args); - } catch (JepException e) { - statusHandler.handle(Priority.PROBLEM, - "Exception reloading module " + moduleName, e); - } - } - public void setIssuedBy(String issuedBy) { if (LocalizationManager.getInstance().getCurrentSite().equals(issuedBy)) { this.issuedBy = ""; diff --git a/edexOsgi/build.edex/esb/conf/log4j-ingest.xml b/edexOsgi/build.edex/esb/conf/log4j-ingest.xml index 8640e52fe9..e3ed1f4bdb 100644 --- a/edexOsgi/build.edex/esb/conf/log4j-ingest.xml +++ b/edexOsgi/build.edex/esb/conf/log4j-ingest.xml @@ -2,7 +2,7 @@ - + @@ -169,7 +169,7 @@ - + diff --git a/edexOsgi/build.edex/esb/conf/log4j-registry.xml b/edexOsgi/build.edex/esb/conf/log4j-registry.xml index e8715acd76..bb89704cf8 100644 --- a/edexOsgi/build.edex/esb/conf/log4j-registry.xml +++ b/edexOsgi/build.edex/esb/conf/log4j-registry.xml @@ -64,7 +64,7 @@ - + diff --git a/edexOsgi/build.edex/esb/conf/log4j.xml b/edexOsgi/build.edex/esb/conf/log4j.xml index 553ebc2b0b..a8edd563ce 100644 --- a/edexOsgi/build.edex/esb/conf/log4j.xml +++ b/edexOsgi/build.edex/esb/conf/log4j.xml @@ -2,7 +2,7 @@ - + diff --git a/edexOsgi/build.edex/esb/conf/modes.xml b/edexOsgi/build.edex/esb/conf/modes.xml index 35b803374d..04e4ad1713 100644 --- a/edexOsgi/build.edex/esb/conf/modes.xml +++ b/edexOsgi/build.edex/esb/conf/modes.xml @@ -120,10 +120,11 @@ shef-ingest.xml persist-ingest.xml obs-common.xml - obs-ingest.xml - metartohmdb-plugin.xml - pointdata-common.xml + obs-ingest.xml + metartohmdb-plugin.xml + pointdata-common.xml shef-common.xml + ohd-common-database.xml ohd-common.xml alarmWhfs-spring.xml arealffgGenerator-spring.xml @@ -148,6 +149,7 @@ fssobs-common.xml + ohd-common-database.xml ohd-common.xml database-common.xml ohd-request.xml @@ -232,6 +234,7 @@ shef-common.xml satellite-common.xml satellite-dataplugin-common.xml + ohd-common-database.xml ohd-common.xml management-common.xml auth-common.xml diff --git a/edexOsgi/build.edex/esb/conf/spring/edex.xml b/edexOsgi/build.edex/esb/conf/spring/edex.xml index 3d741415d7..0bf8d7cdc6 100644 --- a/edexOsgi/build.edex/esb/conf/spring/edex.xml +++ b/edexOsgi/build.edex/esb/conf/spring/edex.xml @@ -14,33 +14,30 @@ - + - - - - - + + - - + + - + - + @@ -66,13 +63,13 @@ - + - + - + diff --git a/edexOsgi/com.raytheon.edex.plugin.airep/res/spring/airep-ingest.xml b/edexOsgi/com.raytheon.edex.plugin.airep/res/spring/airep-ingest.xml index a757baaf8e..010872c7d2 100644 --- a/edexOsgi/com.raytheon.edex.plugin.airep/res/spring/airep-ingest.xml +++ b/edexOsgi/com.raytheon.edex.plugin.airep/res/spring/airep-ingest.xml @@ -12,7 +12,7 @@ - + - + - + - + - + - + diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/res/spring/gfe-request.xml b/edexOsgi/com.raytheon.edex.plugin.gfe/res/spring/gfe-request.xml index b296dc27ba..e77af0d0cb 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/res/spring/gfe-request.xml +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/res/spring/gfe-request.xml @@ -460,17 +460,11 @@ - - - - - - - - + class="com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor"> + + + - - - - - - - - - @@ -584,7 +567,7 @@ - + @@ -623,7 +606,7 @@ - + @@ -643,7 +626,7 @@ errorHandlerRef="errorHandler" autoStartup="false"> - + diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/res/spring/gfe-spring.xml b/edexOsgi/com.raytheon.edex.plugin.gfe/res/spring/gfe-spring.xml index 0f267bc501..a0faa56337 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/res/spring/gfe-spring.xml +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/res/spring/gfe-spring.xml @@ -4,16 +4,10 @@ http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> - - - - - - - + + @@ -93,7 +87,7 @@ - + @@ -104,7 +98,7 @@ - + @@ -117,7 +111,7 @@ - + diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/isc/IscSendQueue.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/isc/IscSendQueue.java index a28fd672d0..8930f626f1 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/isc/IscSendQueue.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/isc/IscSendQueue.java @@ -59,9 +59,10 @@ import com.raytheon.uf.edex.database.dao.DaoConfig; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Oct 20, 2011 dgilling Initial creation - * May 08, 2012 #600 dgilling Re-work logic for handling PENDING - * records. + * Oct 20, 2011 dgilling Initial creation + * May 08, 2012 600 dgilling Re-work logic for handling PENDING + * records. + * Feb 07, 2014 2357 rjpeter iscSendNotification uri. * * * @@ -74,9 +75,9 @@ public class IscSendQueue { // how we'll organize the temporary queue private class JobSetQueueKey { - private ParmID pid; + private final ParmID pid; - private IscSendState state; + private final IscSendState state; public JobSetQueueKey(ParmID pid, IscSendState state) { this.pid = pid; @@ -92,8 +93,9 @@ public class IscSendQueue { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((pid == null) ? 0 : pid.hashCode()); - result = prime * result + ((state == null) ? 0 : state.hashCode()); + result = (prime * result) + ((pid == null) ? 0 : pid.hashCode()); + result = (prime * result) + + ((state == null) ? 0 : state.hashCode()); return result; } @@ -148,7 +150,7 @@ public class IscSendQueue { private int timeoutMillis = 60000; - private Map> jobSet = new HashMap>(); + private final Map> jobSet = new HashMap>(); private static final IscSendQueue instance = new IscSendQueue(); @@ -168,7 +170,7 @@ public class IscSendQueue { try { byte[] messages = SerializationUtil.transformToThrift(sendJobs); EDEXUtil.getMessageProducer().sendAsyncUri( - "jms-iscsend:queue:iscSendNotification", messages); + "jms-durable:queue:iscSendNotification", messages); } catch (SerializationException e) { handler.error("Unable to serialize IscSendRecords.", e); } catch (EdexException e) { @@ -238,7 +240,7 @@ public class IscSendQueue { // Now combine time ranges if we can int i = 0; - while (i <= pending.size() - 2) { + while (i <= (pending.size() - 2)) { TimeRange time = pending.get(i).getTimeRange(); TimeRange time1 = pending.get(i + 1).getTimeRange(); diff --git a/edexOsgi/com.raytheon.edex.plugin.goessounding/res/spring/goessounding-ingest.xml b/edexOsgi/com.raytheon.edex.plugin.goessounding/res/spring/goessounding-ingest.xml index 25158070e6..5f7aa56c3c 100644 --- a/edexOsgi/com.raytheon.edex.plugin.goessounding/res/spring/goessounding-ingest.xml +++ b/edexOsgi/com.raytheon.edex.plugin.goessounding/res/spring/goessounding-ingest.xml @@ -12,7 +12,7 @@ - + - - - - - - - - - - @@ -58,7 +46,7 @@ autoStartup="false"> - + @@ -67,7 +55,7 @@ grid - + @@ -108,7 +96,7 @@ - + diff --git a/edexOsgi/com.raytheon.edex.plugin.grib/res/spring.future/grib-decode.xml b/edexOsgi/com.raytheon.edex.plugin.grib/res/spring.future/grib-decode.xml index 3c36fb0ed9..6e39cd4665 100644 --- a/edexOsgi/com.raytheon.edex.plugin.grib/res/spring.future/grib-decode.xml +++ b/edexOsgi/com.raytheon.edex.plugin.grib/res/spring.future/grib-decode.xml @@ -5,18 +5,6 @@ - - - - - - - - - - @@ -54,7 +42,7 @@ autoStartup="false"> - + @@ -63,7 +51,7 @@ grid - + @@ -99,7 +87,7 @@ - + diff --git a/edexOsgi/com.raytheon.edex.plugin.grib/res/spring/grib-distribution.xml b/edexOsgi/com.raytheon.edex.plugin.grib/res/spring/grib-distribution.xml index be6ad0a4f3..bea7cd0041 100644 --- a/edexOsgi/com.raytheon.edex.plugin.grib/res/spring/grib-distribution.xml +++ b/edexOsgi/com.raytheon.edex.plugin.grib/res/spring/grib-distribution.xml @@ -4,6 +4,6 @@ - + \ No newline at end of file diff --git a/edexOsgi/com.raytheon.edex.plugin.ldad/res/spring/ldad-ingest.xml b/edexOsgi/com.raytheon.edex.plugin.ldad/res/spring/ldad-ingest.xml index 6c33246a98..84ae50fe1e 100644 --- a/edexOsgi/com.raytheon.edex.plugin.ldad/res/spring/ldad-ingest.xml +++ b/edexOsgi/com.raytheon.edex.plugin.ldad/res/spring/ldad-ingest.xml @@ -8,7 +8,7 @@ - + - + diff --git a/edexOsgi/com.raytheon.edex.plugin.ldadmanual/res/spring/ldadmanual-ingest.xml b/edexOsgi/com.raytheon.edex.plugin.ldadmanual/res/spring/ldadmanual-ingest.xml index 08bb3d9182..7d21714988 100644 --- a/edexOsgi/com.raytheon.edex.plugin.ldadmanual/res/spring/ldadmanual-ingest.xml +++ b/edexOsgi/com.raytheon.edex.plugin.ldadmanual/res/spring/ldadmanual-ingest.xml @@ -12,7 +12,7 @@ - + - + - + - + - + - + - + - - - - - - - - - - + - + - + radar - + --> - + radar-sbn @@ -61,7 +50,7 @@ - + radar-local diff --git a/edexOsgi/com.raytheon.edex.plugin.recco/res/spring/recco-ingest.xml b/edexOsgi/com.raytheon.edex.plugin.recco/res/spring/recco-ingest.xml index 2ef0c4dbe6..7ab29724e2 100644 --- a/edexOsgi/com.raytheon.edex.plugin.recco/res/spring/recco-ingest.xml +++ b/edexOsgi/com.raytheon.edex.plugin.recco/res/spring/recco-ingest.xml @@ -12,7 +12,7 @@ - + - + - + satellite diff --git a/edexOsgi/com.raytheon.edex.plugin.sfcobs/res/spring/sfcobs-ingest.xml b/edexOsgi/com.raytheon.edex.plugin.sfcobs/res/spring/sfcobs-ingest.xml index f27a884f78..2c54b38d55 100644 --- a/edexOsgi/com.raytheon.edex.plugin.sfcobs/res/spring/sfcobs-ingest.xml +++ b/edexOsgi/com.raytheon.edex.plugin.sfcobs/res/spring/sfcobs-ingest.xml @@ -13,7 +13,7 @@ - + - - - - - - - - - - @@ -47,13 +35,13 @@ factory-method="register"> + value="jms-durable:queue:Ingest.Shef"/> - + + uri="jms-durable:queue:Ingest.Shef"/> shef @@ -103,7 +91,7 @@ + uri="jms-durable:queue:Ingest.ShefStaged"/> shef @@ -155,7 +143,7 @@ + uri="jms-durable:queue:Ingest.ShefManual"/> shef diff --git a/edexOsgi/com.raytheon.edex.plugin.shef/src/com/raytheon/edex/plugin/shef/alarms/AlertalarmStdTextProductUtil.java b/edexOsgi/com.raytheon.edex.plugin.shef/src/com/raytheon/edex/plugin/shef/alarms/AlertalarmStdTextProductUtil.java index f30156189e..1a6c51132a 100644 --- a/edexOsgi/com.raytheon.edex.plugin.shef/src/com/raytheon/edex/plugin/shef/alarms/AlertalarmStdTextProductUtil.java +++ b/edexOsgi/com.raytheon.edex.plugin.shef/src/com/raytheon/edex/plugin/shef/alarms/AlertalarmStdTextProductUtil.java @@ -33,8 +33,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; -import com.raytheon.edex.textdb.dbapi.impl.TextDB; -import com.raytheon.uf.common.dataplugin.text.request.WriteProductRequest; import com.raytheon.uf.common.ohd.AppsDefaults; import com.raytheon.uf.edex.core.EDEXUtil; @@ -45,12 +43,11 @@ import com.raytheon.uf.edex.core.EDEXUtil; *
  * 
  * SOFTWARE HISTORY
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * June 15, 2011    9377     jnjanga     Initial creation
- *  July 12, 2013   15711     wkwock      Fix verbose, observe mode, etc
- * 
- * 
+ * Date          Ticket#    Engineer    Description
+ * ------------- ---------- ----------- --------------------------
+ * Jun 15, 2011  9377       jnjanga     Initial creation.
+ * Jul 12, 2013  15711      wkwock      Fix verbose, observe mode, etc.
+ * Feb 10, 2014  2781       rjpeter     Removed dead method.
  * 
* * @author jnjanga @@ -88,7 +85,7 @@ public class AlertalarmStdTextProductUtil { setCurrentReportfile(); reportAlarm(); - + System.exit(reportWriter.getAlarmCount()); } @@ -104,7 +101,7 @@ public class AlertalarmStdTextProductUtil { options.addOption(CmdlineOptionId.FILE_SUFFIX); options.addOption(CmdlineOptionId.FLAGS); options.addOption(CmdlineOptionId.PE); - options.addOption(CmdlineOptionId.VERBOSE,false); + options.addOption(CmdlineOptionId.VERBOSE, false); return options; } @@ -147,13 +144,14 @@ public class AlertalarmStdTextProductUtil { String optName = optId.toString(); System.out.println("optName = " + optName); if (optName.equalsIgnoreCase("v")) { - if (line.hasOption(optName)) { - System.out.println(" optValue = true"); - } else { - System.out.println(" optValue = false"); - } + if (line.hasOption(optName)) { + System.out.println(" optValue = true"); + } else { + System.out.println(" optValue = false"); + } } else { - System.out.println(" optValue = " + line.getOptionValue(optName)); + System.out.println(" optValue = " + + line.getOptionValue(optName)); } if (line.hasOption(optName)) { @@ -177,9 +175,10 @@ public class AlertalarmStdTextProductUtil { ignoreMin.add(ReportMode.NEAREST); ignoreMin.add(ReportMode.LATEST_MAXFCST); if (rptOptions.isMinutesGiven() - && ignoreMin.contains(rptOptions.getMode())) + && ignoreMin.contains(rptOptions.getMode())) { System.out .println("Usage : -m value ignored for this -r"); + } reportOptions = rptOptions; @@ -191,9 +190,11 @@ public class AlertalarmStdTextProductUtil { private static boolean hasDuplicateOptions(CommandLine line) { Option[] userOptions = line.getOptions(); Set unique = new HashSet(); - for (Option option : userOptions) - if (!unique.add(option.getOpt())) + for (Option option : userOptions) { + if (!unique.add(option.getOpt())) { return true; + } + } return false; } @@ -221,9 +222,9 @@ public class AlertalarmStdTextProductUtil { reportWriter.writeHeader(); reportWriter.writeBody(aaRecord); if (reportOptions.getVerbose()) { - reportWriter.writeVerboseTrailer(); + reportWriter.writeVerboseTrailer(); } else { - reportWriter.writeReportTrailer(); + reportWriter.writeReportTrailer(); } // save it to the text database if indeed @@ -232,7 +233,7 @@ public class AlertalarmStdTextProductUtil { if (alarmCount > 0) { log.info(alarmCount + " alarms reported, report written to " + reportWriter.getFilename()); - //saveReportTotextDb(); + // saveReportTotextDb(); } else { log.info("No alarms reported, info sent to " + reportWriter.getFilename()); @@ -241,37 +242,6 @@ public class AlertalarmStdTextProductUtil { } - /* - * saves the report contents to the text database. - */ - private static void saveReportTotextDb() { - - setApplicationSpringContext(Constants.FXA_CONFIG); - - WriteProductRequest request = new WriteProductRequest(); - request.setProductId(reportOptions.getProductId()); - request.setOperationalMode(true); - request.setNotifyAlarmAlert(true); - String rptData = reportWriter.getReportData(); - request.setReportData(rptData); - - log.info("Sending " + reportWriter.getFilename() + " to textdb as id " - + request.getProductId()); - - TextDB textdb = new TextDB(); - long result = textdb.writeProduct(request.getProductId(), - request.getReportData(), request.getOperationalMode(), null); - - if (result != Long.MIN_VALUE) { - log.info("Product " + request.getProductId() - + " successfully sent to textdb"); - } else { - log.error("Error sending product " + request.getProductId() - + " to textdb. status=" + result); - } - - } - /* * verify whether necessary application tokens have been defined. */ @@ -308,18 +278,20 @@ public class AlertalarmStdTextProductUtil { String pid = reportOptions.getProductId(); String suffix = reportOptions.getFileSuffix(); - if (suffix.length() > 0) - currReport = new File(reportDir + File.separator + pid + "." + suffix); - else + if (suffix.length() > 0) { + currReport = new File(reportDir + File.separator + pid + "." + + suffix); + } else { currReport = new File(reportDir + File.separator + pid); + } try { currReport.createNewFile(); } catch (Exception e) { - log.fatal("Could not create report file " + log.fatal("Could not create report file " + String.valueOf(currReport)); - log.info("Exiting."); - System.exit(0); + log.info("Exiting."); + System.exit(0); } } diff --git a/edexOsgi/com.raytheon.edex.plugin.shef/src/com/raytheon/edex/plugin/shef/alarms/Constants.java b/edexOsgi/com.raytheon.edex.plugin.shef/src/com/raytheon/edex/plugin/shef/alarms/Constants.java index c09f29263a..c8b0a35dbc 100644 --- a/edexOsgi/com.raytheon.edex.plugin.shef/src/com/raytheon/edex/plugin/shef/alarms/Constants.java +++ b/edexOsgi/com.raytheon.edex.plugin.shef/src/com/raytheon/edex/plugin/shef/alarms/Constants.java @@ -23,30 +23,41 @@ import java.text.SimpleDateFormat; import com.raytheon.uf.common.dataplugin.shef.util.ShefConstants; - +/** + * Constants for alert alarm. + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Feb 10, 2014 2781       rjpeter     Initial history, update IHFS_CONFIG path.
+ * 
+ * + * @author jnjanga + * @version 1.0 + */ class Constants { - + public static final SimpleDateFormat REPORT_TIME_PATTERN = new SimpleDateFormat( - "HH:mm:ss z, yyyy.MM.dd "); + "HH:mm:ss z, yyyy.MM.dd "); public static final int MISSING_VALUE_INT = ShefConstants.SHEF_MISSING_INT; - + public static final double MISSING_VALUE_DOUBLE = -9999999.87654321; public static final String NEWLINE = System.getProperty("line.separator"); - + public final static String EOL = NEWLINE; public static final String SPACE = " "; - + public static final String REPORT_ALARM_LOG = "report_alarm.log"; - + public static final String WHFS_PRODUCT_DIR = "whfs_product_dir"; - + public static final String WHFS_UTIL_LOG_DIR = "whfs_util_log_dir"; - - public static final String IHFS_CONFIG = "/res/spring/ohd-common.xml"; - - public static final String FXA_CONFIG = "/res/spring/alertalarm.xml"; - + + public static final String IHFS_CONFIG = "/res/spring/ohd-common-database.xml"; } \ No newline at end of file diff --git a/edexOsgi/com.raytheon.edex.plugin.taf/res/spring/taf-ingest.xml b/edexOsgi/com.raytheon.edex.plugin.taf/res/spring/taf-ingest.xml index fcd1df9358..651083abdb 100644 --- a/edexOsgi/com.raytheon.edex.plugin.taf/res/spring/taf-ingest.xml +++ b/edexOsgi/com.raytheon.edex.plugin.taf/res/spring/taf-ingest.xml @@ -9,13 +9,13 @@ - + - + * @@ -108,7 +109,6 @@ public class ChangeGroup extends PersistableDataObject implements @Id @GeneratedValue - @DynamicSerializeElement private int id; /** A String containing the change group */ @@ -912,6 +912,11 @@ public class ChangeGroup extends PersistableDataObject implements public void setTurbulence_layers(Set turbulence_layers) { this.turbulence_layers = turbulence_layers; + if ((turbulence_layers != null) && (turbulence_layers.size() > 0)) { + for (TurbulenceLayer turbulence_layer : turbulence_layers) { + turbulence_layer.setParentID(this); + } + } } public Set getIcing_layers() { @@ -920,6 +925,11 @@ public class ChangeGroup extends PersistableDataObject implements public void setIcing_layers(Set icing_layers) { this.icing_layers = icing_layers; + if ((icing_layers != null) && (icing_layers.size() > 0)) { + for (IcingLayer icing_layer : icing_layers) { + icing_layer.setParentID(this); + } + } } public Set getTemp_forecasts() { @@ -928,6 +938,11 @@ public class ChangeGroup extends PersistableDataObject implements public void setTemp_forecasts(Set temp_forecasts) { this.temp_forecasts = temp_forecasts; + if ((temp_forecasts != null) && (temp_forecasts.size() > 0)) { + for (TemperatureForecast temForecast : temp_forecasts) { + temForecast.setParentID(this); + } + } } public Set getWeather() { @@ -936,6 +951,11 @@ public class ChangeGroup extends PersistableDataObject implements public void setWeather(Set weather) { this.weather = weather; + if ((weather != null) && (weather.size() > 0)) { + for (TafWeatherCondition twc : weather) { + twc.setParentID(this); + } + } } public Set getSky_cover() { @@ -944,6 +964,11 @@ public class ChangeGroup extends PersistableDataObject implements public void setSky_cover(Set sky_cover) { this.sky_cover = sky_cover; + if ((sky_cover != null) && (sky_cover.size() > 0)) { + for (TafSkyCover tsc : sky_cover) { + tsc.setParentID(this); + } + } } private void checkGroupDataEnd(StringBuilder group) { diff --git a/edexOsgi/com.raytheon.edex.plugin.taf/src/com/raytheon/edex/plugin/taf/common/TafRecord.java b/edexOsgi/com.raytheon.edex.plugin.taf/src/com/raytheon/edex/plugin/taf/common/TafRecord.java index 4690840804..c658fc377a 100644 --- a/edexOsgi/com.raytheon.edex.plugin.taf/src/com/raytheon/edex/plugin/taf/common/TafRecord.java +++ b/edexOsgi/com.raytheon.edex.plugin.taf/src/com/raytheon/edex/plugin/taf/common/TafRecord.java @@ -69,6 +69,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * May 07, 2013 1869 bsteffen Remove dataURI column from * PluginDataObject. * Aug 30, 2013 2298 rjpeter Make getPluginName abstract + * Feb 10, 2014 2777 rferrel Assign parent id when setting ChangeGroup. + * Feb 11, 2014 2784 rferrel Remove override of setIdentifier. * * * @@ -292,6 +294,11 @@ public class TafRecord extends PluginDataObject implements ISpatialEnabled { */ public void setChangeGroups(Set changeGroups) { this.changeGroups = changeGroups; + if ((changeGroups != null) && (changeGroups.size() > 0)) { + for (ChangeGroup changeGroup : changeGroups) { + changeGroup.setParentID(this); + } + } } /** @@ -339,19 +346,6 @@ public class TafRecord extends PluginDataObject implements ISpatialEnabled { this.remarks = remarks; } - @Override - public void setIdentifier(Object dataURI) { - - this.identifier = dataURI; - - if ((this.changeGroups != null) && (this.changeGroups.size() > 0)) { - for (ChangeGroup group : this.changeGroups) { - group.setParentID(this); - } - } - - } - /** * Get the IDecoderGettable reference for this record. * diff --git a/edexOsgi/com.raytheon.edex.plugin.text/res/spring/text-ingest.xml b/edexOsgi/com.raytheon.edex.plugin.text/res/spring/text-ingest.xml index f2c2cdc1bc..95a4a7083a 100644 --- a/edexOsgi/com.raytheon.edex.plugin.text/res/spring/text-ingest.xml +++ b/edexOsgi/com.raytheon.edex.plugin.text/res/spring/text-ingest.xml @@ -11,13 +11,13 @@ - + - + @@ -27,18 +27,6 @@ - - - - - - - - - - @@ -118,7 +106,7 @@
- + text @@ -145,7 +133,7 @@ - + diff --git a/edexOsgi/com.raytheon.edex.plugin.textlightning/res/spring/textlightning_ep-ingest.xml b/edexOsgi/com.raytheon.edex.plugin.textlightning/res/spring/textlightning_ep-ingest.xml index feb8c3a7a6..5f5ada5907 100644 --- a/edexOsgi/com.raytheon.edex.plugin.textlightning/res/spring/textlightning_ep-ingest.xml +++ b/edexOsgi/com.raytheon.edex.plugin.textlightning/res/spring/textlightning_ep-ingest.xml @@ -9,7 +9,7 @@ - + - + - + - - - - - - - - - - - + warning @@ -67,11 +55,11 @@ - - + + - +
diff --git a/edexOsgi/com.raytheon.edex.textdb/res/spring/textdb-request.xml b/edexOsgi/com.raytheon.edex.textdb/res/spring/textdb-request.xml index 5ebc2d0a0f..12bb2fc4aa 100644 --- a/edexOsgi/com.raytheon.edex.textdb/res/spring/textdb-request.xml +++ b/edexOsgi/com.raytheon.edex.textdb/res/spring/textdb-request.xml @@ -41,12 +41,18 @@
- - - + + + - + + + + + + @@ -64,7 +70,7 @@ - +
diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.obs/src/com/raytheon/uf/common/dataplugin/obs/metar/MetarRecord.java b/edexOsgi/com.raytheon.uf.common.dataplugin.obs/src/com/raytheon/uf/common/dataplugin/obs/metar/MetarRecord.java index 173fad6ece..15caba37ac 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.obs/src/com/raytheon/uf/common/dataplugin/obs/metar/MetarRecord.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.obs/src/com/raytheon/uf/common/dataplugin/obs/metar/MetarRecord.java @@ -97,6 +97,7 @@ import com.raytheon.uf.common.time.util.TimeUtil; * May 07, 2013 1869 bsteffen Remove dataURI column from * PluginDataObject. * Aug 30, 2013 2298 rjpeter Make getPluginName abstract + * Feb 11, 2014 2784 rferrel Remove override of setIdentifier. * * * @author bphillip @@ -984,6 +985,11 @@ public class MetarRecord extends PersistablePluginDataObject implements */ public void setSkyCoverage(Set skyCoverage) { this.skyCoverage = skyCoverage; + if ((skyCoverage != null) && (skyCoverage.size() > 0)) { + for (SkyCover cover : skyCoverage) { + cover.setParentMetar(this); + } + } } public void addSkyCoverage(SkyCover cover) { @@ -1019,6 +1025,11 @@ public class MetarRecord extends PersistablePluginDataObject implements */ public void setWeatherCondition(List weatherCondition) { this.weatherCondition = weatherCondition; + if ((weatherCondition != null) && (weatherCondition.size() > 0)) { + for (WeatherCondition cond : weatherCondition) { + cond.setParentMetar(this); + } + } } public void addWeatherCondition(WeatherCondition condition) { @@ -1116,30 +1127,6 @@ public class MetarRecord extends PersistablePluginDataObject implements this.snowWater = snowWater; } - /** - * Override existing set method to modify any classes that use the dataURI - * as a foreign key - */ - @Override - public void setIdentifier(Object dataURI) { - this.identifier = dataURI; - // set the parentID to the dataURI for all values - if ((this.getWeatherCondition() != null) - && (this.getWeatherCondition().size() > 0)) { - for (WeatherCondition cond : this.getWeatherCondition()) { - cond.setParentMetar(this); - } - } - - // set the parentID to the dataURI for all values - if ((this.getSkyCoverage() != null) - && (this.getSkyCoverage().size() > 0)) { - for (SkyCover cover : this.getSkyCoverage()) { - cover.setParentMetar(this); - } - } - } - public String getReportType() { return reportType; } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin/src/com/raytheon/uf/common/dataplugin/persist/PersistableDataObject.java b/edexOsgi/com.raytheon.uf.common.dataplugin/src/com/raytheon/uf/common/dataplugin/persist/PersistableDataObject.java index eb55100ec0..eb5657f98e 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin/src/com/raytheon/uf/common/dataplugin/persist/PersistableDataObject.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin/src/com/raytheon/uf/common/dataplugin/persist/PersistableDataObject.java @@ -28,7 +28,6 @@ import javax.xml.bind.annotation.XmlElement; import com.raytheon.uf.common.serialization.ISerializableObject; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; -import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; /** * This is the root class for any object being persisted in the database using @@ -50,6 +49,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * 7/24/07 353 bphillip Initial Check in * 20080408 1039 jkorman Added traceId for tracing data. * Oct 10, 2012 1261 djohnson Add generic for identifier. + * Feb 11, 2014 2784 rferrel Identifier no longer a DynamicSerializeElement. * * * @@ -59,8 +59,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize public abstract class PersistableDataObject implements - IPersistableDataObject, - Serializable, ISerializableObject { + IPersistableDataObject, Serializable, + ISerializableObject { private static final long serialVersionUID = -6747395152869923909L; @@ -69,7 +69,6 @@ public abstract class PersistableDataObject implements * key for the associated database table. */ @XmlElement - @DynamicSerializeElement protected IDENTIFIER_TYPE identifier; private String traceId = ""; diff --git a/edexOsgi/com.raytheon.uf.common.jms/META-INF/MANIFEST.MF b/edexOsgi/com.raytheon.uf.common.jms/META-INF/MANIFEST.MF index b55485d361..5677c0d2f5 100644 --- a/edexOsgi/com.raytheon.uf.common.jms/META-INF/MANIFEST.MF +++ b/edexOsgi/com.raytheon.uf.common.jms/META-INF/MANIFEST.MF @@ -5,6 +5,7 @@ Bundle-SymbolicName: com.raytheon.uf.common.jms Bundle-Version: 1.12.1174.qualifier Bundle-Vendor: Raytheon Require-Bundle: javax.jms, - com.raytheon.uf.common.status + com.raytheon.uf.common.status, + org.apache.qpid Export-Package: com.raytheon.uf.common.jms Bundle-RequiredExecutionEnvironment: JavaSE-1.6 diff --git a/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledConnection.java b/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledConnection.java index 27076515d6..4a806981a7 100644 --- a/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledConnection.java +++ b/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledConnection.java @@ -39,7 +39,8 @@ import com.raytheon.uf.common.status.UFStatus.Priority; * connection can be released to the pool. Any exception will close pooled * session instead of returning to the pool. The sessions are tracked in both * active and available states. An available session can be reused by the next - * client. + * client. The connection is pinned to Thread that creates the connection and + * cannot be used/reused by any other thread. * * Synchronization Principle To prevent deadlocks: Chained sync blocks can only * happen in a downward direction. A manager has a synchronized lock can make a @@ -52,9 +53,11 @@ import com.raytheon.uf.common.status.UFStatus.Priority; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Apr 15, 2011 rjpeter Initial creation - * Mar 08, 2012 194 njensen Improved safety of close() - * Feb 21, 2013 1642 rjpeter Fix deadlock scenario + * Apr 15, 2011 rjpeter Initial creation. + * Mar 08, 2012 194 njensen Improved safety of close(). + * Feb 21, 2013 1642 rjpeter Fix deadlock scenario. + * Feb 07, 2014 2357 rjpeter Track by Thread, close session is it has no + * producers/consumers. * * * @author rjpeter @@ -86,7 +89,7 @@ public class JmsPooledConnection implements ExceptionListener { private volatile AvailableJmsPooledObject availableSession = null; - private volatile String key = null; + private final Thread thread; private final String clientId; @@ -94,8 +97,10 @@ public class JmsPooledConnection implements ExceptionListener { private volatile boolean exceptionOccurred = false; - public JmsPooledConnection(JmsPooledConnectionFactory connFactory) { + public JmsPooledConnection(JmsPooledConnectionFactory connFactory, + Thread thread) { this.connFactory = connFactory; + this.thread = thread; this.clientId = null; getConnection(); } @@ -123,7 +128,8 @@ public class JmsPooledConnection implements ExceptionListener { if (availableSession != null) { JmsPooledSession availSess = availableSession.getPooledObject(); synchronized (availSess.getStateLock()) { - if (availSess.isValid()) { + if (availSess.isValid() + && availSess.hasProducersOrConsumers()) { availSess.setState(State.InUse); session = availSess; } else { @@ -185,6 +191,7 @@ public class JmsPooledConnection implements ExceptionListener { } if (canClose) { + statusHandler.info("Closing connection: " + this.toString()); // njensen: I moved removing the connection from the pool to be // the first thing in this block instead of last thing so // there's no chance it could be closed and then retrieved from @@ -283,6 +290,8 @@ public class JmsPooledConnection implements ExceptionListener { // safe since conn is volatile synchronized (stateLock) { if (conn == null) { + statusHandler.info("Creating connection: " + + this.toString()); long exceptionLastHandled = 0; boolean connected = false; while (!connected) { @@ -298,7 +307,7 @@ public class JmsPooledConnection implements ExceptionListener { connectionStartTime = System.currentTimeMillis(); connected = true; } catch (Exception e) { - if (exceptionLastHandled + ERROR_BROADCAST_INTERVAL < System + if ((exceptionLastHandled + ERROR_BROADCAST_INTERVAL) < System .currentTimeMillis()) { exceptionLastHandled = System .currentTimeMillis(); @@ -502,12 +511,8 @@ public class JmsPooledConnection implements ExceptionListener { } } - public void setKey(String key) { - this.key = key; - } - - public String getKey() { - return key; + public Thread getThread() { + return thread; } /** diff --git a/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledConnectionFactory.java b/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledConnectionFactory.java index b5c5d03be7..757869d6a6 100644 --- a/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledConnectionFactory.java +++ b/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledConnectionFactory.java @@ -1,23 +1,3 @@ -package com.raytheon.uf.common.jms; - -import java.util.ArrayList; -import java.util.Deque; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentLinkedQueue; - -import javax.jms.Connection; -import javax.jms.ConnectionFactory; -import javax.jms.JMSException; - -import com.raytheon.uf.common.jms.wrapper.JmsConnectionWrapper; -import com.raytheon.uf.common.status.IUFStatusHandler; -import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.common.status.UFStatus.Priority; - /** * This software was developed and / or modified by Raytheon Company, * pursuant to Contract DG133W-05-CQ-1067 with the US Government. @@ -37,9 +17,37 @@ import com.raytheon.uf.common.status.UFStatus.Priority; * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ +package com.raytheon.uf.common.jms; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.concurrent.ConcurrentLinkedQueue; + +import javax.jms.Connection; +import javax.jms.ConnectionFactory; +import javax.jms.JMSException; + +import com.raytheon.uf.common.jms.wrapper.JmsConnectionWrapper; +import com.raytheon.uf.common.status.IUFStatusHandler; +import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.common.status.UFStatus.Priority; /** - * TODO Add Description + * Connection Factory that keep underlying JMS resources used by a thread open + * for re-use by that same thread. This is to get around Spring's opening and + * closing the full jms stack for each message. We cannot use Spring caching + * mechanism since it requires one connection object to be used for all jms + * sessions. In that scenario one error causes every jms resource to disconnect + * and has been known to dead lock in the qpid code. + * + * The close action puts the resource into a pool for reuse. The jms resource + * may only be reused by the same thread. This is in part since each thread + * always connects to the same set of jms resources. Also on the QPID broker + * transient data is only removed when the session itself is closed. So reusing + * a resource on a different thread can cause transient topic resources with no + * consumers. * *
  * 
@@ -48,7 +56,9 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
  * Date         Ticket#    Engineer    Description
  * ------------ ---------- ----------- --------------------------
  * Apr 15, 2011            rjpeter     Initial creation
- * 
+ * Oct 04, 2013 2357       rjpeter     Removed pooling, keeps resources open for the
+ *                                     thread that created them for a configured amount of time.
+ * Feb 07, 2014 2357       rjpeter     Track by Thread object, periodly check that tracked Threads are still alive.
  * 
* * @author rjpeter @@ -63,26 +73,18 @@ public class JmsPooledConnectionFactory implements ConnectionFactory { private String provider = "QPID"; - // connections in use, key is "threadId-threadName" - private final Map inUseConnections = new HashMap(); + // connections in use + private final Map inUseConnections = new HashMap(); - // connections that were recently returned, key is "threadId-threadName" - private final Map> pendingConnections = new HashMap>(); - - // connections that have been released from pendingConnections and are - // awaiting being closed. - private final Deque> availableConnections = new LinkedList>(); + // connections that were recently returned + private final Map> pendingConnections = new HashMap>(); private final ConcurrentLinkedQueue deadConnections = new ConcurrentLinkedQueue(); private int reconnectInterval = 30000; - private int connectionHoldTime = 120000; - private int resourceRetention = 180000; - private int maxSpareConnections = 10; - public JmsPooledConnectionFactory(ConnectionFactory factory) { this.connFactory = factory; } @@ -94,24 +96,23 @@ public class JmsPooledConnectionFactory implements ConnectionFactory { */ @Override public Connection createConnection() throws JMSException { - String threadKey = "" + Thread.currentThread().getId() + "-" - + Thread.currentThread().getName(); + Thread thread = Thread.currentThread(); JmsPooledConnection conn = null; synchronized (inUseConnections) { - conn = inUseConnections.get(threadKey); + conn = inUseConnections.get(thread); if (conn != null) { JmsConnectionWrapper ref = conn.createReference(); if (ref != null) { statusHandler - .info(threadKey + .info(thread.getName() + " already has a connection in use, returning previous connection thread, references=" + conn.getReferenceCount()); return ref; } else { deadConnections.add(conn); - inUseConnections.remove(threadKey); + inUseConnections.remove(thread); conn = null; } } @@ -121,13 +122,14 @@ public class JmsPooledConnectionFactory implements ConnectionFactory { // check connections by Thread synchronized (pendingConnections) { - wrapper = pendingConnections.remove(threadKey); + wrapper = pendingConnections.remove(thread); } // was retrieved connection valid if (wrapper != null) { conn = wrapper.getPooledObject(); - JmsConnectionWrapper ref = getConnectionWrapper(threadKey, conn); + + JmsConnectionWrapper ref = getConnectionWrapper(conn); if (ref != null) { return ref; @@ -137,51 +139,22 @@ public class JmsPooledConnectionFactory implements ConnectionFactory { } } - // check available connections - boolean keepChecking = true; - - while (keepChecking) { - synchronized (availableConnections) { - wrapper = availableConnections.poll(); - } - - if (wrapper != null) { - conn = wrapper.getPooledObject(); - } else { - keepChecking = false; - } - - if (conn != null) { - // was retrieved connection valid - JmsConnectionWrapper ref = getConnectionWrapper(threadKey, conn); - - if (ref != null) { - return ref; - } else { - deadConnections.add(conn); - conn = null; - } - } - } - // create new connection? if (conn == null) { - conn = new JmsPooledConnection(this); + conn = new JmsPooledConnection(this, thread); } - return getConnectionWrapper(threadKey, conn); + return getConnectionWrapper(conn); } - private JmsConnectionWrapper getConnectionWrapper(String threadKey, - JmsPooledConnection conn) { + private JmsConnectionWrapper getConnectionWrapper(JmsPooledConnection conn) { synchronized (conn.getStateLock()) { if (conn.isValid()) { conn.setState(State.InUse); JmsConnectionWrapper ref = conn.createReference(); if (ref != null) { - conn.setKey(threadKey); synchronized (inUseConnections) { - inUseConnections.put(threadKey, conn); + inUseConnections.put(conn.getThread(), conn); } return ref; } @@ -233,13 +206,13 @@ public class JmsPooledConnectionFactory implements ConnectionFactory { } public void removeConnectionFromPool(JmsPooledConnection conn) { - String threadKey = conn.getKey(); + Thread thread = conn.getThread(); boolean success = false; // remove it from inUseConnections if it was in use, theoretically could // go by connection state, but may miss something due to threading synchronized (inUseConnections) { - JmsPooledConnection inUse = inUseConnections.remove(threadKey); + JmsPooledConnection inUse = inUseConnections.remove(thread); // make sure the one we removed is indeed this connection, 99% // of time this is correct @@ -254,7 +227,7 @@ public class JmsPooledConnectionFactory implements ConnectionFactory { // really only here for bullet proofing code against bad // use of pool if (inUse != null) { - inUseConnections.put(threadKey, inUse); + inUseConnections.put(thread, inUse); } } } @@ -262,29 +235,24 @@ public class JmsPooledConnectionFactory implements ConnectionFactory { // remove it from pendingConnections AvailableJmsPooledObject pooledObj = null; synchronized (pendingConnections) { - pooledObj = pendingConnections.remove(threadKey); + pooledObj = pendingConnections.remove(thread); if (pooledObj != null) { if (pooledObj.getPooledObject() == conn) { // found conn, done return; } else { - pendingConnections.put(threadKey, pooledObj); + pendingConnections.put(thread, pooledObj); } } } - - // remove it from availableConnections - synchronized (availableConnections) { - availableConnections.remove(conn); - } } public boolean returnConnectionToPool(JmsPooledConnection conn) { boolean success = false; - String threadKey = conn.getKey(); + Thread thread = conn.getThread(); synchronized (inUseConnections) { - JmsPooledConnection inUse = inUseConnections.remove(threadKey); + JmsPooledConnection inUse = inUseConnections.remove(thread); // make sure the one we removed is indeed this connection, 99% // of time this is correct @@ -296,7 +264,7 @@ public class JmsPooledConnectionFactory implements ConnectionFactory { // really only here for bullet proofing code against bad // use of pool if (inUse != null) { - inUseConnections.put(threadKey, inUse); + inUseConnections.put(thread, inUse); statusHandler .handle(Priority.INFO, "Another connection already in use for this thread, not returning this connection to pool"); @@ -310,20 +278,17 @@ public class JmsPooledConnectionFactory implements ConnectionFactory { AvailableJmsPooledObject prev = null; synchronized (pendingConnections) { prev = pendingConnections - .put(threadKey, + .put(thread, new AvailableJmsPooledObject( conn)); } - if (prev != null) { + if ((prev != null) && (prev.getPooledObject() != conn)) { // there was a previous connection registered to - // this thread, move it to available + // this thread, close it statusHandler .handle(Priority.WARN, - "Another connection already pooled for this thread, moving previous connection to available"); - prev.reset(); - synchronized (availableConnections) { - availableConnections.add(prev); - } + "Another connection already pooled for this thread, closing previous connection"); + deadConnections.add(prev.getPooledObject()); } } else { success = false; @@ -333,11 +298,11 @@ public class JmsPooledConnectionFactory implements ConnectionFactory { } public void checkPooledResources() { - long curTime = System.currentTimeMillis(); - List> connectionsToProcess = new LinkedList>(); int connectionsClosed = 0; - // grab connections to move from pending to available + long curTime = System.currentTimeMillis(); + + // check for connections to close synchronized (pendingConnections) { Iterator> iter = pendingConnections .values().iterator(); @@ -346,44 +311,22 @@ public class JmsPooledConnectionFactory implements ConnectionFactory { .next(); if (wrapper.expired(curTime, resourceRetention)) { iter.remove(); - connectionsToProcess.add(wrapper); - } - } - } - - synchronized (availableConnections) { - for (AvailableJmsPooledObject wrapper : connectionsToProcess) { - wrapper.reset(); - - // putting to available pool - JmsPooledConnection conn = wrapper.getPooledObject(); - conn.setKey(null); - availableConnections.add(wrapper); - } - } - - connectionsToProcess.clear(); - - synchronized (availableConnections) { - Iterator> iter = availableConnections - .iterator(); - while (iter.hasNext()) { - AvailableJmsPooledObject wrapper = iter - .next(); - // available sessions added based on time, so oldest is front of - // queue - if (wrapper.expired(curTime, connectionHoldTime) - || (availableConnections.size() > maxSpareConnections)) { - // not immediately closing connection so that we minimize - // time in sync block deadConnections.add(wrapper.getPooledObject()); - iter.remove(); - } else { - // connections ordered in reverse order - break; } } + } + // check for dead threads + synchronized (inUseConnections) { + Iterator> iter = inUseConnections + .entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = iter.next(); + if (!entry.getKey().isAlive()) { + iter.remove(); + deadConnections.add(entry.getValue()); + } + } } while (!deadConnections.isEmpty()) { @@ -394,29 +337,29 @@ public class JmsPooledConnectionFactory implements ConnectionFactory { } } - List connectionsToCheck = null; + ArrayList connectionsToCheck = null; synchronized (inUseConnections) { connectionsToCheck = new ArrayList( inUseConnections.values()); } + int resourcesClosed = 0; for (JmsPooledConnection conn : connectionsToCheck) { resourcesClosed += conn.closeOldPooledResources(resourceRetention); } + connectionsToCheck.clear(); // close pooled resources on pending connections synchronized (pendingConnections) { - connectionsToProcess = new ArrayList>( - pendingConnections.values()); + connectionsToCheck.ensureCapacity(pendingConnections.size()); + for (AvailableJmsPooledObject wrapper : pendingConnections + .values()) { + connectionsToCheck.add(wrapper.getPooledObject()); + } } - synchronized (availableConnections) { - connectionsToProcess.addAll(availableConnections); - } - - for (AvailableJmsPooledObject wrapper : connectionsToProcess) { - resourcesClosed += wrapper.getPooledObject() - .closeOldPooledResources(resourceRetention); + for (JmsPooledConnection conn : connectionsToCheck) { + resourcesClosed += conn.closeOldPooledResources(resourceRetention); } if ((connectionsClosed > 0) || (resourcesClosed > 0)) { @@ -429,33 +372,4 @@ public class JmsPooledConnectionFactory implements ConnectionFactory { } } - /** - * @return the connectionHoldTime - */ - public int getConnectionHoldTime() { - return connectionHoldTime; - } - - /** - * @param connectionHoldTime - * the connectionHoldTime to set - */ - public void setConnectionHoldTime(int connectionHoldTime) { - this.connectionHoldTime = connectionHoldTime; - } - - /** - * @return the maxSpareConnections - */ - public int getMaxSpareConnections() { - return maxSpareConnections; - } - - /** - * @param maxSpareConnections - * the maxSpareConnections to set - */ - public void setMaxSpareConnections(int maxSpareConnections) { - this.maxSpareConnections = maxSpareConnections; - } } diff --git a/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledConsumer.java b/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledConsumer.java index f8e3e053fa..0a671ffbd9 100644 --- a/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledConsumer.java +++ b/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledConsumer.java @@ -26,6 +26,8 @@ import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.MessageConsumer; +import org.apache.qpid.client.BasicMessageConsumer; + import com.raytheon.uf.common.jms.wrapper.JmsConsumerWrapper; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; @@ -47,9 +49,10 @@ import com.raytheon.uf.common.status.UFStatus.Priority; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Apr 18, 2011 rjpeter Initial creation - * Mar 08, 2012 194 njensen Improved logging - * Feb 26, 2013 1642 rjpeter Removed lazy initialization + * Apr 18, 2011 rjpeter Initial creation. + * Mar 08, 2012 194 njensen Improved logging. + * Feb 26, 2013 1642 rjpeter Removed lazy initialization. + * Feb 07, 2014 2357 rjpeter Updated logging. * * * @author rjpeter @@ -87,6 +90,14 @@ public class JmsPooledConsumer { this.destKey = destKey; consumer = sess.getSession().createConsumer(destination, messageSelector); + + if (consumer instanceof BasicMessageConsumer) { + statusHandler.info("Creating AMQ consumer " + + ((BasicMessageConsumer) consumer).getDestination() + .getQueueName()); // njensen + } else { + statusHandler.info("Creating consumer " + destKey); // njensen + } } public String getDestKey() { @@ -164,7 +175,13 @@ public class JmsPooledConsumer { if (close) { try { - statusHandler.info("Closing consumer " + destKey); // njensen + if (consumer instanceof BasicMessageConsumer) { + statusHandler.info("Closing AMQ consumer " + + ((BasicMessageConsumer) consumer) + .getDestination().getQueueName()); // njensen + } else { + statusHandler.info("Closing consumer " + destKey); // njensen + } consumer.close(); } catch (Throwable e) { statusHandler.handle(Priority.WARN, "Failed to close consumer " diff --git a/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledProducer.java b/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledProducer.java index e693b74750..445e7fff4a 100644 --- a/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledProducer.java +++ b/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledProducer.java @@ -25,6 +25,9 @@ import java.util.List; import javax.jms.JMSException; import javax.jms.MessageProducer; +import org.apache.qpid.client.AMQDestination; +import org.apache.qpid.client.BasicMessageProducer; + import com.raytheon.uf.common.jms.wrapper.JmsProducerWrapper; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; @@ -46,9 +49,10 @@ import com.raytheon.uf.common.status.UFStatus.Priority; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Apr 18, 2011 rjpeter Initial creation - * Mar 08, 2012 194 njensen Improved logging - * Feb 26, 2013 1642 rjpeter Removed lazy initialization + * Apr 18, 2011 rjpeter Initial creation. + * Mar 08, 2012 194 njensen Improved logging. + * Feb 26, 2013 1642 rjpeter Removed lazy initialization. + * Feb 07, 2014 2357 rjpeter Updated logging. * * * @author rjpeter @@ -84,6 +88,19 @@ public class JmsPooledProducer { this.sess = sess; this.destKey = destKey; this.producer = producer; + if (producer instanceof BasicMessageProducer) { + try { + statusHandler.info("Creating AMQ producer " + + ((AMQDestination) ((BasicMessageProducer) producer) + .getDestination()).getQueueName()); + } catch (Exception e) { + statusHandler + .error("Could not get producer destination for key " + + destKey, e); + } + } else { + statusHandler.info("Creating producer " + destKey); // njensen + } } public String getDestKey() { @@ -161,7 +178,14 @@ public class JmsPooledProducer { if (close) { try { - statusHandler.info("Closing producer " + destKey); // njensen + if (producer instanceof BasicMessageProducer) { + statusHandler + .info("Closing AMQ producer " + + ((AMQDestination) ((BasicMessageProducer) producer) + .getDestination()).getQueueName()); // njensen + } else { + statusHandler.info("Closing producer " + destKey); // njensen + } producer.close(); } catch (Throwable e) { statusHandler.handle(Priority.WARN, "Failed to close producer", diff --git a/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledSession.java b/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledSession.java index d3ad93562e..9c1ce83c72 100644 --- a/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledSession.java +++ b/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/JmsPooledSession.java @@ -44,7 +44,9 @@ import com.raytheon.uf.common.status.UFStatus.Priority; * can be released to the pool. Any exception will close pooled session instead * of returning to the pool. The consumers/producers are tracked in both active * and available states. An available consumer/producer can be reused by the - * next client. + * next client. Once a consumer has been closed the entire session is closed at + * next opportunity since QPID tracks consumers at the session level. Not doing + * this can leave a topic with no consumers on the qpid broker. * * Synchronization Principle To prevent deadlocks: Chained sync blocks can only * happen in a downward direction. A manager has a synchronized lock can make a @@ -60,6 +62,9 @@ import com.raytheon.uf.common.status.UFStatus.Priority; * Apr 15, 2011 rjpeter Initial creation * Mar 08, 2012 194 njensen Improved logging * Feb 21, 2013 1642 rjpeter Fix deadlock scenario + * Jan 26, 2014 2357 rjpeter Close a session when it has no producers or consumers. + * Feb 07, 2014 2357 rjpeter Close session at next return to pool after a + * consumer has closed. * * * @author rjpeter @@ -77,7 +82,7 @@ public class JmsPooledSession { // The thread this session was most recently used by for tracking a pending // session that is being reserved for a given thread. - private String threadKey; + private final Thread thread; private volatile boolean exceptionOccurred = false; @@ -85,6 +90,10 @@ public class JmsPooledSession { private volatile State state = State.InUse; + // flag to stat that session should be closed instead of returned to pool on + // next iteration + private volatile boolean shouldClose = false; + // keeps track of number of creates vs. closes to know when it can be // returned to the pool private final List references = new ArrayList( @@ -101,6 +110,8 @@ public class JmsPooledSession { public JmsPooledSession(JmsPooledConnection conn, Session sess) { this.conn = conn; this.sess = sess; + this.thread = conn.getThread(); + statusHandler.info("Opening session: " + this.toString()); } public long getCreateTime() { @@ -120,12 +131,8 @@ public class JmsPooledSession { return conn; } - public String getThreadKey() { - return threadKey; - } - - public void setThreadKey(String threadKey) { - this.threadKey = threadKey; + public Thread getThread() { + return thread; } public boolean isValid() { @@ -436,6 +443,9 @@ public class JmsPooledSession { String destKey = consumer.getDestKey(); boolean removed = false; + // a consumer was closed, close the session at next opportunity + shouldClose = true; + synchronized (inUseConsumers) { JmsPooledConsumer inUse = inUseConsumers.remove(destKey); removed = inUse == consumer; @@ -462,6 +472,7 @@ public class JmsPooledSession { } if (canClose) { + statusHandler.info("Closing session: " + this.toString()); closePooledConsumersProducers(); // need to close down all wrappers @@ -627,7 +638,7 @@ public class JmsPooledSession { } } - boolean valid = isValid(); + boolean valid = isValid() && !shouldClose && hasProducersOrConsumers(); if (valid && returnToPool) { valid = conn.returnSessionToPool(this); } @@ -654,4 +665,10 @@ public class JmsPooledSession { public Object getStateLock() { return stateLock; } + + public boolean hasProducersOrConsumers() { + return !inUseConsumers.isEmpty() || !inUseProducers.isEmpty() + || !availableConsumers.isEmpty() + || !availableProducers.isEmpty(); + } } diff --git a/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/wrapper/JmsConsumerWrapper.java b/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/wrapper/JmsConsumerWrapper.java index ec978fe7b8..4dd79cc2fa 100644 --- a/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/wrapper/JmsConsumerWrapper.java +++ b/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/wrapper/JmsConsumerWrapper.java @@ -37,8 +37,9 @@ import com.raytheon.uf.common.jms.JmsPooledConsumer; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Apr 18, 2011 rjpeter Initial creation + * Apr 18, 2011 rjpeter Initial creation. * Feb 26, 2013 1642 rjpeter Added volatile references for better concurrency handling. + * Feb 07, 2014 2357 rjpeter Set linked exception in exception handling. * * * @author rjpeter @@ -124,8 +125,11 @@ public class JmsConsumerWrapper implements MessageConsumer { } catch (Throwable e) { exceptionOccurred = true; JMSException exc = new JMSException( - "Exception occurred on pooled consumer"); + "Exception occurred on pooled consumer in getMessageListener"); exc.initCause(e); + if (e instanceof Exception) { + exc.setLinkedException((Exception) e); + } throw exc; } } @@ -144,8 +148,11 @@ public class JmsConsumerWrapper implements MessageConsumer { } catch (Throwable e) { exceptionOccurred = true; JMSException exc = new JMSException( - "Exception occurred on pooled consumer"); + "Exception occurred on pooled consumer in getMessageSelector"); exc.initCause(e); + if (e instanceof Exception) { + exc.setLinkedException((Exception) e); + } throw exc; } } @@ -164,8 +171,11 @@ public class JmsConsumerWrapper implements MessageConsumer { } catch (Throwable e) { exceptionOccurred = true; JMSException exc = new JMSException( - "Exception occurred on pooled consumer"); + "Exception occurred on pooled consumer in receive"); exc.initCause(e); + if (e instanceof Exception) { + exc.setLinkedException((Exception) e); + } throw exc; } } @@ -184,8 +194,11 @@ public class JmsConsumerWrapper implements MessageConsumer { } catch (Throwable e) { exceptionOccurred = true; JMSException exc = new JMSException( - "Exception occurred on pooled consumer"); + "Exception occurred on pooled consumer in receive(timeout)"); exc.initCause(e); + if (e instanceof Exception) { + exc.setLinkedException((Exception) e); + } throw exc; } } @@ -204,8 +217,11 @@ public class JmsConsumerWrapper implements MessageConsumer { } catch (Throwable e) { exceptionOccurred = true; JMSException exc = new JMSException( - "Exception occurred on pooled consumer"); + "Exception occurred on pooled consumer in receiveNoWait"); exc.initCause(e); + if (e instanceof Exception) { + exc.setLinkedException((Exception) e); + } throw exc; } } @@ -226,8 +242,11 @@ public class JmsConsumerWrapper implements MessageConsumer { } catch (Throwable e) { exceptionOccurred = true; JMSException exc = new JMSException( - "Exception occurred on pooled consumer"); + "Exception occurred on pooled consumer in setMessageLister"); exc.initCause(e); + if (e instanceof Exception) { + exc.setLinkedException((Exception) e); + } throw exc; } } diff --git a/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/wrapper/JmsProducerWrapper.java b/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/wrapper/JmsProducerWrapper.java index 5ab53cb6a8..581dd63898 100644 --- a/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/wrapper/JmsProducerWrapper.java +++ b/edexOsgi/com.raytheon.uf.common.jms/src/com/raytheon/uf/common/jms/wrapper/JmsProducerWrapper.java @@ -37,9 +37,10 @@ import com.raytheon.uf.common.jms.JmsPooledProducer; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Dec fi8, 2011 rjpeter Initial creation + * Dec 08, 2011 rjpeter Initial creation. * Feb 26, 2013 1642 rjpeter Added volatile references for better concurrency handling. - * Jun 07, 2013 DR 16316 rjpeter Fix memory leak + * Jun 07, 2013 DR 16316 rjpeter Fix memory leak. + * Feb 07, 2014 2357 rjpeter Set linked exception in exception handling. * * * @author rjpeter @@ -122,6 +123,9 @@ public class JmsProducerWrapper implements MessageProducer { JMSException exc = new JMSException( "Exception occurred on pooled producer"); exc.initCause(e); + if (e instanceof Exception) { + exc.setLinkedException((Exception) e); + } throw exc; } } @@ -142,6 +146,9 @@ public class JmsProducerWrapper implements MessageProducer { JMSException exc = new JMSException( "Exception occurred on pooled producer"); exc.initCause(e); + if (e instanceof Exception) { + exc.setLinkedException((Exception) e); + } throw exc; } } @@ -162,6 +169,9 @@ public class JmsProducerWrapper implements MessageProducer { JMSException exc = new JMSException( "Exception occurred on pooled producer"); exc.initCause(e); + if (e instanceof Exception) { + exc.setLinkedException((Exception) e); + } throw exc; } } @@ -182,6 +192,9 @@ public class JmsProducerWrapper implements MessageProducer { JMSException exc = new JMSException( "Exception occurred on pooled producer"); exc.initCause(e); + if (e instanceof Exception) { + exc.setLinkedException((Exception) e); + } throw exc; } } @@ -202,6 +215,9 @@ public class JmsProducerWrapper implements MessageProducer { JMSException exc = new JMSException( "Exception occurred on pooled producer"); exc.initCause(e); + if (e instanceof Exception) { + exc.setLinkedException((Exception) e); + } throw exc; } } @@ -222,6 +238,9 @@ public class JmsProducerWrapper implements MessageProducer { JMSException exc = new JMSException( "Exception occurred on pooled producer"); exc.initCause(e); + if (e instanceof Exception) { + exc.setLinkedException((Exception) e); + } throw exc; } } @@ -242,6 +261,9 @@ public class JmsProducerWrapper implements MessageProducer { JMSException exc = new JMSException( "Exception occurred on pooled producer"); exc.initCause(e); + if (e instanceof Exception) { + exc.setLinkedException((Exception) e); + } throw exc; } } @@ -264,6 +286,9 @@ public class JmsProducerWrapper implements MessageProducer { JMSException exc = new JMSException( "Exception occurred on pooled producer"); exc.initCause(e); + if (e instanceof Exception) { + exc.setLinkedException((Exception) e); + } throw exc; } } @@ -285,6 +310,9 @@ public class JmsProducerWrapper implements MessageProducer { JMSException exc = new JMSException( "Exception occurred on pooled producer"); exc.initCause(e); + if (e instanceof Exception) { + exc.setLinkedException((Exception) e); + } throw exc; } } @@ -309,6 +337,9 @@ public class JmsProducerWrapper implements MessageProducer { JMSException exc = new JMSException( "Exception occurred on pooled producer"); exc.initCause(e); + if (e instanceof Exception) { + exc.setLinkedException((Exception) e); + } throw exc; } } @@ -329,6 +360,9 @@ public class JmsProducerWrapper implements MessageProducer { JMSException exc = new JMSException( "Exception occurred on pooled producer"); exc.initCause(e); + if (e instanceof Exception) { + exc.setLinkedException((Exception) e); + } throw exc; } } @@ -349,6 +383,9 @@ public class JmsProducerWrapper implements MessageProducer { JMSException exc = new JMSException( "Exception occurred on pooled producer"); exc.initCause(e); + if (e instanceof Exception) { + exc.setLinkedException((Exception) e); + } throw exc; } } @@ -369,6 +406,9 @@ public class JmsProducerWrapper implements MessageProducer { JMSException exc = new JMSException( "Exception occurred on pooled producer"); exc.initCause(e); + if (e instanceof Exception) { + exc.setLinkedException((Exception) e); + } throw exc; } } @@ -389,6 +429,9 @@ public class JmsProducerWrapper implements MessageProducer { JMSException exc = new JMSException( "Exception occurred on pooled producer"); exc.initCause(e); + if (e instanceof Exception) { + exc.setLinkedException((Exception) e); + } throw exc; } } @@ -409,6 +452,9 @@ public class JmsProducerWrapper implements MessageProducer { JMSException exc = new JMSException( "Exception occurred on pooled producer"); exc.initCause(e); + if (e instanceof Exception) { + exc.setLinkedException((Exception) e); + } throw exc; } } diff --git a/edexOsgi/com.raytheon.uf.edex.activetable/res/spring/activetable-common.xml b/edexOsgi/com.raytheon.uf.edex.activetable/res/spring/activetable-common.xml index 403e49cd4b..9e9dde3cac 100644 --- a/edexOsgi/com.raytheon.uf.edex.activetable/res/spring/activetable-common.xml +++ b/edexOsgi/com.raytheon.uf.edex.activetable/res/spring/activetable-common.xml @@ -15,17 +15,6 @@
- - - - - - - - - @@ -46,7 +35,7 @@ - + diff --git a/edexOsgi/com.raytheon.uf.edex.activetable/res/spring/activetable-ingest.xml b/edexOsgi/com.raytheon.uf.edex.activetable/res/spring/activetable-ingest.xml index 0d6e84d11e..434c097ac8 100644 --- a/edexOsgi/com.raytheon.uf.edex.activetable/res/spring/activetable-ingest.xml +++ b/edexOsgi/com.raytheon.uf.edex.activetable/res/spring/activetable-ingest.xml @@ -25,8 +25,8 @@ - - + + java.lang.Throwable diff --git a/edexOsgi/com.raytheon.uf.edex.archive/src/com/raytheon/uf/edex/archive/DatabaseArchiveProcessor.java b/edexOsgi/com.raytheon.uf.edex.archive/src/com/raytheon/uf/edex/archive/DatabaseArchiveProcessor.java index 8c81d43e9c..646061083c 100644 --- a/edexOsgi/com.raytheon.uf.edex.archive/src/com/raytheon/uf/edex/archive/DatabaseArchiveProcessor.java +++ b/edexOsgi/com.raytheon.uf.edex.archive/src/com/raytheon/uf/edex/archive/DatabaseArchiveProcessor.java @@ -77,6 +77,7 @@ import com.raytheon.uf.edex.database.processor.IDatabaseProcessor; * Dec 10, 2013 2555 rjpeter Initial creation. * Jan 23, 2014 2555 rjpeter Updated to be a row at a time using ScrollableResults. * Feb 04, 2014 2770 rferrel The dumpPdos now dumps all PluginDataObjects. + * Feb 12, 2014 2784 rjpeter Update logging for dup elim scenarios. * * * @author rjpeter @@ -194,6 +195,7 @@ public class DatabaseArchiveProcessor> if (entriesInMemory > 0) { try { savePdoMap(pdosByFile); + pdosByFile.clear(); int prev = recordsSaved; recordsSaved += entriesInMemory; statusHandler.info(pluginName + ": Processed rows " + prev @@ -436,74 +438,93 @@ public class DatabaseArchiveProcessor> } List> pdosFromDisk = readDataFromDisk(dataFile); - if (statusHandler.isPriorityEnabled(Priority.DEBUG)) { - statusHandler.debug(pluginName + ": Checking " - + pdosFromDisk.size() + " old records from file: " - + dataFile.getAbsolutePath()); - } - Iterator> pdoIter = pdosFromDisk - .iterator(); - boolean needsUpdate = false; - int dupsRemoved = 0; - int index = 0; - while (pdoIter.hasNext() && (index < dupElimUntil)) { - PersistableDataObject pdo = pdoIter.next(); - - if (identifierSet.contains(pdo.getIdentifier())) { - pdoIter.remove(); - needsUpdate = true; - dupsRemoved++; - } - - index++; - } - - if (statusHandler.isPriorityEnabled(Priority.DEBUG) - && (dupsRemoved > 0)) { - statusHandler.debug(pluginName + ": Removed " + dupsRemoved - + " old records from file: " - + dataFile.getAbsolutePath()); - } - - if (!fileIter.hasNext() && (pdosFromDisk.size() < fetchSize)) { - // last file, add more data to it - needsUpdate = true; - - if (prevFileStatus == null) { - prevFileStatus = new FileStatus(); - prevFileStatus.dupElimUntilIndex = pdosFromDisk.size(); - prevFileStatus.fileFull = pdos.size() >= fetchSize; - filesCreatedThisSession.put(dataFile.getAbsolutePath(), - prevFileStatus); - } - - int numToAdd = fetchSize - pdosFromDisk.size(); - numToAdd = Math.min(numToAdd, pdos.size()); - + if (pdosFromDisk.size() > 0) { if (statusHandler.isPriorityEnabled(Priority.DEBUG)) { - statusHandler.debug(pluginName + ": Adding " + numToAdd - + " records to file: " + statusHandler.debug(pluginName + ": Checking " + + pdosFromDisk.size() + + " old records from file: " + dataFile.getAbsolutePath()); } - pdosFromDisk.addAll(pdos.subList(0, numToAdd)); - if (numToAdd < pdos.size()) { - pdos = pdos.subList(numToAdd, pdos.size()); - } else { - pdos = Collections.emptyList(); - } - } + Iterator> pdoIter = pdosFromDisk + .iterator(); + int dupsRemoved = 0; + int index = 0; + boolean needsUpdate = false; - if (needsUpdate) { - if (!pdosFromDisk.isEmpty()) { - writeDataToDisk(dataFile, pdosFromDisk); - if (prevFileStatus != null) { - prevFileStatus.fileFull = pdosFromDisk.size() >= fetchSize; + while (pdoIter.hasNext() && (index < dupElimUntil)) { + PersistableDataObject pdo = pdoIter.next(); + + if (identifierSet.contains(pdo.getIdentifier())) { + pdoIter.remove(); + needsUpdate = true; + dupsRemoved++; + } + + index++; + } + + if (dupsRemoved > 0) { + statusHandler.info(pluginName + ": Removed " + + dupsRemoved + " old records from file: " + + dataFile.getAbsolutePath()); + } + + if (!fileIter.hasNext() + && (pdosFromDisk.size() < fetchSize)) { + // last file, add more data to it + needsUpdate = true; + + if (prevFileStatus == null) { + prevFileStatus = new FileStatus(); + prevFileStatus.dupElimUntilIndex = pdosFromDisk + .size(); + prevFileStatus.fileFull = pdos.size() >= fetchSize; + filesCreatedThisSession.put( + dataFile.getAbsolutePath(), prevFileStatus); + } + + int numToAdd = fetchSize - pdosFromDisk.size(); + numToAdd = Math.min(numToAdd, pdos.size()); + + if (statusHandler.isPriorityEnabled(Priority.DEBUG)) { + statusHandler.debug(pluginName + ": Adding " + + numToAdd + " records to file: " + + dataFile.getAbsolutePath()); + } + + pdosFromDisk.addAll(pdos.subList(0, numToAdd)); + if (numToAdd < pdos.size()) { + pdos = pdos.subList(numToAdd, pdos.size()); + } else { + pdos = Collections.emptyList(); + } + } + + if (needsUpdate) { + if (!pdosFromDisk.isEmpty()) { + writeDataToDisk(dataFile, pdosFromDisk); + if (prevFileStatus != null) { + prevFileStatus.fileFull = pdosFromDisk.size() >= fetchSize; + } + } else { + + dirsToCheckNumbering.add(dataFile.getParentFile()); + if (dataFile.exists() && !dataFile.delete()) { + statusHandler + .error(pluginName + + ": Failed to delete file [" + + dataFile.getAbsolutePath() + + "], all entries have been updated in later files."); + if (!dataFile.renameTo(new File(dataFile + .getAbsoluteFile() + ".bad"))) { + statusHandler.error(pluginName + ": file [" + + dataFile.getAbsoluteFile() + + "] cannot be renamed to .bad"); + } + } + fileIter.remove(); } - } else { - dirsToCheckNumbering.add(dataFile.getParentFile()); - dataFile.delete(); - fileIter.remove(); } } } @@ -543,7 +564,13 @@ public class DatabaseArchiveProcessor> } finally { if (!successful) { // couldn't read in file, move it to bad - file.renameTo(new File(file.getAbsoluteFile() + ".bad")); + if (file.exists() + && !file.renameTo(new File(file.getAbsoluteFile() + + ".bad"))) { + statusHandler.error(pluginName + ": file [" + + file.getAbsoluteFile() + + "] cannot be renamed to .bad"); + } } if (is != null) { try { @@ -668,8 +695,9 @@ public class DatabaseArchiveProcessor> writer = new BufferedWriter(new FileWriter(dumpFile)); if (statusHandler.isPriorityEnabled(Priority.INFO)) { - statusHandler.info(String.format("%s: Dumping records to: %s", - pluginName, dumpFile.getAbsolutePath())); + statusHandler.info(String.format("%s: Dumping " + pdos.size() + + " records to: %s", pluginName, + dumpFile.getAbsolutePath())); } while (pdoIter.hasNext()) { @@ -753,6 +781,8 @@ public class DatabaseArchiveProcessor> } while (size > 0); DecimalFormat format = new DecimalFormat(formatString.toString()); + statusHandler.info("Checking file numbering consistency for " + + dir.getAbsolutePath()); for (Map.Entry entry : fileMap.entrySet()) { int fileNum = entry.getKey(); @@ -771,7 +801,15 @@ public class DatabaseArchiveProcessor> } File newFile = new File(oldFile.getParent(), newFileName); - oldFile.renameTo(newFile); + if (!oldFile.renameTo(newFile)) { + statusHandler + .error("Failed rename file " + + oldFile.getAbsolutePath() + + " to " + + newFile.getAbsolutePath() + + ". Stopping file number consistency checking."); + return; + } } nextFileCount++; diff --git a/edexOsgi/com.raytheon.uf.edex.archive/src/com/raytheon/uf/edex/archive/DatabaseArchiver.java b/edexOsgi/com.raytheon.uf.edex.archive/src/com/raytheon/uf/edex/archive/DatabaseArchiver.java index f9a4e8af2c..70cae04fdf 100644 --- a/edexOsgi/com.raytheon.uf.edex.archive/src/com/raytheon/uf/edex/archive/DatabaseArchiver.java +++ b/edexOsgi/com.raytheon.uf.edex.archive/src/com/raytheon/uf/edex/archive/DatabaseArchiver.java @@ -58,6 +58,7 @@ import com.raytheon.uf.edex.database.plugin.PluginFactory; * Nov 05, 2013 2499 rjpeter Repackaged, removed config files, always compresses hdf5. * Nov 11, 2013 2478 rjpeter Updated data store copy to always copy hdf5. * Dec 13, 2013 2555 rjpeter Refactored logic into DatabaseArchiveProcessor. + * Feb 12, 2014 2784 rjpeter Fixed clusterLock to not update the time by default. * * * @author rjpeter @@ -145,14 +146,16 @@ public class DatabaseArchiver implements IPluginArchiver { // cluster lock, grabbing time of last successful archive CurrentTimeClusterLockHandler lockHandler = new CurrentTimeClusterLockHandler( - CLUSTER_LOCK_TIMEOUT, dateFormat.format(runTime.getTime()), - false); + CLUSTER_LOCK_TIMEOUT, false); ClusterTask ct = ClusterLockUtils.lock(TASK_NAME, pluginName, lockHandler, false); if (!LockState.SUCCESSFUL.equals(ct.getLockState())) { return true; } + // keep extra info the same until processing updates the time. + lockHandler.setExtraInfo(ct.getExtraInfo()); + Calendar startTime = null; long timimgStartMillis = System.currentTimeMillis(); int recordCount = 0; @@ -226,12 +229,6 @@ public class DatabaseArchiver implements IPluginArchiver { .info(pluginName + ": Found no records to archive"); } } catch (Throwable e) { - // previous run time needs to be reset - if (startTime != null) { - lockHandler - .setExtraInfo(dateFormat.format(startTime.getTime())); - } - statusHandler.error(pluginName + ": Error occurred archiving data", e); } finally { diff --git a/edexOsgi/com.raytheon.uf.edex.cpgsrv/res/spring/cpgsrv-spring.xml b/edexOsgi/com.raytheon.uf.edex.cpgsrv/res/spring/cpgsrv-spring.xml index 69c5a9e7f6..f7dbf3e5ca 100644 --- a/edexOsgi/com.raytheon.uf.edex.cpgsrv/res/spring/cpgsrv-spring.xml +++ b/edexOsgi/com.raytheon.uf.edex.cpgsrv/res/spring/cpgsrv-spring.xml @@ -26,7 +26,7 @@ autoStartup="false"> - + diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.harvester/res/spring/harvester-datadelivery.xml b/edexOsgi/com.raytheon.uf.edex.datadelivery.harvester/res/spring/harvester-datadelivery.xml index d231a27f79..cd4b4a859d 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.harvester/res/spring/harvester-datadelivery.xml +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.harvester/res/spring/harvester-datadelivery.xml @@ -3,21 +3,6 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> - - - - - - - - - - - - - @@ -29,11 +14,11 @@ errorHandlerRef="errorHandler"> - + - + diff --git a/edexOsgi/com.raytheon.uf.edex.distribution/res/spring/distribution-spring.xml b/edexOsgi/com.raytheon.uf.edex.distribution/res/spring/distribution-spring.xml index 018a905229..38cd142db1 100644 --- a/edexOsgi/com.raytheon.uf.edex.distribution/res/spring/distribution-spring.xml +++ b/edexOsgi/com.raytheon.uf.edex.distribution/res/spring/distribution-spring.xml @@ -8,19 +8,6 @@ - - - - - - - - - - - - + @@ -40,7 +27,7 @@ - + @@ -51,7 +38,7 @@ - + diff --git a/edexOsgi/com.raytheon.uf.edex.esb.camel/src/com/raytheon/uf/edex/esb/camel/jms/DedicatedThreadJmsComponent.java b/edexOsgi/com.raytheon.uf.edex.esb.camel/src/com/raytheon/uf/edex/esb/camel/jms/DedicatedThreadJmsComponent.java new file mode 100644 index 0000000000..978efdac8f --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.esb.camel/src/com/raytheon/uf/edex/esb/camel/jms/DedicatedThreadJmsComponent.java @@ -0,0 +1,101 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.uf.edex.esb.camel.jms; + +import java.util.Map; + +import org.apache.camel.Endpoint; +import org.apache.camel.component.jms.JmsComponent; +import org.apache.camel.component.jms.JmsEndpoint; + +import com.raytheon.uf.edex.esb.camel.spring.JmsThreadPoolTaskExecutor; + +/** + * Custom JMS component that makes dedicated thread pools for each JmsEndpoint + * based on the concurrent consumers needed. Each pool is named based on the JMS + * endpoint. Each endpoint also overrides the message listener container factory + * to monitor the created containers to see if they need to be restarted in a + * disconnect scenario. + * + *
+ * 
+ * SOFTWARE HISTORY
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Feb 07, 2014 2357       rjpeter     Initial creation.
+ * 
+ * + * @author rjpeter + * @version 1.0 + */ +public class DedicatedThreadJmsComponent extends JmsComponent { + + public DedicatedThreadJmsComponent( + org.apache.camel.component.jms.JmsConfiguration jmsconfig) { + super(jmsconfig); + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.camel.component.jms.JmsComponent#createEndpoint(java.lang. + * String, java.lang.String, java.util.Map) + */ + @Override + protected Endpoint createEndpoint(String uri, String remaining, + Map parameters) throws Exception { + String threadName = (String) parameters.remove("threadName"); + Endpoint e = super.createEndpoint(uri, remaining, parameters); + if (e instanceof JmsEndpoint) { + JmsEndpoint jmsE = (JmsEndpoint) e; + if ((threadName != null) && (threadName.length() > 0) + && !threadName.endsWith("-")) { + threadName += "-"; + } else { + threadName = jmsE.getDestinationName() + "-"; + } + /* + * This is used for a SimpleMessageListenerContainer use case. + * + * JmsSimpleMessageListenerTaskExecutor executor = new + * JmsSimpleMessageListenerTaskExecutor( + * jmsE.getConcurrentConsumers(), threadName); + */ + // DefaultMessageListenerContainer use case + JmsThreadPoolTaskExecutor executor = new JmsThreadPoolTaskExecutor(); + executor.setThreadNamePrefix(threadName); + executor.setCorePoolSize(jmsE.getConcurrentConsumers()); + executor.setMaxPoolSize(Math.max(jmsE.getConcurrentConsumers(), + jmsE.getMaxConcurrentConsumers())); + executor.setQueueCapacity(0); + executor.afterPropertiesSet(); + + jmsE.setTaskExecutor(executor); + jmsE.setMessageListenerContainerFactory(MonitoredDefaultMessageListenerContainerFactory + .getInstance()); + + return jmsE; + } + throw new Exception( + "JmsComponent did not create a JmsEnpoint. Check Camel Jms Override"); + } + +} diff --git a/edexOsgi/com.raytheon.uf.edex.esb.camel/src/com/raytheon/uf/edex/esb/camel/jms/MonitoredDefaultMessageListenerContainerFactory.java b/edexOsgi/com.raytheon.uf.edex.esb.camel/src/com/raytheon/uf/edex/esb/camel/jms/MonitoredDefaultMessageListenerContainerFactory.java new file mode 100644 index 0000000000..074c2a0377 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.esb.camel/src/com/raytheon/uf/edex/esb/camel/jms/MonitoredDefaultMessageListenerContainerFactory.java @@ -0,0 +1,142 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.uf.edex.esb.camel.jms; + +import java.util.Collection; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicInteger; + +import org.apache.camel.component.jms.DefaultJmsMessageListenerContainer; +import org.apache.camel.component.jms.JmsEndpoint; +import org.apache.camel.component.jms.MessageListenerContainerFactory; +import org.springframework.jms.listener.AbstractMessageListenerContainer; +import org.springframework.jms.listener.DefaultMessageListenerContainer; + +import com.raytheon.uf.common.status.IUFStatusHandler; +import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.common.time.util.TimeUtil; +import com.raytheon.uf.edex.core.EDEXUtil; + +/** + * Creates DefaultMessageListenerContainer instances that are then monitored + * once a minute for paused tasks. If a paused task is found the container is + * restarted. This is necessary in broker restart scenarios. + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Feb 8, 2014  2357      rjpeter     Initial creation.
+ * 
+ * + * @author rjpeter + * @version 1.0 + */ +public class MonitoredDefaultMessageListenerContainerFactory implements + MessageListenerContainerFactory { + private static final AtomicInteger threadCount = new AtomicInteger(1); + + private final Collection containers = new ConcurrentLinkedQueue(); + + private final IUFStatusHandler statusHandler = UFStatus + .getHandler(MonitoredDefaultMessageListenerContainerFactory.class); + + private static final MonitoredDefaultMessageListenerContainerFactory instance = new MonitoredDefaultMessageListenerContainerFactory(); + + public static MonitoredDefaultMessageListenerContainerFactory getInstance() { + return instance; + } + + private MonitoredDefaultMessageListenerContainerFactory() { + Thread containerChecker = new Thread("MessageListenerContainerMonitor-" + + threadCount.getAndIncrement()) { + /* + * (non-Javadoc) + * + * @see java.lang.Thread#run() + */ + @Override + public void run() { + while (!EDEXUtil.isRunning()) { + try { + Thread.sleep(TimeUtil.MILLIS_PER_MINUTE); + } catch (InterruptedException e) { + // ignore + } + } + + while (true) { + try { + for (DefaultMessageListenerContainer container : containers) { + if (container.getPausedTaskCount() > 0) { + StringBuilder msg = new StringBuilder(160); + msg.append("Container[") + .append(container.getDestinationName()) + .append("] has paused tasks. Container is "); + if (!container.isRunning()) { + msg.append("not "); + } + msg.append("running. Container is "); + if (container.isActive()) { + msg.append("not "); + } + msg.append("active. Restarting container."); + statusHandler.warn(msg.toString()); + container.start(); + } + } + + try { + Thread.sleep(TimeUtil.MILLIS_PER_MINUTE); + } catch (InterruptedException e) { + // ignore + } + } catch (Throwable e) { + statusHandler + .error("Error occurred in checking message listener containers", + e); + } + } + } + }; + containerChecker.start(); + } + + /* + * (non-Javadoc) + * + * @see org.apache.camel.component.jms.MessageListenerContainerFactory# + * createMessageListenerContainer + * (org.apache.camel.component.jms.JmsEndpoint) + */ + @Override + public AbstractMessageListenerContainer createMessageListenerContainer( + JmsEndpoint endpoint) { + // track the container for monitoring in the case of a provider + // reconnect + DefaultJmsMessageListenerContainer container = new DefaultJmsMessageListenerContainer( + endpoint); + containers.add(container); + return container; + } + +} diff --git a/edexOsgi/com.raytheon.uf.edex.grid.staticdata/res/spring/grid-staticdata-process.xml b/edexOsgi/com.raytheon.uf.edex.grid.staticdata/res/spring/grid-staticdata-process.xml index 8db9b3d210..5bdf3a1eab 100644 --- a/edexOsgi/com.raytheon.uf.edex.grid.staticdata/res/spring/grid-staticdata-process.xml +++ b/edexOsgi/com.raytheon.uf.edex.grid.staticdata/res/spring/grid-staticdata-process.xml @@ -12,7 +12,7 @@ - + diff --git a/edexOsgi/com.raytheon.uf.edex.ohd/res/spring/DPADecoder-spring.xml b/edexOsgi/com.raytheon.uf.edex.ohd/res/spring/DPADecoder-spring.xml index e5e7eff311..e926100e28 100644 --- a/edexOsgi/com.raytheon.uf.edex.ohd/res/spring/DPADecoder-spring.xml +++ b/edexOsgi/com.raytheon.uf.edex.ohd/res/spring/DPADecoder-spring.xml @@ -9,13 +9,13 @@ - + - + - + - + - + + + + + + + com.raytheon.edex.plugin.shef + + + + + + + file:///${edex.home}/conf/db/hibernateConfig/ihfs/hibernate.cfg.xml + + + + + + + + + + + + + file:///${edex.home}/conf/db/hibernateConfig/damCatalog/hibernate.cfg.xml + + + + + + + \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.edex.ohd/res/spring/ohd-common.xml b/edexOsgi/com.raytheon.uf.edex.ohd/res/spring/ohd-common.xml index a87ebe243a..c9553e670e 100644 --- a/edexOsgi/com.raytheon.uf.edex.ohd/res/spring/ohd-common.xml +++ b/edexOsgi/com.raytheon.uf.edex.ohd/res/spring/ohd-common.xml @@ -1,42 +1,6 @@ - - - - - - com.raytheon.edex.plugin.shef - - - - - - - file:///${edex.home}/conf/db/hibernateConfig/ihfs/hibernate.cfg.xml - - - - - - - - - - - - - file:///${edex.home}/conf/db/hibernateConfig/damCatalog/hibernate.cfg.xml - - - - - - diff --git a/edexOsgi/com.raytheon.uf.edex.ohd/res/spring/q2FileProcessor-spring.xml b/edexOsgi/com.raytheon.uf.edex.ohd/res/spring/q2FileProcessor-spring.xml index 4c90c7a7f8..b7840916b5 100644 --- a/edexOsgi/com.raytheon.uf.edex.ohd/res/spring/q2FileProcessor-spring.xml +++ b/edexOsgi/com.raytheon.uf.edex.ohd/res/spring/q2FileProcessor-spring.xml @@ -8,7 +8,7 @@ - + - + diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.acars/res/spring/acars-ingest.xml b/edexOsgi/com.raytheon.uf.edex.plugin.acars/res/spring/acars-ingest.xml index 3970913f1b..e89bd76d0a 100644 --- a/edexOsgi/com.raytheon.uf.edex.plugin.acars/res/spring/acars-ingest.xml +++ b/edexOsgi/com.raytheon.uf.edex.plugin.acars/res/spring/acars-ingest.xml @@ -10,7 +10,7 @@ - + - + - + - + - + - + - + - + - + - + diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.loctables/res/spring/loctables-spring.xml b/edexOsgi/com.raytheon.uf.edex.plugin.loctables/res/spring/loctables-spring.xml index 761d2fdf82..18bd451570 100644 --- a/edexOsgi/com.raytheon.uf.edex.plugin.loctables/res/spring/loctables-spring.xml +++ b/edexOsgi/com.raytheon.uf.edex.plugin.loctables/res/spring/loctables-spring.xml @@ -24,7 +24,7 @@ - + - + - + - + - - - - - - - - - - + - + diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.satellite.mcidas/res/spring/satellite-mcidas-ingest.xml b/edexOsgi/com.raytheon.uf.edex.plugin.satellite.mcidas/res/spring/satellite-mcidas-ingest.xml index 43c3f88bdf..988a5a7b45 100644 --- a/edexOsgi/com.raytheon.uf.edex.plugin.satellite.mcidas/res/spring/satellite-mcidas-ingest.xml +++ b/edexOsgi/com.raytheon.uf.edex.plugin.satellite.mcidas/res/spring/satellite-mcidas-ingest.xml @@ -3,26 +3,14 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> - - - - - - - - - - - - - + + + @@ -35,7 +23,7 @@ - + satellite-mcidas diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.svrwx/res/spring/svrwx-ingest.xml b/edexOsgi/com.raytheon.uf.edex.plugin.svrwx/res/spring/svrwx-ingest.xml index 09021bf61e..58689cd836 100644 --- a/edexOsgi/com.raytheon.uf.edex.plugin.svrwx/res/spring/svrwx-ingest.xml +++ b/edexOsgi/com.raytheon.uf.edex.plugin.svrwx/res/spring/svrwx-ingest.xml @@ -10,7 +10,7 @@ - + - + - + - + - * - * This code has been developed by the SIB for use in the AWIPS2 system. - */ - package gov.noaa.nws.ncep.common.dataplugin.airmet; import java.util.Calendar; @@ -53,6 +24,37 @@ import com.raytheon.uf.common.dataplugin.annotations.DataURI; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; +/** + * AirmetRecord + * + * This java class performs the mapping to the database table for AIRMET + * + *
+ * HISTORY
+ * 
+ * Date         Author      Description
+ * ------------ ----------  ----------- --------------------------
+ * 05/2009      L. Lin      Initial creation    
+ * 
+ * This code has been developed by the SIB for use in the AWIPS2 system.
+ * 
+ * Date         Ticket#         Engineer    Description
+ * ------------ ----------      ----------- --------------------------
+ * 05/2009      39              L. Lin      Initial coding
+ * 07/2009      39              L. Lin      Migration to TO11
+ * 09/2011                      Chin Chen   changed to improve purge performance and
+ *                                          removed xml serialization as well
+ * Apr 4, 2013        1846 bkowal      Added an index on refTime and forecastTime
+ * Apr 12, 2013       1857 bgonzale         Added SequenceGenerator annotation.
+ * May 07, 2013 1869            bsteffen    Remove dataURI column from
+ *                                          PluginDataObject.
+ * Feb 11, 2014 2784            rferrel     Remove override of setIdentifier.
+ * 
+ * 
+ * + * This code has been developed by the SIB for use in the AWIPS2 system. + */ + @Entity @SequenceGenerator(initialValue = 1, name = PluginDataObject.ID_GEN, sequenceName = "airmetseq") @Table(name = "airmet", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) @@ -319,24 +321,6 @@ public class AirmetRecord extends PluginDataObject { */ public void addAirmetReport(AirmetReport curReport) { airmetReport.add(curReport); - // curReport.setParentID(this); - } - - /** - * Override existing set method to modify any classes that use the dataURI - * as a foreign key - */ - @Override - public void setIdentifier(Object dataURI) { - - this.identifier = dataURI; - /* - * if(this.getAirmetReport() != null && this.getAirmetReport().size() > - * 0) { for (Iterator iter = - * this.getAirmetReport().iterator(); iter.hasNext();) { AirmetReport cs - * = iter.next(); cs.setParentID(this); } } - */ - } @Override diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.aww/src/gov/noaa/nws/ncep/common/dataplugin/aww/AwwRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.aww/src/gov/noaa/nws/ncep/common/dataplugin/aww/AwwRecord.java index 61e7aecdb9..9c14f7cdbb 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.aww/src/gov/noaa/nws/ncep/common/dataplugin/aww/AwwRecord.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.aww/src/gov/noaa/nws/ncep/common/dataplugin/aww/AwwRecord.java @@ -1,38 +1,3 @@ -/** - * AwwRecord - * - * This java class performs the mapping to the database tables for AWW. - * - * HISTORY - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 12/2008 38 L. Lin Initial coding - * 04/2009 38 L. Lin Convert to TO10. - * 07/2009 38 L. Lin Migration to TO11 - * 05/2010 38 L. Lin Migration to TO11DR11 - * 01/11/2011 N/A M. Gao Add mndTime as the 5th element to construct - * dataUri value that is used as a unique constraint - * when the aww record is inserted into relational DB - * The reason mndTime is used is because the combination - * of original 4 elements is not unique in some scenarios. - * 01/26/2011 N/A M. Gao Add designatorBBB as the 6th (No.4) element to construct - * dataUri value that is used as a unique constraint - * when the aww record is inserted into relational DB - * The reason mndTime is used is because the combination - * of original 5 elements is not unique in some scenarios. - * 09/2011 Chin Chen changed to improve purge performance and - * removed xml serialization as well - * Apr 4, 2013 1846 bkowal Added an index on refTime and forecastTime - * Apr 12, 2013 1857 bgonzale Added SequenceGenerator annotation. - * May 07, 2013 1869 bsteffen Remove dataURI column from - * PluginDataObject. - * July 29, 2013 1028 ghull add AwwReportType enum - * - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - */ package gov.noaa.nws.ncep.common.dataplugin.aww; import java.util.Calendar; @@ -59,6 +24,43 @@ import com.raytheon.uf.common.dataplugin.annotations.DataURI; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; +/** + * AwwRecord + * + * This java class performs the mapping to the database tables for AWW. + * + * SOFTWARE HISTORY + * + *
+ * Date         Ticket#         Engineer    Description
+ * ------------ ----------      ----------- --------------------------
+ * 12/2008      38              L. Lin      Initial coding
+ * 04/2009      38              L. Lin      Convert to TO10.
+ * 07/2009      38              L. Lin      Migration to TO11
+ * 05/2010      38              L. Lin      Migration to TO11DR11
+ * 01/11/2011   N/A             M. Gao      Add mndTime as the 5th element to construct 
+ *                                          dataUri value that is used as a unique constraint 
+ *                                          when the aww record is inserted into relational DB
+ *                                          The reason mndTime is used is because the combination 
+ *                                          of original 4 elements is not unique in some scenarios.                                       
+ * 01/26/2011   N/A             M. Gao      Add designatorBBB as the 6th (No.4) element to construct 
+ *                                          dataUri value that is used as a unique constraint 
+ *                                          when the aww record is inserted into relational DB
+ *                                          The reason mndTime is used is because the combination 
+ *                                          of original 5 elements is not unique in some scenarios.                                       
+ * 09/2011                      Chin Chen   changed to improve purge performance and
+ *                                          removed xml serialization as well
+ * Apr 4, 2013        1846 bkowal      Added an index on refTime and forecastTime
+ * Apr 12, 2013 1857            bgonzale    Added SequenceGenerator annotation.
+ * May 07, 2013 1869            bsteffen    Remove dataURI column from
+ *                                          PluginDataObject.
+ * July 29, 2013 1028           ghull       add AwwReportType enum
+ * Feb 11, 2014 2784            rferrel     Remove override of setIdentifier.
+ * 
+ * 
+ * + * This code has been developed by the SIB for use in the AWIPS2 system. + */ @Entity @SequenceGenerator(initialValue = 1, name = PluginDataObject.ID_GEN, sequenceName = "awwseq") @Table(name = "aww", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) @@ -86,68 +88,42 @@ public class AwwRecord extends PluginDataObject { * REPORT 27. HIGH WIND WARNING 28. FREEZE WARNING 29. ADVERTENCIA DE * INUNDACIONES 30. HYDROLOGIC STATEMENT 31. URGENT WEATHER MESSAGE */ - public static enum AwwReportType { - SEVERE_THUNDERSTORM_WARNING, - SEVERE_THUNDERSTORM_WATCH, - TORNADO_WARNING, - TORNADO_WATCH, - SEVERE_THUNDERSTORM_OUTLINE_UPDATE, - TORNADO_WATCH_OUTLINE_UPDATE, - FLASH_FLOOD_WARNING, - FLASH_FLOOD_WATCH, - FLOOD_WARNING, - FLOOD_WATCH, - FLOOD_STATEMENT, - // WINTER STORM. something is getting decoded as WINTER STORM - WINTER_STORM_WARNING, - WINTER_STORM_WATCH, - WATCH_COUNTY_NOTIFICATION, - SEVERE_WEATHER_STATEMENT, - WIND_ADVISORY, // ?WIND CHILL ADVISORY? - // WIND CHILL ADVISORYs getting decoded as "ADVISORY" - FOG_ADVISORY, - HEAT_ADVISORY, - FROST_ADVISORY, - SMOKE_ADVISORY, - WEATHER_ADVISORY, - WINTER_WEATHER_ADVISORY, - SIGNIGICANT_WEATHER_ADVISORY, - SPECIAL_WEATHER_STATEMENT, - RED_FLAG_WARNING, - TORNADO_REPORT, - HIGH_WIND_WARNING, - FREEZE_WARNING, - ADVERTENCIA_DE_INUNDACIONES, - HYDROLOGIC_STATEMENT, - URGENT_WEATHER_MESSAGE, - UNKNOWN_AWW_REPORT_TYPE, - // DON"T know what this is but WTCH is looking for it (isSevereWeatherStatusNotification)? - STATUS_REPORT; + public static enum AwwReportType { + SEVERE_THUNDERSTORM_WARNING, SEVERE_THUNDERSTORM_WATCH, TORNADO_WARNING, TORNADO_WATCH, SEVERE_THUNDERSTORM_OUTLINE_UPDATE, TORNADO_WATCH_OUTLINE_UPDATE, FLASH_FLOOD_WARNING, FLASH_FLOOD_WATCH, FLOOD_WARNING, FLOOD_WATCH, FLOOD_STATEMENT, + // WINTER STORM. something is getting decoded as WINTER STORM + WINTER_STORM_WARNING, WINTER_STORM_WATCH, WATCH_COUNTY_NOTIFICATION, SEVERE_WEATHER_STATEMENT, WIND_ADVISORY, // ?WIND + // CHILL + // ADVISORY? + // WIND CHILL ADVISORYs getting decoded as "ADVISORY" + FOG_ADVISORY, HEAT_ADVISORY, FROST_ADVISORY, SMOKE_ADVISORY, WEATHER_ADVISORY, WINTER_WEATHER_ADVISORY, SIGNIGICANT_WEATHER_ADVISORY, SPECIAL_WEATHER_STATEMENT, RED_FLAG_WARNING, TORNADO_REPORT, HIGH_WIND_WARNING, FREEZE_WARNING, ADVERTENCIA_DE_INUNDACIONES, HYDROLOGIC_STATEMENT, URGENT_WEATHER_MESSAGE, UNKNOWN_AWW_REPORT_TYPE, + // DON"T know what this is but WTCH is looking for it + // (isSevereWeatherStatusNotification)? + STATUS_REPORT; - public static AwwReportType getReportType( String rtStr ) { - rtStr = rtStr.trim().replace(" ", "_" ); - for( AwwReportType rt : values() ) { - if( rt.toString().equals( rtStr ) ) { - return rt; - } - } - // WTCH is looking for - if( rtStr.equals("THUNDERSTORM_REPORT" ) ) { - return SEVERE_THUNDERSTORM_WATCH; - } - if( rtStr.endsWith( "STATUS REPORT" ) ) { -// ??? return AwwReportType.SEVERE_WEATHER_STATUS_NOTIFICATION - } - // WSTM is looking for - if( rtStr.equals( "WINTER_STORM" ) ) { - // ??? - } - if( rtStr.equals( "ADVISORY" ) ) { - // ???? WIND CHILL ADVISORY is getting decoded as "ADVISORY"??? - } - return UNKNOWN_AWW_REPORT_TYPE; - } - } + public static AwwReportType getReportType(String rtStr) { + rtStr = rtStr.trim().replace(" ", "_"); + for (AwwReportType rt : values()) { + if (rt.toString().equals(rtStr)) { + return rt; + } + } + // WTCH is looking for + if (rtStr.equals("THUNDERSTORM_REPORT")) { + return SEVERE_THUNDERSTORM_WATCH; + } + if (rtStr.endsWith("STATUS REPORT")) { + // ??? return AwwReportType.SEVERE_WEATHER_STATUS_NOTIFICATION + } + // WSTM is looking for + if (rtStr.equals("WINTER_STORM")) { + // ??? + } + if (rtStr.equals("ADVISORY")) { + // ???? WIND CHILL ADVISORY is getting decoded as "ADVISORY"??? + } + return UNKNOWN_AWW_REPORT_TYPE; + } + } @Column(length = 40) @DataURI(position = 1) @@ -304,17 +280,6 @@ public class AwwRecord extends PluginDataObject { // pugc.setParentID(this); } - /** - * Override existing set method to modify any classes that use the dataURI - * as a foreign key - */ - @Override - public void setIdentifier(Object dataURI) { - - this.identifier = dataURI; - - } - /** * @return the designator */ diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.convsigmet/src/gov/noaa/nws/ncep/common/dataplugin/convsigmet/ConvSigmetRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.convsigmet/src/gov/noaa/nws/ncep/common/dataplugin/convsigmet/ConvSigmetRecord.java index 6799bf4f97..40d4dc9eb0 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.convsigmet/src/gov/noaa/nws/ncep/common/dataplugin/convsigmet/ConvSigmetRecord.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.convsigmet/src/gov/noaa/nws/ncep/common/dataplugin/convsigmet/ConvSigmetRecord.java @@ -1,26 +1,3 @@ -/** - * ConvsigmetRecord - * - * This java class performs the mapping to the database table for CONVSIGMET - * - * HISTORY - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 03/2009 87/114 L. Lin Initial coding - * 07/2009 87/114 L. Lin Migration to TO11 - * 09/2011 Chin Chen changed to improve purge performance and - * removed xml serialization as well - * Apr 4, 2013 1846 bkowal Added an index on refTime and forecastTime - * Apr 12, 2013 1857 bgonzale Added SequenceGenerator annotation. - * May 07, 2013 1869 bsteffen Remove dataURI column from - * PluginDataObject. - * - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - */ - package gov.noaa.nws.ncep.common.dataplugin.convsigmet; import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; @@ -49,6 +26,31 @@ import com.raytheon.uf.common.dataplugin.annotations.DataURI; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; +/** + * ConvsigmetRecord + * + * This java class performs the mapping to the database table for CONVSIGMET + * + * SOFTWARE HISTORY + * + *
+ * Date         Ticket#         Engineer    Description
+ * ------------ ----------      ----------- --------------------------
+ * 03/2009      87/114          L. Lin      Initial coding
+ * 07/2009      87/114          L. Lin      Migration to TO11
+ * 09/2011                      Chin Chen   changed to improve purge performance and
+ *                                          removed xml serialization as well
+ * Apr 4, 2013        1846 bkowal      Added an index on refTime and forecastTime
+ * Apr 12, 2013 1857            bgonzale    Added SequenceGenerator annotation.
+ * May 07, 2013 1869            bsteffen    Remove dataURI column from
+ *                                          PluginDataObject.
+ * Feb 11, 2014 2784            rferrel     Remove override of setIdentifier.
+ * 
+ * 
+ * + * This code has been developed by the SIB for use in the AWIPS2 system. + */ + @Entity @SequenceGenerator(initialValue = 1, name = PluginDataObject.ID_GEN, sequenceName = "convsigmetseq") @Table(name = "convsigmet", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) @@ -291,17 +293,6 @@ public class ConvSigmetRecord extends PluginDataObject { } - /** - * Override existing set method to modify any classes that use the dataURI - * as a foreign key - */ - @Override - public void setIdentifier(Object dataURI) { - - this.identifier = dataURI; - - } - @Override @Column @Access(AccessType.PROPERTY) diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ffg/src/gov/noaa/nws/ncep/common/dataplugin/ffg/FfgRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ffg/src/gov/noaa/nws/ncep/common/dataplugin/ffg/FfgRecord.java index bf9c24bf61..6975cd6147 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ffg/src/gov/noaa/nws/ncep/common/dataplugin/ffg/FfgRecord.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ffg/src/gov/noaa/nws/ncep/common/dataplugin/ffg/FfgRecord.java @@ -1,34 +1,3 @@ -/** - * - * FfgRecord - * - * This java class performs the mapping to the database tables for FFG. - * - *
- * SOFTWARE HISTORY
- *
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * 08/2008      14         T. Lee      Initial coding
- * 12/2008      14         T. Lee      Initialized variable
- * 03/2009      14         T. Lee      Migration to TO10
- * 07/2009      14         T. Lee      Migration to TO11
- * 09/2011                 Chin Chen   changed to improve purge performance
- *                                     and  removed xml serialization as
- *                                     well
- * Apr 04, 2013 1846       bkowal      Added an index on refTime and
- *                                     forecastTime
- * Apr 12, 2013 1857       bgonzale    Added SequenceGenerator annotation.
- * May 07, 2013 1869       bsteffen    Remove dataURI column from
- *                                     PluginDataObject.
- * Aug 30, 2013 2298       rjpeter     Make getPluginName abstract
- *
- * 
- * - * @author T.Lee - * @version 1.0 - */ - package gov.noaa.nws.ncep.common.dataplugin.ffg; import java.util.Calendar; @@ -55,6 +24,38 @@ import com.raytheon.uf.common.dataplugin.annotations.DataURI; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; +/** + * + * FfgRecord + * + * This java class performs the mapping to the database tables for FFG. + * + *
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 08/2008      14         T. Lee      Initial coding
+ * 12/2008      14         T. Lee      Initialized variable
+ * 03/2009      14         T. Lee      Migration to TO10
+ * 07/2009      14         T. Lee      Migration to TO11
+ * 09/2011                 Chin Chen   changed to improve purge performance
+ *                                     and  removed xml serialization as
+ *                                     well
+ * Apr 04, 2013 1846       bkowal      Added an index on refTime and
+ *                                     forecastTime
+ * Apr 12, 2013 1857       bgonzale    Added SequenceGenerator annotation.
+ * May 07, 2013 1869       bsteffen    Remove dataURI column from
+ *                                     PluginDataObject.
+ * Aug 30, 2013 2298       rjpeter     Make getPluginName abstract
+ * Feb 11, 2014 2784       rferrel     Remove override of setIdentifier.
+ * 
+ * 
+ * + * @author T.Lee + * @version 1.0 + */ + @Entity @SequenceGenerator(initialValue = 1, name = PluginDataObject.ID_GEN, sequenceName = "ffgseq") @Table(name = "ffg", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) @@ -288,22 +289,6 @@ public class FfgRecord extends PluginDataObject { // precip.setParentID (this); } - /** - * Override existing set method to modify any classes that use the dataURI - * as a foreign key - */ - @Override - public void setIdentifier(Object dataURI) { - - this.identifier = dataURI; - /* - * if (this.getFfgP() != null && this.getFfgP().size() > 0) { for - * (Iterator iter = this.getFfgP().iterator(); - * iter.hasNext();) { FfgPrecip fp = iter.next(); - * //fp.setParentID(this); } } - */ - } - @Override @Column @Access(AccessType.PROPERTY) diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.intlsigmet/src/gov/noaa/nws/ncep/common/dataplugin/intlsigmet/IntlSigmetRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.intlsigmet/src/gov/noaa/nws/ncep/common/dataplugin/intlsigmet/IntlSigmetRecord.java index 60b09f4e49..e2fe0b3494 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.intlsigmet/src/gov/noaa/nws/ncep/common/dataplugin/intlsigmet/IntlSigmetRecord.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.intlsigmet/src/gov/noaa/nws/ncep/common/dataplugin/intlsigmet/IntlSigmetRecord.java @@ -1,28 +1,3 @@ -/** - * IntlsigmetRecord - * - * This java class performs the mapping to the database table for ITNLSIGMET - * - * HISTORY - * - * This code has been developed by the SIB for use in the AWIPS2 system. - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * 06/2009 113 L. Lin Initial coding - * 07/2009 113 L. Lin Migration to TO11 - * 05/2010 113 L. Lin Migration to TO11DR11 - * 09/2011 Chin Chen changed to improve purge performance and - * removed xml serialization as well - * Apr 4, 2013 1846 bkowal Added an index on refTime and forecastTime - * Apr 12, 2013 1857 bgonzale Added SequenceGenerator annotation. - * May 07, 2013 1869 bsteffen Remove dataURI column from - * PluginDataObject. - * - * - * - * This code has been developed by the SIB for use in the AWIPS2 system. - */ - package gov.noaa.nws.ncep.common.dataplugin.intlsigmet; import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; @@ -51,6 +26,32 @@ import com.raytheon.uf.common.dataplugin.annotations.DataURI; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; +/** + * IntlsigmetRecord + * + * This java class performs the mapping to the database table for ITNLSIGMET + * + * SOFTWARE HISTORY + * + *
+ * This code has been developed by the SIB for use in the AWIPS2 system.
+ * Date         Ticket#         Engineer    Description
+ * ------------ ----------      ----------- --------------------------
+ * 06/2009      113             L. Lin      Initial coding
+ * 07/2009      113             L. Lin      Migration to TO11
+ * 05/2010      113             L. Lin      Migration to TO11DR11
+ * 09/2011                      Chin Chen   changed to improve purge performance and
+ *                                          removed xml serialization as well
+ * Apr 4, 2013        1846 bkowal      Added an index on refTime and forecastTime
+ * Apr 12, 2013 1857            bgonzale    Added SequenceGenerator annotation.
+ * May 07, 2013 1869            bsteffen    Remove dataURI column from         
+ *                                          PluginDataObject.
+ * Feb 11, 2014 2784            rferrel     Remove override of setIdentifier.
+ * 
+ * 
+ * + * This code has been developed by the SIB for use in the AWIPS2 system. + */ @Entity @SequenceGenerator(initialValue = 1, name = PluginDataObject.ID_GEN, sequenceName = "intlsigmetseq") @Table(name = "intlsigmet", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) @@ -575,15 +576,6 @@ public class IntlSigmetRecord extends PluginDataObject { } - /** - * Override existing set method to modify any classes that use the dataURI - * as a foreign key - */ - @Override - public void setIdentifier(Object dataURI) { - this.identifier = dataURI; - } - @Override @Column @Access(AccessType.PROPERTY) diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncpafm/src/gov/noaa/nws/ncep/common/dataplugin/ncpafm/NcPafmRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncpafm/src/gov/noaa/nws/ncep/common/dataplugin/ncpafm/NcPafmRecord.java index 1063ca2c1b..b97b222e99 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncpafm/src/gov/noaa/nws/ncep/common/dataplugin/ncpafm/NcPafmRecord.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncpafm/src/gov/noaa/nws/ncep/common/dataplugin/ncpafm/NcPafmRecord.java @@ -64,6 +64,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * May 07, 2013 1869 bsteffen Remove dataURI column from * PluginDataObject. * Aug 30, 2013 2298 rjpeter Make getPluginName abstract + * Feb 11, 2014 2784 rferrel Remove override of setIdentifier. * * * @author F. J. Yen, SIB @@ -385,15 +386,6 @@ public class NcPafmRecord extends PersistablePluginDataObject implements return null; } - /** - * Override existing set method to modify any classes that use the dataURI - * as a foreign key - */ - @Override - public void setIdentifier(Object dataURI) { - this.identifier = dataURI; - } - @Override @Column @Access(AccessType.PROPERTY) diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncscat/src/gov/noaa/nws/ncep/common/dataplugin/ncscat/NcscatRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncscat/src/gov/noaa/nws/ncep/common/dataplugin/ncscat/NcscatRecord.java index 031199a14b..c26133fc4c 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncscat/src/gov/noaa/nws/ncep/common/dataplugin/ncscat/NcscatRecord.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncscat/src/gov/noaa/nws/ncep/common/dataplugin/ncscat/NcscatRecord.java @@ -1,20 +1,3 @@ -/** - * NcscatRecord - * - * This java class performs the mapping to the database table for ASCAT,Quikscat - * - * HISTORY - * - * Date Author Description - * ------------ ---------- ----------- -------------------------- - * 11/2009 Uma Josyula Initial creation - * Apr 4, 2013 1846 bkowal Added an index on refTime and forecastTime - * Apr 12, 2013 1857 bgonzale Added SequenceGenerator annotation. - * May 07, 2013 bsteffen Remove dataURI column from PluginDataObject. - * - * This code has been developed by the SIB for use in the AWIPS2 system. - */ - package gov.noaa.nws.ncep.common.dataplugin.ncscat; import java.util.Calendar; @@ -43,6 +26,26 @@ import com.raytheon.uf.common.dataplugin.persist.PersistablePluginDataObject; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; +/** + * NcscatRecord + * + * This java class performs the mapping to the database table for ASCAT,Quikscat + * + *
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket Author      Description
+ * ------------ ------ ----------  ----------- --------------------------
+ * 11/2009      Uma Josyula Initial creation    
+ * Apr 4, 2013        1846 bkowal      Added an index on refTime and forecastTime
+ * Apr 12, 2013  1857       bgonzale    Added SequenceGenerator annotation.
+ * May 07, 2013 bsteffen    Remove dataURI column from PluginDataObject.
+ * Feb 11, 2014 2784   rferrel     Remove override of setIdentifier.
+ * 
+ * + * This code has been developed by the SIB for use in the AWIPS2 system. + */ + @Entity @SequenceGenerator(initialValue = 1, name = PluginDataObject.ID_GEN, sequenceName = "ncscatseq") @Table(name = "ncscat", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) @@ -145,11 +148,6 @@ public class NcscatRecord extends PersistablePluginDataObject { return serialVersionUID; } - @Override - public void setIdentifier(Object dataURI) { - this.identifier = dataURI; - } - public int getRecordLength() { return recordLength; } diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.nctaf/src/gov/noaa/nws/ncep/common/dataplugin/nctaf/NcTafRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.nctaf/src/gov/noaa/nws/ncep/common/dataplugin/nctaf/NcTafRecord.java index b26e3018a8..092e462b64 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.nctaf/src/gov/noaa/nws/ncep/common/dataplugin/nctaf/NcTafRecord.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.nctaf/src/gov/noaa/nws/ncep/common/dataplugin/nctaf/NcTafRecord.java @@ -78,6 +78,7 @@ import com.raytheon.uf.edex.decodertools.time.TimeTools; * May 07, 2013 1869 bsteffen Remove dataURI column from * PluginDataObject. * Aug 30, 2013 2298 rjpeter Make getPluginName abstract + * Feb 11, 2014 2784 rferrel Remove override of setIdentifier. * * * @@ -614,13 +615,6 @@ public class NcTafRecord extends PluginDataObject implements ISpatialEnabled, this.issue_timeString = issue_timeString; } - @Override - public void setIdentifier(Object dataURI) { - - this.identifier = dataURI; - - } - /** * Get the IDecoderGettable reference for this record. * diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/NcUairRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/NcUairRecord.java index 6a023c45eb..0f25fa466b 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/NcUairRecord.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncuair/src/gov/noaa/nws/ncep/common/dataplugin/ncuair/NcUairRecord.java @@ -1,31 +1,3 @@ -/** - * NcUairRecord - * - *
- * The java class defines the parameters in the postgres table and
- * the for HDF5 dataset for the upper air data.
- * 
- * Date         Ticket#         Engineer    Description
- * ------------ ----------      ----------- --------------------------
- * 03/2010      210				L. Lin     	Initial creation
- * 4/2011						T. Lee		Persist to HDF5
- * 09/2011      457             S. Gurung   Renamed H5 to Nc and h5 to nc
- * 09/2011                   	Chin Chen   support batch decoding methods for better performance and
- * 											remove xml serialization as well
- * 10/2011                      S. Gurung   Replace slat/slon/selv with location of type SurfaceObsLocation
- * Apr 4, 2013        1846 bkowal      Added an index on refTime and forecastTime
- * 04/2013      1293            bkowal      Removed references to hdffileid. 
- * Apr 12, 2013 1857            bgonzale    Added SequenceGenerator annotation.
- * May 07, 2013 1869            bsteffen    Remove dataURI column from
- *                                          PluginDataObject.
- * 
- * 
- * - * This code has been developed by the SIB for use in the AWIPS2 system. - * @author L. Lin - * @version 1.0 - */ - package gov.noaa.nws.ncep.common.dataplugin.ncuair; import java.util.Calendar; @@ -60,6 +32,38 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; import com.vividsolutions.jts.geom.Geometry; +/** + * NcUairRecord + * + *
+ * The java class defines the parameters in the postgres table and
+ * the for HDF5 dataset for the upper air data.
+ * 
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#         Engineer    Description
+ * ------------ ----------      ----------- --------------------------
+ * 03/2010      210             L. Lin      Initial creation
+ * 4/2011                       T. Lee      Persist to HDF5
+ * 09/2011      457             S. Gurung   Renamed H5 to Nc and h5 to nc
+ * 09/2011                      Chin Chen   support batch decoding methods for better performance and
+ *                                          remove xml serialization as well
+ * 10/2011                      S. Gurung   Replace slat/slon/selv with location of type SurfaceObsLocation
+ * Apr 4, 2013        1846 bkowal      Added an index on refTime and forecastTime
+ * 04/2013      1293            bkowal      Removed references to hdffileid. 
+ * Apr 12, 2013 1857            bgonzale    Added SequenceGenerator annotation.
+ * May 07, 2013 1869            bsteffen    Remove dataURI column from
+ *                                          PluginDataObject.
+ * Feb 11, 2014 2784            rferrel     Remove override of setIdentifier.
+ * 
+ * 
+ * + * This code has been developed by the SIB for use in the AWIPS2 system. + * + * @author L. Lin + * @version 1.0 + */ @Entity @SequenceGenerator(initialValue = 1, name = PluginDataObject.ID_GEN, sequenceName = "ncuairseq") @Table(name = "ncuair", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) @@ -478,17 +482,6 @@ public class NcUairRecord extends PersistablePluginDataObject implements // li.setParentID(this); } - /** - * Override existing set method to modify any classes that use the dataURI - * as a foreign key - */ - @Override - public void setIdentifier(Object dataURI) { - - this.identifier = dataURI; - - } - @Override public SurfaceObsLocation getSpatialObject() { return location; diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet/src/gov/noaa/nws/ncep/common/dataplugin/nonconvsigmet/NonConvSigmetRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet/src/gov/noaa/nws/ncep/common/dataplugin/nonconvsigmet/NonConvSigmetRecord.java index ffd2bd171c..1f8d810b63 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet/src/gov/noaa/nws/ncep/common/dataplugin/nonconvsigmet/NonConvSigmetRecord.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet/src/gov/noaa/nws/ncep/common/dataplugin/nonconvsigmet/NonConvSigmetRecord.java @@ -1,22 +1,3 @@ -/** - * NonConvsigmetRecord - * - * This java class performs the mapping to the database table for NONCONVSIGMET - * - * HISTORY - * - * Date Author Description - * ------------ ---------- ----------- -------------------------- - * 06/2009 Uma Josyula Initial creation - * 09/2011 Chin Chen changed to improve purge performance and - * removed xml serialization as well - * Apr 4, 2013 1846 bkowal Added an index on refTime and forecastTime - * Apr 12, 2013 1857 bgonzale Added SequenceGenerator annotation. - * May 07, 2013 bsteffen Remove dataURI column from PluginDataObject. - * - * This code has been developed by the SIB for use in the AWIPS2 system. - */ - package gov.noaa.nws.ncep.common.dataplugin.nonconvsigmet; import gov.noaa.nws.ncep.common.tools.IDecoderConstantsN; @@ -45,6 +26,30 @@ import com.raytheon.uf.common.dataplugin.annotations.DataURI; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; +/** + * NonConvsigmetRecord + * + * This java class performs the mapping to the database table for NONCONVSIGMET + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket Author      Description
+ * ------------ ------ ------  ----------- --------------------------
+ * 06/2009      Uma Josyula Initial creation    
+ * 09/2011      Chin Chen   changed to improve purge performance and
+ *                          removed xml serialization as well
+ * Apr 4, 2013        1846 bkowal      Added an index on refTime and forecastTime
+ * Apr 12, 2013       1857 bgonzale    Added SequenceGenerator annotation.
+ * May 07, 2013 bsteffen    Remove dataURI column from PluginDataObject.
+ * Feb 11, 2014 2784   rferrel    Remove override of setIdentifier.
+ * 
+ * 
+ * + * This code has been developed by the SIB for use in the AWIPS2 system. + */ + @Entity @SequenceGenerator(initialValue = 1, name = PluginDataObject.ID_GEN, sequenceName = "nonconvsigmetseq") @Table(name = "nonconvsigmet", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) @@ -519,17 +524,6 @@ public class NonConvSigmetRecord extends PluginDataObject { } - /** - * Override existing set method to modify any classes that use the dataURI - * as a foreign key - */ - @Override - public void setIdentifier(Object dataURI) { - - this.identifier = dataURI; - - } - @Override @Column @Access(AccessType.PROPERTY) diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/src/gov/noaa/nws/ncep/common/dataplugin/ntrans/NtransRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/src/gov/noaa/nws/ncep/common/dataplugin/ntrans/NtransRecord.java index 179a35f666..0bb0b26d44 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/src/gov/noaa/nws/ncep/common/dataplugin/ntrans/NtransRecord.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/src/gov/noaa/nws/ncep/common/dataplugin/ntrans/NtransRecord.java @@ -1,21 +1,3 @@ -/** - * NtransRecord - * - * This java class performs the mapping to the database table for NTRANS Metafiles - * - *
- * HISTORY
- *
- * Date     	Author		Description
- * ------------	----------	-----------	--------------------------
- * 02/2013		B. Hebbard	Initial creation	
- * Apr 4, 2013  1846 bkowal Added an index on refTime and forecastTime	
- * Apr 12, 2013       1857 bgonzale    Added SequenceGenerator annotation.
- * May 07, 2013 bsteffen    Remove dataURI column from PluginDataObject.
- * 
- * This code has been developed by the SIB for use in the AWIPS2 system.
- */
-
 package gov.noaa.nws.ncep.common.dataplugin.ntrans;
 
 import javax.persistence.Access;
@@ -43,6 +25,27 @@ import com.raytheon.uf.common.dataplugin.persist.PersistablePluginDataObject;
 import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
 import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
 
+/**
+ * NtransRecord
+ * 
+ * This java class performs the mapping to the database table for NTRANS
+ * Metafiles
+ * 
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket# Author      Description
+ * ------------ ------- ----------  ----------- --------------------------
+ * 02/2013      B. Hebbard  Initial creation    
+ * Apr 4, 2013  1846 bkowal Added an index on refTime and forecastTime  
+ * Apr 12, 2013       1857 bgonzale    Added SequenceGenerator annotation.
+ * May 07, 2013 bsteffen    Remove dataURI column from PluginDataObject.
+ * Feb 11, 2014 2784    rferrel     Remove override of setIdentifier.
+ * 
+ * + * This code has been developed by the SIB for use in the AWIPS2 system. + */ + @Entity @SequenceGenerator(initialValue = 1, name = PluginDataObject.ID_GEN, sequenceName = "ntransseq") @Table(name = "ntrans", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) @@ -235,11 +238,6 @@ public class NtransRecord extends PersistablePluginDataObject { return serialVersionUID; } - @Override - public void setIdentifier(Object dataURI) { - this.identifier = dataURI; - } - @Override @Column @Access(AccessType.PROPERTY) diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.tcm/src/gov/noaa/nws/ncep/common/dataplugin/tcm/TcmRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.tcm/src/gov/noaa/nws/ncep/common/dataplugin/tcm/TcmRecord.java index 27f67b511b..7d90969610 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.tcm/src/gov/noaa/nws/ncep/common/dataplugin/tcm/TcmRecord.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.tcm/src/gov/noaa/nws/ncep/common/dataplugin/tcm/TcmRecord.java @@ -47,6 +47,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * Apr 12, 2013 1857 bgonzale Added SequenceGenerator annotation. * May 07, 2013 1869 bsteffen Remove dataURI column from PluginDataObject. * Aug 30, 2013 2298 rjpeter Make getPluginName abstract + * Feb 11, 2014 2784 rferrel Remove override of setIdentifier. *
* * @author T.Lee @@ -494,16 +495,6 @@ public class TcmRecord extends PluginDataObject { } - /** - * Override existing set method to modify any classes that use the dataURI - * as a foreign key - */ - @Override - public void setIdentifier(Object dataURI) { - this.identifier = dataURI; - - } - @Override public IDecoderGettable getDecoderGettable() { // TODO Auto-generated method stub diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.wcp/src/gov/noaa/nws/ncep/common/dataplugin/wcp/WcpRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.wcp/src/gov/noaa/nws/ncep/common/dataplugin/wcp/WcpRecord.java index a04b47479f..3a1fa1b52f 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.wcp/src/gov/noaa/nws/ncep/common/dataplugin/wcp/WcpRecord.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.wcp/src/gov/noaa/nws/ncep/common/dataplugin/wcp/WcpRecord.java @@ -1,34 +1,3 @@ -/** - * WcpRecord is the Data Access component for WCP Watch Corner Point data. - * This contains getters and setters for the main parent table wcp. - * This code has been developed by the SIB for use in the AWIPS2 system. - * - *
- * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * 12Dec2008    37         F. J. Yen   Initial Coding.
- * 17Apr2009    37         F. J. Yen   Refactored for TO10
- * 24Aug2009    37         F. J. Yen   Refactored for TO11
- * 17May2010    37         F. J. Yen   Refactored to dataplugin for migration to
- *                                     to11dr11
- * 09/2011                 Chin Chen   changed to improve purge performance and
- *                                     removed xml serialization as well
- * Apr 04, 2013 1846       bkowal      Added an index on refTime and
- *                                     forecastTime
- * Apr 12, 2013 1857       bgonzale    Added SequenceGenerator annotation.
- * May 07, 2013 1869       bsteffen    Remove dataURI column from
- *                                     PluginDataObject.
- * Aug 30, 2013 2298       rjpeter     Make getPluginName abstract
- * 
- * 
- * - * @author F. J. Yen, SIB - * @version 1.0 - */ - package gov.noaa.nws.ncep.common.dataplugin.wcp; import java.util.Calendar; @@ -55,6 +24,37 @@ import com.raytheon.uf.common.dataplugin.annotations.DataURI; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; +/** + * WcpRecord is the Data Access component for WCP Watch Corner Point data. This + * contains getters and setters for the main parent table wcp. This code has + * been developed by the SIB for use in the AWIPS2 system. + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 12Dec2008    37         F. J. Yen   Initial Coding.
+ * 17Apr2009    37         F. J. Yen   Refactored for TO10
+ * 24Aug2009    37         F. J. Yen   Refactored for TO11
+ * 17May2010    37         F. J. Yen   Refactored to dataplugin for migration to
+ *                                     to11dr11
+ * 09/2011                 Chin Chen   changed to improve purge performance and
+ *                                     removed xml serialization as well
+ * Apr 04, 2013 1846       bkowal      Added an index on refTime and
+ *                                     forecastTime
+ * Apr 12, 2013 1857       bgonzale    Added SequenceGenerator annotation.
+ * May 07, 2013 1869       bsteffen    Remove dataURI column from
+ *                                     PluginDataObject.
+ * Aug 30, 2013 2298       rjpeter     Make getPluginName abstract
+ * Feb 11, 2014 2784       rferrel     Remove override of setIdentifier.
+ * 
+ * 
+ * + * @author F. J. Yen, SIB + * @version 1.0 + */ @Entity @SequenceGenerator(initialValue = 1, name = PluginDataObject.ID_GEN, sequenceName = "wcpseq") @Table(name = "wcp", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) @@ -172,12 +172,6 @@ public class WcpRecord extends PluginDataObject { } - @Override - public void setIdentifier(Object dataURI) { - this.identifier = dataURI; - - } - @Override @Column @Access(AccessType.PROPERTY) diff --git a/ncep/gov.noaa.nws.ncep.edex.common/res/spring/ncinventory-request.xml b/ncep/gov.noaa.nws.ncep.edex.common/res/spring/ncinventory-request.xml index 2fe290a42b..5ed9a3a3d2 100644 --- a/ncep/gov.noaa.nws.ncep.edex.common/res/spring/ncinventory-request.xml +++ b/ncep/gov.noaa.nws.ncep.edex.common/res/spring/ncinventory-request.xml @@ -36,7 +36,7 @@ autoStartup="false"> - + diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/res/spring/airmet-ingest.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/res/spring/airmet-ingest.xml index 867cee8113..fbdc17c4e2 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/res/spring/airmet-ingest.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/res/spring/airmet-ingest.xml @@ -12,7 +12,7 @@ - + - + - + @@ -65,12 +53,12 @@ ncgrib - + - + ncgrib diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncpafm/res/spring/ncpafm-ingest.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ncpafm/res/spring/ncpafm-ingest.xml index dba9ae8fc6..902d9bf772 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncpafm/res/spring/ncpafm-ingest.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ncpafm/res/spring/ncpafm-ingest.xml @@ -15,7 +15,7 @@ - + - + - + - + - + - + - + - + - + - + - + - - @@ -27,7 +15,7 @@ - + - + - + - + - + - - - - - - - - - - - - @@ -25,10 +11,10 @@ - + - + diff --git a/rpms/awips2.core/Installer.ant/scripts/profile.d/awips2Ant.csh b/rpms/awips2.core/Installer.ant/scripts/profile.d/awips2Ant.csh index b0d5da3f7d..3ee35cb6ae 100644 --- a/rpms/awips2.core/Installer.ant/scripts/profile.d/awips2Ant.csh +++ b/rpms/awips2.core/Installer.ant/scripts/profile.d/awips2Ant.csh @@ -1,8 +1,7 @@ #!/bin/csh # Determine where ant has been installed. -set ANT_INSTALL=`rpm -q --queryformat '%{INSTALLPREFIX}' awips2-ant` -setenv ANT_HOME "${ANT_INSTALL}" +setenv ANT_INSTALL "/awips2/ant" if $?PATH then setenv PATH ${ANT_INSTALL}/bin:$PATH diff --git a/rpms/build/x86_64/build.sh b/rpms/build/x86_64/build.sh index e15fbc57ca..0f45a7b5cd 100644 --- a/rpms/build/x86_64/build.sh +++ b/rpms/build/x86_64/build.sh @@ -456,8 +456,9 @@ if [ "${1}" = "-custom" ]; then #buildRPM "awips2-alertviz" #buildRPM "awips2-python" #buildRPM "awips2-alertviz" + buildRPM "awips2-ant" #buildRPM "awips2-eclipse" - buildRPM "awips2-python" + #buildRPM "awips2-python" exit 0 fi