From e1ed0ed33ddbc948b6544043c877c0fb0c8475c4 Mon Sep 17 00:00:00 2001 From: Nate Jensen Date: Mon, 20 Jan 2014 17:41:44 -0600 Subject: [PATCH 01/21] Issue #2359 clean up log service for distribution, build everything necessary into tar.gz file Change-Id: I22a0b7d37694e523356c6f5ea0ad567bd6d32c15 Former-commit-id: c015cb1653b2e435df89230d318893c277f14db3 [formerly c015cb1653b2e435df89230d318893c277f14db3 [formerly 9bde0e7f917cde0bb4aeec6c92427729c007dabf]] Former-commit-id: be30d6c94e1dbd6000064f8af4def6528c0be765 Former-commit-id: 2732368f17623a04586c7c3bb9e249ae5caea81e --- .../META-INF/MANIFEST.MF | 5 +- .../com.raytheon.uf.logsrv/README.txt | 118 ++++++++++++++++++ .../com.raytheon.uf.logsrv/build.xml | 108 ++++++++++++++++ .../com.raytheon.uf.logsrv/conf/config.xml | 30 +++++ .../{ => conf}/receiver.xml | 4 +- .../com.raytheon.uf.logsrv/config.xml | 12 -- .../com.raytheon.uf.logsrv/logsrv.sh | 29 +++++ .../com/raytheon/uf/logsrv/LogService.java | 14 ++- 8 files changed, 301 insertions(+), 19 deletions(-) create mode 100644 javaUtilities/com.raytheon.uf.logsrv/README.txt create mode 100644 javaUtilities/com.raytheon.uf.logsrv/build.xml create mode 100644 javaUtilities/com.raytheon.uf.logsrv/conf/config.xml rename javaUtilities/com.raytheon.uf.logsrv/{ => conf}/receiver.xml (93%) delete mode 100644 javaUtilities/com.raytheon.uf.logsrv/config.xml create mode 100644 javaUtilities/com.raytheon.uf.logsrv/logsrv.sh diff --git a/javaUtilities/com.raytheon.uf.logsrv/META-INF/MANIFEST.MF b/javaUtilities/com.raytheon.uf.logsrv/META-INF/MANIFEST.MF index b48d5ea02d..1cfe58ea05 100644 --- a/javaUtilities/com.raytheon.uf.logsrv/META-INF/MANIFEST.MF +++ b/javaUtilities/com.raytheon.uf.logsrv/META-INF/MANIFEST.MF @@ -1,9 +1,10 @@ Manifest-Version: 1.0 +Main-Class: com.raytheon.uf.logsrv.LogService +Class-Path: logback-core-1.0.13.jar logback-classic-1.0.13.jar derby.jar mail.jar slf4j-api-1.7.5.jar quartz-1.8.6.jar commons-lang-2.3.jar Bundle-ManifestVersion: 2 Bundle-Name: Logsrv Bundle-SymbolicName: com.raytheon.uf.logsrv -Bundle-Version: 1.0.0.qualifier -Bundle-Activator: com.raytheon.uf.logsrv.Activator +Bundle-Version: 1.14.0.qualifier Bundle-Vendor: RAYTHEON Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy diff --git a/javaUtilities/com.raytheon.uf.logsrv/README.txt b/javaUtilities/com.raytheon.uf.logsrv/README.txt new file mode 100644 index 0000000000..9de747f42d --- /dev/null +++ b/javaUtilities/com.raytheon.uf.logsrv/README.txt @@ -0,0 +1,118 @@ +## +# 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. +## + + + +Build instructions +----------------------- +In Eclipse run the build.xml by right clicking on the build.xml file and +running it. That will produce a tar.gz with everything you need inside of it. + + +Install instructions +----------------------- +Place the tar.gz file where you would like to install it, and run tar -xvf on +the tar.gz file. Next go into the conf directory and modify config.xml to + the best settings for your cluster. Then open receiver.xml and go to the + bottom of the file. Edit the address to the name of the machine where + you are installing the log service, and pick a port if you are not happy with + the default. Once your config settings are right, run the bin/logsrv.sh + script to start the log service. + + At this point the log service is running but nothing is reporting to it. You + can configure any Java process using logback to report to it, but with the + current version that is just EDEX and CAVE. (Note technically you could + configure AlertViz to report to the service too, but that is fairly pointless). + + To configure EDEX or CAVE to report to the log service, find the logback + config files for those applications. In EDEX they can typically be found at + /awips2/edex/conf. If you are not sure which logback file corresponds to + which JVM, look at the shell scripts in /awips2/edex/etc. If not explicitly + stated in their corresponding shell script, then the JVMs use the logback file + specified in default.sh. + + In CAVE the logback config files can typically be found at + /awips2/cave/plugins/com.raytheon.uf.viz.core_${VERSION}. + + Once found, use a text editor to open the logback config file corresponding + to the process you wish to report to the log service. You need to add two + things to the file, an appender and an appender-ref. + + Add an appender like the example below in the appenders section (generally + towards the top of the file): + + + false + 5477 + dev33.oma.us.ray.com + + WARN + + + + Replace the remoteHost address with the machine where you installed the + log service. Note that you must have a network route between the two machines + as it uses a socket to report the errors. Replace the port with the port you chose + in receiver.xml. You can alter the threshold if need be. + + Next you must add your new remoteLogSrv appender to a logger. Note that a + logger can have multiple appenders. For EDEX, the recommendation is to add + it to the root logger. For example: + + + + + + + + For CAVE, the recommendation is to add it to the CaveLogger. For example: + + + + + + + +Once you save the modified logback config file, you're done. Logback will +automatically pick up a changed configuration within a minute or two, and +the Java processes you configured will start appending to the socket. + + +How it works +-------------- +The log service is listening on the socket and will store the messages in a +derby database on the filesystem, and then at the scheduled time it will +attempt to analyze and consolidate the errors based on the information it has +available. Then it will send an email using the configuration, reporting in an order +of what errors it thinks are most significant. + +Note that it does not matter if the Java processes have the socket appender +configured but the log service is not running. They will try to connect but then +go back to normal logging. If the log service is running, they will resume sending +log messages through the socket. Therefore, it does not hurt to have +everything configured even if the log service or the reporting processes are not +running. + + +Bugs and/or Improvements +-------------- +If you encounter a bug with the log service or have an idea of how it can be +improved, send an email to nathan.jensen@raytheon.com. + diff --git a/javaUtilities/com.raytheon.uf.logsrv/build.xml b/javaUtilities/com.raytheon.uf.logsrv/build.xml new file mode 100644 index 0000000000..228ec71040 --- /dev/null +++ b/javaUtilities/com.raytheon.uf.logsrv/build.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/javaUtilities/com.raytheon.uf.logsrv/conf/config.xml b/javaUtilities/com.raytheon.uf.logsrv/conf/config.xml new file mode 100644 index 0000000000..040c26a685 --- /dev/null +++ b/javaUtilities/com.raytheon.uf.logsrv/conf/config.xml @@ -0,0 +1,30 @@ + + + + + ec-oma + + + /common/njensen/logsrv/ + + + Nathan.Jensen@raytheon.com + mk2-msg10.raymail.ray.com + 143 + + + awipsctl@list.app.ray.com, awipstest@list.app.ray.com, david_j_hladky@raytheon.com + + + 00:45 + + + shefThreadPool + + \ No newline at end of file diff --git a/javaUtilities/com.raytheon.uf.logsrv/receiver.xml b/javaUtilities/com.raytheon.uf.logsrv/conf/receiver.xml similarity index 93% rename from javaUtilities/com.raytheon.uf.logsrv/receiver.xml rename to javaUtilities/com.raytheon.uf.logsrv/conf/receiver.xml index 478777db3c..985a8152e9 100644 --- a/javaUtilities/com.raytheon.uf.logsrv/receiver.xml +++ b/javaUtilities/com.raytheon.uf.logsrv/conf/receiver.xml @@ -5,8 +5,8 @@ - /home/njensen/logs/logService-internal-%d{yyyyMMdd}.log - 30 + ${logSrvLogs}/logs/logService-internal-%d{yyyyMMdd}.log + 7 %-5p %d [%t] %c{0}: %m%n diff --git a/javaUtilities/com.raytheon.uf.logsrv/config.xml b/javaUtilities/com.raytheon.uf.logsrv/config.xml deleted file mode 100644 index d647afea32..0000000000 --- a/javaUtilities/com.raytheon.uf.logsrv/config.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - ec-oma - /awips2/edex/data/utility/nate - Nathan.Jensen@raytheon.com - mk2-msg10.raymail.ray.com - 143 - awipsctl@list.app.ray.com, awipstest@list.app.ray.com, david_j_hladky@raytheon.com - - 00:45 - shefThreadPool - \ No newline at end of file diff --git a/javaUtilities/com.raytheon.uf.logsrv/logsrv.sh b/javaUtilities/com.raytheon.uf.logsrv/logsrv.sh new file mode 100644 index 0000000000..6e3cbf4a25 --- /dev/null +++ b/javaUtilities/com.raytheon.uf.logsrv/logsrv.sh @@ -0,0 +1,29 @@ +#!/bin/bash +## +# 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. +## + + +path_to_script=`readlink -f $0` +binDir=$(dirname $path_to_script) +logSrvDir=$(dirname $binDir) +export logSrvConf=$logSrvDir/conf/ +export logSrvLogs=$logSrvDir/logs/ + +java -jar ${logSrvDir}/lib/com.raytheon.uf.logsrv.jar \ No newline at end of file diff --git a/javaUtilities/com.raytheon.uf.logsrv/src/com/raytheon/uf/logsrv/LogService.java b/javaUtilities/com.raytheon.uf.logsrv/src/com/raytheon/uf/logsrv/LogService.java index d36372a456..b68609bf77 100644 --- a/javaUtilities/com.raytheon.uf.logsrv/src/com/raytheon/uf/logsrv/LogService.java +++ b/javaUtilities/com.raytheon.uf.logsrv/src/com/raytheon/uf/logsrv/LogService.java @@ -58,6 +58,8 @@ public class LogService { private static final String SERVICE_CONFIG = "config.xml"; + private static final String ENV_CONF_DIR = "logSrvConf"; + private static final Logger logger = LoggerFactory .getLogger("InternalLogger"); @@ -67,11 +69,17 @@ public class LogService { */ public static void main(String[] args) throws Exception { logger.info("Starting log analytics service"); + String confDir = System.getenv(ENV_CONF_DIR); + if (confDir == null) { + throw new LogServiceException("Environment variable " + + ENV_CONF_DIR + + " is not set! Unable to find configuration!"); + } JAXBContext context = JAXBContext.newInstance(LogSrvConfig.class); Unmarshaller m = context.createUnmarshaller(); - LogSrvConfig config = (LogSrvConfig) m.unmarshal(new File( - SERVICE_CONFIG)); + LogSrvConfig config = (LogSrvConfig) m.unmarshal(new File(confDir + + SERVICE_CONFIG)); config.validate(); DerbyDao.getInstance().setConfig(config); logger.info("Logging events from " + config.getClusterName()); @@ -81,7 +89,7 @@ public class LogService { lc.reset(); JoranConfigurator configurator = new JoranConfigurator(); configurator.setContext(lc); - configurator.doConfigure(LOGBACK_CONFIG); + configurator.doConfigure(confDir + LOGBACK_CONFIG); logger.info("Scheduling report generation"); JobScheduler.scheduleJobs(config); From 0873c4ce9a409372e1aa752dec9d26e6912ca5a3 Mon Sep 17 00:00:00 2001 From: Ron Anderson Date: Tue, 21 Jan 2014 13:25:31 -0600 Subject: [PATCH 02/21] Issue #2720 Improve efficiency of merging polygons in edit area generation Change-Id: I8fd83384431942fd71f30aba6053ee12af7d0eb4 Former-commit-id: 8fde77b52952024ca42ef2048c1651cfe61cba8b [formerly 8fde77b52952024ca42ef2048c1651cfe61cba8b [formerly c1ab9bc049528eb33b311355f6b089e67ea4997d]] Former-commit-id: 9805de99faf2ee8946724409e125a5ea5d267c7a Former-commit-id: 7649381c8c29cafee8c1724e342f4af74b988849 --- .../edex/plugin/gfe/reference/MapManager.java | 55 +++++++++++++------ 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/reference/MapManager.java b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/reference/MapManager.java index f74ae6c2c2..472822d937 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/reference/MapManager.java +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/reference/MapManager.java @@ -37,6 +37,7 @@ import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import jep.JepException; @@ -103,6 +104,7 @@ import com.vividsolutions.jts.simplify.TopologyPreservingSimplifier; * from localMaps.py could not be found, * warnings clean up. * Sep 30, 2013 #2361 njensen Use JAXBManager for XML + * Jan 21, 2014 #2720 randerso Improve efficiency of merging polygons in edit area generation * * * @@ -436,7 +438,7 @@ public class MapManager { List values = new ArrayList(); for (int j = 0; j < iscMarkersID.size(); j++) { int index = _config.allSites().indexOf(iscMarkersID.get(j)); - if (index != -1 + if ((index != -1) && _config.officeTypes().get(index) .equals(foundOfficeTypes.get(i))) { values.add(iscMarkers.get(j)); @@ -512,7 +514,7 @@ public class MapManager { String thisSite = _config.getSiteID().get(0); for (int i = 0; i < data.size(); i++) { String n = data.get(i).getId().getName(); - if (n.length() == 7 && n.startsWith("ISC_")) { + if ((n.length() == 7) && n.startsWith("ISC_")) { String cwa = n.substring(4, 7); if (cwa.equals(thisSite)) { statusHandler @@ -597,8 +599,8 @@ public class MapManager { } else { // Write the new edit area file. try { - ReferenceData.getJAXBManager().marshalToXmlFile( - ref, path.getAbsolutePath()); + ReferenceData.getJAXBManager().marshalToXmlFile(ref, + path.getAbsolutePath()); } catch (Exception e) { statusHandler.error("Error writing edit area to file " + path.getAbsolutePath(), e); @@ -827,7 +829,7 @@ public class MapManager { PreparedGeometry boundingGeometry = PreparedGeometryFactory .prepare(p); - Map tempData = new HashMap(); + Map tempData = new HashMap(); while (shapeSource.hasNext()) { SimpleFeature f = shapeSource.next(); Map info = shapeSource.getAttributes(f); @@ -838,7 +840,7 @@ public class MapManager { } String editAreaName = runNamer(mapDef.getInstanceName(), info); - ReferenceData tmp; + Geometry tmp; // validate edit area name, add edit area to the dictionary String ean = validateEAN(editAreaName); @@ -859,14 +861,25 @@ public class MapManager { // handle append case tmp = tempData.get(ean); if (tmp != null) { - mp = mp.union(tmp.getPolygons(CoordinateType.LATLON)); - mp = mp.buffer(0.0); + // Combine multiple geometries into a geometry collection + mp = gf.buildGeometry(Arrays.asList(mp, tmp)); } // handle new case else { created.add(ean); editAreaAttrs.put(ean, info); } + + tempData.put(ean, mp); + } + + for (Entry entry : tempData.entrySet()) { + String ean = entry.getKey(); + Geometry mp = entry.getValue(); + + // Compute buffer(0.0) to clean up geometry issues + mp = mp.buffer(0.0); + MultiPolygon polygons; if (mp instanceof MultiPolygon) { polygons = (MultiPolygon) mp; @@ -874,13 +887,21 @@ public class MapManager { polygons = gf .createMultiPolygon(new Polygon[] { (Polygon) mp }); } else { - statusHandler.info("Creating empty polygon"); + String error = "Table: " + shapeSource.getTableName() + + " edit area:" + ean + + " contains geometry of type " + + mp.getClass().getSimpleName() + + " Creating empty polygon"; + statusHandler.error(error); polygons = gf.createMultiPolygon(new Polygon[] {}); } if (!polygons.isValid()) { - String error = shapeSource.getTableName() - + " contains invalid polygons."; + String error = "Table: " + + shapeSource.getTableName() + + " edit area:" + + ean + + " contains invalid polygons. This edit area will be skipped."; for (int i = 0; i < polygons.getNumGeometries(); i++) { Geometry g = polygons.getGeometryN(i); if (!g.isValid()) { @@ -888,14 +909,14 @@ public class MapManager { } } statusHandler.error(error); + continue; } - tempData.put(ean, new ReferenceData(_config.dbDomain(), - new ReferenceID(ean), polygons, CoordinateType.LATLON)); + // transfer dictionary values to Seq values + data.add(new ReferenceData(_config.dbDomain(), new ReferenceID( + ean), polygons, CoordinateType.LATLON)); } - // transfer dictionary values to Seq values - data.addAll(tempData.values()); tempData.clear(); } catch (Exception e) { String error = "********* EDIT AREA GENERATION ERROR - Create Reference Data *********\n" @@ -954,13 +975,13 @@ public class MapManager { // strip out white space and punctuation (except _) for (int i = s.length() - 1; i >= 0; i--) { - if (!Character.isLetterOrDigit(s.charAt(i)) && s.charAt(i) != '_') { + if (!Character.isLetterOrDigit(s.charAt(i)) && (s.charAt(i) != '_')) { s = s.substring(0, i) + s.substring(i + 1); } } // ensure 1st character is not a number. If a number, preprend. - if (s.length() > 0 && Character.isDigit(s.charAt(0))) { + if ((s.length() > 0) && Character.isDigit(s.charAt(0))) { s = "ea" + s; } From 011337e2c3085e1bd83577d4aaeb70ed930b2d8f Mon Sep 17 00:00:00 2001 From: Benjamin Phillippe Date: Tue, 21 Jan 2014 13:00:31 -0600 Subject: [PATCH 03/21] Issue #2613 Registry performance enhancements. Better handling of delete events. Change-Id: I56d3f5c37778e717810b6a698ec9405ed3cde00a Former-commit-id: b53a0b258d06f999dd90a85efa11dfcdf92f194a [formerly b53a0b258d06f999dd90a85efa11dfcdf92f194a [formerly f863897fd512acae11364eb6b4737339b5951da0]] Former-commit-id: 95b0f1288037700e9f43777213e186b4df9bc2fb Former-commit-id: c82b289e2d57cc0655dac002dc406c6ebcde329b --- .../regrep/xsd/rim/v4/ObjectRefType.java | 26 ++++ .../bandwidth-datadelivery-edex-impl-ncf.xml | 1 - .../registry-federation-datadelivery.xml | 1 - .../federation/RegistryFederationManager.java | 4 +- .../res/spring/ebxml-registry-dao.xml | 1 + .../ebxml/dao/AuditableEventTypeDao.java | 134 ++++++++++++++++-- .../ebxml/services/AuditableEventService.java | 30 +++- .../lifecycle/LifecycleManagerImpl.java | 3 +- .../NotificationListenerImpl.java | 4 + .../RegistryNotificationManager.java | 53 ++++--- .../RegistrySubscriptionManager.java | 17 ++- .../query/plugins/GetNotification.java | 12 +- 12 files changed, 239 insertions(+), 47 deletions(-) diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ObjectRefType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ObjectRefType.java index 90b3aa9063..b29c134dbb 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ObjectRefType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ObjectRefType.java @@ -77,6 +77,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * among multiple ref lists * 12/2/2013 1829 bphillip Modified persistence annotations, added * constructors, hashCode, toString and equals + * 01/21/2014 2613 bphillip Added equals and hashcode * * * @author bphillip @@ -144,6 +145,31 @@ public class ObjectRefType implements IPersistableDataObject { this.key = key; } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((id == null) ? 0 : id.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ObjectRefType other = (ObjectRefType) obj; + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + return true; + } + @Override public String toString() { StringBuilder builder = new StringBuilder(); diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth.ncf/res/spring/bandwidth-datadelivery-edex-impl-ncf.xml b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth.ncf/res/spring/bandwidth-datadelivery-edex-impl-ncf.xml index ff7f87b06b..ffd26a10ef 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth.ncf/res/spring/bandwidth-datadelivery-edex-impl-ncf.xml +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth.ncf/res/spring/bandwidth-datadelivery-edex-impl-ncf.xml @@ -22,7 +22,6 @@ - diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.registry/res/spring/registry-federation-datadelivery.xml b/edexOsgi/com.raytheon.uf.edex.datadelivery.registry/res/spring/registry-federation-datadelivery.xml index 084a818f77..792e13219a 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.registry/res/spring/registry-federation-datadelivery.xml +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.registry/res/spring/registry-federation-datadelivery.xml @@ -24,7 +24,6 @@ value="com.raytheon.uf.edex.datadelivery.registry.federation.RegistryFederationManager.addObjectTypesToSubscribeTo" /> - Test Object Type urn:oasis:names:tc:ebxml-regrep:ObjectType:RegistryObject:Federation urn:oasis:names:tc:ebxml-regrep:ObjectType:RegistryObject:Registry urn:oasis:names:tc:ebxml-regrep:ObjectType:RegistryObject:Association diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.registry/src/com/raytheon/uf/edex/datadelivery/registry/federation/RegistryFederationManager.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.registry/src/com/raytheon/uf/edex/datadelivery/registry/federation/RegistryFederationManager.java index 07f8f7125a..5a27bd63c2 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.registry/src/com/raytheon/uf/edex/datadelivery/registry/federation/RegistryFederationManager.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.registry/src/com/raytheon/uf/edex/datadelivery/registry/federation/RegistryFederationManager.java @@ -156,6 +156,7 @@ import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil; * 12/2/2013 1829 bphillip Modified to use correct getters for slot values * 12/9/2013 2613 bphillip Optimized registry sync function * 1/15/2014 2613 bphillip Added leaveFederation method to prevent inactive registries from participating in the federation unintentionally. + * 1/21/2014 2613 bphillip Changed max down time which requires a sync * * * @author bphillip @@ -188,8 +189,7 @@ public class RegistryFederationManager implements RegistryInitializedListener { * The maximum time a registry can be down before a full synchronization is * performed */ - private static final long MAX_DOWN_TIME_DURATION = TimeUtil.MILLIS_PER_DAY - * 2 - TimeUtil.MILLIS_PER_HOUR; + private static final long MAX_DOWN_TIME_DURATION = TimeUtil.MILLIS_PER_HOUR * 6; /** The central registry mode string */ private static final String CENTRAL_REGISTRY_MODE = "centralRegistry"; diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-registry-dao.xml b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-registry-dao.xml index aaf2455f2e..9e734ca8ec 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-registry-dao.xml +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-registry-dao.xml @@ -74,6 +74,7 @@ + * @@ -79,14 +91,14 @@ public class AuditableEventTypeDao extends + "left outer join action.affectedObjectRefs as AffectedObjectRefs " + "left outer join AffectedObjects.registryObject as RegistryObjects " + "left outer join AffectedObjectRefs.objectRef as ObjRefs " - + "where (ObjRefs.id in (:ids) OR RegistryObjects.id in (:ids) OR action.eventType = :eventType) and event.timestamp >= :startTime"; + + "where (ObjRefs.id in (:ids) OR RegistryObjects.id in (:ids)) and event.timestamp >= :startTime"; /** * Query to find deleted events */ private static final String FIND_DELETED_EVENTS_OF_INTEREST_QUERY = "select event from AuditableEventType as event " + "left outer join event.action as action " - + "where action.eventType = :eventType and event.timestamp >= :startTime"; + + "where action.eventType = 'urn:oasis:names:tc:ebxml-regrep:ActionType:delete' and event.timestamp > :startTime"; /** Optional end time clause */ private static final String END_TIME_CLAUSE = " and event.timestamp <= :endTime"; @@ -104,6 +116,17 @@ public class AuditableEventTypeDao extends private static final String GET_EXPIRED_EVENTS_QUERY = "FROM AuditableEventType event where event.timestamp < :" + GET_EXPIRED_EVENTS_QUERY_CUTOFF_PARAMETER; + /** The registry soap services */ + private RegistrySOAPServices soapService; + + /** Sorter for sorting events */ + private static final Comparator EVENT_TIME_COMPARATOR = new Comparator() { + @Override + public int compare(AuditableEventType o1, AuditableEventType o2) { + return o2.getTimestamp().compare(o1.getTimestamp()); + } + }; + /** * Constructor. * @@ -134,6 +157,100 @@ public class AuditableEventTypeDao extends .getTimeInMillis())); } + /** + * Gets all auditable events which reference the objects of interest. + * + * @param subscription + * The subscription to get the events for + * @param serviceAddress + * The address to the registry to use to verify deleted objects + * @param startTime + * The start time boundary of the query + * @param endTime + * The end time boundary of the query + * @param objectsOfInterest + * The objects of interest to get events for + * @return The list of auditable events referencing the objects of interest + * @throws EbxmlRegistryException + * @throws MsgRegistryException + */ + public List getEventsOfInterest( + SubscriptionType subscription, String serviceAddress, + XMLGregorianCalendar startTime, XMLGregorianCalendar endTime, + List objectsOfInterest) + throws EbxmlRegistryException, MsgRegistryException { + List events = new ArrayList(0); + if (!objectsOfInterest.isEmpty()) { + events = getEventsOfInterest(FIND_EVENTS_OF_INTEREST_QUERY, + startTime, endTime, objectsOfInterest); + } + List deleteEvents = getDeleteEventsOfInterest( + subscription, serviceAddress, startTime, endTime); + if (!deleteEvents.isEmpty()) { + events.addAll(deleteEvents); + } + Collections.sort(events, EVENT_TIME_COMPARATOR); + return events; + } + + /** + * Gets applicable delete events + * + * @param subscription + * The subscription to get the events for + * @param serviceAddress + * The address to the registry to use to verify deleted objects + * @param startTime + * The start time boundary of the query + * @param endTime + * The end time boundary of the query + * @return The list of auditable events referencing deleted objects + * @throws EbxmlRegistryException + * @throws MsgRegistryException + */ + private List getDeleteEventsOfInterest( + SubscriptionType subscription, String serviceAddress, + XMLGregorianCalendar startTime, XMLGregorianCalendar endTime) + throws EbxmlRegistryException, MsgRegistryException { + + List retVal = new LinkedList(); + List deletedEvents = getEventsOfInterest( + FIND_DELETED_EVENTS_OF_INTEREST_QUERY, startTime, endTime, null); + try { + URL url = new URL(serviceAddress); + String baseURL = url.toString().replace(url.getPath(), ""); + List remoteRefs = soapService + .getQueryServiceForHost(baseURL) + .executeQuery( + new QueryRequest( + "Deleted Objects of Interest Query for [" + + subscription.getId() + "]", + subscription.getSelector(), + new ResponseOptionType( + QueryReturnTypes.OBJECT_REF, false))) + .getObjectRefList().getObjectRef(); + + for (AuditableEventType event : deletedEvents) { + for (ActionType action : event.getAction()) { + if (action.getAffectedObjectRefs() != null + && !action.getAffectedObjectRefs().getObjectRef() + .isEmpty()) { + if (remoteRefs.contains(action.getAffectedObjectRefs() + .getObjectRef().get(0))) { + retVal.add(event); + } + } + } + } + } catch (MalformedURLException e) { + throw new EbxmlRegistryException( + "Error parsing notification address", e); + } + + return retVal; + + } + /** * Gets the events of interest based on the start time, end time, and the * list of objects of interest @@ -147,13 +264,10 @@ public class AuditableEventTypeDao extends * @return The list of auditable events of interest within the constrains of * the start time, end time and including the objects of interest */ - public List getEventsOfInterest( + private List getEventsOfInterest(String query, XMLGregorianCalendar startTime, XMLGregorianCalendar endTime, List objectsOfInterest) { - String query = FIND_DELETED_EVENTS_OF_INTEREST_QUERY; - List queryParams = new ArrayList(4); - queryParams.add("eventType"); - queryParams.add(ActionTypes.delete); + List queryParams = new ArrayList(2); queryParams.add("startTime"); queryParams.add(startTime); if (!CollectionUtil.isNullOrEmpty(objectsOfInterest)) { @@ -241,4 +355,8 @@ public class AuditableEventTypeDao extends return AuditableEventType.class; } + public void setSoapService(RegistrySOAPServices soapService) { + this.soapService = soapService; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/AuditableEventService.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/AuditableEventService.java index 8aca1d5895..4cf7b7eb58 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/AuditableEventService.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/AuditableEventService.java @@ -19,6 +19,7 @@ **/ package com.raytheon.uf.edex.registry.ebxml.services; +import java.util.ArrayList; import java.util.List; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ActionType; @@ -34,6 +35,7 @@ import oasis.names.tc.ebxml.regrep.xsd.rs.v4.RegistryRequestType; import org.springframework.transaction.annotation.Transactional; import com.google.common.eventbus.Subscribe; +import com.raytheon.uf.common.registry.constants.ActionTypes; import com.raytheon.uf.common.registry.constants.RegistryObjectTypes; import com.raytheon.uf.common.registry.constants.StatusTypes; import com.raytheon.uf.common.registry.ebxml.RegistryUtil; @@ -59,6 +61,7 @@ import com.raytheon.uf.edex.registry.events.CreateAuditTrailEvent; * 10/23/2013 1538 bphillip Removed call to subscription manager. Subscriptions will now * only be run on a quartz timer * 12/2/2013 1829 bphillip Now uses event bus for triggering auditable event generation + * 01/21/2014 2613 bphillip Changed how auditable events are created for deletes * * * @@ -103,12 +106,27 @@ public class AuditableEventService { public void createAuditableEventFromObjects( CreateAuditTrailEvent registryEvent) throws EbxmlRegistryException { if (!CollectionUtil.isNullOrEmpty(registryEvent.getObjectsAffected())) { - AuditableEventType event = createEvent(registryEvent.getRequest(), - TimeUtil.currentTimeMillis()); - addRegistryObjectActionToEvent(event, - registryEvent.getActionType(), - registryEvent.getObjectsAffected()); - auditDao.createOrUpdate(event); + long currentTime = TimeUtil.currentTimeMillis(); + if (ActionTypes.delete.equals(registryEvent.getActionType())) { + for (RegistryObjectType obj : registryEvent + .getObjectsAffected()) { + List regObjList = new ArrayList( + 1); + regObjList.add(obj); + AuditableEventType event = createEvent( + registryEvent.getRequest(), currentTime); + addRegistryObjectActionToEvent(event, + registryEvent.getActionType(), regObjList); + auditDao.createOrUpdate(event); + } + } else { + AuditableEventType event = createEvent( + registryEvent.getRequest(), currentTime); + addRegistryObjectActionToEvent(event, + registryEvent.getActionType(), + registryEvent.getObjectsAffected()); + auditDao.createOrUpdate(event); + } } } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/lifecycle/LifecycleManagerImpl.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/lifecycle/LifecycleManagerImpl.java index 5640c0c25b..823260a8a8 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/lifecycle/LifecycleManagerImpl.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/lifecycle/LifecycleManagerImpl.java @@ -107,6 +107,7 @@ import com.raytheon.uf.edex.registry.events.CreateAuditTrailEvent; * Nov 08, 2013 2506 bgonzale Added RegistryObjectType to RemoveRegistryEvent. * Separate update from create notifications. * 12/2/2013 1829 bphillip Auditable events are not genereted via messages on the event bus + * 01/21/2014 2613 bphillip Removed verbose log message from removeObjects * * * @@ -230,8 +231,6 @@ public class LifecycleManagerImpl implements LifecycleManager { statusHandler .info("No results returned from remove objects query"); } else { - statusHandler.info("Remove objects query returned " - + queryResponse.getRegistryObjects() + " objects"); objectsToRemove.addAll(queryResponse.getRegistryObjects()); } } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/notification/NotificationListenerImpl.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/notification/NotificationListenerImpl.java index d2016cb718..10895c79a8 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/notification/NotificationListenerImpl.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/notification/NotificationListenerImpl.java @@ -92,6 +92,7 @@ import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil; * 10/30/2013 1538 bphillip Changed to use non-static registry soap service client * 12/2/2013 1829 bphillip Added getIdsFrom action method and changed how slots are added to objects * 1/15/2014 2613 bphillip Added batching of notification update queries to reduce number of web service calls + * 01/21/2014 2613 bphillip Added home slot to remove objects request so delete events are properly handled * * * @@ -192,6 +193,9 @@ public class NotificationListenerImpl implements NotificationListener { "Notification delete object submission", null, null, refList, false, true, DeletionScope.DELETE_ALL); + request.getSlot().add( + new SlotType(EbxmlObjectUtil.HOME_SLOT_NAME, + new StringValueType(clientBaseURL))); try { lcm.removeObjects(request); } catch (MsgRegistryException e) { diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/notification/RegistryNotificationManager.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/notification/RegistryNotificationManager.java index 5d2fdc042a..8c7cf1e95f 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/notification/RegistryNotificationManager.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/notification/RegistryNotificationManager.java @@ -74,6 +74,7 @@ import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil; * 10/23/2013 1538 bphillip Adding log messages and changed methods to handle DateTime value on * AuditableEvents instead of integer * 12/9/2013 2613 bphillip Changed start time boundary of get auditable events to be the last run time of the subscription + * 01/21/2014 2613 bphillip Changed start time boundary again and also a few minor cleanup items * * * @author bphillip @@ -136,12 +137,16 @@ public class RegistryNotificationManager { * @param objectsOfInterest * The objects to get events for * @return The events of interest for the given set of objects + * @throws MsgRegistryException + * @throws EbxmlRegistryException */ public List getEventsOfInterest( + SubscriptionType subscription, String serviceAddress, XMLGregorianCalendar startTime, XMLGregorianCalendar endTime, - List objectsOfInterest) { - return this.auditableEventDao.getEventsOfInterest(startTime, endTime, - objectsOfInterest); + List objectsOfInterest) + throws EbxmlRegistryException, MsgRegistryException { + return this.auditableEventDao.getEventsOfInterest(subscription, + serviceAddress, startTime, endTime, objectsOfInterest); } /** @@ -221,28 +226,26 @@ public class RegistryNotificationManager { * If errors occur while sending the notifications * @throws MsgRegistryException */ - protected void sendNotifications( - SubscriptionNotificationListeners notificationListeners) - throws EbxmlRegistryException, MsgRegistryException { + protected XMLGregorianCalendar sendNotifications( + SubscriptionNotificationListeners notificationListeners, + XMLGregorianCalendar startTime) throws EbxmlRegistryException, + MsgRegistryException { + // Object to hold the last timestampe of the latest event in order to + // update the subscription last run time correctly + XMLGregorianCalendar lastTime = null; final List listeners = notificationListeners.listeners; final SubscriptionType subscription = notificationListeners.subscription; List objectsOfInterest = getObjectsOfInterest(subscription); - XMLGregorianCalendar startTime = subscription - .getSlotValue(EbxmlObjectUtil.SUBSCRIPTION_LAST_RUN_TIME_SLOT_NAME); - - if (startTime == null) { - startTime = subscription.getStartTime(); - } - - List eventsOfInterest = getEventsOfInterest( - subscription.getStartTime(), subscription.getEndTime(), - objectsOfInterest); - - if (!eventsOfInterest.isEmpty()) { - for (NotificationListenerWrapper listener : listeners) { + for (NotificationListenerWrapper listener : listeners) { + List eventsOfInterest = getEventsOfInterest( + subscription, listener.address, startTime, + subscription.getEndTime(), objectsOfInterest); + if (!eventsOfInterest.isEmpty()) { + lastTime = eventsOfInterest.get(eventsOfInterest.size() - 1) + .getTimestamp(); int subListCount = eventsOfInterest.size() / notificationBatchSize; int lastListSize = eventsOfInterest.size() @@ -281,6 +284,7 @@ public class RegistryNotificationManager { } } + return lastTime; } /** @@ -326,23 +330,28 @@ public class RegistryNotificationManager { List actionList = event.getAction(); for (ActionType action : actionList) { objectsToRemove.clear(); + refsToRemove.clear(); if (action.getAffectedObjectRefs() != null) { List objRefs = action .getAffectedObjectRefs().getObjectRef(); for (ObjectRefType obj : objRefs) { boolean found = objectInList(objectsOfInterest, obj); - if (!found && !action.equals(ActionTypes.delete)) { + if (!found + && !action.getEventType().equals( + ActionTypes.delete)) { refsToRemove.add(obj); } } - objRefs.removeAll(objectsToRemove); + objRefs.removeAll(refsToRemove); } else if (action.getAffectedObjects() != null) { List regObjs = action .getAffectedObjects().getRegistryObject(); for (RegistryObjectType obj : regObjs) { boolean found = objectInList(objectsOfInterest, obj); - if (!found && !action.equals(ActionTypes.delete)) { + if (!found + && !action.getEventType().equals( + ActionTypes.delete)) { objectsToRemove.add(obj); } } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/notification/RegistrySubscriptionManager.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/notification/RegistrySubscriptionManager.java index 52074c75ac..07c6bc51d8 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/notification/RegistrySubscriptionManager.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/notification/RegistrySubscriptionManager.java @@ -81,6 +81,7 @@ import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil; * 11/20/2013 2534 bphillip Moved method to get notification destinations to utility * 12/9/2013 2613 bphillip Setting last run time of subscription now occurs before notification is sent * 1/15/2014 2613 bphillip Added Hibernate flush and clear after subscription processing + * 01/21/2014 2613 bphillip Changed how last run time is updated for replication subscriptions * * * @author bphillip @@ -388,9 +389,19 @@ public class RegistrySubscriptionManager implements } statusHandler.info("Processing subscription [" + subscriptionName + "]..."); - updateLastRunTime(subscription, TimeUtil.currentTimeMillis()); - notificationManager.sendNotifications(listeners - .get(subscriptionName)); + XMLGregorianCalendar startTime = subscription + .getSlotValue(EbxmlObjectUtil.SUBSCRIPTION_LAST_RUN_TIME_SLOT_NAME); + + if (startTime == null) { + startTime = subscription.getStartTime(); + } + XMLGregorianCalendar lastEventTime = notificationManager + .sendNotifications(listeners.get(subscriptionName), + startTime); + if (lastEventTime != null) { + updateLastRunTime(subscription, lastEventTime + .toGregorianCalendar().getTimeInMillis()); + } } catch (Throwable e) { statusHandler.error( "Errors occurred while processing subscription [" diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/plugins/GetNotification.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/plugins/GetNotification.java index 29e1716f40..743004d5e5 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/plugins/GetNotification.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/plugins/GetNotification.java @@ -64,6 +64,7 @@ import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil; * Jun 24, 2013 2106 djohnson Requires a transaction to be open, will not create one. * 10/8/2013 1682 bphillip Refactored querying * 11/20/2013 2534 bphillip Changed call to getNotificationDestinations which is not in a utility class + * 01/21/2014 2613 bphillip Modifications to account for changed method signatures in RegistryNotificationManager * * * @@ -135,8 +136,15 @@ public class GetNotification extends RegistryQueryPlugin { List objectsOfInterest = notificationManager .getObjectsOfInterest(subscription); - List eventsOfInterest = notificationManager - .getEventsOfInterest(startTime, null, objectsOfInterest); + List eventsOfInterest = null; + try { + eventsOfInterest = notificationManager.getEventsOfInterest( + subscription, destinations.get(0).getDestination(), + startTime, null, objectsOfInterest); + } catch (EbxmlRegistryException e1) { + throw EbxmlExceptionUtil.createMsgRegistryException( + "Error getting events!", e1); + } try { return createResponse(Arrays.asList(notificationManager .getNotification(subscription, "Test Address", From 2f452749c2d72a03fe25564fd40a3baa0b91754d Mon Sep 17 00:00:00 2001 From: Dave Hladky Date: Wed, 22 Jan 2014 15:03:01 -0600 Subject: [PATCH 04/21] Issue #2731 Fixed calendar conversion issuse with OGC Change-Id: I78bd0fd36082302bcbc83062671c8d77236cb632 Former-commit-id: 973e5ab34bad3c5147f47bdbc0bd46e8d215b37f [formerly 973e5ab34bad3c5147f47bdbc0bd46e8d215b37f [formerly 9667ac26165431819cddab45ec2e081b6a560da8]] Former-commit-id: 61c51336124ee0183523e0b38edc3a540783f277 Former-commit-id: 786f3d197841692a74296dd7b27ff45276cd49a1 --- .../raytheon/uf/common/dataplugin/madis/MadisRecord.java | 9 +++++---- .../raytheon/uf/common/time/util/CalendarConverter.java | 3 ++- .../uf/edex/plugin/madis/ogc/MadisFeatureFactory.java | 7 ++++--- .../uf/edex/plugin/madis/ogc/MadisLayerCollector.java | 6 ++---- .../raytheon/uf/edex/plugin/madis/ogc/feature/Madis.java | 9 +++++---- .../madis/registry/MadisRegistryCollectorAddon.java | 3 ++- .../com/raytheon/uf/edex/plugin/madis/MadisDecoder.java | 7 +++++-- 7 files changed, 25 insertions(+), 19 deletions(-) diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.madis/src/com/raytheon/uf/common/dataplugin/madis/MadisRecord.java b/edexOsgi/com.raytheon.uf.common.dataplugin.madis/src/com/raytheon/uf/common/dataplugin/madis/MadisRecord.java index 4b06740e42..dd37c4793a 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.madis/src/com/raytheon/uf/common/dataplugin/madis/MadisRecord.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.madis/src/com/raytheon/uf/common/dataplugin/madis/MadisRecord.java @@ -20,8 +20,8 @@ package com.raytheon.uf.common.dataplugin.madis; * further licensing information. **/ +import java.util.Calendar; import java.util.Collections; -import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -74,6 +74,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * Aug 30, 2013 2298 rjpeter Make getPluginName abstract * Oct 14, 2013 2361 njensen Removed IDecoderGettable * Dec 10, 2013 2616 mpduff Added stationId to the unique constraint + * jan 22, 2014 2713 dhladky Calendar conversion. * * * @@ -124,7 +125,7 @@ public class MadisRecord extends PersistablePluginDataObject implements /** A string denoting the time of observation */ @DynamicSerializeElement @Transient - private Date timeObs; + private Calendar timeObs; /** A float denoting the dewpoint temp */ @DynamicSerializeElement @@ -905,11 +906,11 @@ public class MadisRecord extends PersistablePluginDataObject implements this.pressure_qcr = pressure_qcr; } - public void setTimeObs(Date timeObs) { + public void setTimeObs(Calendar timeObs) { this.timeObs = timeObs; } - public Date getTimeObs() { + public Calendar getTimeObs() { return timeObs; } diff --git a/edexOsgi/com.raytheon.uf.common.time/src/com/raytheon/uf/common/time/util/CalendarConverter.java b/edexOsgi/com.raytheon.uf.common.time/src/com/raytheon/uf/common/time/util/CalendarConverter.java index 77268b284f..2ca31e996f 100644 --- a/edexOsgi/com.raytheon.uf.common.time/src/com/raytheon/uf/common/time/util/CalendarConverter.java +++ b/edexOsgi/com.raytheon.uf.common.time/src/com/raytheon/uf/common/time/util/CalendarConverter.java @@ -41,6 +41,7 @@ import org.apache.commons.beanutils.Converter; * bphillip Initial Creation * Mar 13, 2013 1789 bsteffen Move Calendar and Date parsing out of * ConvertUtil and also fix date parsing. + * jan 22, 2014 2731 dhladky Calendar converter now returns a calendar. * * * @author bphillip @@ -62,7 +63,7 @@ public class CalendarConverter implements Converter { String date = (String) value; try { // see if string is in ISO 8601 - return DatatypeConverter.parseDateTime(date).getTime(); + return DatatypeConverter.parseDateTime(date); } catch (Exception e) { // try to match the pattern. } diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.madis.ogc/src/com/raytheon/uf/edex/plugin/madis/ogc/MadisFeatureFactory.java b/edexOsgi/com.raytheon.uf.edex.plugin.madis.ogc/src/com/raytheon/uf/edex/plugin/madis/ogc/MadisFeatureFactory.java index 4a01d2f377..c2ed9e13f6 100644 --- a/edexOsgi/com.raytheon.uf.edex.plugin.madis.ogc/src/com/raytheon/uf/edex/plugin/madis/ogc/MadisFeatureFactory.java +++ b/edexOsgi/com.raytheon.uf.edex.plugin.madis.ogc/src/com/raytheon/uf/edex/plugin/madis/ogc/MadisFeatureFactory.java @@ -21,7 +21,7 @@ package com.raytheon.uf.edex.plugin.madis.ogc; **/ import java.util.ArrayList; -import java.util.Date; +import java.util.Calendar; import java.util.List; import org.geotools.feature.simple.SimpleFeatureBuilder; @@ -46,6 +46,7 @@ import com.vividsolutions.jts.geom.Point; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 04/01/2013 1746 dhladky Initial creation + * jan 22, 2014 2713 dhladky Calendar conversion. * * * @author dhladky @@ -97,7 +98,7 @@ public class MadisFeatureFactory implements FeatureFactory { getFeatureType()); builder.set(LOCATION_KEY, record.getLocation().getLocation()); builder.set(MadisPointDataTransform.STATION_ID, record.getLocation().getStationId()); - builder.set(MadisPointDataTransform.TIME_OBS, record.getTimeObs().getTime()); + builder.set(MadisPointDataTransform.TIME_OBS, record.getTimeObs()); builder.set(MadisPointDataTransform.PROVIDER, record.getProvider()); builder.set(MadisPointDataTransform.SUB_PROVIDER, record.getSubProvider()); builder.set(MadisPointDataTransform.DATASET, record.getDataset()); @@ -155,7 +156,7 @@ public class MadisFeatureFactory implements FeatureFactory { builder.setDefaultGeometry(LOCATION_KEY); builder.add(LOCATION_KEY, Point.class); builder.add(MadisPointDataTransform.STATION_ID, String.class); - builder.add(MadisPointDataTransform.TIME_OBS, Date.class); + builder.add(MadisPointDataTransform.TIME_OBS, Calendar.class); builder.add(MadisPointDataTransform.PROVIDER, String.class); builder.add(MadisPointDataTransform.SUB_PROVIDER, String.class); builder.add(MadisPointDataTransform.DATASET, Integer.class); diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.madis.ogc/src/com/raytheon/uf/edex/plugin/madis/ogc/MadisLayerCollector.java b/edexOsgi/com.raytheon.uf.edex.plugin.madis.ogc/src/com/raytheon/uf/edex/plugin/madis/ogc/MadisLayerCollector.java index fcb7ad08ac..ce096a1e2c 100644 --- a/edexOsgi/com.raytheon.uf.edex.plugin.madis.ogc/src/com/raytheon/uf/edex/plugin/madis/ogc/MadisLayerCollector.java +++ b/edexOsgi/com.raytheon.uf.edex.plugin.madis.ogc/src/com/raytheon/uf/edex/plugin/madis/ogc/MadisLayerCollector.java @@ -21,7 +21,6 @@ package com.raytheon.uf.edex.plugin.madis.ogc; **/ import java.util.Calendar; -import java.util.TimeZone; import com.raytheon.uf.common.dataplugin.madis.MadisRecord; import com.raytheon.uf.edex.ogc.common.db.ILayerStore; @@ -36,6 +35,7 @@ import com.raytheon.uf.edex.ogc.common.db.SingleLayerCollector; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 04/01/2013 1746 dhladky Initial creation + * jan 22, 2014 2713 dhladky Calendar conversion. * * * @author dhladky @@ -60,9 +60,7 @@ public class MadisLayerCollector extends */ @Override protected Calendar getTime(MadisRecord record) { - Calendar rval = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - rval.setTime(record.getTimeObs()); - return rval; + return record.getTimeObs(); } } diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.madis.ogc/src/com/raytheon/uf/edex/plugin/madis/ogc/feature/Madis.java b/edexOsgi/com.raytheon.uf.edex.plugin.madis.ogc/src/com/raytheon/uf/edex/plugin/madis/ogc/feature/Madis.java index 0f8470d055..1fb06ec5ab 100644 --- a/edexOsgi/com.raytheon.uf.edex.plugin.madis.ogc/src/com/raytheon/uf/edex/plugin/madis/ogc/feature/Madis.java +++ b/edexOsgi/com.raytheon.uf.edex.plugin.madis.ogc/src/com/raytheon/uf/edex/plugin/madis/ogc/feature/Madis.java @@ -24,6 +24,7 @@ import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; +import java.util.TimeZone; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -56,6 +57,7 @@ import com.raytheon.uf.edex.ogc.common.feature.ObsLocation; * Jun 03, 2013 1763 dhladky Altered QCD values map * Aug 30, 2013 2298 rjpeter Make getPluginName abstract * Sept 19,2013 2388 dhladky Fixed creation of geometry (location assignment) + * jan 22, 2014 2713 dhladky Calendar conversion. * * * @author dhladky @@ -250,10 +252,9 @@ public class Madis extends AbstractFeatureType { record.setSubProvider(this.getSub_provider()); record.setDataset(this.getDataset()); record.setRestriction(this.getRestriction()); - Date date = new Date(this.getTimeObs().toGregorianCalendar() - .getTimeInMillis()); - record.setDataTime(new DataTime(date)); - record.setTimeObs(date); + Calendar cal = this.getTimeObs().toGregorianCalendar(); + record.setDataTime(new DataTime(cal.getTime())); + record.setTimeObs(cal); record.setLocation(getSfcObsLocation(this.getObsLocation())); record.setDewpoint(this.getDewpoint()); record.setDewpoint_qcd(QCD.fromVal(this.getDewpoint_qcd())); diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.madis.registry/src/com/raytheon/uf/edex/plugin/madis/registry/MadisRegistryCollectorAddon.java b/edexOsgi/com.raytheon.uf.edex.plugin.madis.registry/src/com/raytheon/uf/edex/plugin/madis/registry/MadisRegistryCollectorAddon.java index 237523dc73..00a781a4b0 100644 --- a/edexOsgi/com.raytheon.uf.edex.plugin.madis.registry/src/com/raytheon/uf/edex/plugin/madis/registry/MadisRegistryCollectorAddon.java +++ b/edexOsgi/com.raytheon.uf.edex.plugin.madis.registry/src/com/raytheon/uf/edex/plugin/madis/registry/MadisRegistryCollectorAddon.java @@ -44,6 +44,7 @@ import com.raytheon.uf.edex.plugin.madis.ogc.MadisLayer; * Sept 2, 2013 #2098 dhladky Improved time management. * Sept 9, 2013 #2351 dhladky Speed improvements * Jan 13, 2014 #2679 dhladky multiple ingest layers for a single request window. + * jan 22, 2014 2713 dhladky Calendar conversion. * * * @@ -79,7 +80,7 @@ public class MadisRegistryCollectorAddon extends */ @Override protected Date getTime(MadisRecord record) { - Date time = record.getTimeObs(); + Date time = record.getTimeObs().getTime(); return time; } diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.madis/src/com/raytheon/uf/edex/plugin/madis/MadisDecoder.java b/edexOsgi/com.raytheon.uf.edex.plugin.madis/src/com/raytheon/uf/edex/plugin/madis/MadisDecoder.java index 496fd9db79..9a1d3d1c6a 100644 --- a/edexOsgi/com.raytheon.uf.edex.plugin.madis/src/com/raytheon/uf/edex/plugin/madis/MadisDecoder.java +++ b/edexOsgi/com.raytheon.uf.edex.plugin.madis/src/com/raytheon/uf/edex/plugin/madis/MadisDecoder.java @@ -24,6 +24,7 @@ import java.io.File; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.TimeZone; @@ -56,6 +57,7 @@ import com.vividsolutions.jts.geom.Coordinate; * Jun 17, 2013 2113 dhladky QPID memory usage alleviation * Aug 30, 2013 2298 rjpeter Make getPluginName abstract * Dec 10, 2013 2616 mpduff Set overwrite allowed on MadisRecord. + * jan 22, 2014 2713 dhladky Calendar conversion. * * * @author dhladky @@ -792,9 +794,10 @@ public class MadisDecoder extends AbstractDecoder { sb.append(":01"); try { - Date time = getDateFormatter().get().parse(sb.toString()); - rec.setTimeObs(time); + Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + cal.setTime(time); + rec.setTimeObs(cal); } catch (ParseException e) { statusHandler.handle(Priority.PROBLEM, From 5c14bbf179354e0ee83d97a3a4075534769d2127 Mon Sep 17 00:00:00 2001 From: Ben Steffensmeier Date: Wed, 22 Jan 2014 15:46:51 -0600 Subject: [PATCH 05/21] Issue #2602 Don't try to load classes from uninstalled bundles. Former-commit-id: 0c4fc0dd0142dccb6e4725e1ed837eb05b140469 [formerly 0c4fc0dd0142dccb6e4725e1ed837eb05b140469 [formerly 30ca0135046851884e4a07b36559fce086ccd3f2]] Former-commit-id: 31877547364fd0fd51413b7ea8c4f3ec14906267 Former-commit-id: d1dbd0c9b6ac7b19a2c783590c45372d01378638 --- .../viz/core/reflect/BundleReflections.java | 23 ++++++++++++++----- .../uf/viz/core/reflect/SubClassLocator.java | 8 +++++++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/reflect/BundleReflections.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/reflect/BundleReflections.java index e3e0f6a6ab..7b2cc8518a 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/reflect/BundleReflections.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/reflect/BundleReflections.java @@ -20,6 +20,7 @@ package com.raytheon.uf.viz.core.reflect; import java.io.IOException; +import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -45,6 +46,7 @@ import org.reflections.util.ConfigurationBuilder; * Date Ticket# Engineer Description * ------------- -------- ----------- -------------------------- * Oct 21, 2013 2491 bsteffen Initial creation + * Jan 22, 2014 2062 bsteffen Handle bundles with no wiring. * * * @@ -54,19 +56,28 @@ import org.reflections.util.ConfigurationBuilder; public class BundleReflections { - private Reflections reflections; + private final Reflections reflections; public BundleReflections(Bundle bundle, Scanner scanner) throws IOException { ConfigurationBuilder cb = new ConfigurationBuilder(); BundleWiring bundleWiring = bundle.adapt(BundleWiring.class); - cb.addClassLoader(bundleWiring.getClassLoader()); - cb.addUrls(FileLocator.getBundleFile(bundle).toURI().toURL()); - cb.setScanners(scanner); - reflections = cb.build(); + if (bundleWiring != null) { + cb.addClassLoader(bundleWiring.getClassLoader()); + cb.addUrls(FileLocator.getBundleFile(bundle).toURI().toURL()); + cb.setScanners(scanner); + reflections = cb.build(); + } else { + reflections = null; + } + } public Set> getSubTypesOf(final Class type) { - return reflections.getSubTypesOf(type); + if (reflections == null) { + return Collections.emptySet(); + } else { + return reflections.getSubTypesOf(type); + } } public Set> getSubTypesOf(Class... types) { diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/reflect/SubClassLocator.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/reflect/SubClassLocator.java index 49de8e9701..c375f7a8ec 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/reflect/SubClassLocator.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/reflect/SubClassLocator.java @@ -145,6 +145,14 @@ public class SubClassLocator implements ISubClassLocator { */ return Collections.emptySet(); } + + if(bundle.getState() == Bundle.UNINSTALLED){ + /* + * We won't be able to get a class loader for uninstalled bundles so + * don't process them. + */ + return Collections.emptySet(); + } if (includeRequiredSubclasses) { /* Short circut if we already did this. */ From f3b1369a32ff288fdb29449d52a33683e45b01f7 Mon Sep 17 00:00:00 2001 From: Nate Jensen Date: Wed, 22 Jan 2014 17:06:43 -0600 Subject: [PATCH 06/21] Issue #2359 updated readme with bscalio suggestions Change-Id: I25356e9c6e89473a5442ca1bfdab29b41a996694 Former-commit-id: 90a7339f6dd21be74d7f5192d397de6b16164895 [formerly 90a7339f6dd21be74d7f5192d397de6b16164895 [formerly 2c9c6f8aee77f96911d698bc2031af5e01f03ee0]] Former-commit-id: b08d9d4932e351b8ee24dc1a38e6502f09b77e03 Former-commit-id: 3f4c9a1d0560c86996f8dac90e83600077c820e4 --- .../build.edex/esb/conf/logback-ingest.xml | 3 +- .../com.raytheon.uf.logsrv/README.txt | 33 ++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/edexOsgi/build.edex/esb/conf/logback-ingest.xml b/edexOsgi/build.edex/esb/conf/logback-ingest.xml index f987275dae..d040b385c1 100644 --- a/edexOsgi/build.edex/esb/conf/logback-ingest.xml +++ b/edexOsgi/build.edex/esb/conf/logback-ingest.xml @@ -200,8 +200,9 @@ - + + diff --git a/javaUtilities/com.raytheon.uf.logsrv/README.txt b/javaUtilities/com.raytheon.uf.logsrv/README.txt index 9de747f42d..cc6f03b682 100644 --- a/javaUtilities/com.raytheon.uf.logsrv/README.txt +++ b/javaUtilities/com.raytheon.uf.logsrv/README.txt @@ -36,6 +36,9 @@ the tar.gz file. Next go into the conf directory and modify config.xml to the default. Once your config settings are right, run the bin/logsrv.sh script to start the log service. + + Setup of Client Processes + ------------------ At this point the log service is running but nothing is reporting to it. You can configure any Java process using logback to report to it, but with the current version that is just EDEX and CAVE. (Note technically you could @@ -73,7 +76,8 @@ the tar.gz file. Next go into the conf directory and modify config.xml to in receiver.xml. You can alter the threshold if need be. Next you must add your new remoteLogSrv appender to a logger. Note that a - logger can have multiple appenders. For EDEX, the recommendation is to add + logger can have multiple appenders, but any logger with additivity="false" will + not go through the root log. For EDEX, the recommendation is to add it to the root logger. For example: @@ -111,6 +115,33 @@ everything configured even if the log service or the reporting processes are not running. +Impacts +------------- +The log service has very little overhead. The appenders, as configured, will be just +another appender so the "normal" logs will continue to function as usual. With the +threshold configuration, only WARN and ERROR messages are sent to the log +service. All of this is done asynchronously so the processing threads that logged +a message will not wait for the message to get sent. Messages sent to the +service are sent over TCP and are buffered. As long as the network path to +the log service is not slower than the rate at which the WARN or ERROR messages +are produced, you should not notice any slowdowns or impacts due to processes +reporting to the log service. + +Of course, the less an application produces WARN or ERROR messages, the less +overhead. And the reporting can always be disabled by undoing the modifications +to logback configuration files specified in the setup instructions. Again, if you +disable reporting to the log service, you do not need to restart the Java process. + + +More information +-------------- +For more information about the socket appender, please see +http://logback.qos.ch/manual/appenders.html#SocketAppender + +For more information about logback configuration files, please see +http://logback.qos.ch/manual/configuration.html#syntax + + Bugs and/or Improvements -------------- If you encounter a bug with the log service or have an idea of how it can be From 8cdb888e20e72b1d46c7ad9a6c8757e265b1526f Mon Sep 17 00:00:00 2001 From: Ben Steffensmeier Date: Thu, 23 Jan 2014 12:41:16 -0600 Subject: [PATCH 07/21] Issue #2363 Add General implementation od IColormapShadedShapeExtension so that all targets will be able to render filled wind barbs. Former-commit-id: 6aa6683258b74797eef3680a7a1533a3433dac8f [formerly 6aa6683258b74797eef3680a7a1533a3433dac8f [formerly e214a045c4d45532ed80fb4cdd51355c7884a2ee]] Former-commit-id: a92f6e9bb6239d0a2a519683852187a6f8c1f018 Former-commit-id: b90004e46ac8c2dc738272a813275f3b0e319f0c --- cave/com.raytheon.uf.viz.core/plugin.xml | 3 + .../GeneralColormapShadedShapeExtension.java | 267 ++++++++++++++++++ .../util/VectorGraphicsRenderable.java | 2 +- 3 files changed, 271 insertions(+), 1 deletion(-) create mode 100644 cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/GeneralColormapShadedShapeExtension.java diff --git a/cave/com.raytheon.uf.viz.core/plugin.xml b/cave/com.raytheon.uf.viz.core/plugin.xml index a8d4cfa4c8..019190c77c 100644 --- a/cave/com.raytheon.uf.viz.core/plugin.xml +++ b/cave/com.raytheon.uf.viz.core/plugin.xml @@ -106,5 +106,8 @@ + + diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/GeneralColormapShadedShapeExtension.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/GeneralColormapShadedShapeExtension.java new file mode 100644 index 0000000000..2bb9c1f346 --- /dev/null +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/drawables/ext/colormap/GeneralColormapShadedShapeExtension.java @@ -0,0 +1,267 @@ +/** + * 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.viz.core.drawables.ext.colormap; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.eclipse.swt.graphics.RGB; +import org.geotools.coverage.grid.GeneralGridGeometry; + +import com.raytheon.uf.viz.core.IGraphicsTarget; +import com.raytheon.uf.viz.core.drawables.IShadedShape; +import com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension; +import com.raytheon.uf.viz.core.exception.VizException; +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.GeometryCollection; +import com.vividsolutions.jts.geom.LineString; +import com.vividsolutions.jts.geom.Polygon; + +/** + * For targets which cannot optimize support of {@link IColormapShadedShape} + * this will provide an inefficient default that simply generates a shaded shape + * whenever draw is called with new colors. + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date          Ticket#  Engineer    Description
+ * ------------- -------- ----------- --------------------------
+ * Jan 23, 2014  2363     bsteffen    Initial creation
+ * 
+ * 
+ * + * @author bsteffen + * @version 1.0 + */ +public class GeneralColormapShadedShapeExtension extends + GraphicsExtension implements + IColormapShadedShapeExtension { + + @Override + public GeneralColormapShadedShape createColormapShadedShape( + GeneralGridGeometry targetGeometry, boolean tesselate) { + return new GeneralColormapShadedShape(targetGeometry, tesselate); + } + + @Override + public IShadedShape createShadedShape(IColormapShadedShape baseShape, + Map colors) { + GeneralColormapShadedShape generalShape = (GeneralColormapShadedShape) baseShape; + return generalShape.generateShape(target, colors); + } + + @Override + public void drawColormapShadedShape(IColormapShadedShape shape, + Map colors, float alpha, float brightness) + throws VizException { + if (shape.isDrawable()) { + GeneralColormapShadedShape generalShape = (GeneralColormapShadedShape) shape; + IShadedShape shadedShape = generalShape.getShape(target, + colors); + target.drawShadedShape(shadedShape, alpha, brightness); + } + } + + @Override + public int getCompatibilityValue(IGraphicsTarget target) { + return Compatibilty.GENERIC; + } + + /** + * Contains all the interesting logic for this extension. Basic + * functionality is to save off the LineStrings for each add operation so + * that a real {@link IShadedShape} can be generated when the colors are + * provided. Also keeps around a shape after rendering for potential reuse + * if the colors don't change. + */ + private static class GeneralColormapShadedShape implements + IColormapShadedShape { + + private final GeneralGridGeometry targetGeometry; + + private final boolean tesselate; + + private List addPairs = new ArrayList(); + + private Map lastColors; + + private IShadedShape lastShape; + + private GeneralColormapShadedShape(GeneralGridGeometry targetGeometry, + boolean tesselate) { + this.targetGeometry = targetGeometry; + this.tesselate = tesselate; + } + + /** + * Get a shaded shape that can be used to render this. This method also + * implements the caching if colors doesn't change. + * + * @param target + * the target be rendered onto. + * @param colors + * the colors to use for the shape + * @return the shape to render. + */ + public IShadedShape getShape(IGraphicsTarget target, + Map colors) { + if (!colors.equals(lastColors)) { + if (lastShape != null) { + lastShape.dispose(); + } + lastShape = generateShape(target, colors); + lastColors = new HashMap(colors); + } + + return lastShape; + } + + /** + * Generate a new {@link IShadedShape} that renders identically to this. + * + * @param target + * the target be rendered onto. + * @param colors + * the colors to use for the shape + * @return a new shape that will render the same as this shape with + * colors applied. + */ + public IShadedShape generateShape(IGraphicsTarget target, + Map colors) { + IShadedShape shape = target.createShadedShape(true, targetGeometry, + tesselate); + for (AddPair pair : addPairs) { + if (pair.pixelSpace) { + shape.addPolygonPixelSpace(pair.lineString, + colors.get(pair.colorKey)); + } else { + shape.addPolygon(pair.lineString, colors.get(pair.colorKey)); + } + } + return shape; + } + + @Override + public void compile() { + if (lastShape != null) { + lastShape.compile(); + } + } + + @Override + public boolean isMutable() { + if (lastShape != null) { + return lastShape.isMutable(); + } + return true; + } + + @Override + public boolean isDrawable() { + return !addPairs.isEmpty(); + } + + @Override + public void dispose() { + if (lastShape != null) { + lastShape.dispose(); + lastShape = null; + } + addPairs = new ArrayList(); + } + + @Override + public void reset() { + lastShape.reset(); + lastColors.clear(); + addPairs = new ArrayList(); + } + + @Override + public Collection getColorKeys() { + Set keys = new HashSet(addPairs.size(), 1.0f); + + return keys; + } + + @Override + public void addPolygon(LineString[] lineString, Object colorKey) { + addPairs.add(new AddPair(lineString, colorKey, false)); + if (lastShape != null && lastColors != null) { + lastShape.addPolygon(lineString, lastColors.get(colorKey)); + } + } + + @Override + public void addPolygonPixelSpace(LineString[] contours, Object colorKey) { + addPairs.add(new AddPair(contours, colorKey, true)); + if (lastShape != null && lastColors != null) { + lastShape.addPolygonPixelSpace(contours, + lastColors.get(colorKey)); + } + } + + @Override + public void addGeometry(Geometry geometry, Object colorKey) { + if (geometry instanceof GeometryCollection) { + GeometryCollection geomCollection = (GeometryCollection) geometry; + for (int i = 0; i < geomCollection.getNumGeometries(); i++) { + addGeometry(geomCollection.getGeometryN(i), colorKey); + } + } else if (geometry instanceof LineString) { + LineString[] lineStrings = { (LineString) geometry }; + addPolygon(lineStrings, colorKey); + } else if (geometry instanceof Polygon) { + LineString[] lineStrings = { ((Polygon) geometry) + .getExteriorRing() }; + addPolygon(lineStrings, colorKey); + } + } + + } + + /** + * Simple Object for storing the parameters to any of the add methods on + * {@link IColormapShadedShape}. + */ + private static class AddPair { + public final LineString[] lineString; + + public final Object colorKey; + + public final boolean pixelSpace; + + public AddPair(LineString[] lineString, Object colorKey, + boolean pixelSpace) { + this.lineString = lineString; + this.colorKey = colorKey; + this.pixelSpace = pixelSpace; + } + + } + +} diff --git a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/util/VectorGraphicsRenderable.java b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/util/VectorGraphicsRenderable.java index f38d1ff12a..1fabca82c7 100644 --- a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/util/VectorGraphicsRenderable.java +++ b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/util/VectorGraphicsRenderable.java @@ -278,7 +278,7 @@ public class VectorGraphicsRenderable { lineShape.addLineSegment(new double[][] { { ix2, jy2 }, { ix3, jy3 } }); if (config.isBarbFillFiftyTriangle()) { - double[] triangleRaw = { ix1, jy1, ix2, jy2, ix3, jy3 }; + double[] triangleRaw = { ix1, jy1, ix2, jy2, ix3, jy3, ix1, jy1 }; CoordinateSequence triangleSeq = new PackedCoordinateSequence.Double( triangleRaw, 2); LineString triangleLS = new GeometryFactory() From 69e4c10344dbc09bbc1cdd8e2ff4e977305c26a0 Mon Sep 17 00:00:00 2001 From: Nate Jensen Date: Thu, 23 Jan 2014 18:09:50 -0600 Subject: [PATCH 08/21] Issue #2359 remove ignore threads capability since it was a hack to stop shef and there's a better way to stop shef Change-Id: I8c2fc8279937aca4e15ea52197081c8271d0c55c Former-commit-id: d5239174f64feecf71d8b9329a642bc204d4386b [formerly d5239174f64feecf71d8b9329a642bc204d4386b [formerly 99f45c9a2ae2e82ba88dd8df7e2c008bda863a9e]] Former-commit-id: 52eaaa17d0120b9bfc778f0f8660f496d8ccd61f Former-commit-id: 4d51cd6d86f0a21cdc173710838200d8ad701c6b --- .../com.raytheon.uf.logsrv/conf/config.xml | 3 --- .../com/raytheon/uf/logsrv/config/LogSrvConfig.java | 11 ----------- .../com/raytheon/uf/logsrv/derby/DerbyAppender.java | 13 ------------- 3 files changed, 27 deletions(-) diff --git a/javaUtilities/com.raytheon.uf.logsrv/conf/config.xml b/javaUtilities/com.raytheon.uf.logsrv/conf/config.xml index 040c26a685..c7f04fdab9 100644 --- a/javaUtilities/com.raytheon.uf.logsrv/conf/config.xml +++ b/javaUtilities/com.raytheon.uf.logsrv/conf/config.xml @@ -24,7 +24,4 @@ --> 00:45 - - shefThreadPool - \ No newline at end of file diff --git a/javaUtilities/com.raytheon.uf.logsrv/src/com/raytheon/uf/logsrv/config/LogSrvConfig.java b/javaUtilities/com.raytheon.uf.logsrv/src/com/raytheon/uf/logsrv/config/LogSrvConfig.java index ed1d540533..3e4bffca58 100644 --- a/javaUtilities/com.raytheon.uf.logsrv/src/com/raytheon/uf/logsrv/config/LogSrvConfig.java +++ b/javaUtilities/com.raytheon.uf.logsrv/src/com/raytheon/uf/logsrv/config/LogSrvConfig.java @@ -68,9 +68,6 @@ public class LogSrvConfig { @XmlElement private String timeToSend; - @XmlElement - private String ignoreThreads; - public String getFromAddress() { return fromAddress; } @@ -127,14 +124,6 @@ public class LogSrvConfig { this.databaseDir = databaseDir; } - public String getIgnoreThreads() { - return ignoreThreads; - } - - public void setIgnoreThreads(String ignoreThreads) { - this.ignoreThreads = ignoreThreads; - } - /** * Validates that the config has every value set. */ diff --git a/javaUtilities/com.raytheon.uf.logsrv/src/com/raytheon/uf/logsrv/derby/DerbyAppender.java b/javaUtilities/com.raytheon.uf.logsrv/src/com/raytheon/uf/logsrv/derby/DerbyAppender.java index 1b955c9b2d..0108340465 100644 --- a/javaUtilities/com.raytheon.uf.logsrv/src/com/raytheon/uf/logsrv/derby/DerbyAppender.java +++ b/javaUtilities/com.raytheon.uf.logsrv/src/com/raytheon/uf/logsrv/derby/DerbyAppender.java @@ -47,15 +47,9 @@ public class DerbyAppender extends AppenderBase { private DerbyDao dao; - private String[] ignoreThreads; - public DerbyAppender() { super(); dao = DerbyDao.getInstance(); - String ignore = dao.getConfig().getIgnoreThreads(); - if (ignore != null) { - ignoreThreads = ignore.split(","); - } } @Override @@ -78,13 +72,6 @@ public class DerbyAppender extends AppenderBase { * @return */ private boolean shouldStoreMsg(ILoggingEvent event) { - if (ignoreThreads != null) { - for (String ignore : ignoreThreads) { - if (event.getThreadName().startsWith(ignore)) { - return false; - } - } - } return true; } } From 0c9e6136745d1d82c3d811f934833381ceee94a4 Mon Sep 17 00:00:00 2001 From: Nate Jensen Date: Thu, 23 Jan 2014 18:04:11 -0600 Subject: [PATCH 09/21] Issue #2359 printout shutdown of application to try and detect kills Change-Id: I113890428cfd5a22c2fbb0a4abdcff18a4ccd11e Former-commit-id: 47d6e5b54fe532d3b32a8f478e0fcd1104fd6fe4 [formerly 47d6e5b54fe532d3b32a8f478e0fcd1104fd6fe4 [formerly 34b2c7a402bcf7f3b04ea1e98090f7e0df48566f]] Former-commit-id: cdbd05b2935fd9ea015dec56a1d684e1f3739841 Former-commit-id: 7dd0b1c97817690899bcfd338002e77958bb3a9c --- .../uf/viz/application/VizApplication.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/cave/com.raytheon.uf.viz.application/src/com/raytheon/uf/viz/application/VizApplication.java b/cave/com.raytheon.uf.viz.application/src/com/raytheon/uf/viz/application/VizApplication.java index 777fdcdf63..9400e36ff9 100644 --- a/cave/com.raytheon.uf.viz.application/src/com/raytheon/uf/viz/application/VizApplication.java +++ b/cave/com.raytheon.uf.viz.application/src/com/raytheon/uf/viz/application/VizApplication.java @@ -19,6 +19,10 @@ package com.raytheon.uf.viz.application; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtensionPoint; @@ -39,6 +43,7 @@ import com.raytheon.uf.viz.application.component.IStandaloneComponent; * Apr 18, 2007 chammack Initial Creation. * Dec 03, 2007 461 bphillip Added persistence of workstation time to localization * Oct 07, 2008 1433 chammack Added alertviz startup + * Jan 23, 2014 njensen Added shutdown hook and printout * * * @@ -54,6 +59,7 @@ public class VizApplication implements IApplication { * @seeorg.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app. * IApplicationContext) */ + @Override public Object start(IApplicationContext context) throws Exception { String appToRun = ProgramArguments.getInstance() @@ -78,6 +84,8 @@ public class VizApplication implements IApplication { return IApplication.EXIT_OK; } + addShutdownHook(); + return component.startComponent(appToRun); } @@ -86,6 +94,7 @@ public class VizApplication implements IApplication { * * @see org.eclipse.equinox.app.IApplication#stop() */ + @Override public void stop() { } @@ -123,4 +132,29 @@ public class VizApplication implements IApplication { return standalone; } + protected void addShutdownHook() { + Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { + @Override + public void run() { + /* + * This may seem pointless but is actually quite helpful to + * confirm how the process exited. If the process is killed by a + * kill command on a terminal, the console output will have this + * message but not the normal safe shutdown output (see + * com.raytheon.uf.viz.core.Activator's stop() and + * VizWorkbenchAdvisor's preShutdown()). In contrast, a + * spontaneous death of the process or force kill will not have + * this printout. + */ + SimpleDateFormat sdf = new SimpleDateFormat( + "yyyy-MM-dd HH:mm:ss"); + sdf.setTimeZone(TimeZone.getTimeZone("GMT")); + System.out.println(sdf.format(new Date()) + + " VizApplication's runtime shutdown hook triggered"); + } + }) { + + }); + } + } From 29c7f0d814e2871c56b94647bcef7666bf768515 Mon Sep 17 00:00:00 2001 From: Brad Gonzales Date: Fri, 24 Jan 2014 08:38:22 -0600 Subject: [PATCH 10/21] Issue #2709 Fix for recurring subscription active period end. Change-Id: I05778e95fe703c7301205ad14909c843d720fd2e Former-commit-id: e1e7f1c2500a2ef82ad7baddf9a5242f4b343261 [formerly e1e7f1c2500a2ef82ad7baddf9a5242f4b343261 [formerly ddfc4d07aa4591f39ee5590de2d1bb67837e6229]] Former-commit-id: fa10363d40a14369bad2e91533907a99c681842b Former-commit-id: 661f0c98f177408a9dd8b99a934bce737bcdd636 --- .../common/datadelivery/registry/RecurringSubscription.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/RecurringSubscription.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/RecurringSubscription.java index 5283c360fd..c37a7a8e02 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/RecurringSubscription.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/RecurringSubscription.java @@ -66,6 +66,7 @@ import com.raytheon.uf.common.time.util.TimeUtil; * Jan 08, 2014 2615 bgonzale Implement calculate start and calculate end methods. * Jan 14, 2014 2459 mpduff Add subscription state. * Jan 20, 2013 2398 dhladky Fixed rescheduling beyond active period/expired window. + * Jan 24, 2013 2709 bgonzale Fix setting of active period end. * * * @@ -469,7 +470,7 @@ public abstract class RecurringSubscription // active period values are month and day of month only, use base // Calendar for active period year Calendar activePeriodEndCal = TimeUtil.newCalendar(activePeriodEnd); - TimeUtil.maxCalendarFields(activePeriodEndCal, Calendar.MILLISECOND, + TimeUtil.minCalendarFields(activePeriodEndCal, Calendar.MILLISECOND, Calendar.SECOND, Calendar.MINUTE, Calendar.HOUR_OF_DAY); activePeriodEndCal.set(Calendar.YEAR, base.get(Calendar.YEAR)); return activePeriodEndCal; @@ -496,7 +497,7 @@ public abstract class RecurringSubscription boolean hasActivePeriodEnd = activePeriodEnd != null; if (hasActivePeriodEnd) { realEnd = getActivePeriodEnd(endConstraint); - if (realEnd.before(endConstraint)) { + if (realEnd.after(endConstraint)) { realEnd = endConstraint; } } else { From d819cc2512348c55c7d4088bf52e6e2a6630670f Mon Sep 17 00:00:00 2001 From: Ron Anderson Date: Fri, 24 Jan 2014 09:04:11 -0600 Subject: [PATCH 11/21] Issue #2504 Add hostname to log path for GFESuite scripts Change-Id: I734d8f6ec89720d23371bd9c1187ef95eeaf22eb Former-commit-id: 25cf05060d0c8ea339abfb53b38519490c27315b [formerly 25cf05060d0c8ea339abfb53b38519490c27315b [formerly 975cf49b49e6266081e7b9ebcce6782b3e411667]] Former-commit-id: e13a34a8b38e8879c1510a8ce7bb2b73a8f054e8 Former-commit-id: ca80941c5bdee878f0ca715a4df9fc00a88cd85b --- .../utility/edex_static/base/gfe/isc/iscUtil.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/gfe/isc/iscUtil.py b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/gfe/isc/iscUtil.py index 3ad6837ecf..4a72410c98 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/gfe/isc/iscUtil.py +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/gfe/isc/iscUtil.py @@ -19,7 +19,7 @@ ## import string, IrtAccess, JUtil, logging -import xml, pickle, tempfile, os +import xml, pickle, tempfile, os, socket from xml.etree import ElementTree from xml.etree.ElementTree import Element, SubElement import LogStream @@ -50,7 +50,7 @@ from com.raytheon.uf.common.localization import LocalizationContext_Localization # 03/11/13 1759 dgilling Move siteConfig import into # methods where it's needed. # 11/07/13 2517 randerso Allow getLogger to override logLevel -# +# 01/22/14/ 2504 randerso Added hostname to log path # # @@ -285,17 +285,17 @@ def getLogger(scriptName, logName=None, logLevel=logging.INFO): # modify its include path with the proper siteConfig just before # execution time import siteConfig - + hostname = socket.gethostname().split('.')[0] + logPath = os.path.join(siteConfig.GFESUITE_LOGDIR, strftime("%Y%m%d", gmtime()), hostname) if logName is None: - logPath = siteConfig.GFESUITE_LOGDIR + "/" + strftime("%Y%m%d", gmtime()) logName = scriptName + ".log" else: - logPath = os.path.dirname(logName) - if len(logPath) == 0: - logPath = siteConfig.GFESUITE_LOGDIR + "/" + strftime("%Y%m%d", gmtime()) + logDir = os.path.dirname(logName) + if len(logDir) > 0: + logPath = logDir logName = os.path.basename(logName) - logFile = logPath + "/" + logName + logFile = os.path.join(logPath, logName) if not os.path.exists(logPath): os.makedirs(logPath) From fa350b76c9d3cfdc5885b857f4b49d777b65a425 Mon Sep 17 00:00:00 2001 From: Dave Hladky Date: Wed, 22 Jan 2014 16:56:06 -0600 Subject: [PATCH 12/21] Issue #2584 Step one of versioning for DD Change-Id: I456643a92b95de3d4a74dff3a4e7daa9c08c5c00 Former-commit-id: 523e100fd020b15b880d0d011c50db9f43d695c2 [formerly 523e100fd020b15b880d0d011c50db9f43d695c2 [formerly 878f95f025dc07ec6ce73f715cef57193493e9eb]] Former-commit-id: 690b5b73cfb06406849b86dac7bfc13350362a1d Former-commit-id: dccf640640a13f90d770932cfe64b26d841150ed --- .../ebxml-jaxb-datadelivery-registry.xml | 9 +- .../registry/AdhocSubscription.java | 4 + .../DataDeliveryRegistryObjectTypes.java | 52 ++++++++ .../common/datadelivery/registry/DataSet.java | 3 + .../registry/DataSetMetaData.java | 3 + .../datadelivery/registry/DataSetName.java | 3 + .../datadelivery/registry/GriddedTime.java | 2 - .../registry/IDataSetMetaDataVisitor.java | 1 + .../registry/OpenDapGriddedDataSet.java | 7 + .../OpenDapGriddedDataSetMetaData.java | 4 + .../datadelivery/registry/Parameter.java | 4 + .../registry/PendingSharedSubscription.java | 3 + .../registry/PendingSiteSubscription.java | 3 + .../registry/PendingSubscription.java | 1 + .../registry/PointDataSetMetaData.java | 7 + .../datadelivery/registry/Provider.java | 5 +- .../registry/SharedSubscription.java | 4 + .../registry/SiteSubscription.java | 4 + .../datadelivery/registry/Subscription.java | 1 - .../registry/WFSPointDataSet.java | 4 + .../ebxml/DataLevelTypeDescriptionQuery.java | 3 +- .../registry/ebxml/DataLevelTypeQuery.java | 3 +- .../ebxml/DataSetWithFiltersQuery.java | 6 +- .../registry/handlers/DataSetHandler.java | 2 +- .../registry/handlers/IDataSetHandler.java | 2 +- .../handlers/ISiteSubscriptionHandler.java | 2 +- .../raytheon/uf/common/registry/IConvert.java | 47 +++++++ .../annotations/RegistryObjectVersion.java | 51 ++++++++ .../common/registry/ebxml/RegistryUtil.java | 29 +++++ .../encoder/ContentSlotBasedEncoder.java | 14 +- .../encoder/DynamicSerializeEncoder.java | 75 ----------- .../registry/ebxml/encoder/JaxbEncoder.java | 67 +++++++++- .../ebxml/encoder/RegistryEncoders.java | 8 +- .../schemas/ebxml/util/EbxmlJaxbManager.java | 115 +++++++++++++++-- .../schemas/ebxml/util/SerializedType.java | 6 +- .../uf/common/util/ReflectionUtil.java | 21 +++ .../retrieval/RetrievalGenerator.java | 2 +- .../opendap/OpenDAPMetaDataParser.java | 2 +- .../opendap/OpenDAPRetrievalGenerator.java | 2 +- .../edex/plugin/madis/ogc/feature/Madis.java | 2 - .../uf/edex/registry/ebxml/dao/DbInit.java | 3 + .../adhoc/AdhocQueryExpressionManager.java | 121 ------------------ ...HttpProxiedValidClientCredentialsTest.java | 4 +- .../config/HarvesterConfigFixture.java | 2 +- .../registry/GriddedDataSetMetaDataTest.java | 1 + .../PendingSharedSubscriptionFixture.java | 1 + .../registry/PendingSubscriptionTest.java | 1 + .../registry/SharedSubscriptionFixture.java | 1 + .../ebxml/DataSetWithFiltersQueryTest.java | 4 +- .../handlers/MemoryDataSetHandler.java | 2 +- .../ebxml/FactoryRegistryHandlerTest.java | 2 +- .../registry/ebxml/RegistryUtilTest.java | 2 +- .../OpenDAPMetaDataParserNCOMTest.java | 2 +- .../opendap/OpenDAPMetaDataParserRAPTest.java | 2 +- .../subscription/xml/RuleXMLTest.java | 2 +- 55 files changed, 474 insertions(+), 259 deletions(-) create mode 100644 edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/IConvert.java create mode 100644 edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/annotations/RegistryObjectVersion.java delete mode 100644 edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/encoder/DynamicSerializeEncoder.java delete mode 100644 edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/adhoc/AdhocQueryExpressionManager.java diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/res/spring/ebxml-jaxb-datadelivery-registry.xml b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/res/spring/ebxml-jaxb-datadelivery-registry.xml index b12da17cde..533120623c 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/res/spring/ebxml-jaxb-datadelivery-registry.xml +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/res/spring/ebxml-jaxb-datadelivery-registry.xml @@ -1,9 +1,10 @@ - - - + + + \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/AdhocSubscription.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/AdhocSubscription.java index 2f16a46da9..da8dfbfa3c 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/AdhocSubscription.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/AdhocSubscription.java @@ -24,6 +24,7 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; import com.raytheon.uf.common.registry.annotations.RegistryObject; +import com.raytheon.uf.common.registry.annotations.RegistryObjectVersion; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; /** @@ -48,6 +49,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; * Oct 11, 2013 2460 dhladky Restored Adhoc's to registryObject store, WFO only * Oct 23, 2013 2484 dhladky Unique ID for subscriptions updated. * Nov 14, 2013 2548 mpduff Add a subscription type slot. + * jan 23, 2013 2584 dhladky Versions. * * * @@ -61,6 +63,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; @RegistryObject({ Subscription.PROVIDER_NAME_SLOT, Subscription.NAME_SLOT, Subscription.DATA_SET_SLOT, Subscription.OWNER_SLOT, Subscription.ORIGINATING_SITE_SLOT, Subscription.SUBSCRIPTION_TYPE_SLOT }) +@RegistryObjectVersion(value = 1.0f) public class AdhocSubscription extends SiteSubscription { @@ -74,4 +77,5 @@ public class AdhocSubscription extends super(subscription); setGroupName("Adhoc"); } + } diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/DataDeliveryRegistryObjectTypes.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/DataDeliveryRegistryObjectTypes.java index 3ce94af116..a27bcfbe69 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/DataDeliveryRegistryObjectTypes.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/DataDeliveryRegistryObjectTypes.java @@ -19,7 +19,11 @@ **/ package com.raytheon.uf.common.datadelivery.registry; +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; + import com.raytheon.uf.common.registry.ebxml.RegistryUtil; +import com.raytheon.uf.common.registry.ebxml.encoder.IRegistryEncoder; +import com.raytheon.uf.common.serialization.SerializationException; /** * Constants file for data delivery registry object types. @@ -36,6 +40,7 @@ import com.raytheon.uf.common.registry.ebxml.RegistryUtil; * Oct 11, 2013 2460 dhladky Restored Adhoc to registry store, WFO only. * Nov 12, 2013 2506 bgonzale Added is recurring subscription method. * Nov 18, 2013 1736 dhladky Data Set helper method. + * Dec 08, 2013 2584 dhladky Registry versions for objects. * * * @@ -48,6 +53,7 @@ public final class DataDeliveryRegistryObjectTypes { * Private constructor. */ private DataDeliveryRegistryObjectTypes() { + } public static final String DATASETMETADATA = RegistryUtil @@ -67,6 +73,9 @@ public final class DataDeliveryRegistryObjectTypes { public static final String PROVIDER = RegistryUtil .getObjectType(Provider.class); + + public static final String PARAMETER = RegistryUtil + .getObjectType(Parameter.class); /** * Is the object type a recurring subscription type, excluding adhoc @@ -94,4 +103,47 @@ public final class DataDeliveryRegistryObjectTypes { return DataDeliveryRegistryObjectTypes.DATASETMETADATA .equals(objectType); } + + /** + * Convert the object if necessary + * + * @param content + * @param encoder + * @return + */ + public static Object convertObject(Object content, + IRegistryEncoder encoder) { + + /** + * TODO In next step attempt to + * do a conversion + */ + throw new IllegalArgumentException( + "Can not convert Data Delivery Registry Objects in this release!"); + + } + + + /** + * Gets the object from the encoder, checking to see if conversion is + * necessary or not. + * + * @param registryObjectType + * @param encoder + * @return + * @throws SerializationException + */ + public static Object getObject(RegistryObjectType registryObjectType, + IRegistryEncoder encoder) throws SerializationException { + + Object object = encoder.decodeObject(registryObjectType); + + //Returned content. Object is of different version! + if (object instanceof String) { + object = convertObject(object, encoder); + } + + return object; + } + } diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/DataSet.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/DataSet.java index da64088909..9a64bf91e6 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/DataSet.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/DataSet.java @@ -18,6 +18,7 @@ import com.raytheon.uf.common.registry.annotations.RegistryObjectAssociation; import com.raytheon.uf.common.registry.annotations.RegistryObjectDescription; import com.raytheon.uf.common.registry.annotations.RegistryObjectName; import com.raytheon.uf.common.registry.annotations.RegistryObjectOwner; +import com.raytheon.uf.common.registry.annotations.RegistryObjectVersion; import com.raytheon.uf.common.registry.annotations.SlotAttribute; import com.raytheon.uf.common.registry.annotations.SlotAttributeConverter; import com.raytheon.uf.common.registry.ebxml.MapValuesResolver; @@ -41,6 +42,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * Sep 07, 2012 1102 djohnson Remove invalid {@code @XmlRootElement}. * Nov 19, 2012 1166 djohnson Clean up JAXB representation of registry objects. * Dec 18, 2013 2636 mpduff Add a data availability delay for the dataset. + * jan 23, 2013 2584 dhladky Versions. * * * @@ -50,6 +52,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize @RegistryObject({ "providerName", "collectionName", "dataSetName" }) +@RegistryObjectVersion(value = 1.0f) public abstract class DataSet { @RegistryObjectOwner diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/DataSetMetaData.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/DataSetMetaData.java index a862c7908d..2bd34d4968 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/DataSetMetaData.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/DataSetMetaData.java @@ -17,6 +17,7 @@ import com.raytheon.uf.common.registry.annotations.RegistryObject; import com.raytheon.uf.common.registry.annotations.RegistryObjectDescription; import com.raytheon.uf.common.registry.annotations.RegistryObjectName; import com.raytheon.uf.common.registry.annotations.RegistryObjectOwner; +import com.raytheon.uf.common.registry.annotations.RegistryObjectVersion; import com.raytheon.uf.common.registry.annotations.SlotAttribute; import com.raytheon.uf.common.registry.annotations.SlotAttributeConverter; import com.raytheon.uf.common.registry.ebxml.slots.DateSlotConverter; @@ -42,6 +43,7 @@ import com.raytheon.uf.common.time.util.ImmutableDate; * Nov 19, 2012 1166 djohnson Clean up JAXB representation of registry objects. * Sept, 30 2013 1797 dhladky Made generic based on Time * Dec 20, 2013 2636 mpduff Add a dataset availability offset + * jan 23, 2013 2584 dhladky Versions. * * * @author dhladky @@ -51,6 +53,7 @@ import com.raytheon.uf.common.time.util.ImmutableDate; @XmlSeeAlso({ GriddedDataSetMetaData.class, OpenDapGriddedDataSetMetaData.class, PointDataSetMetaData.class }) @RegistryObject({ "url" }) +@RegistryObjectVersion(value = 1.0f) public abstract class DataSetMetaData { public static final String DATE_SLOT = "date"; diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/DataSetName.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/DataSetName.java index 064f576e19..d072e68c06 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/DataSetName.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/DataSetName.java @@ -13,6 +13,7 @@ import com.raytheon.uf.common.registry.annotations.RegistryObjectAssociation; import com.raytheon.uf.common.registry.annotations.RegistryObjectDescription; import com.raytheon.uf.common.registry.annotations.RegistryObjectName; import com.raytheon.uf.common.registry.annotations.RegistryObjectOwner; +import com.raytheon.uf.common.registry.annotations.RegistryObjectVersion; import com.raytheon.uf.common.registry.annotations.SlotAttribute; import com.raytheon.uf.common.registry.ebxml.MapValuesResolver; import com.raytheon.uf.common.serialization.XmlGenericMapAdapter; @@ -33,6 +34,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * Aug 22, 2012 0743 djohnson Store data type as an enum. * Sep 07, 2012 1102 djohnson Add {@code @XmlRootElement}. * Nov 19, 2012 1166 djohnson Clean up JAXB representation of registry objects. + * jan 23, 2013 2584 dhladky Versions. * * * @@ -44,6 +46,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize @RegistryObject(value = { "providerName", "dataSetType", "dataSetName" }, storeContent = false) +@RegistryObjectVersion(value = 1.0f) public class DataSetName { @RegistryObjectOwner diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/GriddedTime.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/GriddedTime.java index ce203f356c..b254c28985 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/GriddedTime.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/GriddedTime.java @@ -33,8 +33,6 @@ import javax.xml.bind.annotation.XmlRootElement; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; -import com.raytheon.uf.common.status.IUFStatusHandler; -import com.raytheon.uf.common.status.UFStatus; /** * Request Time XML diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/IDataSetMetaDataVisitor.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/IDataSetMetaDataVisitor.java index 8a23e994e2..78efaf40e5 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/IDataSetMetaDataVisitor.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/IDataSetMetaDataVisitor.java @@ -19,6 +19,7 @@ **/ package com.raytheon.uf.common.datadelivery.registry; + /** * Defines a type that can visit {@link DataSetMetaData} instances and perform * some activity. diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/OpenDapGriddedDataSet.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/OpenDapGriddedDataSet.java index 42c7b592a4..e8f117135c 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/OpenDapGriddedDataSet.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/OpenDapGriddedDataSet.java @@ -31,6 +31,7 @@ import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import com.raytheon.uf.common.datadelivery.registry.Provider.ServiceType; +import com.raytheon.uf.common.registry.annotations.RegistryObjectVersion; import com.raytheon.uf.common.serialization.XmlGenericMapAdapter; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @@ -55,9 +56,14 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; */ @XmlRootElement @XmlAccessorType(XmlAccessType.NONE) +@RegistryObjectVersion(value = 1.0f) @DynamicSerialize public class OpenDapGriddedDataSet extends GriddedDataSet { + public OpenDapGriddedDataSet() { + + } + @DynamicSerializeElement @XmlJavaTypeAdapter(type = Map.class, value = XmlGenericMapAdapter.class) private Map cyclesToUrls = new HashMap(); @@ -162,4 +168,5 @@ public class OpenDapGriddedDataSet extends GriddedDataSet { public ServiceType getServiceType() { return ServiceType.OPENDAP; } + } diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/OpenDapGriddedDataSetMetaData.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/OpenDapGriddedDataSetMetaData.java index 4821a8b921..faa522a6f0 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/OpenDapGriddedDataSetMetaData.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/OpenDapGriddedDataSetMetaData.java @@ -23,6 +23,7 @@ import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; +import com.raytheon.uf.common.registry.annotations.RegistryObjectVersion; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; /** @@ -35,6 +36,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Sep 4, 2012 1102 djohnson Initial creation + * jan 23, 2013 2584 dhladky Versions * * * @@ -43,6 +45,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; */ @XmlRootElement @XmlAccessorType(XmlAccessType.NONE) +@RegistryObjectVersion(value = 1.0f) @DynamicSerialize public class OpenDapGriddedDataSetMetaData extends GriddedDataSetMetaData { @@ -53,4 +56,5 @@ public class OpenDapGriddedDataSetMetaData extends GriddedDataSetMetaData { public void accept(IDataSetMetaDataVisitor visitor) { visitor.visit(this); } + } diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/Parameter.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/Parameter.java index 245bd56124..78b209ef21 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/Parameter.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/Parameter.java @@ -20,6 +20,7 @@ import com.raytheon.uf.common.registry.annotations.RegistryObject; import com.raytheon.uf.common.registry.annotations.RegistryObjectAssociation; import com.raytheon.uf.common.registry.annotations.RegistryObjectDescription; import com.raytheon.uf.common.registry.annotations.RegistryObjectName; +import com.raytheon.uf.common.registry.annotations.RegistryObjectVersion; import com.raytheon.uf.common.registry.annotations.SlotAttribute; import com.raytheon.uf.common.registry.annotations.SlotAttributeConverter; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; @@ -40,6 +41,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * Sep 06, 2012 1121 mpduff Added toString(). * Sep 07, 2012 1102 djohnson Add {@code @XmlRootElement}. * Nov 19, 2012 1166 djohnson Clean up JAXB representation of registry objects. + * Dec 08, 2013 2584 dhladky Version update * * * @author dhladky @@ -51,6 +53,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize @RegistryObject({ "name", "dataType" }) +@RegistryObjectVersion(value = 1.0f) public class Parameter implements Serializable { private static final long serialVersionUID = -2332611624661834210L; @@ -294,4 +297,5 @@ public class Parameter implements Serializable { return hcBuilder.toHashCode(); } + } diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/PendingSharedSubscription.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/PendingSharedSubscription.java index e3b678ee8f..c7b7fc0b0d 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/PendingSharedSubscription.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/PendingSharedSubscription.java @@ -25,6 +25,7 @@ import javax.xml.bind.annotation.XmlRootElement; import com.raytheon.uf.common.registry.annotations.AssociationMapping; import com.raytheon.uf.common.registry.annotations.RegistryObject; +import com.raytheon.uf.common.registry.annotations.RegistryObjectVersion; import com.raytheon.uf.common.registry.constants.AssociationTypes; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; @@ -39,6 +40,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; * ------------ ---------- ----------- -------------------------- * Apr 04, 2013 1841 djohnson Initial creation * Sept 30, 2013 1797 dhladky Generics + * Dec 08, 2013 2584 dhladky Version update * * * @@ -54,6 +56,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; InitialPendingSubscription.CHANGE_REQUEST_ID_SLOT }, associationMappings = { @AssociationMapping(associationType = AssociationTypes.RELATED_TO, keyFields = { Subscription.PROVIDER_NAME_SLOT, Subscription.NAME_SLOT, Subscription.DATA_SET_SLOT, Subscription.OWNER_SLOT }, required = false, targetObject = SharedSubscription.class) }) +@RegistryObjectVersion(value = 1.0f) public class PendingSharedSubscription extends InitialPendingSharedSubscription implements PendingSubscription { diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/PendingSiteSubscription.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/PendingSiteSubscription.java index b70e2498f2..f7e0c1b967 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/PendingSiteSubscription.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/PendingSiteSubscription.java @@ -25,6 +25,7 @@ import javax.xml.bind.annotation.XmlRootElement; import com.raytheon.uf.common.registry.annotations.AssociationMapping; import com.raytheon.uf.common.registry.annotations.RegistryObject; +import com.raytheon.uf.common.registry.annotations.RegistryObjectVersion; import com.raytheon.uf.common.registry.constants.AssociationTypes; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; @@ -44,6 +45,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; * Nov 19, 2012 1166 djohnson Clean up JAXB representation of registry objects. * Mar 29, 2013 1841 djohnson Subscription is now UserSubscription. * Oct 1, 2013 1797 dhladky Added some start for generics + * Dec 08, 2013 2584 dhladky Version update * * * @@ -59,6 +61,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; InitialPendingSubscription.CHANGE_REQUEST_ID_SLOT }, associationMappings = { @AssociationMapping(associationType = AssociationTypes.RELATED_TO, keyFields = { Subscription.PROVIDER_NAME_SLOT, Subscription.NAME_SLOT, Subscription.DATA_SET_SLOT, Subscription.OWNER_SLOT }, required = false, targetObject = SiteSubscription.class) }) +@RegistryObjectVersion(value = 1.0f) public class PendingSiteSubscription extends InitialPendingSiteSubscription implements PendingSubscription { diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/PendingSubscription.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/PendingSubscription.java index 0cc9941894..a7561e76d1 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/PendingSubscription.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/PendingSubscription.java @@ -19,6 +19,7 @@ **/ package com.raytheon.uf.common.datadelivery.registry; + /** * Pending Subscription definition. * diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/PointDataSetMetaData.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/PointDataSetMetaData.java index 20aff524cb..6da6f317aa 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/PointDataSetMetaData.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/PointDataSetMetaData.java @@ -22,6 +22,7 @@ import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; +import com.raytheon.uf.common.registry.annotations.RegistryObjectVersion; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; /** * Point Meta Data object @@ -42,11 +43,17 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; @XmlRootElement @XmlAccessorType(XmlAccessType.NONE) +@RegistryObjectVersion(value = 1.0f) @DynamicSerialize public class PointDataSetMetaData extends DataSetMetaData { + public PointDataSetMetaData() { + + } + @Override public void accept(IDataSetMetaDataVisitor visitor) { // TODO: not sure what this does? } + } \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/Provider.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/Provider.java index 71cbb2f514..1c951f7bfc 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/Provider.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/Provider.java @@ -12,6 +12,7 @@ import javax.xml.bind.annotation.XmlElements; import javax.xml.bind.annotation.XmlRootElement; import com.raytheon.uf.common.registry.annotations.RegistryObject; +import com.raytheon.uf.common.registry.annotations.RegistryObjectVersion; import com.raytheon.uf.common.registry.annotations.SlotAttribute; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @@ -31,6 +32,7 @@ import com.raytheon.uf.common.time.domain.api.IDuration; * ------------ ---------- ----------- -------------------------- * Feb 16, 2012 dhladky Initial creation * jun 11, 2013 2101 dhladky Updated for username/password DPA exchanges + * Dec 08, 2013 2584 dhladky Version update * * * @@ -42,6 +44,7 @@ import com.raytheon.uf.common.time.domain.api.IDuration; @XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize @RegistryObject({ "name" }) +@RegistryObjectVersion(value = 1.0f) public class Provider { /** @@ -105,7 +108,7 @@ public class Provider { return (long) (latSpan * lonSpan * (timeSpan/5) * requestOverheadInBytes); } } - + private static final Integer BYTES_IN_FLOAT = Float.SIZE / Byte.SIZE; /** a one degree by one degree box **/ diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/SharedSubscription.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/SharedSubscription.java index 812cdacf83..bffae6bc90 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/SharedSubscription.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/SharedSubscription.java @@ -24,6 +24,7 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; import com.raytheon.uf.common.registry.annotations.RegistryObject; +import com.raytheon.uf.common.registry.annotations.RegistryObjectVersion; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; /** @@ -41,6 +42,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; * Sept 30, 2013 1797 dhladky Generics * Oct 23, 2013 2484 dhladky Unique ID for subscriptions updated. * Nov 14, 2013 2548 mpduff Add a subscription type slot. + * jan 23, 2013 2584 dhladky Versions. * * * @@ -53,6 +55,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; Subscription.NAME_SLOT, Subscription.DATA_SET_SLOT, Subscription.OWNER_SLOT, Subscription.ORIGINATING_SITE_SLOT, Subscription.SUBSCRIPTION_TYPE_SLOT }) +@RegistryObjectVersion(value = 1.0f) @DynamicSerialize public class SharedSubscription extends RecurringSubscription { @@ -143,4 +146,5 @@ public class SharedSubscription extends this.officeIDs.add(officeId); } } + } \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/SiteSubscription.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/SiteSubscription.java index bfe78f8df0..b5bfcde1a5 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/SiteSubscription.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/SiteSubscription.java @@ -25,6 +25,7 @@ import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; import com.raytheon.uf.common.registry.annotations.RegistryObject; +import com.raytheon.uf.common.registry.annotations.RegistryObjectVersion; import com.raytheon.uf.common.registry.annotations.SlotAttribute; import com.raytheon.uf.common.registry.ebxml.RegistryUtil; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; @@ -64,6 +65,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * Sept 30, 2013 1797 dhladky Some Generics * Oct 23, 2013 2484 dhladky Unique ID for subscriptions updated. * Nov 14, 2013 2548 mpduff Add a subscription type slot. + * Dec 08, 2013 2584 dhladky Version update * * * @@ -77,6 +79,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; Subscription.DATA_SET_SLOT, Subscription.OWNER_SLOT, Subscription.ORIGINATING_SITE_SLOT, Subscription.SUBSCRIPTION_TYPE_SLOT }) @DynamicSerialize +@RegistryObjectVersion(value = 1.0f) public class SiteSubscription extends RecurringSubscription { private static final long serialVersionUID = -6422673887457060034L; @@ -180,4 +183,5 @@ public class SiteSubscription extends this.officeIDs.add(officeId); } } + } diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/Subscription.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/Subscription.java index f884ad4b4b..9c29cb48e5 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/Subscription.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/Subscription.java @@ -28,7 +28,6 @@ import javax.xml.bind.annotation.XmlEnum; import javax.xml.bind.annotation.XmlEnumValue; import com.raytheon.uf.common.datadelivery.registry.Utils.SubscriptionStatus; - /** * Definition of a subscription. * diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/WFSPointDataSet.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/WFSPointDataSet.java index 65c0065069..185d7fb024 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/WFSPointDataSet.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/WFSPointDataSet.java @@ -23,6 +23,7 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; import com.raytheon.uf.common.datadelivery.registry.Provider.ServiceType; +import com.raytheon.uf.common.registry.annotations.RegistryObjectVersion; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; /** @@ -35,6 +36,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Aug 11, 2012 754 dhladky Initial creation + * jan 23, 2013 2584 dhladky Versions. * * * @@ -43,6 +45,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; */ @XmlRootElement @XmlAccessorType(XmlAccessType.NONE) +@RegistryObjectVersion(value = 1.0f) @DynamicSerialize public class WFSPointDataSet extends PointDataSet { @@ -50,4 +53,5 @@ public class WFSPointDataSet extends PointDataSet { public ServiceType getServiceType() { return ServiceType.WFS; } + } diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/ebxml/DataLevelTypeDescriptionQuery.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/ebxml/DataLevelTypeDescriptionQuery.java index a1d6d75c0e..45ef852d51 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/ebxml/DataLevelTypeDescriptionQuery.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/ebxml/DataLevelTypeDescriptionQuery.java @@ -9,6 +9,7 @@ import javax.persistence.Transient; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; +import com.raytheon.uf.common.datadelivery.registry.DataDeliveryRegistryObjectTypes; import com.raytheon.uf.common.datadelivery.registry.DataLevelType; import com.raytheon.uf.common.datadelivery.registry.Parameter; import com.raytheon.uf.common.registry.IMultipleResultFormatter; @@ -46,7 +47,7 @@ public class DataLevelTypeDescriptionQuery extends RegistryObjectType registryObjectType, IRegistryEncoder encoder) throws SerializationException { - Parameter object = (Parameter) encoder.decodeObject(registryObjectType); + Parameter object = (Parameter) DataDeliveryRegistryObjectTypes.getObject(registryObjectType, encoder); if (alreadyFound == null) { alreadyFound = new HashSet(); diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/ebxml/DataLevelTypeQuery.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/ebxml/DataLevelTypeQuery.java index 30b2acc5ca..ac95f5942a 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/ebxml/DataLevelTypeQuery.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/ebxml/DataLevelTypeQuery.java @@ -7,6 +7,7 @@ import java.util.Map; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; +import com.raytheon.uf.common.datadelivery.registry.DataDeliveryRegistryObjectTypes; import com.raytheon.uf.common.datadelivery.registry.DataLevelType; import com.raytheon.uf.common.datadelivery.registry.DataSet; import com.raytheon.uf.common.datadelivery.registry.Parameter; @@ -59,7 +60,7 @@ public class DataLevelTypeQuery extends RegistryObjectType registryObjectType, IRegistryEncoder encoder) throws SerializationException { - Object object = encoder.decodeObject(registryObjectType); + Object object = DataDeliveryRegistryObjectTypes.getObject(registryObjectType, encoder); if (object instanceof DataSet) { diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/ebxml/DataSetWithFiltersQuery.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/ebxml/DataSetWithFiltersQuery.java index f6d136ad99..93e8169e22 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/ebxml/DataSetWithFiltersQuery.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/ebxml/DataSetWithFiltersQuery.java @@ -11,11 +11,12 @@ import org.geotools.geometry.jts.ReferencedEnvelope; import org.opengis.referencing.operation.TransformException; import com.google.common.annotations.VisibleForTesting; +import com.raytheon.uf.common.datadelivery.registry.DataDeliveryRegistryObjectTypes; import com.raytheon.uf.common.datadelivery.registry.DataLevelType; -import com.raytheon.uf.common.datadelivery.registry.DataLevelType.LevelType; import com.raytheon.uf.common.datadelivery.registry.DataSet; import com.raytheon.uf.common.datadelivery.registry.DataSetMetaData; import com.raytheon.uf.common.datadelivery.registry.Parameter; +import com.raytheon.uf.common.datadelivery.registry.DataLevelType.LevelType; import com.raytheon.uf.common.geospatial.MapUtil; import com.raytheon.uf.common.registry.IResultFormatter; import com.raytheon.uf.common.registry.ebxml.encoder.IRegistryEncoder; @@ -66,8 +67,7 @@ public class DataSetWithFiltersQuery extends DataSetQuery implements IRegistryEncoder encoder) throws SerializationException { DataSet retVal = null; - DataSet object = (DataSet) encoder - .decodeObject(registryObjectType); + DataSet object = (DataSet) DataDeliveryRegistryObjectTypes.getObject(registryObjectType, encoder); if (satisfiesFilterCriteria(object, levels, envelope)) { retVal = object; diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/handlers/DataSetHandler.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/handlers/DataSetHandler.java index d2c0ad1e8c..6b9f22923b 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/handlers/DataSetHandler.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/handlers/DataSetHandler.java @@ -29,9 +29,9 @@ import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.MsgRegistryExceptio import org.geotools.geometry.jts.ReferencedEnvelope; -import com.raytheon.uf.common.datadelivery.registry.DataLevelType.LevelType; import com.raytheon.uf.common.datadelivery.registry.DataSet; import com.raytheon.uf.common.datadelivery.registry.Parameter; +import com.raytheon.uf.common.datadelivery.registry.DataLevelType.LevelType; import com.raytheon.uf.common.datadelivery.registry.ebxml.DataSetQuery; import com.raytheon.uf.common.datadelivery.registry.ebxml.DataSetWithFiltersQuery; import com.raytheon.uf.common.registry.RegistryQueryResponse; diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/handlers/IDataSetHandler.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/handlers/IDataSetHandler.java index 61b009bd7e..b0d0abb59b 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/handlers/IDataSetHandler.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/handlers/IDataSetHandler.java @@ -24,8 +24,8 @@ import java.util.Set; import org.geotools.geometry.jts.ReferencedEnvelope; -import com.raytheon.uf.common.datadelivery.registry.DataLevelType.LevelType; import com.raytheon.uf.common.datadelivery.registry.DataSet; +import com.raytheon.uf.common.datadelivery.registry.DataLevelType.LevelType; import com.raytheon.uf.common.registry.handler.IRegistryObjectHandler; import com.raytheon.uf.common.registry.handler.RegistryHandlerException; diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/handlers/ISiteSubscriptionHandler.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/handlers/ISiteSubscriptionHandler.java index 802261b435..0a32270991 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/handlers/ISiteSubscriptionHandler.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/handlers/ISiteSubscriptionHandler.java @@ -19,8 +19,8 @@ **/ package com.raytheon.uf.common.datadelivery.registry.handlers; -import com.raytheon.uf.common.datadelivery.registry.Subscription; import com.raytheon.uf.common.datadelivery.registry.SiteSubscription; +import com.raytheon.uf.common.datadelivery.registry.Subscription; import com.raytheon.uf.common.registry.handler.IRegistryObjectHandler; /** diff --git a/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/IConvert.java b/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/IConvert.java new file mode 100644 index 0000000000..7c670dbe6d --- /dev/null +++ b/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/IConvert.java @@ -0,0 +1,47 @@ +package com.raytheon.uf.common.registry; +/** + * 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. + **/ +/** + * Convert a different version of the Registry Object to this version. + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ *Dec 08, 2013  2584       dhladky     Initial creation
+ * 
+ * 
+ * + * @author dhladky + * @version 1.0 + */ + +public interface IConvert { + + /** + * Convert a Registry Object between versions + * + * @param o + */ + public void convert(Object o); +} + diff --git a/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/annotations/RegistryObjectVersion.java b/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/annotations/RegistryObjectVersion.java new file mode 100644 index 0000000000..60616a8bf4 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/annotations/RegistryObjectVersion.java @@ -0,0 +1,51 @@ +/** + * 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.common.registry.annotations; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * + * Denotes Version of the Registry Object + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Dec 4, 2013  2584           dhladky     Initial creation
+ * 
+ * 
+ * + * @author dhladky + * @version 1.0 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +@Documented +public @interface RegistryObjectVersion { + + public float value() default 1.0f; +} diff --git a/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/RegistryUtil.java b/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/RegistryUtil.java index f45b3229f3..2c997968c5 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/RegistryUtil.java +++ b/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/RegistryUtil.java @@ -23,6 +23,7 @@ import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectListType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.SlotType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.StringValueType; +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.VersionInfoType; import com.raytheon.uf.common.comm.CommunicationException; import com.raytheon.uf.common.registry.OperationStatus; @@ -36,6 +37,7 @@ import com.raytheon.uf.common.registry.annotations.RegistryObjectAssociation; import com.raytheon.uf.common.registry.annotations.RegistryObjectDescription; import com.raytheon.uf.common.registry.annotations.RegistryObjectName; import com.raytheon.uf.common.registry.annotations.RegistryObjectOwner; +import com.raytheon.uf.common.registry.annotations.RegistryObjectVersion; import com.raytheon.uf.common.registry.annotations.SlotAttribute; import com.raytheon.uf.common.registry.annotations.SlotAttributeConverter; import com.raytheon.uf.common.registry.constants.Languages; @@ -76,6 +78,7 @@ import com.raytheon.uf.common.util.ReflectionUtil; * 4/9/2013 1802 bphillip Pulled constants out into existing constants package that was moved into common * Jun 03, 2013 2038 djohnson Allow setting the same encoder strategy. * Jun 24, 2013 2106 djohnson Remove encoder strategy from instance variables. + * Dec 04, 2013 2584 dhladky Versions for Registry objects * * * @@ -89,6 +92,10 @@ public final class RegistryUtil { } public static String LOCAL_REGISTRY_ADDRESS = null; + + public static final String registryObjectClassName = "registryObjectClassName"; + + public static final String registryObjectDefaultVersion = "1.0"; static { if (System.getenv("EBXML_REGISTRY_HOST") != null @@ -375,6 +382,28 @@ public final class RegistryUtil { .setDescription(getInternationalString(ReflectionUtil .getAnnotatedField(registryObject, RegistryObjectDescription.class))); + // Try to harvest the current version from the PayloadObject + // if none exists, default to encoder provided numeric. + VersionInfoType version = new VersionInfoType(); + String val = null; + RegistryObjectVersion rov = ReflectionUtil + .getAnnotationFromClass(object.getClass(), + RegistryObjectVersion.class); + if (rov != null) { + val = String.valueOf(rov.value()); + } + // no value set in annotation field, apply version default. + if (val == null) { + // default + val = registryObjectDefaultVersion; + } + version.setUserVersionName(val); + registryObject.setVersionInfo(version); + + // We need the actual payload class, not just it's ID for version comparisons + String clazz = object.getClass().getCanonicalName(); + SlotType classNameSlot = new SlotType(registryObjectClassName, new StringValueType(clazz)); + slots.add(classNameSlot); } // Look through all fields that need to be persisted to the diff --git a/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/encoder/ContentSlotBasedEncoder.java b/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/encoder/ContentSlotBasedEncoder.java index 7739cdd74e..1ff369ba68 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/encoder/ContentSlotBasedEncoder.java +++ b/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/encoder/ContentSlotBasedEncoder.java @@ -24,10 +24,12 @@ import java.util.List; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.SlotType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ValueType; +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.VersionInfoType; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; +import com.raytheon.uf.common.registry.ebxml.RegistryUtil; import com.raytheon.uf.common.serialization.SerializationException; /** @@ -45,6 +47,7 @@ import com.raytheon.uf.common.serialization.SerializationException; * Sep 07, 2012 1102 djohnson Initial creation * Jun 03, 2013 2038 djohnson Add equals/hashcode. * 12/2/2013 1829 bphillip Changed slot field in ExtensibleObjectType to be List instead of Set + * Dec 04, 2013 2584 dhladky Versioning for registry objects * * * @@ -79,15 +82,18 @@ abstract class ContentSlotBasedEncoder returnedSlots = registryObjectType.getSlot(); + // Figure out which version we have and it's class + VersionInfoType vit = registryObjectType.getVersionInfo(); + String className = registryObjectType.getSlotValue(RegistryUtil.registryObjectClassName); + // Walk the returned slots looking for the "content" slot for (SlotType s : returnedSlots) { if (CONTENT_SLOT.equals(s.getName())) { SLOT_VALUE_TYPE sv = getSlotValueTypeClass().cast( s.getSlotValue()); CONTENT_TYPE content = getContent(sv); - object = decodeContent(content); + object = decodeContent(content, className, vit.getUserVersionName()); break; } } @@ -167,11 +173,13 @@ abstract class ContentSlotBasedEncoder - * - * SOFTWARE HISTORY - * - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * Sep 07, 2012 1102 djohnson Initial creation - * Jun 03, 2013 2038 djohnson Add equals/hashcode. - * - * - * - * @author djohnson - * @version 1.0 - */ -class DynamicSerializeEncoder extends StringBasedEncoder { - - /** - * @param type - */ - DynamicSerializeEncoder() { - super(DYNAMIC_SERIALIZE); - } - - /** - * {@inheritDoc} - */ - @Override - Object decodeContent(String content) throws SerializationException { - return SerializationUtil.transformFromThrift(Object.class, - Base64.decodeBase64(content)); - } - - /** - * {@inheritDoc} - */ - @Override - String encodeContent(Object objectToEncode) throws SerializationException { - return new String(Base64.encodeBase64(SerializationUtil - .transformToThrift(objectToEncode))); - } -} diff --git a/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/encoder/JaxbEncoder.java b/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/encoder/JaxbEncoder.java index 0b82b45136..16420270e4 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/encoder/JaxbEncoder.java +++ b/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/encoder/JaxbEncoder.java @@ -23,8 +23,13 @@ import static com.raytheon.uf.common.registry.ebxml.encoder.RegistryEncoders.Typ import javax.xml.bind.JAXBException; +import com.raytheon.uf.common.registry.annotations.RegistryObjectVersion; import com.raytheon.uf.common.registry.schemas.ebxml.util.EbxmlJaxbManager; import com.raytheon.uf.common.serialization.SerializationException; +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.util.ReflectionUtil; /** * A {@link StringBasedEncoder} implementation that uses JAXB. Package-private @@ -40,6 +45,7 @@ import com.raytheon.uf.common.serialization.SerializationException; * Jun 03, 2013 2038 djohnson Add equals/hashcode. * Oct 31, 2013 2361 njensen Use specific JAXBManager instead of SerializationUtil * Nov 14, 2013 2552 bkowal EbxmlJaxbManager is now accessed via getInstance + * Dec 08, 2013 2584 dhladky Versions for JAXB objects, Only use the JAXb encoder now. * * * @@ -48,7 +54,11 @@ import com.raytheon.uf.common.serialization.SerializationException; */ class JaxbEncoder extends StringBasedEncoder { - + + /** The logger */ + private static final transient IUFStatusHandler statusHandler = UFStatus + .getHandler(JaxbEncoder.class); + /** * @param type */ @@ -60,12 +70,24 @@ class JaxbEncoder extends StringBasedEncoder { * {@inheritDoc} */ @Override - Object decodeContent(String content) throws SerializationException { - try { - return EbxmlJaxbManager.getInstance().getJaxbManager() - .unmarshalFromXml(content); - } catch (JAXBException e) { - throw new SerializationException("Unable to decode the object!", e); + Object decodeContent(String content, String className, String version) + throws SerializationException { + + String classVersion = getClassVersion(className); + + if (classVersion.equals(version)) { + try { + return EbxmlJaxbManager.getInstance().getJaxbManager() + .unmarshalFromXml(content); + } catch (JAXBException e) { + throw new SerializationException( + "Unable to decode the object!", e); + } + } else { + statusHandler.handle(Priority.INFO, + "Mismatching class versions, returning content. " + + className + " version: " + version); + return content; } } @@ -75,10 +97,41 @@ class JaxbEncoder extends StringBasedEncoder { @Override String encodeContent(Object objectToEncode) throws SerializationException { try { + // We always encode using our current version return new String(EbxmlJaxbManager.getInstance().getJaxbManager() .marshalToXml(objectToEncode)); } catch (JAXBException e) { throw new SerializationException("Unable to encode the object!", e); } } + + /** + * Get the version of the class + * + * @param className + * @return version + */ + public String getClassVersion(String className) { + + String version = EbxmlJaxbManager.getInstance().getVersion(className); + + if (version == null) { + + Class clazz = EbxmlJaxbManager.getInstance().getClass(className); + RegistryObjectVersion rov = ReflectionUtil.getAnnotationFromClass( + clazz, RegistryObjectVersion.class); + if (rov != null) { + version = String.valueOf(rov.value()); + EbxmlJaxbManager.getInstance().addVersion(className, version); + } else { + throw new IllegalArgumentException( + "Unable to extract RegistryObjectVersion tag from class! " + + className); + } + } + + return version; + } } + + diff --git a/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/encoder/RegistryEncoders.java b/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/encoder/RegistryEncoders.java index 1a33bc0ddc..9fa8428515 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/encoder/RegistryEncoders.java +++ b/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/encoder/RegistryEncoders.java @@ -33,6 +33,7 @@ import java.util.Collections; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Sep 7, 2012 1102 djohnson Initial creation + * Dec 4, 2013 2584 dhladky Only a JAXB encoder for registry * * * @@ -45,14 +46,7 @@ public final class RegistryEncoders { * An enumeration of valid {@link IRegistryEncoder} types. */ public static enum Type { - /** - * An encoder that uses dynamic serialization. - */ - DYNAMIC_SERIALIZE(new DynamicSerializeEncoder()), - /** - * An encoder that uses JAXB marshalling. - */ JAXB(new JaxbEncoder()); private final IRegistryEncoder encoder; diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/com/raytheon/uf/common/registry/schemas/ebxml/util/EbxmlJaxbManager.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/com/raytheon/uf/common/registry/schemas/ebxml/util/EbxmlJaxbManager.java index d1bc9c4d14..e83be90f8d 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/com/raytheon/uf/common/registry/schemas/ebxml/util/EbxmlJaxbManager.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/com/raytheon/uf/common/registry/schemas/ebxml/util/EbxmlJaxbManager.java @@ -19,7 +19,9 @@ **/ package com.raytheon.uf.common.registry.schemas.ebxml.util; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; import javax.xml.bind.JAXBException; @@ -34,6 +36,8 @@ import org.reflections.util.ConfigurationBuilder; import com.raytheon.uf.common.serialization.JAXBManager; 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.util.ReflectionUtil; /** * A JAXB Manager for transforming EBXML objects to/from XML. @@ -44,11 +48,8 @@ import com.raytheon.uf.common.status.UFStatus; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Oct 30, 2013 2361 njensen Initial creation - * Nov 14, 2013 2252 bkowal Added the ability to dynamically inject packages - * that this jaxb implementation should support. - * Eliminated use of System.out. - * + * Nov 12, 2013 ---- njensen Initial release. + * Nov 24, 2013 2584 dhladky versioning * * * @author njensen @@ -61,21 +62,31 @@ public class EbxmlJaxbManager { private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(EbxmlJaxbManager.class); + private JAXBManager jaxb; + + private Set> jaxables; + + private Map> convertables = new HashMap>(1); + + private Map versions = new HashMap(1); + private static EbxmlJaxbManager instance; - private static JAXBManager jaxb; - - private static Set> jaxables; - + /** + * Get the desired version of the EbxmlJaxbManager + * @param version + * @return + */ public static synchronized EbxmlJaxbManager getInstance() { if (instance == null) { instance = new EbxmlJaxbManager(); } return instance; } - + public String findJaxables(String packageName) { - statusHandler.info("Scanning package ... " + packageName); + + statusHandler.info(" Scanning package ... " + packageName); long t0 = System.currentTimeMillis(); ConfigurationBuilder cb = new ConfigurationBuilder(); @@ -124,4 +135,86 @@ public class EbxmlJaxbManager { statusHandler.info("Initialization Complete."); } + + /** + * Gets the set of classes for this encoder. + * @return + */ + public Set> getJaxables() { + return jaxables; + } + + /** + * Gets the class from the convertables + * + * @param className + * @return + */ + public Class getClass(String className) { + + Class clazz = convertables.get(className); + + if (clazz == null) { + + for (Class pclazz : jaxables) { + if (pclazz.getCanonicalName().equals(className)) { + clazz = pclazz; + addClass(className, clazz); + break; + } + } + // Didn't find it, now we have a possible problem. + // Try reflecting a version of it. + if (clazz == null) { + statusHandler.handle(Priority.WARN, + "Didn't find class in list of jaxables! class: " + + className); + try { + clazz = ReflectionUtil.forName(className); + addClass(className, clazz); + } catch (Exception e) { + statusHandler.handle(Priority.ERROR, + "Can not reflect a version of this class. class: " + + className, e); + } + } + } + + return clazz; + } + + /** + * Set the class to the cache + * + * @param className + * @param clazz + */ + private void addClass(String className, Class clazz) { + synchronized (convertables) { + convertables.put(className, clazz); + } + } + + /** + * Set the version to the cache + * + * @param className + * @param clazz + */ + public void addVersion(String className, String version) { + synchronized (versions) { + versions.put(className, version); + } + } + + /** + * Get the version of the class + * + * @param className + * @return version + */ + public String getVersion(String className) { + return versions.get(className); + } + } \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/com/raytheon/uf/common/registry/schemas/ebxml/util/SerializedType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/com/raytheon/uf/common/registry/schemas/ebxml/util/SerializedType.java index 2861a0285a..6f4b1ee287 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/com/raytheon/uf/common/registry/schemas/ebxml/util/SerializedType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/com/raytheon/uf/common/registry/schemas/ebxml/util/SerializedType.java @@ -43,6 +43,7 @@ import org.hibernate.usertype.UserType; * --/--/---- Initial creation * Oct 31, 2013 2361 njensen Use specific JAXBManager instead of SerializationUtil * Nov 14, 2013 2552 bkowal EbxmlJaxbManager is now accessed via getInstance + * Dec 04, 2013 2584 dhladky Version based EbxmlJaxbManager * * * @@ -93,7 +94,7 @@ public class SerializedType implements UserType { String obj = resultSet.getString(names[0]); if (obj != null) { - try { + try { // We always marshall to current version for to XML conversions return EbxmlJaxbManager.getInstance().getJaxbManager() .unmarshalFromXml(obj); } catch (Exception e) { @@ -110,8 +111,7 @@ public class SerializedType implements UserType { if (value == null) { statement.setString(index, null); } else { - try { - ; + try { // We always marshall to current version for to XML conversions statement.setString(index, EbxmlJaxbManager.getInstance() .getJaxbManager().marshalToXml(value)); } catch (Exception e) { diff --git a/edexOsgi/com.raytheon.uf.common.util/src/com/raytheon/uf/common/util/ReflectionUtil.java b/edexOsgi/com.raytheon.uf.common.util/src/com/raytheon/uf/common/util/ReflectionUtil.java index 96e693721b..e656d16598 100644 --- a/edexOsgi/com.raytheon.uf.common.util/src/com/raytheon/uf/common/util/ReflectionUtil.java +++ b/edexOsgi/com.raytheon.uf.common.util/src/com/raytheon/uf/common/util/ReflectionUtil.java @@ -42,6 +42,7 @@ import org.apache.commons.beanutils.PropertyUtils; * Jul 10, 2012 455 djohnson Move in methods from RegistryUtil, * fix setter method to use parameter types. * Sep 28, 2012 1195 djohnson Add {@link #forName(String)}. + * Jan 23, 2014 2584 dhladky Versions for JAXB objects. * * * @@ -220,6 +221,26 @@ public final class ReflectionUtil { } return null; } + + /** + * Get this annotation from this class if it exists + * + * @param clazz + * The class to check + * @param annotation + * The annotation class to look for + * @return Annotation + */ + public static T getAnnotationFromClass(Class clazz, + Class annotation) throws ReflectionException { + + T ann = clazz.getAnnotation(annotation); + if (ann != null) { + return ann; + } + + return null; + } /** * Create a class instance from its name. diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.retrieval/src/com/raytheon/uf/edex/datadelivery/retrieval/RetrievalGenerator.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.retrieval/src/com/raytheon/uf/edex/datadelivery/retrieval/RetrievalGenerator.java index 23b4c4b0c3..7928cd3894 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.retrieval/src/com/raytheon/uf/edex/datadelivery/retrieval/RetrievalGenerator.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.retrieval/src/com/raytheon/uf/edex/datadelivery/retrieval/RetrievalGenerator.java @@ -22,10 +22,10 @@ package com.raytheon.uf.edex.datadelivery.retrieval; import java.util.List; +import com.raytheon.uf.common.datadelivery.registry.Provider.ServiceType; import com.raytheon.uf.common.datadelivery.registry.AdhocSubscription; import com.raytheon.uf.common.datadelivery.registry.Parameter; import com.raytheon.uf.common.datadelivery.registry.PendingSubscription; -import com.raytheon.uf.common.datadelivery.registry.Provider.ServiceType; import com.raytheon.uf.common.datadelivery.registry.Subscription; import com.raytheon.uf.common.datadelivery.registry.SubscriptionBundle; import com.raytheon.uf.common.datadelivery.retrieval.xml.Retrieval; diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.retrieval/src/com/raytheon/uf/edex/datadelivery/retrieval/opendap/OpenDAPMetaDataParser.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.retrieval/src/com/raytheon/uf/edex/datadelivery/retrieval/opendap/OpenDAPMetaDataParser.java index 6e6fefe754..ffec6e323e 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.retrieval/src/com/raytheon/uf/edex/datadelivery/retrieval/opendap/OpenDAPMetaDataParser.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.retrieval/src/com/raytheon/uf/edex/datadelivery/retrieval/opendap/OpenDAPMetaDataParser.java @@ -31,6 +31,7 @@ import java.util.TreeSet; import com.raytheon.uf.common.datadelivery.registry.Collection; import com.raytheon.uf.common.datadelivery.registry.DataLevelType; import com.raytheon.uf.common.datadelivery.registry.DataLevelType.LevelType; +import com.raytheon.uf.common.datadelivery.registry.Provider.ServiceType; import com.raytheon.uf.common.datadelivery.registry.DataSet; import com.raytheon.uf.common.datadelivery.registry.DataSetMetaData; import com.raytheon.uf.common.datadelivery.registry.DataType; @@ -43,7 +44,6 @@ import com.raytheon.uf.common.datadelivery.registry.OpenDapGriddedDataSet; import com.raytheon.uf.common.datadelivery.registry.OpenDapGriddedDataSetMetaData; import com.raytheon.uf.common.datadelivery.registry.Parameter; import com.raytheon.uf.common.datadelivery.registry.Provider; -import com.raytheon.uf.common.datadelivery.registry.Provider.ServiceType; import com.raytheon.uf.common.datadelivery.registry.Time; import com.raytheon.uf.common.datadelivery.retrieval.util.HarvesterServiceManager; import com.raytheon.uf.common.datadelivery.retrieval.util.LookupManager; diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.retrieval/src/com/raytheon/uf/edex/datadelivery/retrieval/opendap/OpenDAPRetrievalGenerator.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.retrieval/src/com/raytheon/uf/edex/datadelivery/retrieval/opendap/OpenDAPRetrievalGenerator.java index b29d773fbd..8b216a8222 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.retrieval/src/com/raytheon/uf/edex/datadelivery/retrieval/opendap/OpenDAPRetrievalGenerator.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.retrieval/src/com/raytheon/uf/edex/datadelivery/retrieval/opendap/OpenDAPRetrievalGenerator.java @@ -38,11 +38,11 @@ import com.raytheon.uf.common.datadelivery.registry.Levels; import com.raytheon.uf.common.datadelivery.registry.OpenDapGriddedDataSet; import com.raytheon.uf.common.datadelivery.registry.Parameter; import com.raytheon.uf.common.datadelivery.registry.Provider; -import com.raytheon.uf.common.datadelivery.registry.Provider.ServiceType; import com.raytheon.uf.common.datadelivery.registry.ProviderType; import com.raytheon.uf.common.datadelivery.registry.Subscription; import com.raytheon.uf.common.datadelivery.registry.SubscriptionBundle; import com.raytheon.uf.common.datadelivery.registry.Time; +import com.raytheon.uf.common.datadelivery.registry.Provider.ServiceType; import com.raytheon.uf.common.datadelivery.registry.handlers.DataDeliveryHandlers; import com.raytheon.uf.common.datadelivery.retrieval.xml.Retrieval; import com.raytheon.uf.common.datadelivery.retrieval.xml.RetrievalAttribute; diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.madis.ogc/src/com/raytheon/uf/edex/plugin/madis/ogc/feature/Madis.java b/edexOsgi/com.raytheon.uf.edex.plugin.madis.ogc/src/com/raytheon/uf/edex/plugin/madis/ogc/feature/Madis.java index 1fb06ec5ab..22d7f79e07 100644 --- a/edexOsgi/com.raytheon.uf.edex.plugin.madis.ogc/src/com/raytheon/uf/edex/plugin/madis/ogc/feature/Madis.java +++ b/edexOsgi/com.raytheon.uf.edex.plugin.madis.ogc/src/com/raytheon/uf/edex/plugin/madis/ogc/feature/Madis.java @@ -21,10 +21,8 @@ package com.raytheon.uf.edex.plugin.madis.ogc.feature; **/ import java.util.Calendar; -import java.util.Date; import java.util.GregorianCalendar; import java.util.List; -import java.util.TimeZone; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/DbInit.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/DbInit.java index 1f7fcff981..0a47ce8c58 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/DbInit.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/DbInit.java @@ -36,6 +36,7 @@ import java.util.Map; import java.util.jar.JarEntry; import java.util.jar.JarFile; +import javax.persistence.Version; import javax.xml.bind.JAXBException; import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.LifecycleManager; @@ -91,6 +92,7 @@ import com.raytheon.uf.edex.registry.ebxml.init.RegistryInitializedListener; * Nov 01, 2013 2361 njensen Use EbxmlJaxbManager instead of SerializationUtil * Nov 14, 2013 2552 bkowal EbxmlJaxbManager is now accessed via getInstance * Dec 20, 2013 2636 mpduff Set initialized to true before postInitialized is called. + * Dec 04, 2013 2584 dhladky Version based EbxmlJaxbManager * * * @author bphillip @@ -202,6 +204,7 @@ public class DbInit extends com.raytheon.uf.edex.database.init.DbInit implements * * @throws EbxmlRegistryException */ + @SuppressWarnings("resource") private void executeRegistrySql() throws EbxmlRegistryException { JarFile jar = null; diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/adhoc/AdhocQueryExpressionManager.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/adhoc/AdhocQueryExpressionManager.java deleted file mode 100644 index 1c61b8873f..0000000000 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/adhoc/AdhocQueryExpressionManager.java +++ /dev/null @@ -1,121 +0,0 @@ -/** - * 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.registry.ebxml.services.query.adhoc; - -import java.io.File; -import java.util.HashMap; -import java.util.Map; - -import com.raytheon.uf.common.localization.LocalizationFile; -import com.raytheon.uf.common.localization.PathManagerFactory; -import com.raytheon.uf.common.registry.schemas.ebxml.util.EbxmlJaxbManager; -import com.raytheon.uf.common.status.IUFStatusHandler; -import com.raytheon.uf.common.status.UFStatus; - -/** - * - * This class manages the adhoc queries stored under - * edex_static/base/ebxml/adhocQueries - * - *
- * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * Feb 29, 2012            bphillip     Initial creation
- * Nov 14, 2013 2552       bkowal       EbxmlJaxbManager is now accessed via getInstance
- * 
- * 
- * - * @author bphillip - * @version 1.0 - */ -public class AdhocQueryExpressionManager { - - /** The logger */ - private static final transient IUFStatusHandler statusHandler = UFStatus - .getHandler(AdhocQueryExpressionManager.class); - - /** The map of available adhocqueries */ - private Map expressionMap = new HashMap(); - - /** The singleton instance */ - private static AdhocQueryExpressionManager instance; - - /** - * Creates a new manager and initializes the prepared adhoc queries - */ - private AdhocQueryExpressionManager() { - loadQueries(); - } - - /** - * Loads the predefined queries - */ - private void loadQueries() { - LocalizationFile[] files = PathManagerFactory.getPathManager() - .listStaticFiles("ebxml/adhocQueries", new String[] { ".xml" }, - true, true); - File[] fileList = new File[files.length]; - for (int i = 0; i < fileList.length; i++) { - fileList[i] = files[i].getFile(); - } - - for (int i = 0; i < fileList.length; i++) { - - AdhocQueryExpression obj = null; - try { - obj = EbxmlJaxbManager - .getInstance() - .getJaxbManager() - .unmarshalFromXmlFile(AdhocQueryExpression.class, - fileList[i]); - } catch (Exception e) { - statusHandler.error("Error getting predefined adhoc queries.", - e); - } - this.expressionMap.put(obj.getQueryName(), obj); - } - } - - /** - * Gets the singleton instance - * - * @return The singleton instance - */ - public static AdhocQueryExpressionManager getInstance() { - if (instance == null) { - instance = new AdhocQueryExpressionManager(); - } - return instance; - } - - /** - * Retrieves the adhoc query with the given name - * - * @param name - * The name of the adhoc query to get - * @return The adhoc query, null if not present - */ - public AdhocQueryExpression getAdhocQueryExpression(String name) { - return expressionMap.get(name); - } -} diff --git a/tests/manual/com/raytheon/uf/common/comm/HttpProxiedValidClientCredentialsTest.java b/tests/manual/com/raytheon/uf/common/comm/HttpProxiedValidClientCredentialsTest.java index a4ecb9836a..afa38cf84a 100644 --- a/tests/manual/com/raytheon/uf/common/comm/HttpProxiedValidClientCredentialsTest.java +++ b/tests/manual/com/raytheon/uf/common/comm/HttpProxiedValidClientCredentialsTest.java @@ -43,13 +43,13 @@ import com.raytheon.uf.common.datadelivery.registry.Connection; import com.raytheon.uf.common.datadelivery.registry.Coverage; import com.raytheon.uf.common.datadelivery.registry.DataType; import com.raytheon.uf.common.datadelivery.registry.Encryption; +import com.raytheon.uf.common.datadelivery.registry.Provider; import com.raytheon.uf.common.datadelivery.registry.Encryption.Algorithim; import com.raytheon.uf.common.datadelivery.registry.Encryption.Padding; +import com.raytheon.uf.common.datadelivery.registry.Provider.ServiceType; import com.raytheon.uf.common.datadelivery.registry.EnvelopeUtils; import com.raytheon.uf.common.datadelivery.registry.PointTime; import com.raytheon.uf.common.datadelivery.registry.Projection; -import com.raytheon.uf.common.datadelivery.registry.Provider; -import com.raytheon.uf.common.datadelivery.registry.Provider.ServiceType; import com.raytheon.uf.common.datadelivery.registry.ProviderType; import com.raytheon.uf.common.datadelivery.registry.Time; import com.raytheon.uf.common.datadelivery.retrieval.xml.RetrievalAttribute; diff --git a/tests/unit/com/raytheon/uf/common/datadelivery/harvester/config/HarvesterConfigFixture.java b/tests/unit/com/raytheon/uf/common/datadelivery/harvester/config/HarvesterConfigFixture.java index 394ea6c4d1..d29988a95a 100644 --- a/tests/unit/com/raytheon/uf/common/datadelivery/harvester/config/HarvesterConfigFixture.java +++ b/tests/unit/com/raytheon/uf/common/datadelivery/harvester/config/HarvesterConfigFixture.java @@ -28,8 +28,8 @@ import com.raytheon.uf.common.datadelivery.harvester.HarvesterConfig; import com.raytheon.uf.common.datadelivery.registry.Collection; import com.raytheon.uf.common.datadelivery.registry.Connection; import com.raytheon.uf.common.datadelivery.registry.Projection; -import com.raytheon.uf.common.datadelivery.registry.Projection.ProjectionType; import com.raytheon.uf.common.datadelivery.registry.Provider; +import com.raytheon.uf.common.datadelivery.registry.Projection.ProjectionType; import com.raytheon.uf.common.time.util.TimeUtil; import com.raytheon.uf.common.util.AbstractFixture; diff --git a/tests/unit/com/raytheon/uf/common/datadelivery/registry/GriddedDataSetMetaDataTest.java b/tests/unit/com/raytheon/uf/common/datadelivery/registry/GriddedDataSetMetaDataTest.java index a7dc4d1db9..c4cd889ce7 100644 --- a/tests/unit/com/raytheon/uf/common/datadelivery/registry/GriddedDataSetMetaDataTest.java +++ b/tests/unit/com/raytheon/uf/common/datadelivery/registry/GriddedDataSetMetaDataTest.java @@ -23,6 +23,7 @@ import org.junit.Ignore; import org.junit.Test; + /** * Test {@link GriddedDataSetMetaData}. * diff --git a/tests/unit/com/raytheon/uf/common/datadelivery/registry/PendingSharedSubscriptionFixture.java b/tests/unit/com/raytheon/uf/common/datadelivery/registry/PendingSharedSubscriptionFixture.java index 9e81e01196..e646c39ad9 100644 --- a/tests/unit/com/raytheon/uf/common/datadelivery/registry/PendingSharedSubscriptionFixture.java +++ b/tests/unit/com/raytheon/uf/common/datadelivery/registry/PendingSharedSubscriptionFixture.java @@ -21,6 +21,7 @@ package com.raytheon.uf.common.datadelivery.registry; import java.util.Random; + /** * Fixture for {@link PendingSharedSubscription} objects. * diff --git a/tests/unit/com/raytheon/uf/common/datadelivery/registry/PendingSubscriptionTest.java b/tests/unit/com/raytheon/uf/common/datadelivery/registry/PendingSubscriptionTest.java index a89e719e61..4983b4cfd0 100644 --- a/tests/unit/com/raytheon/uf/common/datadelivery/registry/PendingSubscriptionTest.java +++ b/tests/unit/com/raytheon/uf/common/datadelivery/registry/PendingSubscriptionTest.java @@ -23,6 +23,7 @@ import static org.junit.Assert.assertEquals; import org.junit.Test; + /** * Test {@link PendingSubscription}. * diff --git a/tests/unit/com/raytheon/uf/common/datadelivery/registry/SharedSubscriptionFixture.java b/tests/unit/com/raytheon/uf/common/datadelivery/registry/SharedSubscriptionFixture.java index d39a13f29e..7e8b5954ec 100644 --- a/tests/unit/com/raytheon/uf/common/datadelivery/registry/SharedSubscriptionFixture.java +++ b/tests/unit/com/raytheon/uf/common/datadelivery/registry/SharedSubscriptionFixture.java @@ -20,6 +20,7 @@ package com.raytheon.uf.common.datadelivery.registry; + /** * Fixture for {@link SharedSubscription} objects. * diff --git a/tests/unit/com/raytheon/uf/common/datadelivery/registry/ebxml/DataSetWithFiltersQueryTest.java b/tests/unit/com/raytheon/uf/common/datadelivery/registry/ebxml/DataSetWithFiltersQueryTest.java index e86ad7a532..ae32324151 100644 --- a/tests/unit/com/raytheon/uf/common/datadelivery/registry/ebxml/DataSetWithFiltersQueryTest.java +++ b/tests/unit/com/raytheon/uf/common/datadelivery/registry/ebxml/DataSetWithFiltersQueryTest.java @@ -29,11 +29,11 @@ import org.geotools.geometry.jts.ReferencedEnvelope; import org.junit.Test; import com.raytheon.uf.common.datadelivery.registry.DataLevelType; -import com.raytheon.uf.common.datadelivery.registry.DataLevelType.LevelType; import com.raytheon.uf.common.datadelivery.registry.DataSet; -import com.raytheon.uf.common.datadelivery.registry.GriddedCoverage; import com.raytheon.uf.common.datadelivery.registry.OpenDapGriddedDataSet; import com.raytheon.uf.common.datadelivery.registry.Parameter; +import com.raytheon.uf.common.datadelivery.registry.DataLevelType.LevelType; +import com.raytheon.uf.common.datadelivery.registry.GriddedCoverage; import com.raytheon.uf.common.geospatial.MapUtil; import com.raytheon.uf.common.gridcoverage.Corner; import com.raytheon.uf.common.gridcoverage.LatLonGridCoverage; diff --git a/tests/unit/com/raytheon/uf/common/datadelivery/registry/handlers/MemoryDataSetHandler.java b/tests/unit/com/raytheon/uf/common/datadelivery/registry/handlers/MemoryDataSetHandler.java index 766e04e140..f660abc1d9 100644 --- a/tests/unit/com/raytheon/uf/common/datadelivery/registry/handlers/MemoryDataSetHandler.java +++ b/tests/unit/com/raytheon/uf/common/datadelivery/registry/handlers/MemoryDataSetHandler.java @@ -25,8 +25,8 @@ import java.util.Set; import org.geotools.geometry.jts.ReferencedEnvelope; -import com.raytheon.uf.common.datadelivery.registry.DataLevelType.LevelType; import com.raytheon.uf.common.datadelivery.registry.DataSet; +import com.raytheon.uf.common.datadelivery.registry.DataLevelType.LevelType; import com.raytheon.uf.common.datadelivery.registry.ebxml.DataSetWithFiltersQuery; import com.raytheon.uf.common.registry.handler.RegistryHandlerException; diff --git a/tests/unit/com/raytheon/uf/common/registry/ebxml/FactoryRegistryHandlerTest.java b/tests/unit/com/raytheon/uf/common/registry/ebxml/FactoryRegistryHandlerTest.java index 0365b3a650..09d977ac3f 100644 --- a/tests/unit/com/raytheon/uf/common/registry/ebxml/FactoryRegistryHandlerTest.java +++ b/tests/unit/com/raytheon/uf/common/registry/ebxml/FactoryRegistryHandlerTest.java @@ -79,7 +79,7 @@ public class FactoryRegistryHandlerTest { RegistryErrorMessage.DATABASE_ERROR_MESSAGE); private static final IRegistryEncoder encoderStrategy = RegistryEncoders - .ofType(Type.DYNAMIC_SERIALIZE); + .ofType(Type.JAXB); private static final FactoryRegistryHandler registryHandler = new FactoryRegistryHandler(); diff --git a/tests/unit/com/raytheon/uf/common/registry/ebxml/RegistryUtilTest.java b/tests/unit/com/raytheon/uf/common/registry/ebxml/RegistryUtilTest.java index d6f8023e5c..3266d32201 100644 --- a/tests/unit/com/raytheon/uf/common/registry/ebxml/RegistryUtilTest.java +++ b/tests/unit/com/raytheon/uf/common/registry/ebxml/RegistryUtilTest.java @@ -62,7 +62,7 @@ public class RegistryUtilTest { RegistryObjectType type = RegistryUtil .newRegistryObject(registryObject, - RegistryEncoders.ofType(Type.DYNAMIC_SERIALIZE)); + RegistryEncoders.ofType(Type.JAXB)); SlotType slotToCheck = null; for (SlotType slot : type.getSlot()) { diff --git a/tests/unit/com/raytheon/uf/edex/datadelivery/retrieval/opendap/OpenDAPMetaDataParserNCOMTest.java b/tests/unit/com/raytheon/uf/edex/datadelivery/retrieval/opendap/OpenDAPMetaDataParserNCOMTest.java index d10c149321..f33c9c05cd 100644 --- a/tests/unit/com/raytheon/uf/edex/datadelivery/retrieval/opendap/OpenDAPMetaDataParserNCOMTest.java +++ b/tests/unit/com/raytheon/uf/edex/datadelivery/retrieval/opendap/OpenDAPMetaDataParserNCOMTest.java @@ -41,8 +41,8 @@ import com.raytheon.uf.common.datadelivery.registry.DataType; import com.raytheon.uf.common.datadelivery.registry.OpenDapGriddedDataSet; import com.raytheon.uf.common.datadelivery.registry.Parameter; import com.raytheon.uf.common.datadelivery.registry.Projection; -import com.raytheon.uf.common.datadelivery.registry.Projection.ProjectionType; import com.raytheon.uf.common.datadelivery.registry.Provider; +import com.raytheon.uf.common.datadelivery.registry.Projection.ProjectionType; import com.raytheon.uf.common.datadelivery.registry.Provider.ServiceType; import com.raytheon.uf.common.gridcoverage.LatLonGridCoverage; import com.raytheon.uf.common.localization.PathManagerFactoryTest; diff --git a/tests/unit/com/raytheon/uf/edex/datadelivery/retrieval/opendap/OpenDAPMetaDataParserRAPTest.java b/tests/unit/com/raytheon/uf/edex/datadelivery/retrieval/opendap/OpenDAPMetaDataParserRAPTest.java index ff97e807f7..d6c2831407 100644 --- a/tests/unit/com/raytheon/uf/edex/datadelivery/retrieval/opendap/OpenDAPMetaDataParserRAPTest.java +++ b/tests/unit/com/raytheon/uf/edex/datadelivery/retrieval/opendap/OpenDAPMetaDataParserRAPTest.java @@ -42,8 +42,8 @@ import com.raytheon.uf.common.datadelivery.registry.DataType; import com.raytheon.uf.common.datadelivery.registry.OpenDapGriddedDataSet; import com.raytheon.uf.common.datadelivery.registry.Parameter; import com.raytheon.uf.common.datadelivery.registry.Projection; -import com.raytheon.uf.common.datadelivery.registry.Projection.ProjectionType; import com.raytheon.uf.common.datadelivery.registry.Provider; +import com.raytheon.uf.common.datadelivery.registry.Projection.ProjectionType; import com.raytheon.uf.common.datadelivery.registry.Provider.ServiceType; import com.raytheon.uf.common.gridcoverage.LatLonGridCoverage; import com.raytheon.uf.common.localization.PathManagerFactoryTest; diff --git a/tests/unit/com/raytheon/uf/viz/datadelivery/subscription/xml/RuleXMLTest.java b/tests/unit/com/raytheon/uf/viz/datadelivery/subscription/xml/RuleXMLTest.java index 83631c5501..69907afd65 100644 --- a/tests/unit/com/raytheon/uf/viz/datadelivery/subscription/xml/RuleXMLTest.java +++ b/tests/unit/com/raytheon/uf/viz/datadelivery/subscription/xml/RuleXMLTest.java @@ -29,8 +29,8 @@ import org.junit.Before; import org.junit.Test; import com.raytheon.uf.common.datadelivery.registry.DataType; -import com.raytheon.uf.common.datadelivery.registry.Subscription; import com.raytheon.uf.common.datadelivery.registry.SiteSubscription; +import com.raytheon.uf.common.datadelivery.registry.Subscription; import com.raytheon.uf.common.units.DataSizeUnit; import com.raytheon.uf.viz.datadelivery.system.CreateEditRuleDlg.FreqUnitOptions; import com.raytheon.uf.viz.datadelivery.system.Operator; From a722dba9a0f6df9d28207497f95b52c3e86f3f17 Mon Sep 17 00:00:00 2001 From: Ron Anderson Date: Fri, 24 Jan 2014 15:02:20 -0600 Subject: [PATCH 13/21] Issue #2504 Change other GFESuite scripts to use iscUtil.getLogger for consistency Change-Id: I4ce123e8030075bf4a247152dd053ba16dad6987 Former-commit-id: c133dc5506c548956e2c57ea39c5ffad675fc6cc [formerly c133dc5506c548956e2c57ea39c5ffad675fc6cc [formerly b0357df1c4b82623f1345362ddd6ca57d514a1e6]] Former-commit-id: a54c44a6fb0713caf824d475a623d95724448204 Former-commit-id: a330f388b08162f7bb89702edf08c8fafb493b25 --- .../edex_static/base/gfe/isc/iscDataRec.py | 19 +----- .../common_static/base/vtec/MergeVTEC.py | 20 ++---- .../common_static/base/vtec/ingestAT.py | 35 +++------- .../common_static/base/vtec/requestAT.py | 46 +++++-------- .../utility/common_static/base/vtec/sendAT.py | 66 ++++++++----------- 5 files changed, 59 insertions(+), 127 deletions(-) diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/gfe/isc/iscDataRec.py b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/gfe/isc/iscDataRec.py index fa25560fbb..8da06958a4 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/gfe/isc/iscDataRec.py +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/gfe/isc/iscDataRec.py @@ -21,24 +21,6 @@ # further licensing information. ## -""":" - -CWD=`pwd` -CONFIG_HOME=`dirname ${0} | sed "s%^\.%$CWD%"` - -. $CONFIG_HOME/site.sh - -# set environment variables so logStream will work -export LOG_PREF="$GFESUITE_ETCDIR/BASE/logPref/iscDataRec.logPref" -export LOG_DIR="$GFESUITE_LOGDIR" -export COLLECTIVE_FILE="%L/%D/iscDataRec_%H" -unset LOG_FILE - -# Ok now start iscDataRec -cd $GFESUITE_HOME/bin -exec $GFESUITE_HOME/bin/run/iscDataRec1 -S -O $0 ${1+"$@"} -""" # for emacs -> " - import iscMosaic,iscUtil import os, stat, sys, re, string, traceback, types import time, xml, LogStream, IrtAccess @@ -60,6 +42,7 @@ from java.util import ArrayList # 03/12/13 1759 dgilling Bypass command-line processing # for iscMosaic, support changes # to IscReceiveSrv. +# 01/24/14 2504 randerso removed obsolete A1 comments # # # diff --git a/edexOsgi/com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/MergeVTEC.py b/edexOsgi/com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/MergeVTEC.py index 016b8f3c0b..a4e45c1a4e 100644 --- a/edexOsgi/com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/MergeVTEC.py +++ b/edexOsgi/com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/MergeVTEC.py @@ -32,6 +32,7 @@ # 01/25/13 1447 dgilling Initial Creation. # 03/19/13 1447 dgilling Merge A1 DR 21434. # 06/11/13 #2083 randerso Move backups to edex_static +# 01/24/14 #2504 randerso change to use iscUtil.getLogger for consistency # # @@ -39,11 +40,10 @@ import copy import cPickle import gzip -import logging import os -import sys import time +import iscUtil import ActiveTableRecord import siteConfig import VTECPartners @@ -404,20 +404,8 @@ class MergeVTEC(VTECTableUtil.VTECTableUtil): return SiteMap.getInstance().getSite4LetterId(id) def __initLogging(self): - logPath = os.path.join(siteConfig.GFESUITE_LOGDIR, - time.strftime("%Y%m%d", time.gmtime()), 'MergeVTEC.log') - try: - os.makedirs(os.path.dirname(logPath)) - except OSError as e: - if e.errno != errno.EEXIST: - sys.stderr.write("Could not create log directory " + os.path.dirname(logPath)) - sys.exit(-1) - - logging.basicConfig(filename=logPath, - format="%(levelname)s %(asctime)s [%(process)d:%(thread)d] %(filename)s: %(message)s", - datefmt="%H:%M:%S", - level=logging.INFO) - return logging.getLogger("MergeVTEC") + import logging + return iscUtil.getLogger("MergeVTEC", logLevel=logging.INFO) def merge(activeTable, activeTableMode, newRecords, drt=0.0, makeBackups=True, logger=None): diff --git a/edexOsgi/com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/ingestAT.py b/edexOsgi/com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/ingestAT.py index b09ea99b81..ca592c81c0 100644 --- a/edexOsgi/com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/ingestAT.py +++ b/edexOsgi/com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/ingestAT.py @@ -27,40 +27,25 @@ # Date Ticket# Engineer Description # ------------ ---------- ----------- -------------------------- # 02/13/13 1447 dgilling Initial Creation. -# +# 01/24/14 2504 randerso change to use iscUtil.getLogger for consistency # -import errno -import logging import os -import sys import time import xml.etree.ElementTree as ET import IrtAccess import MergeVTEC import siteConfig +import iscUtil - -log = None +logger = None def init_logging(): - logPath = os.path.join(siteConfig.GFESUITE_LOGDIR, - time.strftime("%Y%m%d", time.gmtime()), 'ingestAT.log') - try: - os.makedirs(os.path.dirname(logPath)) - except OSError as e: - if e.errno != errno.EEXIST: - sys.stderr.write("Could not create log directory " + os.path.dirname(logPath)) - sys.exit(-1) - - logging.basicConfig(filename=logPath, - format="%(levelname)s %(asctime)s [%(process)d:%(thread)d] %(filename)s: %(message)s", - datefmt="%H:%M:%S", - level=logging.INFO) - global log - log = logging.getLogger("ingestAT") + import logging + global logger + logger = iscUtil.getLogger("ingestAT", logLevel=logging.INFO) def execute_ingest_at(incomingRecords, activeTable, atName, ztime, makeBackups, xmlIncoming): @@ -73,21 +58,21 @@ def execute_ingest_at(incomingRecords, activeTable, atName, ztime, makeBackups, sourceServer = irt.decodeXMLAddress(addressE) if sourceServer is None: continue - log.info("Source Server: " + irt.printServerInfo(sourceServer)) + logger.info("Source Server: " + irt.printServerInfo(sourceServer)) results = None try: results = MergeVTEC.merge(activeTable, atName, incomingRecords, ztime, makeBackups, logging.getLogger('MergeVTEC')) except: - log.exception("MergeVTEC fail:") + logger.exception("MergeVTEC fail:") return results def runFromJava(activeTable, activeTableMode, newRecords, drt, makeBackups, xmlIncoming): init_logging() - log.info('************* ingestAT ************************') + logger.info('************* ingestAT ************************') startT = time.time() results = execute_ingest_at(newRecords, activeTable, activeTableMode, drt, @@ -97,7 +82,7 @@ def runFromJava(activeTable, activeTableMode, newRecords, drt, makeBackups, # Finish #-------------------------------------------------------------------- endT = time.time() - log.info("Final: wctime: {0:-6.2f}, cputime: {1:-6.2f}".format(endT - startT, time.clock())) + logger.info("Final: wctime: {0:-6.2f}, cputime: {1:-6.2f}".format(endT - startT, time.clock())) return results diff --git a/edexOsgi/com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/requestAT.py b/edexOsgi/com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/requestAT.py index 50f558f8a1..460a08bb94 100644 --- a/edexOsgi/com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/requestAT.py +++ b/edexOsgi/com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/requestAT.py @@ -27,12 +27,11 @@ # Date Ticket# Engineer Description # ------------ ---------- ----------- -------------------------- # 02/06/13 1447 dgilling Initial Creation. +# 01/24/14 2504 randerso change to use iscUtil.getLogger for consistency # # import cPickle -import errno -import logging import os import sys import tempfile @@ -42,6 +41,7 @@ import xml.etree.ElementTree as ET import IrtAccess import siteConfig import VTECPartners +import iscUtil from com.raytheon.uf.common.activetable import ActiveTableMode from com.raytheon.uf.common.time.util import TimeUtil @@ -49,24 +49,12 @@ from com.raytheon.uf.edex.activetable import ActiveTable -log = None +logger = None def init_logging(): - logPath = os.path.join(siteConfig.GFESUITE_LOGDIR, - time.strftime("%Y%m%d", time.gmtime()), 'requestAT.log') - try: - os.makedirs(os.path.dirname(logPath)) - except OSError as e: - if e.errno != errno.EEXIST: - sys.stderr.write("Could not create log directory " + os.path.dirname(logPath)) - sys.exit(-1) - - logging.basicConfig(filename=logPath, - format="%(levelname)s %(asctime)s [%(process)d:%(thread)d] %(filename)s: %(message)s", - datefmt="%H:%M:%S", - level=logging.INFO) - global log - log = logging.getLogger("requestAT") + import logging + global logger + logger = iscUtil.getLogger("requestAT", logLevel=logging.INFO) def execute_request_at(serverHost, serverPort, serverProtocol, mhsid, siteID, ancf, bncf, xmtScript): @@ -113,7 +101,7 @@ def execute_request_at(serverHost, serverPort, serverProtocol, mhsid, siteID, an countDict[rec.getOfficeid()] = cnt + 1 data = (mhsid, siteID, VTECPartners.VTEC_MERGE_SITES, countDict, issueTime) - log.info("Data: " + repr(data)) + logger.info("Data: " + repr(data)) tempdir = os.path.join(siteConfig.GFESUITE_HOME, "products", "ATBL") with tempfile.NamedTemporaryFile(suffix='.reqat', dir=tempdir, delete=False) as fp: @@ -132,17 +120,17 @@ def execute_request_at(serverHost, serverPort, serverProtocol, mhsid, siteID, an sourceServer = {'mhsid': mhsid, 'host': serverHost, 'port': serverPort, 'protocol': serverProtocol, 'site': siteID} irt.addSourceXML(iscE, sourceServer) - log.info("Requesting Server: " + irt.printServerInfo(sourceServer)) + logger.info("Requesting Server: " + irt.printServerInfo(sourceServer)) # who is running the domains requested? sites = VTECPartners.VTEC_TABLE_REQUEST_SITES if not sites: - log.error('No sites defined for VTEC_TABLE_REQUEST_SITES') + logger.error('No sites defined for VTEC_TABLE_REQUEST_SITES') sys.exit(1) status, xml = irt.getServers(sites) if not status: - log.error('Failure to getServers from IRT') + logger.error('Failure to getServers from IRT') sys.exit(1) # decode the XML @@ -150,11 +138,11 @@ def execute_request_at(serverHost, serverPort, serverProtocol, mhsid, siteID, an serverTree = ET.ElementTree(ET.XML(xml)) serversE = serverTree.getroot() except: - log.exception("Malformed XML on getServers()") + logger.exception("Malformed XML on getServers()") sys.exit(1) if serversE.tag != "servers": - log.error("Servers packet missing from web server") + logger.error("Servers packet missing from web server") sys.exit(1) # process each requested domain returned to us @@ -226,13 +214,13 @@ def execute_request_at(serverHost, serverPort, serverProtocol, mhsid, siteID, an s = "Matching Servers:" for x in matchingServers: s += "\n" + irt.printServerInfo(x) - log.info(s) + logger.info(s) # Display the chosen set of servers s = "Chosen Servers:" for x in chosenServers: s += "\n" + irt.printServerInfo(x) - log.info(s) + logger.info(s) irt.addDestinationXML(iscE, chosenServers) @@ -252,18 +240,18 @@ def runFromJava(serverHost, serverPort, serverProtocol, mhsid, siteID, ancf, bncf, xmtScript): init_logging() - log.info('*********** requestAT ******************') + logger.info('*********** requestAT ******************') startT = time.time() try: execute_request_at(serverHost, serverPort, serverProtocol, mhsid, siteID, ancf, bncf, xmtScript) except: - log.exception('Error requesting active table') + logger.exception('Error requesting active table') #-------------------------------------------------------------------- # Finish #-------------------------------------------------------------------- endT = time.time() - log.info("Final: wctime: {0:-6.2f}, cputime: {1:-6.2f}".format(endT - startT, time.clock())) + logger.info("Final: wctime: {0:-6.2f}, cputime: {1:-6.2f}".format(endT - startT, time.clock())) diff --git a/edexOsgi/com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/sendAT.py b/edexOsgi/com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/sendAT.py index fa0c6ee4c1..b7a9da8ac0 100644 --- a/edexOsgi/com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/sendAT.py +++ b/edexOsgi/com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/sendAT.py @@ -27,14 +27,13 @@ # Date Ticket# Engineer Description # ------------ ---------- ----------- -------------------------- # 02/08/13 1447 dgilling Initial Creation. +# 01/24/14 2504 randerso change to use iscUtil.getLogger for consistency # # import cPickle -import errno import gzip -import logging import os import sys import time @@ -47,46 +46,35 @@ import JUtil import siteConfig import VTECPartners import VTECTableSqueeze +import iscUtil # Configuration Item for Test Purposes FORCE_SEND = False #Set to True to always send even if no updates required. -log = None +logger = None def init_logging(): - logPath = os.path.join(siteConfig.GFESUITE_LOGDIR, - time.strftime("%Y%m%d", time.gmtime()), 'sendAT.log') - try: - os.makedirs(os.path.dirname(logPath)) - except OSError as e: - if e.errno != errno.EEXIST: - sys.stderr.write("Could not create log directory " + os.path.dirname(logPath)) - sys.exit(-1) - - logging.basicConfig(filename=logPath, - format="%(levelname)s %(asctime)s [%(process)d:%(thread)d] %(filename)s: %(message)s", - datefmt="%H:%M:%S", - level=logging.INFO) - global log - log = logging.getLogger("sendAT") + import logging + global logger + logger = iscUtil.getLogger("sendAT", logLevel=logging.INFO) def execute_send_at(myServerHost, myServerPort, myServerProtocol, myServerMHSID, myServerSite, sites, filterSites, mhsSites, issueTime, countDict, fname, xmlIncoming, xmtScript): - log.info('reqSite= ' + repr(sites)) - log.info('filterSites= ' + repr(filterSites)) - log.info('mhsSite= ' + repr(mhsSites)) - log.info('reqCountDict= ' + repr(countDict)) + logger.info('reqSite= ' + repr(sites)) + logger.info('filterSites= ' + repr(filterSites)) + logger.info('mhsSite= ' + repr(mhsSites)) + logger.info('reqCountDict= ' + repr(countDict)) if issueTime is None: - log.info('reqIssueTime= None') + logger.info('reqIssueTime= None') else: - log.info('reqIssueTime= ' + str(issueTime) + ' ' + + logger.info('reqIssueTime= ' + str(issueTime) + ' ' + time.asctime(time.gmtime(issueTime))) irt = IrtAccess.IrtAccess("") myServer = {'mhsid': myServerMHSID, 'host': myServerHost, 'port': myServerPort, 'protocol': myServerProtocol, 'site': myServerSite} - log.info('MyServer: ' + irt.printServerInfo(myServer)) + logger.info('MyServer: ' + irt.printServerInfo(myServer)) #-------------------------------------------------------------------- # Prepare the file for sending @@ -95,7 +83,7 @@ def execute_send_at(myServerHost, myServerPort, myServerProtocol, buf = fd.read() os.remove(fname) table = cPickle.loads(buf) #unpickle it - log.info("Local Table Length= " + str(len(table))) + logger.info("Local Table Length= " + str(len(table))) filtTable = [] # filter by sites listing @@ -107,7 +95,7 @@ def execute_send_at(myServerHost, myServerPort, myServerProtocol, filtTable.append(t) else: filtTable = table #no filtering - log.info("Site Filtered Table Length= " + str(len(filtTable))) + logger.info("Site Filtered Table Length= " + str(len(filtTable))) # eliminate obsolete records ctime = time.time() #now time @@ -115,7 +103,7 @@ def execute_send_at(myServerHost, myServerPort, myServerProtocol, filtTable = rename_fields_for_A2(filtTable) actTable, tossRecords = vts.squeeze(filtTable) actTable = rename_fields_for_A1(actTable) - log.info("Squeezed Table Length= " + str(len(actTable))) + logger.info("Squeezed Table Length= " + str(len(actTable))) # check issuance time - any times newer in remote table (this table) than # the local table (requesting site)? @@ -128,9 +116,9 @@ def execute_send_at(myServerHost, myServerPort, myServerProtocol, if issueTime < newestRec: newerRec = True - log.info("NewestFound= " + str(newestRec) + ' ' + + logger.info("NewestFound= " + str(newestRec) + ' ' + time.asctime(time.gmtime(newestRec))) - log.info("IssueTime check. Newer record found= " + str(newerRec)) + logger.info("IssueTime check. Newer record found= " + str(newerRec)) else: newerRec = True #just assume there are newer records @@ -149,9 +137,9 @@ def execute_send_at(myServerHost, myServerPort, myServerProtocol, if reqCount != localCountDict[site]: #records different in request site missingRec = True break - log.info("MissingRec check. Missing record found= " + str(missingRec)) - log.info("lclCountBySite= " + repr(localCountDict)) - log.info("reqCountBySite= " + repr(countDict)) + logger.info("MissingRec check. Missing record found= " + str(missingRec)) + logger.info("lclCountBySite= " + repr(localCountDict)) + logger.info("reqCountBySite= " + repr(countDict)) else: missingRec = True #just assume there are @@ -171,7 +159,7 @@ def execute_send_at(myServerHost, myServerPort, myServerProtocol, fd.write(actTablePickled) gzipSize = os.stat(fname)[stat.ST_SIZE] - log.info('#dataSize: ' + str(rawSize) + ', #gzipSize: ' + str(gzipSize)) + logger.info('#dataSize: ' + str(rawSize) + ', #gzipSize: ' + str(gzipSize)) #-------------------------------------------------------------------- # Create the destination XML file @@ -214,7 +202,7 @@ def execute_send_at(myServerHost, myServerPort, myServerProtocol, s = "Destinations:" for destServer in destServers: s += "\n" + irt.printServerInfo(destServer) - log.info(s) + logger.info(s) # create XML file tempdir = os.path.join(siteConfig.GFESUITE_HOME, "products", "ATBL") @@ -229,7 +217,7 @@ def execute_send_at(myServerHost, myServerPort, myServerProtocol, [fname, fnameXML], xmtScript) else: - log.info("Send has been skipped") + logger.info("Send has been skipped") def rename_fields_for_A1(table): newTable = [] @@ -276,7 +264,7 @@ def runFromJava(myServerHost, myServerPort, myServerProtocol, myServerMHSID, countDict, fname, xmlIncoming, xmtScript): init_logging() - log.info('*********** sendAT ****************') + logger.info('*********** sendAT ****************') startT = time.time() try: @@ -290,11 +278,11 @@ def runFromJava(myServerHost, myServerPort, myServerProtocol, myServerMHSID, mhsSites, issueTime, countDict, fname, xmlIncoming, xmtScript) except: - log.exception('Error in sendAT:') + logger.exception('Error in sendAT:') sys.exit(1) #-------------------------------------------------------------------- # Finish #-------------------------------------------------------------------- endT = time.time() - log.info("Final: wctime: {0:-6.2f}, cputime: {1:-6.2f}".format(endT - startT, time.clock())) \ No newline at end of file + logger.info("Final: wctime: {0:-6.2f}, cputime: {1:-6.2f}".format(endT - startT, time.clock())) \ No newline at end of file From a7eed82b288033d26808bb3b4e46ba06fa4a6bb2 Mon Sep 17 00:00:00 2001 From: Mike Duff Date: Sat, 25 Jan 2014 13:58:16 -0600 Subject: [PATCH 14/21] Issue #2636 - Fix scheduling gaps at start and end of retrieval plan Change-Id: I43930a2cb69f44c83eeec605861bcf6a52a0a26b Former-commit-id: 6f7cadba9fabe6e27a61838124f8d5ad893ba068 [formerly 6f7cadba9fabe6e27a61838124f8d5ad893ba068 [formerly c0d49492af75d0411d6c0c2541af440302595b6a]] Former-commit-id: 4334640c2224e1b2899d8461887cf8480c8ef1ad Former-commit-id: 3e26dc54dfc5dfffee9ceb3c2fc512ed94f9b51a --- .../bandwidth/data/TimeWindowData.java | 114 +++++++--------- .../bandwidth/BandwidthGraphDataAdapter.java | 126 ++++++++---------- .../bandwidth/BandwidthManager.java | 4 +- .../SubscriptionAllocationMapping.java | 100 ++++++++++++++ .../bandwidth/util/BandwidthDaoUtil.java | 80 ++++++----- .../bandwidth/BandwidthServiceIntTest.java | 55 +------- .../BandwidthGraphDataAdapterTest.java | 35 +---- 7 files changed, 252 insertions(+), 262 deletions(-) create mode 100644 edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/SubscriptionAllocationMapping.java diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.bandwidth/src/com/raytheon/uf/common/datadelivery/bandwidth/data/TimeWindowData.java b/edexOsgi/com.raytheon.uf.common.datadelivery.bandwidth/src/com/raytheon/uf/common/datadelivery/bandwidth/data/TimeWindowData.java index 594edbd85b..71155c46b4 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.bandwidth/src/com/raytheon/uf/common/datadelivery/bandwidth/data/TimeWindowData.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.bandwidth/src/com/raytheon/uf/common/datadelivery/bandwidth/data/TimeWindowData.java @@ -20,16 +20,14 @@ package com.raytheon.uf.common.datadelivery.bandwidth.data; import java.text.SimpleDateFormat; -import java.util.ArrayList; import java.util.Calendar; -import java.util.Collections; -import java.util.List; import java.util.TimeZone; import com.raytheon.uf.common.datadelivery.registry.Network; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; import com.raytheon.uf.common.time.util.TimeUtil; +import com.raytheon.uf.common.util.StringUtil; /** * Time Window Data object. @@ -44,6 +42,7 @@ import com.raytheon.uf.common.time.util.TimeUtil; * Dec 06, 2012 1397 djohnson Add dynamic serialize class annotation. * Jan 07, 2013 1451 djohnson Use TimeUtil.newGmtCalendar(). * Nov 25, 2013 2545 mpduff Add Network. + * Jan 23, 2014 2636 mpduff Removed binStartTimes, add base time and offset. * * * @@ -60,14 +59,16 @@ public class TimeWindowData implements Comparable { @DynamicSerializeElement private long timeWindowEndTime = 0L; - /** Array of bin start times for this time window. */ - @DynamicSerializeElement - private List binStartTimes; - /** The network for the data */ @DynamicSerializeElement private Network network; + @DynamicSerializeElement + private long baseTime; + + @DynamicSerializeElement + private int offset; + /** * Constructor. * @@ -98,50 +99,6 @@ public class TimeWindowData implements Comparable { * TimeUtil.MILLIS_PER_MINUTE; this.timeWindowEndTime = (windowEndTime / TimeUtil.MILLIS_PER_MINUTE) * TimeUtil.MILLIS_PER_MINUTE; - binStartTimes = new ArrayList(); - } - - /** - * Set the bin times. - * - * @param binTimesArray - */ - public void setBinTimes(List binTimesArray) { - binStartTimes = binTimesArray; - sortBinStartTimes(); - } - - /** - * Add a bin time. - * - * @param binStartTime - */ - public void addBinTime(Long binStartTime) { - if (validBinStartTime(binStartTime)) { - long roundedBinTime = (binStartTime / TimeUtil.MILLIS_PER_MINUTE) - * TimeUtil.MILLIS_PER_MINUTE; - binStartTimes.add(roundedBinTime); - sortBinStartTimes(); - return; - } - } - - /** - * Validate the bin time. - * - * @param binStartTime - * @return true if bin time is within the time window - */ - private boolean validBinStartTime(Long binStartTime) { - return binStartTime >= timeWindowStartTime - && binStartTime <= timeWindowEndTime; - } - - /** - * Sort the bin times. - */ - public void sortBinStartTimes() { - Collections.sort(binStartTimes); } /** @@ -176,15 +133,6 @@ public class TimeWindowData implements Comparable { return timeWindowEndTime; } - /** - * Get the time window end time. - * - * @return - */ - public List getBinStartTimes() { - return binStartTimes; - } - /** * @param timeWindowStartTime * the timeWindowStartTime to set @@ -201,14 +149,6 @@ public class TimeWindowData implements Comparable { this.timeWindowEndTime = timeWindowEndTime; } - /** - * @param binStartTimes - * the binStartTimes to set - */ - public void setBinStartTimes(List binStartTimes) { - this.binStartTimes = binStartTimes; - } - /** * @return the network */ @@ -224,6 +164,36 @@ public class TimeWindowData implements Comparable { this.network = network; } + /** + * @return the offset + */ + public int getOffset() { + return offset; + } + + /** + * @param offset + * the offset to set + */ + public void setOffset(int offset) { + this.offset = offset; + } + + /** + * @return the baseTime + */ + public long getBaseTime() { + return baseTime; + } + + /** + * @param baseTime + * the baseTime to set + */ + public void setBaseTime(long baseTime) { + this.baseTime = baseTime; + } + /** * {@inheritDoc} */ @@ -237,9 +207,15 @@ public class TimeWindowData implements Comparable { StringBuilder sb = new StringBuilder(); sb.append("Start Time:\t").append(sdf.format(cal.getTime())) .append(" Z"); - sb.append("\n"); + sb.append(StringUtil.NEWLINE); cal.setTimeInMillis(this.timeWindowEndTime); sb.append("End Time:\t").append(sdf.format(cal.getTime())).append(" Z"); + cal.setTimeInMillis(this.baseTime); + sb.append(StringUtil.NEWLINE); + sb.append("Base Time:\t").append(sdf.format(cal.getTime())) + .append(" Z"); + sb.append(StringUtil.NEWLINE).append("Availability Offset: ") + .append(offset).append(" minutes"); return sb.toString(); } } diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/BandwidthGraphDataAdapter.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/BandwidthGraphDataAdapter.java index 8a9f16f080..bd981a9e8e 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/BandwidthGraphDataAdapter.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/BandwidthGraphDataAdapter.java @@ -20,6 +20,7 @@ package com.raytheon.uf.edex.datadelivery.bandwidth; import java.util.ArrayList; +import java.util.Calendar; import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -41,7 +42,6 @@ import com.raytheon.uf.edex.datadelivery.bandwidth.dao.BandwidthAllocation; import com.raytheon.uf.edex.datadelivery.bandwidth.dao.BandwidthBucket; import com.raytheon.uf.edex.datadelivery.bandwidth.dao.BandwidthSubscription; import com.raytheon.uf.edex.datadelivery.bandwidth.dao.SubscriptionRetrieval; -import com.raytheon.uf.edex.datadelivery.bandwidth.retrieval.BandwidthReservation; import com.raytheon.uf.edex.datadelivery.bandwidth.retrieval.RetrievalManager; import com.raytheon.uf.edex.datadelivery.bandwidth.retrieval.RetrievalPlan; @@ -63,6 +63,7 @@ import com.raytheon.uf.edex.datadelivery.bandwidth.retrieval.RetrievalPlan; * Nov 27, 2013 2545 mpduff Get data by network * Dec 11, 2013 2566 bgonzale handle case when there are no reservations. * Dec 17, 2013 2636 bgonzale Refactored bucket fill in edex. + * Jan 23, 2014 2636 mpduff Changed download window generation. * * * @@ -96,9 +97,8 @@ class BandwidthGraphDataAdapter { Collection retrievalPlans = retrievalManager .getRetrievalPlans().values(); - Map retrievals = new HashMap(); - Map> reservations = new HashMap>(); Map> networkMap = new HashMap>(); + SubscriptionAllocationMapping subAllocationMapping = new SubscriptionAllocationMapping(); // One retrieval plan per network for (RetrievalPlan retrievalPlan : retrievalPlans) { @@ -118,79 +118,71 @@ class BandwidthGraphDataAdapter { SortedSet buckets = toDescriptions(bandwidthBuckets); bandwidthGraphData.addBucketDescriptions(network, buckets); - // Latency window data - accumulate all the reservations - for (BandwidthBucket bucket : bandwidthBuckets) { - final List requests = retrievalPlan - .getBandwidthAllocationsForBucket(bucket); - for (BandwidthAllocation allocation : requests) { - if (allocation instanceof SubscriptionRetrieval) { - final SubscriptionRetrieval subRetrieval = (SubscriptionRetrieval) allocation; - retrievals.put(allocation.getId(), subRetrieval); - } - } + // Latency window data + List allocationList = EdexBandwidthContextFactory + .getInstance().bandwidthDao + .getBandwidthAllocations(network); - final List bandwidthReservations = retrievalPlan - .getBandwidthReservationsForBucket(bucket); - - if (bandwidthReservations != null) { - for (BandwidthReservation reservation : bandwidthReservations) { - if (!reservations.containsKey(reservation.getId())) { - reservations.put(reservation.getId(), - new ArrayList()); - } - reservations.get(reservation.getId()).add(reservation); - } + for (BandwidthAllocation allocation : allocationList) { + if (allocation instanceof SubscriptionRetrieval) { + final SubscriptionRetrieval subRetrieval = (SubscriptionRetrieval) allocation; + String subName = subRetrieval.getBandwidthSubscription() + .getName(); + subAllocationMapping.addAllocationForSubscription(subName, + allocation); } } } - // Create time windows for each subscription retrieval by aggregating - // them with any reservations they have - for (Long key : retrievals.keySet()) { - final SubscriptionRetrieval retrieval = retrievals.get(key); - BandwidthSubscription dao = retrieval.getBandwidthSubscription(); - String subName = dao.getName(); - SubscriptionPriority priority = dao.getPriority(); - String registryId = retrieval.getBandwidthSubscription() - .getRegistryId(); - Network network = retrieval.getNetwork(); + Map> subAllocationMap = subAllocationMapping + .getSubAllocationMap(); + for (Map.Entry> entry : subAllocationMap + .entrySet()) { + String sub = entry.getKey(); + for (BandwidthAllocation ba : entry.getValue()) { + if (ba instanceof SubscriptionRetrieval) { + ((SubscriptionRetrieval) ba).getBandwidthSubscription() + .getBaseReferenceTime(); + SubscriptionRetrieval sr = (SubscriptionRetrieval) ba; + BandwidthSubscription dao = sr.getBandwidthSubscription(); + SubscriptionPriority priority = dao.getPriority(); + Calendar baseRefTime = ((SubscriptionRetrieval) ba) + .getBandwidthSubscription().getBaseReferenceTime(); + int offset = ((SubscriptionRetrieval) ba) + .getDataSetAvailablityDelay(); + String registryId = sr.getBandwidthSubscription() + .getRegistryId(); + Network network = sr.getNetwork(); - SubscriptionWindowData windowData = null; + SubscriptionWindowData windowData = null; + List subList = networkMap + .get(network); + for (SubscriptionWindowData subData : subList) { + if (subData.getRegistryId().equals(registryId)) { + windowData = subData; + break; + } + } - List subList = networkMap.get(network); - for (SubscriptionWindowData subData : subList) { - if (subData.getRegistryId().equals(registryId)) { - windowData = subData; - break; + if (windowData == null) { + windowData = new SubscriptionWindowData(); + windowData.setNetwork(network); + windowData.setPriority(priority); + windowData.setRegistryId(registryId); + windowData.setSubscriptionName(sub); + networkMap.get(network).add(windowData); + } + + final long startMillis = sr.getStartTime() + .getTimeInMillis(); + final long endMillis = sr.getEndTime().getTimeInMillis(); + TimeWindowData window = new TimeWindowData(startMillis, + endMillis); + window.setBaseTime(baseRefTime.getTimeInMillis()); + window.setOffset(offset); + windowData.addTimeWindow(window); } } - - if (windowData == null) { - windowData = new SubscriptionWindowData(); - windowData.setNetwork(network); - windowData.setPriority(priority); - windowData.setRegistryId(registryId); - windowData.setSubscriptionName(subName); - networkMap.get(network).add(windowData); - } - - final long startMillis = retrieval.getStartTime().getTimeInMillis(); - final long endMillis = startMillis - + (retrieval.getSubscriptionLatency() * TimeUtil.MILLIS_PER_MINUTE); - TimeWindowData window = new TimeWindowData(startMillis, endMillis); - - List binStartTimes = new ArrayList(); - binStartTimes.add(retrieval.getStartTime().getTimeInMillis()); - List retrievalReservations = reservations - .get(retrieval.getIdentifier()); - - if (retrievalReservations != null) { - for (BandwidthReservation reservation : retrievalReservations) { - binStartTimes.add(reservation.getBandwidthBucket()); - } - } - window.setBinStartTimes(binStartTimes); - windowData.addTimeWindow(window); } bandwidthGraphData.setNetworkDataMap(networkMap); diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/BandwidthManager.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/BandwidthManager.java index 0dc59bd340..5bbb8a9e3f 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/BandwidthManager.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/BandwidthManager.java @@ -138,6 +138,7 @@ import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; * handlePoint method now schedules most recent. * Jan 14, 2014 2692 dhladky Bad Point scheduling final Empty list. * Jan 14, 2014 2459 mpduff Change to subscription status. + * Jan 25, 2014 2636 mpduff Don't do an initial adhoc query for a new subscription. * * * @@ -639,7 +640,6 @@ public abstract class BandwidthManager .getCycleTimes(); final boolean subscribedToCycles = !CollectionUtil .isNullOrEmpty(cycles); - final boolean useMostRecentDataSetUpdate = !subscribedToCycles; // The subscription has cycles, so we can allocate bandwidth at // expected times @@ -648,8 +648,6 @@ public abstract class BandwidthManager unscheduled = schedule(subscription, Sets.newTreeSet(cycles)); } - unscheduled.addAll(getMostRecent(subscription, - useMostRecentDataSetUpdate)); return unscheduled; } diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/SubscriptionAllocationMapping.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/SubscriptionAllocationMapping.java new file mode 100644 index 0000000000..4aed907657 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/SubscriptionAllocationMapping.java @@ -0,0 +1,100 @@ +/** + * 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.datadelivery.bandwidth; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.raytheon.uf.edex.datadelivery.bandwidth.dao.BandwidthAllocation; +import com.raytheon.uf.edex.datadelivery.bandwidth.dao.SubscriptionRetrieval; + +/** + * Data class to hold Subscription to download allocations map + * BandwidthAllocation id to SubscriptionRetrieval map + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Jan 23, 2014   2636     mpduff      Initial creation.
+ * 
+ * 
+ * + * @author mpduff + * @version 1.0 + */ + +public class SubscriptionAllocationMapping { + + /** + * Subscription name to list of BandwidthAllocations for the subscription. + */ + private final Map> subAllocationMap = new HashMap>(); + + /** + * BandwidthAllocation id to SubscriptionRetrieval map. + */ + private final Map subRetrievalMap = new HashMap(); + + /** + * Constructor. + */ + public SubscriptionAllocationMapping() { + + } + + /** + * Add the allocation to the subscription list. + * + * @param subName + * The subscription name for the allocation + * @param allocation + * The allocation to add to the subscription list + */ + public void addAllocationForSubscription(String subName, + BandwidthAllocation allocation) { + if (subAllocationMap.get(subName) == null) { + subAllocationMap + .put(subName, new ArrayList(8)); + } + + subAllocationMap.get(subName).add(allocation); + subRetrievalMap.put(allocation.getId(), + (SubscriptionRetrieval) allocation); + } + + /** + * @return the subAllocationMap + */ + public Map> getSubAllocationMap() { + return subAllocationMap; + } + + /** + * @return the subRetrievalMap + */ + public Map getSubRetrievalMap() { + return subRetrievalMap; + } +} diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/util/BandwidthDaoUtil.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/util/BandwidthDaoUtil.java index 0b33325be3..e78812ca46 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/util/BandwidthDaoUtil.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/util/BandwidthDaoUtil.java @@ -22,7 +22,6 @@ package com.raytheon.uf.edex.datadelivery.bandwidth.util; import java.util.Arrays; import java.util.Calendar; import java.util.Date; -import java.util.Iterator; import java.util.List; import java.util.SortedSet; import java.util.TreeSet; @@ -79,6 +78,7 @@ import com.raytheon.uf.edex.datadelivery.bandwidth.retrieval.RetrievalStatus; * Dec 20, 2013 2636 mpduff Fix dataset offset. * Jan 08, 2014 2615 bgonzale Refactored getRetrievalTimes into RecurringSubscription * calculateStart and calculateEnd methods. + * Jan 24, 2014 2636 mpduff Refactored retrieval time generation. * * * @author djohnson @@ -179,40 +179,77 @@ public class BandwidthDaoUtil { // end time when when subscription is last valid for scheduling based on // plan end, subscription end, and active period end. Calendar subscriptionCalculatedEnd = subscription.calculateEnd(planEnd); + if (statusHandler.isPriorityEnabled(Priority.DEBUG)) { + statusHandler.debug("**** PlanStart: " + planStart.getTime()); + statusHandler.debug("**** PlanEnd : " + planEnd.getTime()); + statusHandler.debug("**** CalculatedStart: " + + subscriptionCalculatedStart.getTime()); + statusHandler.debug("**** CalculatedEnd : " + + subscriptionCalculatedEnd.getTime()); + } + + // drop the start time by 6 hours to account for 4 cycle/day models + subscriptionCalculatedStart = TimeUtil.minCalendarFields( + subscriptionCalculatedStart, Calendar.MINUTE, Calendar.SECOND, + Calendar.MILLISECOND); + subscriptionCalculatedStart.add(Calendar.HOUR_OF_DAY, -6); Calendar start = (Calendar) subscriptionCalculatedStart.clone(); + int availabilityOffset = 0; + try { + availabilityOffset = BandwidthUtil.getDataSetAvailablityOffset( + subscription, start); + } catch (RegistryHandlerException e) { + // Error occurred querying the registry. Log and continue on + statusHandler + .handle(Priority.PROBLEM, + "Unable to retrieve data availability offset, using 0 for the offset.", + e); + } + + /** + * Check the offset times against the start time and the base time + * against the end time. This prevents a missing download window at the + * beginning and the end + */ outerloop: while (!start.after(subscriptionCalculatedEnd)) { for (Integer cycle : hours) { start.set(Calendar.HOUR_OF_DAY, cycle); + Calendar baseTime = (Calendar) start.clone(); + Calendar retrievalTime = TimeUtil.newCalendar(start); // start base equal-to-or-after subscriptionStart - if (start.compareTo(subscriptionCalculatedStart) >= 0) { + if (retrievalTime.compareTo(subscriptionCalculatedStart) >= 0) { for (Integer minute : minutes) { + retrievalTime.set(Calendar.MINUTE, minute); start.set(Calendar.MINUTE, minute); + retrievalTime.add(Calendar.MINUTE, availabilityOffset); + // start minutes equal-to-or-after subscriptionStart - if (start.compareTo(subscriptionCalculatedStart) >= 0) { + if (retrievalTime + .compareTo(subscriptionCalculatedStart) >= 0) { // Check for nonsense if (start.after(subscriptionCalculatedEnd)) { break outerloop; } else { Calendar time = TimeUtil.newCalendar(); - time.setTimeInMillis(start.getTimeInMillis()); + time.setTimeInMillis(retrievalTime + .getTimeInMillis()); /** * Fine grain check by hour and minute, for * subscription(start/end), * activePeriod(start/end) **/ // Subscription Start and End time first - if (time.after(subscriptionCalculatedEnd) + if (start.after(subscriptionCalculatedEnd) || time.before(start)) { // don't schedule this retrieval time, // outside subscription window continue; } - - subscriptionTimes.add(time); + subscriptionTimes.add(baseTime); } } } @@ -224,35 +261,6 @@ public class BandwidthDaoUtil { start.set(Calendar.HOUR_OF_DAY, hours.first()); } - // Now walk the subscription times and throw away anything outside the - // plan hours, taking into account the availability delay... - int availabilityOffset = 0; - Iterator itr = subscriptionTimes.iterator(); - while (itr.hasNext()) { - availabilityOffset = 0; - Calendar time = itr.next(); - - try { - availabilityOffset = BandwidthUtil.getDataSetAvailablityOffset( - subscription, time); - } catch (RegistryHandlerException e) { - // Error occurred querying the registry. Log and continue on - statusHandler - .handle(Priority.PROBLEM, - "Unable to retrieve data availability offset, using 0 for the offset.", - e); - } - - Calendar withAvailabilityOffset = TimeUtil.newCalendar(time); - withAvailabilityOffset.add(Calendar.MINUTE, availabilityOffset); - - // We allow base reference times that are still possible to retrieve - // within the availability window to be included - if (withAvailabilityOffset.before(planStart) || time.after(planEnd)) { - itr.remove(); - } - } - return subscriptionTimes; } diff --git a/tests/integration/com/raytheon/uf/edex/datadelivery/bandwidth/BandwidthServiceIntTest.java b/tests/integration/com/raytheon/uf/edex/datadelivery/bandwidth/BandwidthServiceIntTest.java index 1792689883..95c1a6ee9f 100644 --- a/tests/integration/com/raytheon/uf/edex/datadelivery/bandwidth/BandwidthServiceIntTest.java +++ b/tests/integration/com/raytheon/uf/edex/datadelivery/bandwidth/BandwidthServiceIntTest.java @@ -30,7 +30,6 @@ import java.io.File; import java.util.Arrays; import java.util.Calendar; import java.util.Date; -import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.SortedSet; @@ -89,6 +88,7 @@ import com.raytheon.uf.edex.datadelivery.bandwidth.util.BandwidthUtil; * Sept 25, 2013 1797 dhladky separated time from gridded time * Oct 21, 2013 2292 mpduff Implement multiple data types. * Dec 02, 2013 2545 mpduff Get data by network. + * Jan 23, 2014 2636 mpduff Removed TimeWindow individual bin code. * * * @author djohnson @@ -583,59 +583,6 @@ public class BandwidthServiceIntTest assertEquals( "Expected there to be two time windows for this subscription over 2 days", 2, subscriptionOneTimeWindows.size()); - final TimeWindowData firstTimeWindow = subscriptionOneTimeWindows - .get(0); - final TimeWindowData secondTimeWindow = subscriptionOneTimeWindows - .get(1); - - final List firstWindowBinStartTimes = firstTimeWindow - .getBinStartTimes(); - final List secondWindowBinStartTimes = secondTimeWindow - .getBinStartTimes(); - - assertEquals("Incorrect number of bin start times found.", 2, - firstWindowBinStartTimes.size()); - assertEquals("Incorrect number of bin start times found.", 2, - secondWindowBinStartTimes.size()); - - final List subscriptionRetrievals = bandwidthDao - .getSubscriptionRetrievals(subscription.getProvider(), - subscription.getDataSetName()); - - final Iterator iter = subscriptionRetrievals - .iterator(); - - // First retrieval window - long expectedBinStartTime = iter.next().getStartTime() - .getTimeInMillis(); - - assertEquals( - "Incorrect first bin start time in the first time window.", - expectedBinStartTime, firstWindowBinStartTimes.get(0) - .longValue()); - - expectedBinStartTime += (TimeUtil.MILLIS_PER_MINUTE * 3); - assertEquals( - "Incorrect second bin start time in the first time window.", - expectedBinStartTime, firstWindowBinStartTimes.get(1) - .longValue()); - - // Second retrieval window - expectedBinStartTime = iter.next().getStartTime().getTimeInMillis(); - - assertEquals( - "Incorrect first bin start time in the second time window.", - expectedBinStartTime, secondWindowBinStartTimes.get(0) - .longValue()); - - // The middle bucket was already reserved, so we went ahead six minutes - // and used that bucket - expectedBinStartTime += (TimeUtil.MILLIS_PER_MINUTE * 6); - - assertEquals( - "Incorrect second bin start time in the second time window.", - expectedBinStartTime, secondWindowBinStartTimes.get(1) - .longValue()); } @Test diff --git a/tests/unit/com/raytheon/uf/edex/datadelivery/bandwidth/BandwidthGraphDataAdapterTest.java b/tests/unit/com/raytheon/uf/edex/datadelivery/bandwidth/BandwidthGraphDataAdapterTest.java index bf2d95e777..051f3ef6e6 100644 --- a/tests/unit/com/raytheon/uf/edex/datadelivery/bandwidth/BandwidthGraphDataAdapterTest.java +++ b/tests/unit/com/raytheon/uf/edex/datadelivery/bandwidth/BandwidthGraphDataAdapterTest.java @@ -34,7 +34,6 @@ import com.raytheon.uf.common.datadelivery.registry.Network; import com.raytheon.uf.common.time.util.TimeUtil; import com.raytheon.uf.edex.datadelivery.bandwidth.dao.BandwidthBucket; import com.raytheon.uf.edex.datadelivery.bandwidth.retrieval.RetrievalManager; -import com.raytheon.uf.edex.datadelivery.bandwidth.retrieval.RetrievalPlan; /** * Test class for {@link BandwidthGraphdataAdapter}. @@ -45,7 +44,8 @@ import com.raytheon.uf.edex.datadelivery.bandwidth.retrieval.RetrievalPlan; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Nov 25, 2013 mpduff Initial creation + * Nov 25, 2013 mpduff Initial creation. + * Jan 25, 2014 2636 mpduff Removed test that has since become invalid. * * * @@ -59,8 +59,6 @@ public class BandwidthGraphDataAdapterTest { private static final RetrievalManager retrievalManagerMock = mock(RetrievalManager.class); - private static final RetrievalPlan retrievalPlan = new RetrievalPlan(); - private static final SortedSet bucketSet = new TreeSet(); private static final BandwidthGraphDataAdapter adapter = new BandwidthGraphDataAdapter( @@ -141,33 +139,4 @@ public class BandwidthGraphDataAdapterTest { } } } - - @Test - public void testOverfilledBucketsOverflowToLaterBuckets() { - Iterator iter = bucketSet.iterator(); - - // Get the first bucket and fill it 4.5 buckets worth - BandwidthBucket bucket = iter.next(); - bucket.setCurrentSize((BUCKET_SIZE * 4) + (BUCKET_SIZE / 2)); - - int idx = 0; - SortedSet descriptions = adapter - .toDescriptions(bucketSet); - - Iterator it = descriptions.iterator(); - while (it.hasNext()) { - BandwidthBucketDescription bbd = it.next(); - if (idx <= 3) { - assertTrue("First four buckets should be full", - bbd.getUsedBytes() == bucket.getBucketSize()); - idx++; - } else if (idx == 4) { - assertTrue("Bucket should be half full", - bbd.getUsedBytes() == bucket.getBucketSize() / 2); - idx++; - } else { - assertTrue("Bucket should be empty", bbd.getUsedBytes() == 0); - } - } - } } From df6c94e317bf029a205781cabc16bf881dbe77a9 Mon Sep 17 00:00:00 2001 From: Mike Duff Date: Sat, 25 Jan 2014 14:41:20 -0600 Subject: [PATCH 15/21] Issue #2452 - Changed label based on feedback. Former-commit-id: 1da1285311907c23222505ab200388d0aae8f580 [formerly 1da1285311907c23222505ab200388d0aae8f580 [formerly dd74aef827f0892c64a7efd60b0edd1156ef31ec]] Former-commit-id: 6dcd1a796997eeac1e9e545577bf1db7b42c12b6 Former-commit-id: be59be53d4613f1624252fed028a5cb7ffad2185 --- .../com/raytheon/uf/viz/datadelivery/common/ui/AreaComp.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/common/ui/AreaComp.java b/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/common/ui/AreaComp.java index 7c5ab489d3..d17808a4c7 100644 --- a/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/common/ui/AreaComp.java +++ b/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/common/ui/AreaComp.java @@ -94,6 +94,7 @@ import com.vividsolutions.jts.geom.Coordinate; * Oct 10, 2013 2104 mschenke Switched to use MapScalesManager * Oct 11, 2013 2386 mpduff Refactor DD Front end. * Jan 10, 2014 2452 mpduff Add label stating all lat/lons will be converted to easting. + * Jan 25, 2014 2452 mpduff Changed label based on feedback. * * * @@ -405,7 +406,7 @@ public class AreaComp extends Composite implements ISubset { gd = new GridData(); gd.horizontalSpan = 1; Label l = new Label(regionComp, SWT.LEFT); - l.setText("All entries will be converted to Easting (0-360)"); + l.setText("Lat/Lon values will be in the format of the data set."); l.setLayoutData(gd); /* From 4515c25222b39898516caa5675dccaf6dc8c508f Mon Sep 17 00:00:00 2001 From: Dave Hladky Date: Sun, 26 Jan 2014 11:12:16 -0600 Subject: [PATCH 16/21] Issue #2695 removed old userRoles.xml file. Change-Id: Ib844e1ca6bf00559799115863212663373d330c3 Former-commit-id: b09e5f06c8220c9f313bcd2ff14609fbe7ce287b [formerly b09e5f06c8220c9f313bcd2ff14609fbe7ce287b [formerly d3f172910977cac03d472131cb517fdec29a4fa3]] Former-commit-id: c15ff99aa911b6631199624a464a26cb44ace1a3 Former-commit-id: 373f1d7d15f4611a95c37aeca35b7a5bee371f56 --- .../edex_static/base/roles/userRoles.xml | 148 ------------------ 1 file changed, 148 deletions(-) delete mode 100644 edexOsgi/com.raytheon.uf.edex.plugin.nwsauth/utility/edex_static/base/roles/userRoles.xml diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.nwsauth/utility/edex_static/base/roles/userRoles.xml b/edexOsgi/com.raytheon.uf.edex.plugin.nwsauth/utility/edex_static/base/roles/userRoles.xml deleted file mode 100644 index b2ed46352f..0000000000 --- a/edexOsgi/com.raytheon.uf.edex.plugin.nwsauth/utility/edex_static/base/roles/userRoles.xml +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From c735006401b01e6c95deb48607a490fd1391a60a Mon Sep 17 00:00:00 2001 From: Dave Hladky Date: Sun, 26 Jan 2014 16:48:09 -0600 Subject: [PATCH 17/21] Issue #2741 Fixed nullpointers in Retrieval and BWM Change-Id: I2530b194fa7f1b4fb2a6af4211e82b29b9b0c576 Former-commit-id: c06fd8317cf4f72755113566f57485469b0461e1 [formerly c06fd8317cf4f72755113566f57485469b0461e1 [formerly 3c47b3cb0ee18e485082e8a53d43b38722c5dce4]] Former-commit-id: 2e1d02fe21edffbfddb5a77217f03a8bd0ccc7c3 Former-commit-id: 64991d004cd4d66989b5df1cd500a554481c3eb6 --- .../bandwidth/InMemoryBandwidthBucketDao.java | 23 +++++++++++-------- .../util/RetrievalGeneratorUtilities.java | 16 ++++++++----- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/InMemoryBandwidthBucketDao.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/InMemoryBandwidthBucketDao.java index e4c4561f7c..4d77529315 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/InMemoryBandwidthBucketDao.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/InMemoryBandwidthBucketDao.java @@ -58,6 +58,7 @@ import com.raytheon.uf.edex.datadelivery.bandwidth.util.BandwidthUtil; * Sept 17, 2013 2383 bgonzale Switched back to start from ceiling and end from floor. * Constrain start and end keys by each other. * Dec 3, 2013 1736 dhladky Bandwidth bucket size attenuation. + * Jan 25, 2014 2741 dhladky Unsafe nullpointer being thrown. * * * @@ -244,14 +245,16 @@ public class InMemoryBandwidthBucketDao implements IBandwidthBucketDao { final NavigableMap buckets = allBuckets .get(network); Long firstKey = buckets.floorKey(key); - if (firstKey < keyConstraint) { - // then go back to key before this one - firstKey = buckets.ceilingKey(key); + if (firstKey != null) { + if (firstKey < keyConstraint) { + // then go back to key before this one + firstKey = buckets.ceilingKey(key); + } } + // safety check if (firstKey == null) { firstKey = buckets.firstKey(); } - return firstKey; } @@ -267,14 +270,16 @@ public class InMemoryBandwidthBucketDao implements IBandwidthBucketDao { final NavigableMap buckets = allBuckets .get(network); Long lastKey = buckets.ceilingKey(key); - if (lastKey > keyConstraint) { - // then go back to key before this one - lastKey = buckets.floorKey(key); + if (lastKey != null) { + if (lastKey > keyConstraint) { + // then go back to key before this one + lastKey = buckets.floorKey(key); + } } + // safety check if (lastKey == null) { - lastKey = buckets.lastKey(); + lastKey = buckets.lastKey(); } - return lastKey; } diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.retrieval/src/com/raytheon/uf/edex/datadelivery/retrieval/util/RetrievalGeneratorUtilities.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.retrieval/src/com/raytheon/uf/edex/datadelivery/retrieval/util/RetrievalGeneratorUtilities.java index e0e6e8c396..cf662845a6 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.retrieval/src/com/raytheon/uf/edex/datadelivery/retrieval/util/RetrievalGeneratorUtilities.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.retrieval/src/com/raytheon/uf/edex/datadelivery/retrieval/util/RetrievalGeneratorUtilities.java @@ -68,13 +68,17 @@ public class RetrievalGeneratorUtilities { public static boolean findDuplicateUri(String dataUri, String plugin) { boolean isDuplicate = false; - String sql = "select id from " + plugin + " where datauri = '" - + dataUri + "'"; + try { + String sql = "select id from " + plugin + " where datauri = '" + + dataUri + "'"; - CoreDao dao = new CoreDao(DaoConfig.forDatabase("metadata")); - Object[] results = dao.executeSQLQuery(sql); - if (results.length > 0) { - isDuplicate = true; + CoreDao dao = new CoreDao(DaoConfig.forDatabase("metadata")); + Object[] results = dao.executeSQLQuery(sql); + if (results.length > 0) { + isDuplicate = true; + } + } catch (Exception e) { + statusHandler.error("Couldn't determine duplicate status! ", e); } return isDuplicate; From 0b39c2977b7862a1660d23b3bcf3dc86c42ceac6 Mon Sep 17 00:00:00 2001 From: Mike Duff Date: Sun, 26 Jan 2014 18:57:26 -0600 Subject: [PATCH 18/21] Issue #2459 - Last change from unscheduled to deactivated. Former-commit-id: e46c226489df9efbafc86f85b4d6e3f96c882471 [formerly e46c226489df9efbafc86f85b4d6e3f96c882471 [formerly 09494558cae046e97ff2126673c5a5c4fd1f0105]] Former-commit-id: 81aa9ce0cbe50d6c01a114554ee4f63e9b9de491 Former-commit-id: 5fc96739b9cd63817d669a00adac248fb92680d1 --- .../CancelForceApplyAndIncreaseLatencyDisplayText.java | 3 ++- .../viz/datadelivery/subscription/SubscriptionService.java | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/subscription/CancelForceApplyAndIncreaseLatencyDisplayText.java b/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/subscription/CancelForceApplyAndIncreaseLatencyDisplayText.java index a2360cfb8f..5b89c78341 100644 --- a/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/subscription/CancelForceApplyAndIncreaseLatencyDisplayText.java +++ b/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/subscription/CancelForceApplyAndIncreaseLatencyDisplayText.java @@ -40,6 +40,7 @@ import com.raytheon.uf.viz.datadelivery.subscription.SubscriptionService.IForceA * Dec 4, 2012 1286 djohnson Initial creation * May 28, 2013 1650 djohnson More information when failing to schedule subscriptions. * Jan 17, 2014 2459 mpduff Change gui usage of unscheduled to deactivated. + * Jan 26, 2014 2459 mpduff Change unscheduled label to deactivated. * * * @@ -92,7 +93,7 @@ public class CancelForceApplyAndIncreaseLatencyDisplayText implements + " and leave in a Deactivated status"; } return titleCaseActionText + " " + name - + " and unschedule the others"; + + " and deactivate the others"; case EDIT_SUBSCRIPTIONS: return "Edit the " + ((singleSubscription) ? "subscription" : "subscriptions"); diff --git a/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/subscription/SubscriptionService.java b/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/subscription/SubscriptionService.java index 20a5f298bf..203a1a7893 100644 --- a/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/subscription/SubscriptionService.java +++ b/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/subscription/SubscriptionService.java @@ -45,7 +45,9 @@ import com.raytheon.uf.common.datadelivery.registry.GriddedTime; import com.raytheon.uf.common.datadelivery.registry.InitialPendingSubscription; import com.raytheon.uf.common.datadelivery.registry.PendingSubscription; import com.raytheon.uf.common.datadelivery.registry.PointTime; +import com.raytheon.uf.common.datadelivery.registry.RecurringSubscription; import com.raytheon.uf.common.datadelivery.registry.Subscription; +import com.raytheon.uf.common.datadelivery.registry.Subscription.SubscriptionState; import com.raytheon.uf.common.datadelivery.registry.Time; import com.raytheon.uf.common.datadelivery.registry.handlers.DataDeliveryHandlers; import com.raytheon.uf.common.datadelivery.registry.handlers.IPendingSubscriptionHandler; @@ -94,6 +96,7 @@ import com.raytheon.uf.viz.datadelivery.utils.DataDeliveryUtils; * Oct 12, 2013 2460 dhladky restored adhoc subscriptions to registry storage. * Oct 22, 2013 2292 mpduff Removed subscriptionOverlapService. * Nov 07, 2013 2291 skorolev Used showText() method for "Shared Subscription" message. + * Jan 26, 2014 2259 mpduff Turn off subs to be deactivated. * * * @@ -768,6 +771,10 @@ public class SubscriptionService implements ISubscriptionService { continue; } unscheduledSub.setUnscheduled(true); + if (unscheduledSub instanceof RecurringSubscription) { + ((RecurringSubscription) unscheduledSub) + .setSubscriptionState(SubscriptionState.OFF); + } subscriptionHandler.update(unscheduledSub); } } From 190964c2246ca58f8da102e45556220f45f13289 Mon Sep 17 00:00:00 2001 From: Mike Duff Date: Sun, 26 Jan 2014 18:59:10 -0600 Subject: [PATCH 19/21] Issue #2636 - Fix point scheduling Former-commit-id: af45ad9ac12f3491f98795a5a6b821e5ccef1166 [formerly af45ad9ac12f3491f98795a5a6b821e5ccef1166 [formerly 6291c630ca3c1999870eb6045c95131153b1d305]] Former-commit-id: c0e7aa2af3d8dc83e045829e2dc45893c5e61fc1 Former-commit-id: f04058849fa7332f04eb627d2fa4746c1f41be11 --- .../bandwidth/util/BandwidthDaoUtil.java | 37 +++---------------- 1 file changed, 6 insertions(+), 31 deletions(-) diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/util/BandwidthDaoUtil.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/util/BandwidthDaoUtil.java index e78812ca46..2138c208ea 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/util/BandwidthDaoUtil.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/util/BandwidthDaoUtil.java @@ -193,63 +193,38 @@ public class BandwidthDaoUtil { subscriptionCalculatedStart, Calendar.MINUTE, Calendar.SECOND, Calendar.MILLISECOND); subscriptionCalculatedStart.add(Calendar.HOUR_OF_DAY, -6); - Calendar start = (Calendar) subscriptionCalculatedStart.clone(); - int availabilityOffset = 0; - try { - availabilityOffset = BandwidthUtil.getDataSetAvailablityOffset( - subscription, start); - } catch (RegistryHandlerException e) { - // Error occurred querying the registry. Log and continue on - statusHandler - .handle(Priority.PROBLEM, - "Unable to retrieve data availability offset, using 0 for the offset.", - e); - } - - /** - * Check the offset times against the start time and the base time - * against the end time. This prevents a missing download window at the - * beginning and the end - */ outerloop: while (!start.after(subscriptionCalculatedEnd)) { for (Integer cycle : hours) { start.set(Calendar.HOUR_OF_DAY, cycle); - Calendar baseTime = (Calendar) start.clone(); - - Calendar retrievalTime = TimeUtil.newCalendar(start); // start base equal-to-or-after subscriptionStart - if (retrievalTime.compareTo(subscriptionCalculatedStart) >= 0) { + if (start.compareTo(subscriptionCalculatedStart) >= 0) { for (Integer minute : minutes) { - retrievalTime.set(Calendar.MINUTE, minute); start.set(Calendar.MINUTE, minute); - retrievalTime.add(Calendar.MINUTE, availabilityOffset); - // start minutes equal-to-or-after subscriptionStart - if (retrievalTime - .compareTo(subscriptionCalculatedStart) >= 0) { + if (start.compareTo(subscriptionCalculatedStart) >= 0) { // Check for nonsense if (start.after(subscriptionCalculatedEnd)) { break outerloop; } else { Calendar time = TimeUtil.newCalendar(); - time.setTimeInMillis(retrievalTime - .getTimeInMillis()); + time.setTimeInMillis(start.getTimeInMillis()); /** * Fine grain check by hour and minute, for * subscription(start/end), * activePeriod(start/end) **/ // Subscription Start and End time first - if (start.after(subscriptionCalculatedEnd) + if (time.after(subscriptionCalculatedEnd) || time.before(start)) { // don't schedule this retrieval time, // outside subscription window continue; } - subscriptionTimes.add(baseTime); + + subscriptionTimes.add(time); } } } From f7c3c8c83d0ddb481b1909303db39900313a8110 Mon Sep 17 00:00:00 2001 From: Brad Gonzales Date: Sun, 26 Jan 2014 19:21:38 -0600 Subject: [PATCH 20/21] Issue #2709 updated devRegistry.sh and added retrieval monolithic for running shareds in devRegistry. Amend: update from peer review. Change-Id: I1986de99319fdecd21a94579c499266b048d382a Former-commit-id: e94023097eae614819583307cd5cec83523dea26 [formerly e94023097eae614819583307cd5cec83523dea26 [formerly 4057294c4f777ffb4ea3523bbaea7ed1a084cbd6]] Former-commit-id: 02f9fd20dcbaa3143cb835b74f301172b6bc76a2 Former-commit-id: a40afbe8acfa37a3b5dbf1f0ef3ebf813597aee6 --- edexOsgi/build.edex/esb/etc/devRegistry.sh | 3 + .../registry/RecurringSubscription.java | 126 +++++------ .../datadelivery/registry/Subscription.java | 18 +- .../bandwidth/BandwidthManager.java | 7 +- .../bandwidth/EdexBandwidthManager.java | 17 +- .../bandwidth/util/BandwidthDaoUtil.java | 11 +- .../retrieval-datadelivery-monolithic.xml | 70 ++++++ .../bandwidth/util/BandwidthDaoUtilTest.java | 203 +++++++++++++++++- 8 files changed, 349 insertions(+), 106 deletions(-) create mode 100644 edexOsgi/com.raytheon.uf.edex.datadelivery.retrieval/res/spring/retrieval-datadelivery-monolithic.xml diff --git a/edexOsgi/build.edex/esb/etc/devRegistry.sh b/edexOsgi/build.edex/esb/etc/devRegistry.sh index c00775981d..86b41aaf4c 100644 --- a/edexOsgi/build.edex/esb/etc/devRegistry.sh +++ b/edexOsgi/build.edex/esb/etc/devRegistry.sh @@ -27,3 +27,6 @@ export EDEX_JMX_PORT=1620 export LOG_CONF=logback-registry.xml export MGMT_PORT=9605 export EBXML_REGISTRY_FEDERATION_ENABLED=false +export NCF_HOST=${DATADELIVERY_HOST} +export NCF_ADDRESS=http://${NCF_HOST}:${EBXML_REGISTRY_WEBSERVER_PORT} +export NCF_BANDWIDTH_MANAGER_SERVICE=http://${NCF_HOST}:${EBXML_THRIFT_SERVICE_PORT}/services diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/RecurringSubscription.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/RecurringSubscription.java index c37a7a8e02..fc3ffbe506 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/RecurringSubscription.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/RecurringSubscription.java @@ -66,7 +66,8 @@ import com.raytheon.uf.common.time.util.TimeUtil; * Jan 08, 2014 2615 bgonzale Implement calculate start and calculate end methods. * Jan 14, 2014 2459 mpduff Add subscription state. * Jan 20, 2013 2398 dhladky Fixed rescheduling beyond active period/expired window. - * Jan 24, 2013 2709 bgonzale Fix setting of active period end. + * Jan 24, 2013 2709 bgonzale Fix setting of active period end. Change active period checks + * to check day of year. removed now unused active period methods. * * * @@ -269,6 +270,17 @@ public abstract class RecurringSubscription @SlotAttribute(Subscription.SUBSCRIPTION_STATE_SLOT) private SubscriptionState subscriptionState = SubscriptionState.ON; + /* + * Active Period starting day of the year. Calculated from + * activePeriodStart. + */ + private Integer startActivePeriodDayOfYear; + + /* + * Active Period ending day of the year. Calculated from activePeriodEnd. + */ + private Integer endActivePeriodDayOfYear; + /** Flag stating if the object should be updated */ private boolean shouldUpdate = false; @@ -433,6 +445,7 @@ public abstract class RecurringSubscription @Override public void setActivePeriodStart(Date activePeriodStart) { this.activePeriodStart = activePeriodStart; + this.startActivePeriodDayOfYear = null; } /** @@ -454,56 +467,35 @@ public abstract class RecurringSubscription @Override public void setActivePeriodEnd(Date activePeriodEnd) { this.activePeriodEnd = activePeriodEnd; + this.endActivePeriodDayOfYear = null; } - private Calendar getActivePeriodStart(Calendar base) { - // active period values are month and day of month only, use base - // Calendar for active period year - Calendar activePeriodStartCal = TimeUtil.newCalendar(activePeriodStart); - TimeUtil.minCalendarFields(activePeriodStartCal, Calendar.MILLISECOND, - Calendar.SECOND, Calendar.MINUTE, Calendar.HOUR_OF_DAY); - activePeriodStartCal.set(Calendar.YEAR, base.get(Calendar.YEAR)); - return activePeriodStartCal; + private Integer getStartActivePeriodDayOfYear() { + if (startActivePeriodDayOfYear == null && activePeriodStart != null) { + startActivePeriodDayOfYear = TimeUtil + .newCalendar(activePeriodStart).get(Calendar.DAY_OF_YEAR); + } + return startActivePeriodDayOfYear; } - private Calendar getActivePeriodEnd(Calendar base) { - // active period values are month and day of month only, use base - // Calendar for active period year - Calendar activePeriodEndCal = TimeUtil.newCalendar(activePeriodEnd); - TimeUtil.minCalendarFields(activePeriodEndCal, Calendar.MILLISECOND, - Calendar.SECOND, Calendar.MINUTE, Calendar.HOUR_OF_DAY); - activePeriodEndCal.set(Calendar.YEAR, base.get(Calendar.YEAR)); - return activePeriodEndCal; + private Integer getEndActivePeriodDayOfYear() { + if (endActivePeriodDayOfYear == null && activePeriodEnd != null) { + endActivePeriodDayOfYear = TimeUtil.newCalendar(activePeriodEnd) + .get(Calendar.DAY_OF_YEAR); + } + return endActivePeriodDayOfYear; } @Override public Calendar calculateStart(Calendar startConstraint) { - Calendar realStart = null; - boolean hasActivePeriodStart = activePeriodStart != null; - if (hasActivePeriodStart) { - realStart = getActivePeriodStart(startConstraint); - if (realStart.before(startConstraint)) { - realStart = startConstraint; - } - } else { - realStart = startConstraint; - } - return TimeUtil.newCalendar(TimeUtil.max(subscriptionStart, realStart)); + return TimeUtil.newCalendar(TimeUtil.max(subscriptionStart, + startConstraint)); } @Override public Calendar calculateEnd(Calendar endConstraint) { - Calendar realEnd = null; - boolean hasActivePeriodEnd = activePeriodEnd != null; - if (hasActivePeriodEnd) { - realEnd = getActivePeriodEnd(endConstraint); - if (realEnd.after(endConstraint)) { - realEnd = endConstraint; - } - } else { - realEnd = endConstraint; - } - return TimeUtil.newCalendar(TimeUtil.min(subscriptionEnd, realEnd)); + return TimeUtil.newCalendar(TimeUtil + .min(subscriptionEnd, endConstraint)); } /** @@ -930,9 +922,8 @@ public abstract class RecurringSubscription // At this point the subscription is in the ON state Calendar cal = TimeUtil.newGmtCalendar(); - Date today = cal.getTime(); - if (inWindow(today)) { + if (inActivePeriodWindow(cal)) { return SubscriptionStatus.ACTIVE; } @@ -956,54 +947,33 @@ public abstract class RecurringSubscription * @param checkDate * @return */ - public boolean shouldScheduleForTime(Date checkDate) { - if (!isExpired(checkDate) && inWindow(checkDate)) { + public boolean shouldScheduleForTime(Calendar checkCal) { + if (!isExpired(checkCal.getTime()) && inActivePeriodWindow(checkCal)) { return true; } return false; } - private boolean inWindow(Date checkDate) { + public boolean inActivePeriodWindow(Calendar checkDate) { if (activePeriodStart == null && activePeriodEnd == null) { + // no active period set return true; - } else if (activePeriodStart != null && activePeriodEnd != null) { + } else { + Integer startDay = getStartActivePeriodDayOfYear(); + Integer endDay = getEndActivePeriodDayOfYear(); + int checkDay = checkDate.get(Calendar.DAY_OF_YEAR); - Calendar startCal = TimeUtil.newGmtCalendar(); - startCal.setTime(activePeriodStart); - startCal = TimeUtil.minCalendarFields(startCal, - Calendar.HOUR_OF_DAY, Calendar.MINUTE, Calendar.SECOND, - Calendar.MILLISECOND); - // add the current year for true comparison - startCal = TimeUtil.addCurrentYearCalendar(startCal); - - activePeriodStart = startCal.getTime(); - - Calendar endCal = TimeUtil.newGmtCalendar(); - endCal.setTime(activePeriodEnd); - endCal = TimeUtil.maxCalendarFields(endCal, Calendar.HOUR_OF_DAY, - Calendar.MINUTE, Calendar.SECOND, Calendar.MILLISECOND); - // add the current year for true comparison - endCal = TimeUtil.addCurrentYearCalendar(endCal); - // If the period crosses a year boundary, add a year to the end - if (endCal.before(startCal)) { - endCal.add(Calendar.YEAR, 1); + boolean isAfterPeriodStart = startDay <= checkDay; + boolean isBeforePeriodEnd = checkDay < endDay; + boolean periodCrossesYearBoundary = endDay < startDay; + + if (periodCrossesYearBoundary) { + return isAfterPeriodStart || isBeforePeriodEnd; + } else { + return isAfterPeriodStart && isBeforePeriodEnd; } - - activePeriodEnd = endCal.getTime(); - - // Only concerned with month and day, need to set the - // years on equal footing for comparison sake. - Calendar c = TimeUtil.newGmtCalendar(); - c.setTime(checkDate); - // set the date to compare with the current date from the start - c.set(Calendar.YEAR, startCal.get(Calendar.YEAR)); - Date date = c.getTime(); - - return (activePeriodStart.before(date) && activePeriodEnd - .after(date)); } - return false; } @Override diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/Subscription.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/Subscription.java index 9c29cb48e5..846f3d5675 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/Subscription.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/Subscription.java @@ -43,9 +43,10 @@ import com.raytheon.uf.common.datadelivery.registry.Utils.SubscriptionStatus; * Jul 11, 2013 2106 djohnson SubscriptionPriority allows comparison. * Sept 30,2013 1797 dhladky Abstracted and genericized. * Oct 23, 2013 2484 dhladky Unique ID for subscriptions updated. - * Nov 14, 2013 2548 mpduff Add a subscription type information. - * Jan 08, 2014 2615 bgonzale Added calculate start and calculate end methods. - * Jan 14, 2014 2459 mpduff Change Subscription status code + * Nov 14, 2013 2548 mpduff Add a subscription type information. + * Jan 08, 2014 2615 bgonzale Added calculate start and calculate end methods. + * Jan 14, 2014 2459 mpduff Change Subscription status code + * Jan 24, 2013 2709 bgonzale Added method inActivePeriodWindow. * * * @@ -339,6 +340,17 @@ public interface Subscription { */ Calendar calculateEnd(Calendar endConstraint); + /** + * Check if the given value's month/day is in the Subscription's active + * window. + * + * @param time + * time with month/day value to check. + * + * @return true if in the active period; false otherwise + */ + boolean inActivePeriodWindow(Calendar time); + /** * isNotify flag for subscription. * diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/BandwidthManager.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/BandwidthManager.java index 5bbb8a9e3f..61b928db3a 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/BandwidthManager.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/BandwidthManager.java @@ -139,6 +139,7 @@ import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; * Jan 14, 2014 2692 dhladky Bad Point scheduling final Empty list. * Jan 14, 2014 2459 mpduff Change to subscription status. * Jan 25, 2014 2636 mpduff Don't do an initial adhoc query for a new subscription. + * Jan 24, 2013 2709 bgonzale Before scheduling adhoc, check if in active period window. * * * @@ -677,11 +678,13 @@ public abstract class BandwidthManager plan.getPlanStart()).getTime(); Date subscriptionValidEnd = subscription.calculateEnd( plan.getPlanEnd()).getTime(); - Date now = TimeUtil.newDate(); + Calendar nowCalendar = TimeUtil.newCalendar(); + Date now = nowCalendar.getTime(); if ((now.equals(subscriptionValidStart) || now .after(subscriptionValidStart)) - && now.before(subscriptionValidEnd)) { + && now.before(subscriptionValidEnd) + && subscription.inActivePeriodWindow(nowCalendar)) { unscheduled = scheduleAdhoc(adhoc); } else { statusHandler.info(String.format( diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/EdexBandwidthManager.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/EdexBandwidthManager.java index c2f6bca0ef..fd5e8c2747 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/EdexBandwidthManager.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/EdexBandwidthManager.java @@ -115,6 +115,7 @@ import com.raytheon.uf.edex.datadelivery.bandwidth.util.BandwidthUtil; * Jan 13, 2014 2679 dhladky Small Point data updates. * Jan 14, 2014 2692 dhladky AdhocSubscription handler * Jan 20, 2013 2398 dhladky Fixed rescheduling beyond active period/expired window. + * Jan 24, 2013 2709 bgonzale Changed parameter to shouldScheduleForTime to a Calendar. * * * @@ -312,25 +313,19 @@ public abstract class EdexBandwidthManager // TODO Check if we need to set sub to "OFF" state and save to // registry if (((RecurringSubscription) subscription) - .shouldScheduleForTime(next.getTime())) { + .shouldScheduleForTime(next)) { // Since subscriptions are based on cycles in a day, add - // one - // day - // to the - // completed BandwidthSubscription to get the next days - // retrieval. + // one day to the completed BandwidthSubscription to get + // the next days retrieval. // Now check if that BandwidthSubscription has already - // been - // scheduled. + // been scheduled. BandwidthSubscription a = bandwidthDao .getBandwidthSubscription(dao.getRegistryId(), next); if (a == null) { // Create the new BandwidthSubscription record with - // the - // next - // time.. + // the next time.. a = bandwidthDao.newBandwidthSubscription(subscription, next); diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/util/BandwidthDaoUtil.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/util/BandwidthDaoUtil.java index 2138c208ea..b40936ec24 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/util/BandwidthDaoUtil.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.bandwidth/src/com/raytheon/uf/edex/datadelivery/bandwidth/util/BandwidthDaoUtil.java @@ -79,6 +79,9 @@ import com.raytheon.uf.edex.datadelivery.bandwidth.retrieval.RetrievalStatus; * Jan 08, 2014 2615 bgonzale Refactored getRetrievalTimes into RecurringSubscription * calculateStart and calculateEnd methods. * Jan 24, 2014 2636 mpduff Refactored retrieval time generation. + * Jan 24, 2013 2709 bgonzale Added inActivePeriodWindow check during retrieval time calculations + * because the calculate start and end time methods no longer use + * active period. * * * @author djohnson @@ -173,11 +176,11 @@ public class BandwidthDaoUtil { Calendar planStart = plan.getPlanStart(); // starting time when when subscription is first valid for scheduling - // based on plan start, subscription start, and active period start. + // based on plan start and subscription start. Calendar subscriptionCalculatedStart = subscription .calculateStart(planStart); // end time when when subscription is last valid for scheduling based on - // plan end, subscription end, and active period end. + // plan end and subscription end. Calendar subscriptionCalculatedEnd = subscription.calculateEnd(planEnd); if (statusHandler.isPriorityEnabled(Priority.DEBUG)) { statusHandler.debug("**** PlanStart: " + planStart.getTime()); @@ -218,7 +221,9 @@ public class BandwidthDaoUtil { **/ // Subscription Start and End time first if (time.after(subscriptionCalculatedEnd) - || time.before(start)) { + || time.before(start) + || !subscription + .inActivePeriodWindow(time)) { // don't schedule this retrieval time, // outside subscription window continue; diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.retrieval/res/spring/retrieval-datadelivery-monolithic.xml b/edexOsgi/com.raytheon.uf.edex.datadelivery.retrieval/res/spring/retrieval-datadelivery-monolithic.xml new file mode 100644 index 0000000000..1ee204a9ad --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.retrieval/res/spring/retrieval-datadelivery-monolithic.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/unit/com/raytheon/uf/edex/datadelivery/bandwidth/util/BandwidthDaoUtilTest.java b/tests/unit/com/raytheon/uf/edex/datadelivery/bandwidth/util/BandwidthDaoUtilTest.java index e06437442c..ad58d3dadf 100644 --- a/tests/unit/com/raytheon/uf/edex/datadelivery/bandwidth/util/BandwidthDaoUtilTest.java +++ b/tests/unit/com/raytheon/uf/edex/datadelivery/bandwidth/util/BandwidthDaoUtilTest.java @@ -30,6 +30,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Collection; @@ -43,6 +44,7 @@ import java.util.TreeSet; import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.mockito.Mockito; import com.google.common.collect.Maps; import com.raytheon.uf.common.datadelivery.bandwidth.data.BandwidthMap; @@ -58,6 +60,7 @@ import com.raytheon.uf.common.localization.LocalizationFile; import com.raytheon.uf.common.localization.PathManagerFactory; import com.raytheon.uf.common.localization.PathManagerFactoryTest; import com.raytheon.uf.common.registry.handler.RegistryObjectHandlersUtil; +import com.raytheon.uf.common.time.SimulatedTime; import com.raytheon.uf.common.time.util.TimeUtil; import com.raytheon.uf.common.time.util.TimeUtilTest; import com.raytheon.uf.edex.datadelivery.bandwidth.InMemoryBandwidthBucketDao; @@ -86,6 +89,7 @@ import com.raytheon.uf.edex.datadelivery.bandwidth.retrieval.RetrievalStatus; * Sep 25, 2013 1797 dhladky separated time and gridded time * Jan 07, 2014 2636 mpduff Removed dataset availability offset calculator (not used). * Jan 08, 2014 2615 bgonzale Updated test. + * Jan 26, 2014 2709 bgonzale Added tests for year scheduling boundary. * * * @@ -97,10 +101,9 @@ public class BandwidthDaoUtilTest { private final IBandwidthDao mockDao = mock(IBandwidthDao.class); - private final RetrievalManager retrievalManager = mock(RetrievalManager.class); + private RetrievalManager retrievalManager; - private final BandwidthDaoUtil bandwidthDaoUtil = new BandwidthDaoUtil( - mockDao, retrievalManager); + private BandwidthDaoUtil bandwidthDaoUtil; private BandwidthMap map; @@ -133,6 +136,9 @@ public class BandwidthDaoUtilTest { Map retrievalPlans = Maps .newEnumMap(Network.class); retrievalPlans.put(Network.OPSNET, plan); + retrievalManager = Mockito.spy(new RetrievalManager(mockDao, + new Object())); + bandwidthDaoUtil = new BandwidthDaoUtil(mockDao, retrievalManager); when(retrievalManager.getRetrievalPlans()).thenReturn(retrievalPlans); // Just used to initialize the retrieval plans that are used on the mock @@ -147,6 +153,142 @@ public class BandwidthDaoUtilTest { public void tearDown() { TimeUtilTest.resumeTime(); } + + private Calendar createCal(int year, int dayOfYear) { + Calendar cal = TimeUtil.newCalendar(); + cal.set(Calendar.YEAR, year); + cal.set(Calendar.DAY_OF_YEAR, dayOfYear); + return cal; + } + + /* + * + */ + private Subscription createOverYearBoundary(int planStart, + int planStartYear, int subStart, int subStartYear, int subEnd, + int subEndYear, int activeStart, int activeStartYear, + int activeEnd, int activeEndYear, int planDays) { + Calendar planStartDay = createCal(planStartYear, planStart); + Calendar subStartDay = createCal(subStartYear, subStart); + Calendar subEndDay = createCal(subEndYear, subEnd); + Calendar activeStartDay = createCal(activeStartYear, activeStart); + Calendar activeEndDay = createCal(activeEndYear, activeEnd); + + // setup plan with specific start time for this test. + SimulatedTime.getSystemTime().setTime(planStartDay.getTimeInMillis()); + map.getRoute(Network.OPSNET).setPlanDays(planDays); + retrievalManager.getPlan(Network.OPSNET).setMap(map); + // re-init plans with new simulated time + retrievalManager.initRetrievalPlans(); + return new SubscriptionBuilder() + .withSubscriptionStart(subStartDay.getTime()) + .withActivePeriodStart(activeStartDay.getTime()) + .withActivePeriodEnd(activeEndDay.getTime()) + .withSubscriptionEnd(subEndDay.getTime()).build(); + } + + @Test + public void testActivePeriodOverYearBoundary() { + int y1970 = 1970; + int y1971 = 1971; + int planStart = 364; + int subStart = 364; + int activeStart = 365; + int activeEnd = 2; + int subEnd = 3; + int planDays = 5; + Subscription subscription = createOverYearBoundary(planStart, y1970, + subStart, y1970, subEnd, y1971, activeStart, y1970, activeEnd, + y1971, planDays); + ((GriddedTime) subscription.getTime()).setCycleTimes(Arrays.asList( + Integer.valueOf(9), Integer.valueOf(0))); + + TreeSet cycles = new TreeSet( + ((GriddedTime) subscription.getTime()).getCycleTimes()); + + SortedSet subscriptionTimes = bandwidthDaoUtil + .getRetrievalTimes(subscription, cycles); + + List calendarDaysOfTheYear = createCalendarListForSpecifiedDaysOfTheYear( + Arrays.asList(365), y1970); + calendarDaysOfTheYear + .addAll(createCalendarListForSpecifiedDaysOfTheYear( + Arrays.asList(01), y1971)); + + verifySubscriptionTimesContainsCyclesForSpecifiedCalendarDays( + calendarDaysOfTheYear, cycles, subscriptionTimes); + } + + @Test + public void testActivePeriodJustBeforeYearBoundary() { + int y1970 = 1970; + int y1971 = 1971; + int planStart = 362; + int subStart = 362; + int activeStart = 363; + int activeEnd = 365; + int subEnd = 2; + int planDays = 5; + Subscription subscription = createOverYearBoundary(planStart, y1970, + subStart, y1970, subEnd, y1971, activeStart, y1970, activeEnd, + y1971, planDays); + ((GriddedTime) subscription.getTime()).setCycleTimes(Arrays.asList( + Integer.valueOf(9), Integer.valueOf(0))); + + TreeSet cycles = new TreeSet( + ((GriddedTime) subscription.getTime()).getCycleTimes()); + + SortedSet subscriptionTimes = bandwidthDaoUtil + .getRetrievalTimes(subscription, cycles); + + List calendarDaysOfTheYear = createCalendarListForSpecifiedDaysOfTheYear( + Arrays.asList(363, 364), y1970); + + verifySubscriptionTimesContainsCyclesForSpecifiedCalendarDays( + calendarDaysOfTheYear, cycles, subscriptionTimes); + } + + @Test + public void testActivePeriodJustAfterYearBoundary() { + int y1970 = 1970; + int y1971 = 1971; + int planStart = 364; + int subStart = 364; + int activeStart = 1; + int activeEnd = 3; + int subEnd = 4; + int planDays = 6; + Subscription subscription = createOverYearBoundary(planStart, y1970, + subStart, y1970, subEnd, y1971, activeStart, y1970, activeEnd, + y1971, planDays); + ((GriddedTime) subscription.getTime()).setCycleTimes(Arrays.asList( + Integer.valueOf(9), Integer.valueOf(0))); + + TreeSet cycles = new TreeSet( + ((GriddedTime) subscription.getTime()).getCycleTimes()); + + SortedSet subscriptionTimes = bandwidthDaoUtil + .getRetrievalTimes(subscription, cycles); + + List calendarDaysOfTheYear = createCalendarListForSpecifiedDaysOfTheYear( + Arrays.asList(1, 2), y1971); + + verifySubscriptionTimesContainsCyclesForSpecifiedCalendarDays( + calendarDaysOfTheYear, cycles, subscriptionTimes); + } + + private List createCalendarListForSpecifiedDaysOfTheYear( + Collection daysOfTheYear, int year) { + List calendarList = new ArrayList( + daysOfTheYear.size()); + for (int dayOfTheYear : daysOfTheYear) { + Calendar cal = TimeUtil.newCalendar(); + cal.set(Calendar.YEAR, year); + cal.set(Calendar.DAY_OF_YEAR, dayOfTheYear); + calendarList.add(cal); + } + return calendarList; + } @Test public void testGetRetrievalTimesReturnsBaseReferenceTimesInPlanWindow() { @@ -165,7 +307,7 @@ public class BandwidthDaoUtilTest { SortedSet subscriptionTimes = bandwidthDaoUtil .getRetrievalTimes(subscription, cycles); - final List daysOfTheYear = Arrays.asList(3, 4); + final List daysOfTheYear = Arrays.asList(3); verifySubscriptionTimesContainsCyclesForSpecifiedDays(daysOfTheYear, cycles, subscriptionTimes); } @@ -257,10 +399,15 @@ public class BandwidthDaoUtilTest { .getRetrievalTimes(subscription, interval); // Expected size is two per hour (0 and 30 minutes), for every hour, - // over the retrieval plan days (2), plus 1 because the retrieval plan - // ends on a 0 minute time - final int expectedSize = TimeUtil.HOURS_PER_DAY * plan.getPlanDays() - * 2 + 1; + // over the retrieval plan days (2), minus the hours for the last day + // because active period is exclusive of the last day (ending hour + // constraint for the last day is 00Z) + Calendar activeEnd = (Calendar) plan.getPlanEnd().clone(); + activeEnd = TimeUtil.minCalendarFields(activeEnd, Calendar.MILLISECOND, + Calendar.SECOND, Calendar.MINUTE, Calendar.HOUR_OF_DAY); + long subPeriodInHours = (activeEnd.getTimeInMillis() - plan + .getPlanStart().getTimeInMillis()) / TimeUtil.MILLIS_PER_HOUR; + final int expectedSize = (int) (subPeriodInHours * 2); assertThat(subscriptionTimes, hasSize(expectedSize)); // Make sure we have the expected number of 0 and 30 minute scheduled @@ -277,7 +424,7 @@ public class BandwidthDaoUtilTest { } final int halfTheTimes = subscriptionTimes.size() / 2; - assertThat(numberOfZeroMinuteTimes, is(equalTo(halfTheTimes + 1))); + assertThat(numberOfZeroMinuteTimes, is(equalTo(halfTheTimes))); assertThat(numberOfThirtyMinuteTimes, is(equalTo(halfTheTimes))); // Would be nice to verify the days and hours, but the cycle based tests @@ -311,6 +458,44 @@ public class BandwidthDaoUtilTest { } } + /** + * Verifies the subscription times contains the cycles for the specified + * days. + * + * @param daysOfTheYear + * @param cycles + * @param subscriptionTimes + */ + private void verifySubscriptionTimesContainsCyclesForSpecifiedCalendarDays( + Collection daysOfTheYear, Collection cycles, + SortedSet subscriptionTimes) { + boolean success = true; + StringBuilder sb = new StringBuilder( + "Expected to find retrieval times: "); + int countOfTimes = 0; + + for (Calendar dayOfTheYear : daysOfTheYear) { + for (Integer cycle : cycles) { + Calendar cal = (Calendar) dayOfTheYear.clone(); + TimeUtil.minCalendarFields(cal, Calendar.MILLISECOND, + Calendar.SECOND, Calendar.MINUTE); + cal.set(Calendar.HOUR_OF_DAY, cycle); + success = success && subscriptionTimes.contains(cal); + ++countOfTimes; + sb.append(BandwidthUtil.format(cal)).append( + String.format(" %1$tZ ", cal)); + } + } + sb.append("\nIn: "); + for (Calendar subTime : subscriptionTimes) { + sb.append(BandwidthUtil.format(subTime)).append( + String.format(" %1$tZ ", subTime)); + } + assertTrue(sb.toString(), success); + assertTrue(sb.toString(), + countOfTimes == subscriptionTimes.size()); + } + /** * Verifies the subscription times do not contain the cycles for the * specified days. From 1f4cc8681d9fd58d71c7382549d60c182cf83599 Mon Sep 17 00:00:00 2001 From: Mike Duff Date: Tue, 28 Jan 2014 11:09:33 -0600 Subject: [PATCH 21/21] Issue #2636 - Changed subscription code to use gmt calendar. Former-commit-id: 6e01cdb78e011275215abc5e2e01f55a49e3d1ed [formerly 6e01cdb78e011275215abc5e2e01f55a49e3d1ed [formerly 3e75bd3e55517bca7c85213307ed67973c2f145e]] Former-commit-id: 1caacacfe317b692c426b8e1e2d93d12ca26f320 Former-commit-id: f4da152d87cd0e0e5ee7dcefd7a2cc72f452a8e3 --- .../registry/RecurringSubscription.java | 58 +++++-- .../uf/common/time/util/TimeUtil.java | 49 ++---- .../registry/SiteSubscriptionTest.java | 152 +++++++++++++++++- 3 files changed, 205 insertions(+), 54 deletions(-) diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/RecurringSubscription.java b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/RecurringSubscription.java index fc3ffbe506..7e312e1d3e 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/RecurringSubscription.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.registry/src/com/raytheon/uf/common/datadelivery/registry/RecurringSubscription.java @@ -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 * 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. **/ @@ -65,9 +65,10 @@ import com.raytheon.uf.common.time.util.TimeUtil; * Nov 14, 2013 2548 mpduff Add a subscription type slot. * Jan 08, 2014 2615 bgonzale Implement calculate start and calculate end methods. * Jan 14, 2014 2459 mpduff Add subscription state. - * Jan 20, 2013 2398 dhladky Fixed rescheduling beyond active period/expired window. - * Jan 24, 2013 2709 bgonzale Fix setting of active period end. Change active period checks + * Jan 20, 2014 2398 dhladky Fixed rescheduling beyond active period/expired window. + * Jan 24, 2014 2709 bgonzale Fix setting of active period end. Change active period checks * to check day of year. removed now unused active period methods. + * Jan 28, 2014 2636 mpduff Changed to use GMT calendar. * * * @@ -472,15 +473,15 @@ public abstract class RecurringSubscription private Integer getStartActivePeriodDayOfYear() { if (startActivePeriodDayOfYear == null && activePeriodStart != null) { - startActivePeriodDayOfYear = TimeUtil - .newCalendar(activePeriodStart).get(Calendar.DAY_OF_YEAR); + startActivePeriodDayOfYear = TimeUtil.newGmtCalendar( + activePeriodStart).get(Calendar.DAY_OF_YEAR); } return startActivePeriodDayOfYear; } private Integer getEndActivePeriodDayOfYear() { if (endActivePeriodDayOfYear == null && activePeriodEnd != null) { - endActivePeriodDayOfYear = TimeUtil.newCalendar(activePeriodEnd) + endActivePeriodDayOfYear = TimeUtil.newGmtCalendar(activePeriodEnd) .get(Calendar.DAY_OF_YEAR); } return endActivePeriodDayOfYear; @@ -488,14 +489,34 @@ public abstract class RecurringSubscription @Override public Calendar calculateStart(Calendar startConstraint) { - return TimeUtil.newCalendar(TimeUtil.max(subscriptionStart, - startConstraint)); + if (subscriptionStart == null) { + return startConstraint; + } + + long subStartMillis = subscriptionStart.getTime(); + long constaintMillis = startConstraint.getTimeInMillis(); + + if (subStartMillis > constaintMillis) { + return TimeUtil.newGmtCalendar(subscriptionStart); + } + + return startConstraint; } @Override public Calendar calculateEnd(Calendar endConstraint) { - return TimeUtil.newCalendar(TimeUtil - .min(subscriptionEnd, endConstraint)); + if (subscriptionEnd == null) { + return endConstraint; + } + + long subEndMillis = subscriptionEnd.getTime(); + long constaintMillis = endConstraint.getTimeInMillis(); + + if (subEndMillis < constaintMillis) { + return TimeUtil.newGmtCalendar(subscriptionEnd); + } + + return endConstraint; } /** @@ -891,9 +912,10 @@ public abstract class RecurringSubscription return expired; } - + /** * Check for expiration on date + * * @param date * @return */ @@ -941,9 +963,10 @@ public abstract class RecurringSubscription return subscriptionState == SubscriptionState.ON && !checkAndSetExpiration(); } - + /** * Should this be scheduled for this time. + * * @param checkDate * @return */ @@ -951,10 +974,11 @@ public abstract class RecurringSubscription if (!isExpired(checkCal.getTime()) && inActivePeriodWindow(checkCal)) { return true; } - + return false; } + @Override public boolean inActivePeriodWindow(Calendar checkDate) { if (activePeriodStart == null && activePeriodEnd == null) { // no active period set @@ -967,7 +991,7 @@ public abstract class RecurringSubscription boolean isAfterPeriodStart = startDay <= checkDay; boolean isBeforePeriodEnd = checkDay < endDay; boolean periodCrossesYearBoundary = endDay < startDay; - + if (periodCrossesYearBoundary) { return isAfterPeriodStart || isBeforePeriodEnd; } else { @@ -1084,4 +1108,4 @@ public abstract class RecurringSubscription public boolean shouldUpdate() { return shouldUpdate; } -} +} \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.common.time/src/com/raytheon/uf/common/time/util/TimeUtil.java b/edexOsgi/com.raytheon.uf.common.time/src/com/raytheon/uf/common/time/util/TimeUtil.java index 755cbc657e..c3d3f12305 100644 --- a/edexOsgi/com.raytheon.uf.common.time/src/com/raytheon/uf/common/time/util/TimeUtil.java +++ b/edexOsgi/com.raytheon.uf.common.time/src/com/raytheon/uf/common/time/util/TimeUtil.java @@ -56,6 +56,7 @@ import com.raytheon.uf.common.time.domain.api.ITimePoint; * Nov 05, 2013 2499 rjpeter Added prettyDuration. * Jan 08, 2014 2615 bgonzale Added Calendar min and max methods. * Added newGmtCalendar from a date method. + * Jan 28, 2014 2636 mpduff Removed unused methods. * * * @author njensen @@ -181,6 +182,13 @@ public final class TimeUtil { */ static ITimeStrategy timeStrategy = SYSTEM_TIME_STRATEGY; + /** + * Disabled constructor. + */ + private TimeUtil() { + + } + /** * Converts a Calendar in the local time zone to a GMT date * @@ -327,30 +335,6 @@ public final class TimeUtil { || (laterCal.get(Calendar.YEAR) > earlierCal.get(Calendar.YEAR)); } - /** - * Min comparison of a Date and a Calendar; returns the lesser. - * - * @param lhs - * @param rhs - * @return the lesser of a Data and a Calendar; returns null if either is - * null. - */ - public static Calendar min(Date lhs, Calendar rhs) { - return min(TimeUtil.newCalendar(lhs), rhs); - } - - /** - * Max comparison of a Date and a Calendar; returns the greater. - * - * @param lhs - * @param rhs - * @return the greater of a Data and a Calendar; returns null if either is - * null. - */ - public static Calendar max(Date lhs, Calendar rhs) { - return max(TimeUtil.newCalendar(lhs), rhs); - } - /** * Max comparison of two Calendars; returns the greater. * @@ -577,14 +561,9 @@ public final class TimeUtil { return timeString.toString(); } - /** - * Disabled constructor. - */ - private TimeUtil() { - } - /** * New Calendar from a Date + * * @param date * @return */ @@ -596,7 +575,7 @@ public final class TimeUtil { } return t; } - + /** * New Calendar from an existing calendar * @@ -611,7 +590,7 @@ public final class TimeUtil { } return t; } - + /** * New GMT Calendar from a Date * @@ -637,11 +616,11 @@ public final class TimeUtil { * @return */ public static Calendar addCurrentYearCalendar(final Calendar calendar) { - + Calendar yearTime = TimeUtil.newGmtCalendar(); calendar.set(Calendar.YEAR, yearTime.get(Calendar.YEAR)); - + return calendar; } - + } diff --git a/tests/unit/com/raytheon/uf/common/datadelivery/registry/SiteSubscriptionTest.java b/tests/unit/com/raytheon/uf/common/datadelivery/registry/SiteSubscriptionTest.java index 4789beefaa..c0a3f8cf3f 100644 --- a/tests/unit/com/raytheon/uf/common/datadelivery/registry/SiteSubscriptionTest.java +++ b/tests/unit/com/raytheon/uf/common/datadelivery/registry/SiteSubscriptionTest.java @@ -25,8 +25,10 @@ import static org.hamcrest.CoreMatchers.not; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; +import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; +import java.util.TimeZone; import javax.xml.bind.JAXBException; @@ -54,8 +56,9 @@ import com.raytheon.uf.common.time.util.TimeUtilTest; * Jan 11, 2013 1453 djohnson Add test for active period crossing year boundary. * Mar 28, 2013 1841 djohnson Subscription is now UserSubscription. * May 15, 2013 1040 mpduff Office Id now a set. - * Oct 21, 2013 2292 mpduff Implement multiple data types - * Jan 14, 2014 2459 mpduff Change Subscription status code + * Oct 21, 2013 2292 mpduff Implement multiple data types. + * Jan 14, 2014 2459 mpduff Change Subscription status code. + * Jan 28, 2014 2636 mpduff Added testInWindow test method. * * * @@ -268,4 +271,149 @@ public class SiteSubscriptionTest { System.out.println(new JAXBManager(SiteSubscription.class) .marshalToXml(subscription)); } + + @Test + public void testGetStatusForOneDayWindow() { + final Date tomorrow = new Date(TimeUtil.currentTimeMillis() + + (TimeUtil.MILLIS_PER_DAY)); + final Date today = new Date(TimeUtil.currentTimeMillis()); + + Subscription subscription = new SubscriptionBuilder() + .withActivePeriodStart(today).withActivePeriodEnd(tomorrow) + .build(); + + assertThat(subscription.getStatus(), + is(equalTo(SubscriptionStatus.ACTIVE))); + + } + + @Test + public void testInWindowMethod() { + SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm"); + sdf.setTimeZone(TimeZone.getTimeZone("GMT")); + Calendar startCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + Calendar endCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + Calendar checkCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + + startCal.set(Calendar.MONTH, Calendar.DECEMBER); + startCal.set(Calendar.DAY_OF_MONTH, 20); + endCal.set(Calendar.MONTH, Calendar.JANUARY); + endCal.set(Calendar.DAY_OF_MONTH, 10); + + // Active window crosses year boundary + // First check Jan 1 + checkCal.set(Calendar.MONTH, Calendar.JANUARY); + checkCal.set(Calendar.DAY_OF_MONTH, 1); + startCal = TimeUtil.minCalendarFields(startCal, Calendar.HOUR_OF_DAY, + Calendar.MINUTE, Calendar.SECOND, Calendar.MILLISECOND); + endCal = TimeUtil.minCalendarFields(endCal, Calendar.HOUR_OF_DAY, + Calendar.MINUTE, Calendar.SECOND, Calendar.MILLISECOND); + checkCal = TimeUtil.minCalendarFields(checkCal, Calendar.HOUR_OF_DAY, + Calendar.MINUTE, Calendar.SECOND, Calendar.MILLISECOND); + + Subscription subscription = new SubscriptionBuilder() + .withActivePeriodStart(startCal.getTime()) + .withActivePeriodEnd(endCal.getTime()).build(); + + System.out.println("\nStartCal: " + sdf.format(startCal.getTime())); + System.out.println("EndCal: " + sdf.format(endCal.getTime())); + System.out.println("CheckCal: " + sdf.format(checkCal.getTime())); + assertThat(subscription.inActivePeriodWindow(checkCal), + is(equalTo(Boolean.TRUE))); + + // Next check Starting Day + checkCal.set(Calendar.MONTH, Calendar.DECEMBER); + checkCal.set(Calendar.DAY_OF_MONTH, 20); + + System.out.println("\nStartCal: " + sdf.format(startCal.getTime())); + System.out.println("EndCal: " + sdf.format(endCal.getTime())); + System.out.println("CheckCal: " + sdf.format(checkCal.getTime())); + assertThat(subscription.inActivePeriodWindow(checkCal), + is(equalTo(Boolean.TRUE))); + + // Next check Ending Day - Should be outside window + checkCal.set(Calendar.MONTH, Calendar.JANUARY); + checkCal.set(Calendar.DAY_OF_MONTH, 10); + + System.out.println("\nStartCal: " + sdf.format(startCal.getTime())); + System.out.println("EndCal: " + sdf.format(endCal.getTime())); + System.out.println("CheckCal: " + sdf.format(checkCal.getTime())); + assertThat(subscription.inActivePeriodWindow(checkCal), + is(equalTo(Boolean.FALSE))); + + // Next check before starting Day - Should be outside window + checkCal.set(Calendar.MONTH, Calendar.OCTOBER); + checkCal.set(Calendar.DAY_OF_MONTH, 10); + + System.out.println("\nStartCal: " + sdf.format(startCal.getTime())); + System.out.println("EndCal: " + sdf.format(endCal.getTime())); + System.out.println("CheckCal: " + sdf.format(checkCal.getTime())); + assertThat(subscription.inActivePeriodWindow(checkCal), + is(equalTo(Boolean.FALSE))); + + // Next check after ending Day - Should be outside window + checkCal.set(Calendar.MONTH, Calendar.MARCH); + checkCal.set(Calendar.DAY_OF_MONTH, 10); + + System.out.println("\nStartCal: " + sdf.format(startCal.getTime())); + System.out.println("EndCal: " + sdf.format(endCal.getTime())); + System.out.println("CheckCal: " + sdf.format(checkCal.getTime())); + assertThat(subscription.inActivePeriodWindow(checkCal), + is(equalTo(Boolean.FALSE))); + + // Change window to not be over year boundary + startCal.set(Calendar.MONTH, Calendar.MARCH); + startCal.set(Calendar.DAY_OF_MONTH, 1); + endCal.set(Calendar.MONTH, Calendar.OCTOBER); + endCal.set(Calendar.DAY_OF_MONTH, 1); + + subscription = new SubscriptionBuilder() + .withActivePeriodStart(startCal.getTime()) + .withActivePeriodEnd(endCal.getTime()).build(); + + // First check day in the window + checkCal.set(Calendar.MONTH, Calendar.JUNE); + checkCal.set(Calendar.DAY_OF_MONTH, 10); + System.out.println("\nStartCal: " + sdf.format(startCal.getTime())); + System.out.println("EndCal: " + sdf.format(endCal.getTime())); + System.out.println("CheckCal: " + sdf.format(checkCal.getTime())); + assertThat(subscription.inActivePeriodWindow(checkCal), + is(equalTo(Boolean.TRUE))); + + // Check start day + checkCal.set(Calendar.MONTH, Calendar.MARCH); + checkCal.set(Calendar.DAY_OF_MONTH, 1); + System.out.println("\nStartCal: " + sdf.format(startCal.getTime())); + System.out.println("EndCal: " + sdf.format(endCal.getTime())); + System.out.println("CheckCal: " + sdf.format(checkCal.getTime())); + assertThat(subscription.inActivePeriodWindow(checkCal), + is(equalTo(Boolean.TRUE))); + + // Check end day - should be outside window + checkCal.set(Calendar.MONTH, Calendar.OCTOBER); + checkCal.set(Calendar.DAY_OF_MONTH, 1); + System.out.println("\nStartCal: " + sdf.format(startCal.getTime())); + System.out.println("EndCal: " + sdf.format(endCal.getTime())); + System.out.println("CheckCal: " + sdf.format(checkCal.getTime())); + assertThat(subscription.inActivePeriodWindow(checkCal), + is(equalTo(Boolean.FALSE))); + + // Check before start day - should be outside window + checkCal.set(Calendar.MONTH, Calendar.FEBRUARY); + checkCal.set(Calendar.DAY_OF_MONTH, 1); + System.out.println("\nStartCal: " + sdf.format(startCal.getTime())); + System.out.println("EndCal: " + sdf.format(endCal.getTime())); + System.out.println("CheckCal: " + sdf.format(checkCal.getTime())); + assertThat(subscription.inActivePeriodWindow(checkCal), + is(equalTo(Boolean.FALSE))); + + // Check after end day - should be outside window + checkCal.set(Calendar.MONTH, Calendar.NOVEMBER); + checkCal.set(Calendar.DAY_OF_MONTH, 1); + System.out.println("\nStartCal: " + sdf.format(startCal.getTime())); + System.out.println("EndCal: " + sdf.format(endCal.getTime())); + System.out.println("CheckCal: " + sdf.format(checkCal.getTime())); + assertThat(subscription.inActivePeriodWindow(checkCal), + is(equalTo(Boolean.FALSE))); + } }