From 9e4100b0e1b49c195bccc1502766422d5156e670 Mon Sep 17 00:00:00 2001 From: Nate Jensen Date: Mon, 14 Oct 2013 12:35:23 -0500 Subject: [PATCH] Issue #2361 replace hibernatables being detected by SerializableManager with detection from open source reflections Change-Id: I33ddc5eb2acb909d79f6d1121747dc2aa7489c2e Former-commit-id: b49a2ceb2f3611d73bdce836df50f8074d9ce2d9 [formerly 16205ab7302195e99c8af69f9d24b41bca869ce3] Former-commit-id: 40847d0edf7c0fce0f6cc4e209255010afa93c4a --- .../feature.xml | 6 + cots/org.reflections/.classpath | 7 + cots/org.reflections/.project | 28 +++ .../.settings/org.eclipse.jdt.core.prefs | 7 + cots/org.reflections/META-INF/MANIFEST.MF | 13 ++ cots/org.reflections/build.properties | 2 + .../org.reflections/reflections-0.9.9-RC1.jar | Bin 0 -> 121013 bytes .../build.edex/esb/conf/spring/edex-db.xml | 16 +- edexOsgi/build.edex/esb/conf/spring/edex.xml | 5 +- ...f.common.serialization.ISerializableObject | 2 - .../data/ReplacementRecord.java | 63 ++++-- .../data/SubscriptionRecord.java | 2 +- .../data/package-info.java | 2 +- .../raytheon/edex/services/ScriptRunner.java | 4 +- .../subscription/dao/SubscriptionDAO.java | 2 +- .../runners/SubscribeAddRunner.java | 2 +- .../runners/SubscribeDeleteRunner.java | 2 +- .../runners/SubscribeQueryRunner.java | 2 +- .../runners/SubscribeReadRunner.java | 2 +- .../runners/SubscribeUpdateRunner.java | 2 +- .../META-INF/MANIFEST.MF | 1 - .../raytheon/edex/util/grib/GribLevel.java | 210 ------------------ ...f.common.serialization.ISerializableObject | 6 - .../plugin/satellite/SatelliteDecoder.java | 4 +- .../dao/SatelliteCreatingEntityDao.java | 2 +- .../plugin/satellite/dao/SatelliteDao.java | 12 +- .../dao/SatellitePhysicalElementDao.java | 2 +- .../satellite/dao/SatellitePositionDao.java | 2 +- .../satellite/dao/SatelliteSectorIdDao.java | 2 +- .../satellite/dao/SatelliteSourceDao.java | 2 +- .../satellite/dao/SatelliteUnitDao.java | 2 +- .../gini}/SatelliteCreatingEntity.java | 5 +- .../gini}/SatellitePhysicalElement.java | 5 +- .../satellite/gini}/SatellitePosition.java | 5 +- .../satellite/gini}/SatelliteSectorId.java | 5 +- .../satellite/gini}/SatelliteSource.java | 5 +- .../satellite/gini}/SatelliteUnit.java | 5 +- .../res/spring/text-common.xml | 1 + .../serialization/ISerializableObject.java | 10 +- .../serialization/SerializableManager.java | 118 +--------- .../feature.xml | 6 + .../META-INF/MANIFEST.MF | 3 +- .../DatabaseClassAnnotationFinder.java | 92 ++++++++ .../DatabaseSessionConfiguration.java | 21 +- .../database/DatabaseSessionFactoryBean.java | 62 +++--- .../edex/database/schema}/PluginSchema.java | 7 +- .../edex/database/schema}/SchemaManager.java | 82 +++++-- .../uf/edex/ogc/common/db/PointDataLayer.java | 117 +++++----- .../res/spring/ohd-common.xml | 2 + .../ncep/edex/util/ncgrib/NcgribLevel.java | 210 ------------------ 50 files changed, 448 insertions(+), 727 deletions(-) create mode 100644 cots/org.reflections/.classpath create mode 100644 cots/org.reflections/.project create mode 100644 cots/org.reflections/.settings/org.eclipse.jdt.core.prefs create mode 100644 cots/org.reflections/META-INF/MANIFEST.MF create mode 100644 cots/org.reflections/build.properties create mode 100644 cots/org.reflections/reflections-0.9.9-RC1.jar delete mode 100644 edexOsgi/com.raytheon.edex.autobldsrv/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject rename edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/{subscription => autobldsrv}/data/ReplacementRecord.java (85%) rename edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/{subscription => autobldsrv}/data/SubscriptionRecord.java (99%) rename edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/{subscription => autobldsrv}/data/package-info.java (95%) delete mode 100644 edexOsgi/com.raytheon.edex.plugin.grib/src/com/raytheon/edex/util/grib/GribLevel.java delete mode 100644 edexOsgi/com.raytheon.edex.plugin.satellite/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject rename edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/{util/satellite => plugin/satellite/gini}/SatelliteCreatingEntity.java (94%) rename edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/{util/satellite => plugin/satellite/gini}/SatellitePhysicalElement.java (94%) rename edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/{util/satellite => plugin/satellite/gini}/SatellitePosition.java (96%) rename edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/{util/satellite => plugin/satellite/gini}/SatelliteSectorId.java (94%) rename edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/{util/satellite => plugin/satellite/gini}/SatelliteSource.java (94%) rename edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/{util/satellite => plugin/satellite/gini}/SatelliteUnit.java (92%) create mode 100644 edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/DatabaseClassAnnotationFinder.java rename edexOsgi/{com.raytheon.edex.common/src/com/raytheon/edex/db/purge => com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/schema}/PluginSchema.java (94%) rename edexOsgi/{com.raytheon.edex.common/src/com/raytheon/edex/db/purge => com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/schema}/SchemaManager.java (86%) delete mode 100644 ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/ncgrib/NcgribLevel.java diff --git a/cave/com.raytheon.uf.viz.cots.feature/feature.xml b/cave/com.raytheon.uf.viz.cots.feature/feature.xml index 65244a65cc..49ad6fedea 100644 --- a/cave/com.raytheon.uf.viz.cots.feature/feature.xml +++ b/cave/com.raytheon.uf.viz.cots.feature/feature.xml @@ -81,4 +81,10 @@ install-size="0" version="0.0.0"/> + + diff --git a/cots/org.reflections/.classpath b/cots/org.reflections/.classpath new file mode 100644 index 0000000000..b7d5ca95d9 --- /dev/null +++ b/cots/org.reflections/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/cots/org.reflections/.project b/cots/org.reflections/.project new file mode 100644 index 0000000000..6950e4ae62 --- /dev/null +++ b/cots/org.reflections/.project @@ -0,0 +1,28 @@ + + + org.reflections + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/cots/org.reflections/.settings/org.eclipse.jdt.core.prefs b/cots/org.reflections/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..c537b63063 --- /dev/null +++ b/cots/org.reflections/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/cots/org.reflections/META-INF/MANIFEST.MF b/cots/org.reflections/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..460ae67b86 --- /dev/null +++ b/cots/org.reflections/META-INF/MANIFEST.MF @@ -0,0 +1,13 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Reflections +Bundle-SymbolicName: org.reflections +Bundle-Version: 0.9.9 +Bundle-ClassPath: reflections-0.9.9-RC1.jar +Export-Package: org.reflections, + org.reflections.adapters, + org.reflections.scanners, + org.reflections.serializers, + org.reflections.util, + org.reflections.vfs +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 diff --git a/cots/org.reflections/build.properties b/cots/org.reflections/build.properties new file mode 100644 index 0000000000..e7cdcbf0d8 --- /dev/null +++ b/cots/org.reflections/build.properties @@ -0,0 +1,2 @@ +bin.includes = META-INF/,\ + reflections-0.9.9-RC1.jar diff --git a/cots/org.reflections/reflections-0.9.9-RC1.jar b/cots/org.reflections/reflections-0.9.9-RC1.jar new file mode 100644 index 0000000000000000000000000000000000000000..8524129ebb492b4fedd836a7ea39f311ea51647b GIT binary patch literal 121013 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%0Alra|7uw)^twyup}Lj(x}N*H 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 N0fw92Rlq + http://www.springframework.org/schema/tx/spring-tx.xsd"> + + + + + + com.raytheon + gov.noaa + + + + com.raytheon.uf.common.dataplugin.text - com.raytheon.edex.plugin.shef + com.raytheon.uf.common.dataplugin.shef + com.raytheon.edex.plugin.shef diff --git a/edexOsgi/build.edex/esb/conf/spring/edex.xml b/edexOsgi/build.edex/esb/conf/spring/edex.xml index 7d63afb395..8e2cef70c7 100644 --- a/edexOsgi/build.edex/esb/conf/spring/edex.xml +++ b/edexOsgi/build.edex/esb/conf/spring/edex.xml @@ -155,11 +155,12 @@ - + - + diff --git a/edexOsgi/com.raytheon.edex.autobldsrv/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/edexOsgi/com.raytheon.edex.autobldsrv/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject deleted file mode 100644 index 59a7a16f8c..0000000000 --- a/edexOsgi/com.raytheon.edex.autobldsrv/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject +++ /dev/null @@ -1,2 +0,0 @@ -com.raytheon.edex.subscription.data.ReplacementRecord -com.raytheon.edex.subscription.data.SubscriptionRecord \ No newline at end of file diff --git a/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/data/ReplacementRecord.java b/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/autobldsrv/data/ReplacementRecord.java similarity index 85% rename from edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/data/ReplacementRecord.java rename to edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/autobldsrv/data/ReplacementRecord.java index 3c19694a34..ef1911af5a 100644 --- a/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/data/ReplacementRecord.java +++ b/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/autobldsrv/data/ReplacementRecord.java @@ -17,7 +17,7 @@ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ -package com.raytheon.edex.subscription.data; +package com.raytheon.edex.autobldsrv.data; import javax.persistence.Column; import javax.persistence.Entity; @@ -32,123 +32,139 @@ import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject; -import com.raytheon.uf.common.serialization.ISerializableObject; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; /** * TODO Add Description + * *
- *
+ * 
  * SOFTWARE HISTORY
- *
+ * 
  * Date         Ticket#    Engineer    Description
  * ------------ ---------- ----------- --------------------------
- * 	
+ * 
  * 
  * 
- * + * * @author mfegan - * @version 1.0 + * @version 1.0 */ @Entity -@Table(name="replacements",schema="subscription") +@Table(name = "replacements", schema = "subscription") @XmlRootElement @XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize -public class ReplacementRecord extends PersistableDataObject implements ISerializableObject { +public class ReplacementRecord extends PersistableDataObject { private static final long serialVersionUID = 1L; - @XmlAttribute @DynamicSerializeElement @Id @GeneratedValue private long id; - + @ManyToOne - @JoinColumn(name="subscription", nullable=false) + @JoinColumn(name = "subscription", nullable = false) private SubscriptionRecord subscription; @XmlAttribute @DynamicSerializeElement - @Column(length=50) + @Column(length = 50) private String key; @XmlAttribute @DynamicSerializeElement - @Column(length=2048) + @Column(length = 2048) private String value; + /** * Constructor. */ public ReplacementRecord() { super(); } + /** * Constructor. Creates a replacement record bound to the specified * subscription record. * - * @param parent the subscription record - * @param key the replacement key - * @param value the replacement value + * @param parent + * the subscription record + * @param key + * the replacement key + * @param value + * the replacement value */ public ReplacementRecord(SubscriptionRecord parent, String key, String value) { this.subscription = parent; this.key = key; this.value = value; } + /** * @return the id */ public long getId() { return id; } + /** - * @param id the id to set + * @param id + * the id to set */ public void setId(long id) { this.id = id; } + /** * @return the subscription */ public SubscriptionRecord getSubscription() { return subscription; } + /** - * @param subscription the subscription to set + * @param subscription + * the subscription to set */ public void setSubscription(SubscriptionRecord subscription) { this.subscription = subscription; } + /** * @return the key */ public String getKey() { return key; } + /** - * @param key the key to set + * @param key + * the key to set */ public void setKey(String key) { this.key = key; } + /** * @return the value */ public String getValue() { return value; } + /** - * @param value the value to set + * @param value + * the value to set */ public void setValue(String value) { this.value = value; } - + @Override public boolean equals(Object obj) { if (this == obj) @@ -157,7 +173,7 @@ public class ReplacementRecord extends PersistableDataObject implements ISeriali return false; if (getClass() != obj.getClass()) return false; - ReplacementRecord other = (ReplacementRecord)obj; + ReplacementRecord other = (ReplacementRecord) obj; if (this.key == null) { if (other.key != null) { return false; @@ -174,6 +190,7 @@ public class ReplacementRecord extends PersistableDataObject implements ISeriali } return true; } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/data/SubscriptionRecord.java b/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/autobldsrv/data/SubscriptionRecord.java similarity index 99% rename from edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/data/SubscriptionRecord.java rename to edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/autobldsrv/data/SubscriptionRecord.java index fc78f9f10e..ffa43cc560 100644 --- a/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/data/SubscriptionRecord.java +++ b/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/autobldsrv/data/SubscriptionRecord.java @@ -17,7 +17,7 @@ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ -package com.raytheon.edex.subscription.data; +package com.raytheon.edex.autobldsrv.data; import java.util.Date; import java.util.HashMap; diff --git a/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/data/package-info.java b/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/autobldsrv/data/package-info.java similarity index 95% rename from edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/data/package-info.java rename to edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/autobldsrv/data/package-info.java index 77d35a7835..ff04e5067d 100644 --- a/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/data/package-info.java +++ b/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/autobldsrv/data/package-info.java @@ -21,4 +21,4 @@ * Contains classes mapped to tables in the subscription database * schema. */ -package com.raytheon.edex.subscription.data; +package com.raytheon.edex.autobldsrv.data; diff --git a/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/services/ScriptRunner.java b/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/services/ScriptRunner.java index d2a2e04b70..0c753ec662 100644 --- a/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/services/ScriptRunner.java +++ b/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/services/ScriptRunner.java @@ -31,8 +31,8 @@ import javax.xml.bind.JAXBException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import com.raytheon.edex.subscription.data.ReplacementRecord; -import com.raytheon.edex.subscription.data.SubscriptionRecord; +import com.raytheon.edex.autobldsrv.data.ReplacementRecord; +import com.raytheon.edex.autobldsrv.data.SubscriptionRecord; import com.raytheon.edex.subscription.runners.ISubscribeRunner; import com.raytheon.edex.subscription.runners.SubscribeRunner; import com.raytheon.edex.subscription.util.Tools; diff --git a/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/dao/SubscriptionDAO.java b/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/dao/SubscriptionDAO.java index 7f0acbd76b..261ddc8865 100644 --- a/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/dao/SubscriptionDAO.java +++ b/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/dao/SubscriptionDAO.java @@ -27,7 +27,7 @@ import java.util.Map; import org.hibernate.Query; -import com.raytheon.edex.subscription.data.SubscriptionRecord; +import com.raytheon.edex.autobldsrv.data.SubscriptionRecord; import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject; import com.raytheon.uf.common.dataquery.db.QueryParam; import com.raytheon.uf.common.message.Property; diff --git a/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/runners/SubscribeAddRunner.java b/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/runners/SubscribeAddRunner.java index 23a5c9b7e1..1c985d6c7c 100644 --- a/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/runners/SubscribeAddRunner.java +++ b/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/runners/SubscribeAddRunner.java @@ -23,8 +23,8 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import com.raytheon.edex.autobldsrv.data.SubscriptionRecord; import com.raytheon.edex.subscription.dao.SubscriptionDAO; -import com.raytheon.edex.subscription.data.SubscriptionRecord; import com.raytheon.edex.subscription.util.Tools; import com.raytheon.uf.common.message.Message; import com.raytheon.uf.common.message.Property; diff --git a/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/runners/SubscribeDeleteRunner.java b/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/runners/SubscribeDeleteRunner.java index a2c01e32df..6abc51cdc2 100644 --- a/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/runners/SubscribeDeleteRunner.java +++ b/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/runners/SubscribeDeleteRunner.java @@ -22,8 +22,8 @@ package com.raytheon.edex.subscription.runners; import java.util.ArrayList; import java.util.List; +import com.raytheon.edex.autobldsrv.data.SubscriptionRecord; import com.raytheon.edex.subscription.dao.SubscriptionDAO; -import com.raytheon.edex.subscription.data.SubscriptionRecord; import com.raytheon.edex.subscription.util.Tools; import com.raytheon.uf.common.message.Message; import com.raytheon.uf.common.message.Property; diff --git a/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/runners/SubscribeQueryRunner.java b/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/runners/SubscribeQueryRunner.java index 992fd718f9..7af1ec4a92 100644 --- a/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/runners/SubscribeQueryRunner.java +++ b/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/runners/SubscribeQueryRunner.java @@ -22,8 +22,8 @@ package com.raytheon.edex.subscription.runners; import java.util.ArrayList; import java.util.List; +import com.raytheon.edex.autobldsrv.data.SubscriptionRecord; import com.raytheon.edex.subscription.dao.SubscriptionDAO; -import com.raytheon.edex.subscription.data.SubscriptionRecord; import com.raytheon.edex.subscription.util.Tools; import com.raytheon.uf.common.message.Message; import com.raytheon.uf.common.message.Property; diff --git a/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/runners/SubscribeReadRunner.java b/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/runners/SubscribeReadRunner.java index 7fdfcda5d4..6f3f93d33c 100644 --- a/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/runners/SubscribeReadRunner.java +++ b/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/runners/SubscribeReadRunner.java @@ -22,8 +22,8 @@ package com.raytheon.edex.subscription.runners; import java.util.ArrayList; import java.util.List; +import com.raytheon.edex.autobldsrv.data.SubscriptionRecord; import com.raytheon.edex.subscription.dao.SubscriptionDAO; -import com.raytheon.edex.subscription.data.SubscriptionRecord; import com.raytheon.edex.subscription.util.Tools; import com.raytheon.uf.common.message.Header; import com.raytheon.uf.common.message.Message; diff --git a/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/runners/SubscribeUpdateRunner.java b/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/runners/SubscribeUpdateRunner.java index 06253cb460..6a10be4aad 100644 --- a/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/runners/SubscribeUpdateRunner.java +++ b/edexOsgi/com.raytheon.edex.autobldsrv/src/com/raytheon/edex/subscription/runners/SubscribeUpdateRunner.java @@ -22,8 +22,8 @@ package com.raytheon.edex.subscription.runners; import java.util.ArrayList; import java.util.List; +import com.raytheon.edex.autobldsrv.data.SubscriptionRecord; import com.raytheon.edex.subscription.dao.SubscriptionDAO; -import com.raytheon.edex.subscription.data.SubscriptionRecord; import com.raytheon.edex.subscription.util.Tools; import com.raytheon.uf.common.message.Header; import com.raytheon.uf.common.message.Message; diff --git a/edexOsgi/com.raytheon.edex.common/META-INF/MANIFEST.MF b/edexOsgi/com.raytheon.edex.common/META-INF/MANIFEST.MF index 10ae4a0e10..078ae9bef2 100644 --- a/edexOsgi/com.raytheon.edex.common/META-INF/MANIFEST.MF +++ b/edexOsgi/com.raytheon.edex.common/META-INF/MANIFEST.MF @@ -11,7 +11,6 @@ Export-Package: com.raytheon.edex.colormap, com.raytheon.edex.db.dao, com.raytheon.edex.db.mapping, com.raytheon.edex.db.objects.hibernate, - com.raytheon.edex.db.purge, com.raytheon.edex.esb, com.raytheon.edex.exception, com.raytheon.edex.msg, diff --git a/edexOsgi/com.raytheon.edex.plugin.grib/src/com/raytheon/edex/util/grib/GribLevel.java b/edexOsgi/com.raytheon.edex.plugin.grib/src/com/raytheon/edex/util/grib/GribLevel.java deleted file mode 100644 index 64d35ae587..0000000000 --- a/edexOsgi/com.raytheon.edex.plugin.grib/src/com/raytheon/edex/util/grib/GribLevel.java +++ /dev/null @@ -1,210 +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.edex.util.grib; - -import javax.measure.unit.Unit; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; - -import org.apache.commons.lang.builder.HashCodeBuilder; -import org.hibernate.annotations.Type; - -import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject; -import com.raytheon.uf.common.serialization.ISerializableObject; - -/** - * Represents a grib level - *

- * Refer to the files grib1levels.xml and grib2levels.xml. This class maps to - * the levels defined in those files. - * - *

- * SOFTWARE HISTORY
- * Date         Ticket#     Engineer    Description
- * ------------ ----------  ----------- --------------------------
- * 9/26/07      381         bphillip    Initial creation
- * 
- * 
- * 
- */ -@Entity -@Table(name = "grib_levels") -public class GribLevel extends PersistableDataObject implements - ISerializableObject { - - private static final long serialVersionUID = 1L; - - @Id - private Integer id; - - @Column - private Integer layerNumber; - - @Column - private Integer edition; - - /** The name of the level */ - @Column(length = 127) - private String name; - - /** The unit associated with the level */ - @Column - @Type(type = "com.raytheon.edex.objects.hibernate.grib.UnitType") - private Unit unit; - - /** The number of surfaces described by this level */ - @Column(name = "layers") - private int numLayers; - - public GribLevel() { - } - - /** - * Constructor - * - * @param name - * The name of the level - * @param unit - * The unit associated with the level - * @param numLayers - * The number of surfaces described by this level - */ - public GribLevel(String name, Unit unit, int numLayers) { - this.name = name; - this.unit = unit; - this.numLayers = numLayers; - } - - /** - * Gets the name - * - * @return the name - */ - public String getName() { - return name; - } - - /** - * Sets the name - * - * @param name - * The name - */ - public void setName(String name) { - this.name = name; - } - - /** - * Gets the unit - * - * @return The unit - */ - public Unit getUnit() { - return unit; - } - - /** - * Sets the unit - * - * @param unit - * The unit - */ - public void setUnit(Unit unit) { - this.unit = unit; - } - - /** - * Gets the number of layers - * - * @return the number of layers - */ - public int getNumLayers() { - return numLayers; - } - - /** - * Sets the number of layers - * - * @param numLayers - * the number of layers - */ - public void setNumLayers(int numLayers) { - this.numLayers = numLayers; - } - - public Integer getEdition() { - return edition; - } - - public void setEdition(Integer edition) { - this.edition = edition; - } - - public Integer getNumber() { - return layerNumber; - } - - public void setNumber(Integer number) { - this.layerNumber = number; - } - - public boolean equals(Object obj) { - if (obj instanceof GribLevel) { - - GribLevel level = (GribLevel) obj; - if (this.layerNumber == level.layerNumber - && this.edition == level.edition - && this.unit.equals(level.unit) - && this.name.equals(level.name) - && this.numLayers == level.numLayers) { - return true; - - } else { - return false; - } - } else { - return false; - } - } - - public int hashCode() { - return new HashCodeBuilder(17, 37).append(layerNumber).append(edition) - .append(name).append(unit).append(numLayers).toHashCode(); - } - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Integer getLayerNumber() { - return layerNumber; - } - - public void setLayerNumber(Integer layerNumber) { - this.layerNumber = layerNumber; - } -} diff --git a/edexOsgi/com.raytheon.edex.plugin.satellite/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/edexOsgi/com.raytheon.edex.plugin.satellite/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject deleted file mode 100644 index 63028b68e2..0000000000 --- a/edexOsgi/com.raytheon.edex.plugin.satellite/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject +++ /dev/null @@ -1,6 +0,0 @@ -com.raytheon.edex.util.satellite.SatelliteSource -com.raytheon.edex.util.satellite.SatelliteCreatingEntity -com.raytheon.edex.util.satellite.SatelliteSectorId -com.raytheon.edex.util.satellite.SatellitePhysicalElement -com.raytheon.edex.util.satellite.SatelliteUnit -com.raytheon.edex.util.satellite.SatellitePosition \ No newline at end of file diff --git a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/SatelliteDecoder.java b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/SatelliteDecoder.java index 9c0100e3a9..f43ec80e11 100644 --- a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/SatelliteDecoder.java +++ b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/SatelliteDecoder.java @@ -33,9 +33,9 @@ import java.util.zip.Inflater; import com.raytheon.edex.exception.DecoderException; import com.raytheon.edex.plugin.satellite.dao.SatelliteDao; +import com.raytheon.edex.plugin.satellite.gini.SatellitePosition; +import com.raytheon.edex.plugin.satellite.gini.SatelliteUnit; import com.raytheon.edex.util.satellite.SatSpatialFactory; -import com.raytheon.edex.util.satellite.SatellitePosition; -import com.raytheon.edex.util.satellite.SatelliteUnit; import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.dataplugin.satellite.SatMapCoverage; import com.raytheon.uf.common.dataplugin.satellite.SatelliteMessageData; diff --git a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatelliteCreatingEntityDao.java b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatelliteCreatingEntityDao.java index 8cfef7f0d2..8850ab5dda 100644 --- a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatelliteCreatingEntityDao.java +++ b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatelliteCreatingEntityDao.java @@ -20,7 +20,7 @@ package com.raytheon.edex.plugin.satellite.dao; -import com.raytheon.edex.util.satellite.SatelliteCreatingEntity; +import com.raytheon.edex.plugin.satellite.gini.SatelliteCreatingEntity; import com.raytheon.uf.edex.database.dao.CoreDao; import com.raytheon.uf.edex.database.dao.DaoConfig; diff --git a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatelliteDao.java b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatelliteDao.java index 1a3433901f..f9d79202a7 100644 --- a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatelliteDao.java +++ b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatelliteDao.java @@ -27,12 +27,12 @@ import java.util.Map; import org.opengis.referencing.operation.TransformException; -import com.raytheon.edex.util.satellite.SatelliteCreatingEntity; -import com.raytheon.edex.util.satellite.SatellitePhysicalElement; -import com.raytheon.edex.util.satellite.SatellitePosition; -import com.raytheon.edex.util.satellite.SatelliteSectorId; -import com.raytheon.edex.util.satellite.SatelliteSource; -import com.raytheon.edex.util.satellite.SatelliteUnit; +import com.raytheon.edex.plugin.satellite.gini.SatelliteCreatingEntity; +import com.raytheon.edex.plugin.satellite.gini.SatellitePhysicalElement; +import com.raytheon.edex.plugin.satellite.gini.SatellitePosition; +import com.raytheon.edex.plugin.satellite.gini.SatelliteSectorId; +import com.raytheon.edex.plugin.satellite.gini.SatelliteSource; +import com.raytheon.edex.plugin.satellite.gini.SatelliteUnit; import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.dataplugin.PluginException; import com.raytheon.uf.common.dataplugin.persist.IPersistable; diff --git a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatellitePhysicalElementDao.java b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatellitePhysicalElementDao.java index b2e651f3cd..5b505e320d 100644 --- a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatellitePhysicalElementDao.java +++ b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatellitePhysicalElementDao.java @@ -19,7 +19,7 @@ **/ package com.raytheon.edex.plugin.satellite.dao; -import com.raytheon.edex.util.satellite.SatellitePhysicalElement; +import com.raytheon.edex.plugin.satellite.gini.SatellitePhysicalElement; import com.raytheon.uf.edex.database.dao.CoreDao; import com.raytheon.uf.edex.database.dao.DaoConfig; diff --git a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatellitePositionDao.java b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatellitePositionDao.java index 5583d1f49c..a1eb684c8b 100644 --- a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatellitePositionDao.java +++ b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatellitePositionDao.java @@ -20,7 +20,7 @@ package com.raytheon.edex.plugin.satellite.dao; -import com.raytheon.edex.util.satellite.SatellitePosition; +import com.raytheon.edex.plugin.satellite.gini.SatellitePosition; import com.raytheon.uf.edex.database.dao.CoreDao; import com.raytheon.uf.edex.database.dao.DaoConfig; diff --git a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatelliteSectorIdDao.java b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatelliteSectorIdDao.java index 138aad0725..f6b619c66f 100644 --- a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatelliteSectorIdDao.java +++ b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatelliteSectorIdDao.java @@ -20,7 +20,7 @@ package com.raytheon.edex.plugin.satellite.dao; -import com.raytheon.edex.util.satellite.SatelliteSectorId; +import com.raytheon.edex.plugin.satellite.gini.SatelliteSectorId; import com.raytheon.uf.edex.database.dao.CoreDao; import com.raytheon.uf.edex.database.dao.DaoConfig; diff --git a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatelliteSourceDao.java b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatelliteSourceDao.java index 3422c1dc85..e0b79fe389 100644 --- a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatelliteSourceDao.java +++ b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatelliteSourceDao.java @@ -22,7 +22,7 @@ package com.raytheon.edex.plugin.satellite.dao; import java.util.List; -import com.raytheon.edex.util.satellite.SatelliteSource; +import com.raytheon.edex.plugin.satellite.gini.SatelliteSource; import com.raytheon.uf.edex.database.DataAccessLayerException; import com.raytheon.uf.edex.database.dao.CoreDao; import com.raytheon.uf.edex.database.dao.DaoConfig; diff --git a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatelliteUnitDao.java b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatelliteUnitDao.java index cbee1c57e2..ee1aeb0ea7 100644 --- a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatelliteUnitDao.java +++ b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/dao/SatelliteUnitDao.java @@ -19,7 +19,7 @@ **/ package com.raytheon.edex.plugin.satellite.dao; -import com.raytheon.edex.util.satellite.SatelliteUnit; +import com.raytheon.edex.plugin.satellite.gini.SatelliteUnit; import com.raytheon.uf.edex.database.dao.CoreDao; import com.raytheon.uf.edex.database.dao.DaoConfig; diff --git a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/util/satellite/SatelliteCreatingEntity.java b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/gini/SatelliteCreatingEntity.java similarity index 94% rename from edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/util/satellite/SatelliteCreatingEntity.java rename to edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/gini/SatelliteCreatingEntity.java index 7ee965230d..0052426487 100644 --- a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/util/satellite/SatelliteCreatingEntity.java +++ b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/gini/SatelliteCreatingEntity.java @@ -18,7 +18,7 @@ * further licensing information. **/ -package com.raytheon.edex.util.satellite; +package com.raytheon.edex.plugin.satellite.gini; import java.io.Serializable; @@ -28,7 +28,6 @@ import javax.persistence.Id; import javax.persistence.Table; import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject; -import com.raytheon.uf.common.serialization.ISerializableObject; /** * A satellite creating entity @@ -46,7 +45,7 @@ import com.raytheon.uf.common.serialization.ISerializableObject; @Entity @Table(name = "satellite_creating_entities") public class SatelliteCreatingEntity extends PersistableDataObject implements - Serializable, ISerializableObject { + Serializable { private static final long serialVersionUID = -4678013903413236803L; diff --git a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/util/satellite/SatellitePhysicalElement.java b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/gini/SatellitePhysicalElement.java similarity index 94% rename from edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/util/satellite/SatellitePhysicalElement.java rename to edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/gini/SatellitePhysicalElement.java index 7c71d7460b..45e8060bfc 100644 --- a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/util/satellite/SatellitePhysicalElement.java +++ b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/gini/SatellitePhysicalElement.java @@ -18,7 +18,7 @@ * further licensing information. **/ -package com.raytheon.edex.util.satellite; +package com.raytheon.edex.plugin.satellite.gini; import java.io.Serializable; @@ -28,7 +28,6 @@ import javax.persistence.Id; import javax.persistence.Table; import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject; -import com.raytheon.uf.common.serialization.ISerializableObject; /** * A satellite physical element @@ -46,7 +45,7 @@ import com.raytheon.uf.common.serialization.ISerializableObject; @Entity @Table(name = "satellite_physical_elements") public class SatellitePhysicalElement extends PersistableDataObject implements - Serializable, ISerializableObject { + Serializable { private static final long serialVersionUID = 8429844485032687146L; diff --git a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/util/satellite/SatellitePosition.java b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/gini/SatellitePosition.java similarity index 96% rename from edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/util/satellite/SatellitePosition.java rename to edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/gini/SatellitePosition.java index 63b1605e7d..abf043d9d9 100644 --- a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/util/satellite/SatellitePosition.java +++ b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/gini/SatellitePosition.java @@ -17,7 +17,7 @@ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ -package com.raytheon.edex.util.satellite; +package com.raytheon.edex.plugin.satellite.gini; import java.io.Serializable; @@ -27,7 +27,6 @@ import javax.persistence.Id; import javax.persistence.Table; import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject; -import com.raytheon.uf.common.serialization.ISerializableObject; /** * Object describing the position of a geostationary satellite. @@ -45,7 +44,7 @@ import com.raytheon.uf.common.serialization.ISerializableObject; @Entity @Table(name = "satellite_geostationary_positions") public class SatellitePosition extends PersistableDataObject implements - Serializable, ISerializableObject { + Serializable { private static final long serialVersionUID = 1854243110517231052L; diff --git a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/util/satellite/SatelliteSectorId.java b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/gini/SatelliteSectorId.java similarity index 94% rename from edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/util/satellite/SatelliteSectorId.java rename to edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/gini/SatelliteSectorId.java index cbf03592d3..5cf78ba477 100644 --- a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/util/satellite/SatelliteSectorId.java +++ b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/gini/SatelliteSectorId.java @@ -18,7 +18,7 @@ * further licensing information. **/ -package com.raytheon.edex.util.satellite; +package com.raytheon.edex.plugin.satellite.gini; import java.io.Serializable; @@ -28,7 +28,6 @@ import javax.persistence.Id; import javax.persistence.Table; import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject; -import com.raytheon.uf.common.serialization.ISerializableObject; /** * A satellite sector id @@ -46,7 +45,7 @@ import com.raytheon.uf.common.serialization.ISerializableObject; @Entity @Table(name = "satellite_sector_ids") public class SatelliteSectorId extends PersistableDataObject implements - Serializable, ISerializableObject { + Serializable { private static final long serialVersionUID = 2745578024205645114L; diff --git a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/util/satellite/SatelliteSource.java b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/gini/SatelliteSource.java similarity index 94% rename from edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/util/satellite/SatelliteSource.java rename to edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/gini/SatelliteSource.java index 7311096075..2d09bc9216 100644 --- a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/util/satellite/SatelliteSource.java +++ b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/gini/SatelliteSource.java @@ -18,7 +18,7 @@ * further licensing information. **/ -package com.raytheon.edex.util.satellite; +package com.raytheon.edex.plugin.satellite.gini; import java.io.Serializable; @@ -28,7 +28,6 @@ import javax.persistence.Id; import javax.persistence.Table; import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject; -import com.raytheon.uf.common.serialization.ISerializableObject; /** * A satellite source i.e. NESDIS @@ -47,7 +46,7 @@ import com.raytheon.uf.common.serialization.ISerializableObject; @Entity @Table(name = "satellite_sources") public class SatelliteSource extends PersistableDataObject implements - Serializable, ISerializableObject { + Serializable { private static final long serialVersionUID = 5855029407853840979L; diff --git a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/util/satellite/SatelliteUnit.java b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/gini/SatelliteUnit.java similarity index 92% rename from edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/util/satellite/SatelliteUnit.java rename to edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/gini/SatelliteUnit.java index caf967eb44..9824e70283 100644 --- a/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/util/satellite/SatelliteUnit.java +++ b/edexOsgi/com.raytheon.edex.plugin.satellite/src/com/raytheon/edex/plugin/satellite/gini/SatelliteUnit.java @@ -17,7 +17,7 @@ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ -package com.raytheon.edex.util.satellite; +package com.raytheon.edex.plugin.satellite.gini; import java.io.Serializable; @@ -27,12 +27,11 @@ import javax.persistence.Id; import javax.persistence.Table; import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject; -import com.raytheon.uf.common.serialization.ISerializableObject; @Entity @Table(name = "satellite_units") public class SatelliteUnit extends PersistableDataObject implements - Serializable, ISerializableObject { + Serializable { private static final long serialVersionUID = 1L; diff --git a/edexOsgi/com.raytheon.edex.plugin.text/res/spring/text-common.xml b/edexOsgi/com.raytheon.edex.plugin.text/res/spring/text-common.xml index 0fdf5c4a1c..07c4787ea9 100644 --- a/edexOsgi/com.raytheon.edex.plugin.text/res/spring/text-common.xml +++ b/edexOsgi/com.raytheon.edex.plugin.text/res/spring/text-common.xml @@ -18,6 +18,7 @@
+ com.raytheon.uf.common.dataplugin.text diff --git a/edexOsgi/com.raytheon.uf.common.serialization/src/com/raytheon/uf/common/serialization/ISerializableObject.java b/edexOsgi/com.raytheon.uf.common.serialization/src/com/raytheon/uf/common/serialization/ISerializableObject.java index 1edbefab81..ff0d2e1f97 100644 --- a/edexOsgi/com.raytheon.uf.common.serialization/src/com/raytheon/uf/common/serialization/ISerializableObject.java +++ b/edexOsgi/com.raytheon.uf.common.serialization/src/com/raytheon/uf/common/serialization/ISerializableObject.java @@ -19,6 +19,8 @@ **/ package com.raytheon.uf.common.serialization; +import javax.persistence.Embeddable; + /** * Empty interface that should be implemented by any class that uses Hibernate, * JaxB, or DynamicSerialize annotations so it is detected at runtime. @@ -44,9 +46,11 @@ package com.raytheon.uf.common.serialization; * annotations. JAXB/XML only requires it if you use the global JAXB * context through {@link SerializationUtil}, however that is a * performance hit and deprecated and you should instead create your - * own {@link JAXBManager}. Hibernate still requires - * ISerializableObject but an alternative will be provided in the - * near future. + * own {@link JAXBManager}. Hibernate no longer uses it, EDEX will + * automatically detect classes with {@link Entity} or + * {@link Embeddable} annotations if their package name starts with + * the same plugin FQN that is present in the PluginProperties or + * DatabasePluginProperties. * */ diff --git a/edexOsgi/com.raytheon.uf.common.serialization/src/com/raytheon/uf/common/serialization/SerializableManager.java b/edexOsgi/com.raytheon.uf.common.serialization/src/com/raytheon/uf/common/serialization/SerializableManager.java index 8d63522ce4..dea86d798b 100644 --- a/edexOsgi/com.raytheon.uf.common.serialization/src/com/raytheon/uf/common/serialization/SerializableManager.java +++ b/edexOsgi/com.raytheon.uf.common.serialization/src/com/raytheon/uf/common/serialization/SerializableManager.java @@ -25,19 +25,13 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.util.ArrayList; -import java.util.Collections; import java.util.Enumeration; -import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; -import java.util.Map; -import java.util.Map.Entry; import java.util.ServiceConfigurationError; import java.util.Set; -import javax.persistence.Embeddable; -import javax.persistence.Entity; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRegistry; @@ -62,6 +56,7 @@ import com.raytheon.uf.common.serialization.jaxb.JaxbDummyObject; * Apr 24, 2013 1939 randerso Clean up code and attempt to improve speed. * Added initializeHibernatables flag to disable * processing hibernatables on CAVE + * Oct 14, 2013 2361 njensen Removed hibernatables * * * @author njensen @@ -72,8 +67,6 @@ public class SerializableManager implements IJaxbableClassesLocator { private static SerializableManager instance; - private final Map>> hibernatables = new HashMap>>(); - private ArrayList> jaxbables = new ArrayList>(); /** @@ -90,7 +83,6 @@ public class SerializableManager implements IJaxbableClassesLocator { private synchronized void initialize() { // this is here in case in the future we want to re-initialize the lists // during runtime, i.e. hot deploy of a new plugin - hibernatables.clear(); jaxbables.clear(); long realStartTime = System.currentTimeMillis(); Set> clazzSet = new HashSet>( @@ -101,36 +93,19 @@ public class SerializableManager implements IJaxbableClassesLocator { "META-INF/services/" + ISerializableObject.class.getName()); - // doHibernate will be false in CAVE since they are not needed - boolean doHibernate = Boolean.getBoolean("initializeHibernatables"); - // In testing 1 thread is slowest, 2 threads cuts the time down // about 50% and 3 threads cuts down another 5% or so, 4 threads // shows no benefit over 2. These results are system specific. int numThreads = 3; LoadSerializableClassesThread[] threads = new LoadSerializableClassesThread[numThreads]; for (int i = 0; i < numThreads; i++) { - threads[i] = new LoadSerializableClassesThread(urls, - doHibernate); + threads[i] = new LoadSerializableClassesThread(urls); threads[i].start(); } for (LoadSerializableClassesThread thread : threads) { thread.join(); clazzSet.addAll(thread.getClazzList()); - - if (doHibernate) { - for (Entry>> entry : thread - .getHibernatables().entrySet()) { - List> list = hibernatables - .get(entry.getKey()); - if (list == null) { - list = new ArrayList>(); - hibernatables.put(entry.getKey(), list); - } - list.addAll(entry.getValue()); - } - } } } catch (Throwable e) { e.printStackTrace(); @@ -150,28 +125,24 @@ public class SerializableManager implements IJaxbableClassesLocator { } private static void fail(@SuppressWarnings("rawtypes") Class service, - String msg, Throwable cause) - throws ServiceConfigurationError { + String msg, Throwable cause) throws ServiceConfigurationError { throw new ServiceConfigurationError(service.getName() + ": " + msg, cause); } private static void fail(@SuppressWarnings("rawtypes") Class service, - String msg) - throws ServiceConfigurationError { + String msg) throws ServiceConfigurationError { throw new ServiceConfigurationError(service.getName() + ": " + msg); } private static void fail(@SuppressWarnings("rawtypes") Class service, - URL u, int line, String msg) - throws ServiceConfigurationError { + URL u, int line, String msg) throws ServiceConfigurationError { fail(service, u + ":" + line + ": " + msg); } private static int parseLine(@SuppressWarnings("rawtypes") Class service, - URL u, BufferedReader r, - int lc, List names) throws IOException, - ServiceConfigurationError { + URL u, BufferedReader r, int lc, List names) + throws IOException, ServiceConfigurationError { String ln = r.readLine(); if (ln == null) { return -1; @@ -216,40 +187,6 @@ public class SerializableManager implements IJaxbableClassesLocator { return instance; } - /** - * Returns the list of classes at runtime that have Hibernate annotations - * - * @return - */ - public List> getHibernatablesForPluginFQN( - String pluginFQN) { - List> list = hibernatables.get(pluginFQN); - if (list == null) { - list = Collections.> emptyList(); - } - return list; - } - - /** - * - */ - public Set getHibernatablePluginFQNs() { - return hibernatables.keySet(); - } - - /** - * Returns the list of classes at runtime that have Hibernate annotations - * - * @return - */ - public List> getHibernatables() { - List> rval = new ArrayList>(); - for (List> list : hibernatables.values()) { - rval.addAll(list); - } - return rval; - } - /** * Returns the list of classes at runtime that have JaxB annotations * @@ -264,36 +201,22 @@ public class SerializableManager implements IJaxbableClassesLocator { private final Enumeration urls; - private final boolean doHibernate; - private final List> clazzList; - private final Map>> hibernatables; - - public LoadSerializableClassesThread(Enumeration urls, - boolean doHibernate) { + public LoadSerializableClassesThread(Enumeration urls) { this.urls = urls; - this.doHibernate = doHibernate; this.clazzList = new ArrayList>(500); - this.hibernatables = new HashMap>>(); } public List> getClazzList() { return clazzList; } - public Map>> getHibernatables() { - return hibernatables; - } - @Override public void run() { try { ClassLoader cl = getClass().getClassLoader(); Set> pluginHibernateSet = null; - if (doHibernate) { - pluginHibernateSet = new HashSet>(); - } List names = new ArrayList(); URL u = getNextUrl(); while (u != null) { @@ -339,10 +262,6 @@ public class SerializableManager implements IJaxbableClassesLocator { } } - if (doHibernate) { - pluginHibernateSet.clear(); - } - Iterator iter = names.iterator(); while (iter.hasNext()) { String clazz = iter.next(); @@ -358,22 +277,7 @@ public class SerializableManager implements IJaxbableClassesLocator { added = true; } - if (doHibernate) { - if (c.getAnnotation(Entity.class) != null - || c.getAnnotation(Embeddable.class) != null) { - pluginHibernateSet.add(c); - added = true; - } - } - long time = (System.currentTimeMillis() - t0); - if (doHibernate && !added) { - System.out - .println("Class: " - + clazz - + " should not be in ISerializableObject file, wasted " - + time + "ms processing it!"); - } } catch (ClassNotFoundException e) { System.out .println("Unable to load class " @@ -381,12 +285,6 @@ public class SerializableManager implements IJaxbableClassesLocator { + ". Check that class is spelled correctly in ISerializableObject file"); } } - - if (doHibernate && pluginHibernateSet.size() > 0) { - hibernatables.put(pluginFQN, - new ArrayList>( - pluginHibernateSet)); - } u = getNextUrl(); } } catch (Throwable e) { diff --git a/edexOsgi/com.raytheon.uf.edex.cots.feature/feature.xml b/edexOsgi/com.raytheon.uf.edex.cots.feature/feature.xml index 120bc20d5e..04feb9becf 100644 --- a/edexOsgi/com.raytheon.uf.edex.cots.feature/feature.xml +++ b/edexOsgi/com.raytheon.uf.edex.cots.feature/feature.xml @@ -102,4 +102,10 @@ install-size="0" version="0.0.0"/> + + diff --git a/edexOsgi/com.raytheon.uf.edex.database/META-INF/MANIFEST.MF b/edexOsgi/com.raytheon.uf.edex.database/META-INF/MANIFEST.MF index 611de98d27..665180469c 100644 --- a/edexOsgi/com.raytheon.uf.edex.database/META-INF/MANIFEST.MF +++ b/edexOsgi/com.raytheon.uf.edex.database/META-INF/MANIFEST.MF @@ -20,7 +20,8 @@ Require-Bundle: com.raytheon.uf.common.dataquery;bundle-version="1.0.0", org.geotools;bundle-version="2.6.4", com.raytheon.uf.common.localization;bundle-version="1.12.1174", com.raytheon.uf.common.util, - org.slf4j;bundle-version="1.7.5" + org.slf4j;bundle-version="1.7.5", + org.reflections;bundle-version="0.9.9" Export-Package: com.raytheon.uf.edex.database, com.raytheon.uf.edex.database.cluster, com.raytheon.uf.edex.database.cluster.handler, diff --git a/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/DatabaseClassAnnotationFinder.java b/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/DatabaseClassAnnotationFinder.java new file mode 100644 index 0000000000..8689e3dfd4 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/DatabaseClassAnnotationFinder.java @@ -0,0 +1,92 @@ +/** + * 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.database; + +import java.util.Set; + +import javax.persistence.Embeddable; +import javax.persistence.Entity; + +import org.reflections.Reflections; +import org.reflections.scanners.TypeAnnotationsScanner; +import org.reflections.util.ClasspathHelper; +import org.reflections.util.ConfigurationBuilder; + +/** + * Uses the reflections package to find classes on the classpath that match the + * start of a package name and will be needed to access the database. + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Oct 11, 2013            njensen     Initial creation
+ * 
+ * 
+ * + * @author njensen + * @version 1.0 + */ + +public class DatabaseClassAnnotationFinder { + + private Set> dbAnnotatedClassSet; + + public DatabaseClassAnnotationFinder(String... packageNames) { + dbAnnotatedClassSet = findClasses(packageNames); + } + + /** + * Searches the classpath for classes that will be needed by the database + * layer. + * + * @param packageNames + * The start of pacakge names to include, e.g. com.raytheon + * @return + */ + protected Set> findClasses(String... packageNames) { + long t0 = System.currentTimeMillis(); + ConfigurationBuilder cb = new ConfigurationBuilder(); + for (String pkg : packageNames) { + cb.addUrls(ClasspathHelper.forPackage(pkg)); + } + cb.setScanners(new TypeAnnotationsScanner()); + Reflections reflecs = cb.build(); + Set> set = reflecs.getTypesAnnotatedWith(Entity.class, false); + set.addAll(reflecs.getTypesAnnotatedWith(Embeddable.class, false)); + long t1 = System.currentTimeMillis(); + System.out.println("Found " + set.size() + " db classes in " + + (t1 - t0) + " ms"); + return set; + } + + /** + * Gets the set of classes that this class finder is aware of that + * correspond to db classes. + * + * @return + */ + public Set> getDbAnnotatedClases() { + return dbAnnotatedClassSet; + } + +} diff --git a/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/DatabaseSessionConfiguration.java b/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/DatabaseSessionConfiguration.java index eb73624293..476f8211ba 100644 --- a/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/DatabaseSessionConfiguration.java +++ b/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/DatabaseSessionConfiguration.java @@ -21,10 +21,12 @@ package com.raytheon.uf.edex.database; import java.util.ArrayList; import java.util.List; +import java.util.Set; import java.util.regex.Pattern; /** - * TODO Add Description + * A configuration used to match which classes should correspond to a particular + * database session. * *
  * 
@@ -32,6 +34,7 @@ import java.util.regex.Pattern;
  * Date         Ticket#    Engineer    Description
  * ------------ ---------- ----------- --------------------------
  * Jun 29, 2010            rjpeter     Initial creation
+ * Oct 11, 2013 2361       njensen     Added database class finder
  * 
  * 
* @@ -40,10 +43,13 @@ import java.util.regex.Pattern; */ public class DatabaseSessionConfiguration { + protected List includes; protected List excludes; + protected DatabaseClassAnnotationFinder finder; + public void setIncludes(List includes) { if (includes != null) { this.includes = new ArrayList(includes.size()); @@ -67,7 +73,7 @@ public class DatabaseSessionConfiguration { if (includes != null) { for (Pattern p : includes) { - if (p.matcher(value).matches()) { + if (p.matcher(value).find()) { rval = true; break; } @@ -78,7 +84,7 @@ public class DatabaseSessionConfiguration { if (excludes != null) { for (Pattern p : excludes) { - if (p.matcher(value).matches()) { + if (p.matcher(value).find()) { rval = false; break; } @@ -87,4 +93,13 @@ public class DatabaseSessionConfiguration { return rval; } + + public Set> getAnnotatedClasses() { + return finder.getDbAnnotatedClases(); + } + + public void setClassFinder(DatabaseClassAnnotationFinder finder) { + this.finder = finder; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/DatabaseSessionFactoryBean.java b/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/DatabaseSessionFactoryBean.java index 3171bdd0f2..2f627f6ffc 100644 --- a/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/DatabaseSessionFactoryBean.java +++ b/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/DatabaseSessionFactoryBean.java @@ -31,9 +31,6 @@ import org.hibernate.cfg.Configuration; import org.hibernate.dialect.Dialect; import org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean; -import com.raytheon.uf.common.serialization.ISerializableObject; -import com.raytheon.uf.common.serialization.SerializableManager; - /** * Extension of the AnnotationSessionFactoryBean provided by Spring. *

@@ -50,11 +47,16 @@ import com.raytheon.uf.common.serialization.SerializableManager; * ------------ ---------- ----------- -------------------------- * 10/8/2008 1532 bphillip Initial checkin * Jun 18, 2013 2117 djohnson Remove use of config.buildSettings(). + * Oct 14, 2013 2361 njensen Changes to support new technique for finding classes + * * * * */ public class DatabaseSessionFactoryBean extends AnnotationSessionFactoryBean { + + protected Class[] accessibleClasses = null; + /** * Creates a new MetadataSessionFactoryBean. *

@@ -77,7 +79,7 @@ public class DatabaseSessionFactoryBean extends AnnotationSessionFactoryBean { * @return List of create sql. * @throws org.hibernate.AnnotationException */ - public String[] getCreateSql(Set> classes) + public String[] getCreateSql(Set> classes) throws org.hibernate.AnnotationException { Configuration config = getConfiguration(); AnnotationConfiguration tmp = loadNewConfigForClasses(classes); @@ -96,7 +98,7 @@ public class DatabaseSessionFactoryBean extends AnnotationSessionFactoryBean { * @return List of create sql. * @throws org.hibernate.AnnotationException */ - public String[] getDropSql(Collection> classes) + public String[] getDropSql(Collection> classes) throws org.hibernate.AnnotationException { Configuration config = getConfiguration(); AnnotationConfiguration tmp = loadNewConfigForClasses(classes); @@ -105,10 +107,10 @@ public class DatabaseSessionFactoryBean extends AnnotationSessionFactoryBean { } private AnnotationConfiguration loadNewConfigForClasses( - Collection> classes) { + Collection> classes) { AnnotationConfiguration aConfig = new AnnotationConfiguration(); - for (Class c : classes) { + for (Class c : classes) { aConfig.addAnnotatedClass(c); } @@ -117,34 +119,40 @@ public class DatabaseSessionFactoryBean extends AnnotationSessionFactoryBean { public void setDatabaseSessionConfiguration( DatabaseSessionConfiguration databaseSessionConfiguration) { - SerializableManager serialManager = SerializableManager.getInstance(); - // make own copy so can modify it - List pluginFQNs = new ArrayList(serialManager - .getHibernatablePluginFQNs()); + List> annotatedClasses = new ArrayList>( + databaseSessionConfiguration.getAnnotatedClasses()); if (databaseSessionConfiguration != null) { - Iterator iter = pluginFQNs.iterator(); + Iterator> iter = annotatedClasses.iterator(); while (iter.hasNext()) { - String fqn = iter.next(); - if (!databaseSessionConfiguration.matches(fqn)) { + Class clazz = iter.next(); + if (!databaseSessionConfiguration.matches(clazz.getName())) { iter.remove(); } } } - if (pluginFQNs != null && pluginFQNs.size() > 0) { - // Get the lists of annotated classes - List> annotatedClasses = new ArrayList>( - 10 * pluginFQNs.size()); - - for (String fqn : pluginFQNs) { - annotatedClasses.addAll(serialManager - .getHibernatablesForPluginFQN(fqn)); - } - - // Set the annotated classes - this.setAnnotatedClasses(annotatedClasses.toArray(new Class[] {})); - } + // Set the annotated classes + this.setAnnotatedClasses(annotatedClasses.toArray(new Class[] {})); } + + @SuppressWarnings("rawtypes") + @Override + public void setAnnotatedClasses(Class[] annotatedClasses) { + super.setAnnotatedClasses(annotatedClasses); + // overrode setter because we need access to the classes + // for determining dependent classes for create/drop SQL + this.accessibleClasses = annotatedClasses; + } + + /** + * Get the annotated classes associated with the database session + * + * @return + */ + public Class[] getAnnotatedClasses() { + return accessibleClasses; + } + } diff --git a/edexOsgi/com.raytheon.edex.common/src/com/raytheon/edex/db/purge/PluginSchema.java b/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/schema/PluginSchema.java similarity index 94% rename from edexOsgi/com.raytheon.edex.common/src/com/raytheon/edex/db/purge/PluginSchema.java rename to edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/schema/PluginSchema.java index b3826af24e..a94c6d43e2 100644 --- a/edexOsgi/com.raytheon.edex.common/src/com/raytheon/edex/db/purge/PluginSchema.java +++ b/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/schema/PluginSchema.java @@ -18,7 +18,7 @@ * further licensing information. **/ -package com.raytheon.edex.db.purge; +package com.raytheon.uf.edex.database.schema; import java.util.ArrayList; import java.util.List; @@ -38,8 +38,9 @@ import com.raytheon.uf.edex.database.plugin.PluginFactory; * SOFTWARE HISTORY * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * 10/8/2008 1532 bphillip Initial checkin - * 2/6/2009 1990 bphillip Modified error handling + * 10/8/2008 1532 bphillip Initial checkin + * 2/6/2009 1990 bphillip Modified error handling + * 10/14/2013 2361 njensen Moved to plugin uf.edex.database * * * @author bphillip diff --git a/edexOsgi/com.raytheon.edex.common/src/com/raytheon/edex/db/purge/SchemaManager.java b/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/schema/SchemaManager.java similarity index 86% rename from edexOsgi/com.raytheon.edex.common/src/com/raytheon/edex/db/purge/SchemaManager.java rename to edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/schema/SchemaManager.java index 98fb93e3e9..e89956f722 100644 --- a/edexOsgi/com.raytheon.edex.common/src/com/raytheon/edex/db/purge/SchemaManager.java +++ b/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/schema/SchemaManager.java @@ -18,7 +18,7 @@ * further licensing information. **/ -package com.raytheon.edex.db.purge; +package com.raytheon.uf.edex.database.schema; import java.io.BufferedReader; import java.io.IOException; @@ -40,10 +40,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.AnnotationException; -import com.raytheon.edex.util.Util; import com.raytheon.uf.common.dataplugin.PluginException; -import com.raytheon.uf.common.serialization.ISerializableObject; -import com.raytheon.uf.common.serialization.SerializableManager; import com.raytheon.uf.common.util.StringUtil; import com.raytheon.uf.edex.core.EDEXUtil; import com.raytheon.uf.edex.core.props.PropertiesFactory; @@ -66,12 +63,14 @@ import com.raytheon.uf.edex.database.plugin.PluginVersionDao; * SOFTWARE HISTORY * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * 10/8/2008 1532 bphillip Initial checkin - * 2/9/2009 1990 bphillip Fixed index creation - * 03/20/09 njensen Implemented IPluginRegistryChanged - * Mar 29, 2013 1841 djohnson Remove unused method, warnings, and close streams with utility method. + * 10/8/2008 1532 bphillip Initial checkin + * 2/9/2009 1990 bphillip Fixed index creation + * 03/20/09 njensen Implemented IPluginRegistryChanged + * Mar 29, 2013 1841 djohnson Remove unused method, warnings, and close streams with utility method. * Mar 02, 2013 1970 bgonzale Added check for abstract entities in sql index naming. - * Removed unused private method populateSchema. + * Removed unused private method populateSchema. + * Oct 14, 2013 2361 njensen Moved to plugin uf.edex.database + * Replaced use of SerializableManager * * * @author bphillip @@ -80,8 +79,7 @@ import com.raytheon.uf.edex.database.plugin.PluginVersionDao; public class SchemaManager implements IDatabasePluginRegistryChanged { /** The logger */ - private static final Log logger = LogFactory - .getLog(SchemaManager.class); + private static final Log logger = LogFactory.getLog(SchemaManager.class); private static final String resourceSelect = "select relname from pg_class where relname = '"; @@ -178,8 +176,20 @@ public class SchemaManager implements IDatabasePluginRegistryChanged { "Unable to execute scripts for plugin FQN " + pluginFQN); } finally { - Util.close(reader); - Util.close(stream); + if (reader != null) { + try { + reader.close(); + } catch (IOException e) { + // ignore + } + } + if (stream != null) { + try { + stream.close(); + } catch (IOException e) { + // ignore + } + } } } } @@ -285,9 +295,9 @@ public class SchemaManager implements IDatabasePluginRegistryChanged { ArrayList createSql = pluginCreateSql.get(fqn); if (createSql == null) { // need the full dependency tree to generate the sql - Set> hibernatables = new HashSet>(); - getAllRequiredHibernatables(props, hibernatables); - String[] sqlArray = sessFactory.getCreateSql(hibernatables); + String[] sqlArray = sessFactory + .getCreateSql(getTablesAndDependencies(props, + sessFactory.getAnnotatedClasses())); createSql = new ArrayList(sqlArray.length); for (String sql : sqlArray) { createSql.add(sql); @@ -330,9 +340,9 @@ public class SchemaManager implements IDatabasePluginRegistryChanged { ArrayList dropSql = pluginDropSql.get(fqn); if (dropSql == null) { // need the full dependency tree to generate the sql - Set> hibernatables = new HashSet>(); - getAllRequiredHibernatables(props, hibernatables); - String[] sqlArray = sessFactory.getDropSql(hibernatables); + String[] sqlArray = sessFactory + .getDropSql(getTablesAndDependencies(props, + sessFactory.getAnnotatedClasses())); dropSql = new ArrayList(sqlArray.length); for (String sql : sqlArray) { dropSql.add(sql); @@ -348,10 +358,30 @@ public class SchemaManager implements IDatabasePluginRegistryChanged { return dropSql; } - protected void getAllRequiredHibernatables(DatabasePluginProperties props, - Set> hibernatables) { - hibernatables.addAll(SerializableManager.getInstance() - .getHibernatablesForPluginFQN(props.getPluginFQN())); + /** + * Searches the classes from the session factory to see if they match the + * plugin FQN. Recursively searches for the classes associated wtih + * dependent plugins. + * + * @param props + * the plugin to find DB classes and dependencies for + * @param allPossibleClasses + * all the classes associated with the session factory + * @return + */ + protected Set> getTablesAndDependencies( + DatabasePluginProperties props, Class[] allPossibleClasses) { + Set> result = new HashSet>(); + // add a . to the end to ensure the package name exactly matches + // and we don't pick up incorrect packages, + // e.g. common.dataplugin.cwa. vs common.dataplugin.cwat. + // There will always be a . since we're looking at class names. + Pattern p = Pattern.compile(props.getPluginFQN() + "\\."); + for (Class clazz : allPossibleClasses) { + if (p.matcher(clazz.getName()).find()) { + result.add(clazz); + } + } List fqns = props.getDependencyFQNs(); if (fqns != null && fqns.size() > 0) { for (String fqn : fqns) { @@ -360,9 +390,12 @@ public class SchemaManager implements IDatabasePluginRegistryChanged { // recurse, may need to add short circuit logic by tracking // plugins already processed - getAllRequiredHibernatables(dProps, hibernatables); + result.addAll(this.getTablesAndDependencies(dProps, + allPossibleClasses)); } } + + return result; } protected void removeAllDependentCreateSql(DatabasePluginProperties props, @@ -469,4 +502,5 @@ public class SchemaManager implements IDatabasePluginRegistryChanged { } } } + } diff --git a/edexOsgi/com.raytheon.uf.edex.ogc.common/src/com/raytheon/uf/edex/ogc/common/db/PointDataLayer.java b/edexOsgi/com.raytheon.uf.edex.ogc.common/src/com/raytheon/uf/edex/ogc/common/db/PointDataLayer.java index 4a878cdce4..72a9b97eb3 100644 --- a/edexOsgi/com.raytheon.uf.edex.ogc.common/src/com/raytheon/uf/edex/ogc/common/db/PointDataLayer.java +++ b/edexOsgi/com.raytheon.uf.edex.ogc.common/src/com/raytheon/uf/edex/ogc/common/db/PointDataLayer.java @@ -1,33 +1,34 @@ /* -* The following software products were developed by Raytheon: -* -* ADE (AWIPS Development Environment) software -* CAVE (Common AWIPS Visualization Environment) software -* EDEX (Environmental Data Exchange) software -* uFrame™ (Universal Framework) software -* -* Copyright (c) 2010 Raytheon Co. -* All rights reserved. This program and the accompanying materials -* are made available under the terms of the Eclipse Public License v1.0 -* which accompanies this distribution, and is available at -* http://www.eclipse.org/org/documents/epl-v10.php -* -* -* Contractor Name: Raytheon Company -* Contractor Address: -* 6825 Pine Street, Suite 340 -* Mail Stop B8 -* Omaha, NE 68106 -* 402.291.0100 -* -* -* SOFTWARE HISTORY -* -* Date Ticket# Engineer Description -* ------------ ---------- ----------- -------------------------- -* Sep 6, 2012 bclement Initial creation -* -*/ + * The following software products were developed by Raytheon: + * + * ADE (AWIPS Development Environment) software + * CAVE (Common AWIPS Visualization Environment) software + * EDEX (Environmental Data Exchange) software + * uFrame™ (Universal Framework) software + * + * Copyright (c) 2010 Raytheon Co. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/org/documents/epl-v10.php + * + * + * Contractor Name: Raytheon Company + * Contractor Address: + * 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * + * SOFTWARE HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * Sep 06, 2012 bclement Initial creation + * Oct 14, 2013 2361 njensen Changed @Entity to @MappedSuperclass + * + */ package com.raytheon.uf.edex.ogc.common.db; import java.util.Date; @@ -36,9 +37,9 @@ import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; -import javax.persistence.Entity; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; +import javax.persistence.MappedSuperclass; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -47,11 +48,11 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.edex.ogc.common.db.LayerTransformer.TimeFormat; /** - * + * * @author bclement - * @version 1.0 + * @version 1.0 */ -@Entity +@MappedSuperclass @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) @XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize @@ -61,21 +62,21 @@ public abstract class PointDataLayer extends private static final long serialVersionUID = 4301480632118555546L; public PointDataLayer() { - } + } public PointDataLayer(SimpleLayer other) { - super(other); - } + super(other); + } - /* - * (non-Javadoc) - * - * @see com.raytheon.uf.edex.ogc.common.db.SimpleLayer#getTimeEntries() - */ - @Override - public List getTimeEntries() { - return LayerTransformer.getTimes(this, TimeFormat.HOUR_RANGES); - } + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.edex.ogc.common.db.SimpleLayer#getTimeEntries() + */ + @Override + public List getTimeEntries() { + return LayerTransformer.getTimes(this, TimeFormat.HOUR_RANGES); + } /* * (non-Javadoc) @@ -92,10 +93,10 @@ public abstract class PointDataLayer extends * * @see com.raytheon.uf.edex.ogc.common.db.SimpleLayer#getDefaultTimeEntry() */ - @Override - public String getDefaultTimeEntry() { - return LayerTransformer.getTimeRange(getDefaultTime()); - } + @Override + public String getDefaultTimeEntry() { + return LayerTransformer.getTimeRange(getDefaultTime()); + } /** * Create formatted time range string with range start at the latest time @@ -104,15 +105,15 @@ public abstract class PointDataLayer extends * @param milliOffset * @return */ - protected String getRangeSinceLatest( - long milliOffset) { - Date end = getTimes().last(); - long startTime = end.getTime() - milliOffset; - Date start = new Date(startTime); - String startStr = LayerTransformer.format(start); - String endStr = LayerTransformer.format(end); - return startStr + "/" + endStr; - } + protected String getRangeSinceLatest( + long milliOffset) { + Date end = getTimes().last(); + long startTime = end.getTime() - milliOffset; + Date start = new Date(startTime); + String startStr = LayerTransformer.format(start); + String endStr = LayerTransformer.format(end); + return startStr + "/" + endStr; + } /* * (non-Javadoc) diff --git a/edexOsgi/com.raytheon.uf.edex.ohd/res/spring/ohd-common.xml b/edexOsgi/com.raytheon.uf.edex.ohd/res/spring/ohd-common.xml index 9a725f5707..a7a92ed2ac 100644 --- a/edexOsgi/com.raytheon.uf.edex.ohd/res/spring/ohd-common.xml +++ b/edexOsgi/com.raytheon.uf.edex.ohd/res/spring/ohd-common.xml @@ -4,8 +4,10 @@ + + com.raytheon.uf.common.dataplugin.shef com.raytheon.edex.plugin.shef diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/ncgrib/NcgribLevel.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/ncgrib/NcgribLevel.java deleted file mode 100644 index cc3ab91bb0..0000000000 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.ncgrib/src/gov/noaa/nws/ncep/edex/util/ncgrib/NcgribLevel.java +++ /dev/null @@ -1,210 +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 gov.noaa.nws.ncep.edex.util.ncgrib; - -import javax.measure.unit.Unit; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; - -import org.apache.commons.lang.builder.HashCodeBuilder; -import org.hibernate.annotations.Type; - -import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject; -import com.raytheon.uf.common.serialization.ISerializableObject; - -/** - * Represents a grib level - *

- * Refer to the files ncgrib1levels.xml and ncgrib2levels.xml. This class maps to - * the levels defined in those files. - * - *

- * SOFTWARE HISTORY
- * Date         Ticket#     Engineer    Description
- * ------------ ----------  ----------- --------------------------
- * 9/26/07      381         bphillip    Initial creation
- * 
- * 
- * 
- */ -@Entity -@Table(name = "ncgrib_levels") -public class NcgribLevel extends PersistableDataObject implements - ISerializableObject { - - private static final long serialVersionUID = 1L; - - @Id - private Integer id; - - @Column - private Integer layerNumber; - - @Column - private Integer edition; - - /** The name of the level */ - @Column(length = 127) - private String name; - - /** The unit associated with the level */ - @Column - @Type(type = "gov.noaa.nws.ncep.edex.objects.hibernate.ncgrib.UnitType") - private Unit unit; - - /** The number of surfaces described by this level */ - @Column(name = "layers") - private int numLayers; - - public NcgribLevel() { - } - - /** - * Constructor - * - * @param name - * The name of the level - * @param unit - * The unit associated with the level - * @param numLayers - * The number of surfaces described by this level - */ - public NcgribLevel(String name, Unit unit, int numLayers) { - this.name = name; - this.unit = unit; - this.numLayers = numLayers; - } - - /** - * Gets the name - * - * @return the name - */ - public String getName() { - return name; - } - - /** - * Sets the name - * - * @param name - * The name - */ - public void setName(String name) { - this.name = name; - } - - /** - * Gets the unit - * - * @return The unit - */ - public Unit getUnit() { - return unit; - } - - /** - * Sets the unit - * - * @param unit - * The unit - */ - public void setUnit(Unit unit) { - this.unit = unit; - } - - /** - * Gets the number of layers - * - * @return the number of layers - */ - public int getNumLayers() { - return numLayers; - } - - /** - * Sets the number of layers - * - * @param numLayers - * the number of layers - */ - public void setNumLayers(int numLayers) { - this.numLayers = numLayers; - } - - public Integer getEdition() { - return edition; - } - - public void setEdition(Integer edition) { - this.edition = edition; - } - - public Integer getNumber() { - return layerNumber; - } - - public void setNumber(Integer number) { - this.layerNumber = number; - } - - public boolean equals(Object obj) { - if (obj instanceof NcgribLevel) { - - NcgribLevel level = (NcgribLevel) obj; - if (this.layerNumber == level.layerNumber - && this.edition == level.edition - && this.unit.equals(level.unit) - && this.name.equals(level.name) - && this.numLayers == level.numLayers) { - return true; - - } else { - return false; - } - } else { - return false; - } - } - - public int hashCode() { - return new HashCodeBuilder(17, 37).append(layerNumber).append(edition) - .append(name).append(unit).append(numLayers).toHashCode(); - } - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Integer getLayerNumber() { - return layerNumber; - } - - public void setLayerNumber(Integer layerNumber) { - this.layerNumber = layerNumber; - } -}