From c250bda12b216c110c6e276430f5ee0be8889fe7 Mon Sep 17 00:00:00 2001 From: Benjamin Phillippe Date: Mon, 18 Mar 2013 11:49:17 -0500 Subject: [PATCH] Issue #1802 Refactored DD transaction management Change-Id: Idec6238188f29f51f3738d2e40f95d6c562cfe39 Former-commit-id: b10b1150be0571e3a3b613e80692dc536e065e68 [formerly b10b1150be0571e3a3b613e80692dc536e065e68 [formerly 534777d96a45b275abd9cc26818b7df200974595]] Former-commit-id: af05feb5a7e324f04461a6363ae753dce9a79fd0 Former-commit-id: 4d1a8805ab9f2219c6418680c2c62d29bc469bcc --- cots/org.apache.camel/.classpath | 1 + cots/org.apache.camel/META-INF/MANIFEST.MF | 7 +- cots/org.apache.camel/build.properties | 3 +- cots/org.apache.camel/camel-servlet-2.4.0.jar | Bin 0 -> 19364 bytes cots/org.springframework/.classpath | 1 + cots/org.springframework/META-INF/MANIFEST.MF | 11 +- cots/org.springframework/build.properties | 3 +- cots/org.springframework/spring-web.jar | Bin 0 -> 194577 bytes deltaScripts/13.4.1/ebxmlSchemaChange.sh | 127 + deltaScripts/13.4.1/ebxmlSchemaDefinition.sql | 3573 +++++++++++++++++ deltaScripts/13.4.1/tableNameUpdate.sql | 13 + .../hibernateConfig/ebxml/hibernate.cfg.xml | 79 - .../metadata/hibernate.cfg.xml | 2 +- edexOsgi/build.edex/esb/conf/spring/edex.xml | 2 +- .../opt/db/ddl/ebxml/createEbxml.sql | 6 +- .../notification/NotificationRecord.java | 10 +- .../META-INF/MANIFEST.MF | 4 +- .../ebxml/FactoryRegistryHandler.java | 67 +- .../registry/ebxml/RegistryTxManager.java | 36 - .../common/registry/ebxml/RegistryUtil.java | 15 +- .../registry/ebxml/SOAPRegistryManager.java | 58 +- .../uf/common/registry/ebxml/TxManager.java | 44 - .../handler/BaseRegistryObjectHandler.java | 8 +- .../META-INF/MANIFEST.MF | 4 +- ...f.common.serialization.ISerializableObject | 60 +- .../ebxml/regrep/xsd/rim/v4/ActionType.java | 6 +- .../regrep/xsd/rim/v4/AssociationType.java | 2 +- .../regrep/xsd/rim/v4/AuditableEventType.java | 6 +- .../regrep/xsd/rim/v4/BooleanValueType.java | 2 +- .../xsd/rim/v4/ClassificationNodeType.java | 2 +- .../xsd/rim/v4/ClassificationSchemeType.java | 4 +- .../regrep/xsd/rim/v4/ClassificationType.java | 2 +- .../xsd/rim/v4/CollectionValueType.java | 6 +- .../regrep/xsd/rim/v4/DateTimeValueType.java | 2 +- .../regrep/xsd/rim/v4/DeliveryInfoType.java | 8 +- .../regrep/xsd/rim/v4/DurationValueType.java | 4 +- .../regrep/xsd/rim/v4/EmailAddressType.java | 8 +- .../tc/ebxml/regrep/xsd/rim/v4/EntryType.java | 4 +- .../xsd/rim/v4/ExtensibleObjectType.java | 2 +- .../xsd/rim/v4/ExternalIdentifierType.java | 2 +- .../regrep/xsd/rim/v4/ExternalLinkType.java | 2 +- .../xsd/rim/v4/ExtrinsicObjectType.java | 13 +- .../regrep/xsd/rim/v4/FederationType.java | 2 +- .../regrep/xsd/rim/v4/FloatValueType.java | 2 +- .../regrep/xsd/rim/v4/IdentifiableType.java | 10 +- .../regrep/xsd/rim/v4/IntegerValueType.java | 2 +- .../xsd/rim/v4/InternationalStringType.java | 10 +- .../rim/v4/InternationalStringValueType.java | 2 +- .../xsd/rim/v4/LocalizedStringType.java | 8 +- .../tc/ebxml/regrep/xsd/rim/v4/MapType.java | 10 +- .../regrep/xsd/rim/v4/NotificationType.java | 6 +- .../regrep/xsd/rim/v4/ObjectRefListType.java | 11 +- .../regrep/xsd/rim/v4/ObjectRefType.java | 13 +- .../regrep/xsd/rim/v4/OrganizationType.java | 6 +- .../regrep/xsd/rim/v4/ParameterType.java | 8 +- .../tc/ebxml/regrep/xsd/rim/v4/PartyType.java | 4 + .../regrep/xsd/rim/v4/PersonNameType.java | 2 +- .../ebxml/regrep/xsd/rim/v4/PersonType.java | 2 +- .../regrep/xsd/rim/v4/PostalAddressType.java | 8 +- .../xsd/rim/v4/QueryDefinitionType.java | 6 +- .../xsd/rim/v4/QueryExpressionType.java | 8 +- .../tc/ebxml/regrep/xsd/rim/v4/QueryType.java | 2 +- .../xsd/rim/v4/RegistryObjectListType.java | 10 +- .../regrep/xsd/rim/v4/RegistryObjectType.java | 11 +- .../xsd/rim/v4/RegistryPackageType.java | 2 +- .../ebxml/regrep/xsd/rim/v4/RegistryType.java | 2 +- .../tc/ebxml/regrep/xsd/rim/v4/RoleType.java | 2 +- .../regrep/xsd/rim/v4/ServiceBindingType.java | 2 +- .../xsd/rim/v4/ServiceEndpointType.java | 2 +- .../xsd/rim/v4/ServiceInterfaceType.java | 4 +- .../ebxml/regrep/xsd/rim/v4/ServiceType.java | 6 +- .../regrep/xsd/rim/v4/SimpleLinkType.java | 8 +- .../tc/ebxml/regrep/xsd/rim/v4/SlotType.java | 6 +- .../regrep/xsd/rim/v4/SlotValueType.java | 4 +- .../xsd/rim/v4/StringQueryExpressionType.java | 4 +- .../regrep/xsd/rim/v4/StringValueType.java | 2 +- .../regrep/xsd/rim/v4/SubscriptionType.java | 6 +- .../xsd/rim/v4/TaxonomyElementType.java | 2 + .../xsd/rim/v4/TelephoneNumberType.java | 8 +- .../tc/ebxml/regrep/xsd/rim/v4/ValueType.java | 8 +- .../regrep/xsd/rim/v4/VersionInfoType.java | 42 +- .../regrep/xsd/rim/v4/VocabularyTermType.java | 4 +- .../xsd/rim/v4/VocabularyTermValueType.java | 2 +- .../regrep/xsd/rim/v4/WorkflowActionType.java | 2 +- .../xsd/rim/v4/XMLQueryExpressionType.java | 4 +- .../raytheon/uf/common/stats/StatsRecord.java | 6 +- .../uf/common/util/CollectionUtil.java | 27 + .../edex/auth/RemoteRequestRouteWrapper.java | 1 - .../com/raytheon/uf/edex/core/EDEXUtil.java | 1 + .../edex/database/dao/SessionManagedDao.java | 247 +- .../bandwidth/retrieval/RetrievalManager.java | 6 + .../META-INF/MANIFEST.MF | 4 +- .../res/spring/event-datadelivery-ingest.xml | 1 + .../res/spring/event-datadelivery.xml | 97 +- .../event/handler/AbstractHandler.java | 32 +- .../handler/DeleteNotificationHandler.java | 9 +- .../event/handler/GetNotificationHandler.java | 19 +- .../event/handler/NotificationHandler.java | 9 +- .../SubscriptionNotificationHandler.java | 7 +- .../event/notification/NotificationDao.java | 92 +- .../harvester/CrawlMetaDataHandler.java | 9 +- .../META-INF/MANIFEST.MF | 3 +- .../services/SubscriptionDeleteHandler.java | 26 +- .../verify/SubscriptionIntegrityVerifier.java | 6 +- .../uf/edex/event/EdexEventBusHandler.java | 79 +- .../uf/edex/event/handler/LogHandler.java | 9 +- .../META-INF/MANIFEST.MF | 13 +- .../res/scripts/RegistryIndices.sql | 7 +- .../res/spring/ebxml-common.xml | 29 - .../res/spring/ebxml-impl.xml | 18 +- .../res/spring/ebxml-notification.xml | 30 + .../res/spring/ebxml-querytypes.xml | 155 +- .../res/spring/ebxml-registry-dao.xml | 68 + .../res/spring/ebxml-thrift-client.xml | 6 +- .../res/spring/ebxml-web.xml | 25 +- .../res/spring/ebxml-xacml.xml | 12 +- .../res/spring/ebxml.xml | 71 +- .../acp/xacml/XACMLContextHandler.java | 52 +- .../acp/xacml/XACMLPolicyAdministrator.java | 92 +- .../acp/xacml/XACMLPolicyDecisionPoint.java | 9 + .../xacml/XACMLPolicyEnforcementPoint.java | 31 +- .../impl/AttributeDesignatorExpression.java | 14 +- .../engine/function/impl/MatchesRole.java | 9 +- .../policy/impl/IdReferenceEvaluator.java | 10 +- .../ebxml/audittrail/AuditTrailManager.java | 10 +- .../registry/ebxml/dao/AssociationDao.java | 82 +- .../ebxml/dao/AuditableEventTypeDao.java | 81 + .../ebxml/dao/ClassificationNodeDao.java | 78 +- .../ebxml/dao/ClassificationSchemeDao.java | 52 + .../ebxml/dao/ClassificationTypeDao.java | 51 + .../uf/edex/registry/ebxml/dao/DbInit.java | 243 +- .../ebxml/dao/ExtrinsicObjectDao.java | 52 + .../ebxml/dao/IdentifiableTypeDao.java | 122 + .../registry/ebxml/dao/OrganizationDao.java | 45 +- .../uf/edex/registry/ebxml/dao/PartyDao.java | 51 + .../uf/edex/registry/ebxml/dao/PersonDao.java | 78 +- .../edex/registry/ebxml/dao/RegistryDao.java | 522 --- .../registry/ebxml/dao/RegistryObjectDao.java | 74 + .../ebxml/dao/RegistryObjectTypeDao.java | 372 +- .../ebxml/dao/RegistryPackageDao.java | 52 + .../uf/edex/registry/ebxml/dao/RoleDao.java | 17 +- .../registry/ebxml/dao/SubscriptionDao.java | 51 + .../ebxml/dao/VersionInfoTypeDao.java | 159 - .../init/RegistryInitializedListener.java | 48 + .../services/cataloger/CatalogerImpl.java | 102 +- .../lifecycle/LifecycleManagerImpl.java | 309 +- .../NotificationListenerImpl.java | 49 +- .../RegistryNotificationManager.java | 267 ++ .../RegistrySubscriptionManager.java | 157 + .../services/query/QueryManagerImpl.java | 25 +- .../query/RegistryRequestInterceptor.java | 70 - .../RegistryRequestReturnInterceptor.java | 70 - .../query/types/AbstractEbxmlQuery.java | 20 +- .../query/types/CanonicalEbxmlQuery.java | 3 +- .../query/types/canonical/AdhocQuery.java | 48 +- .../query/types/canonical/BasicQuery.java | 43 +- .../ClassificationSchemeSelector.java | 13 +- .../query/types/canonical/ExportObject.java | 4 +- .../types/canonical/ExtrinsicObjectQuery.java | 22 +- .../canonical/FindAssociatedObjects.java | 24 +- .../types/canonical/FindAssociations.java | 105 +- .../types/canonical/GetAuditTrailById.java | 20 +- .../types/canonical/GetAuditTrailByLid.java | 22 +- .../GetAuditTrailByTimeInterval.java | 21 +- .../GetClassificationSchemesById.java | 15 +- .../types/canonical/GetNotification.java | 19 +- .../query/types/canonical/GetObjectById.java | 5 +- .../types/canonical/GetObjectsByLid.java | 10 +- .../GetRegistryPackagesByMemberId.java | 22 +- .../query/types/canonical/KeywordSearch.java | 58 +- .../canonical/RegistryPackageSelector.java | 12 +- .../services/util/RegistrySessionContext.java | 120 - .../services/util/RegistrySessionManager.java | 83 - .../validator/ValidatorTypeManager.java | 4 +- .../types/ClassificationTypeValidator.java | 121 +- .../types/VersionInfoTypeValidator.java | 101 - .../ebxml/util/EDEXRegistryManager.java | 102 +- .../registry/ebxml/util/EbxmlObjectUtil.java | 48 +- .../registry/ebxml/web/AddRegistryParty.java | 65 +- .../ebxml/web/DeleteRegistryParty.java | 51 +- .../ebxml/web/ModifyRegistryParty.java | 68 +- .../registry/ebxml/web/RegistryWebAdmin.java | 235 +- .../registry/ebxml/web/RegistryWebUtil.java | 82 +- ...st_DataDelivery_OrganizationRoleScheme.xml | 41 - .../META-INF/MANIFEST.MF | 3 +- .../res/spring/edex-process-stats.xml | 10 + .../res/spring/stats-common.xml | 22 +- .../res/spring/stats-graph-request.xml | 1 + .../uf/edex/stats/AggregateManager.java | 40 +- .../uf/edex/stats/dao/AggregateRecordDao.java | 82 +- .../raytheon/uf/edex/stats/dao/StatsDao.java | 69 +- .../edex/stats/handler/GraphDataHandler.java | 36 +- .../uf/edex/stats/handler/StatsHandler.java | 25 +- 193 files changed, 7623 insertions(+), 3376 deletions(-) create mode 100644 cots/org.apache.camel/camel-servlet-2.4.0.jar create mode 100644 cots/org.springframework/spring-web.jar create mode 100644 deltaScripts/13.4.1/ebxmlSchemaChange.sh create mode 100644 deltaScripts/13.4.1/ebxmlSchemaDefinition.sql create mode 100644 deltaScripts/13.4.1/tableNameUpdate.sql delete mode 100644 edexOsgi/build.edex/esb/conf/db/hibernateConfig/ebxml/hibernate.cfg.xml delete mode 100644 edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/RegistryTxManager.java delete mode 100644 edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/TxManager.java delete mode 100644 edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-common.xml create mode 100644 edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-notification.xml create mode 100644 edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-registry-dao.xml create mode 100644 edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/AuditableEventTypeDao.java create mode 100644 edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/ClassificationSchemeDao.java create mode 100644 edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/ClassificationTypeDao.java create mode 100644 edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/ExtrinsicObjectDao.java create mode 100644 edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/IdentifiableTypeDao.java create mode 100644 edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/PartyDao.java delete mode 100644 edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/RegistryDao.java create mode 100644 edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/RegistryObjectDao.java create mode 100644 edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/RegistryPackageDao.java create mode 100644 edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/SubscriptionDao.java delete mode 100644 edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/VersionInfoTypeDao.java create mode 100644 edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/init/RegistryInitializedListener.java create mode 100644 edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/notification/RegistryNotificationManager.java create mode 100644 edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/notification/RegistrySubscriptionManager.java delete mode 100644 edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/RegistryRequestInterceptor.java delete mode 100644 edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/RegistryRequestReturnInterceptor.java delete mode 100644 edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/util/RegistrySessionContext.java delete mode 100644 edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/util/RegistrySessionManager.java delete mode 100644 edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/validator/types/VersionInfoTypeValidator.java diff --git a/cots/org.apache.camel/.classpath b/cots/org.apache.camel/.classpath index 497632d4d0..41fe649069 100644 --- a/cots/org.apache.camel/.classpath +++ b/cots/org.apache.camel/.classpath @@ -1,5 +1,6 @@ + diff --git a/cots/org.apache.camel/META-INF/MANIFEST.MF b/cots/org.apache.camel/META-INF/MANIFEST.MF index 26f2fc5834..ca23e2dba7 100644 --- a/cots/org.apache.camel/META-INF/MANIFEST.MF +++ b/cots/org.apache.camel/META-INF/MANIFEST.MF @@ -12,8 +12,7 @@ Bundle-ClassPath: ., camel-groovy-2.4.0.jar, camel-http-2.4.0.jar, camel-jetty-2.4.0.jar, - camel-jms-2.4.0.jar - camel-jpa-2.4.0.jar, + camel-jms-2.4.0.jarcamel-jpa-2.4.0.jar, camel-jxpath-2.4.0.jar, camel-mina-2.4.0.jar, camel-msv-2.4.0.jar, @@ -27,7 +26,8 @@ Bundle-ClassPath: ., camel-stringtemplate-2.4.0.jar, camel-velocity-2.4.0.jar, camel-xmpp-2.4.0.jar, - camel-xstream-2.4.0.jar + camel-xstream-2.4.0.jar, + camel-servlet-2.4.0.jar Export-Package: org.apache.camel, org.apache.camel.bam, org.apache.camel.bam.model, @@ -60,6 +60,7 @@ Export-Package: org.apache.camel, org.apache.camel.component.ref, org.apache.camel.component.rmi, org.apache.camel.component.seda, + org.apache.camel.component.servlet, org.apache.camel.component.stream, org.apache.camel.component.stringtemplate, org.apache.camel.component.test, diff --git a/cots/org.apache.camel/build.properties b/cots/org.apache.camel/build.properties index 4fde9cfae8..cbda07d536 100644 --- a/cots/org.apache.camel/build.properties +++ b/cots/org.apache.camel/build.properties @@ -22,4 +22,5 @@ bin.includes = META-INF/,\ camel-velocity-2.4.0.jar,\ camel-xmpp-2.4.0.jar,\ camel-xstream-2.4.0.jar,\ - camel-jms-2.4.0.jar + camel-jms-2.4.0.jar,\ + camel-servlet-2.4.0.jar diff --git a/cots/org.apache.camel/camel-servlet-2.4.0.jar b/cots/org.apache.camel/camel-servlet-2.4.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..2ac9d85ce06990dab18ae982e7bb5d36a63471cc GIT binary patch literal 19364 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 + diff --git a/cots/org.springframework/META-INF/MANIFEST.MF b/cots/org.springframework/META-INF/MANIFEST.MF index f0ad9cc7a2..f990464daf 100644 --- a/cots/org.springframework/META-INF/MANIFEST.MF +++ b/cots/org.springframework/META-INF/MANIFEST.MF @@ -17,6 +17,7 @@ Bundle-ClassPath: antlr-2.7.6.jar, spring-jms.jar, spring-orm.jar, spring-tx.jar, + spring-web.jar, . Export-Package: org.aopalliance.aop, org.aopalliance.intercept, @@ -212,5 +213,13 @@ Export-Package: org.aopalliance.aop, org.springframework.util.comparator, org.springframework.util.xml, org.springframework.validation, - org.springframework.validation.support + org.springframework.validation.support, + org.springframework.web, + org.springframework.web.context, + org.springframework.web.context.request, + org.springframework.web.context.support, + org.springframework.web.filter, + org.springframework.web.jsf, + org.springframework.web.jsf.el, + org.springframework.web.util Require-Bundle: org.apache.commons.logging;bundle-version="1.1.1" diff --git a/cots/org.springframework/build.properties b/cots/org.springframework/build.properties index 2e3f57f824..c47f89549a 100644 --- a/cots/org.springframework/build.properties +++ b/cots/org.springframework/build.properties @@ -12,4 +12,5 @@ bin.includes = META-INF/,\ spring-jms.jar,\ spring-orm.jar,\ spring-tx.jar,\ - com.springsource.org.aopalliance-1.0.0.jar + com.springsource.org.aopalliance-1.0.0.jar,\ + spring-web.jar diff --git a/cots/org.springframework/spring-web.jar b/cots/org.springframework/spring-web.jar new file mode 100644 index 0000000000000000000000000000000000000000..432e8f036895ed1a75150abedf371833222d0690 GIT binary patch literal 194577 zcmb^YWmF_uk_8ImE`__hySux)7w&F}7EqA5d*SX-xKp?n?hc8&LjeWv-sxW7*K^C!6qr{mTav3<^w1N>hwUPFb2oNlaNzT1rEc zSxNeR91N@`Q^9$i_fyan_!~)Rc1w`bN?fM_b2D(J1$@rm)k0~yif+Q6oE!M;rgShYV)onArE$QutKPB0F4>Q2>R z&_iWM^6$odx+sdhG7M^@v^u5rnkyo9sl|m&k!S0FlZHUyn{`hEGQTz<6@1AtS4J0= zn+ZB$+rb|Yw7obgW~`@f5C_X3vTQe)iLKC8*39mj~57I`aK=a4>;F{k{Lra}0~9 zM$OWMby@u6&IwsF0{G$9X8hJ4Y?K+wG&(DD{7q;B!kz?teT{%KB@pOy!mD;NiliWK>KvcitsCR`fZ`1VVYR{_eSO|2;8r3?>vmh6LtRP zW6Bnb-nmjJt;Xha^s5@H{@WcknG z>)|nST||I5>aH)Cbngnkx)h>9^ZMPZdur99+$@p=tt3EVC(Ls9V!u2Gm@9A&quhGw zm@LIS?YUp|c^xvEr=*#G^#D%he}45e(T-@fu2RPz z5EHnIgqsARW;740q22(s$ffG z_skF2IuP@IPU{YxV2@sRziXnVbFI-VAPSVr5q=llt+U0n0j|07h88^OWCeeHy@EM+ zehgo8X1FHsq7w2xV~!_~E~f>YKnu|U@s&ciPzf0dHzoT&kgXXFfZvB38!4tdm3A!A??^~^!th}sUkCht zXcM^Tx{3hD6N)olhu-xkD-+&B)WvAv939ZV9jeAi| z9fOMm(okVePP`T5=L{Y~>~iBu{8{c*6D$t>fCd?`t+KCg3qC3g`GBnv5(IxIdfAsQ z6-rZu#Y#V!f%`MD-=Dbo@nhfoeYA<=B);&ORKUtcx&owLPk(MJxG#xJiJ)7$T96eQ zLw0L?tX8O~u2xrhH(bN{D}|Njpq|I1LQKLDKFtXcm3 z2+V(uaCdRDb+Wc{Gj+7|c6PJ>7YWM0U=sZs2{%heXOBNH{zjDYe-kw~^)$C}{u>0k z{|&*$!^6ea$;;W^((P|x{#QlpOaX2#=6{30_`fOgPXu>Q7Z+zYkAFd8{L6Y${2!3K z-TwvPuN#8U+1L#KS;Y-x_Vl=|0@dBU;g_41?B&} zfPdA6Lx6q_ns=MiK(rg~gK<2WzIDm345CzD={%dS&w? zqybhH<|&QlO4A{s`Im~LXBi*=%SnqyId0K7k@K9_o2{dOt$4qy&W~SLBJc3|1bKtk zRQsBfgQ{N*As_ovx-}a3muOyX1IDY}g?l>mTUz-C zMn`WOL5Vkn-pXRjs>7K|)-h&Q!*VKEMiZlD9BFh8ESpF1aoQ1AIy1b@f>rsJ$0@E$ zvIf8$g?Pmrbi8=-2bIj06CzF3tm6#TPbc0D;$n9Rw$ZzL=P54ncp7O5SvfJLO1QOj zBfA!ZS!{?1C`f!x%toV~r8!w%v3jmkt}10lY-fOMy*&cf^QRM(wOkhta+Tcu8N*Lo zvsgec8g7dUi!IrNn-CYrQ=Mzk!u}OD752N5!l4G)3H?a0gK{<6nGnX3y8|ag9O)^9 zWw)4fGJ|i^W3qdpP>x>OEVMLj0~w`>`SU{Q=`hm4hF%zwy5c9%k+0<2K7=et)G|swd zwkvpv-05bi!sK0eGy<}-F}sabQCb32KmE>)i>0Gmtf!*nH3$qxZeEaq5#ZH9!rUPK zqhf113_9OA*G;U6+KiTRejz7oso_HR#slQkVV^liJK_ zo7Geka@DpO3^E&6Xw^<10t^;n%66iw!(jqWTPaU6T9|ldbjUzt<<@cAYdb+IQ9Xhp zKKCK!n164I3}A$R#4TR4e3y<;HDOIO&=vrpVh2El#D}qT$CbdBb`c#=TO}N50}>|; zQ+TTcK&xzpdrHK)cVv*TDpnmwMRngST6fm*3Ne|_a8hqHT1g)-l&IJ}a|IUdwziFT zJ{CJ+d%$ddpR5LM?^bet1R(zyA;D}4hxJi*W`Tn1X)KM6u}Ob5bS<@Ef6z3XzXq?h zZwp4nIyXFIv(Y2B)-@+ab%CDW;0I60Zvmb7nACBVP57-*wjz>Od7tzJFRl-~78~WE z-xtgvPh&LtoRDpPKk{f_Rv8cB1nxdlych3HZ!%fHig%2Yf_ zWRFc(9^{O#Xt*Xp=FpA@gqPk9S=^eWPaCimF3bA*IlqBSMS1X0l-&u-^xQxi_>0YF zseDqjQ`Wbz&b_M-5#ndR3ueqapApM@qpE4z2nQ;Ib^*_;tXA=K{4{X?`51rWmC2?l zyXM|+6+0n2-3x<~s4Vd6>fgEQwKL4rrr}=@lC&^2e|*W8ZgTW??wL#Im zXM8Jaq}H)U>fngk=Odo33WA?8ud~qPF?RjPECZ z_ewxLg0xmylj>`wUy}1X!f?Y!W5zJ_hNCiS*!`A)_gbJ1Lb4fBn`GxAFoApOyEC#6f)w1vJq7x@{ODLkb=3 z?jaJDxaB6VKtI(Uh@}``cEGDGKw1u}+dUKB*y(V2sM_t3XggX8ewBtBfhfb@ctl@V zbm0i)SPm8lF(q*-CQSPMuG{~U;u~XuDV`IC5Yi+&HaA&L6o4}Y)aMpGhknd{P}~tP zR&1dyevX1)N5R$_!qppaW^6j! z$NgAl+tL}ja9I3Uh)c(luur1k1qp1_jCTxE7^v{KpPf0GKCj=TUEHnI%Sxe=$OVMR z0H|DJyK@lEkOH1zjL$pxHnjSWM22b^Y|^{GnChq$$8P!Eb8xVrBF{7~L7oA^Og#FM6{?U0j+rFal1@gi1AzH|;p)s@;RjVPs z2+@|<>Q{GY=tsA7^c>?+ZEE*|%rs=3_>lcd$THmn4Aqt-&(>bzmn_(OqL+Pyo>=e9 z$g5qX=*Y!ySTHaP^nXMN z|1+cD{f`)h6yQ%nYxz$ik*Z_sjiH4bSgOQ97Q@tXP7lSH1S6|!w1zMTp|4~>6(ntu zNzLO}A3KgvYI+vL7nmecEbL9KMB_pGLgs!IaO9Kz+VvE0 zwLksi%Nt&=l|SB)IH9Ji?9gvDP7wI7QR#ZIDRh7fI7v7KK$bbKoR@xigq)XIMkoZW zA~%`k?v_jwbDx)t9jEBNwh zp*@Cv*9f?z*ZBHKtNV@NBvt+hK0y46@#N6v=z0`B(H+w;E3F|VrR0SQxC5O@H&2H! zGD@fG)?SFH{(UT&BSe|ypTDVLILuH#lT&AOR`1kEXj;lo#@~hmFvmrI{(aC8-X$?bd2deA?p+`Pf7OM?J zrtSh4zQM_Uj#Z2fBcD=Zc6t^Yn8rJpVvh(Xw7;*(gfbyeH6)+5PDYvQPz8B?8!Qgt z5?)D2Ef^8o#jJVT8q1~?04hA9lMJ(<5*&tdNvDssg|k*K1nJfC*^Fe-xFkZM$^7vr)TEGn^wvF`TAm*z(n*k@=%CmhYG@)I2`FKqa zalE6~sq4KGB-|Y^A zlD;w8kJ}+H9l;%n(t2XQLkR$kkp>a?J66-ae41cw^jGoE;*M%)Q>m?8?15oK-b8!e z1|fe~R;bV!N&%W5j1&zy8ZFQ+ItB#V>;6^PQ-Hi{9}XS5xTqBBDKdXxGWABk^$M0# zUyZ*VF<5IsR#8Z9$8Af;E$4#X0j-P+cA;-V@D?8AI2*rR>G_V)cpvH2T*X0wz+ zgj4zdxW{391)oqc=OsGk;*8hPCsA}j`l$&=P#*;mOj5FPaxl(QhJz{c0 zpuIG@D$gIZ*_HC@Lh|DJ$uFWad{lrf7~KDBXCz7KFlpe(r}zGD=E!xq9nz&;uX9SD z?avhg_JvbID`5h(uQ^|ky=EIIU)6KYgHwEFB#-clr{_MJ{hBRtZX)z;`8K4D|iDyoO_p)^|ts%Cau|~xdv!Q zkx*Z<-Gc@^i(0lFRXl zq02Kv3;5`Jxot>|_xp2jfYR*NQyaTij?`Hd2aWDGgEjakv28|BSiKQw={M7N1U9aVc?7|hWQRd%hM`V zVEi3Wp~K7sI_Q(cSCXF_3~i$3RJwOuLGd_kP_Rm;{}_W+YNG!34Ed%u%z>zm@cP+* zh2v;4_ex+poA2)I=_wD4IM_OINXgu(#6=()X{j*+6nArpe`O5pdZiPT-8Dt9gqcWx zkzBoPeiV+uy{$2KC2ynHAl^PBR1mOXrEE>93c*3TaXSbio4rS&lBg{)Y!^89F5bc+ zlEMFOjd&z#W4SkGMb4`(JfJ->FLa68w(ZLFYAh-s-DMksh)#{DkW+ja?S28J zonBGb%&`kpIYGZ`ii_je;&y|-wCKR3ZZ0pfADn~Fo@&zfy}g6jFSA&s@T{4;YvKoT z+Jm8=bG9U~IU(+c6wgkGm=aaI5C1kQcmA3GW5;E} zN;kgbDMjKyw`Eid)RNtL5t3a4y&vnO-8aLOi|P66nN6b8Phts^yg894mO>4h zEn)IU`)j4*&rh7)*GN2f4-u@P*zt{BpQ}7l5>i-|REJ$A8BNr~@}KCVI4SqSXQQ~2 z-Y)d5B>L}Ityl?$5xXohDkwkDw!P#4Dcddr&imTP0wBzd@^(aeq@U>>77l1Y(_-@E z@&bF3B5k%%EG)yqTtFHrFV3(aHYFplKJHPk<%m;cYg>q4BzImhf@3 zn+^QP-Y8=ihyFIV-kFPf+N$=!Xx#_xrz9IuwGgfm=CK)fBcM8uTHA3(00P@S7Of;R znJc()J57|lrfTt?WTbOpG|&mr#$m4MaaP$meaVY|tchdI9;56tP3dVBPf>@ew||)+p-_Z>SbK@*YJ=eyMBgkQshp zFh^*p^KWa;n%p8&hB;n9RB0X!W)~_(Mq!E+eohJ)r#?QLLK<{K$!JF?Wty##>j_na zIQqkJFXRFoJF(i$Vq`e;FH1=|ND|`ql3&-jo1sr_2aoUIe_lhv(2i()NHDPBKU~JY zzlQ(UysE6FySuHa6Pt#;rGur1vyQBwa>f#S~tF%@hFB>GEmO4fcfy&w`;LP z*258O3#ypcdaTL>6}YM5e76v5jc=i6fr?@{4P7MA`&2GurAlZ%1$Ql|z&!2wa1C_E zKKfs*OiOqqR=+a_kV%}PehUb9F+5($0ZjT~ks7o!4mD2s7RPT~flCXXmim!r@}}%g zd0cjT*jjJanjd2A< zGFQ}db@kY)LraVu@Y)n&m1EIHsGO*_!4{PsyQl1N<2g%ZS79e;9F`YhXy)>C=bBnT zR)V!qpdP5mC7r^S!yAk_P5(j_7Gq;#)lrje#hxweYR>M2ja=JB^ zX!Q45t;@9>N%C4nmT#UmtdKm?fRgs)s7l84*#poOD4($n_AA3C<)m3FyQEr>CqI3rkj=9A~xJmTa^{HMZ{%RDp+U;j?P^2UJaBnyEi!I+&SX zPJ0i>QG{(@b+Wms{AEvEUJ}9jv2a2N3+SoIxh`cl9Z)4+efvJO!T>5*jWd%vR-I-g zw8}N#da8|`>~(aDm+}s&D5_9w3I`sYX1LgbDM1uS98e_Q!arlRQpubca@1%DsRnj{ zF-NTQAaj56@*_)+!sr6WMcRt9)8fK1rXh8P�0h>uVM3kB3{UuDcT>vKV~vfq1a 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¥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 NlaJ80gG=;^{{yXRMFRi; literal 0 HcmV?d00001 diff --git a/deltaScripts/13.4.1/ebxmlSchemaChange.sh b/deltaScripts/13.4.1/ebxmlSchemaChange.sh new file mode 100644 index 0000000000..7a02c24b79 --- /dev/null +++ b/deltaScripts/13.4.1/ebxmlSchemaChange.sh @@ -0,0 +1,127 @@ +#!/bin/bash + +DUMP_FILE="/tmp/dump.sql" +SCHEMA_DEFINITION_SCRIPT="ebxmlSchemaDefinition.sql" +TABLE_NAME_UPDATE_SCRIPT="tableNameUpdate.sql" + +# ensure that the schema definition script is present +if [ ! -f ${SCHEMA_DEFINITION_SCRIPT} ]; then + echo "ERROR: the required sql script - ${SCHEMA_DEFINITION_SCRIPT} was not found." + echo "FATAL: the update has failed!" + exit 1 +fi + +# ensure that the table name update script is present +if [ ! -f ${TABLE_NAME_UPDATE_SCRIPT} ]; then + echo "ERROR: the required sql script - ${TABLE_NAME_UPDATE_SCRIPT} was not found." + echo "FATAL: the update has failed!" + exit 1 +fi + +echo -n "Modifying table names to conform to new schema..." +psql -U awips -d ebxml -f $TABLE_NAME_UPDATE_SCRIPT > /dev/null +echo "Done!" + +echo -n "Dumping existing ebxml database contents..." +pg_dump --port 5432 --username "awips" --role "awips" --no-password --format plain --data-only --inserts --column-inserts --file $DUMP_FILE "ebxml" +if [ $? -ne 0 ]; then + echo "FATAL: Failed to dump existing database contents!" + echo "FATAL: the update has failed!" + exit 1 +fi +echo "Done!" + +echo -n "Setting search path in dump file to be ebxml..." +sed -i 's/SET search_path =.*/SET search_path TO ebxml, pg_catalog;/g' $DUMP_FILE +if [ $? -ne 0 ]; then + echo "FATAL: Failed to reset search path in dump file!" + echo "FATAL: the update has failed!" + exit 1 +fi +echo "Done!" + +echo -n "Removing references to versioninfo table..." +sed -i "s/INSERT INTO versioninfo/--INSERT INTO versioninfo/g" $DUMP_FILE +if [ $? -ne 0 ]; then + echo "FATAL: Removing references to versioninfo table has failed!" + echo "FATAL: the update has failed!" + exit 1 +fi +echo "Done!" + +echo -n "Updating column names for version info columns..." +sed -i "s/versioninfo_versionname/versionname/g" $DUMP_FILE +if [ $? -ne 0 ]; then + echo "FATAL: Updating version info column names has failed!" + echo "FATAL: the update has failed!" + exit 1 +fi + +sed -i "s/versioninfo_userversionname/userversionname/g" $DUMP_FILE +if [ $? -ne 0 ]; then + echo "FATAL: Updating version info column names has failed!" + echo "FATAL: the update has failed!" + exit 1 +fi +echo "Done!" + +#Redirect standard out to null, but keep standard error for the following psql commands +echo -n "Adding tables to ebxml schema..." +psql -U awips -d metadata -f $SCHEMA_DEFINITION_SCRIPT > /dev/null +if [ $? -ne 0 ]; then + echo "FATAL: Exporting new ebxml schema has failed!" + echo "FATAL: the update has failed!" + exit 1 +fi +echo "Done!" + +echo -n "Getting current hibernate_sequence value to update new sequences..." +sequenceValue=$(psql -t -U awips -d ebxml -c "SELECT nextval('hibernate_sequence');") +echo "Done!" + +echo "Current hibernate_sequence value is: $sequenceValue" + +for seq in 'action' 'deliveryinfo' 'emailaddress' 'internationalstring' 'localizedstring' 'map' 'objectreflist' 'parameter' 'postaladdress' 'queryexpression' 'registryobjectlist' 'simplelink' 'slot' 'telephonenumber' 'value' +do + echo -n "Updating sequence ebxml.${seq}_sequence with value $sequenceValue to avoid key violations.." + psql -U awips -d metadata -c "SELECT pg_catalog.setval('ebxml.${seq}_sequence', $sequenceValue, true);" > /dev/null + if [ $? -ne 0 ]; then + echo "FATAL: Updating sequence ${seq} has failed!" + echo "FATAL: The update has failed!" + exit 1 + fi + echo "Done!" +done + + +echo -n "Removing references to hibernate_sequence..." +sed -i "s/SELECT pg_catalog.setval('hibernate_sequence'/--SELECT pg_catalog.setval('hibernate_sequence'/g" $DUMP_FILE +if [ $? -ne 0 ]; then + echo "FATAL: Removal of references to hibernate_sequence has failed!" + echo "FATAL: the update has failed!" + exit 1 +fi +echo "Done!" + +echo -n "Populating ebxml schema with existing database contents..." +psql -U awips -d metadata -f $DUMP_FILE > /dev/null +if [ $? -ne 0 ]; then + echo "FATAL: Populating ebxml schema with existing data has failed!" + echo "FATAL: the update has failed!" + exit 1 +fi +echo "Done!" + +echo -n "Removing dump file: $DUMP_FILE..." +rm -f $DUMP_FILE +if [ $? -ne 0 ]; then + echo "Warn: File $DUMP_FILE has not been removed. Clean up manually. Update still successful." + +else + echo "Done!" +fi + + +echo "Ebxml database schema update successful!" +exit 0 + diff --git a/deltaScripts/13.4.1/ebxmlSchemaDefinition.sql b/deltaScripts/13.4.1/ebxmlSchemaDefinition.sql new file mode 100644 index 0000000000..138677f342 --- /dev/null +++ b/deltaScripts/13.4.1/ebxmlSchemaDefinition.sql @@ -0,0 +1,3573 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 9.2.3 +-- Dumped by pg_dump version 9.2.3 +-- Started on 2013-03-22 13:36:06 CDT + +SET statement_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SET check_function_bodies = false; +SET client_min_messages = warning; + +-- +-- TOC entry 11 (class 2615 OID 91156) +-- Name: ebxml; Type: SCHEMA; Schema: -; Owner: awips +-- + +DROP SCHEMA IF EXISTS ebxml CASCADE; +CREATE SCHEMA ebxml; + + +ALTER SCHEMA ebxml OWNER TO awips; + +SET search_path = ebxml, pg_catalog; + +SET default_tablespace = ''; + +SET default_with_oids = false; + +-- +-- TOC entry 346 (class 1259 OID 103385) +-- Name: action; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE action ( + key integer NOT NULL, + eventtype character varying(255), + affectedobjectrefs_key integer, + affectedobjects_key integer +); + + +ALTER TABLE ebxml.action OWNER TO awips; + +-- +-- TOC entry 424 (class 1259 OID 104509) +-- Name: action_sequence; Type: SEQUENCE; Schema: ebxml; Owner: awips +-- + +CREATE SEQUENCE action_sequence + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE ebxml.action_sequence OWNER TO awips; + +-- +-- TOC entry 347 (class 1259 OID 103390) +-- Name: action_slot; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE action_slot ( + action_key integer NOT NULL, + child_slot_key integer NOT NULL +); + + +ALTER TABLE ebxml.action_slot OWNER TO awips; + +-- +-- TOC entry 348 (class 1259 OID 103395) +-- Name: association; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE association ( + id character varying(255) NOT NULL, + lid character varying(255), + objecttype character varying(255), + owner character varying(255), + status character varying(255), + userversionname character varying(255), + versionname character varying(255), + description_key integer, + name_key integer, + sourceobject character varying(255), + targetobject character varying(255), + type character varying(255) +); + + +ALTER TABLE ebxml.association OWNER TO awips; + +-- +-- TOC entry 349 (class 1259 OID 103403) +-- Name: auditableevent; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE auditableevent ( + id character varying(255) NOT NULL, + lid character varying(255), + objecttype character varying(255), + owner character varying(255), + status character varying(255), + userversionname character varying(255), + versionname character varying(255), + description_key integer, + name_key integer, + requestid character varying(255), + "timestamp" timestamp without time zone, + username character varying(255) +); + + +ALTER TABLE ebxml.auditableevent OWNER TO awips; + +-- +-- TOC entry 350 (class 1259 OID 103411) +-- Name: auditableevent_action; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE auditableevent_action ( + auditableevent_id character varying(255) NOT NULL, + action_key integer NOT NULL +); + + +ALTER TABLE ebxml.auditableevent_action OWNER TO awips; + +-- +-- TOC entry 351 (class 1259 OID 103416) +-- Name: classification; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE classification ( + id character varying(255) NOT NULL, + lid character varying(255), + objecttype character varying(255), + owner character varying(255), + status character varying(255), + userversionname character varying(255), + versionname character varying(255), + description_key integer, + name_key integer, + classificationnode character varying(255), + classificationscheme character varying(255), + classifiedobject character varying(255), + noderepresentation character varying(255) +); + + +ALTER TABLE ebxml.classification OWNER TO awips; + +-- +-- TOC entry 352 (class 1259 OID 103424) +-- Name: classificationnode; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE classificationnode ( + id character varying(255) NOT NULL, + lid character varying(255), + objecttype character varying(255), + owner character varying(255), + status character varying(255), + userversionname character varying(255), + versionname character varying(255), + description_key integer, + name_key integer, + code character varying(255), + parent character varying(255), + path character varying(255) +); + + +ALTER TABLE ebxml.classificationnode OWNER TO awips; + +-- +-- TOC entry 353 (class 1259 OID 103432) +-- Name: classificationscheme; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE classificationscheme ( + id character varying(255) NOT NULL, + lid character varying(255), + objecttype character varying(255), + owner character varying(255), + status character varying(255), + userversionname character varying(255), + versionname character varying(255), + description_key integer, + name_key integer, + isinternal boolean NOT NULL, + nodetype character varying(255) +); + + +ALTER TABLE ebxml.classificationscheme OWNER TO awips; + +-- +-- TOC entry 354 (class 1259 OID 103440) +-- Name: deliveryinfo; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE deliveryinfo ( + key integer NOT NULL, + notificationoption character varying(255) +); + + +ALTER TABLE ebxml.deliveryinfo OWNER TO awips; + +-- +-- TOC entry 425 (class 1259 OID 104511) +-- Name: deliveryinfo_sequence; Type: SEQUENCE; Schema: ebxml; Owner: awips +-- + +CREATE SEQUENCE deliveryinfo_sequence + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE ebxml.deliveryinfo_sequence OWNER TO awips; + +-- +-- TOC entry 355 (class 1259 OID 103445) +-- Name: deliveryinfo_slot; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE deliveryinfo_slot ( + deliveryinfo_key integer NOT NULL, + child_slot_key integer NOT NULL +); + + +ALTER TABLE ebxml.deliveryinfo_slot OWNER TO awips; + +-- +-- TOC entry 356 (class 1259 OID 103450) +-- Name: emailaddress; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE emailaddress ( + key integer NOT NULL, + address character varying(255), + type character varying(255) +); + + +ALTER TABLE ebxml.emailaddress OWNER TO awips; + +-- +-- TOC entry 426 (class 1259 OID 104513) +-- Name: emailaddress_sequence; Type: SEQUENCE; Schema: ebxml; Owner: awips +-- + +CREATE SEQUENCE emailaddress_sequence + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE ebxml.emailaddress_sequence OWNER TO awips; + +-- +-- TOC entry 357 (class 1259 OID 103458) +-- Name: emailaddress_slot; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE emailaddress_slot ( + emailaddress_key integer NOT NULL, + child_slot_key integer NOT NULL +); + + +ALTER TABLE ebxml.emailaddress_slot OWNER TO awips; + +-- +-- TOC entry 358 (class 1259 OID 103463) +-- Name: entry; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE entry ( + entryvalue_key integer NOT NULL, + entrykey_key integer NOT NULL +); + + +ALTER TABLE ebxml.entry OWNER TO awips; + +-- +-- TOC entry 359 (class 1259 OID 103472) +-- Name: externalidentifier; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE externalidentifier ( + id character varying(255) NOT NULL, + lid character varying(255), + objecttype character varying(255), + owner character varying(255), + status character varying(255), + userversionname character varying(255), + versionname character varying(255), + description_key integer, + name_key integer, + identificationscheme character varying(255), + registryobject character varying(255), + value character varying(255) +); + + +ALTER TABLE ebxml.externalidentifier OWNER TO awips; + +-- +-- TOC entry 360 (class 1259 OID 103480) +-- Name: externallink; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE externallink ( + id character varying(255) NOT NULL, + lid character varying(255), + objecttype character varying(255), + owner character varying(255), + status character varying(255), + userversionname character varying(255), + versionname character varying(255), + description_key integer, + name_key integer, + registryobject character varying(255), + externalref_key integer +); + + +ALTER TABLE ebxml.externallink OWNER TO awips; + +-- +-- TOC entry 361 (class 1259 OID 103488) +-- Name: extrinsicobject; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE extrinsicobject ( + id character varying(255) NOT NULL, + lid character varying(255), + objecttype character varying(255), + owner character varying(255), + status character varying(255), + userversionname character varying(255), + versionname character varying(255), + description_key integer, + name_key integer, + contentuserversionname character varying(255), + contentversionname character varying(255), + mimetype character varying(255), + repositoryitem bytea, + repositoryitemref_key integer +); + + +ALTER TABLE ebxml.extrinsicobject OWNER TO awips; + +-- +-- TOC entry 362 (class 1259 OID 103496) +-- Name: federation; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE federation ( + id character varying(255) NOT NULL, + lid character varying(255), + objecttype character varying(255), + owner character varying(255), + status character varying(255), + userversionname character varying(255), + versionname character varying(255), + description_key integer, + name_key integer +); + + +ALTER TABLE ebxml.federation OWNER TO awips; + +-- +-- TOC entry 363 (class 1259 OID 103504) +-- Name: internationalstring; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE internationalstring ( + key integer NOT NULL +); + + +ALTER TABLE ebxml.internationalstring OWNER TO awips; + +-- +-- TOC entry 364 (class 1259 OID 103509) +-- Name: internationalstring_localizedstring; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE internationalstring_localizedstring ( + internationalstring_key integer NOT NULL, + localizedstring_key integer NOT NULL +); + + +ALTER TABLE ebxml.internationalstring_localizedstring OWNER TO awips; + +-- +-- TOC entry 427 (class 1259 OID 104515) +-- Name: internationalstring_sequence; Type: SEQUENCE; Schema: ebxml; Owner: awips +-- + +CREATE SEQUENCE internationalstring_sequence + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE ebxml.internationalstring_sequence OWNER TO awips; + +-- +-- TOC entry 365 (class 1259 OID 103514) +-- Name: localizedstring; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE localizedstring ( + key integer NOT NULL, + lang character varying(255), + value character varying(1024) +); + + +ALTER TABLE ebxml.localizedstring OWNER TO awips; + +-- +-- TOC entry 428 (class 1259 OID 104517) +-- Name: localizedstring_sequence; Type: SEQUENCE; Schema: ebxml; Owner: awips +-- + +CREATE SEQUENCE localizedstring_sequence + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE ebxml.localizedstring_sequence OWNER TO awips; + +-- +-- TOC entry 366 (class 1259 OID 103522) +-- Name: map; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE map ( + key integer NOT NULL +); + + +ALTER TABLE ebxml.map OWNER TO awips; + +-- +-- TOC entry 367 (class 1259 OID 103527) +-- Name: map_entry; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE map_entry ( + map_key integer NOT NULL, + entry_entryvalue_key integer NOT NULL, + entry_entrykey_key integer NOT NULL +); + + +ALTER TABLE ebxml.map_entry OWNER TO awips; + +-- +-- TOC entry 429 (class 1259 OID 104519) +-- Name: map_sequence; Type: SEQUENCE; Schema: ebxml; Owner: awips +-- + +CREATE SEQUENCE map_sequence + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE ebxml.map_sequence OWNER TO awips; + +-- +-- TOC entry 368 (class 1259 OID 103530) +-- Name: notification; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE notification ( + id character varying(255) NOT NULL, + lid character varying(255), + objecttype character varying(255), + owner character varying(255), + status character varying(255), + userversionname character varying(255), + versionname character varying(255), + description_key integer, + name_key integer, + subscription character varying(255) +); + + +ALTER TABLE ebxml.notification OWNER TO awips; + +-- +-- TOC entry 369 (class 1259 OID 103538) +-- Name: notification_auditableevent; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE notification_auditableevent ( + notification_id character varying(255) NOT NULL, + event_id character varying(255) NOT NULL +); + + +ALTER TABLE ebxml.notification_auditableevent OWNER TO awips; + +-- +-- TOC entry 370 (class 1259 OID 103544) +-- Name: objectref; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE objectref ( + id character varying(255) NOT NULL +); + + +ALTER TABLE ebxml.objectref OWNER TO awips; + +-- +-- TOC entry 373 (class 1259 OID 103557) +-- Name: objectref_slot; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE objectref_slot ( + objectref_id character varying(255) NOT NULL, + child_slot_key integer NOT NULL +); + + +ALTER TABLE ebxml.objectref_slot OWNER TO awips; + +-- +-- TOC entry 371 (class 1259 OID 103549) +-- Name: objectreflist; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE objectreflist ( + key integer NOT NULL +); + + +ALTER TABLE ebxml.objectreflist OWNER TO awips; + +-- +-- TOC entry 372 (class 1259 OID 103554) +-- Name: objectreflist_objectref; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE objectreflist_objectref ( + objectreflist_key integer NOT NULL, + objectref_id character varying(255) NOT NULL +); + + +ALTER TABLE ebxml.objectreflist_objectref OWNER TO awips; + +-- +-- TOC entry 430 (class 1259 OID 104521) +-- Name: objectreflist_sequence; Type: SEQUENCE; Schema: ebxml; Owner: awips +-- + +CREATE SEQUENCE objectreflist_sequence + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE ebxml.objectreflist_sequence OWNER TO awips; + +-- +-- TOC entry 374 (class 1259 OID 103562) +-- Name: organization; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE organization ( + id character varying(255) NOT NULL, + lid character varying(255), + objecttype character varying(255), + owner character varying(255), + status character varying(255), + userversionname character varying(255), + versionname character varying(255), + description_key integer, + name_key integer, + primarycontact character varying(255) +); + + +ALTER TABLE ebxml.organization OWNER TO awips; + +-- +-- TOC entry 375 (class 1259 OID 103570) +-- Name: organization_emailaddress; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE organization_emailaddress ( + organization_id character varying(255) NOT NULL, + emailaddress_key integer NOT NULL +); + + +ALTER TABLE ebxml.organization_emailaddress OWNER TO awips; + +-- +-- TOC entry 376 (class 1259 OID 103573) +-- Name: organization_organization; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE organization_organization ( + organization_id character varying(255) NOT NULL +); + + +ALTER TABLE ebxml.organization_organization OWNER TO awips; + +-- +-- TOC entry 377 (class 1259 OID 103576) +-- Name: organization_postaladdress; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE organization_postaladdress ( + organization_id character varying(255) NOT NULL, + postaladdress_key integer NOT NULL +); + + +ALTER TABLE ebxml.organization_postaladdress OWNER TO awips; + +-- +-- TOC entry 378 (class 1259 OID 103579) +-- Name: organization_telephonenumber; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE organization_telephonenumber ( + organization_id character varying(255) NOT NULL, + telephonenumber_key integer NOT NULL +); + + +ALTER TABLE ebxml.organization_telephonenumber OWNER TO awips; + +-- +-- TOC entry 379 (class 1259 OID 103582) +-- Name: parameter; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE parameter ( + key integer NOT NULL, + datatype character varying(255), + defaultvalue character varying(255), + maxoccurs numeric(19,2), + minoccurs numeric(19,2), + parametername character varying(255), + description_key integer, + name_key integer +); + + +ALTER TABLE ebxml.parameter OWNER TO awips; + +-- +-- TOC entry 431 (class 1259 OID 104523) +-- Name: parameter_sequence; Type: SEQUENCE; Schema: ebxml; Owner: awips +-- + +CREATE SEQUENCE parameter_sequence + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE ebxml.parameter_sequence OWNER TO awips; + +-- +-- TOC entry 380 (class 1259 OID 103590) +-- Name: parameter_slot; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE parameter_slot ( + parameter_key integer NOT NULL, + child_slot_key integer NOT NULL +); + + +ALTER TABLE ebxml.parameter_slot OWNER TO awips; + +-- +-- TOC entry 381 (class 1259 OID 103595) +-- Name: person; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE person ( + id character varying(255) NOT NULL, + lid character varying(255), + objecttype character varying(255), + owner character varying(255), + status character varying(255), + userversionname character varying(255), + versionname character varying(255), + description_key integer, + name_key integer, + personname_middlename character varying(255), + personname_lastname character varying(255), + personname_firstname character varying(255) +); + + +ALTER TABLE ebxml.person OWNER TO awips; + +-- +-- TOC entry 384 (class 1259 OID 103619) +-- Name: person_emailaddress; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE person_emailaddress ( + person_id character varying(255) NOT NULL, + emailaddress_key integer NOT NULL +); + + +ALTER TABLE ebxml.person_emailaddress OWNER TO awips; + +-- +-- TOC entry 385 (class 1259 OID 103622) +-- Name: person_postaladdress; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE person_postaladdress ( + person_id character varying(255) NOT NULL, + postaladdress_key integer NOT NULL +); + + +ALTER TABLE ebxml.person_postaladdress OWNER TO awips; + +-- +-- TOC entry 386 (class 1259 OID 103625) +-- Name: person_telephonenumber; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE person_telephonenumber ( + person_id character varying(255) NOT NULL, + telephonenumber_key integer NOT NULL +); + + +ALTER TABLE ebxml.person_telephonenumber OWNER TO awips; + +-- +-- TOC entry 382 (class 1259 OID 103603) +-- Name: personname; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE personname ( + middlename character varying(255) NOT NULL, + lastname character varying(255) NOT NULL, + firstname character varying(255) NOT NULL +); + + +ALTER TABLE ebxml.personname OWNER TO awips; + +-- +-- TOC entry 383 (class 1259 OID 103611) +-- Name: personname_slot; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE personname_slot ( + personname_middlename character varying(255) NOT NULL, + personname_lastname character varying(255) NOT NULL, + personname_firstname character varying(255) NOT NULL, + child_slot_key integer NOT NULL +); + + +ALTER TABLE ebxml.personname_slot OWNER TO awips; + +-- +-- TOC entry 387 (class 1259 OID 103628) +-- Name: postaladdress; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE postaladdress ( + key integer NOT NULL, + city character varying(255), + country character varying(255), + postalcode character varying(255), + stateorprovince character varying(255), + street character varying(255), + streetnumber character varying(255), + type character varying(255) +); + + +ALTER TABLE ebxml.postaladdress OWNER TO awips; + +-- +-- TOC entry 432 (class 1259 OID 104525) +-- Name: postaladdress_sequence; Type: SEQUENCE; Schema: ebxml; Owner: awips +-- + +CREATE SEQUENCE postaladdress_sequence + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE ebxml.postaladdress_sequence OWNER TO awips; + +-- +-- TOC entry 388 (class 1259 OID 103636) +-- Name: postaladdress_slot; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE postaladdress_slot ( + postaladdress_key integer NOT NULL, + child_slot_key integer NOT NULL +); + + +ALTER TABLE ebxml.postaladdress_slot OWNER TO awips; + +-- +-- TOC entry 389 (class 1259 OID 103641) +-- Name: query; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE query ( + querydefinition character varying(255) NOT NULL +); + + +ALTER TABLE ebxml.query OWNER TO awips; + +-- +-- TOC entry 394 (class 1259 OID 103667) +-- Name: query_slot; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE query_slot ( + query_querydefinition character varying(255) NOT NULL, + child_slot_key integer NOT NULL +); + + +ALTER TABLE ebxml.query_slot OWNER TO awips; + +-- +-- TOC entry 390 (class 1259 OID 103646) +-- Name: querydefinition; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE querydefinition ( + id character varying(255) NOT NULL, + lid character varying(255), + objecttype character varying(255), + owner character varying(255), + status character varying(255), + userversionname character varying(255), + versionname character varying(255), + description_key integer, + name_key integer, + queryexpression_key integer +); + + +ALTER TABLE ebxml.querydefinition OWNER TO awips; + +-- +-- TOC entry 391 (class 1259 OID 103654) +-- Name: querydefinition_parameter; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE querydefinition_parameter ( + querydefinition_id character varying(255) NOT NULL, + parameter_key integer NOT NULL +); + + +ALTER TABLE ebxml.querydefinition_parameter OWNER TO awips; + +-- +-- TOC entry 392 (class 1259 OID 103657) +-- Name: queryexpression; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE queryexpression ( + key integer NOT NULL, + querylanguage character varying(255) +); + + +ALTER TABLE ebxml.queryexpression OWNER TO awips; + +-- +-- TOC entry 433 (class 1259 OID 104527) +-- Name: queryexpression_sequence; Type: SEQUENCE; Schema: ebxml; Owner: awips +-- + +CREATE SEQUENCE queryexpression_sequence + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE ebxml.queryexpression_sequence OWNER TO awips; + +-- +-- TOC entry 393 (class 1259 OID 103662) +-- Name: queryexpression_slot; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE queryexpression_slot ( + queryexpression_key integer NOT NULL, + child_slot_key integer NOT NULL +); + + +ALTER TABLE ebxml.queryexpression_slot OWNER TO awips; + +-- +-- TOC entry 395 (class 1259 OID 103672) +-- Name: registry; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE registry ( + id character varying(255) NOT NULL, + lid character varying(255), + objecttype character varying(255), + owner character varying(255), + status character varying(255), + userversionname character varying(255), + versionname character varying(255), + description_key integer, + name_key integer, + baseurl character varying(255), + conformanceprofile character varying(255), + operator character varying(255), + specificationversion character varying(255) +); + + +ALTER TABLE ebxml.registry OWNER TO awips; + +-- +-- TOC entry 396 (class 1259 OID 103680) +-- Name: registryobject; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE registryobject ( + id character varying(255) NOT NULL, + lid character varying(255), + objecttype character varying(255), + owner character varying(255), + status character varying(255), + userversionname character varying(255), + versionname character varying(255), + description_key integer, + name_key integer +); + + +ALTER TABLE ebxml.registryobject OWNER TO awips; + +-- +-- TOC entry 399 (class 1259 OID 103696) +-- Name: registryobject_classification; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE registryobject_classification ( + registryobject_id character varying(255) NOT NULL, + classification_id character varying(255) NOT NULL +); + + +ALTER TABLE ebxml.registryobject_classification OWNER TO awips; + +-- +-- TOC entry 400 (class 1259 OID 103704) +-- Name: registryobject_externalidentifier; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE registryobject_externalidentifier ( + registryobject_id character varying(255) NOT NULL, + externalidentifier_id character varying(255) NOT NULL +); + + +ALTER TABLE ebxml.registryobject_externalidentifier OWNER TO awips; + +-- +-- TOC entry 401 (class 1259 OID 103712) +-- Name: registryobject_externallink; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE registryobject_externallink ( + registryobject_id character varying(255) NOT NULL, + externallink_id character varying(255) NOT NULL +); + + +ALTER TABLE ebxml.registryobject_externallink OWNER TO awips; + +-- +-- TOC entry 402 (class 1259 OID 103720) +-- Name: registryobject_slot; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE registryobject_slot ( + registryobject_id character varying(255) NOT NULL, + child_slot_key integer NOT NULL +); + + +ALTER TABLE ebxml.registryobject_slot OWNER TO awips; + +-- +-- TOC entry 397 (class 1259 OID 103688) +-- Name: registryobjectlist; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE registryobjectlist ( + key integer NOT NULL +); + + +ALTER TABLE ebxml.registryobjectlist OWNER TO awips; + +-- +-- TOC entry 398 (class 1259 OID 103693) +-- Name: registryobjectlist_registryobject; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE registryobjectlist_registryobject ( + registryobjectlist_key integer NOT NULL, + registryobject_id character varying(255) NOT NULL +); + + +ALTER TABLE ebxml.registryobjectlist_registryobject OWNER TO awips; + +-- +-- TOC entry 434 (class 1259 OID 104529) +-- Name: registryobjectlist_sequence; Type: SEQUENCE; Schema: ebxml; Owner: awips +-- + +CREATE SEQUENCE registryobjectlist_sequence + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE ebxml.registryobjectlist_sequence OWNER TO awips; + +-- +-- TOC entry 403 (class 1259 OID 103725) +-- Name: registrypackage; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE registrypackage ( + id character varying(255) NOT NULL, + lid character varying(255), + objecttype character varying(255), + owner character varying(255), + status character varying(255), + userversionname character varying(255), + versionname character varying(255), + description_key integer, + name_key integer, + registryobjectlist_key integer +); + + +ALTER TABLE ebxml.registrypackage OWNER TO awips; + +-- +-- TOC entry 404 (class 1259 OID 103733) +-- Name: role; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE role ( + id character varying(255) NOT NULL, + lid character varying(255), + objecttype character varying(255), + owner character varying(255), + status character varying(255), + userversionname character varying(255), + versionname character varying(255), + description_key integer, + name_key integer, + type character varying(255) +); + + +ALTER TABLE ebxml.role OWNER TO awips; + +-- +-- TOC entry 405 (class 1259 OID 103741) +-- Name: service; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE service ( + id character varying(255) NOT NULL, + lid character varying(255), + objecttype character varying(255), + owner character varying(255), + status character varying(255), + userversionname character varying(255), + versionname character varying(255), + description_key integer, + name_key integer, + serviceinterface character varying(255) +); + + +ALTER TABLE ebxml.service OWNER TO awips; + +-- +-- TOC entry 409 (class 1259 OID 103773) +-- Name: service_serviceendpoint; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE service_serviceendpoint ( + service_id character varying(255) NOT NULL, + serviceendpoint_id character varying(255) NOT NULL +); + + +ALTER TABLE ebxml.service_serviceendpoint OWNER TO awips; + +-- +-- TOC entry 406 (class 1259 OID 103749) +-- Name: servicebinding; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE servicebinding ( + id character varying(255) NOT NULL, + lid character varying(255), + objecttype character varying(255), + owner character varying(255), + status character varying(255), + userversionname character varying(255), + versionname character varying(255), + description_key integer, + name_key integer, + serviceinterface character varying(255) +); + + +ALTER TABLE ebxml.servicebinding OWNER TO awips; + +-- +-- TOC entry 407 (class 1259 OID 103757) +-- Name: serviceendpoint; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE serviceendpoint ( + id character varying(255) NOT NULL, + lid character varying(255), + objecttype character varying(255), + owner character varying(255), + status character varying(255), + userversionname character varying(255), + versionname character varying(255), + description_key integer, + name_key integer, + address character varying(255), + servicebinding character varying(255) +); + + +ALTER TABLE ebxml.serviceendpoint OWNER TO awips; + +-- +-- TOC entry 408 (class 1259 OID 103765) +-- Name: serviceinterface; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE serviceinterface ( + id character varying(255) NOT NULL, + lid character varying(255), + objecttype character varying(255), + owner character varying(255), + status character varying(255), + userversionname character varying(255), + versionname character varying(255), + description_key integer, + name_key integer +); + + +ALTER TABLE ebxml.serviceinterface OWNER TO awips; + +-- +-- TOC entry 410 (class 1259 OID 103779) +-- Name: simplelink; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE simplelink ( + key integer NOT NULL, + arcrole character varying(255), + href character varying(255), + role character varying(255), + title character varying(255) +); + + +ALTER TABLE ebxml.simplelink OWNER TO awips; + +-- +-- TOC entry 435 (class 1259 OID 104531) +-- Name: simplelink_sequence; Type: SEQUENCE; Schema: ebxml; Owner: awips +-- + +CREATE SEQUENCE simplelink_sequence + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE ebxml.simplelink_sequence OWNER TO awips; + +-- +-- TOC entry 411 (class 1259 OID 103787) +-- Name: slot; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE slot ( + key integer NOT NULL, + name character varying(255), + type character varying(255), + slotvalue_key integer +); + + +ALTER TABLE ebxml.slot OWNER TO awips; + +-- +-- TOC entry 436 (class 1259 OID 104533) +-- Name: slot_sequence; Type: SEQUENCE; Schema: ebxml; Owner: awips +-- + +CREATE SEQUENCE slot_sequence + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE ebxml.slot_sequence OWNER TO awips; + +-- +-- TOC entry 412 (class 1259 OID 103795) +-- Name: slot_slot; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE slot_slot ( + slot_key integer NOT NULL, + child_slot_key integer NOT NULL +); + + +ALTER TABLE ebxml.slot_slot OWNER TO awips; + +-- +-- TOC entry 413 (class 1259 OID 103800) +-- Name: stringqueryexpression; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE stringqueryexpression ( + key integer NOT NULL, + querylanguage character varying(255), + value character varying(255) +); + + +ALTER TABLE ebxml.stringqueryexpression OWNER TO awips; + +-- +-- TOC entry 414 (class 1259 OID 103808) +-- Name: subscription; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE subscription ( + id character varying(255) NOT NULL, + lid character varying(255), + objecttype character varying(255), + owner character varying(255), + status character varying(255), + userversionname character varying(255), + versionname character varying(255), + description_key integer, + name_key integer, + endtime timestamp without time zone, + starttime timestamp without time zone, + selector_querydefinition character varying(255) +); + + +ALTER TABLE ebxml.subscription OWNER TO awips; + +-- +-- TOC entry 415 (class 1259 OID 103816) +-- Name: subscription_deliveryinfo; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE subscription_deliveryinfo ( + subscription_id character varying(255) NOT NULL, + deliveryinfo_key integer NOT NULL +); + + +ALTER TABLE ebxml.subscription_deliveryinfo OWNER TO awips; + +-- +-- TOC entry 416 (class 1259 OID 103819) +-- Name: taxonomyelementtype_classificationnode; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE taxonomyelementtype_classificationnode ( + taxonomyelementtype_id character varying(255) NOT NULL, + classificationnode_id character varying(255) NOT NULL +); + + +ALTER TABLE ebxml.taxonomyelementtype_classificationnode OWNER TO awips; + +-- +-- TOC entry 417 (class 1259 OID 103827) +-- Name: telephonenumber; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE telephonenumber ( + key integer NOT NULL, + areacode character varying(255), + countrycode character varying(255), + extension character varying(255), + number character varying(255), + type character varying(255) +); + + +ALTER TABLE ebxml.telephonenumber OWNER TO awips; + +-- +-- TOC entry 437 (class 1259 OID 104535) +-- Name: telephonenumber_sequence; Type: SEQUENCE; Schema: ebxml; Owner: awips +-- + +CREATE SEQUENCE telephonenumber_sequence + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE ebxml.telephonenumber_sequence OWNER TO awips; + +-- +-- TOC entry 418 (class 1259 OID 103835) +-- Name: telephonenumber_slot; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE telephonenumber_slot ( + telephonenumber_key integer NOT NULL, + child_slot_key integer NOT NULL +); + + +ALTER TABLE ebxml.telephonenumber_slot OWNER TO awips; + +-- +-- TOC entry 419 (class 1259 OID 103840) +-- Name: value; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE value ( + dtype character varying(31) NOT NULL, + key integer NOT NULL, + mapvalue text, + stringvalue text, + slotvalue text, + durationvalue bigint, + anyvalue text, + floatvalue real, + vocabularytermvalue text, + integervalue numeric(19,2), + datetimevalue timestamp without time zone, + collectiontype character varying(255), + booleanvalue boolean, + internationalstringvalue_key integer +); + + +ALTER TABLE ebxml.value OWNER TO awips; + +-- +-- TOC entry 438 (class 1259 OID 104537) +-- Name: value_sequence; Type: SEQUENCE; Schema: ebxml; Owner: awips +-- + +CREATE SEQUENCE value_sequence + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE ebxml.value_sequence OWNER TO awips; + +-- +-- TOC entry 420 (class 1259 OID 103848) +-- Name: value_value; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE value_value ( + value_key integer NOT NULL, + collectionvalue_key integer NOT NULL +); + + +ALTER TABLE ebxml.value_value OWNER TO awips; + +-- +-- TOC entry 421 (class 1259 OID 103851) +-- Name: vocabularyterm; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE vocabularyterm ( + vocabulary character varying(255) NOT NULL, + term character varying(255) NOT NULL +); + + +ALTER TABLE ebxml.vocabularyterm OWNER TO awips; + +-- +-- TOC entry 422 (class 1259 OID 103859) +-- Name: workflowaction; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE workflowaction ( + id character varying(255) NOT NULL, + lid character varying(255), + objecttype character varying(255), + owner character varying(255), + status character varying(255), + userversionname character varying(255), + versionname character varying(255), + description_key integer, + name_key integer, + actiontype character varying(255), + targetobject character varying(255) +); + + +ALTER TABLE ebxml.workflowaction OWNER TO awips; + +-- +-- TOC entry 423 (class 1259 OID 103867) +-- Name: xmlqueryexpression; Type: TABLE; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE TABLE xmlqueryexpression ( + key integer NOT NULL, + querylanguage character varying(255), + anyvalue text +); + + +ALTER TABLE ebxml.xmlqueryexpression OWNER TO awips; + +-- +-- TOC entry 4599 (class 2606 OID 103389) +-- Name: action_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY action + ADD CONSTRAINT action_pkey PRIMARY KEY (key); + + +-- +-- TOC entry 4601 (class 2606 OID 103394) +-- Name: action_slot_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY action_slot + ADD CONSTRAINT action_slot_pkey PRIMARY KEY (action_key, child_slot_key); + + +-- +-- TOC entry 4603 (class 2606 OID 103402) +-- Name: association_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY association + ADD CONSTRAINT association_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 4612 (class 2606 OID 103415) +-- Name: auditableevent_action_action_key_key; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY auditableevent_action + ADD CONSTRAINT auditableevent_action_action_key_key UNIQUE (action_key); + + +-- +-- TOC entry 4608 (class 2606 OID 103410) +-- Name: auditableevent_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY auditableevent + ADD CONSTRAINT auditableevent_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 4614 (class 2606 OID 103423) +-- Name: classification_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY classification + ADD CONSTRAINT classification_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 4618 (class 2606 OID 103431) +-- Name: classificationnode_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY classificationnode + ADD CONSTRAINT classificationnode_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 4623 (class 2606 OID 103439) +-- Name: classificationscheme_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY classificationscheme + ADD CONSTRAINT classificationscheme_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 4627 (class 2606 OID 103444) +-- Name: deliveryinfo_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY deliveryinfo + ADD CONSTRAINT deliveryinfo_pkey PRIMARY KEY (key); + + +-- +-- TOC entry 4629 (class 2606 OID 103449) +-- Name: deliveryinfo_slot_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY deliveryinfo_slot + ADD CONSTRAINT deliveryinfo_slot_pkey PRIMARY KEY (deliveryinfo_key, child_slot_key); + + +-- +-- TOC entry 4631 (class 2606 OID 103457) +-- Name: emailaddress_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY emailaddress + ADD CONSTRAINT emailaddress_pkey PRIMARY KEY (key); + + +-- +-- TOC entry 4633 (class 2606 OID 103462) +-- Name: emailaddress_slot_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY emailaddress_slot + ADD CONSTRAINT emailaddress_slot_pkey PRIMARY KEY (emailaddress_key, child_slot_key); + + +-- +-- TOC entry 4635 (class 2606 OID 103469) +-- Name: entry_entrykey_key_key; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY entry + ADD CONSTRAINT entry_entrykey_key_key UNIQUE (entrykey_key); + + +-- +-- TOC entry 4637 (class 2606 OID 103471) +-- Name: entry_entryvalue_key_key; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY entry + ADD CONSTRAINT entry_entryvalue_key_key UNIQUE (entryvalue_key); + + +-- +-- TOC entry 4639 (class 2606 OID 103467) +-- Name: entry_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY entry + ADD CONSTRAINT entry_pkey PRIMARY KEY (entryvalue_key, entrykey_key); + + +-- +-- TOC entry 4641 (class 2606 OID 103479) +-- Name: externalidentifier_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY externalidentifier + ADD CONSTRAINT externalidentifier_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 4645 (class 2606 OID 103487) +-- Name: externallink_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY externallink + ADD CONSTRAINT externallink_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 4649 (class 2606 OID 103495) +-- Name: extrinsicobject_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY extrinsicobject + ADD CONSTRAINT extrinsicobject_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 4653 (class 2606 OID 103503) +-- Name: federation_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY federation + ADD CONSTRAINT federation_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 4660 (class 2606 OID 103513) +-- Name: internationalstring_localizedstring_localizedstring_key_key; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY internationalstring_localizedstring + ADD CONSTRAINT internationalstring_localizedstring_localizedstring_key_key UNIQUE (localizedstring_key); + + +-- +-- TOC entry 4657 (class 2606 OID 103508) +-- Name: internationalstring_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY internationalstring + ADD CONSTRAINT internationalstring_pkey PRIMARY KEY (key); + + +-- +-- TOC entry 4662 (class 2606 OID 103521) +-- Name: localizedstring_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY localizedstring + ADD CONSTRAINT localizedstring_pkey PRIMARY KEY (key); + + +-- +-- TOC entry 4664 (class 2606 OID 103526) +-- Name: map_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY map + ADD CONSTRAINT map_pkey PRIMARY KEY (key); + + +-- +-- TOC entry 4666 (class 2606 OID 103537) +-- Name: notification_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY notification + ADD CONSTRAINT notification_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 4670 (class 2606 OID 103548) +-- Name: objectref_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY objectref + ADD CONSTRAINT objectref_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 4674 (class 2606 OID 103561) +-- Name: objectref_slot_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY objectref_slot + ADD CONSTRAINT objectref_slot_pkey PRIMARY KEY (objectref_id, child_slot_key); + + +-- +-- TOC entry 4672 (class 2606 OID 103553) +-- Name: objectreflist_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY objectreflist + ADD CONSTRAINT objectreflist_pkey PRIMARY KEY (key); + + +-- +-- TOC entry 4676 (class 2606 OID 103569) +-- Name: organization_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY organization + ADD CONSTRAINT organization_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 4680 (class 2606 OID 103589) +-- Name: parameter_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY parameter + ADD CONSTRAINT parameter_pkey PRIMARY KEY (key); + + +-- +-- TOC entry 4682 (class 2606 OID 103594) +-- Name: parameter_slot_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY parameter_slot + ADD CONSTRAINT parameter_slot_pkey PRIMARY KEY (parameter_key, child_slot_key); + + +-- +-- TOC entry 4684 (class 2606 OID 103602) +-- Name: person_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY person + ADD CONSTRAINT person_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 4688 (class 2606 OID 103610) +-- Name: personname_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY personname + ADD CONSTRAINT personname_pkey PRIMARY KEY (middlename, lastname, firstname); + + +-- +-- TOC entry 4690 (class 2606 OID 103618) +-- Name: personname_slot_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY personname_slot + ADD CONSTRAINT personname_slot_pkey PRIMARY KEY (personname_middlename, personname_lastname, personname_firstname, child_slot_key); + + +-- +-- TOC entry 4692 (class 2606 OID 103635) +-- Name: postaladdress_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY postaladdress + ADD CONSTRAINT postaladdress_pkey PRIMARY KEY (key); + + +-- +-- TOC entry 4694 (class 2606 OID 103640) +-- Name: postaladdress_slot_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY postaladdress_slot + ADD CONSTRAINT postaladdress_slot_pkey PRIMARY KEY (postaladdress_key, child_slot_key); + + +-- +-- TOC entry 4696 (class 2606 OID 103645) +-- Name: query_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY query + ADD CONSTRAINT query_pkey PRIMARY KEY (querydefinition); + + +-- +-- TOC entry 4706 (class 2606 OID 103671) +-- Name: query_slot_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY query_slot + ADD CONSTRAINT query_slot_pkey PRIMARY KEY (query_querydefinition, child_slot_key); + + +-- +-- TOC entry 4698 (class 2606 OID 103653) +-- Name: querydefinition_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY querydefinition + ADD CONSTRAINT querydefinition_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 4702 (class 2606 OID 103661) +-- Name: queryexpression_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY queryexpression + ADD CONSTRAINT queryexpression_pkey PRIMARY KEY (key); + + +-- +-- TOC entry 4704 (class 2606 OID 103666) +-- Name: queryexpression_slot_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY queryexpression_slot + ADD CONSTRAINT queryexpression_slot_pkey PRIMARY KEY (queryexpression_key, child_slot_key); + + +-- +-- TOC entry 4708 (class 2606 OID 103679) +-- Name: registry_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY registry + ADD CONSTRAINT registry_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 4718 (class 2606 OID 103703) +-- Name: registryobject_classification_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY registryobject_classification + ADD CONSTRAINT registryobject_classification_pkey PRIMARY KEY (registryobject_id, classification_id); + + +-- +-- TOC entry 4720 (class 2606 OID 103711) +-- Name: registryobject_externalidentifier_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY registryobject_externalidentifier + ADD CONSTRAINT registryobject_externalidentifier_pkey PRIMARY KEY (registryobject_id, externalidentifier_id); + + +-- +-- TOC entry 4722 (class 2606 OID 103719) +-- Name: registryobject_externallink_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY registryobject_externallink + ADD CONSTRAINT registryobject_externallink_pkey PRIMARY KEY (registryobject_id, externallink_id); + + +-- +-- TOC entry 4713 (class 2606 OID 103687) +-- Name: registryobject_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY registryobject + ADD CONSTRAINT registryobject_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 4725 (class 2606 OID 103724) +-- Name: registryobject_slot_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY registryobject_slot + ADD CONSTRAINT registryobject_slot_pkey PRIMARY KEY (registryobject_id, child_slot_key); + + +-- +-- TOC entry 4716 (class 2606 OID 103692) +-- Name: registryobjectlist_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY registryobjectlist + ADD CONSTRAINT registryobjectlist_pkey PRIMARY KEY (key); + + +-- +-- TOC entry 4727 (class 2606 OID 103732) +-- Name: registrypackage_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY registrypackage + ADD CONSTRAINT registrypackage_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 4731 (class 2606 OID 103740) +-- Name: role_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY role + ADD CONSTRAINT role_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 4735 (class 2606 OID 103748) +-- Name: service_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY service + ADD CONSTRAINT service_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 4739 (class 2606 OID 103756) +-- Name: servicebinding_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY servicebinding + ADD CONSTRAINT servicebinding_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 4743 (class 2606 OID 103764) +-- Name: serviceendpoint_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY serviceendpoint + ADD CONSTRAINT serviceendpoint_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 4747 (class 2606 OID 103772) +-- Name: serviceinterface_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY serviceinterface + ADD CONSTRAINT serviceinterface_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 4751 (class 2606 OID 103786) +-- Name: simplelink_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY simplelink + ADD CONSTRAINT simplelink_pkey PRIMARY KEY (key); + + +-- +-- TOC entry 4754 (class 2606 OID 103794) +-- Name: slot_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY slot + ADD CONSTRAINT slot_pkey PRIMARY KEY (key); + + +-- +-- TOC entry 4756 (class 2606 OID 103799) +-- Name: slot_slot_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY slot_slot + ADD CONSTRAINT slot_slot_pkey PRIMARY KEY (slot_key, child_slot_key); + + +-- +-- TOC entry 4758 (class 2606 OID 103807) +-- Name: stringqueryexpression_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY stringqueryexpression + ADD CONSTRAINT stringqueryexpression_pkey PRIMARY KEY (key); + + +-- +-- TOC entry 4760 (class 2606 OID 103815) +-- Name: subscription_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY subscription + ADD CONSTRAINT subscription_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 4764 (class 2606 OID 103826) +-- Name: taxonomyelementtype_classificationnode_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY taxonomyelementtype_classificationnode + ADD CONSTRAINT taxonomyelementtype_classificationnode_pkey PRIMARY KEY (taxonomyelementtype_id, classificationnode_id); + + +-- +-- TOC entry 4766 (class 2606 OID 103834) +-- Name: telephonenumber_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY telephonenumber + ADD CONSTRAINT telephonenumber_pkey PRIMARY KEY (key); + + +-- +-- TOC entry 4768 (class 2606 OID 103839) +-- Name: telephonenumber_slot_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY telephonenumber_slot + ADD CONSTRAINT telephonenumber_slot_pkey PRIMARY KEY (telephonenumber_key, child_slot_key); + + +-- +-- TOC entry 4770 (class 2606 OID 103847) +-- Name: value_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY value + ADD CONSTRAINT value_pkey PRIMARY KEY (key); + + +-- +-- TOC entry 4773 (class 2606 OID 103858) +-- Name: vocabularyterm_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY vocabularyterm + ADD CONSTRAINT vocabularyterm_pkey PRIMARY KEY (vocabulary, term); + + +-- +-- TOC entry 4775 (class 2606 OID 103866) +-- Name: workflowaction_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY workflowaction + ADD CONSTRAINT workflowaction_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 4779 (class 2606 OID 103874) +-- Name: xmlqueryexpression_pkey; Type: CONSTRAINT; Schema: ebxml; Owner: awips; Tablespace: +-- + +ALTER TABLE ONLY xmlqueryexpression + ADD CONSTRAINT xmlqueryexpression_pkey PRIMARY KEY (key); + + +-- +-- TOC entry 4604 (class 1259 OID 103896) +-- Name: associationlid_index; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX associationlid_index ON association USING btree (lid); + + +-- +-- TOC entry 4605 (class 1259 OID 103895) +-- Name: associationregistryobjecttype_objecttype_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX associationregistryobjecttype_objecttype_idx ON association USING btree (objecttype); + + +-- +-- TOC entry 4606 (class 1259 OID 103897) +-- Name: assoociation_type_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX assoociation_type_idx ON association USING btree (type); + + +-- +-- TOC entry 4609 (class 1259 OID 103909) +-- Name: auditableeventlid_index; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX auditableeventlid_index ON auditableevent USING btree (lid); + + +-- +-- TOC entry 4610 (class 1259 OID 103908) +-- Name: auditableeventregistryobjecttype_objecttype_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX auditableeventregistryobjecttype_objecttype_idx ON auditableevent USING btree (objecttype); + + +-- +-- TOC entry 4615 (class 1259 OID 103931) +-- Name: classificationlid_index; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX classificationlid_index ON classification USING btree (lid); + + +-- +-- TOC entry 4619 (class 1259 OID 103944) +-- Name: classificationnodepath_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX classificationnodepath_idx ON classificationnode USING btree (path); + + +-- +-- TOC entry 4620 (class 1259 OID 103943) +-- Name: classificationnodetaxonomyelementtypelid_index; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX classificationnodetaxonomyelementtypelid_index ON classificationnode USING btree (lid); + + +-- +-- TOC entry 4621 (class 1259 OID 103942) +-- Name: classificationnodetaxonomyelementtyperegistryobjecttype_objectt; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX classificationnodetaxonomyelementtyperegistryobjecttype_objectt ON classificationnode USING btree (objecttype); + + +-- +-- TOC entry 4616 (class 1259 OID 103930) +-- Name: classificationregistryobjecttype_objecttype_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX classificationregistryobjecttype_objecttype_idx ON classification USING btree (objecttype); + + +-- +-- TOC entry 4624 (class 1259 OID 103956) +-- Name: classificationschemetaxonomyelementtypelid_index; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX classificationschemetaxonomyelementtypelid_index ON classificationscheme USING btree (lid); + + +-- +-- TOC entry 4625 (class 1259 OID 103955) +-- Name: classificationschemetaxonomyelementtyperegistryobjecttype_objec; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX classificationschemetaxonomyelementtyperegistryobjecttype_objec ON classificationscheme USING btree (objecttype); + + +-- +-- TOC entry 4642 (class 1259 OID 103998) +-- Name: externalidentifierlid_index; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX externalidentifierlid_index ON externalidentifier USING btree (lid); + + +-- +-- TOC entry 4643 (class 1259 OID 103997) +-- Name: externalidentifierregistryobjecttype_objecttype_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX externalidentifierregistryobjecttype_objecttype_idx ON externalidentifier USING btree (objecttype); + + +-- +-- TOC entry 4646 (class 1259 OID 104010) +-- Name: externallinklid_index; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX externallinklid_index ON externallink USING btree (lid); + + +-- +-- TOC entry 4647 (class 1259 OID 104009) +-- Name: externallinkregistryobjecttype_objecttype_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX externallinkregistryobjecttype_objecttype_idx ON externallink USING btree (objecttype); + + +-- +-- TOC entry 4650 (class 1259 OID 104027) +-- Name: extrinsicobjectlid_index; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX extrinsicobjectlid_index ON extrinsicobject USING btree (lid); + + +-- +-- TOC entry 4651 (class 1259 OID 104026) +-- Name: extrinsicobjectregistryobjecttype_objecttype_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX extrinsicobjectregistryobjecttype_objecttype_idx ON extrinsicobject USING btree (objecttype); + + +-- +-- TOC entry 4654 (class 1259 OID 104044) +-- Name: federationlid_index; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX federationlid_index ON federation USING btree (lid); + + +-- +-- TOC entry 4655 (class 1259 OID 104043) +-- Name: federationregistryobjecttype_objecttype_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX federationregistryobjecttype_objecttype_idx ON federation USING btree (objecttype); + + +-- +-- TOC entry 4658 (class 1259 OID 104539) +-- Name: internationalstring_localizedString_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX "internationalstring_localizedString_idx" ON internationalstring_localizedstring USING btree (internationalstring_key); + + +-- +-- TOC entry 4711 (class 1259 OID 104301) +-- Name: lid_index; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX lid_index ON registryobject USING btree (lid); + + +-- +-- TOC entry 4667 (class 1259 OID 104076) +-- Name: notificationlid_index; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX notificationlid_index ON notification USING btree (lid); + + +-- +-- TOC entry 4668 (class 1259 OID 104075) +-- Name: notificationregistryobjecttype_objecttype_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX notificationregistryobjecttype_objecttype_idx ON notification USING btree (objecttype); + + +-- +-- TOC entry 4677 (class 1259 OID 104118) +-- Name: organizationlid_index; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX organizationlid_index ON organization USING btree (lid); + + +-- +-- TOC entry 4678 (class 1259 OID 104117) +-- Name: organizationregistryobjecttype_objecttype_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX organizationregistryobjecttype_objecttype_idx ON organization USING btree (objecttype); + + +-- +-- TOC entry 4685 (class 1259 OID 104185) +-- Name: personlid_index; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX personlid_index ON person USING btree (lid); + + +-- +-- TOC entry 4686 (class 1259 OID 104184) +-- Name: personregistryobjecttype_objecttype_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX personregistryobjecttype_objecttype_idx ON person USING btree (objecttype); + + +-- +-- TOC entry 4699 (class 1259 OID 104252) +-- Name: querydefinitionlid_index; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX querydefinitionlid_index ON querydefinition USING btree (lid); + + +-- +-- TOC entry 4700 (class 1259 OID 104251) +-- Name: querydefinitionregistryobjecttype_objecttype_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX querydefinitionregistryobjecttype_objecttype_idx ON querydefinition USING btree (objecttype); + + +-- +-- TOC entry 4709 (class 1259 OID 104289) +-- Name: registrylid_index; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX registrylid_index ON registry USING btree (lid); + + +-- +-- TOC entry 4723 (class 1259 OID 104540) +-- Name: registryobject_slot_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX registryobject_slot_idx ON registryobject_slot USING btree (registryobject_id); + + +-- +-- TOC entry 4714 (class 1259 OID 104300) +-- Name: registryobjecttype_objecttype_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX registryobjecttype_objecttype_idx ON registryobject USING btree (objecttype); + + +-- +-- TOC entry 4728 (class 1259 OID 104338) +-- Name: registrypackagelid_index; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX registrypackagelid_index ON registrypackage USING btree (lid); + + +-- +-- TOC entry 4729 (class 1259 OID 104337) +-- Name: registrypackageregistryobjecttype_objecttype_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX registrypackageregistryobjecttype_objecttype_idx ON registrypackage USING btree (objecttype); + + +-- +-- TOC entry 4710 (class 1259 OID 104288) +-- Name: registryregistryobjecttype_objecttype_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX registryregistryobjecttype_objecttype_idx ON registry USING btree (objecttype); + + +-- +-- TOC entry 4732 (class 1259 OID 104355) +-- Name: rolelid_index; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX rolelid_index ON role USING btree (lid); + + +-- +-- TOC entry 4733 (class 1259 OID 104354) +-- Name: roleregistryobjecttype_objecttype_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX roleregistryobjecttype_objecttype_idx ON role USING btree (objecttype); + + +-- +-- TOC entry 4740 (class 1259 OID 104379) +-- Name: servicebindinglid_index; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX servicebindinglid_index ON servicebinding USING btree (lid); + + +-- +-- TOC entry 4741 (class 1259 OID 104378) +-- Name: servicebindingregistryobjecttype_objecttype_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX servicebindingregistryobjecttype_objecttype_idx ON servicebinding USING btree (objecttype); + + +-- +-- TOC entry 4744 (class 1259 OID 104391) +-- Name: serviceendpointlid_index; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX serviceendpointlid_index ON serviceendpoint USING btree (lid); + + +-- +-- TOC entry 4745 (class 1259 OID 104390) +-- Name: serviceendpointregistryobjecttype_objecttype_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX serviceendpointregistryobjecttype_objecttype_idx ON serviceendpoint USING btree (objecttype); + + +-- +-- TOC entry 4748 (class 1259 OID 104403) +-- Name: serviceinterfacelid_index; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX serviceinterfacelid_index ON serviceinterface USING btree (lid); + + +-- +-- TOC entry 4749 (class 1259 OID 104402) +-- Name: serviceinterfaceregistryobjecttype_objecttype_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX serviceinterfaceregistryobjecttype_objecttype_idx ON serviceinterface USING btree (objecttype); + + +-- +-- TOC entry 4736 (class 1259 OID 104367) +-- Name: servicelid_index; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX servicelid_index ON service USING btree (lid); + + +-- +-- TOC entry 4737 (class 1259 OID 104366) +-- Name: serviceregistryobjecttype_objecttype_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX serviceregistryobjecttype_objecttype_idx ON service USING btree (objecttype); + + +-- +-- TOC entry 4752 (class 1259 OID 104424) +-- Name: slot_name_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX slot_name_idx ON slot USING btree (name); + + +-- +-- TOC entry 4761 (class 1259 OID 104441) +-- Name: subscriptionlid_index; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX subscriptionlid_index ON subscription USING btree (lid); + + +-- +-- TOC entry 4762 (class 1259 OID 104440) +-- Name: subscriptionregistryobjecttype_objecttype_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX subscriptionregistryobjecttype_objecttype_idx ON subscription USING btree (objecttype); + + +-- +-- TOC entry 4771 (class 1259 OID 104541) +-- Name: value_value_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX value_value_idx ON value_value USING btree (value_key); + + +-- +-- TOC entry 4776 (class 1259 OID 104498) +-- Name: workflowactionlid_index; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX workflowactionlid_index ON workflowaction USING btree (lid); + + +-- +-- TOC entry 4777 (class 1259 OID 104497) +-- Name: workflowactionregistryobjecttype_objecttype_idx; Type: INDEX; Schema: ebxml; Owner: awips; Tablespace: +-- + +CREATE INDEX workflowactionregistryobjecttype_objecttype_idx ON workflowaction USING btree (objecttype); + + +-- +-- TOC entry 4845 (class 2606 OID 104221) +-- Name: fk1a9f253f1cc2d914; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY person_postaladdress + ADD CONSTRAINT fk1a9f253f1cc2d914 FOREIGN KEY (postaladdress_key) REFERENCES postaladdress(key); + + +-- +-- TOC entry 4844 (class 2606 OID 104226) +-- Name: fk1a9f253ff14343cc; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY person_postaladdress + ADD CONSTRAINT fk1a9f253ff14343cc FOREIGN KEY (person_id) REFERENCES person(id); + + +-- +-- TOC entry 4890 (class 2606 OID 104477) +-- Name: fk1aba1ed0791fb611; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY telephonenumber_slot + ADD CONSTRAINT fk1aba1ed0791fb611 FOREIGN KEY (child_slot_key) REFERENCES slot(key); + + +-- +-- TOC entry 4891 (class 2606 OID 104472) +-- Name: fk1aba1ed0f3468e5c; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY telephonenumber_slot + ADD CONSTRAINT fk1aba1ed0f3468e5c FOREIGN KEY (telephonenumber_key) REFERENCES telephonenumber(key); + + +-- +-- TOC entry 4884 (class 2606 OID 104452) +-- Name: fk1e21ad3deb1f4f85; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY subscription + ADD CONSTRAINT fk1e21ad3deb1f4f85 FOREIGN KEY (selector_querydefinition) REFERENCES query(querydefinition); + + +-- +-- TOC entry 4846 (class 2606 OID 104236) +-- Name: fk1edf7383f14343cc; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY person_telephonenumber + ADD CONSTRAINT fk1edf7383f14343cc FOREIGN KEY (person_id) REFERENCES person(id); + + +-- +-- TOC entry 4847 (class 2606 OID 104231) +-- Name: fk1edf7383f3468e5c; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY person_telephonenumber + ADD CONSTRAINT fk1edf7383f3468e5c FOREIGN KEY (telephonenumber_key) REFERENCES telephonenumber(key); + + +-- +-- TOC entry 4894 (class 2606 OID 104487) +-- Name: fk214ba4e31cb1cda6; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY value_value + ADD CONSTRAINT fk214ba4e31cb1cda6 FOREIGN KEY (collectionvalue_key) REFERENCES value(key); + + +-- +-- TOC entry 4893 (class 2606 OID 104492) +-- Name: fk214ba4e3ae207b86; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY value_value + ADD CONSTRAINT fk214ba4e3ae207b86 FOREIGN KEY (value_key) REFERENCES value(key); + + +-- +-- TOC entry 4827 (class 2606 OID 104129) +-- Name: fk219f5c4459e50e0c; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY organization_emailaddress + ADD CONSTRAINT fk219f5c4459e50e0c FOREIGN KEY (organization_id) REFERENCES organization(id); + + +-- +-- TOC entry 4826 (class 2606 OID 104134) +-- Name: fk219f5c4487a0de2; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY organization_emailaddress + ADD CONSTRAINT fk219f5c4487a0de2 FOREIGN KEY (emailaddress_key) REFERENCES emailaddress(key); + + +-- +-- TOC entry 4862 (class 2606 OID 104317) +-- Name: fk220c0ca97146a5ac; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY registryobject_classification + ADD CONSTRAINT fk220c0ca97146a5ac FOREIGN KEY (classification_id) REFERENCES classification(id); + + +-- +-- TOC entry 4841 (class 2606 OID 104201) +-- Name: fk23dea75d305d8b4d; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY personname_slot + ADD CONSTRAINT fk23dea75d305d8b4d FOREIGN KEY (personname_middlename, personname_lastname, personname_firstname) REFERENCES personname(middlename, lastname, firstname); + + +-- +-- TOC entry 4840 (class 2606 OID 104206) +-- Name: fk23dea75d791fb611; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY personname_slot + ADD CONSTRAINT fk23dea75d791fb611 FOREIGN KEY (child_slot_key) REFERENCES slot(key); + + +-- +-- TOC entry 4881 (class 2606 OID 104425) +-- Name: fk275e1e3d4e5e46; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY slot + ADD CONSTRAINT fk275e1e3d4e5e46 FOREIGN KEY (slotvalue_key) REFERENCES value(key); + + +-- +-- TOC entry 4832 (class 2606 OID 104154) +-- Name: fk2763b16159e50e0c; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY organization_telephonenumber + ADD CONSTRAINT fk2763b16159e50e0c FOREIGN KEY (organization_id) REFERENCES organization(id); + + +-- +-- TOC entry 4831 (class 2606 OID 104159) +-- Name: fk2763b161f3468e5c; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY organization_telephonenumber + ADD CONSTRAINT fk2763b161f3468e5c FOREIGN KEY (telephonenumber_key) REFERENCES telephonenumber(key); + + +-- +-- TOC entry 4829 (class 2606 OID 104149) +-- Name: fk3035429d1cc2d914; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY organization_postaladdress + ADD CONSTRAINT fk3035429d1cc2d914 FOREIGN KEY (postaladdress_key) REFERENCES postaladdress(key); + + +-- +-- TOC entry 4830 (class 2606 OID 104144) +-- Name: fk3035429d59e50e0c; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY organization_postaladdress + ADD CONSTRAINT fk3035429d59e50e0c FOREIGN KEY (organization_id) REFERENCES organization(id); + + +-- +-- TOC entry 4799 (class 2606 OID 103977) +-- Name: fk31c32925791fb611; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY emailaddress_slot + ADD CONSTRAINT fk31c32925791fb611 FOREIGN KEY (child_slot_key) REFERENCES slot(key); + + +-- +-- TOC entry 4798 (class 2606 OID 103982) +-- Name: fk31c3292587a0de2; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY emailaddress_slot + ADD CONSTRAINT fk31c3292587a0de2 FOREIGN KEY (emailaddress_key) REFERENCES emailaddress(key); + + +-- +-- TOC entry 4800 (class 2606 OID 103992) +-- Name: fk40018526aa2c3c0; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY entry + ADD CONSTRAINT fk40018526aa2c3c0 FOREIGN KEY (entrykey_key) REFERENCES value(key); + + +-- +-- TOC entry 4801 (class 2606 OID 103987) +-- Name: fk400185272ea4252; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY entry + ADD CONSTRAINT fk400185272ea4252 FOREIGN KEY (entryvalue_key) REFERENCES value(key); + + +-- +-- TOC entry 4892 (class 2606 OID 104482) +-- Name: fk4e9a151f53db13; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY value + ADD CONSTRAINT fk4e9a151f53db13 FOREIGN KEY (internationalstringvalue_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4860 (class 2606 OID 104302) +-- Name: fk5880a9fc94b6895d; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY registryobject + ADD CONSTRAINT fk5880a9fc94b6895d FOREIGN KEY (description_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4787 (class 2606 OID 103910) +-- Name: fk5880a9fc94b6895d134a8c05; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY auditableevent + ADD CONSTRAINT fk5880a9fc94b6895d134a8c05 FOREIGN KEY (description_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4886 (class 2606 OID 104442) +-- Name: fk5880a9fc94b6895d1e21ad3d; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY subscription + ADD CONSTRAINT fk5880a9fc94b6895d1e21ad3d FOREIGN KEY (description_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4870 (class 2606 OID 104356) +-- Name: fk5880a9fc94b6895d26f496; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY role + ADD CONSTRAINT fk5880a9fc94b6895d26f496 FOREIGN KEY (description_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4817 (class 2606 OID 104077) +-- Name: fk5880a9fc94b6895d2d45dd0b; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY notification + ADD CONSTRAINT fk5880a9fc94b6895d2d45dd0b FOREIGN KEY (description_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4874 (class 2606 OID 104380) +-- Name: fk5880a9fc94b6895d44524630; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY servicebinding + ADD CONSTRAINT fk5880a9fc94b6895d44524630 FOREIGN KEY (description_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4825 (class 2606 OID 104119) +-- Name: fk5880a9fc94b6895d50104153; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY organization + ADD CONSTRAINT fk5880a9fc94b6895d50104153 FOREIGN KEY (description_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4803 (class 2606 OID 103999) +-- Name: fk5880a9fc94b6895d56d1a6f4; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY externalidentifier + ADD CONSTRAINT fk5880a9fc94b6895d56d1a6f4 FOREIGN KEY (description_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4785 (class 2606 OID 103898) +-- Name: fk5880a9fc94b6895d5e328461; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY association + ADD CONSTRAINT fk5880a9fc94b6895d5e328461 FOREIGN KEY (description_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4876 (class 2606 OID 104392) +-- Name: fk5880a9fc94b6895d75b47b4a; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY serviceendpoint + ADD CONSTRAINT fk5880a9fc94b6895d75b47b4a FOREIGN KEY (description_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4811 (class 2606 OID 104045) +-- Name: fk5880a9fc94b6895d85f55363; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY federation + ADD CONSTRAINT fk5880a9fc94b6895d85f55363 FOREIGN KEY (description_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4839 (class 2606 OID 104186) +-- Name: fk5880a9fc94b6895d8e488775; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY person + ADD CONSTRAINT fk5880a9fc94b6895d8e488775 FOREIGN KEY (description_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4806 (class 2606 OID 104011) +-- Name: fk5880a9fc94b6895db72bfe85; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY externallink + ADD CONSTRAINT fk5880a9fc94b6895db72bfe85 FOREIGN KEY (description_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4851 (class 2606 OID 104253) +-- Name: fk5880a9fc94b6895dca0a881b; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY querydefinition + ADD CONSTRAINT fk5880a9fc94b6895dca0a881b FOREIGN KEY (description_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4878 (class 2606 OID 104404) +-- Name: fk5880a9fc94b6895dcdb3c624; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY serviceinterface + ADD CONSTRAINT fk5880a9fc94b6895dcdb3c624 FOREIGN KEY (description_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4896 (class 2606 OID 104499) +-- Name: fk5880a9fc94b6895dce4002f5; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY workflowaction + ADD CONSTRAINT fk5880a9fc94b6895dce4002f5 FOREIGN KEY (description_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4809 (class 2606 OID 104028) +-- Name: fk5880a9fc94b6895dd97867b6; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY extrinsicobject + ADD CONSTRAINT fk5880a9fc94b6895dd97867b6 FOREIGN KEY (description_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4872 (class 2606 OID 104368) +-- Name: fk5880a9fc94b6895dd97c5e95; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY service + ADD CONSTRAINT fk5880a9fc94b6895dd97c5e95 FOREIGN KEY (description_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4858 (class 2606 OID 104290) +-- Name: fk5880a9fc94b6895ddab6945d; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY registry + ADD CONSTRAINT fk5880a9fc94b6895ddab6945d FOREIGN KEY (description_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4791 (class 2606 OID 103932) +-- Name: fk5880a9fc94b6895ddb110006; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY classification + ADD CONSTRAINT fk5880a9fc94b6895ddb110006 FOREIGN KEY (description_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4795 (class 2606 OID 103957) +-- Name: fk5880a9fc94b6895ddcd5f4255afc854b; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY classificationscheme + ADD CONSTRAINT fk5880a9fc94b6895ddcd5f4255afc854b FOREIGN KEY (description_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4793 (class 2606 OID 103945) +-- Name: fk5880a9fc94b6895ddcd5f425eb0aaf28; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY classificationnode + ADD CONSTRAINT fk5880a9fc94b6895ddcd5f425eb0aaf28 FOREIGN KEY (description_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4868 (class 2606 OID 104339) +-- Name: fk5880a9fc94b6895dea660529; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY registrypackage + ADD CONSTRAINT fk5880a9fc94b6895dea660529 FOREIGN KEY (description_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4859 (class 2606 OID 104307) +-- Name: fk5880a9fcc7a8a06c; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY registryobject + ADD CONSTRAINT fk5880a9fcc7a8a06c FOREIGN KEY (name_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4786 (class 2606 OID 103915) +-- Name: fk5880a9fcc7a8a06c134a8c05; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY auditableevent + ADD CONSTRAINT fk5880a9fcc7a8a06c134a8c05 FOREIGN KEY (name_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4885 (class 2606 OID 104447) +-- Name: fk5880a9fcc7a8a06c1e21ad3d; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY subscription + ADD CONSTRAINT fk5880a9fcc7a8a06c1e21ad3d FOREIGN KEY (name_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4869 (class 2606 OID 104361) +-- Name: fk5880a9fcc7a8a06c26f496; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY role + ADD CONSTRAINT fk5880a9fcc7a8a06c26f496 FOREIGN KEY (name_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4816 (class 2606 OID 104082) +-- Name: fk5880a9fcc7a8a06c2d45dd0b; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY notification + ADD CONSTRAINT fk5880a9fcc7a8a06c2d45dd0b FOREIGN KEY (name_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4873 (class 2606 OID 104385) +-- Name: fk5880a9fcc7a8a06c44524630; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY servicebinding + ADD CONSTRAINT fk5880a9fcc7a8a06c44524630 FOREIGN KEY (name_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4824 (class 2606 OID 104124) +-- Name: fk5880a9fcc7a8a06c50104153; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY organization + ADD CONSTRAINT fk5880a9fcc7a8a06c50104153 FOREIGN KEY (name_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4802 (class 2606 OID 104004) +-- Name: fk5880a9fcc7a8a06c56d1a6f4; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY externalidentifier + ADD CONSTRAINT fk5880a9fcc7a8a06c56d1a6f4 FOREIGN KEY (name_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4784 (class 2606 OID 103903) +-- Name: fk5880a9fcc7a8a06c5e328461; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY association + ADD CONSTRAINT fk5880a9fcc7a8a06c5e328461 FOREIGN KEY (name_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4875 (class 2606 OID 104397) +-- Name: fk5880a9fcc7a8a06c75b47b4a; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY serviceendpoint + ADD CONSTRAINT fk5880a9fcc7a8a06c75b47b4a FOREIGN KEY (name_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4810 (class 2606 OID 104050) +-- Name: fk5880a9fcc7a8a06c85f55363; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY federation + ADD CONSTRAINT fk5880a9fcc7a8a06c85f55363 FOREIGN KEY (name_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4838 (class 2606 OID 104191) +-- Name: fk5880a9fcc7a8a06c8e488775; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY person + ADD CONSTRAINT fk5880a9fcc7a8a06c8e488775 FOREIGN KEY (name_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4804 (class 2606 OID 104021) +-- Name: fk5880a9fcc7a8a06cb72bfe85; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY externallink + ADD CONSTRAINT fk5880a9fcc7a8a06cb72bfe85 FOREIGN KEY (name_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4850 (class 2606 OID 104258) +-- Name: fk5880a9fcc7a8a06cca0a881b; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY querydefinition + ADD CONSTRAINT fk5880a9fcc7a8a06cca0a881b FOREIGN KEY (name_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4877 (class 2606 OID 104409) +-- Name: fk5880a9fcc7a8a06ccdb3c624; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY serviceinterface + ADD CONSTRAINT fk5880a9fcc7a8a06ccdb3c624 FOREIGN KEY (name_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4895 (class 2606 OID 104504) +-- Name: fk5880a9fcc7a8a06cce4002f5; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY workflowaction + ADD CONSTRAINT fk5880a9fcc7a8a06cce4002f5 FOREIGN KEY (name_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4808 (class 2606 OID 104033) +-- Name: fk5880a9fcc7a8a06cd97867b6; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY extrinsicobject + ADD CONSTRAINT fk5880a9fcc7a8a06cd97867b6 FOREIGN KEY (name_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4871 (class 2606 OID 104373) +-- Name: fk5880a9fcc7a8a06cd97c5e95; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY service + ADD CONSTRAINT fk5880a9fcc7a8a06cd97c5e95 FOREIGN KEY (name_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4857 (class 2606 OID 104295) +-- Name: fk5880a9fcc7a8a06cdab6945d; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY registry + ADD CONSTRAINT fk5880a9fcc7a8a06cdab6945d FOREIGN KEY (name_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4790 (class 2606 OID 103937) +-- Name: fk5880a9fcc7a8a06cdb110006; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY classification + ADD CONSTRAINT fk5880a9fcc7a8a06cdb110006 FOREIGN KEY (name_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4794 (class 2606 OID 103962) +-- Name: fk5880a9fcc7a8a06cdcd5f4255afc854b; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY classificationscheme + ADD CONSTRAINT fk5880a9fcc7a8a06cdcd5f4255afc854b FOREIGN KEY (name_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4792 (class 2606 OID 103950) +-- Name: fk5880a9fcc7a8a06cdcd5f425eb0aaf28; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY classificationnode + ADD CONSTRAINT fk5880a9fcc7a8a06cdcd5f425eb0aaf28 FOREIGN KEY (name_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4866 (class 2606 OID 104349) +-- Name: fk5880a9fcc7a8a06cea660529; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY registrypackage + ADD CONSTRAINT fk5880a9fcc7a8a06cea660529 FOREIGN KEY (name_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4863 (class 2606 OID 104322) +-- Name: fk5a5faa17239c540c; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY registryobject_externalidentifier + ADD CONSTRAINT fk5a5faa17239c540c FOREIGN KEY (externalidentifier_id) REFERENCES externalidentifier(id); + + +-- +-- TOC entry 4842 (class 2606 OID 104216) +-- Name: fk62fd9d6287a0de2; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY person_emailaddress + ADD CONSTRAINT fk62fd9d6287a0de2 FOREIGN KEY (emailaddress_key) REFERENCES emailaddress(key); + + +-- +-- TOC entry 4843 (class 2606 OID 104211) +-- Name: fk62fd9d62f14343cc; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY person_emailaddress + ADD CONSTRAINT fk62fd9d62f14343cc FOREIGN KEY (person_id) REFERENCES person(id); + + +-- +-- TOC entry 4856 (class 2606 OID 104278) +-- Name: fk6cbd175565b826e; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY query_slot + ADD CONSTRAINT fk6cbd175565b826e FOREIGN KEY (query_querydefinition) REFERENCES query(querydefinition); + + +-- +-- TOC entry 4855 (class 2606 OID 104283) +-- Name: fk6cbd1755791fb611; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY query_slot + ADD CONSTRAINT fk6cbd1755791fb611 FOREIGN KEY (child_slot_key) REFERENCES slot(key); + + +-- +-- TOC entry 4823 (class 2606 OID 104107) +-- Name: fk6f31e6c9791fb611; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY objectref_slot + ADD CONSTRAINT fk6f31e6c9791fb611 FOREIGN KEY (child_slot_key) REFERENCES slot(key); + + +-- +-- TOC entry 4822 (class 2606 OID 104112) +-- Name: fk6f31e6c9e422821c; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY objectref_slot + ADD CONSTRAINT fk6f31e6c9e422821c FOREIGN KEY (objectref_id) REFERENCES objectref(id); + + +-- +-- TOC entry 4864 (class 2606 OID 104327) +-- Name: fk71b7d7e8976827ec; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY registryobject_externallink + ADD CONSTRAINT fk71b7d7e8976827ec FOREIGN KEY (externallink_id) REFERENCES externallink(id); + + +-- +-- TOC entry 4780 (class 2606 OID 103880) +-- Name: fk74946a5618cc8927; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY action + ADD CONSTRAINT fk74946a5618cc8927 FOREIGN KEY (affectedobjectrefs_key) REFERENCES objectreflist(key); + + +-- +-- TOC entry 4781 (class 2606 OID 103875) +-- Name: fk74946a566900fa0c; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY action + ADD CONSTRAINT fk74946a566900fa0c FOREIGN KEY (affectedobjects_key) REFERENCES registryobjectlist(key); + + +-- +-- TOC entry 4796 (class 2606 OID 103972) +-- Name: fk7709e55b3af51bb6; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY deliveryinfo_slot + ADD CONSTRAINT fk7709e55b3af51bb6 FOREIGN KEY (deliveryinfo_key) REFERENCES deliveryinfo(key); + + +-- +-- TOC entry 4797 (class 2606 OID 103967) +-- Name: fk7709e55b791fb611; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY deliveryinfo_slot + ADD CONSTRAINT fk7709e55b791fb611 FOREIGN KEY (child_slot_key) REFERENCES slot(key); + + +-- +-- TOC entry 4888 (class 2606 OID 104457) +-- Name: fk7a416a43af51bb6; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY subscription_deliveryinfo + ADD CONSTRAINT fk7a416a43af51bb6 FOREIGN KEY (deliveryinfo_key) REFERENCES deliveryinfo(key); + + +-- +-- TOC entry 4887 (class 2606 OID 104462) +-- Name: fk7a416a458788cc; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY subscription_deliveryinfo + ADD CONSTRAINT fk7a416a458788cc FOREIGN KEY (subscription_id) REFERENCES subscription(id); + + +-- +-- TOC entry 4835 (class 2606 OID 104179) +-- Name: fk7c511145e6862f4; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY parameter_slot + ADD CONSTRAINT fk7c511145e6862f4 FOREIGN KEY (parameter_key) REFERENCES parameter(key); + + +-- +-- TOC entry 4836 (class 2606 OID 104174) +-- Name: fk7c51114791fb611; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY parameter_slot + ADD CONSTRAINT fk7c51114791fb611 FOREIGN KEY (child_slot_key) REFERENCES slot(key); + + +-- +-- TOC entry 4861 (class 2606 OID 104312) +-- Name: fk8312dc217486c946; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY registryobjectlist_registryobject + ADD CONSTRAINT fk8312dc217486c946 FOREIGN KEY (registryobjectlist_key) REFERENCES registryobjectlist(key); + + +-- +-- TOC entry 4837 (class 2606 OID 104196) +-- Name: fk8e488775305d8b4d; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY person + ADD CONSTRAINT fk8e488775305d8b4d FOREIGN KEY (personname_middlename, personname_lastname, personname_firstname) REFERENCES personname(middlename, lastname, firstname); + + +-- +-- TOC entry 4819 (class 2606 OID 104087) +-- Name: fk9a005b9886a370c; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY notification_auditableevent + ADD CONSTRAINT fk9a005b9886a370c FOREIGN KEY (notification_id) REFERENCES notification(id); + + +-- +-- TOC entry 4818 (class 2606 OID 104092) +-- Name: fk9a005b995d0eef7; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY notification_auditableevent + ADD CONSTRAINT fk9a005b995d0eef7 FOREIGN KEY (event_id) REFERENCES auditableevent(id); + + +-- +-- TOC entry 4883 (class 2606 OID 104430) +-- Name: fka056db9f791fb611; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY slot_slot + ADD CONSTRAINT fka056db9f791fb611 FOREIGN KEY (child_slot_key) REFERENCES slot(key); + + +-- +-- TOC entry 4882 (class 2606 OID 104435) +-- Name: fka056db9fd0b27a4e; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY slot_slot + ADD CONSTRAINT fka056db9fd0b27a4e FOREIGN KEY (slot_key) REFERENCES slot(key); + + +-- +-- TOC entry 4854 (class 2606 OID 104273) +-- Name: fka0fd8d9d791fb611; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY queryexpression_slot + ADD CONSTRAINT fka0fd8d9d791fb611 FOREIGN KEY (child_slot_key) REFERENCES slot(key); + + +-- +-- TOC entry 4828 (class 2606 OID 104139) +-- Name: fka7b968bf59e50e0c; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY organization_organization + ADD CONSTRAINT fka7b968bf59e50e0c FOREIGN KEY (organization_id) REFERENCES organization(id); + + +-- +-- TOC entry 4805 (class 2606 OID 104016) +-- Name: fkb72bfe856d351206; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY externallink + ADD CONSTRAINT fkb72bfe856d351206 FOREIGN KEY (externalref_key) REFERENCES simplelink(key); + + +-- +-- TOC entry 4812 (class 2606 OID 104060) +-- Name: fkba1f172c246c6800; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY internationalstring_localizedstring + ADD CONSTRAINT fkba1f172c246c6800 FOREIGN KEY (internationalstring_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4813 (class 2606 OID 104055) +-- Name: fkba1f172cee9b1d5a; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY internationalstring_localizedstring + ADD CONSTRAINT fkba1f172cee9b1d5a FOREIGN KEY (localizedstring_key) REFERENCES localizedstring(key); + + +-- +-- TOC entry 4853 (class 2606 OID 104263) +-- Name: fkbd1306518f9477c; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY querydefinition_parameter + ADD CONSTRAINT fkbd1306518f9477c FOREIGN KEY (querydefinition_id) REFERENCES querydefinition(id); + + +-- +-- TOC entry 4852 (class 2606 OID 104268) +-- Name: fkbd130655e6862f4; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY querydefinition_parameter + ADD CONSTRAINT fkbd130655e6862f4 FOREIGN KEY (parameter_key) REFERENCES parameter(key); + + +-- +-- TOC entry 4814 (class 2606 OID 104070) +-- Name: fkbfbdcb8f92e9c6ba; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY map_entry + ADD CONSTRAINT fkbfbdcb8f92e9c6ba FOREIGN KEY (entry_entryvalue_key, entry_entrykey_key) REFERENCES entry(entryvalue_key, entrykey_key); + + +-- +-- TOC entry 4815 (class 2606 OID 104065) +-- Name: fkbfbdcb8ffb10015a; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY map_entry + ADD CONSTRAINT fkbfbdcb8ffb10015a FOREIGN KEY (map_key) REFERENCES map(key); + + +-- +-- TOC entry 4849 (class 2606 OID 104241) +-- Name: fkc0fe08141cc2d914; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY postaladdress_slot + ADD CONSTRAINT fkc0fe08141cc2d914 FOREIGN KEY (postaladdress_key) REFERENCES postaladdress(key); + + +-- +-- TOC entry 4848 (class 2606 OID 104246) +-- Name: fkc0fe0814791fb611; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY postaladdress_slot + ADD CONSTRAINT fkc0fe0814791fb611 FOREIGN KEY (child_slot_key) REFERENCES slot(key); + + +-- +-- TOC entry 4783 (class 2606 OID 103885) +-- Name: fkc1c0b26772bc74be; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY action_slot + ADD CONSTRAINT fkc1c0b26772bc74be FOREIGN KEY (action_key) REFERENCES action(key); + + +-- +-- TOC entry 4782 (class 2606 OID 103890) +-- Name: fkc1c0b267791fb611; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY action_slot + ADD CONSTRAINT fkc1c0b267791fb611 FOREIGN KEY (child_slot_key) REFERENCES slot(key); + + +-- +-- TOC entry 4789 (class 2606 OID 103920) +-- Name: fkc76a3bd072bc74be; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY auditableevent_action + ADD CONSTRAINT fkc76a3bd072bc74be FOREIGN KEY (action_key) REFERENCES action(key); + + +-- +-- TOC entry 4788 (class 2606 OID 103925) +-- Name: fkc76a3bd086bc35ac; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY auditableevent_action + ADD CONSTRAINT fkc76a3bd086bc35ac FOREIGN KEY (auditableevent_id) REFERENCES auditableevent(id); + + +-- +-- TOC entry 4821 (class 2606 OID 104097) +-- Name: fkcffc8027caf899c6; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY objectreflist_objectref + ADD CONSTRAINT fkcffc8027caf899c6 FOREIGN KEY (objectreflist_key) REFERENCES objectreflist(key); + + +-- +-- TOC entry 4820 (class 2606 OID 104102) +-- Name: fkcffc8027e422821c; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY objectreflist_objectref + ADD CONSTRAINT fkcffc8027e422821c FOREIGN KEY (objectref_id) REFERENCES objectref(id); + + +-- +-- TOC entry 4807 (class 2606 OID 104038) +-- Name: fkd97867b6a9a5cc34; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY extrinsicobject + ADD CONSTRAINT fkd97867b6a9a5cc34 FOREIGN KEY (repositoryitemref_key) REFERENCES simplelink(key); + + +-- +-- TOC entry 4865 (class 2606 OID 104332) +-- Name: fkde84a81791fb611; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY registryobject_slot + ADD CONSTRAINT fkde84a81791fb611 FOREIGN KEY (child_slot_key) REFERENCES slot(key); + + +-- +-- TOC entry 4879 (class 2606 OID 104419) +-- Name: fkdeb465a04ee4881c; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY service_serviceendpoint + ADD CONSTRAINT fkdeb465a04ee4881c FOREIGN KEY (service_id) REFERENCES service(id); + + +-- +-- TOC entry 4880 (class 2606 OID 104414) +-- Name: fkdeb465a0ad801d9c; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY service_serviceendpoint + ADD CONSTRAINT fkdeb465a0ad801d9c FOREIGN KEY (serviceendpoint_id) REFERENCES serviceendpoint(id); + + +-- +-- TOC entry 4867 (class 2606 OID 104344) +-- Name: fkea6605297486c946; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY registrypackage + ADD CONSTRAINT fkea6605297486c946 FOREIGN KEY (registryobjectlist_key) REFERENCES registryobjectlist(key); + + +-- +-- TOC entry 4834 (class 2606 OID 104164) +-- Name: fkebf0d38994b6895d; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY parameter + ADD CONSTRAINT fkebf0d38994b6895d FOREIGN KEY (description_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4833 (class 2606 OID 104169) +-- Name: fkebf0d389c7a8a06c; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY parameter + ADD CONSTRAINT fkebf0d389c7a8a06c FOREIGN KEY (name_key) REFERENCES internationalstring(key); + + +-- +-- TOC entry 4889 (class 2606 OID 104467) +-- Name: fkf9067d82c36558c; Type: FK CONSTRAINT; Schema: ebxml; Owner: awips +-- + +ALTER TABLE ONLY taxonomyelementtype_classificationnode + ADD CONSTRAINT fkf9067d82c36558c FOREIGN KEY (classificationnode_id) REFERENCES classificationnode(id); + + +-- Completed on 2013-03-22 13:36:06 CDT + +-- +-- PostgreSQL database dump complete +-- + diff --git a/deltaScripts/13.4.1/tableNameUpdate.sql b/deltaScripts/13.4.1/tableNameUpdate.sql new file mode 100644 index 0000000000..fd87ae822f --- /dev/null +++ b/deltaScripts/13.4.1/tableNameUpdate.sql @@ -0,0 +1,13 @@ +ALTER TABLE localizedstrings RENAME TO localizedstring; +ALTER TABLE intlstring RENAME TO internationalstring; +ALTER TABLE intlstring_localizedstrings RENAME TO internationalstring_localizedstring; +ALTER TABLE internationalstring_localizedstring RENAME COLUMN intlstring_key TO internationalstring_key; +ALTER TABLE serviceinterfacetype RENAME TO serviceinterface; +ALTER TABLE stringqueryexpressiontype RENAME TO stringqueryexpression; +ALTER TABLE vocabularytermtype RENAME TO vocabularyterm; +ALTER TABLE xmlqueryexpressiontype RENAME TO xmlqueryexpression; +ALTER TABLE queryexpressiontype RENAME TO queryexpression; +ALTER TABLE queryexpressiontype_slot RENAME TO queryexpression_slot; +ALTER TABLE maptype RENAME TO map; +ALTER TABLE entrytype RENAME TO entry; +ALTER TABLE maptype_entrytype RENAME TO map_entry; diff --git a/edexOsgi/build.edex/esb/conf/db/hibernateConfig/ebxml/hibernate.cfg.xml b/edexOsgi/build.edex/esb/conf/db/hibernateConfig/ebxml/hibernate.cfg.xml deleted file mode 100644 index 91bbbf214d..0000000000 --- a/edexOsgi/build.edex/esb/conf/db/hibernateConfig/ebxml/hibernate.cfg.xml +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - org.postgresql.Driver - - - org.hibernate.dialect.PostgreSQLDialect - - - jdbc:postgresql://${db.addr}:${db.port}/ebxml - - awips - awips - - after_transaction - - 100 - - - - - false - - - false - - - false - - - org.hibernate.connection.C3P0ConnectionProvider - - - - 60 - 1800 - 10 - 5 - ${db.metadata.pool.min} - ${db.metadata.pool.max} - - true - org.hibernate.transaction.JDBCTransactionFactory - thread - ebxmlRegistryCache.xml - net.sf.ehcache.hibernate.EhCacheProvider - true - true - true - - - \ No newline at end of file diff --git a/edexOsgi/build.edex/esb/conf/db/hibernateConfig/metadata/hibernate.cfg.xml b/edexOsgi/build.edex/esb/conf/db/hibernateConfig/metadata/hibernate.cfg.xml index 1c918cfac5..79d4592acc 100644 --- a/edexOsgi/build.edex/esb/conf/db/hibernateConfig/metadata/hibernate.cfg.xml +++ b/edexOsgi/build.edex/esb/conf/db/hibernateConfig/metadata/hibernate.cfg.xml @@ -67,7 +67,7 @@ ${db.metadata.pool.max} false - + org.hibernate.transaction.JDBCTransactionFactory false false false diff --git a/edexOsgi/build.edex/esb/conf/spring/edex.xml b/edexOsgi/build.edex/esb/conf/spring/edex.xml index 8231a956c2..1506bca7e5 100644 --- a/edexOsgi/build.edex/esb/conf/spring/edex.xml +++ b/edexOsgi/build.edex/esb/conf/spring/edex.xml @@ -12,7 +12,7 @@ http://www.springframework.org/schema/util/spring-util-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> - + diff --git a/edexOsgi/build.edex/opt/db/ddl/ebxml/createEbxml.sql b/edexOsgi/build.edex/opt/db/ddl/ebxml/createEbxml.sql index e0f673869b..e279b26a72 100644 --- a/edexOsgi/build.edex/opt/db/ddl/ebxml/createEbxml.sql +++ b/edexOsgi/build.edex/opt/db/ddl/ebxml/createEbxml.sql @@ -18,8 +18,4 @@ * further licensing information. **/ \set ON_ERROR_STOP 1 -DROP DATABASE IF EXISTS ebxml; -DROP TABLESPACE IF EXISTS ebxml_data; -CREATE TABLESPACE ebxml_data OWNER awips LOCATION '%{database_files_home}%/ebxml'; -COMMENT ON TABLESPACE ebxml_data IS 'EBXML Registry Database tablespace'; -CREATE DATABASE ebxml OWNER awips TABLESPACE ebxml_data; +CREATE SCHEMA ebxml AUTHORIZATION awips; diff --git a/edexOsgi/com.raytheon.uf.common.datadelivery.event/src/com/raytheon/uf/common/datadelivery/event/notification/NotificationRecord.java b/edexOsgi/com.raytheon.uf.common.datadelivery.event/src/com/raytheon/uf/common/datadelivery/event/notification/NotificationRecord.java index bc6995afcc..e615aa4031 100644 --- a/edexOsgi/com.raytheon.uf.common.datadelivery.event/src/com/raytheon/uf/common/datadelivery/event/notification/NotificationRecord.java +++ b/edexOsgi/com.raytheon.uf.common.datadelivery.event/src/com/raytheon/uf/common/datadelivery/event/notification/NotificationRecord.java @@ -13,6 +13,7 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; +import com.raytheon.uf.common.dataplugin.persist.IPersistableDataObject; import com.raytheon.uf.common.serialization.ISerializableObject; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @@ -28,6 +29,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Mar 1, 2012 jsanchez Initial creation + * 3/18/2012 1802 bphillip Modified to implement IPersistableDataObject * * * @@ -39,7 +41,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlRootElement @XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize -public class NotificationRecord implements ISerializableObject { +public class NotificationRecord implements ISerializableObject, + IPersistableDataObject { @GeneratedValue(strategy = GenerationType.AUTO) @Id @@ -119,4 +122,9 @@ public class NotificationRecord implements ISerializableObject { this.message = message; } + @Override + public Integer getIdentifier() { + return this.id; + } + } diff --git a/edexOsgi/com.raytheon.uf.common.registry.ebxml/META-INF/MANIFEST.MF b/edexOsgi/com.raytheon.uf.common.registry.ebxml/META-INF/MANIFEST.MF index bf12ea2f36..1fa559c6db 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.ebxml/META-INF/MANIFEST.MF +++ b/edexOsgi/com.raytheon.uf.common.registry.ebxml/META-INF/MANIFEST.MF @@ -21,5 +21,7 @@ Require-Bundle: org.apache.commons.codec;bundle-version="1.4.0", com.raytheon.uf.common.status;bundle-version="1.12.1174", com.raytheon.uf.common.comm;bundle-version="1.12.1174", com.raytheon.uf.common.time;bundle-version="1.12.1174", - org.apache.http;bundle-version="4.1.2" + org.apache.http;bundle-version="4.1.2", + com.raytheon.uf.common.dataplugin;bundle-version="1.12.1174", + org.springframework;bundle-version="2.5.6" Import-Package: com.vividsolutions.jts.geom diff --git a/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/FactoryRegistryHandler.java b/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/FactoryRegistryHandler.java index 7f937aa743..107648c833 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/FactoryRegistryHandler.java +++ b/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/FactoryRegistryHandler.java @@ -32,8 +32,10 @@ import oasis.names.tc.ebxml.regrep.xsd.rs.v4.RegistryExceptionType; import oasis.names.tc.ebxml.regrep.xsd.rs.v4.RegistryResponseType; import oasis.names.tc.ebxml.regrep.xsd.rs.v4.UnresolvedReferenceExceptionType; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + import com.google.common.annotations.VisibleForTesting; -import com.raytheon.uf.common.comm.CommunicationException; import com.raytheon.uf.common.registry.IMultipleResultFormatter; import com.raytheon.uf.common.registry.IResultFormatter; import com.raytheon.uf.common.registry.OperationStatus; @@ -68,11 +70,14 @@ import com.raytheon.uf.common.util.ReflectionException; * Aug 27, 2012 0743 djohnson Add handling for AssociationQuery objects. * Sep 14, 2012 1169 djohnson Add use of create only mode. * Feb 26, 2013 1643 djohnson Remove registry manager debug toggle. + * 3/18/2013 1802 bphillip Implemented transaction boundaries * * * * @author djohnson */ +@Service +@Transactional public class FactoryRegistryHandler implements RegistryHandler { @VisibleForTesting @@ -103,8 +108,6 @@ public class FactoryRegistryHandler implements RegistryHandler { private QueryManagerFactory queryManagerFactory; - private RegistryTxManager registryTxManager; - /** * Private constructor to disallow instance creation. */ @@ -145,18 +148,6 @@ public class FactoryRegistryHandler implements RegistryHandler { return queryManagerFactory; } - /** - * Getter method for the RegistryTxManager attribute. This attribute will be - * set using Spring dependency injection based on where the RegistryManager - * is called from. - * - * @return The RegistryTxManager to use for this instance of - * RegistryManager. - */ - public RegistryTxManager getRegistryTxManager() { - return registryTxManager; - } - /** * Setter method for the LifecycleManagerFactory attribute. This attribute * will be set using Spring dependency injection based on where the @@ -183,19 +174,6 @@ public class FactoryRegistryHandler implements RegistryHandler { this.queryManagerFactory = queryManagerFactory; } - /** - * Setter method for the RegistryTxManager attribute. This attribute will be - * set using Spring dependency injection based on where the RegistryManager - * is called from. - * - * @param registryTxManager - * The RegistryTxManager implementation to use for this instance - * of RegistryManager. - */ - public void setTxManager(RegistryTxManager registryTxManager) { - this.registryTxManager = registryTxManager; - } - private List getAssociations(QueryManager qm, String sourceObjectId, String targetObjectId, String associationType) throws MsgRegistryException { @@ -287,26 +265,21 @@ public class FactoryRegistryHandler implements RegistryHandler { * @return the response */ private , U> T processRequest( - Callable request, - T response) { - TxManager tx = registryTxManager.getTxManager(); + Callable request, T response) { + T calledResponse = null; try { - tx.startTransaction(); - - T calledResponse = request.call(); + calledResponse = request.call(); calledResponse.setStatus(OperationStatus.SUCCESS); - return calledResponse; } catch (WebServiceException e) { - return RegistryUtil.getFailedResponse(response, + calledResponse = RegistryUtil.getFailedResponse(response, new RegistryException( RegistryUtil.UNABLE_TO_CONNECT_TO_REGISTRY, e)); - } catch (CommunicationException e) { - return RegistryUtil.getFailedResponse(response, e); + } catch (Exception e) { + calledResponse = RegistryUtil.getFailedResponse(response, e); } catch (Throwable e) { - return RegistryUtil.getFailedResponse(response, e); - } finally { - tx.closeTransaction(); + calledResponse = RegistryUtil.getFailedResponse(response, e); } + return calledResponse; } /** @@ -328,8 +301,7 @@ public class FactoryRegistryHandler implements RegistryHandler { * @see RegistryManager.getRegistyObjects() */ private List getObjects(QueryManager qm, - RegistryQuery registryQuery) - throws MsgRegistryException { + RegistryQuery registryQuery) throws MsgRegistryException { ITimer timer = TimeUtil.getTimer(); timer.start(); @@ -350,8 +322,7 @@ public class FactoryRegistryHandler implements RegistryHandler { timer.stop(); long totalElapsedTime = timer.getElapsedTime(); if (debugLog) { - statusHandler.debug(totalElapsedTime - + " ms for entire query [" + statusHandler.debug(totalElapsedTime + " ms for entire query [" + registryQuery.getClass().getSimpleName() + "]: " + registryObjects.size() + " items returned"); } @@ -721,8 +692,7 @@ public class FactoryRegistryHandler implements RegistryHandler { */ @SuppressWarnings("unchecked") private List store(LifecycleManager lcm, QueryManager qm, T object, - Mode mode) - throws MsgRegistryException, JAXBException, + Mode mode) throws MsgRegistryException, JAXBException, IllegalArgumentException, ReflectionException, SerializationException { List storedObjects = new ArrayList(); @@ -923,8 +893,7 @@ public class FactoryRegistryHandler implements RegistryHandler { * everytime */ private static void throwUnsuccessfulResponseException( - final RegistryResponseType response) - throws MsgRegistryException { + final RegistryResponseType response) throws MsgRegistryException { List exceptions = response.getException(); if (exceptions.isEmpty()) { throw new MsgRegistryException( diff --git a/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/RegistryTxManager.java b/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/RegistryTxManager.java deleted file mode 100644 index 01066fc4c8..0000000000 --- a/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/RegistryTxManager.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.raytheon.uf.common.registry.ebxml; - -import com.raytheon.uf.common.registry.RegistryManager; - - -/** - * - * Factory interface used by RegistryManager to obtains a particular client - * implementation for the registry's transaction management services. - * - *
- *
- * SOFTWARE HISTORY
- *
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * Mar 28, 2012            jspinks     Initial creation
- *
- * 
- * - * @author jspinks - * @version 1.0 - * - * @see RegistryManager - */ -public interface RegistryTxManager { - - /** - * Get a client implementation of the registry's transaction services. - * - * @return An implementation of TxManager. - * - * @see TxManager - */ - TxManager getTxManager(); -} 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 3b805d1b4b..af7a139436 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 @@ -184,8 +184,7 @@ public final class RegistryUtil { private static final Map SLOT_CONVERSION; static { - Map map = new HashMap( - 11); + Map map = new HashMap(11); // Load the SLOT_CONVERTER map, have to use the String equivalent of the // key since Class is not comparable... (which keys have to be). map.put(Long.class.getName(), IntegerSlotConverter.INSTANCE); @@ -198,7 +197,7 @@ public final class RegistryUtil { map.put(Double.class.getName(), DoubleSlotConverter.INSTANCE); map.put(float.class.getSimpleName(), DoubleSlotConverter.INSTANCE); map.put(double.class.getSimpleName(), DoubleSlotConverter.INSTANCE); - + map.put(boolean.class.getSimpleName(), BooleanSlotConverter.INSTANCE); map.put(Boolean.class.getName(), BooleanSlotConverter.INSTANCE); map.put(Date.class.getName(), DateSlotConverter.INSTANCE); @@ -454,10 +453,11 @@ public final class RegistryUtil { RegistryObject ro = c.getAnnotation(RegistryObject.class); - // Use the specified object type name or the current class name as the Object type if not specified. + // Use the specified object type name or the current class name + // as the Object type if not specified. Class objectType = ro.objectType(); - registryObjectType = (Object.class == objectType) ? c - .getName() : objectType.getName(); + registryObjectType = (Object.class == objectType) ? c.getName() + : objectType.getName(); if (ro.storeContent()) { // Store the Base64 encoded Object in a slot called @@ -784,8 +784,7 @@ public final class RegistryUtil { * @return the response */ public static , S> R getFailedResponse( - R response, - CommunicationException e) { + R response, CommunicationException e) { String message = e.getMessage(); String errorMessage = (message .indexOf(RegistryUtil.DATABASE_ERROR_MESSAGE) != -1) ? RegistryUtil.FAILED_TO_CONNECT_TO_DATABASE diff --git a/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/SOAPRegistryManager.java b/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/SOAPRegistryManager.java index 7fb2021efa..cccb8c60b1 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/SOAPRegistryManager.java +++ b/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/SOAPRegistryManager.java @@ -10,7 +10,6 @@ import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.LifecycleManagerSOA import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.QueryManager; import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.QueryManagerSOAPService; - /** * * A SOAP client implementation for use with the RegistryManager Class. @@ -30,12 +29,12 @@ import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.QueryManagerSOAPSer * @version 1.0 */ public abstract class SOAPRegistryManager implements LifecycleManagerFactory, - QueryManagerFactory, RegistryTxManager { + QueryManagerFactory { private static QName queryServiceName = new QName( "urn:oasis:names:tc:ebxml-regrep:wsdl:registry:interfaces:4.0", "QueryManagerService"); - + private static QName lcmServiceName = new QName( "urn:oasis:names:tc:ebxml-regrep:wsdl:registry:interfaces:4.0", "LifecycleManagerService"); @@ -45,11 +44,11 @@ public abstract class SOAPRegistryManager implements LifecycleManagerFactory, */ public SOAPRegistryManager() { } - + /** - * Get an implementation of LifeCycleManager that uses SOAP to submit + * Get an implementation of LifeCycleManager that uses SOAP to submit * requests to the registry. - * + * * @return A SOAP implementation of LifeCycleManager. * * @see LifecycleManagerFactory @@ -72,29 +71,16 @@ public abstract class SOAPRegistryManager implements LifecycleManagerFactory, } /** - * Get an implementation of TxManager to manage transactions - * with the registry. - * - * @return A implementation of TxManager. + * Get an implementation of QueryManager that uses SOAP to submit requests + * to the registry. * - * @see RegisryTxManager - */ - @Override - public TxManager getTxManager() { - return this.new NoTxManager(); - } - - /** - * Get an implementation of QueryManager that uses SOAP to submit - * requests to the registry. - * * @return A SOAP implementation of QueryManager. * * @see QueryManagerFactory */ @Override public QueryManager getQueryManager() { - + QueryManagerSOAPService qm; QueryManager a = null; try { @@ -104,35 +90,9 @@ public abstract class SOAPRegistryManager implements LifecycleManagerFactory, } catch (MalformedURLException e) { } - + return a; } - - /** - * Inner class to implement the TxManager interface. The transaction - * management for the SOAP client is handled by the webservice itself, - * so no additional transaction management is required. As such, this - * NoTxManager implementation simply fulfills the RegistryManager - * requirement that a TxManager be specified. - */ - public class NoTxManager implements TxManager { - - /** - * Empty method since no additional transaction management - * with the registry is required. - */ - @Override - public void startTransaction() { - } - - /** - * Empty method since no additional transaction management - * with the registry is required. - */ - @Override - public void closeTransaction() { - } - } /** * Retrieve the url to the query manager service. diff --git a/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/TxManager.java b/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/TxManager.java deleted file mode 100644 index 29068bd8be..0000000000 --- a/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/ebxml/TxManager.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.raytheon.uf.common.registry.ebxml; - -import com.raytheon.uf.common.registry.RegistryManager; - -import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.QueryManager; - -/** - * Interface for controlling the transaction management of the - * RegistryManager Class. RegistryManager will call methods on - * this interface to control transactions with the registry services - * provided by LifecycleManager and QueryManager clients. - * - *
- *
- * SOFTWARE HISTORY
- *
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * Mar 28, 2012            jspinks     Initial creation
- *
- * 
- * - * @author jspinks - * @version 1.0 - * - * @see LifecycleManager - * @see QueryManager - * @see RegistryManager - * @see RegistryTxManager - */ -public interface TxManager { - - /** - * Start a transaction with the registry. - * - * @throws Exception - */ - public void startTransaction() throws Exception; - - /** - * Close a transaction with the registry. - */ - public void closeTransaction(); -} diff --git a/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/handler/BaseRegistryObjectHandler.java b/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/handler/BaseRegistryObjectHandler.java index 7a7e1e51b7..15c14921b5 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/handler/BaseRegistryObjectHandler.java +++ b/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/handler/BaseRegistryObjectHandler.java @@ -24,6 +24,8 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; +import org.springframework.transaction.annotation.Transactional; + import com.raytheon.uf.common.registry.OperationStatus; import com.raytheon.uf.common.registry.RegistryManager; import com.raytheon.uf.common.registry.RegistryQueryResponse; @@ -51,12 +53,13 @@ import com.raytheon.uf.common.util.CollectionUtil; * Sep 17, 2012 1169 djohnson Initial creation * Sep 21, 2012 1187 djohnson Add bulk delete operations. * Oct 05, 2012 1195 djohnson Remove executeQuery method, add getById. + * 3/18/2013 1802 bphillip Implemented transaction boundaries * * * @author djohnson * @version 1.0 */ - +@Transactional public abstract class BaseRegistryObjectHandler> implements IRegistryObjectHandler { @@ -195,8 +198,7 @@ public abstract class BaseRegistryObjectHandler void checkResponse(RegistryResponse response, - T obj, - String operation) throws RegistryHandlerException { + T obj, String operation) throws RegistryHandlerException { if (response.getStatus() != OperationStatus.SUCCESS) { String message = "Unable to " + operation + " " + obj.getClass().getName() + "."; diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/META-INF/MANIFEST.MF b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/META-INF/MANIFEST.MF index 830bc8c53f..5e2c776fad 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/META-INF/MANIFEST.MF +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/META-INF/MANIFEST.MF @@ -7,7 +7,9 @@ Bundle-Vendor: RAYTHEON Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Require-Bundle: javax.persistence;bundle-version="1.0.0", org.hibernate;bundle-version="1.0.0", - com.raytheon.uf.common.serialization;bundle-version="1.12.1174" + com.raytheon.uf.common.serialization;bundle-version="1.12.1174", + com.raytheon.uf.common.dataplugin;bundle-version="1.12.1174", + com.raytheon.uf.edex.database;bundle-version="1.0.0" Export-Package: com.raytheon.uf.common.registry.schemas.ebxml.util, oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4, oasis.names.tc.ebxml.regrep.xsd.lcm.v4, diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject index ef742f9102..aef447cc31 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject @@ -2,4 +2,62 @@ oasis.names.tc.ebxml.regrep.xsd.lcm.v4.ObjectFactory oasis.names.tc.ebxml.regrep.xsd.query.v4.ObjectFactory oasis.names.tc.ebxml.regrep.xsd.rim.v4.ObjectFactory oasis.names.tc.ebxml.regrep.xsd.rs.v4.ObjectFactory -oasis.names.tc.ebxml.regrep.xsd.spi.v4.ObjectFactory \ No newline at end of file +oasis.names.tc.ebxml.regrep.xsd.spi.v4.ObjectFactory +oasis.names.tc.ebxml.regrep.xsd.rim.v4.ActionType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.AnyValueType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.AssociationType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.AuditableEventType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.BooleanValueType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.ClassificationNodeType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.ClassificationSchemeType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.ClassificationType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.CollectionValueType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.DateTimeValueType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.DeliveryInfoType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.DurationValueType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.EmailAddressType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.EntryType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.ExternalIdentifierType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.ExternalLinkType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.ExtrinsicObjectType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.FederationType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.FloatValueType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.IntegerValueType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.InternationalStringType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.InternationalStringValueType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.LocalizedStringType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.MapType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.MapValueType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.NotificationType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.ObjectRefListType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.ObjectRefType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.OrganizationType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.ParameterType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.PersonNameType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.PersonType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.PostalAddressType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.QueryDefinitionType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.QueryExpressionType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.QueryType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectListType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryPackageType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.RoleType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.ServiceBindingType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.ServiceEndpointType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.ServiceInterfaceType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.ServiceType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.SimpleLinkType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.SlotType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.SlotValueType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.StringQueryExpressionType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.StringValueType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.SubscriptionType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.TaxonomyElementType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.TelephoneNumberType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.ValueType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.VocabularyTermType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.VocabularyTermValueType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.WorkflowActionType +oasis.names.tc.ebxml.regrep.xsd.rim.v4.XMLQueryExpressionType diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ActionType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ActionType.java index 7c5f6e508e..c4e830376a 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ActionType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ActionType.java @@ -26,6 +26,7 @@ import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToOne; +import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -76,13 +77,14 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize @Entity @Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "Action") +@Table(schema = "ebxml", name = "Action") public class ActionType extends ExtensibleObjectType implements Serializable { private static final long serialVersionUID = -8469820571747325703L; @Id - @GeneratedValue + @SequenceGenerator(name = "ActionTypeGenerator", schema = "ebxml", sequenceName = "ebxml.Action_sequence") + @GeneratedValue(generator = "ActionTypeGenerator") @XmlTransient private Integer key; diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/AssociationType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/AssociationType.java index c0f71c0ef7..33bdb4e461 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/AssociationType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/AssociationType.java @@ -69,7 +69,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize @Entity @Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "Association") +@Table(schema = "ebxml", name = "Association") public class AssociationType extends RegistryObjectType { @XmlAttribute(required = true) diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/AuditableEventType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/AuditableEventType.java index 6213e605f8..2555019c79 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/AuditableEventType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/AuditableEventType.java @@ -26,6 +26,7 @@ import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.JoinTable; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; @@ -76,12 +77,13 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlType(name = "AuditableEventType", propOrder = { "action" }) @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "AuditableEvent") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "AuditableEvent") public class AuditableEventType extends RegistryObjectType { @XmlElement(name = "Action", required = true) @DynamicSerializeElement @OneToMany(cascade = CascadeType.ALL) + @JoinTable(schema = "ebxml") protected List action; @Column diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/BooleanValueType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/BooleanValueType.java index 194f2eb425..54b178787a 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/BooleanValueType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/BooleanValueType.java @@ -67,7 +67,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize @Entity @Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "BooleanValue") +@Table(schema = "ebxml", name = "BooleanValue") public class BooleanValueType extends ValueType { @Column(name = COLUMN_NAME) diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ClassificationNodeType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ClassificationNodeType.java index 8ec08636f2..fbfdd59b61 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ClassificationNodeType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ClassificationNodeType.java @@ -67,7 +67,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize @Entity @Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "ClassificationNode") +@Table(schema = "ebxml", name = "ClassificationNode") public class ClassificationNodeType extends TaxonomyElementType { @XmlAttribute diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ClassificationSchemeType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ClassificationSchemeType.java index a64aae5d3a..65802ca9bf 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ClassificationSchemeType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ClassificationSchemeType.java @@ -64,8 +64,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlType(name = "ClassificationSchemeType") @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL, include = "all") -@Table(name = "ClassificationScheme") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL, include = "all") +@Table(schema = "ebxml", name = "ClassificationScheme") public class ClassificationSchemeType extends TaxonomyElementType { @XmlAttribute(required = true) diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ClassificationType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ClassificationType.java index ab08948d1a..b90e9f64f2 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ClassificationType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ClassificationType.java @@ -68,7 +68,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize @Entity @Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "Classification") +@Table(schema = "ebxml", name = "Classification") public class ClassificationType extends RegistryObjectType { @XmlAttribute diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/CollectionValueType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/CollectionValueType.java index 26f1994301..e4668bfd62 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/CollectionValueType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/CollectionValueType.java @@ -26,6 +26,7 @@ import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; @@ -74,14 +75,15 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlType(name = "CollectionValueType", propOrder = { "collectionValue" }) @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "CollectionValue") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "CollectionValue") public class CollectionValueType extends ValueType { @XmlElement(name = "Element") @DynamicSerializeElement @Column(name = COLUMN_NAME) @ManyToMany(cascade = CascadeType.ALL) + @JoinTable(schema = "ebxml") protected List collectionValue; @XmlAttribute diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/DateTimeValueType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/DateTimeValueType.java index 5dedb2c2d9..0fcf85bff1 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/DateTimeValueType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/DateTimeValueType.java @@ -70,7 +70,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize @Entity @Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "DateTimeValue") +@Table(schema = "ebxml", name = "DateTimeValue") public class DateTimeValueType extends ValueType { @Column(name = "DateTimeValue") diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/DeliveryInfoType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/DeliveryInfoType.java index 3d35edc27f..8b07bd4507 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/DeliveryInfoType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/DeliveryInfoType.java @@ -23,6 +23,7 @@ package oasis.names.tc.ebxml.regrep.xsd.rim.v4; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.Transient; import javax.xml.bind.annotation.XmlAccessType; @@ -74,12 +75,13 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlType(name = "DeliveryInfoType") @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "DeliveryInfo") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "DeliveryInfo") public class DeliveryInfoType extends ExtensibleObjectType { @Id - @GeneratedValue + @SequenceGenerator(name = "DeliveryInfoTypeGenerator", schema = "ebxml", sequenceName = "ebxml.DeliveryInfo_sequence") + @GeneratedValue(generator = "DeliveryInfoTypeGenerator") @XmlTransient private Integer key; diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/DurationValueType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/DurationValueType.java index 118d0d0b00..dba63563d6 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/DurationValueType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/DurationValueType.java @@ -68,8 +68,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlType(name = "DurationValueType", propOrder = { "durationValue" }) @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "DurationType") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "DurationValue") public class DurationValueType extends ValueType { @XmlElement(name = "Value") diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/EmailAddressType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/EmailAddressType.java index 0466585bb1..576c82aff5 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/EmailAddressType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/EmailAddressType.java @@ -25,6 +25,7 @@ import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -67,14 +68,15 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlType(name = "EmailAddressType") @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "EmailAddress") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "EmailAddress") public class EmailAddressType extends ExtensibleObjectType implements Serializable { private static final long serialVersionUID = -2958054699149020163L; @Id - @GeneratedValue + @SequenceGenerator(name = "EmailAddressTypeGenerator", schema = "ebxml", sequenceName = "ebxml.EmailAddress_sequence") + @GeneratedValue(generator = "EmailAddressTypeGenerator") @XmlTransient private Integer key; diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/EntryType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/EntryType.java index c740bbb7da..f481f5787d 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/EntryType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/EntryType.java @@ -72,8 +72,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlType(name = "EntryType", propOrder = { "entryKey", "entryValue" }) @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "EntryType") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "Entry") public class EntryType implements Serializable { private static final long serialVersionUID = -641063902591977048L; diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ExtensibleObjectType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ExtensibleObjectType.java index 4907aeac36..9bfd1ff257 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ExtensibleObjectType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ExtensibleObjectType.java @@ -89,7 +89,7 @@ public abstract class ExtensibleObjectType { @BatchSize(size = 500) @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) - @JoinTable(inverseJoinColumns = @JoinColumn(name = "child_slot_key")) + @JoinTable(schema = "ebxml", inverseJoinColumns = @JoinColumn(name = "child_slot_key")) @XmlElement(name = "Slot") @DynamicSerializeElement protected Set slot; diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ExternalIdentifierType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ExternalIdentifierType.java index 76b9008acb..257b8748c1 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ExternalIdentifierType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ExternalIdentifierType.java @@ -67,7 +67,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize @Entity @Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "ExternalIdentifier") +@Table(schema = "ebxml", name = "ExternalIdentifier") public class ExternalIdentifierType extends RegistryObjectType { @XmlAttribute diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ExternalLinkType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ExternalLinkType.java index f1e622c6bc..9633f85a8c 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ExternalLinkType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ExternalLinkType.java @@ -70,7 +70,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize @Entity @Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "ExternalLink") +@Table(schema = "ebxml", name = "ExternalLink") public class ExternalLinkType extends RegistryObjectType { @XmlElement(name = "ExternalRef", required = true) diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ExtrinsicObjectType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ExtrinsicObjectType.java index d71538c3c0..fa0f7c8b86 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ExtrinsicObjectType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ExtrinsicObjectType.java @@ -21,7 +21,11 @@ package oasis.names.tc.ebxml.regrep.xsd.rim.v4; import javax.activation.DataHandler; +import javax.persistence.AttributeOverride; +import javax.persistence.AttributeOverrides; import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence.ManyToOne; import javax.persistence.Table; @@ -80,13 +84,16 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlSeeAlso({ CommentType.class }) @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "ExtrinsicObject") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "ExtrinsicObject") public class ExtrinsicObjectType extends RegistryObjectType { @XmlElement(name = "ContentVersionInfo") @DynamicSerializeElement - @ManyToOne(cascade = CascadeType.ALL) + @AttributeOverrides({ + @AttributeOverride(name = "versionName", column = @Column(name = "contentVersionName")), + @AttributeOverride(name = "userVersionName", column = @Column(name = "contentUserVersionName")) }) + @Embedded protected VersionInfoType contentVersionInfo; @XmlElement(name = "RepositoryItemRef") diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/FederationType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/FederationType.java index 97114350c2..44292210b4 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/FederationType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/FederationType.java @@ -64,7 +64,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize @Entity @Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "Federation") +@Table(schema = "ebxml", name = "Federation") public class FederationType extends RegistryObjectType { @Transient diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/FloatValueType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/FloatValueType.java index 6de5e58e4e..1409009743 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/FloatValueType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/FloatValueType.java @@ -67,7 +67,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize @Entity @Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "FloatValue") +@Table(schema = "ebxml", name = "FloatValue") public class FloatValueType extends ValueType { @Column(name = COLUMN_NAME) @XmlElement(name = "Value") diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/IdentifiableType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/IdentifiableType.java index 2f0ec142a8..7902f2de58 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/IdentifiableType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/IdentifiableType.java @@ -32,6 +32,7 @@ import javax.xml.bind.annotation.XmlType; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; +import com.raytheon.uf.common.dataplugin.persist.IPersistableDataObject; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @@ -66,8 +67,9 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlSeeAlso({ RegistryObjectType.class }) @DynamicSerialize @MappedSuperclass -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL, include = "all") -public abstract class IdentifiableType extends ExtensibleObjectType { +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL, include = "all") +public abstract class IdentifiableType extends ExtensibleObjectType implements + IPersistableDataObject { @Id @XmlAttribute(required = true) @@ -95,4 +97,8 @@ public abstract class IdentifiableType extends ExtensibleObjectType { this.id = value; } + public String getIdentifier() { + return id; + } + } diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/IntegerValueType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/IntegerValueType.java index 3daccba6b2..ec605b1a63 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/IntegerValueType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/IntegerValueType.java @@ -69,7 +69,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize @Entity @Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "IntegerValue") +@Table(schema = "ebxml", name = "IntegerValue") public class IntegerValueType extends ValueType { @Column(name = COLUMN_NAME) @XmlElement(name = "Value") diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/InternationalStringType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/InternationalStringType.java index b2b9620662..b9e76fa753 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/InternationalStringType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/InternationalStringType.java @@ -29,7 +29,9 @@ import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.JoinTable; import javax.persistence.OneToMany; +import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -78,20 +80,22 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize @XmlType(name = "InternationalStringType", propOrder = { "localizedString" }) @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL, include = "all") -@Table(name = "IntlString") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL, include = "all") +@Table(schema = "ebxml", name = "InternationalString") public class InternationalStringType implements Serializable { private static final long serialVersionUID = 2414977045816695691L; @Id - @GeneratedValue + @SequenceGenerator(name = "InternationalStringTypeGenerator", schema = "ebxml", sequenceName = "ebxml.InternationalString_sequence") + @GeneratedValue(generator = "InternationalStringTypeGenerator") @XmlTransient private Integer key; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) @XmlElement(name = "LocalizedString") @DynamicSerializeElement + @JoinTable(schema = "ebxml") protected List localizedString; /** diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/InternationalStringValueType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/InternationalStringValueType.java index b429c713a1..21cbe814ab 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/InternationalStringValueType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/InternationalStringValueType.java @@ -69,7 +69,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize @Entity @Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "InternationalStringValue") +@Table(schema = "ebxml", name = "InternationalStringValue") public class InternationalStringValueType extends ValueType { @XmlElement(name = "Value") diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/LocalizedStringType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/LocalizedStringType.java index 71867d86bd..6317b39f29 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/LocalizedStringType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/LocalizedStringType.java @@ -24,6 +24,7 @@ import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -70,12 +71,13 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlType(name = "LocalizedStringType") @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "LocalizedStrings") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "LocalizedString") public class LocalizedStringType { @Id - @GeneratedValue + @SequenceGenerator(name = "LocalizedStringTypeGenerator", schema = "ebxml", sequenceName = "ebxml.LocalizedString_sequence") + @GeneratedValue(generator = "LocalizedStringTypeGenerator") @XmlTransient private Integer key; diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/MapType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/MapType.java index c9bd281fac..3ddc8fda8e 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/MapType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/MapType.java @@ -27,7 +27,9 @@ import java.util.List; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.JoinTable; import javax.persistence.ManyToMany; +import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -75,14 +77,15 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlType(name = "MapType", propOrder = { "entry" }) @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "MapType") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "Map") public class MapType implements Serializable { private static final long serialVersionUID = 5533297201296624269L; @Id - @GeneratedValue + @SequenceGenerator(name = "MapTypeGenerator", schema = "ebxml", sequenceName = "ebxml.Map_sequence") + @GeneratedValue(generator = "MapTypeGenerator") @XmlTransient protected Integer key; @@ -94,6 +97,7 @@ public class MapType implements Serializable { @DynamicSerializeElement @Cascade(value = { org.hibernate.annotations.CascadeType.SAVE_UPDATE }) @ManyToMany + @JoinTable(schema = "ebxml") protected List entry; /** diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/NotificationType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/NotificationType.java index 6d27fc3f8c..5016eee318 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/NotificationType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/NotificationType.java @@ -25,6 +25,7 @@ import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Entity; +import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; @@ -70,13 +71,14 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlType(name = "NotificationType", propOrder = { "event" }) @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "Notification") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "Notification") public class NotificationType extends RegistryObjectType { @XmlElement(name = "Event", required = true) @DynamicSerializeElement @ManyToMany(cascade = CascadeType.ALL) + @JoinTable(schema = "ebxml") protected List event; @XmlAttribute(required = true) diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ObjectRefListType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ObjectRefListType.java index a5a501f12a..19cc8ae9a8 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ObjectRefListType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ObjectRefListType.java @@ -27,7 +27,9 @@ import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.JoinTable; import javax.persistence.ManyToMany; +import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -73,18 +75,20 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlType(name = "ObjectRefListType", propOrder = { "objectRef" }) @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "ObjectRefList") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "ObjectRefList") public class ObjectRefListType { @Id - @GeneratedValue + @SequenceGenerator(name = "ObjectRefListTypeGenerator", schema = "ebxml", sequenceName = "ebxml.ObjectRefList_sequence") + @GeneratedValue(generator = "ObjectRefListTypeGenerator") @XmlTransient private Integer key; @XmlElement(name = "ObjectRef") @DynamicSerializeElement @ManyToMany(cascade = CascadeType.ALL) + @JoinTable(schema = "ebxml") protected List objectRef; public Integer getKey() { @@ -121,7 +125,6 @@ public class ObjectRefListType { return this.objectRef; } - public void setObjectRef(List objectRef) { this.objectRef = objectRef; } 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 892d3975e3..396597365f 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 @@ -33,6 +33,7 @@ import javax.xml.bind.annotation.XmlType; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; +import com.raytheon.uf.common.dataplugin.persist.IPersistableDataObject; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @@ -66,9 +67,10 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlSeeAlso({ DynamicObjectRefType.class }) @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "ObjectRef") -public class ObjectRefType extends ExtensibleObjectType { +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "ObjectRef") +public class ObjectRefType extends ExtensibleObjectType implements + IPersistableDataObject { @Id @XmlAttribute(required = true) @@ -96,4 +98,9 @@ public class ObjectRefType extends ExtensibleObjectType { this.id = value; } + @Override + public String getIdentifier() { + return getId(); + } + } diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/OrganizationType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/OrganizationType.java index ff37e3fb30..e8f1d76f72 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/OrganizationType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/OrganizationType.java @@ -25,6 +25,7 @@ import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Entity; +import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; @@ -70,13 +71,14 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlType(name = "OrganizationType", propOrder = { "organization" }) @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "Organization") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "Organization") public class OrganizationType extends PartyType { @XmlElement(name = "Organization") @DynamicSerializeElement @ManyToMany(cascade = CascadeType.ALL) + @JoinTable(schema = "ebxml") protected List organization; @XmlAttribute diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ParameterType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ParameterType.java index 52c3872459..728aa84d67 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ParameterType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ParameterType.java @@ -28,6 +28,7 @@ import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToOne; +import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -82,12 +83,13 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlType(name = "ParameterType", propOrder = { "name", "description" }) @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "Parameter") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "Parameter") public class ParameterType extends ExtensibleObjectType implements Serializable { @Id - @GeneratedValue + @SequenceGenerator(name = "ParameterTypeGenerator", schema = "ebxml", sequenceName = "ebxml.Parameter_sequence") + @GeneratedValue(generator = "ParameterTypeGenerator") @XmlTransient protected Integer key; diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/PartyType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/PartyType.java index b644be8f65..6eac490d8d 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/PartyType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/PartyType.java @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.List; import javax.persistence.CascadeType; +import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.MappedSuperclass; import javax.xml.bind.annotation.XmlAccessType; @@ -74,16 +75,19 @@ public abstract class PartyType extends RegistryObjectType { @XmlElement(name = "PostalAddress") @DynamicSerializeElement @ManyToMany(cascade = CascadeType.ALL) + @JoinTable(schema = "ebxml") protected List postalAddress; @XmlElement(name = "TelephoneNumber") @DynamicSerializeElement @ManyToMany(cascade = CascadeType.ALL) + @JoinTable(schema = "ebxml") protected List telephoneNumber; @XmlElement(name = "EmailAddress") @DynamicSerializeElement @ManyToMany(cascade = CascadeType.ALL) + @JoinTable(schema = "ebxml") protected List emailAddress; /** diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/PersonNameType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/PersonNameType.java index 5899e960a2..ecda086cc6 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/PersonNameType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/PersonNameType.java @@ -67,7 +67,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize @Entity @Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "PersonName") +@Table(schema = "ebxml", name = "PersonName") public class PersonNameType extends ExtensibleObjectType implements Serializable { diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/PersonType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/PersonType.java index 650f3c1e36..a0569bdcf1 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/PersonType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/PersonType.java @@ -66,7 +66,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize @Entity @Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "Person") +@Table(schema = "ebxml", name = "Person") public class PersonType extends PartyType { @XmlElement(name = "PersonName") diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/PostalAddressType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/PostalAddressType.java index 00c3ecf24b..90c3d7f7a3 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/PostalAddressType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/PostalAddressType.java @@ -23,6 +23,7 @@ package oasis.names.tc.ebxml.regrep.xsd.rim.v4; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -70,12 +71,13 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlType(name = "PostalAddressType") @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "PostalAddress") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "PostalAddress") public class PostalAddressType extends ExtensibleObjectType { @Id - @GeneratedValue + @SequenceGenerator(name = "PostalAddressTypeGenerator", schema = "ebxml", sequenceName = "ebxml.PostalAddress_sequence") + @GeneratedValue(generator = "PostalAddressTypeGenerator") @XmlTransient private Integer key; diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/QueryDefinitionType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/QueryDefinitionType.java index 15e3dcf379..d4852966d8 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/QueryDefinitionType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/QueryDefinitionType.java @@ -25,6 +25,7 @@ import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Entity; +import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.Table; @@ -73,13 +74,14 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; "queryExpression" }) @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "QueryDefinition") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "QueryDefinition") public class QueryDefinitionType extends RegistryObjectType { @ManyToMany(cascade = CascadeType.ALL) @XmlElement(name = "Parameter") @DynamicSerializeElement + @JoinTable(schema = "ebxml") protected List parameter; @ManyToOne(cascade = CascadeType.ALL) diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/QueryExpressionType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/QueryExpressionType.java index ddfbff1f75..c2baf54f25 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/QueryExpressionType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/QueryExpressionType.java @@ -25,6 +25,8 @@ import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; +import javax.persistence.SequenceGenerator; +import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; @@ -71,12 +73,14 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlSeeAlso({ StringQueryExpressionType.class, XMLQueryExpressionType.class }) @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "QueryExpression") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public class QueryExpressionType extends ExtensibleObjectType { @Id - @GeneratedValue + @SequenceGenerator(name = "QueryExpressionTypeGenerator", schema = "ebxml", sequenceName = "ebxml.QueryExpression_sequence") + @GeneratedValue(generator = "QueryExpressionTypeGenerator") @XmlTransient protected Integer key; diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/QueryType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/QueryType.java index d9bee8a88e..70b233d3eb 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/QueryType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/QueryType.java @@ -65,7 +65,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize @Entity @Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "Query") +@Table(schema = "ebxml", name = "Query") public class QueryType extends ExtensibleObjectType { @Id @XmlAttribute(required = true) diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/RegistryObjectListType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/RegistryObjectListType.java index 58ee8da217..2a45a3931a 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/RegistryObjectListType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/RegistryObjectListType.java @@ -27,7 +27,9 @@ import java.util.List; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.JoinTable; import javax.persistence.ManyToMany; +import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -74,20 +76,22 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlType(name = "RegistryObjectListType", propOrder = { "registryObject" }) @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "RegistryObjectList") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "RegistryObjectList") public class RegistryObjectListType implements Serializable { private static final long serialVersionUID = -254507015539461400L; @Id - @GeneratedValue + @SequenceGenerator(name = "RegistryObjectListTypeGenerator", schema = "ebxml", sequenceName = "ebxml.RegistryObjectList_sequence") + @GeneratedValue(generator = "RegistryObjectListTypeGenerator") @XmlTransient private Integer key; @ManyToMany @Cascade(value = { org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DETACH }) + @JoinTable(schema = "ebxml") @XmlElement(name = "RegistryObject") @DynamicSerializeElement protected List registryObject; diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/RegistryObjectType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/RegistryObjectType.java index 5e566b091f..03b3f2e06d 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/RegistryObjectType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/RegistryObjectType.java @@ -24,12 +24,13 @@ import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; +import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; +import javax.persistence.JoinTable; import javax.persistence.ManyToMany; -import javax.persistence.ManyToOne; import javax.persistence.OneToOne; import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; @@ -102,7 +103,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @Entity @Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL, include = "all") @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) -@Table(name = "RegistryObject") +@Table(schema = "ebxml", name = "RegistryObject") public class RegistryObjectType extends IdentifiableType { @XmlElement(name = "Name") @DynamicSerializeElement @@ -116,8 +117,7 @@ public class RegistryObjectType extends IdentifiableType { @XmlElement(name = "VersionInfo") @DynamicSerializeElement - @Cascade(value = { org.hibernate.annotations.CascadeType.DETACH }) - @ManyToOne(fetch = FetchType.LAZY) + @Embedded protected VersionInfoType versionInfo; @XmlElement(name = "Classification") @@ -125,6 +125,7 @@ public class RegistryObjectType extends IdentifiableType { @Cascade(value = { org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DETACH }) @ManyToMany(fetch = FetchType.LAZY) + @JoinTable(schema = "ebxml") protected Set classification; @XmlElement(name = "ExternalIdentifier") @@ -132,6 +133,7 @@ public class RegistryObjectType extends IdentifiableType { @Cascade(value = { org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DETACH }) @ManyToMany(fetch = FetchType.LAZY) + @JoinTable(schema = "ebxml") protected Set externalIdentifier; @XmlElement(name = "ExternalLink") @@ -139,6 +141,7 @@ public class RegistryObjectType extends IdentifiableType { @Cascade(value = { org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DETACH }) @ManyToMany(fetch = FetchType.LAZY) + @JoinTable(schema = "ebxml") protected Set externalLink; @XmlAttribute diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/RegistryPackageType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/RegistryPackageType.java index 8cbd7bda78..de5151414d 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/RegistryPackageType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/RegistryPackageType.java @@ -69,7 +69,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize @Entity @Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "RegistryPackage") +@Table(schema = "ebxml", name = "RegistryPackage") public class RegistryPackageType extends RegistryObjectType { @OneToOne(cascade = CascadeType.ALL) diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/RegistryType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/RegistryType.java index db762c78e2..aa7ae187e4 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/RegistryType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/RegistryType.java @@ -79,7 +79,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize @Entity @Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "Registry") +@Table(schema = "ebxml", name = "Registry") public class RegistryType extends RegistryObjectType { @XmlAttribute(required = true) diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/RoleType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/RoleType.java index 16bec0f17f..9cbfee0cbf 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/RoleType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/RoleType.java @@ -66,7 +66,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize @Entity @Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "Role") +@Table(schema = "ebxml", name = "Role") public class RoleType extends RegistryObjectType { @XmlAttribute(required = true) diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ServiceBindingType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ServiceBindingType.java index 7f472129b5..b0da80f34f 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ServiceBindingType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ServiceBindingType.java @@ -64,7 +64,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize @Entity @Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "ServiceBinding") +@Table(schema = "ebxml", name = "ServiceBinding") public class ServiceBindingType extends RegistryObjectType { @XmlAttribute diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ServiceEndpointType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ServiceEndpointType.java index 1037bc7b92..aac0a56ec1 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ServiceEndpointType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ServiceEndpointType.java @@ -67,7 +67,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize @Entity @Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "ServiceEndpoint") +@Table(schema = "ebxml", name = "ServiceEndpoint") public class ServiceEndpointType extends RegistryObjectType { @XmlAttribute diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ServiceInterfaceType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ServiceInterfaceType.java index 7aafc9d8bb..23505236a1 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ServiceInterfaceType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ServiceInterfaceType.java @@ -23,6 +23,7 @@ package oasis.names.tc.ebxml.regrep.xsd.rim.v4; import javax.persistence.Entity; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; +import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -62,7 +63,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; @XmlType(name = "ServiceInterfaceType") @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "ServiceInterface") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public class ServiceInterfaceType extends RegistryObjectType { diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ServiceType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ServiceType.java index b7f7083046..5cd47fa7f7 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ServiceType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ServiceType.java @@ -25,6 +25,7 @@ import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Entity; +import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; @@ -72,13 +73,14 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlType(name = "ServiceType", propOrder = { "serviceEndpoint" }) @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "Service") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "Service") public class ServiceType extends RegistryObjectType { @ManyToMany(cascade = CascadeType.ALL) @XmlElement(name = "ServiceEndpoint") @DynamicSerializeElement + @JoinTable(schema = "ebxml") protected List serviceEndpoint; @XmlAttribute diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/SimpleLinkType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/SimpleLinkType.java index 003c980ce9..c92e1ca1f5 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/SimpleLinkType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/SimpleLinkType.java @@ -23,6 +23,7 @@ package oasis.names.tc.ebxml.regrep.xsd.rim.v4; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.Transient; import javax.xml.bind.annotation.XmlAccessType; @@ -72,12 +73,13 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlType(name = "SimpleLinkType") @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "SimpleLink") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "SimpleLink") public class SimpleLinkType { @Id - @GeneratedValue + @SequenceGenerator(name = "SimpleLinkTypeGenerator", schema = "ebxml", sequenceName = "ebxml.SimpleLink_sequence") + @GeneratedValue(generator = "SimpleLinkTypeGenerator") @XmlTransient private Integer key; diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/SlotType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/SlotType.java index b3416a82e8..c63248fdcd 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/SlotType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/SlotType.java @@ -28,6 +28,7 @@ import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToOne; +import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -85,13 +86,14 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; // referencedColumnName = "key"), inverseJoinColumns = @JoinColumn(name = // "child_slot_key", referencedColumnName = "key"))) @Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL, include = "all") -@Table(name = "Slot") +@Table(schema = "ebxml", name = "Slot") public class SlotType extends ExtensibleObjectType implements Serializable { private static final long serialVersionUID = -2184582316481503043L; @Id - @GeneratedValue + @SequenceGenerator(name = "ExtensibleObjectTypeGenerator", schema = "ebxml", sequenceName = "ebxml.Slot_sequence") + @GeneratedValue(generator = "ExtensibleObjectTypeGenerator") @XmlTransient private Integer key; diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/SlotValueType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/SlotValueType.java index 241d15a3e2..179bcbe294 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/SlotValueType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/SlotValueType.java @@ -67,8 +67,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlType(name = "SlotValueType", propOrder = { "slotValue" }) @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "SlotType") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "SlotValue") public class SlotValueType extends ValueType { @XmlElement(name = "Slot") diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/StringQueryExpressionType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/StringQueryExpressionType.java index e812b23a14..aaf6fb05e3 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/StringQueryExpressionType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/StringQueryExpressionType.java @@ -21,6 +21,7 @@ package oasis.names.tc.ebxml.regrep.xsd.rim.v4; import javax.persistence.Entity; +import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -61,7 +62,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * */ @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "StringQueryExpression") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "StringQueryExpressionType", propOrder = { "value" }) diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/StringValueType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/StringValueType.java index d19818aa88..bc49889b17 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/StringValueType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/StringValueType.java @@ -68,7 +68,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize @Entity @Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "StringValue") +@Table(schema = "ebxml", name = "StringValue") public class StringValueType extends ValueType { @Column(name = COLUMN_NAME, columnDefinition = "text") diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/SubscriptionType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/SubscriptionType.java index c8845ae362..100e533483 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/SubscriptionType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/SubscriptionType.java @@ -26,6 +26,7 @@ import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.OneToOne; import javax.persistence.Table; @@ -80,13 +81,14 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlType(name = "SubscriptionType", propOrder = { "deliveryInfo", "selector" }) @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "Subscription") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "Subscription") public class SubscriptionType extends RegistryObjectType { @ManyToMany(cascade = CascadeType.ALL) @XmlElement(name = "DeliveryInfo") @DynamicSerializeElement + @JoinTable(schema = "ebxml") protected List deliveryInfo; @OneToOne(cascade = CascadeType.ALL) diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/TaxonomyElementType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/TaxonomyElementType.java index ec0d96d6d8..8f70d0984f 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/TaxonomyElementType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/TaxonomyElementType.java @@ -26,6 +26,7 @@ import java.util.Set; import javax.persistence.Entity; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; +import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -79,6 +80,7 @@ public abstract class TaxonomyElementType extends RegistryObjectType { org.hibernate.annotations.CascadeType.DETACH }) @XmlElement(name = "ClassificationNode") @DynamicSerializeElement + @JoinTable(schema = "ebxml") protected Set classificationNode; /** diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/TelephoneNumberType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/TelephoneNumberType.java index 0f4215aac5..60c6a92212 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/TelephoneNumberType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/TelephoneNumberType.java @@ -23,6 +23,7 @@ package oasis.names.tc.ebxml.regrep.xsd.rim.v4; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -68,12 +69,13 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlType(name = "TelephoneNumberType") @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "TelephoneNumber") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "TelephoneNumber") public class TelephoneNumberType extends ExtensibleObjectType { @Id - @GeneratedValue + @SequenceGenerator(name = "TelephoneNumberTypeGenerator", schema = "ebxml", sequenceName = "ebxml.TelephoneNumber_sequence") + @GeneratedValue(generator = "TelephoneNumberTypeGenerator") @XmlTransient private Integer key; diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ValueType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ValueType.java index 8875472008..1f768f2859 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ValueType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/ValueType.java @@ -25,6 +25,7 @@ import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; +import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -71,13 +72,14 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; DurationValueType.class, CollectionValueType.class }) @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "Value") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "Value") @Inheritance(strategy = InheritanceType.SINGLE_TABLE) public abstract class ValueType { @Id - @GeneratedValue + @SequenceGenerator(name = "ValueTypeGenerator", schema = "ebxml", sequenceName = "ebxml.Value_sequence") + @GeneratedValue(generator = "ValueTypeGenerator") @XmlTransient protected Integer key; diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/VersionInfoType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/VersionInfoType.java index cf686cc180..c575b64e72 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/VersionInfoType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/VersionInfoType.java @@ -23,19 +23,12 @@ package oasis.names.tc.ebxml.regrep.xsd.rim.v4; import java.io.Serializable; import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import javax.persistence.Embeddable; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlTransient; -import javax.xml.bind.annotation.XmlType; - -import org.hibernate.annotations.Cache; -import org.hibernate.annotations.CacheConcurrencyStrategy; +import com.raytheon.uf.common.dataplugin.persist.IPersistableDataObject; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @@ -62,31 +55,24 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * * */ -@XmlRootElement -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "VersionInfoType") +@Embeddable +@XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize -@Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "VersionInfo") -public class VersionInfoType implements Serializable { +public class VersionInfoType implements Serializable, + IPersistableDataObject { private static final long serialVersionUID = -2869857115641981790L; - @Id + @Column @XmlAttribute @DynamicSerializeElement - protected String versionName; + protected String versionName = "1"; - @Id + @Column @XmlAttribute @DynamicSerializeElement protected String userVersionName; - @Column - @XmlTransient - private int versionNumber; - /** * Gets the value of the versionName property. * @@ -106,7 +92,6 @@ public class VersionInfoType implements Serializable { */ public void setVersionName(String value) { this.versionName = value; - this.versionNumber = Integer.parseInt(this.versionName); } /** @@ -135,12 +120,9 @@ public class VersionInfoType implements Serializable { return versionName + "_" + userVersionName; } - public int getVersionNumber() { - return versionNumber; - } - - public void setVersionNumber(int versionNumber) { - this.versionNumber = versionNumber; + @Override + public String getIdentifier() { + return versionName; } } diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/VocabularyTermType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/VocabularyTermType.java index 98644eda34..172f2606ba 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/VocabularyTermType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/VocabularyTermType.java @@ -24,6 +24,7 @@ import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.Id; +import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; @@ -66,7 +67,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlType(name = "VocabularyTermType") @DynamicSerialize @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "VocabularyTerm") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) public class VocabularyTermType implements Serializable { private static final long serialVersionUID = -7560901570669843677L; diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/VocabularyTermValueType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/VocabularyTermValueType.java index 92fdaf6687..c805392116 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/VocabularyTermValueType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/VocabularyTermValueType.java @@ -69,7 +69,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize @Entity @Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "VocabularyTermValue") +@Table(schema = "ebxml", name = "VocabularyTermValue") public class VocabularyTermValueType extends ValueType { @XmlElement(name = "Value") diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/WorkflowActionType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/WorkflowActionType.java index b5d5a76e0c..522221eff4 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/WorkflowActionType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/WorkflowActionType.java @@ -65,7 +65,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @DynamicSerialize @Entity @Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) -@Table(name = "WorkflowAction") +@Table(schema = "ebxml", name = "WorkflowAction") public class WorkflowActionType extends RegistryObjectType { @XmlAttribute(required = true) diff --git a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/XMLQueryExpressionType.java b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/XMLQueryExpressionType.java index aa73ab03ae..650f2b8776 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/XMLQueryExpressionType.java +++ b/edexOsgi/com.raytheon.uf.common.registry.schemas.ebxml/src/oasis/names/tc/ebxml/regrep/xsd/rim/v4/XMLQueryExpressionType.java @@ -22,6 +22,7 @@ package oasis.names.tc.ebxml.regrep.xsd.rim.v4; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAnyElement; @@ -64,7 +65,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * */ @Entity -@Cache(region="registryObjects",usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@Table(schema = "ebxml", name = "XMLQueryExpression") +@Cache(region = "registryObjects", usage = CacheConcurrencyStrategy.TRANSACTIONAL) @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "XMLQueryExpressionType", propOrder = { "any" }) diff --git a/edexOsgi/com.raytheon.uf.common.stats/src/com/raytheon/uf/common/stats/StatsRecord.java b/edexOsgi/com.raytheon.uf.common.stats/src/com/raytheon/uf/common/stats/StatsRecord.java index 7c23b9f571..203416d19e 100644 --- a/edexOsgi/com.raytheon.uf.common.stats/src/com/raytheon/uf/common/stats/StatsRecord.java +++ b/edexOsgi/com.raytheon.uf.common.stats/src/com/raytheon/uf/common/stats/StatsRecord.java @@ -44,6 +44,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Aug 21, 2012 jsanchez Initial creation + * 3/18/2013 1802 bphillip Implemented transaction boundaries. Changed to extend parameterized PersistableDataObject * * * @@ -55,7 +56,10 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @XmlRootElement @XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize -public class StatsRecord extends PersistableDataObject { +public class StatsRecord extends PersistableDataObject { + + private static final long serialVersionUID = -2018725770414395081L; + @GeneratedValue(strategy = GenerationType.AUTO) @Id @DynamicSerializeElement diff --git a/edexOsgi/com.raytheon.uf.common.util/src/com/raytheon/uf/common/util/CollectionUtil.java b/edexOsgi/com.raytheon.uf.common.util/src/com/raytheon/uf/common/util/CollectionUtil.java index 76f8bcd6fa..c5a0605a6a 100644 --- a/edexOsgi/com.raytheon.uf.common.util/src/com/raytheon/uf/common/util/CollectionUtil.java +++ b/edexOsgi/com.raytheon.uf.common.util/src/com/raytheon/uf/common/util/CollectionUtil.java @@ -20,9 +20,11 @@ package com.raytheon.uf.common.util; import java.lang.reflect.Array; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; +import java.util.List; import java.util.Set; /** @@ -111,4 +113,29 @@ public final class CollectionUtil { objArray2.length); return array; } + + /** + * Utility function to convert an array of objects into a list. The array + * may contain collections. Each member of the collection is added to the + * returned list. + * + * @param objects + * The objects to be moved to a list + * @return The compiled list of objects + */ + @SuppressWarnings("unchecked") + public static List asUnembeddedList(T... objects) { + List retVal = new ArrayList(); + for (T obj : objects) { + if (obj instanceof Collection) { + Collection coll = (Collection) obj; + for (Object obj2 : coll) { + retVal.add((T) obj2); + } + } else { + retVal.add(obj); + } + } + return retVal; + } } diff --git a/edexOsgi/com.raytheon.uf.edex.auth/src/com/raytheon/uf/edex/auth/RemoteRequestRouteWrapper.java b/edexOsgi/com.raytheon.uf.edex.auth/src/com/raytheon/uf/edex/auth/RemoteRequestRouteWrapper.java index 772f270245..e053ec67f4 100644 --- a/edexOsgi/com.raytheon.uf.edex.auth/src/com/raytheon/uf/edex/auth/RemoteRequestRouteWrapper.java +++ b/edexOsgi/com.raytheon.uf.edex.auth/src/com/raytheon/uf/edex/auth/RemoteRequestRouteWrapper.java @@ -48,7 +48,6 @@ import com.raytheon.uf.common.util.SizeUtil; * @author mschenke * @version 1.0 */ - public class RemoteRequestRouteWrapper { private static final IUFStatusHandler thriftSrvLogger = UFStatus diff --git a/edexOsgi/com.raytheon.uf.edex.core/src/com/raytheon/uf/edex/core/EDEXUtil.java b/edexOsgi/com.raytheon.uf.edex.core/src/com/raytheon/uf/edex/core/EDEXUtil.java index 32006a979c..5def363804 100644 --- a/edexOsgi/com.raytheon.uf.edex.core/src/com/raytheon/uf/edex/core/EDEXUtil.java +++ b/edexOsgi/com.raytheon.uf.edex.core/src/com/raytheon/uf/edex/core/EDEXUtil.java @@ -57,6 +57,7 @@ import com.raytheon.uf.edex.core.props.PropertiesFactory; * 02/02/2011 6500 cjeanbap Added paramter to method signature and * properly assign source value. * 06/12/2012 0609 djohnson Use EDEXUtil for EDEX_HOME. + * 3/18/2013 1802 bphillip Added getList utility function * * * @author chammack diff --git a/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/dao/SessionManagedDao.java b/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/dao/SessionManagedDao.java index f83f5ffee5..4751b898a0 100644 --- a/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/dao/SessionManagedDao.java +++ b/edexOsgi/com.raytheon.uf.edex.database/src/com/raytheon/uf/edex/database/dao/SessionManagedDao.java @@ -28,16 +28,20 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import org.hibernate.Query; import org.hibernate.SessionFactory; +import org.hibernate.criterion.DetachedCriteria; import org.hibernate.dialect.Dialect; import org.hibernate.impl.SessionFactoryImpl; import org.springframework.orm.hibernate3.HibernateTemplate; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.raytheon.uf.common.dataplugin.persist.IPersistableDataObject; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.edex.database.DataAccessLayerException; /** * A CoreDao mimic that is session managed. A Dao will never open its own @@ -52,6 +56,7 @@ import com.raytheon.uf.common.status.UFStatus; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Feb 07, 2013 1543 djohnson Initial creation + * 3/18/2013 1802 bphillip Added additional database functions. Enforcing mandatory transaction propogation * * * @@ -59,8 +64,12 @@ import com.raytheon.uf.common.status.UFStatus; * @version 1.0 */ @Repository -@Transactional -public abstract class SessionManagedDao> implements ISessionManagedDao { +@Transactional(propagation = Propagation.MANDATORY) +public abstract class SessionManagedDao> + implements ISessionManagedDao { + + /** The region in the cache which stores the queries */ + private static final String QUERY_CACHE_REGION = "Queries"; protected static final IUFStatusHandler statusHandler = UFStatus .getHandler(SessionManagedDao.class); @@ -132,7 +141,7 @@ public abstract class SessionManagedDao entityClass = getEntityClass(); return entityClass.cast(template.get(entityClass, id)); } @@ -153,9 +162,13 @@ public abstract class SessionManagedDao query(String queryString, Map params) { + return query(queryString, params, 0); + } + @SuppressWarnings("unchecked") protected List query(String queryString, - Map params) { + Map params, int maxResults) { final int numberOfParams = params.size(); String[] paramNames = new String[numberOfParams]; Object[] paramValues = new Object[numberOfParams]; @@ -165,8 +178,12 @@ public abstract class SessionManagedDao params) { + protected ENTITY uniqueResult(String queryString, Map params) { final List results = query(queryString, params); if (results.isEmpty()) { return null; @@ -188,6 +204,219 @@ public abstract class SessionManagedDao + * An object type to query for + * @param queryString + * The query to execute + * @return The results of the HQL query + * @throws DataAccessLayerException + * If errors are encountered during the HQL query + */ + public List executeHQLQuery(String queryString) + throws DataAccessLayerException { + return executeHQLQuery(queryString, true, null); + } + + /** + * Executes an HQL query + * + * @param + * The return object type + * @param queryString + * A StringBuilder instance containing an HQL query to execute + * @return List containing the results of the query + * @throws DataAccessLayerException + * If Hibernate errors occur during execution of the query + */ + public List executeHQLQuery(StringBuilder queryString) + throws DataAccessLayerException { + return executeHQLQuery(queryString.toString(), true, null); + } + + /** + * Executes an HQL query with a map of name value pairs with which to + * substitute into the query. This method is a convenience method for + * executing prepared statements + * + * @param + * The return object type + * @param queryString + * The prepared HQL query to execute. This query contains values + * that will be substituted according to the names and values + * found in the params map + * @param params + * The named parameters to substitute into the HQL query + * @return List containing the results of the query + * @throws DataAccessLayerException + * If Hibernate errors occur during the execution of the query + */ + public List executeHQLQuery(String queryString, + Map params) throws DataAccessLayerException { + return executeHQLQuery(queryString, true, params); + } + + /** + * Executes an HQL query in an existing Hibernate session + * + * @param + * An object type to query for + * @param queryString + * The query to execute + * @param session + * The existing Hibernate session + * @return The results of the HQL query + * @throws DataAccessLayerException + * if errors are encountered during the HQL query + */ + @SuppressWarnings("unchecked") + public List executeHQLQuery(final String queryString, + boolean eager, final Map params) + throws DataAccessLayerException { + try { + Query query = getSessionFactory().getCurrentSession() + .createQuery(queryString).setCacheable(true) + .setCacheRegion(QUERY_CACHE_REGION); + if (params != null) { + for (String name : params.keySet()) { + Object val = params.get(name); + query.setParameter(name, val); + } + } + List results = query.list(); + return results; + } catch (Throwable e) { + throw new DataAccessLayerException("Error executing HQLQuery [" + + queryString + "]", e); + } + } + + /** + * Executes an HQL query in a new Hibernate session + * + * @param + * An object type to query for + * @param queryString + * The query to execute + * @return The results of the HQL query + * @throws DataAccessLayerException + * If errors are encountered during the HQL query + */ + public int executeHQLStatement(String queryString) + throws DataAccessLayerException { + return executeHQLStatement(queryString, true, null); + } + + /** + * Executes an HQL query + * + * @param + * The return object type + * @param queryString + * A StringBuilder instance containing an HQL query to execute + * @return List containing the results of the query + * @throws DataAccessLayerException + * If Hibernate errors occur during execution of the query + */ + public int executeHQLStatement(StringBuilder queryString) + throws DataAccessLayerException { + return executeHQLStatement(queryString.toString(), true, null); + } + + /** + * Executes an HQL query with a map of name value pairs with which to + * substitute into the query. This method is a convenience method for + * executing prepared statements + * + * @param + * The return object type + * @param queryString + * The prepared HQL query to execute. This query contains values + * that will be substituted according to the names and values + * found in the params map + * @param params + * The named parameters to substitute into the HQL query + * @return List containing the results of the query + * @throws DataAccessLayerException + * If Hibernate errors occur during the execution of the query + */ + public int executeHQLStatement(String queryString, + Map params) throws DataAccessLayerException { + return executeHQLStatement(queryString, true, params); + } + + /** + * Executes an HQL query in an existing Hibernate session + * + * @param + * An object type to query for + * @param queryString + * The query to execute + * @param session + * The existing Hibernate session + * @return The results of the HQL query + * @throws DataAccessLayerException + * if errors are encountered during the HQL query + */ + @SuppressWarnings("unchecked") + public int executeHQLStatement(final String queryString, boolean eager, + final Map params) throws DataAccessLayerException { + try { + Query query = getSessionFactory().getCurrentSession() + .createQuery(queryString).setCacheable(true) + .setCacheRegion(QUERY_CACHE_REGION); + if (params != null) { + for (String name : params.keySet()) { + Object val = params.get(name); + query.setParameter(name, val); + } + } + return query.executeUpdate(); + } catch (Throwable e) { + throw new DataAccessLayerException( + "Error executing HQL Statement [" + queryString + "]", e); + } + } + + /** + * Executes a criteria query. This method expects a DetachedQuery instance. + * The DetachedQuery is attached to a new session and executed + * + * @param + * An Object type + * @param criteria + * The DetachedCriteria instance to execute + * @return The results of the query + * @throws DataAccessLayerException + * If errors occur in Hibernate while executing the query + */ + @SuppressWarnings("unchecked") + public List executeCriteriaQuery( + final DetachedCriteria criteria) throws DataAccessLayerException { + if (criteria == null) { + return Collections.emptyList(); + } + + try { + List results = null; + results = criteria + .getExecutableCriteria( + getSessionFactory().getCurrentSession()) + .setCacheable(true).setCacheRegion(QUERY_CACHE_REGION) + .list(); + return results; + } catch (Throwable e) { + throw new DataAccessLayerException( + "Error executing Criteria Query", e); + } + } + + public void evict(ENTITY entity) { + this.getSessionFactory().getCurrentSession().evict(entity); + } + /** * Get the hibernate dialect. * @@ -198,6 +427,10 @@ public abstract class SessionManagedDao * @@ -60,7 +63,10 @@ public class RetrievalManager { public RetrievalManager(IBandwidthDao bandwidthDao, Object notifier) { this.bandwidthDao = bandwidthDao; this.notifier = notifier; + } + @PostConstruct + public void registerWithEventBus() { EventBus.register(this); } diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.event/META-INF/MANIFEST.MF b/edexOsgi/com.raytheon.uf.edex.datadelivery.event/META-INF/MANIFEST.MF index cdfa7e912f..b0703b550e 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.event/META-INF/MANIFEST.MF +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.event/META-INF/MANIFEST.MF @@ -21,4 +21,6 @@ Require-Bundle: com.google.guava;bundle-version="1.0.0", com.raytheon.uf.common.registry.event;bundle-version="1.0.0", com.raytheon.uf.common.registry.ebxml;bundle-version="1.0.0", com.raytheon.uf.common.datadelivery.service;bundle-version="1.0.0", - com.raytheon.uf.common.util;bundle-version="1.12.1174" + com.raytheon.uf.common.util;bundle-version="1.12.1174", + org.hibernate;bundle-version="1.0.0", + com.raytheon.uf.common.dataplugin;bundle-version="1.12.1174" diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.event/res/spring/event-datadelivery-ingest.xml b/edexOsgi/com.raytheon.uf.edex.datadelivery.event/res/spring/event-datadelivery-ingest.xml index 6768a5f7bb..c02b5a5889 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.event/res/spring/event-datadelivery-ingest.xml +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.event/res/spring/event-datadelivery-ingest.xml @@ -8,6 +8,7 @@ + diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.event/res/spring/event-datadelivery.xml b/edexOsgi/com.raytheon.uf.edex.datadelivery.event/res/spring/event-datadelivery.xml index de3b7a62fd..d63a2992ff 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.event/res/spring/event-datadelivery.xml +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.event/res/spring/event-datadelivery.xml @@ -1,43 +1,60 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.event/src/com/raytheon/uf/edex/datadelivery/event/handler/AbstractHandler.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.event/src/com/raytheon/uf/edex/datadelivery/event/handler/AbstractHandler.java index 4232a59ef1..d7be10275b 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.event/src/com/raytheon/uf/edex/datadelivery/event/handler/AbstractHandler.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.event/src/com/raytheon/uf/edex/datadelivery/event/handler/AbstractHandler.java @@ -1,5 +1,8 @@ package com.raytheon.uf.edex.datadelivery.event.handler; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + import com.raytheon.uf.common.datadelivery.event.notification.NotificationRecord; import com.raytheon.uf.common.serialization.SerializationException; import com.raytheon.uf.common.serialization.SerializationUtil; @@ -10,16 +13,35 @@ import com.raytheon.uf.edex.core.EdexException; import com.raytheon.uf.edex.datadelivery.event.notification.NotificationDao; /** + * * Abstract class to provide the send and store capabilities to subclasses. * - * @author jsanchez + *
  * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 3/18/2013    1802       bphillip    Implemented transactional boundaries
+ * 
+ * 
+ * + * @author djohnson + * @version 1.0 */ +@Service +@Transactional public abstract class AbstractHandler { private static final IUFStatusHandler statusHandler = UFStatus .getHandler(AbstractHandler.class); + protected NotificationDao notificationDao; + + protected AbstractHandler() { + + } + /** * Sends the object to 'notifyRoute'. * @@ -43,9 +65,13 @@ public abstract class AbstractHandler { */ void storeAndSend(NotificationRecord record, String endpoint) { if (record != null) { - NotificationDao dao = new NotificationDao(); - dao.persist(record); + notificationDao.createOrUpdate(record); send(record, endpoint); } } + + public void setNotificationDao(NotificationDao notificationDao) { + this.notificationDao = notificationDao; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.event/src/com/raytheon/uf/edex/datadelivery/event/handler/DeleteNotificationHandler.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.event/src/com/raytheon/uf/edex/datadelivery/event/handler/DeleteNotificationHandler.java index 1eaf2df299..f4d8f01a2b 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.event/src/com/raytheon/uf/edex/datadelivery/event/handler/DeleteNotificationHandler.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.event/src/com/raytheon/uf/edex/datadelivery/event/handler/DeleteNotificationHandler.java @@ -5,7 +5,6 @@ import com.raytheon.uf.common.datadelivery.event.notification.DeleteNotification import com.raytheon.uf.common.serialization.comm.IRequestHandler; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.edex.datadelivery.event.notification.NotificationDao; /** * @@ -18,6 +17,7 @@ import com.raytheon.uf.edex.datadelivery.event.notification.NotificationDao; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Mar 7, 2012 jsanchez Initial creation + * 3/18/2013 1802 bphillip Modified to use transactional boundaries and spring injection of daos * * * @@ -32,6 +32,10 @@ public class DeleteNotificationHandler extends AbstractHandler implements private String uri; + public DeleteNotificationHandler() { + super(); + } + /** * Create a new object * @@ -48,8 +52,7 @@ public class DeleteNotificationHandler extends AbstractHandler implements @Override public DeleteNotificationResponse handleRequest( DeleteNotificationRequest request) throws Exception { - NotificationDao dao = new NotificationDao(); - int rowsDeleted = dao.deleteRecords(request.getIds()); + int rowsDeleted = notificationDao.deleteRecords(request.getIds()); DeleteNotificationResponse response = new DeleteNotificationResponse(); response.setIds(request.getIds()); diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.event/src/com/raytheon/uf/edex/datadelivery/event/handler/GetNotificationHandler.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.event/src/com/raytheon/uf/edex/datadelivery/event/handler/GetNotificationHandler.java index 48dade14ca..ff2af4af24 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.event/src/com/raytheon/uf/edex/datadelivery/event/handler/GetNotificationHandler.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.event/src/com/raytheon/uf/edex/datadelivery/event/handler/GetNotificationHandler.java @@ -1,11 +1,10 @@ package com.raytheon.uf.edex.datadelivery.event.handler; -import java.util.ArrayList; +import java.util.List; import com.raytheon.uf.common.datadelivery.event.notification.GetNotificationRequest; import com.raytheon.uf.common.datadelivery.event.notification.NotificationRecord; import com.raytheon.uf.common.serialization.comm.IRequestHandler; -import com.raytheon.uf.edex.datadelivery.event.notification.NotificationDao; /** * @@ -18,6 +17,7 @@ import com.raytheon.uf.edex.datadelivery.event.notification.NotificationDao; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Mar 7, 2012 jsanchez Initial creation + * 3/18/2013 1802 bphillip Modified to use transactional boundaries and spring injection of daos * * * @@ -27,16 +27,19 @@ import com.raytheon.uf.edex.datadelivery.event.notification.NotificationDao; public class GetNotificationHandler extends AbstractHandler implements IRequestHandler { + public GetNotificationHandler() { + super(); + } + /** * Handles request to retrieve Notification records */ @Override - public ArrayList handleRequest( - GetNotificationRequest request) throws Exception { - NotificationDao dao = new NotificationDao(); - ArrayList notifications = dao.lookupNotifications( - request.getUsername(), request.getHours(), - request.getMaxResults()); + public List handleRequest(GetNotificationRequest request) + throws Exception { + List notifications = notificationDao + .lookupNotifications(request.getUsername(), request.getHours(), + request.getMaxResults()); return notifications; } diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.event/src/com/raytheon/uf/edex/datadelivery/event/handler/NotificationHandler.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.event/src/com/raytheon/uf/edex/datadelivery/event/handler/NotificationHandler.java index b50e1ac1b3..2c7165a11a 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.event/src/com/raytheon/uf/edex/datadelivery/event/handler/NotificationHandler.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.event/src/com/raytheon/uf/edex/datadelivery/event/handler/NotificationHandler.java @@ -1,5 +1,7 @@ package com.raytheon.uf.edex.datadelivery.event.handler; +import javax.annotation.PostConstruct; + import com.google.common.eventbus.AllowConcurrentEvents; import com.google.common.eventbus.Subscribe; import com.raytheon.uf.common.datadelivery.event.INotifiableEvent; @@ -26,6 +28,7 @@ import com.raytheon.uf.common.registry.event.RemoveRegistryEvent; * the method with it as a parameter (i.e. superclass parameter methods receive it too). * Dec 07, 2012 1104 djohnson Changed to use INotifiableEvent for events with notifications. * Feb 05, 2013 1580 mpduff EventBus refactor. + * 3/18/2013 1802 bphillip Modified to use transactional boundaries and spring injection of daos * * * @@ -41,6 +44,11 @@ public class NotificationHandler extends AbstractHandler { * DataDeliveryEventBus */ public NotificationHandler() { + super(); + } + + @PostConstruct + public void registerWithEventBus() { EventBus.register(this); } @@ -50,7 +58,6 @@ public class NotificationHandler extends AbstractHandler { */ public NotificationHandler(String endpoint) { this.endpoint = endpoint; - EventBus.register(this); } /** diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.event/src/com/raytheon/uf/edex/datadelivery/event/handler/SubscriptionNotificationHandler.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.event/src/com/raytheon/uf/edex/datadelivery/event/handler/SubscriptionNotificationHandler.java index cb31c53e84..e6208a63b8 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.event/src/com/raytheon/uf/edex/datadelivery/event/handler/SubscriptionNotificationHandler.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.event/src/com/raytheon/uf/edex/datadelivery/event/handler/SubscriptionNotificationHandler.java @@ -47,6 +47,7 @@ import com.raytheon.uf.common.status.UFStatus; * Sep 24, 2012 1157 mpduff Changed to use BaseSubscriptionNotificationRequest. * Jan 17, 2013 1501 djohnson If a subscription is still in the registry, use it for the notification response. * Jan 21, 2013 1501 djohnson Throw an exception if subscription is not provided on the request. + * 3/18/2013 1802 bphillip Modified to use transactional boundaries and spring injection of daos * * * @author mpduff @@ -60,7 +61,11 @@ public class SubscriptionNotificationHandler extends private static final IUFStatusHandler statusHandler = UFStatus .getHandler(SubscriptionNotificationHandler.class); - private final String uri; + private String uri; + + public SubscriptionNotificationHandler() { + super(); + } /** * Constructor diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.event/src/com/raytheon/uf/edex/datadelivery/event/notification/NotificationDao.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.event/src/com/raytheon/uf/edex/datadelivery/event/notification/NotificationDao.java index d86ded1185..30f9080c2f 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.event/src/com/raytheon/uf/edex/datadelivery/event/notification/NotificationDao.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.event/src/com/raytheon/uf/edex/datadelivery/event/notification/NotificationDao.java @@ -1,15 +1,13 @@ package com.raytheon.uf.edex.datadelivery.event.notification; -import java.util.ArrayList; import java.util.Calendar; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import com.raytheon.uf.common.datadelivery.event.notification.NotificationRecord; -import com.raytheon.uf.common.dataquery.db.QueryParam.QueryOperand; -import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.edex.database.DataAccessLayerException; -import com.raytheon.uf.edex.database.dao.CoreDao; -import com.raytheon.uf.edex.database.dao.DaoConfig; -import com.raytheon.uf.edex.database.query.DatabaseQuery; +import com.raytheon.uf.edex.database.dao.SessionManagedDao; /** * @@ -22,19 +20,21 @@ import com.raytheon.uf.edex.database.query.DatabaseQuery; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Mar 1, 2012 jsanchez Initial creation + * 3/18/2013 1802 bphillip Modified to use transactional boundaries and spring injection of daos * * * * @author jsanchez * @version 1.0 */ -public class NotificationDao extends CoreDao { +public class NotificationDao extends + SessionManagedDao { /** * Creates a new data access object */ public NotificationDao() { - super(DaoConfig.forClass("metadata", NotificationRecord.class)); + } /** @@ -50,35 +50,36 @@ public class NotificationDao extends CoreDao { * @return the Notificaion records based on passed contraints. The records * are in descending order based on date */ - public ArrayList lookupNotifications(String username, + public List lookupNotifications(String username, Integer hours, Integer maxResults) { - DatabaseQuery query = new DatabaseQuery(this.daoClass); - if (username != null) { - query.addQueryParam("username", username, QueryOperand.IN); - } - + Map params = new HashMap(); + String hql = "from NotificationRecord rec"; + String nameClause = " rec.username=:userName "; + String dateClause = " rec.date >= :date "; + Calendar latestTime = null; if (hours != null) { - Calendar latestTime = Calendar.getInstance(); + latestTime = Calendar.getInstance(); latestTime.add(Calendar.HOUR, -hours); - query.addQueryParam("date", latestTime, - QueryOperand.GREATERTHANEQUALS); } - if (maxResults != null) { - query.setMaxResults(maxResults); + if (username == null && hours != null) { + hql += " where " + dateClause; + params.put("date", latestTime); + } else if (username != null && hours == null) { + hql += " where " + nameClause; + params.put("userName", username); + } else if (username != null && hours != null) { + hql += " where " + nameClause + " and " + dateClause; + params.put("date", latestTime); + params.put("userName", username); } + hql += " order by rec.date desc"; - query.addOrder("date", false); - - ArrayList result = null; - try { - result = (ArrayList) queryByCriteria(query); - } catch (DataAccessLayerException e) { - statusHandler.handle(Priority.PROBLEM, - "Error querying notification table", e); + if (maxResults == null) { + return this.query(hql, params); + } else { + return this.query(hql, params, maxResults); } - - return result; } /** @@ -91,9 +92,10 @@ public class NotificationDao extends CoreDao { */ public int purgeExpiredData(Calendar expiration) throws DataAccessLayerException { - DatabaseQuery deleteStmt = new DatabaseQuery(this.daoClass); - deleteStmt.addQueryParam("date", expiration, QueryOperand.LESSTHAN); - return this.deleteByCriteria(deleteStmt); + Map params = new HashMap(); + params.put("date", expiration); + String hqlStatement = "delete NotificationRecord r where r.date < :date"; + return this.executeHQLStatement(hqlStatement, params); } /** @@ -103,18 +105,20 @@ public class NotificationDao extends CoreDao { * the notification ids * @return the number of rows deleted */ - public int deleteRecords(ArrayList ids) - throws DataAccessLayerException { - StringBuffer sb = new StringBuffer(); - for (Integer id : ids) { - if (sb.length() != 0) { - sb.append(","); - } - sb.append(String.valueOf(id.intValue())); - } + public int deleteRecords(List ids) throws DataAccessLayerException { + Map params = new HashMap(); + params.put("ids", ids); + String hqlStatement = "delete NotificationRecord r where r.id in :ids"; + return this.executeHQLStatement(hqlStatement, params); + } - DatabaseQuery deleteStmt = new DatabaseQuery(this.daoClass); - deleteStmt.addQueryParam("id", sb.toString(), QueryOperand.IN); - return this.deleteByCriteria(deleteStmt); + @Override + public NotificationRecord getById(Integer id) { + return super.getById(id); + } + + @Override + protected Class getEntityClass() { + return NotificationRecord.class; } } diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.harvester/src/com/raytheon/uf/edex/datadelivery/harvester/CrawlMetaDataHandler.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.harvester/src/com/raytheon/uf/edex/datadelivery/harvester/CrawlMetaDataHandler.java index 592ee20e2d..2c0f83f6b7 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.harvester/src/com/raytheon/uf/edex/datadelivery/harvester/CrawlMetaDataHandler.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.harvester/src/com/raytheon/uf/edex/datadelivery/harvester/CrawlMetaDataHandler.java @@ -44,6 +44,7 @@ import com.raytheon.uf.edex.datadelivery.retrieval.LinkStore; import com.raytheon.uf.edex.datadelivery.retrieval.ProviderCollectionLinkStore; import com.raytheon.uf.edex.datadelivery.retrieval.ServiceFactory; import com.raytheon.uf.edex.datadelivery.retrieval.ServiceTypeFactory; +import com.raytheon.uf.edex.registry.ebxml.init.RegistryInitializedListener; /** * Harvest MetaData @@ -61,6 +62,7 @@ import com.raytheon.uf.edex.datadelivery.retrieval.ServiceTypeFactory; * Oct 03, 2012 1241 djohnson Use registry handler. * Nov 09, 2012 1263 dhladky Changed to Site Level * Feb 05, 2013 1580 mpduff EventBus refactor. + * 3/18/2013 1802 bphillip Modified to insert provider object after database is initialized * * * @@ -68,7 +70,7 @@ import com.raytheon.uf.edex.datadelivery.retrieval.ServiceTypeFactory; * @version 1.0 */ -public class CrawlMetaDataHandler { +public class CrawlMetaDataHandler implements RegistryInitializedListener { public static final String DASH = "-"; @@ -140,7 +142,6 @@ public class CrawlMetaDataHandler { public CrawlMetaDataHandler(CommunicationStrategy communicationStrategy) { this.communicationStrategy = communicationStrategy; - IPathManager pm = PathManagerFactory.getPathManager(); LocalizationContext lc = pm.getContext(LocalizationType.COMMON_STATIC, @@ -148,6 +149,10 @@ public class CrawlMetaDataHandler { LocalizationFile lf = pm.getLocalizationFile(lc, PROCESSED_DIR); timesDir = lf.getFile(); + } + + public void executeAfterRegistryInit() { + statusHandler .info("<<<<<<<<<<<<<<<<<<<<< INITIALIZING CRAWL META DATA HANDLER >>>>>>>>>>>>>>>>>>>>>>"); hconfigs = readCrawlConfigs(); diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.service/META-INF/MANIFEST.MF b/edexOsgi/com.raytheon.uf.edex.datadelivery.service/META-INF/MANIFEST.MF index ae74a38fbe..35fa585c1c 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.service/META-INF/MANIFEST.MF +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.service/META-INF/MANIFEST.MF @@ -22,4 +22,5 @@ Require-Bundle: com.raytheon.uf.common.auth;bundle-version="1.12.1174", com.raytheon.uf.common.event;bundle-version="1.0.0", com.google.guava;bundle-version="1.0.0", com.raytheon.uf.common.datadelivery.event;bundle-version="1.0.0", - com.raytheon.uf.common.datadelivery.service;bundle-version="1.0.0" + com.raytheon.uf.common.datadelivery.service;bundle-version="1.0.0", + org.springframework;bundle-version="2.5.6" diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.service/src/com/raytheon/uf/edex/datadelivery/service/services/SubscriptionDeleteHandler.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.service/src/com/raytheon/uf/edex/datadelivery/service/services/SubscriptionDeleteHandler.java index daa0b241b3..af9676d9fd 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.service/src/com/raytheon/uf/edex/datadelivery/service/services/SubscriptionDeleteHandler.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.service/src/com/raytheon/uf/edex/datadelivery/service/services/SubscriptionDeleteHandler.java @@ -19,6 +19,8 @@ **/ package com.raytheon.uf.edex.datadelivery.service.services; +import org.springframework.transaction.annotation.Transactional; + import com.raytheon.uf.common.auth.exception.AuthorizationException; import com.raytheon.uf.common.auth.user.IUser; import com.raytheon.uf.common.datadelivery.registry.SubscriptionDeleteRequest; @@ -27,7 +29,6 @@ import com.raytheon.uf.common.registry.handler.RegistryObjectHandlers; import com.raytheon.uf.common.util.ReflectionUtil; import com.raytheon.uf.edex.auth.req.AbstractPrivilegedRequestHandler; import com.raytheon.uf.edex.auth.resp.AuthorizationResponse; -import com.raytheon.uf.edex.registry.ebxml.services.util.RegistrySessionManager; /** * Handles deleting subscriptions or pending subscriptions, also any association @@ -42,6 +43,7 @@ import com.raytheon.uf.edex.registry.ebxml.services.util.RegistrySessionManager; * Sep 27, 2012 1187 djohnson Initial creation * Nov 05, 2012 1306 djohnson Remove dynamic serialize field level adapters. * Nov 15, 2012 1286 djohnson Prevent NPE if user is null. + * 3/18/2013 1802 bphillip Modified to use proper transaction boundaries * * * @@ -55,27 +57,21 @@ public class SubscriptionDeleteHandler extends /** * {@inheritDoc} */ + @Transactional @Override @SuppressWarnings({ "unchecked", "rawtypes" }) public Object handleRequest(SubscriptionDeleteRequest request) throws Exception { - try { - RegistrySessionManager.openSession(); - Class handlerClass = ReflectionUtil.forName(request - .getHandlerClass()); + Class handlerClass = ReflectionUtil.forName(request.getHandlerClass()); - IBaseSubscriptionHandler handler = RegistryObjectHandlers - .get(handlerClass); - final IUser user = request.getUser(); - final String username = (user == null) ? null : user.uniqueId() - .toString(); + IBaseSubscriptionHandler handler = RegistryObjectHandlers + .get(handlerClass); + final IUser user = request.getUser(); + final String username = (user == null) ? null : user.uniqueId() + .toString(); - handler.deleteByIds(username, - request.getSubscriptionIds()); - } finally { - RegistrySessionManager.closeSession(); - } + handler.deleteByIds(username, request.getSubscriptionIds()); return null; } diff --git a/edexOsgi/com.raytheon.uf.edex.datadelivery.service/src/com/raytheon/uf/edex/datadelivery/service/verify/SubscriptionIntegrityVerifier.java b/edexOsgi/com.raytheon.uf.edex.datadelivery.service/src/com/raytheon/uf/edex/datadelivery/service/verify/SubscriptionIntegrityVerifier.java index 6a3804fc07..6728ce4a7f 100644 --- a/edexOsgi/com.raytheon.uf.edex.datadelivery.service/src/com/raytheon/uf/edex/datadelivery/service/verify/SubscriptionIntegrityVerifier.java +++ b/edexOsgi/com.raytheon.uf.edex.datadelivery.service/src/com/raytheon/uf/edex/datadelivery/service/verify/SubscriptionIntegrityVerifier.java @@ -46,13 +46,13 @@ import com.raytheon.uf.common.status.UFStatus.Priority; * ------------ ---------- ----------- -------------------------- * Dec 7, 2012 1104 djohnson Initial creation * Feb 05, 2013 1580 mpduff EventBus refactor. + * 3/18/2013 1802 bphillip Modified to use proper transaction boundaries * * * * @author djohnson * @version 1.0 */ - public class SubscriptionIntegrityVerifier { private static final IUFStatusHandler statusHandler = UFStatus @@ -205,8 +205,8 @@ public class SubscriptionIntegrityVerifier { if (DataDeliveryRegistryObjectTypes.DATASET.equals(objectType)) { try { - final DataSet dataSet = DataDeliveryHandlers - .getDataSetHandler().getById(event.getId()); + DataSet dataSet = DataDeliveryHandlers.getDataSetHandler() + .getById(event.getId()); dataSetUpdated(dataSet); } catch (RegistryHandlerException e) { statusHandler diff --git a/edexOsgi/com.raytheon.uf.edex.event/src/com/raytheon/uf/edex/event/EdexEventBusHandler.java b/edexOsgi/com.raytheon.uf.edex.event/src/com/raytheon/uf/edex/event/EdexEventBusHandler.java index 5e525c723a..330e60a2ca 100644 --- a/edexOsgi/com.raytheon.uf.edex.event/src/com/raytheon/uf/edex/event/EdexEventBusHandler.java +++ b/edexOsgi/com.raytheon.uf.edex.event/src/com/raytheon/uf/edex/event/EdexEventBusHandler.java @@ -19,9 +19,18 @@ **/ package com.raytheon.uf.edex.event; +import java.util.List; + +import org.springframework.transaction.support.TransactionSynchronization; +import org.springframework.transaction.support.TransactionSynchronizationManager; + import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.Lists; import com.raytheon.uf.common.event.Event; import com.raytheon.uf.common.event.IEventBusHandler; +import com.raytheon.uf.common.status.IUFStatusHandler; +import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.common.status.UFStatus.Priority; /** * EDEX implementation of {@link IEventBusHandler} @@ -33,6 +42,7 @@ import com.raytheon.uf.common.event.IEventBusHandler; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Feb 5, 2013 1580 mpduff Initial creation. + * 3/18/2013 1802 bphillip Modified to use transaction synchronization * * * @@ -40,7 +50,20 @@ import com.raytheon.uf.common.event.IEventBusHandler; * @version 1.0 */ -public class EdexEventBusHandler implements IEventBusHandler { +public class EdexEventBusHandler implements IEventBusHandler, + TransactionSynchronization { + + private static final IUFStatusHandler statusHandler = UFStatus + .getHandler(EdexEventBusHandler.class); + + private static ThreadLocal> eventStorageList = new ThreadLocal>() { + + @Override + protected List initialValue() { + return Lists.newArrayList(); + } + + }; @VisibleForTesting EdexEventBusHandler(GoogleEventBusFactory eventBusFactory) { @@ -64,7 +87,21 @@ public class EdexEventBusHandler implements IEventBusHandler { */ @Override public void publish(Event event) { - this.googleEventBus.post(event); + if (TransactionSynchronizationManager.isActualTransactionActive()) { + + if (TransactionSynchronizationManager.isSynchronizationActive()) { + if (!TransactionSynchronizationManager.getSynchronizations() + .contains(this)) { + TransactionSynchronizationManager + .registerSynchronization(this); + } + } + eventStorageList.get().add(event); + } else { + statusHandler + .info("Sending event from non-transactional operation"); + this.googleEventBus.post(event); + } } /** @@ -83,4 +120,42 @@ public class EdexEventBusHandler implements IEventBusHandler { this.googleEventBus.unregister(subscriber); } + @Override + public void suspend() { + } + + @Override + public void resume() { + } + + @Override + public void beforeCommit(boolean readOnly) { + } + + @Override + public void beforeCompletion() { + } + + @Override + public void afterCommit() { + + } + + @Override + public void afterCompletion(int status) { + List list = eventStorageList.get(); + if (status == TransactionSynchronization.STATUS_COMMITTED) { + if (statusHandler.isPriorityEnabled(Priority.DEBUG)) { + statusHandler.debug("Posting " + list.size() + + " events on the event bus"); + } + for (Event event : list) { + this.googleEventBus.post(event); + } + } else if (status == TransactionSynchronization.STATUS_ROLLED_BACK) { + statusHandler.info("Transaction rolled back. Discarding " + + list.size() + " events."); + } + list.clear(); + } } diff --git a/edexOsgi/com.raytheon.uf.edex.event/src/com/raytheon/uf/edex/event/handler/LogHandler.java b/edexOsgi/com.raytheon.uf.edex.event/src/com/raytheon/uf/edex/event/handler/LogHandler.java index 90bb03a39b..8c94252b78 100644 --- a/edexOsgi/com.raytheon.uf.edex.event/src/com/raytheon/uf/edex/event/handler/LogHandler.java +++ b/edexOsgi/com.raytheon.uf.edex.event/src/com/raytheon/uf/edex/event/handler/LogHandler.java @@ -1,5 +1,7 @@ package com.raytheon.uf.edex.event.handler; +import javax.annotation.PostConstruct; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -21,6 +23,7 @@ import com.raytheon.uf.common.event.EventBus; * Mar 1, 2012 jsanchez Initial creation * Nov 5, 2012 #1305 bgonzale Added log level Event logging. * Feb 05, 2013 1580 mpduff EventBus refactor. + * 3/13/2013 bphillip Modified to make event bus registration a post construct operation * * * @@ -35,10 +38,14 @@ public class LogHandler { * Creates a new object */ public LogHandler() { - EventBus.register(this); logger = LogFactory.getLog("Event"); } + @PostConstruct + public void registerWithEventBus() { + EventBus.register(this); + } + /** * Listens for any DataDeliveryEvent object published on the event bus * diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/META-INF/MANIFEST.MF b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/META-INF/MANIFEST.MF index 7fb1dcd014..a4e0f9f024 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/META-INF/MANIFEST.MF +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/META-INF/MANIFEST.MF @@ -26,7 +26,12 @@ Require-Bundle: com.raytheon.uf.common.registry.schemas.ebxml;bundle-version="1. com.google.guava;bundle-version="1.0.0", com.raytheon.uf.common.registry.ebxml, com.raytheon.uf.common.stats;bundle-version="1.0.0", - com.raytheon.uf.common.registry.event;bundle-version="1.0.0" -Export-Package: com.raytheon.uf.edex.registry.ebxml.services.lifecycle, - com.raytheon.uf.edex.registry.ebxml.services.query, - com.raytheon.uf.edex.registry.ebxml.services.util + com.raytheon.uf.common.registry.event;bundle-version="1.0.0", + org.apache.commons.httpclient;bundle-version="3.1.0", + org.apache.commons.lang;bundle-version="2.3.0", + com.raytheon.uf.edex.database;bundle-version="1.0.0", + com.raytheon.uf.common.dataplugin;bundle-version="1.12.1174", + uk.ltd.getahead;bundle-version="1.0.0" +Export-Package: com.raytheon.uf.edex.registry.ebxml.init, + com.raytheon.uf.edex.registry.ebxml.services.lifecycle, + com.raytheon.uf.edex.registry.ebxml.services.query diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/scripts/RegistryIndices.sql b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/scripts/RegistryIndices.sql index cb1fa73597..2df42d0fab 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/scripts/RegistryIndices.sql +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/scripts/RegistryIndices.sql @@ -1,4 +1,3 @@ -CREATE INDEX "intlstring_localizedStrings_idx" ON intlstring_localizedstrings USING btree (intlstring_key); -CREATE INDEX "versionInfo_idx" ON versioninfo USING btree (versionname,userversionname); -CREATE INDEX registryobject_slot_idx ON registryobject_slot USING btree (registryobject_id); -CREATE INDEX value_value_idx ON value_value USING btree (value_key); \ No newline at end of file +CREATE INDEX "internationalstring_localizedString_idx" ON ebxml.internationalstring_localizedstring USING btree (internationalstring_key); +CREATE INDEX registryobject_slot_idx ON ebxml.registryobject_slot USING btree (registryobject_id); +CREATE INDEX value_value_idx ON ebxml.value_value USING btree (value_key); \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-common.xml b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-common.xml deleted file mode 100644 index 6a8e3edc3c..0000000000 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-common.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - file:///${edex.home}/conf/db/hibernateConfig/ebxml/hibernate.cfg.xml - - - - oasis.names.tc.ebxml.regrep.xsd.rim.v4 - oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4 - oasis.names.tc.ebxml.regrep.xsd.lcm.v4 - oasis.names.tc.ebxml.regrep.xsd.query.v4 - oasis.names.tc.ebxml.regrep.xsd.rs.v4 - oasis.names.tc.ebxml.regrep.xsd.spi.v4 - com.raytheon.uf.edex.registry.ebxml.services.cataloger - - - - - - - - diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-impl.xml b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-impl.xml index d703377800..84abf7b1a5 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-impl.xml +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-impl.xml @@ -4,7 +4,7 @@ http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> - + + + + + + - + @@ -41,13 +47,15 @@ - + - + + + + - diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-notification.xml b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-notification.xml new file mode 100644 index 0000000000..4e1da5601e --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-notification.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-querytypes.xml b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-querytypes.xml index 6b7433869e..14d0bbc28b 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-querytypes.xml +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-querytypes.xml @@ -1,5 +1,5 @@ @@ -7,50 +7,121 @@ class="com.raytheon.uf.edex.registry.ebxml.services.query.QueryTypeManager"> - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file 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 new file mode 100644 index 0000000000..ea24105d40 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-registry-dao.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-thrift-client.xml b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-thrift-client.xml index 8c2327d973..3178d524a2 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-thrift-client.xml +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-thrift-client.xml @@ -23,18 +23,14 @@ - - - - - + + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd + http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd + http://www.springframework.org/schema/tx + http://www.springframework.org/schema/tx/spring-tx.xsd"> @@ -21,7 +22,8 @@ - + @@ -49,4 +51,17 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-xacml.xml b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-xacml.xml index 662b23f179..a086e67859 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-xacml.xml +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/res/spring/ebxml-xacml.xml @@ -618,7 +618,9 @@ + class="com.raytheon.uf.edex.registry.acp.xacml.engine.function.impl.MatchesRole"> + + + class="com.raytheon.uf.edex.registry.acp.xacml.engine.expression.impl.SubjectAttributeDesignatorExpression"> + + + class="com.raytheon.uf.edex.registry.acp.xacml.engine.policy.impl.IdReferenceEvaluator"> + + + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd + http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd + http://www.springframework.org/schema/tx + http://www.springframework.org/schema/tx/spring-tx.xsd"> - + + + - - - + + class="com.raytheon.uf.edex.registry.acp.xacml.XACMLPolicyEnforcementPoint"> + + + class="com.raytheon.uf.edex.registry.acp.xacml.XACMLContextHandler"> + + + class="com.raytheon.uf.edex.registry.acp.xacml.XACMLPolicyAdministrator"> + + + @@ -57,30 +61,19 @@ - - - - - - + + - - - - - - @@ -88,7 +81,8 @@ init-method="create"> - + @@ -97,19 +91,14 @@ init-method="create"> - + - - - - - - @@ -117,7 +106,8 @@ init-method="create"> - + @@ -126,7 +116,8 @@ init-method="create"> - + @@ -136,5 +127,7 @@ + + diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/XACMLContextHandler.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/XACMLContextHandler.java index 091c3cd2bb..dcff7942cb 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/XACMLContextHandler.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/XACMLContextHandler.java @@ -51,6 +51,8 @@ import org.opensaml.xacml.ctx.impl.RequestTypeImplBuilder; import org.opensaml.xacml.ctx.impl.ResourceTypeImplBuilder; import org.opensaml.xacml.ctx.impl.SubjectTypeImplBuilder; import org.opensaml.xacml.policy.ObligationType; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import com.raytheon.uf.common.registry.IRegistryRequest; import com.raytheon.uf.common.registry.IRegistryRequest.Action; @@ -65,7 +67,7 @@ import com.raytheon.uf.edex.registry.acp.xacml.exception.XACMLNotApplicableExcep import com.raytheon.uf.edex.registry.acp.xacml.exception.XACMLProcessingException; import com.raytheon.uf.edex.registry.acp.xacml.util.XACMLObjectUtil; import com.raytheon.uf.edex.registry.ebxml.constants.RegistryResponseStatus; -import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectTypeDao; +import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectDao; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; import com.raytheon.uf.edex.registry.ebxml.services.query.QueryManagerImpl; import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil; @@ -85,36 +87,28 @@ import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil; * ------------ ---------- ----------- -------------------------- * 8/17/2012 724 bphillip Initial Coding * Oct 01, 2012 1187 djohnson Commented out code throwing {@link ClassCastException}s. + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring injection * * * @author bphillip * @version 1 */ +@Service +@Transactional public class XACMLContextHandler { /** The logger */ private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(XACMLContextHandler.class); - /** The singleton instance */ - private static XACMLContextHandler instance = new XACMLContextHandler(); - private QueryManagerImpl queryManager; - /** - * Private constructor - */ - private XACMLContextHandler() { + private XACMLPolicyAdministrator xacmlPolicyAdmin; - } + private RegistryObjectDao registryObjectDao; + + public XACMLContextHandler() { - /** - * Gets the singleton instance of the XACMLContextHandler - * - * @return The singleton instance of the XACMLContextHandler - */ - public static XACMLContextHandler getInstance() { - return instance; } /** @@ -133,10 +127,8 @@ public class XACMLContextHandler { RequestType request = constructRequest(userName, object); - XACMLObject policy = XACMLPolicyAdministrator - .getInstance() - .getPolicyObject( - "urn:oasis:names:tc:xacml:2.0:data-delivery:default-policySet"); + XACMLObject policy = xacmlPolicyAdmin + .getPolicyObject("urn:oasis:names:tc:xacml:2.0:data-delivery:default-policySet"); XACMLPolicyDecisionPoint pdp = new XACMLPolicyDecisionPoint(policy, request); @@ -325,7 +317,7 @@ public class XACMLContextHandler { for (ObjectRefType ref : refs) { ids.add(ref.getId()); } - return new RegistryObjectTypeDao().getById(ids); + return registryObjectDao.getById(ids); } @@ -353,14 +345,8 @@ public class XACMLContextHandler { attrName = attrTokens[attrTokens.length - 1]; } - Object repoItem = null; - try { - repoItem = new RegistryObjectTypeDao().getById(objId.toString()); - } catch (EbxmlRegistryException e) { - throw new XACMLProcessingException( - "Unable to fetch attribute from repository object. Error querying for resource", - e); - } + Object repoItem = registryObjectDao.getById(objId.toString()); + if (repoItem == null) { throw new XACMLProcessingException( "Unable to fetch attribute from repository object. No object exists with id [" @@ -387,4 +373,12 @@ public class XACMLContextHandler { this.queryManager = queryManager; } + public void setRegistryObjectDao(RegistryObjectDao registryObjectDao) { + this.registryObjectDao = registryObjectDao; + } + + public void setXacmlPolicyAdmin(XACMLPolicyAdministrator xacmlPolicyAdmin) { + this.xacmlPolicyAdmin = xacmlPolicyAdmin; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/XACMLPolicyAdministrator.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/XACMLPolicyAdministrator.java index f70ad964f7..f8ad8c0a41 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/XACMLPolicyAdministrator.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/XACMLPolicyAdministrator.java @@ -26,30 +26,30 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.LifecycleManager; import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.MsgRegistryException; import oasis.names.tc.ebxml.regrep.xsd.lcm.v4.Mode; import oasis.names.tc.ebxml.regrep.xsd.lcm.v4.SubmitObjectsRequest; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ExtrinsicObjectType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.VersionInfoType; import org.opensaml.xacml.XACMLObject; import org.opensaml.xacml.policy.PolicySetType; import org.opensaml.xacml.policy.PolicyType; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import com.raytheon.uf.common.localization.LocalizationFile; import com.raytheon.uf.common.localization.PathManagerFactory; import com.raytheon.uf.common.registry.ebxml.RegistryUtil; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.edex.core.EDEXUtil; import com.raytheon.uf.edex.registry.acp.xacml.util.XACMLParser; import com.raytheon.uf.edex.registry.ebxml.constants.RegistryObjectTypes; import com.raytheon.uf.edex.registry.ebxml.constants.StatusTypes; -import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectTypeDao; +import com.raytheon.uf.edex.registry.ebxml.dao.ExtrinsicObjectDao; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; -import com.raytheon.uf.edex.registry.ebxml.services.util.RegistrySessionManager; -import com.raytheon.uf.edex.registry.ebxml.util.EDEXRegistryManager; +import com.raytheon.uf.edex.registry.ebxml.services.lifecycle.LifecycleManagerImpl; import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil; /** @@ -63,47 +63,35 @@ import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 8/17/2012 724 bphillip Initial Coding + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring injection * * * @author bphillip * @version 1 */ +@Service +@Transactional public class XACMLPolicyAdministrator { /** The status handler */ private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(XACMLPolicyAdministrator.class); - /** The singleton instance */ - private static final XACMLPolicyAdministrator instance = new XACMLPolicyAdministrator(); - /** The map of policies known to the system */ private Map policyMap = new HashMap(); /** The map of policy sets known to the system */ private Map policySetMap = new HashMap(); - /** - * Gets the singleton instance of the XACMLPolicyAdministrator - * - * @return The singleton instance of the XACMLPolicyAdministrator - */ - public static XACMLPolicyAdministrator getInstance() { - return instance; - } + private ExtrinsicObjectDao extrinsicObjectDao; + + private LifecycleManagerImpl lcm; /** * Private constructor */ - private XACMLPolicyAdministrator() { - try { - RegistrySessionManager.openSession(); - loadAccessControlPolicies(); - } catch (MsgRegistryException e) { - e.printStackTrace(); - } finally { - RegistrySessionManager.closeSession(); - } + public XACMLPolicyAdministrator() { + } /** @@ -116,14 +104,16 @@ public class XACMLPolicyAdministrator { * @throws EbxmlRegistryException */ public XACMLObject getPolicyObject(String id) throws EbxmlRegistryException { - XACMLObject policyObject = (XACMLObject) XACMLParser - .getInstance() + List policies = extrinsicObjectDao.getByLid(id); + if (policies.isEmpty()) { + throw new EbxmlRegistryException("No policy exists with id [" + id + + "]"); + } + + XACMLObject policyObject = (XACMLObject) XACMLParser.getInstance() .unmarshallXacmlObjectFromText( - new String( - ((ExtrinsicObjectType) new RegistryObjectTypeDao( - ExtrinsicObjectType.class).getByLid(id)) - .getRepositoryItem(), Charset - .forName("UTF-8"))); + new String(policies.get(0).getRepositoryItem(), Charset + .forName("UTF-8"))); if ((policyObject instanceof PolicyType) || (policyObject instanceof PolicySetType)) { return policyObject; @@ -146,12 +136,16 @@ public class XACMLPolicyAdministrator { public PolicyType getPolicy(String policyId) throws EbxmlRegistryException { PolicyType policy = policyMap.get(policyId); if (policy == null) { - ExtrinsicObjectType policyObj = new RegistryObjectTypeDao( - ExtrinsicObjectType.class).getByLid(policyId); + List policies = extrinsicObjectDao + .getByLid(policyId); + if (policies.isEmpty()) { + throw new EbxmlRegistryException("No policy exists with id [" + + policyId + "]"); + } policy = (PolicyType) XACMLParser.getInstance() .unmarshallXacmlObjectFromText( - new String(policyObj.getRepositoryItem(), Charset - .forName("UTF-8"))); + new String(policies.get(0).getRepositoryItem(), + Charset.forName("UTF-8"))); } return policy; } @@ -169,12 +163,16 @@ public class XACMLPolicyAdministrator { throws EbxmlRegistryException { PolicySetType policySet = policySetMap.get(policySetId); if (policySet == null) { - ExtrinsicObjectType policyObj = new RegistryObjectTypeDao( - ExtrinsicObjectType.class).getByLid(policySetId); + List policySets = extrinsicObjectDao + .getByLid(policySetId); + if (policySets.isEmpty()) { + throw new EbxmlRegistryException("No policy exists with id [" + + policySetId + "]"); + } policySet = (PolicySetType) XACMLParser.getInstance() .unmarshallXacmlObjectFromText( - new String(policyObj.getRepositoryItem(), Charset - .forName("UTF-8"))); + new String(policySets.get(0).getRepositoryItem(), + Charset.forName("UTF-8"))); } return policySet; } @@ -187,9 +185,6 @@ public class XACMLPolicyAdministrator { * policy sets */ public void loadAccessControlPolicies() throws MsgRegistryException { - @SuppressWarnings("rawtypes") - LifecycleManager lcm = ((EDEXRegistryManager) EDEXUtil - .getESBComponent("edexRegistryManager")).getLifeCycleManager(); LocalizationFile[] files = PathManagerFactory.getPathManager() .listStaticFiles("ebxml/acp", new String[] { ".xml" }, true, true); @@ -248,7 +243,7 @@ public class XACMLPolicyAdministrator { regObj.setOwner(RegistryUtil.DEFAULT_OWNER); regObj.setRepositoryItem(serializedPolicy); regObj.setMimeType("text/xml; charset=UTF-8"); - regObj.setVersionInfo(EbxmlObjectUtil.newVersionObject()); + regObj.setVersionInfo(new VersionInfoType()); regObjs.add(regObj); } catch (Exception e) { statusHandler.fatal( @@ -259,4 +254,13 @@ public class XACMLPolicyAdministrator { .createRegistryObjectList(regObjs)); lcm.submitObjects(submitRequest); } + + public void setExtrinsicObjectDao(ExtrinsicObjectDao extrinsicObjectDao) { + this.extrinsicObjectDao = extrinsicObjectDao; + } + + public void setLcm(LifecycleManagerImpl lcm) { + this.lcm = lcm; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/XACMLPolicyDecisionPoint.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/XACMLPolicyDecisionPoint.java index 50d5a5d8b4..228cba834c 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/XACMLPolicyDecisionPoint.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/XACMLPolicyDecisionPoint.java @@ -27,6 +27,8 @@ import org.opensaml.xacml.ctx.RequestType; import org.opensaml.xacml.ctx.ResponseType; import org.opensaml.xacml.ctx.StatusCodeType; import org.opensaml.xacml.policy.ObligationType; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import com.raytheon.uf.edex.registry.acp.xacml.engine.policy.Evaluator; import com.raytheon.uf.edex.registry.acp.xacml.exception.XACMLProcessingException; @@ -49,11 +51,14 @@ import com.raytheon.uf.edex.registry.acp.xacml.util.XACMLObjectUtil; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 8/17/2012 724 bphillip Initial Coding + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring injection * * * @author bphillip * @version 1 */ +@Service +@Transactional public class XACMLPolicyDecisionPoint { /** The obligations to evaluate */ @@ -65,6 +70,10 @@ public class XACMLPolicyDecisionPoint { /** The Request being evaluated */ private RequestType request; + public XACMLPolicyDecisionPoint() { + + } + /** * Creates a new XACMLPolicyDecisionPoint * diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/XACMLPolicyEnforcementPoint.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/XACMLPolicyEnforcementPoint.java index 5639435747..49693415cb 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/XACMLPolicyEnforcementPoint.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/XACMLPolicyEnforcementPoint.java @@ -31,6 +31,8 @@ import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; import org.opensaml.xacml.ctx.DecisionType.DECISION; import org.opensaml.xacml.ctx.ResponseType; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import com.raytheon.uf.common.auth.user.IUser; import com.raytheon.uf.common.registry.IRegistryRequest; @@ -57,11 +59,14 @@ import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 8/17/2012 724 bphillip Initial Coding + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring injection * * * @author bphillip * @version 1 */ +@Service +@Transactional public class XACMLPolicyEnforcementPoint extends AbstractPhaseInterceptor { @@ -69,25 +74,15 @@ public class XACMLPolicyEnforcementPoint extends private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(XACMLPolicyEnforcementPoint.class); - /** The singleton instance */ - private static XACMLPolicyEnforcementPoint instance = new XACMLPolicyEnforcementPoint(); + private XACMLContextHandler xacmlContextHandler; /** * Private constructor */ - private XACMLPolicyEnforcementPoint() { + public XACMLPolicyEnforcementPoint() { super(Phase.PRE_INVOKE); } - /** - * Gets the singleton instance of the XACMLPolicyEnforcementPoint - * - * @return - */ - public static XACMLPolicyEnforcementPoint getInstance() { - return instance; - } - /** * Handles requests from the Thrift client * @@ -104,8 +99,8 @@ public class XACMLPolicyEnforcementPoint extends String requestId = EbxmlObjectUtil.getUUID(); logRequest(theUser, "IRegistryRequest", requestId); try { - ResponseType response = XACMLContextHandler.getInstance() - .authorize(theUser, request); + ResponseType response = xacmlContextHandler.authorize(theUser, + request); DECISION decision = response.getResult().getDecision() .getDecision(); logResult(decision, requestId); @@ -145,8 +140,7 @@ public class XACMLPolicyEnforcementPoint extends + "] Enpoint: [" + requestUri + "]"); ResponseType response; try { - response = XACMLContextHandler.getInstance().authorize(userName, - content); + response = xacmlContextHandler.authorize(userName, content); } catch (MsgRegistryException e) { throw new SoapFault("Error processing XACML request. " + e.getLocalizedMessage(), Soap12.getInstance() @@ -193,4 +187,9 @@ public class XACMLPolicyEnforcementPoint extends statusHandler.info("Authorization Result for Authorization Request [" + id + "]: " + decision); } + + public void setXacmlContextHandler(XACMLContextHandler xacmlContextHandler) { + this.xacmlContextHandler = xacmlContextHandler; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/engine/expression/impl/AttributeDesignatorExpression.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/engine/expression/impl/AttributeDesignatorExpression.java index 8ab32ee703..6dd6f44694 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/engine/expression/impl/AttributeDesignatorExpression.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/engine/expression/impl/AttributeDesignatorExpression.java @@ -76,6 +76,7 @@ import com.raytheon.uf.edex.registry.acp.xacml.util.XACMLObjectUtil.IDENTIFIER_T * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 8/17/2012 724 bphillip Initial Coding + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring injection * * * @author bphillip @@ -83,6 +84,8 @@ import com.raytheon.uf.edex.registry.acp.xacml.util.XACMLObjectUtil.IDENTIFIER_T */ public class AttributeDesignatorExpression implements XACMLExpression { + private XACMLContextHandler xacmlContextHandler; + @Override public String getExpressionId() throws Exception { return AttributeDesignatorTypeImpl.class.getName(); @@ -390,7 +393,7 @@ public class AttributeDesignatorExpression implements XACMLExpression { if (requestAttributeId.equals(requestedAttribute) || XACMLObjectUtil .isAttributeRequest(requestedAttribute)) { - return XACMLContextHandler.getInstance().getAttribute( + return xacmlContextHandler.getAttribute( requestAttributeValue, requestedAttribute); } } @@ -405,7 +408,7 @@ public class AttributeDesignatorExpression implements XACMLExpression { if (requestAttributeId.equals(requestedAttribute) || XACMLObjectUtil .isAttributeRequest(requestedAttribute)) { - return XACMLContextHandler.getInstance().getAttribute( + return xacmlContextHandler.getAttribute( requestAttributeValue, requestedAttribute); } } @@ -419,7 +422,7 @@ public class AttributeDesignatorExpression implements XACMLExpression { if (requestAttributeId.equals(requestedAttribute) || XACMLObjectUtil .isAttributeRequest(requestedAttribute)) { - return XACMLContextHandler.getInstance().getAttribute( + return xacmlContextHandler.getAttribute( requestAttributeValue, requestedAttribute); } } @@ -440,4 +443,9 @@ public class AttributeDesignatorExpression implements XACMLExpression { "Unsupported Operation Type: " + idType); } } + + public void setXacmlContextHandler(XACMLContextHandler xacmlContextHandler) { + this.xacmlContextHandler = xacmlContextHandler; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/engine/function/impl/MatchesRole.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/engine/function/impl/MatchesRole.java index 5a1cf08405..eab43c29b1 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/engine/function/impl/MatchesRole.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/engine/function/impl/MatchesRole.java @@ -46,6 +46,7 @@ import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 8/20/2012 724 bphillip Initial Coding + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring injection * * * @author bphillip @@ -57,6 +58,8 @@ public class MatchesRole extends XACMLFunction { private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(MatchesRole.class); + private RoleDao roleDao; + @Override protected String getFunctionId() { return "urn:oasis:names:tc:ebxml-regrep:4.0:rim:acp:function: matches-role"; @@ -120,7 +123,6 @@ public class MatchesRole extends XACMLFunction { String... contextKey) throws XACMLProcessingException { statusHandler.info("Evaluating matches-role function."); - RoleDao roleDao = new RoleDao(); try { // Get the subject ID from the request object String subjectId = getSubjectId(); @@ -186,4 +188,9 @@ public class MatchesRole extends XACMLFunction { return subjectId; } + + public void setRoleDao(RoleDao roleDao) { + this.roleDao = roleDao; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/engine/policy/impl/IdReferenceEvaluator.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/engine/policy/impl/IdReferenceEvaluator.java index bfaa1696de..4d506d159f 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/engine/policy/impl/IdReferenceEvaluator.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/acp/xacml/engine/policy/impl/IdReferenceEvaluator.java @@ -41,6 +41,7 @@ import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 8/17/2012 724 bphillip Initial Coding + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring injection * * * @author bphillip @@ -48,6 +49,8 @@ import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; */ public class IdReferenceEvaluator extends ElementEvaluator { + private XACMLPolicyAdministrator xacmlPolicyAdmin; + @Override public String getId() { return IdReferenceTypeImpl.class.getName(); @@ -59,8 +62,7 @@ public class IdReferenceEvaluator extends ElementEvaluator { XACMLObject policyObject = null; try { // Get the policy or policy set object referenced - policyObject = XACMLPolicyAdministrator.getInstance().getPolicy( - obj.getValue()); + policyObject = xacmlPolicyAdmin.getPolicy(obj.getValue()); } catch (EbxmlRegistryException e) { throw new XACMLProcessingException( "Error retrieving policy object with id [" + obj.getValue() @@ -74,4 +76,8 @@ public class IdReferenceEvaluator extends ElementEvaluator { return evaluateElement(policyObject); } + public void setXacmlPolicyAdmin(XACMLPolicyAdministrator xacmlPolicyAdmin) { + this.xacmlPolicyAdmin = xacmlPolicyAdmin; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/audittrail/AuditTrailManager.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/audittrail/AuditTrailManager.java index f26a8023d7..04f9fb21bb 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/audittrail/AuditTrailManager.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/audittrail/AuditTrailManager.java @@ -30,6 +30,7 @@ import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ObjectRefListType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ObjectRefType; 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.VersionInfoType; import oasis.names.tc.ebxml.regrep.xsd.rs.v4.RegistryResponseType; import com.raytheon.uf.edex.registry.ebxml.constants.RegistryObjectTypes; @@ -50,6 +51,7 @@ import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil; * ------------ ---------- ----------- -------------------------- * Mar 28, 2012 #363 bphillip Initial creation * 8/3/2012 724 bphillip Modified to use predefined constants + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring injection * * * @@ -59,7 +61,7 @@ import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil; public class AuditTrailManager { /** The data access object used for manipulating registry objects */ - private RegistryObjectTypeDao dao; + private RegistryObjectTypeDao dao; /** * Creates an audit trail entry from a RegistryResponseType @@ -166,8 +168,8 @@ public class AuditTrailManager { } event.setUser("Client"); event.setStatus(StatusTypes.APPROVED); - event.setVersionInfo(EbxmlObjectUtil.newVersionObject()); - dao.save(event); + event.setVersionInfo(new VersionInfoType()); + dao.create(event); } /** @@ -176,7 +178,7 @@ public class AuditTrailManager { * @param dao * The data access object to set */ - public void setDao(RegistryObjectTypeDao dao) { + public void setDao(RegistryObjectTypeDao dao) { this.dao = dao; } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/AssociationDao.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/AssociationDao.java index 6a49cd1677..425aa54518 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/AssociationDao.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/AssociationDao.java @@ -17,12 +17,14 @@ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ + package com.raytheon.uf.edex.registry.ebxml.dao; import java.util.List; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.AssociationType; +import com.raytheon.uf.edex.database.DataAccessLayerException; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; /** @@ -35,20 +37,14 @@ import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 7/30/2012 724 bphillip Initial creation + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring injection * * * * @author bphillip * @version 1.0 */ -public class AssociationDao extends RegistryObjectTypeDao { - - /** - * Constructs a new AssociationDao - */ - public AssociationDao() { - super(AssociationType.class); - } +public class AssociationDao extends RegistryObjectTypeDao { /** * Gets associations based on the association target and type @@ -63,8 +59,13 @@ public class AssociationDao extends RegistryObjectTypeDao { */ public List getByTargetAndType(String target, String type) throws EbxmlRegistryException { - return executeHQLQuery("from AssociationType obj where obj.targetObject='" - + target + "' and obj.type='" + type + "'"); + try { + return executeHQLQuery("from AssociationType obj where obj.targetObject='" + + target + "' and obj.type='" + type + "'"); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException( + "Error getting by target and type", e); + } } /** @@ -80,8 +81,12 @@ public class AssociationDao extends RegistryObjectTypeDao { */ public List getBySourceAndType(String source, String type) throws EbxmlRegistryException { - return executeHQLQuery("from AssociationType obj where obj.sourceObject='" - + source + "' and obj.type='" + type + "'"); + try { + return executeHQLQuery("from AssociationType obj where obj.sourceObject='" + + source + "' and obj.type='" + type + "'"); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } } /** @@ -99,11 +104,15 @@ public class AssociationDao extends RegistryObjectTypeDao { */ public List getBySourceTargetAndType(String source, String target, String type) throws EbxmlRegistryException { - return executeHQLQuery("from AssociationType obj where obj.sourceObject='" - + source - + "' and obj.type='" - + type - + "' and obj.targetObject='" + target + "'"); + try { + return executeHQLQuery("from AssociationType obj where obj.sourceObject='" + + source + + "' and obj.type='" + + type + + "' and obj.targetObject='" + target + "'"); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } } /** @@ -117,11 +126,15 @@ public class AssociationDao extends RegistryObjectTypeDao { */ public List getAllAssociations(String objReferenced) throws EbxmlRegistryException { - return executeHQLQuery("from AssociationType obj where obj.sourceObject='" - + objReferenced - + "' or obj.targetObject='" - + objReferenced - + "'"); + try { + return executeHQLQuery("from AssociationType obj where obj.sourceObject='" + + objReferenced + + "' or obj.targetObject='" + + objReferenced + + "'"); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } } /** @@ -135,8 +148,12 @@ public class AssociationDao extends RegistryObjectTypeDao { */ public List getAssociationsTo(String objReferenced) throws EbxmlRegistryException { - return executeHQLQuery("from AssociationType obj where obj.targetObject='" - + objReferenced + "'"); + try { + return executeHQLQuery("from AssociationType obj where obj.targetObject='" + + objReferenced + "'"); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } } /** @@ -150,8 +167,12 @@ public class AssociationDao extends RegistryObjectTypeDao { */ public List getAssociationsFrom(String objReferenced) throws EbxmlRegistryException { - return executeHQLQuery("from AssociationType obj where obj.sourceObject='" - + objReferenced + "'"); + try { + return executeHQLQuery("from AssociationType obj where obj.sourceObject='" + + objReferenced + "'"); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } } /** @@ -166,7 +187,14 @@ public class AssociationDao extends RegistryObjectTypeDao { throws EbxmlRegistryException { List associations = getAllAssociations(objReferenced); if (!associations.isEmpty()) { - this.delete(associations); + for (AssociationType association : associations) { + this.delete(association); + } } } + + @Override + protected Class getEntityClass() { + return AssociationType.class; + } } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/AuditableEventTypeDao.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/AuditableEventTypeDao.java new file mode 100644 index 0000000000..7755d7f4d0 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/AuditableEventTypeDao.java @@ -0,0 +1,81 @@ +/** + * 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.dao; + +import java.util.List; + +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.AuditableEventType; +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; + +import com.raytheon.uf.edex.database.DataAccessLayerException; +import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; + +/** + * + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 3/18/2013    1802       bphillip    Initial creation
+ * 
+ * 
+ * + * @author bphillip + * @version 1.0 + */ +public class AuditableEventTypeDao extends + RegistryObjectTypeDao { + + /** + * Get events of interest for registry subscriptions + * + * @param objectsOfInterest + * @return + * @throws EbxmlRegistryException + */ + public List getEventsOfInterest( + List objectsOfInterest) + throws EbxmlRegistryException { + String query = "from AuditableEventType event inner join event.action as action inner join action.affectedObjects as AffectedObjects inner join AffectedObjects.registryObject as RegistryObjects where RegistryObjects.id = '"; + for (int i = 0; i < objectsOfInterest.size(); i++) { + query += "'" + objectsOfInterest.get(i).getId() + "'"; + if (i != objectsOfInterest.size() - 1) { + query += ","; + } + } + query += "'"; + + try { + return this.executeHQLQuery(query); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } + } + + @Override + protected Class getEntityClass() { + return AuditableEventType.class; + } + +} diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/ClassificationNodeDao.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/ClassificationNodeDao.java index 5547cbb60e..4d352802fe 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/ClassificationNodeDao.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/ClassificationNodeDao.java @@ -23,6 +23,7 @@ import java.util.List; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ClassificationNodeType; +import com.raytheon.uf.edex.database.DataAccessLayerException; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; /** @@ -36,13 +37,15 @@ import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; * ------------ ---------- ----------- -------------------------- * 2/21/2012 184 bphillip Initial creation * 8/3/2012 724 bphillip Added more methods for getting classification nodes + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring injection * * * * @author bphillip * @version 1.0 */ -public class ClassificationNodeDao extends RegistryObjectTypeDao { +public class ClassificationNodeDao extends + RegistryObjectTypeDao { /** Regex to use when querying for telephone types */ public static final String TELEPHONE_TYPE_REGEX = "urn:oasis:names:tc:ebxml-regrep:PhoneType:%"; @@ -53,11 +56,8 @@ public class ClassificationNodeDao extends RegistryObjectTypeDao { /** Regex to use when querying for email types */ public static final String EMAIL_TYPE_REGEX = "urn:oasis:names:tc:ebxml-regrep:EmailType:%"; - /** - * Creates a new ClassificationNodeDao - */ public ClassificationNodeDao() { - super(ClassificationNodeType.class); + } /** @@ -71,9 +71,14 @@ public class ClassificationNodeDao extends RegistryObjectTypeDao { */ public ClassificationNodeType getByPath(String path) throws EbxmlRegistryException { - List result = this - .executeHQLQuery("select obj from ClassificationNodeType obj where obj.path='" - + path + "'"); + List result; + try { + result = this + .executeHQLQuery("select obj from ClassificationNodeType obj where obj.path='" + + path + "'"); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } if (result.isEmpty()) { return null; } else { @@ -91,9 +96,14 @@ public class ClassificationNodeDao extends RegistryObjectTypeDao { * If errors occur during interaction with the database */ public String getNodeFromCode(String code) throws EbxmlRegistryException { - List results = this - .executeHQLQuery("select obj.id from ClassificationNodeType obj where obj.code='" - + code + "'"); + List results; + try { + results = this + .executeHQLQuery("select obj.id from ClassificationNodeType obj where obj.code='" + + code + "'"); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } if (results.isEmpty()) { return null; @@ -112,9 +122,14 @@ public class ClassificationNodeDao extends RegistryObjectTypeDao { * If errors occur during interaction with the database */ public String getCodeFromNode(String id) throws EbxmlRegistryException { - List results = this - .executeHQLQuery("select obj.code from ClassificationNodeType obj where obj.id='" - + id + "'"); + List results; + try { + results = this + .executeHQLQuery("select obj.code from ClassificationNodeType obj where obj.id='" + + id + "'"); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } if (results.isEmpty()) { return null; @@ -131,9 +146,13 @@ public class ClassificationNodeDao extends RegistryObjectTypeDao { * If errors occur during interaction with the database */ public List getTelephoneTypes() throws EbxmlRegistryException { - return this - .executeHQLQuery("select obj.code from ClassificationNodeType obj where obj.lid like '" - + TELEPHONE_TYPE_REGEX + "'"); + try { + return this + .executeHQLQuery("select obj.code from ClassificationNodeType obj where obj.lid like '" + + TELEPHONE_TYPE_REGEX + "'"); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } } /** @@ -144,9 +163,13 @@ public class ClassificationNodeDao extends RegistryObjectTypeDao { * If errors occur during interaction with the database */ public List getAddressTypes() throws EbxmlRegistryException { - return this - .executeHQLQuery("select obj.code from ClassificationNodeType obj where obj.lid like '" - + ADDRESS_TYPE_REGEX + "'"); + try { + return this + .executeHQLQuery("select obj.code from ClassificationNodeType obj where obj.lid like '" + + ADDRESS_TYPE_REGEX + "'"); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } } /** @@ -157,8 +180,17 @@ public class ClassificationNodeDao extends RegistryObjectTypeDao { * If errors occur during interaction with the database */ public List getEmailTypes() throws EbxmlRegistryException { - return this - .executeHQLQuery("select obj.code from ClassificationNodeType obj where obj.lid like '" - + EMAIL_TYPE_REGEX + "'"); + try { + return this + .executeHQLQuery("select obj.code from ClassificationNodeType obj where obj.lid like '" + + EMAIL_TYPE_REGEX + "'"); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } + } + + @Override + protected Class getEntityClass() { + return ClassificationNodeType.class; } } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/ClassificationSchemeDao.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/ClassificationSchemeDao.java new file mode 100644 index 0000000000..5632ad2d83 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/ClassificationSchemeDao.java @@ -0,0 +1,52 @@ +/** + * 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.dao; + +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ClassificationSchemeType; + +/** + * Data access object for retrieving ClassificationNodeTypes + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 3/18/2013    1082       bphillip     Initial creation
+ * 
+ * 
+ * + * @author bphillip + * @version 1.0 + */ +public class ClassificationSchemeDao extends + RegistryObjectTypeDao { + + public ClassificationSchemeDao() { + + } + + @Override + protected Class getEntityClass() { + return ClassificationSchemeType.class; + } +} diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/ClassificationTypeDao.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/ClassificationTypeDao.java new file mode 100644 index 0000000000..101c8166f4 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/ClassificationTypeDao.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.edex.registry.ebxml.dao; + +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ClassificationType; + +/** + * Data access object for retrieving ClassificationNodeTypes + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 3/18/2013    1082       bphillip     Initial creation
+ * 
+ * 
+ * + * @author bphillip + * @version 1.0 + */ +public class ClassificationTypeDao extends + RegistryObjectTypeDao { + + public ClassificationTypeDao() { + + } + + @Override + protected Class getEntityClass() { + return ClassificationType.class; + } +} 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 609b624349..04bca94236 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 @@ -26,14 +26,12 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.lang.reflect.Field; -import java.sql.Connection; -import java.sql.ResultSet; import java.sql.SQLException; -import java.sql.Statement; import java.util.ArrayList; import java.util.Collection; import java.util.Enumeration; import java.util.List; +import java.util.Map; import java.util.jar.JarEntry; import java.util.jar.JarFile; @@ -42,10 +40,14 @@ import oasis.names.tc.ebxml.regrep.xsd.lcm.v4.SubmitObjectsRequest; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; import org.apache.commons.beanutils.PropertyUtils; -import org.hibernate.Session; +import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.impl.SessionFactoryImpl; -import org.hibernate.jdbc.Work; +import org.springframework.context.ApplicationEvent; +import org.springframework.context.ApplicationListener; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; import com.raytheon.uf.common.localization.LocalizationFile; import com.raytheon.uf.common.localization.PathManagerFactory; @@ -55,10 +57,12 @@ import com.raytheon.uf.common.serialization.SerializationUtil; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.util.ReflectionUtil; +import com.raytheon.uf.edex.core.EDEXUtil; import com.raytheon.uf.edex.core.props.PropertiesFactory; +import com.raytheon.uf.edex.registry.acp.xacml.XACMLPolicyAdministrator; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; +import com.raytheon.uf.edex.registry.ebxml.init.RegistryInitializedListener; import com.raytheon.uf.edex.registry.ebxml.services.lifecycle.LifecycleManagerImpl; -import com.raytheon.uf.edex.registry.ebxml.services.util.RegistrySessionManager; /** * The DbInit class is responsible for ensuring that the appropriate tables are @@ -71,19 +75,24 @@ import com.raytheon.uf.edex.registry.ebxml.services.util.RegistrySessionManager; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 2/9/2012 184 bphillip Initial Coding + * 3/18/2013 1082 bphillip Changed to use transactional boundaries and spring injection * * * @author bphillip * @version 1 */ -public class DbInit extends RegistryDao { +@Repository +@Transactional +public class DbInit implements ApplicationListener { + + private static volatile boolean INITIALIZED = false; /** The logger */ private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(DbInit.class); /** Query to check which tables exist in the ebxml database */ - private static final String TABLE_CHECK_QUERY = "SELECT tablename FROM pg_tables where schemaname = 'public';"; + private static final String TABLE_CHECK_QUERY = "SELECT tablename FROM pg_tables where schemaname = 'ebxml';"; /** Constant used for table regeneration */ private static final String DROP_TABLE = "drop table "; @@ -99,18 +108,12 @@ public class DbInit extends RegistryDao { private LifecycleManagerImpl lcm; - /** - * Creates a new instance of DbInit. This constructor should only be called - * once when loaded by the Spring container. - * - * @throws EbxmlRegistryException - * If errors occur while regenerating the database tables - */ - public DbInit(LifecycleManagerImpl lcm) throws EbxmlRegistryException { - super(null); - this.lcm = lcm; - // try { - initDb(); + private SessionFactory sessionFactory; + + private XACMLPolicyAdministrator xacmlAdmin; + + public DbInit() { + } /** @@ -123,17 +126,18 @@ public class DbInit extends RegistryDao { * * @throws EbxmlRegistryException */ - private void initDb() throws EbxmlRegistryException { + protected void initDb() throws EbxmlRegistryException { /* * Create a new configuration object which holds all the classes that * this Hibernate SessionFactory is aware of */ AnnotationConfiguration aConfig = new AnnotationConfiguration(); - for (Object obj : this.getSessionFactory().getAllClassMetadata() - .keySet()) { + for (Object obj : sessionFactory.getAllClassMetadata().keySet()) { try { Class clazz = Class.forName((String) obj); - aConfig.addAnnotatedClass(clazz); + if (clazz.getName().startsWith("oasis")) { + aConfig.addAnnotatedClass(clazz); + } } catch (ClassNotFoundException e) { statusHandler.error( "Error initializing RegRep database. Class not found: " @@ -217,51 +221,34 @@ public class DbInit extends RegistryDao { private void dropTables(final AnnotationConfiguration aConfig) throws SQLException, EbxmlRegistryException { - this.doInTransaction(new RegistryTransactionCallback() { + final String[] dropSqls = aConfig + .generateDropSchemaScript(((SessionFactoryImpl) sessionFactory) + .getDialect()); - @Override - public Object execute(Session session) - throws EbxmlRegistryException { - session.doWork(new Work() { - @Override - public void execute(Connection connection) - throws SQLException { - final String[] dropSqls = aConfig - .generateDropSchemaScript(((SessionFactoryImpl) getSessionFactory()) - .getDialect()); - Statement stmt = connection.createStatement(); - for (String sql : dropSqls) { - if (sql.startsWith(DROP_TABLE)) { - // Modify the drop string to add the 'if exists' - // and - // 'cascade' clauses to avoid any errors if the - // tables - // do not exist already - sql = sql.replace(DROP_TABLE, DROP_TABLE - + IF_EXISTS); - sql += CASCADE; - stmt.execute(sql); - connection.commit(); - } else if (sql.startsWith(DROP_SEQUENCE)) { - // Modify the drop string to add the 'if exists' - // and - // 'cascade' clauses to avoid any errors if the - // tables - // do not exist already - sql = sql.replace(DROP_SEQUENCE, DROP_SEQUENCE - + IF_EXISTS); - sql += CASCADE; - stmt.execute(sql); - connection.commit(); - } - - } - } - }); - return null; + for (String sql : dropSqls) { + if (sql.startsWith(DROP_TABLE)) { + // Modify the drop string to add the 'if exists' + // and + // 'cascade' clauses to avoid any errors if the + // tables + // do not exist already + sql = sql.replace(DROP_TABLE, DROP_TABLE + IF_EXISTS); + sql += CASCADE; + sessionFactory.getCurrentSession().createSQLQuery(sql) + .executeUpdate(); + } else if (sql.startsWith(DROP_SEQUENCE)) { + // Modify the drop string to add the 'if exists' + // and + // 'cascade' clauses to avoid any errors if the + // tables + // do not exist already + sql = sql.replace(DROP_SEQUENCE, DROP_SEQUENCE + IF_EXISTS); + sql += CASCADE; + sessionFactory.getCurrentSession().createSQLQuery(sql) + .executeUpdate(); } - }); + } } /** @@ -278,30 +265,13 @@ public class DbInit extends RegistryDao { private void createTables(final AnnotationConfiguration aConfig) throws SQLException, EbxmlRegistryException { - this.doInTransaction(new RegistryTransactionCallback() { - - @Override - public Object execute(Session session) - throws EbxmlRegistryException { - final String[] createSqls = aConfig - .generateSchemaCreationScript(((SessionFactoryImpl) getSessionFactory()) - .getDialect()); - session.doWork(new Work() { - @Override - public void execute(Connection connection) - throws SQLException { - Statement stmt = connection.createStatement(); - for (String sql : createSqls) { - stmt.execute(sql); - connection.commit(); - } - - } - }); - return null; - } - }); - + final String[] createSqls = aConfig + .generateSchemaCreationScript(((SessionFactoryImpl) sessionFactory) + .getDialect()); + for (String createSql : createSqls) { + sessionFactory.getCurrentSession().createSQLQuery(createSql) + .executeUpdate(); + } } /** @@ -322,28 +292,15 @@ public class DbInit extends RegistryDao { statusHandler.info("Verifying RegRep database..."); final List existingTables = new ArrayList(); List definedTables = new ArrayList(); - this.doInTransaction(new RegistryTransactionCallback() { - @Override - public Object execute(Session session) - throws EbxmlRegistryException { - session.doWork(new Work() { - @Override - public void execute(Connection connection) - throws SQLException { - Statement stmt = connection.createStatement(); - ResultSet results = stmt - .executeQuery(TABLE_CHECK_QUERY); - while (results.next()) { - existingTables.add(results.getString(1)); - } - } - }); - return null; - } - }); + @SuppressWarnings("unchecked") + List tables = (List) sessionFactory.getCurrentSession() + .createSQLQuery(TABLE_CHECK_QUERY).list(); + for (String table : tables) { + existingTables.add("ebxml." + table); + } final String[] dropSqls = aConfig - .generateDropSchemaScript(((SessionFactoryImpl) getSessionFactory()) + .generateDropSchemaScript(((SessionFactoryImpl) sessionFactory) .getDialect()); for (String sql : dropSqls) { if (sql.startsWith(DROP_TABLE)) { @@ -357,6 +314,11 @@ public class DbInit extends RegistryDao { // defined in the database already if (existingTables.size() <= definedTables.size() && !existingTables.containsAll(definedTables)) { + for (String defined : definedTables) { + if (!existingTables.contains(defined)) { + statusHandler.warn("MISSING TABLE: " + defined); + } + } return false; } return true; @@ -402,15 +364,7 @@ public class DbInit extends RegistryDao { "Error assigning default owner", e); } } - - // try { - RegistrySessionManager.openSession(); - try { - lcm.submitObjectsInternal(obj); - } finally { - RegistrySessionManager.closeSession(); - } - + lcm.submitObjectsInternal(obj); } } @@ -449,23 +403,8 @@ public class DbInit extends RegistryDao { while ((line = reader.readLine()) != null) { buffer.append(line); } - this.doInTransaction(new RegistryTransactionCallback() { - @Override - public Object execute(Session session) - throws EbxmlRegistryException { - session.doWork(new Work() { - @Override - public void execute(Connection connection) - throws SQLException { - Statement stmt = connection - .createStatement(); - stmt.execute(buffer.toString()); - connection.commit(); - } - }); - return null; - } - }); + sessionFactory.getCurrentSession() + .createSQLQuery(buffer.toString()).executeUpdate(); } catch (Exception e) { throw new EbxmlRegistryException( "Unable to execute SQL Scripts for registry", e); @@ -543,4 +482,36 @@ public class DbInit extends RegistryDao { this.lcm = lcm; } + public void setSessionFactory(SessionFactory sessionFactory) { + this.sessionFactory = sessionFactory; + } + + @Transactional(propagation = Propagation.REQUIRED) + public void onApplicationEvent(ApplicationEvent event) { + if (!INITIALIZED) { + try { + initDb(); + xacmlAdmin.loadAccessControlPolicies(); + } catch (EbxmlRegistryException e) { + statusHandler.fatal("Error initializing EBXML database!", e); + } catch (MsgRegistryException e) { + statusHandler.fatal("Error initializing EBXML database!", e); + } + + statusHandler.info("Executing post initialization actions"); + @SuppressWarnings("unchecked") + Map beans = EDEXUtil + .getSpringContext().getBeansOfType( + RegistryInitializedListener.class); + for (RegistryInitializedListener listener : beans.values()) { + listener.executeAfterRegistryInit(); + } + INITIALIZED = true; + } + } + + public void setXacmlAdmin(XACMLPolicyAdministrator xacmlAdmin) { + this.xacmlAdmin = xacmlAdmin; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/ExtrinsicObjectDao.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/ExtrinsicObjectDao.java new file mode 100644 index 0000000000..3b8950875e --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/ExtrinsicObjectDao.java @@ -0,0 +1,52 @@ +/** + * 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.dao; + +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ExtrinsicObjectType; + +/** + * Data access object for retrieving ExtrinsicObject types + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 3/18/2013    1082       bphillip     Initial creation
+ * 
+ * 
+ * + * @author bphillip + * @version 1.0 + */ +public class ExtrinsicObjectDao extends + RegistryObjectTypeDao { + + public ExtrinsicObjectDao() { + + } + + @Override + protected Class getEntityClass() { + return ExtrinsicObjectType.class; + } + +} diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/IdentifiableTypeDao.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/IdentifiableTypeDao.java new file mode 100644 index 0000000000..e787b221d1 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/IdentifiableTypeDao.java @@ -0,0 +1,122 @@ +/** + * This software was developed and / or modifieimport java.util.Arrays; +import java.util.List; + +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.IdentifiableType; + +import org.hibernate.criterion.DetachedCriteria; +import org.hibernate.criterion.Projections; +import org.hibernate.criterion.Property; + +import com.raytheon.uf.edex.database.DataAccessLayerException; +import com.raytheon.uf.edex.database.dao.SessionManagedDao; +import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; +import com.raytheon.uf.edex.registry.ebxml.services.query.QueryConstants; + 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.dao; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.IdentifiableType; + +import com.raytheon.uf.edex.database.DataAccessLayerException; +import com.raytheon.uf.edex.database.dao.SessionManagedDao; +import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; +import com.raytheon.uf.edex.registry.ebxml.services.query.QueryConstants; + +/** + * Data access object for retrieving IdentifiableType objects + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 3/18/2013    1082       bphillip     Initial creation
+ * 
+ * 
+ * + * @author bphillip + * @version 1.0 + */ +public abstract class IdentifiableTypeDao + extends SessionManagedDao { + + public IdentifiableTypeDao() { + + } + + @Override + public ENTITY getById(String id) { + return super.getById(id); + } + + /** + * Retrieves registry objects based on id values + * + * @param + * A class type extending RegistryObjectType + * @param ids + * The array of ids to query for + * @return The list of registry objects; + * @throws EbxmlRegistryException + * If the query encounters errors + */ + public List getById(String... ids) throws EbxmlRegistryException { + return getById(Arrays.asList(ids)); + } + + /** + * Retrieves registry objects based on id values + * + * @param + * A class type extending RegistryObjectType + * @param ids + * The list of ids to query for + * @return The list of registry objects; + * @throws EbxmlRegistryException + * If the query encounters errors + */ + public List getById(List ids) throws EbxmlRegistryException { + try { + return this.executeHQLQuery(HqlQueryUtil.assembleSingleParamQuery( + this.getEntityClass(), QueryConstants.ID, "in", ids)); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } + } + + /** + * Queries for all ids of registry objects matching the pattern of the given + * id. A query using 'like' will be executed. + * + * @param id + * The id containing % or _ denoting wildcard characters + * @return List of ids matching the given id pattern + * @throws EbxmlRegistryException + * If errors occur during the query + */ + public List getMatchingIds(String id) throws EbxmlRegistryException { + Map params = new HashMap(); + params.put("id", id); + String hql = "select obj.id from " + + this.getEntityClass().getSimpleName() + + " obj where obj.id like :id"; + try { + return this.executeHQLQuery(hql, false, params); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } + } + +} diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/OrganizationDao.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/OrganizationDao.java index 3a16e25262..8a5438da78 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/OrganizationDao.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/OrganizationDao.java @@ -17,6 +17,7 @@ * See the AWIPS II Master Rights File ("Master Rights File.pdf") for * further licensing information. **/ + package com.raytheon.uf.edex.registry.ebxml.dao; import java.util.List; @@ -24,6 +25,7 @@ import java.util.List; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.AssociationType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.OrganizationType; +import com.raytheon.uf.edex.database.DataAccessLayerException; import com.raytheon.uf.edex.registry.ebxml.constants.AssociationTypes; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; @@ -37,19 +39,23 @@ import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 7/30/2012 724 bphillip Initial creation + * 3/13/2013 1082 bphillip Modified to use spring injection and transaction boundaries * * * * @author bphillip * @version 1.0 */ -public class OrganizationDao extends RegistryObjectTypeDao { +public class OrganizationDao extends RegistryObjectTypeDao { + + /** The Association data access object */ + private AssociationDao associationDao; /** - * Creates a new organization data access object + * Creates a new Organization Dao */ public OrganizationDao() { - super(OrganizationType.class); + } /** @@ -61,7 +67,11 @@ public class OrganizationDao extends RegistryObjectTypeDao { */ public List getAllOrganizations() throws EbxmlRegistryException { - return executeHQLQuery("from OrganizationType"); + try { + return executeHQLQuery("from OrganizationType"); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } } /** @@ -76,10 +86,15 @@ public class OrganizationDao extends RegistryObjectTypeDao { */ public List getOrganizationByName(String name) throws EbxmlRegistryException { - List orgs = executeHQLQuery("select obj from OrganizationType obj inner join obj.name.localizedString as theName where lower(obj.id) like '%" - + name.toLowerCase() - + "%' or lower(theName.value) like '%" - + name.toLowerCase() + "%' order by obj.id asc"); + List orgs; + try { + orgs = executeHQLQuery("select obj from OrganizationType obj inner join obj.name.localizedString as theName where lower(obj.id) like '%" + + name.toLowerCase() + + "%' or lower(theName.value) like '%" + + name.toLowerCase() + "%' order by obj.id asc"); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } return orgs; } @@ -94,12 +109,22 @@ public class OrganizationDao extends RegistryObjectTypeDao { */ public OrganizationType getOrganizationForUser(String user) throws EbxmlRegistryException { - List associations = new AssociationDao() - .getBySourceAndType(user, AssociationTypes.EMPLOYEE_OF); + List associations = associationDao.getBySourceAndType( + user, AssociationTypes.EMPLOYEE_OF); if (associations.isEmpty()) { return null; } else { return getById(associations.get(0).getTargetObject()); } } + + public void setAssociationDao(AssociationDao associationDao) { + this.associationDao = associationDao; + } + + @Override + protected Class getEntityClass() { + return OrganizationType.class; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/PartyDao.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/PartyDao.java new file mode 100644 index 0000000000..5e7c325d1b --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/PartyDao.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.edex.registry.ebxml.dao; + +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.PartyType; + +/** + * Data Access object for interacting with parties in the registry + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 3/13/2013    1082       bphillip    Initial creation
+ * 
+ * 
+ * + * @author bphillip + * @version 1.0 + */ +public class PartyDao extends RegistryObjectTypeDao { + + public PartyDao() { + + } + + @Override + protected Class getEntityClass() { + return PartyType.class; + } +} diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/PersonDao.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/PersonDao.java index 15f3468eb1..cc417aee44 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/PersonDao.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/PersonDao.java @@ -26,6 +26,7 @@ import java.util.List; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.AssociationType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.PersonType; +import com.raytheon.uf.edex.database.DataAccessLayerException; import com.raytheon.uf.edex.registry.ebxml.constants.AssociationTypes; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; @@ -39,19 +40,21 @@ import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 7/30/2012 724 bphillip Initial creation + * 3/13/2013 1082 bphillip Modified to use spring injection and transaction boundaries * * * * @author bphillip * @version 1.0 */ -public class PersonDao extends RegistryObjectTypeDao { +public class PersonDao extends RegistryObjectTypeDao { + + private AssociationDao associationDao; /** * Creates a new Person data access object */ public PersonDao() { - super(PersonType.class); } /** @@ -69,10 +72,14 @@ public class PersonDao extends RegistryObjectTypeDao { if (firstName == null || firstName.trim().isEmpty()) { return Collections.emptyList(); } - return this - .executeHQLQuery("select obj from PersonType obj where lower(obj.personName.firstName) like '%" - + firstName.toLowerCase() - + "%' order by obj.personName.lastName asc, obj.personName.firstName asc"); + try { + return this + .executeHQLQuery("select obj from PersonType obj where lower(obj.personName.firstName) like '%" + + firstName.toLowerCase() + + "%' order by obj.personName.lastName asc, obj.personName.firstName asc"); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } } /** @@ -90,10 +97,14 @@ public class PersonDao extends RegistryObjectTypeDao { if (lastName == null || lastName.trim().isEmpty()) { return Collections.emptyList(); } - return this - .executeHQLQuery("select obj from PersonType obj where lower(obj.personName.lastName) like '%" - + lastName.toLowerCase() - + "%' order by obj.personName.lastName asc, obj.personName.firstName asc"); + try { + return this + .executeHQLQuery("select obj from PersonType obj where lower(obj.personName.lastName) like '%" + + lastName.toLowerCase() + + "%' order by obj.personName.lastName asc, obj.personName.firstName asc"); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } } /** @@ -111,19 +122,27 @@ public class PersonDao extends RegistryObjectTypeDao { public List getByFirstAndLastName(String firstName, String lastName) throws EbxmlRegistryException { if (firstName.trim().isEmpty() && lastName.trim().isEmpty()) { - return this.executeHQLQuery("from PersonType"); + try { + return this.executeHQLQuery("from PersonType"); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } } if (firstName == null || firstName.trim().isEmpty()) { return getByLastName(lastName); } else if (lastName == null || lastName.trim().isEmpty()) { return getByFirstName(firstName); } - return this - .executeHQLQuery("select obj from PersonType obj where lower(obj.personName.firstName) like '%" - + firstName.toLowerCase() - + "%' and lower(obj.personName.lastName) like '%" - + lastName.toLowerCase() - + "%' order by obj.personName.lastName asc, obj.personName.firstName asc"); + try { + return this + .executeHQLQuery("select obj from PersonType obj where lower(obj.personName.firstName) like '%" + + firstName.toLowerCase() + + "%' and lower(obj.personName.lastName) like '%" + + lastName.toLowerCase() + + "%' order by obj.personName.lastName asc, obj.personName.firstName asc"); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } } /** @@ -138,13 +157,10 @@ public class PersonDao extends RegistryObjectTypeDao { public List getEmployeesOfOrganization(String orgId) throws EbxmlRegistryException { List employees = new ArrayList(); - AssociationDao associationDao = new AssociationDao(); - PersonDao personDao = new PersonDao(); List associations = associationDao.getByTargetAndType( orgId, AssociationTypes.EMPLOYEE_OF); for (AssociationType association : associations) { - employees.add((PersonType) personDao.getById(association - .getSourceObject())); + employees.add((PersonType) getById(association.getSourceObject())); } return employees; } @@ -160,9 +176,13 @@ public class PersonDao extends RegistryObjectTypeDao { * If errors occur during interaction with the database */ public Object getAllUserNames() throws EbxmlRegistryException { - return this - .executeHQLQuery("select obj.id, obj.personName.firstName, obj.personName.lastName from PersonType obj " - + "order by obj.personName.lastName asc, obj.personName.firstName asc"); + try { + return this + .executeHQLQuery("select obj.id, obj.personName.firstName, obj.personName.lastName from PersonType obj " + + "order by obj.personName.lastName asc, obj.personName.firstName asc"); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } } /** @@ -188,4 +208,14 @@ public class PersonDao extends RegistryObjectTypeDao { public PersonType getByUserId(String userId) throws EbxmlRegistryException { return this.getById(userId); } + + public void setAssociationDao(AssociationDao associationDao) { + this.associationDao = associationDao; + } + + @Override + protected Class getEntityClass() { + return PersonType.class; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/RegistryDao.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/RegistryDao.java deleted file mode 100644 index f34a64097c..0000000000 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/RegistryDao.java +++ /dev/null @@ -1,522 +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.dao; - -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ExtensibleObjectType; - -import org.hibernate.HibernateException; -import org.hibernate.Query; -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.hibernate.Transaction; -import org.hibernate.criterion.DetachedCriteria; -import org.springframework.orm.hibernate3.support.HibernateDaoSupport; - -import com.raytheon.uf.common.serialization.SerializationUtil; -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.edex.core.EDEXUtil; -import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; -import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil; - -/** - * This class is the base class from which all data access objects used by the - * RegRep registry inherit. This class contains the necessary basic functions of - * deleting, inserting, updating and querying. - * - *
- * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * Jan 18, 2012            bphillip     Initial creation
- * 
- * 
- * - * @author bphillip - * @version 1.0 - */ - -public class RegistryDao extends HibernateDaoSupport { - - /** The logger */ - private static final transient IUFStatusHandler statusHandler = UFStatus - .getHandler(RegistryDao.class); - - /** - * The name of the session factory used by this dao - */ - protected static final String SESSION_FACTORY_NAME = "ebxmlSessionFactory"; - - /** The region in the cache which stores the queries */ - private static final String QUERY_CACHE_REGION = "Queries"; - - /** - * The class on which this data access object operates. - */ - protected Class daoClass; - - /** - * Creates a new RegistryDao that is not assigned a class - */ - public RegistryDao() { - this(null); - } - - /** - * Creates a new data access object for the specified class - * - * @param clazz - * The class on which this data access object will operate - */ - public RegistryDao(Class clazz) { - super(); - this.daoClass = clazz; - setSessionFactory((SessionFactory) EDEXUtil - .getESBComponent(SESSION_FACTORY_NAME)); - } - - /** - * Opens a Hibernate transaction and binds it to this thread - */ - public void openSession() { - this.getSessionFactory().getCurrentSession().beginTransaction(); - } - - /** - * Closes the transaction currently bound to this thread - */ - public void closeSession() { - if (this.getSessionFactory().getCurrentSession().getTransaction() - .isActive()) { - this.getSessionFactory().getCurrentSession().getTransaction() - .commit(); - } else { - statusHandler - .warn("Transaction is no longer active due to previous errors"); - } - } - - public void rollback() { - if (this.getSessionFactory().getCurrentSession().getTransaction() - .isActive()) { - this.getSessionFactory().getCurrentSession().getTransaction() - .rollback(); - } else { - statusHandler - .warn("Transaction is no longer active due to previous errors"); - } - - } - - /** - * Retrieves all objects of the specified type which are stored in the - * database - * - * @param - * Class extending ExtensibleObjectType - * @param type - * The type to load - * @return All objects of the specified type - * @throws EbxmlRegistryException - * If errors are encountered during the HQL query - */ - public List getAllObjectsOfType( - Class type) throws EbxmlRegistryException { - return executeHQLQuery("from " + type.getName()); - } - - /** - * Executes an HQL query in a new Hibernate session - * - * @param - * An object type to query for - * @param queryString - * The query to execute - * @return The results of the HQL query - * @throws EbxmlRegistryException - * If errors are encountered during the HQL query - */ - public List executeHQLQuery(String queryString) - throws EbxmlRegistryException { - return executeHQLQuery(queryString, true, null); - } - - /** - * Executes an HQL query - * - * @param - * The return object type - * @param queryString - * A StringBuilder instance containing an HQL query to execute - * @return List containing the results of the query - * @throws EbxmlRegistryException - * If Hibernate errors occur during execution of the query - */ - public List executeHQLQuery(StringBuilder queryString) - throws EbxmlRegistryException { - return executeHQLQuery(queryString.toString(), true, null); - } - - /** - * Executes an HQL query with a map of name value pairs with which to - * substitute into the query. This method is a convenience method for - * executing prepared statements - * - * @param - * The return object type - * @param queryString - * The prepared HQL query to execute. This query contains values - * that will be substituted according to the names and values - * found in the params map - * @param params - * The named parameters to substitute into the HQL query - * @return List containing the results of the query - * @throws EbxmlRegistryException - * If Hibernate errors occur during the execution of the query - */ - public List executeHQLQuery(String queryString, - Map params) throws EbxmlRegistryException { - return executeHQLQuery(queryString, true, params); - } - - /** - * Executes an HQL query in an existing Hibernate session - * - * @param - * An object type to query for - * @param queryString - * The query to execute - * @param session - * The existing Hibernate session - * @return The results of the HQL query - * @throws EbxmlRegistryException - * if errors are encountered during the HQL query - */ - @SuppressWarnings("unchecked") - public List executeHQLQuery(final String queryString, - boolean eager, final Map params) - throws EbxmlRegistryException { - try { - return (List) doInTransaction(new RegistryTransactionCallback() { - @Override - public Object execute(Session session) - throws EbxmlRegistryException { - Query query = session.createQuery(queryString) - .setCacheable(true) - .setCacheRegion(QUERY_CACHE_REGION); - if (params != null) { - for (String name : params.keySet()) { - Object val = params.get(name); - query.setParameter(name, val); - } - } - List results = query.list(); - return results; - } - }); - } catch (Throwable e) { - throw new EbxmlRegistryException("Error executing HQLQuery [" - + queryString + "]", e); - } - } - - /** - * Gets a new DetachedCriteria instance for the daoClass - * - * @return The new DetachedCriteria instance for the daoClass - */ - protected DetachedCriteria getCriteriaInstance() { - return DetachedCriteria.forClass(daoClass); - } - - /** - * Executes a criteria query. This method expects a DetachedQuery instance. - * The DetachedQuery is attached to a new session and executed - * - * @param - * An Object type - * @param criteria - * The DetachedCriteria instance to execute - * @return The results of the query - * @throws EbxmlRegistryException - * If errors occur in Hibernate while executing the query - */ - @SuppressWarnings("unchecked") - public List executeCriteriaQuery( - final DetachedCriteria criteria) throws EbxmlRegistryException { - if (criteria == null) { - return Collections.emptyList(); - } - - return (List) this - .doInTransaction(new RegistryTransactionCallback() { - @Override - public Object execute(Session session) - throws EbxmlRegistryException { - try { - List results = null; - results = criteria.getExecutableCriteria(session) - .setCacheable(true) - .setCacheRegion(QUERY_CACHE_REGION).list(); - return results; - } catch (Throwable e) { - throw new EbxmlRegistryException( - "Error executing Criteria Query", e); - } - } - }); - } - - /** - * Deletes objects from the database - * - * @param objects - * The objects to delete - * @throws EbxmlRegistryException - * If the delete was unsuccessful - */ - public void delete(Object... objects) throws EbxmlRegistryException { - final List objectList = EbxmlObjectUtil.getList(objects); - this.doInTransaction(new RegistryTransactionCallback() { - @Override - public Object execute(Session session) - throws EbxmlRegistryException { - try { - for (Object obj : objectList) { - session.delete(obj); - } - return null; - } catch (Throwable e) { - throw new EbxmlRegistryException( - "Unexpected error during delete", e); - } - } - }); - - } - - /** - * Saves or updates objects - * - * @param objects - * The objects to save or update - * @throws EbxmlRegistryException - * If the save or updated failed - */ - public void saveOrUpdate(List objects) - throws EbxmlRegistryException { - saveOrUpdate(objects.toArray(new Object[objects.size()])); - } - - /** - * Saves or updates objects - * - * @param objects - * The objects to save or update - * @throws EbxmlRegistryException - * If the save or updated failed - */ - public void saveOrUpdate(Object... objects) throws EbxmlRegistryException { - final List objectList = EbxmlObjectUtil.getList(objects); - - this.doInTransaction(new RegistryTransactionCallback() { - - @Override - public Object execute(Session session) - throws EbxmlRegistryException { - for (Object obj : objectList) { - try { - session.saveOrUpdate(obj); - } catch (Throwable e) { - throw new EbxmlRegistryException( - "Unexpected error during save or update", e); - } - } - return null; - } - }); - - } - - /** - * Saves objects - * - * @param objects - * The objects to save or update - * @throws EbxmlRegistryException - * If the save or updated failed - */ - public void save(List objects) throws EbxmlRegistryException { - save(objects.toArray(new Object[objects.size()])); - } - - /** - * Saves objects - * - * @param objects - * The objects to save or update - * @throws EbxmlRegistryException - * If the save or updated failed - */ - public void save(Object... objects) throws EbxmlRegistryException { - final List objectList = EbxmlObjectUtil.getList(objects); - - this.doInTransaction(new RegistryTransactionCallback() { - - @Override - public Object execute(Session session) - throws EbxmlRegistryException { - for (Object obj : objectList) { - try { - session.save(obj); - } catch (Throwable e) { - throw new EbxmlRegistryException( - "Unexpected error during save or update", e); - } - } - return null; - } - }); - - } - - /** - * Evicts the given objects for the current Hibernate session instance - * - * @param objects - * The objects to evict - * @throws EbxmlRegistryException - * If errors occur during the eviction process - */ - public void evict(Object... objects) throws EbxmlRegistryException { - final List objectList = EbxmlObjectUtil.getList(objects); - - this.doInTransaction(new RegistryTransactionCallback() { - - @Override - public Object execute(Session session) - throws EbxmlRegistryException { - for (Object obj : objectList) { - try { - // marshal the object to force associations to be - // eagerly initialized - SerializationUtil.marshalToXml(obj); - session.evict(obj); - } catch (Throwable e) { - throw new EbxmlRegistryException( - "Unexpected error during save or update", e); - } - } - return null; - } - }); - } - - /** - * Gets the Hibernate statistics. This method is used for debug purposes - * only - * - * @return The String representation of the Hibernate statistics - */ - public String getStats() { - String[] items = this.getSessionFactory().getStatistics().toString() - .split(","); - StringBuffer buf = new StringBuffer(); - buf.append("_________________________________\n"); - for (int i = 0; i < items.length; i++) { - buf.append(items[i]).append("\n"); - } - buf.append("_________________________________\n"); - return buf.toString(); - } - - /** - * Method used to wrap execution of a certain segment of code in a Hibernate - * transaction. If a session is open and a transaction has already been - * started, that session and transaction will be used. If not, a new session - * will be created, and a new transaction will be created and begun - * - * @param callback - * A callback object containing transactional code - * @return The result of the transactional code - * @throws EbxmlRegistryException - * If errors occur during the execution of the transactional - * code - */ - protected Object doInTransaction(RegistryTransactionCallback callback) - throws EbxmlRegistryException { - Session session = null; - Transaction tx = null; - boolean txCreated = false; - try { - session = this.getSessionFactory().getCurrentSession(); - tx = session.getTransaction(); - if (!tx.isActive()) { - tx = session.beginTransaction(); - txCreated = true; - } - } catch (HibernateException e) { - throw new EbxmlRegistryException( - "Error acquiring Hibernate session.", e); - } - try { - Object retVal = callback.execute(session); - if (txCreated) { - tx.commit(); - } - return retVal; - } catch (Exception e) { - tx.rollback(); - throw new EbxmlRegistryException("Transaction failed.", e); - } finally { - if (statusHandler.isPriorityEnabled(Priority.DEBUG)) { - statusHandler.debug(this.getStats()); - } - - } - } - - /** - * Gets the class associated with this data access object - * - * @return The daoClass - */ - public Class getDaoClass() { - return daoClass; - } - - /** - * Sets the class to be associated with this data access object - * - * @param daoClass - * The daoClass - */ - public void setDaoClass(Class daoClass) { - this.daoClass = daoClass; - } - -} diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/RegistryObjectDao.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/RegistryObjectDao.java new file mode 100644 index 0000000000..b4c80ad520 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/RegistryObjectDao.java @@ -0,0 +1,74 @@ +/** + * 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.dao; + +import java.util.List; + +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; + +import com.raytheon.uf.edex.database.DataAccessLayerException; +import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; + +/** + * Data Access object for interacting with registry object types in the registry + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 3/13/2013    1082       bphillip    Initial creation
+ * 
+ * 
+ * + * @author bphillip + * @version 1.0 + */ +public class RegistryObjectDao extends + RegistryObjectTypeDao { + + public RegistryObjectDao() { + } + + /** + * Retrieves all registry objects from the registry + * + * @param + * A class type extending RegistryObjectType + * @return All the registry objects contained in the registry + * @throws EbxmlRegistryException + * If the HQL query fails + */ + public List getAllRegistryObjects() + throws EbxmlRegistryException { + try { + return executeHQLQuery("from" + RegistryObjectType.class.getName()); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } + } + + @Override + protected Class getEntityClass() { + return RegistryObjectType.class; + } + +} diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/RegistryObjectTypeDao.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/RegistryObjectTypeDao.java index 46d7c36415..83f0ac0005 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/RegistryObjectTypeDao.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/RegistryObjectTypeDao.java @@ -23,17 +23,16 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ClassificationType; -import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ExternalIdentifierType; -import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ExternalLinkType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ObjectRefType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; -import org.hibernate.Session; +import org.hibernate.SessionFactory; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Property; +import org.springframework.orm.hibernate3.HibernateTemplate; +import com.raytheon.uf.edex.database.DataAccessLayerException; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; import com.raytheon.uf.edex.registry.ebxml.services.query.QueryConstants; @@ -55,43 +54,13 @@ import com.raytheon.uf.edex.registry.ebxml.services.query.QueryConstants; * @version 1.0 */ -public class RegistryObjectTypeDao extends RegistryDao { +public abstract class RegistryObjectTypeDao + extends IdentifiableTypeDao { /** * Creates a new RegistryObjectDao */ public RegistryObjectTypeDao() { - super(RegistryObjectType.class); - } - - /** - * Creates a new RegistryObjectDao for the provided class - * - * @param - * Class extending RegistryObjectType - * @param clazz - * The class for which to create this RegistryObjectTypeDao for - */ - public RegistryObjectTypeDao(Class clazz) { - super(clazz); - } - - /** - * Queries for all ids of registry objects matching the pattern of the given - * id. A query using 'like' will be executed. - * - * @param id - * The id containing % or _ denoting wildcard characters - * @return List of ids matching the given id pattern - * @throws EbxmlRegistryException - * If errors occur during the query - */ - public List getMatchingIds(String id) throws EbxmlRegistryException { - DetachedCriteria criteria = DetachedCriteria.forClass(this.daoClass); - criteria = criteria.add(Property.forName(QueryConstants.ID).like(id)); - criteria = criteria.setProjection(Projections - .property(QueryConstants.ID)); - return this.executeCriteriaQuery(criteria); } /** @@ -106,75 +75,16 @@ public class RegistryObjectTypeDao extends RegistryDao { */ public List getMatchingLids(String lid) throws EbxmlRegistryException { - DetachedCriteria criteria = DetachedCriteria.forClass(this.daoClass); + DetachedCriteria criteria = DetachedCriteria.forClass(this + .getEntityClass()); criteria = criteria.add(Property.forName(QueryConstants.LID).like(lid)); criteria = criteria.setProjection(Projections .property(QueryConstants.LID)); - return this.executeCriteriaQuery(criteria); - } - - /** - * Retrieves all registry objects from the registry - * - * @param - * A class type extending RegistryObjectType - * @return All the registry objects contained in the registry - * @throws EbxmlRegistryException - * If the HQL query fails - */ - public List getAllRegistryObjects() - throws EbxmlRegistryException { - return executeHQLQuery("from" + RegistryObjectType.class.getName()); - } - - /** - * Retrieves registry objects based on id values - * - * @param - * A class type extending RegistryObjectType - * @param ids - * The list of ids to query for - * @return The list of registry objects; - * @throws EbxmlRegistryException - * If the query encounters errors - */ - public List getById(List ids) - throws EbxmlRegistryException { - return this.executeHQLQuery(HqlQueryUtil.assembleSingleParamQuery( - daoClass, QueryConstants.ID, "in", ids)); - } - - /** - * Retrieves registry objects based on id values - * - * @param - * A class type extending RegistryObjectType - * @param ids - * The array of ids to query for - * @return The list of registry objects; - * @throws EbxmlRegistryException - * If the query encounters errors - */ - public List getById(String... ids) - throws EbxmlRegistryException { - return getById(Arrays.asList(ids)); - } - - /** - * Retrieves the registry object associated with the given id value - * - * @param - * A class type extending RegistryObjectType - * @param id - * The ide to get the registry object for - * @return The registry object with the given id - * @throws EbxmlRegistryException - * If the query encounters errors - */ - @SuppressWarnings("unchecked") - public T getById(String id) - throws EbxmlRegistryException { - return (T) getSingleResult(getById(Arrays.asList(id))); + try { + return this.executeCriteriaQuery(criteria); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } } /** @@ -188,13 +98,17 @@ public class RegistryObjectTypeDao extends RegistryDao { * @throws EbxmlRegistryException * If the query encounters errors */ - public List getByLid(List lids) + public List getByLid(List lids) throws EbxmlRegistryException { StringBuilder str = new StringBuilder(); - HqlQueryUtil.assembleSingleParamQuery(str, daoClass, + HqlQueryUtil.assembleSingleParamQuery(str, getEntityClass(), QueryConstants.LID, "in", lids); - str.append(" order by obj.lid asc,obj.versionInfo.versionNumber desc"); - return executeHQLQuery(str.toString()); + str.append(" order by obj.lid asc,obj.versionInfo.versionName desc"); + try { + return executeHQLQuery(str.toString()); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } } /** @@ -208,29 +122,10 @@ public class RegistryObjectTypeDao extends RegistryDao { * @throws EbxmlRegistryException * If the query encounters errors */ - public List getByLid(String... lids) - throws EbxmlRegistryException { + public List getByLid(String... lids) throws EbxmlRegistryException { return getByLid(Arrays.asList(lids)); } - /** - * Retrieves all registry objects assigned the given lid - * - * @param - * A class type extending RegistryObjectType - * @param lid - * The lid to query for - * @return The list of registry objects containing the given lid - * @throws EbxmlRegistryException - * If the query encounters errors - */ - @SuppressWarnings("unchecked") - public T getByLid(String lid) - throws EbxmlRegistryException { - return (T) getSingleResult(getByLid(Arrays.asList(lid))); - - } - /** * Retrieves registry objects based on objectType values * @@ -242,43 +137,15 @@ public class RegistryObjectTypeDao extends RegistryDao { * @throws EbxmlRegistryException * If the query encounters errors */ - public List getByObjectType( - List objTypes) throws EbxmlRegistryException { - return executeHQLQuery(HqlQueryUtil.assembleSingleParamQuery(daoClass, - QueryConstants.OBJECT_TYPE, "in", objTypes)); - } - - /** - * Retrieves registry objects based on objectType values - * - * @param - * A class type extending RegistryObjectType - * @param objTypes - * The list of objectTypes to query for - * @return The list of registry objects; - * @throws EbxmlRegistryException - * If the query encounters errors - */ - public List getByObjectType( - String... objTypes) throws EbxmlRegistryException { - return getByObjectType(Arrays.asList(objTypes)); - } - - /** - * Retrieves registry objects based on objectType values - * - * @param - * A class type extending RegistryObjectType - * @param objType - * The objectType to query for - * @return The list of registry objects; - * @throws EbxmlRegistryException - * If the query encounters errors - */ - @SuppressWarnings("unchecked") - public T getByObjectType(String objType) + public List getByObjectType(List objTypes) throws EbxmlRegistryException { - return (T) getSingleResult(getByObjectType(Arrays.asList(objType))); + try { + return executeHQLQuery(HqlQueryUtil.assembleSingleParamQuery( + getEntityClass(), QueryConstants.OBJECT_TYPE, "in", + objTypes)); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } } /** @@ -292,43 +159,14 @@ public class RegistryObjectTypeDao extends RegistryDao { * @throws EbxmlRegistryException * If the query encounters errors */ - public List getByStatus( - List status) throws EbxmlRegistryException { - return executeHQLQuery(HqlQueryUtil.assembleSingleParamQuery(daoClass, - QueryConstants.STATUS, "in", status)); - } - - /** - * Retrieves registry objects based on status values - * - * @param - * A class type extending RegistryObjectType - * @param status - * The list of statuses to query for - * @return The list of registry objects; - * @throws EbxmlRegistryException - * If the query encounters errors - */ - public List getByStatus(String... status) + public List getByStatus(List status) throws EbxmlRegistryException { - return getByStatus(Arrays.asList(status)); - } - - /** - * Retrieves registry objects based on status values - * - * @param - * A class type extending RegistryObjectType - * @param status - * The statuse to query for - * @return The list of registry objects; - * @throws EbxmlRegistryException - * If the query encounters errors - */ - @SuppressWarnings("unchecked") - public T getByStatus(String status) - throws EbxmlRegistryException { - return (T) getSingleResult(getByStatus(Arrays.asList(status))); + try { + return executeHQLQuery(HqlQueryUtil.assembleSingleParamQuery( + getEntityClass(), QueryConstants.STATUS, "in", status)); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } } /** @@ -342,10 +180,14 @@ public class RegistryObjectTypeDao extends RegistryDao { * @throws EbxmlRegistryException * If the query encounters errors */ - public List getByOwner(List owner) + public List getByOwner(List owner) throws EbxmlRegistryException { - return executeHQLQuery(HqlQueryUtil.assembleSingleParamQuery(daoClass, - QueryConstants.OWNER, "in", owner)); + try { + return executeHQLQuery(HqlQueryUtil.assembleSingleParamQuery( + getEntityClass(), QueryConstants.OWNER, "in", owner)); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } } /** @@ -359,28 +201,11 @@ public class RegistryObjectTypeDao extends RegistryDao { * @throws EbxmlRegistryException * If the query encounters errors */ - public List getByOwner(String... owner) + public List getByOwner(String... owner) throws EbxmlRegistryException { return getByOwner(Arrays.asList(owner)); } - /** - * Retrieves registry objects based on owner values - * - * @param - * A class type extending RegistryObjectType - * @param owner - * The owner to query for - * @return The list of registry objects; - * @throws EbxmlRegistryException - * If the query encounters errors - */ - @SuppressWarnings("unchecked") - public T getByOwner(String owner) - throws EbxmlRegistryException { - return (T) getSingleResult(getByOwner(Arrays.asList(owner))); - } - /** * Retrieves registry objects based on name values * @@ -392,12 +217,16 @@ public class RegistryObjectTypeDao extends RegistryDao { * @throws EbxmlRegistryException * If the criteria query encounters errors */ - public List getByName(List names) + public List getByName(List names) throws EbxmlRegistryException { StringBuilder str = new StringBuilder( "select obj from RegistryObjectType obj inner join obj.name.localizedString as Strings where Strings.value in "); HqlQueryUtil.assembleInClause(str, "Strings.value", names); - return this.executeHQLQuery(str.toString()); + try { + return this.executeHQLQuery(str.toString()); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } } /** @@ -411,12 +240,16 @@ public class RegistryObjectTypeDao extends RegistryDao { * @throws EbxmlRegistryException * If the criteria query encounters errors */ - public List getByDescription( - List descriptions) throws EbxmlRegistryException { + public List getByDescription(List descriptions) + throws EbxmlRegistryException { StringBuilder str = new StringBuilder( "select obj from RegistryObjectType obj inner join obj.description.localizedString as Strings where Strings.value in "); HqlQueryUtil.assembleInClause(str, "Strings.value", descriptions); - return this.executeHQLQuery(str.toString()); + try { + return this.executeHQLQuery(str.toString()); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } } /** @@ -430,13 +263,17 @@ public class RegistryObjectTypeDao extends RegistryDao { * @throws EbxmlRegistryException * If the criteria query encounters errors */ - public List getByClassification( - List classifications) throws EbxmlRegistryException { + public List getByClassification(List classifications) + throws EbxmlRegistryException { StringBuilder str = new StringBuilder( "select obj from RegistryObjectType obj inner join obj.classification as Classifications where "); HqlQueryUtil.assembleInClause(str, "Classifications.classificationNode", classifications); - return this.executeHQLQuery(str.toString()); + try { + return this.executeHQLQuery(str.toString()); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error", e); + } } /** @@ -447,47 +284,42 @@ public class RegistryObjectTypeDao extends RegistryDao { * @throws EbxmlRegistryException * If the delete fails */ + @SuppressWarnings("unchecked") public void deleteByRefs(final List objRefs) throws EbxmlRegistryException { - + // TODO: FIX THIS METHOD TO ELIMINATE CASTING OR MOVE IT ELSEWHERE try { - doInTransaction(new RegistryTransactionCallback() { - @Override - public Object execute(Session session) - throws EbxmlRegistryException { - List objIds = new ArrayList(); - for (ObjectRefType ref : objRefs) { - objIds.add(ref.getId()); + List objIds = new ArrayList(); + for (ObjectRefType ref : objRefs) { + objIds.add(ref.getId()); + } + List objs = getById(objIds); + for (RegistryObjectType regObj : objs) { + if (regObj.getClassification() != null) { + for (RegistryObjectType classification : regObj + .getClassification()) { + delete((ENTITY) classification); } - List objs = getById(objIds); - for (RegistryObjectType regObj : objs) { - if (regObj.getClassification() != null) { - for (ClassificationType classification : regObj - .getClassification()) { - delete(classification); - } - } - } - for (RegistryObjectType regObj : objs) { - if (regObj.getExternalIdentifier() != null) { - for (ExternalIdentifierType extId : regObj - .getExternalIdentifier()) { - delete(extId); - } - } - } - for (RegistryObjectType regObj : objs) { - if (regObj.getExternalLink() != null) { - for (ExternalLinkType extLink : regObj - .getExternalLink()) { - delete(extLink); - } - } - } - delete(objs); - return null; } - }); + } + for (RegistryObjectType regObj : objs) { + if (regObj.getExternalIdentifier() != null) { + for (RegistryObjectType extId : regObj + .getExternalIdentifier()) { + delete((ENTITY) extId); + } + } + } + for (RegistryObjectType regObj : objs) { + if (regObj.getExternalLink() != null) { + for (RegistryObjectType extLink : regObj.getExternalLink()) { + delete((ENTITY) extLink); + } + } + } + for (ENTITY obj : objs) { + delete(obj); + } } catch (Throwable e) { throw new EbxmlRegistryException("Error deleting objects", e); } @@ -504,12 +336,22 @@ public class RegistryObjectTypeDao extends RegistryDao { * @return null if the given list is empty, else returns the first element * of the list */ - protected static T getSingleResult( - List result) { + protected static RegistryObjectType getSingleResult( + List result) { if (result.isEmpty()) { return null; } else { return result.get(0); } } + + @Override + public void setSessionFactory(SessionFactory sessionFactory) { + template = new HibernateTemplate(sessionFactory); + } + + @Override + public ENTITY getById(String id) { + return super.getById(id); + } } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/RegistryPackageDao.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/RegistryPackageDao.java new file mode 100644 index 0000000000..82a00f8f94 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/RegistryPackageDao.java @@ -0,0 +1,52 @@ +/** + * 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.dao; + +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryPackageType; + +/** + * Data Access object for interacting with registry object types in the registry + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 3/13/2013    1082       bphillip    Initial creation
+ * 
+ * 
+ * + * @author bphillip + * @version 1.0 + */ +public class RegistryPackageDao extends + RegistryObjectTypeDao { + + public RegistryPackageDao() { + + } + + @Override + protected Class getEntityClass() { + return RegistryPackageType.class; + } + +} diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/RoleDao.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/RoleDao.java index 5aa29e670e..647e0a6315 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/RoleDao.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/RoleDao.java @@ -37,19 +37,22 @@ import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 7/30/2012 724 bphillip Initial creation + * 3/13/2013 1082 bphillip Modified to use spring injection and transaction boundaries * * * * @author bphillip * @version 1.0 */ -public class RoleDao extends RegistryObjectTypeDao { +public class RoleDao extends RegistryObjectTypeDao { + + private AssociationDao associationDao; /** * Creates a new Role data access object */ public RoleDao() { - super(RoleType.class); + } /** @@ -62,7 +65,6 @@ public class RoleDao extends RegistryObjectTypeDao { * If errors occur during interaction with the database */ public RoleType getUserRole(String user) throws EbxmlRegistryException { - AssociationDao associationDao = new AssociationDao(); List associations = associationDao.getBySourceAndType( user, AssociationTypes.HAS_ROLE); if (associations.isEmpty()) { @@ -72,4 +74,13 @@ public class RoleDao extends RegistryObjectTypeDao { return this.getById(roleAssociation.getTargetObject()); } + public void setAssociationDao(AssociationDao associationDao) { + this.associationDao = associationDao; + } + + @Override + protected Class getEntityClass() { + return RoleType.class; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/SubscriptionDao.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/SubscriptionDao.java new file mode 100644 index 0000000000..d0d1b4ea8f --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/SubscriptionDao.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.edex.registry.ebxml.dao; + +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.SubscriptionType; + +/** + * Data Access object for interacting with roles in the registry + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 3/13/2013    1082       bphillip    Initial creation
+ * 
+ * 
+ * + * @author bphillip + * @version 1.0 + */ +public class SubscriptionDao extends RegistryObjectTypeDao { + + public SubscriptionDao() { + + } + + @Override + protected Class getEntityClass() { + return SubscriptionType.class; + } + +} diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/VersionInfoTypeDao.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/VersionInfoTypeDao.java deleted file mode 100644 index 1cce32288b..0000000000 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/dao/VersionInfoTypeDao.java +++ /dev/null @@ -1,159 +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.dao; - -import java.util.List; - -import oasis.names.tc.ebxml.regrep.xsd.rim.v4.VersionInfoType; - -import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; - -/** - * - * Data access object for handling VersionInfoType objects - * - *
- * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * Mar 15, 2012 #363       bphillip     Initial creation
- * 
- * 
- * - * @author bphillip - * @version 1.0 - */ -public class VersionInfoTypeDao extends RegistryDao { - - /** - * Creates a new VersionInfoTypeDao - */ - public VersionInfoTypeDao() { - super(VersionInfoType.class); - } - - /** - * Gets a version object with the given versionName - * - * @param versionName - * The version name to query for - * @return The version object with the given version name - * @throws EbxmlRegistryException - * If errors occur during the query process - */ - public VersionInfoType getByVersionName(String versionName) - throws EbxmlRegistryException { - return getResult(this - .executeHQLQuery("from VersionInfoType x where x.versionName='" - + versionName + "'")); - - } - - /** - * Gets a version object with the given userVersionName - * - * @param userVersionName - * The userVersionName name to query for - * @return The version object with the given userVersionName - * @throws EbxmlRegistryException - * If errors occur during the query process - */ - public VersionInfoType getByUserVersionName(String userVersionName) - throws EbxmlRegistryException { - return getResult(this - .executeHQLQuery("from VersionInfoType x where x.userVersionName='" - + userVersionName + "'")); - } - - /** - * Gets a version object with the given versionName and userVersionName - * - * @param versionName - * The version name to query for - * @param userVersionName - * The userVersionName name to query for - * @return The version object with the given userVersionName - * @throws EbxmlRegistryException - * If errors occur during the query process - */ - public VersionInfoType getVersion(String versionName, String userVersionName) - throws EbxmlRegistryException { - return getResult(this - .executeHQLQuery("from VersionInfoType x where x.userVersionName='" - + userVersionName - + "' and x.versionName='" - + versionName + "'")); - } - - /** - * Gets a version object with the given version number - * - * @param version - * The version number to query upon - * @return The version object with the given version number - * @throws EbxmlRegistryException - */ - public VersionInfoType getByVersionNumber(int version) - throws EbxmlRegistryException { - return getResult(this - .executeHQLQuery("from VersionInfoType x where x.versionNumber=" - + version)); - } - - /** - * Checks the database to see if a version object matching the given version - * object already exists - * - * @param versionInfo - * The version info to check - * @return The persistent version if exists, else the provided object - * @throws EbxmlRegistryException - * If errors occur during the query process - */ - public VersionInfoType sync(VersionInfoType versionInfo) - throws EbxmlRegistryException { - VersionInfoType dbVersion = getVersion(versionInfo.getVersionName(), - versionInfo.getUserVersionName()); - if (dbVersion == null) { - this.save(versionInfo); - dbVersion = getVersion(versionInfo.getVersionName(), - versionInfo.getUserVersionName()); - } - return dbVersion; - } - - /** - * Gets a single result from a list of results - * - * @param results - * The result list to check - * @return null if the provided list is empty, else returns the first - * element of the list - */ - private VersionInfoType getResult(List results) { - if (results.isEmpty()) { - return null; - } else { - return (VersionInfoType) results.get(0); - } - } -} diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/init/RegistryInitializedListener.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/init/RegistryInitializedListener.java new file mode 100644 index 0000000000..63ec2aa40d --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/init/RegistryInitializedListener.java @@ -0,0 +1,48 @@ +/** + * 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.init; + +/** + * Interface that classes may implement to execute code that must be executed + * after the database is initialzed. DbInit will load all classes implementing + * this interface and will execute the executeAfterRegistryInit method. + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 3/13/2013    1082       bphillip    Initial creation
+ * 
+ * 
+ * + * @author bphillip + * @version 1.0 + * @see com.raytheon.uf.edex.registry.ebxml.dao.DbInit + */ +public interface RegistryInitializedListener { + + /** + * Executes code that must be executed after the ebxml database is + * initialized + */ + public void executeAfterRegistryInit(); +} diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/cataloger/CatalogerImpl.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/cataloger/CatalogerImpl.java index 3eea8e5d6c..bdbdcc0180 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/cataloger/CatalogerImpl.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/cataloger/CatalogerImpl.java @@ -19,12 +19,8 @@ **/ package com.raytheon.uf.edex.registry.ebxml.services.cataloger; -import java.util.ArrayList; -import java.util.List; - import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.Cataloger; import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.MsgRegistryException; -import oasis.names.tc.ebxml.regrep.xsd.rim.v4.AuditableEventType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; import oasis.names.tc.ebxml.regrep.xsd.rs.v4.UnsupportedCapabilityExceptionType; import oasis.names.tc.ebxml.regrep.xsd.spi.v4.CatalogObjectsRequest; @@ -32,9 +28,7 @@ import oasis.names.tc.ebxml.regrep.xsd.spi.v4.CatalogObjectsResponse; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.edex.registry.ebxml.constants.CanonicalIndices; import com.raytheon.uf.edex.registry.ebxml.constants.ErrorSeverity; -import com.raytheon.uf.edex.registry.ebxml.dao.RegistryDao; import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectTypeDao; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; import com.raytheon.uf.edex.registry.ebxml.util.EbxmlExceptionUtil; @@ -49,6 +43,7 @@ import com.raytheon.uf.edex.registry.ebxml.util.EbxmlExceptionUtil; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jan 18, 2012 184 bphillip Initial creation + * 3/18/2013 1082 bphillip Commented out old incorrect code until this class is properly implemented * * * @@ -86,55 +81,58 @@ public class CatalogerImpl implements Cataloger { * If the indexing process produces errors */ public void index(RegistryObjectType obj) throws EbxmlRegistryException { - if (obj instanceof AuditableEventType) { - return; - } - statusHandler.info("Cataloging object [" + obj.getId() + "]"); - obj = registryObjectDao.getById(obj.getId()); - List entries = new ArrayList(); - - if (obj.getName() != null) { - IndexEntry nameEntry = new IndexEntry(obj.getId(), - obj.getObjectType(), CanonicalIndices.NAME, obj.getName() - .getLocalizedString().get(0).getValue()); - entries.add(syncEntry(nameEntry)); - } - - if (obj.getDescription() != null) { - IndexEntry descEntry = new IndexEntry(obj.getId(), - obj.getObjectType(), CanonicalIndices.DESCRIPTION, obj - .getDescription().getLocalizedString().get(0) - .getValue()); - entries.add(syncEntry(descEntry)); - } - statusHandler.info("Persisting indexed values to registry for object [" - + obj.getId() + "]"); - new RegistryDao(IndexEntry.class).saveOrUpdate(entries); - statusHandler.info("Catalog information persisted for object [" - + obj.getId() + "]"); + // TODO:Implement Cataloger according to ebXML spec + // if (obj instanceof AuditableEventType) { + // return; + // } + // statusHandler.info("Cataloging object [" + obj.getId() + "]"); + // obj = registryObjectDao.getById(obj.getId()); + // + // List entries = new ArrayList(); + // + // if (obj.getName() != null) { + // IndexEntry nameEntry = new IndexEntry(obj.getId(), + // obj.getObjectType(), CanonicalIndices.NAME, obj.getName() + // .getLocalizedString().get(0).getValue()); + // entries.add(syncEntry(nameEntry)); + // } + // + // if (obj.getDescription() != null) { + // IndexEntry descEntry = new IndexEntry(obj.getId(), + // obj.getObjectType(), CanonicalIndices.DESCRIPTION, obj + // .getDescription().getLocalizedString().get(0) + // .getValue()); + // entries.add(syncEntry(descEntry)); + // } + // statusHandler.info("Persisting indexed values to registry for object [" + // + obj.getId() + "]"); + // new RegistryDao(IndexEntry.class).saveOrUpdate(entries); + // statusHandler.info("Catalog information persisted for object [" + // + obj.getId() + "]"); } - /** - * Syncs the given index entry with the database - * - * @param entry - * The entry to check - * @return The persistent entry if it exists, else the given object - * @throws EbxmlRegistryException - * If errors occur during the query - */ - private IndexEntry syncEntry(IndexEntry entry) - throws EbxmlRegistryException { - List result = registryObjectDao.executeHQLQuery("from " - + IndexEntry.class.getName() + " x where x.key= " - + entry.getKey()); - if (result.isEmpty()) { - return entry; - } else { - return result.get(0); - } - } + // + // /** + // * Syncs the given index entry with the database + // * + // * @param entry + // * The entry to check + // * @return The persistent entry if it exists, else the given object + // * @throws EbxmlRegistryException + // * If errors occur during the query + // */ + // private IndexEntry syncEntry(IndexEntry entry) + // throws EbxmlRegistryException { + // List result = registryObjectDao.executeHQLQuery("from " + // + IndexEntry.class.getName() + " x where x.key= " + // + entry.getKey()); + // if (result.isEmpty()) { + // return entry; + // } else { + // return result.get(0); + // } + // } public void setRegistryObjectDao(RegistryObjectTypeDao registryObjectDao) { this.registryObjectDao = registryObjectDao; 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 179fad8ae6..fa8ea1bf45 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 @@ -56,6 +56,9 @@ import oasis.names.tc.ebxml.regrep.xsd.rs.v4.UnsupportedCapabilityExceptionType; import oasis.names.tc.ebxml.regrep.xsd.spi.v4.ValidateObjectsRequest; import oasis.names.tc.ebxml.regrep.xsd.spi.v4.ValidateObjectsResponse; +import org.springframework.transaction.annotation.Transactional; + +import com.raytheon.uf.common.event.EventBus; import com.raytheon.uf.common.registry.ebxml.RegistryUtil; import com.raytheon.uf.common.registry.event.InsertRegistryEvent; import com.raytheon.uf.common.registry.event.RegistryEvent.Action; @@ -71,11 +74,11 @@ import com.raytheon.uf.edex.registry.ebxml.constants.ErrorSeverity; import com.raytheon.uf.edex.registry.ebxml.constants.RegistryObjectTypes; import com.raytheon.uf.edex.registry.ebxml.constants.RegistryResponseStatus; import com.raytheon.uf.edex.registry.ebxml.constants.StatusTypes; +import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectDao; import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectTypeDao; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; import com.raytheon.uf.edex.registry.ebxml.services.cataloger.CatalogerImpl; import com.raytheon.uf.edex.registry.ebxml.services.query.QueryManagerImpl; -import com.raytheon.uf.edex.registry.ebxml.services.util.RegistrySessionManager; import com.raytheon.uf.edex.registry.ebxml.services.validator.ValidatorImpl; import com.raytheon.uf.edex.registry.ebxml.util.EbxmlExceptionUtil; import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil; @@ -95,13 +98,14 @@ import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil; * ------------ ---------- ----------- -------------------------- * Jan 18, 2012 bphillip Initial creation * Sep 14, 2012 1169 djohnson Throw exception when object exists during create only mode. + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring injection * * * * @author bphillip * @version 1.0 */ - +@Transactional public class LifecycleManagerImpl implements LifecycleManager { /** The logger */ @@ -119,7 +123,7 @@ public class LifecycleManagerImpl implements LifecycleManager { private CatalogerImpl cataloger; /** The registry object data access object */ - private RegistryObjectTypeDao registryObjectDao; + private RegistryObjectDao registryObjectDao; private AuditTrailManager auditTrailMgr; @@ -258,13 +262,16 @@ public class LifecycleManagerImpl implements LifecycleManager { event.setAction(Action.DELETE); event.setLid(obj.getLid()); event.setObjectType(objectType); - RegistrySessionManager.postEvent(event); + EventBus.publish(event); + // RegistrySessionManager.postEvent(event); } + EventBus.publish(new RegistryStatisticsEvent(obj.getObjectType(), + obj.getStatus(), obj.getOwner(), avTimePerRecord)); // all registry removals are logged for statistics - RegistrySessionManager.postEvent(new RegistryStatisticsEvent(obj - .getObjectType(), obj.getStatus(), obj.getOwner(), - avTimePerRecord)); + // RegistrySessionManager.postEvent(new RegistryStatisticsEvent(obj + // .getObjectType(), obj.getStatus(), obj.getOwner(), + // avTimePerRecord)); } return response; @@ -373,15 +380,22 @@ public class LifecycleManagerImpl implements LifecycleManager { // gives a close estimate to amount taken on each object // individually, this will be millis in most cases, hopefully - long avTimePerRecord = totalTime / objs.size(); - - for (RegistryObjectType obj : objs) { - RegistrySessionManager.postEvent(new InsertRegistryEvent(obj - .getId(), obj.getLid(), obj.getObjectType())); - // also log a statistical event - RegistrySessionManager.postEvent(new RegistryStatisticsEvent(obj - .getObjectType(), obj.getStatus(), obj.getOwner(), - avTimePerRecord)); + long avTimePerRecord = 0; + if (!objs.isEmpty()) { + avTimePerRecord = totalTime / objs.size(); + for (RegistryObjectType obj : objs) { + EventBus.publish(new InsertRegistryEvent(obj.getId(), obj + .getLid(), obj.getObjectType())); + // RegistrySessionManager.postEvent(new InsertRegistryEvent(obj + // .getId(), obj.getLid(), obj.getObjectType())); + // also log a statistical event + EventBus.publish(new RegistryStatisticsEvent(obj + .getObjectType(), obj.getStatus(), obj.getOwner(), + avTimePerRecord)); + // RegistrySessionManager.postEvent(new RegistryStatisticsEvent( + // obj.getObjectType(), obj.getStatus(), obj.getOwner(), + // avTimePerRecord)); + } } return response; @@ -426,20 +440,9 @@ public class LifecycleManagerImpl implements LifecycleManager { } if (!object.getId().equals(originalId)) { - RegistryObjectType classResult = null; - try { - classResult = registryObjectDao.getById(object.getId()); - } catch (EbxmlRegistryException e) { - throw EbxmlExceptionUtil - .createMsgRegistryException( - "Query error encountered while checking references for submitObjects", - QueryExceptionType.class, - "", - "Query error encountered while checking references for submitObjects", - "An error was encountered while querying for an object with an id of [" - + object.getId() + "]", - ErrorSeverity.ERROR, e, statusHandler); - } + RegistryObjectType classResult = registryObjectDao.getById(object + .getId()); + if (classResult == null) { throw EbxmlExceptionUtil.createMsgRegistryException( "Unresolved reference found", @@ -551,135 +554,119 @@ public class LifecycleManagerImpl implements LifecycleManager { if (obj instanceof TaxonomyElementType) { generatePaths((TaxonomyElementType) obj, ""); } - try { - if (obj.getVersionInfo() == null) { - VersionInfoType version = EbxmlObjectUtil - .newVersionObject(); - obj.setVersionInfo(version); - } - - switch (submitMode) { - case CREATE_OR_REPLACE: - if (storedObjects.containsKey(obj.getId())) { - VersionInfoType versionInfo = storedObjects.get( - obj.getId()).getVersionInfo(); - obj.setVersionInfo(versionInfo); - obj.setStatus(storedObjects.get(obj.getId()) - .getStatus()); - statusHandler.info("Object [" + obj.getId() - + "] replaced in the registry."); - registryObjectDao - .delete(storedObjects.get(obj.getId())); - objsUpdated.add(obj); - - } else { - obj.setStatus(StatusTypes.APPROVED); - obj.setVersionInfo(EbxmlObjectUtil.newVersionObject()); - statusHandler.info("Object [" + obj.getId() - + "] added to the registry."); - objsCreated.add(obj); - } - break; - case CREATE_OR_VERSION: - if (storedObjects.containsKey(obj.getId())) { - VersionInfoType versionInfo = dbObjects.get(0) - .getVersionInfo(); - obj.setVersionInfo(EbxmlObjectUtil - .getNewVersion(versionInfo)); - obj.setStatus(storedObjects.get(obj.getId()) - .getStatus()); - statusHandler.info("Object [" + obj.getId() - + "] versioned in the registry."); - obj.setId(EbxmlObjectUtil.getUUID()); - AssociationType versionAssociation = EbxmlObjectUtil.rimObjectFactory - .createAssociationType(); - String idUUID = EbxmlObjectUtil.getUUID(); - versionAssociation.setId(idUUID); - versionAssociation.setLid(idUUID); - versionAssociation.setName(RegistryUtil - .getInternationalString("Version Association")); - versionAssociation.setDescription(RegistryUtil - .getInternationalString(obj.getId() - + " Supersedes " - + dbObjects.get(0).getId())); - versionAssociation - .setOwner(dbObjects.get(0).getOwner()); - versionAssociation - .setObjectType(RegistryObjectTypes.ASSOCIATION); - versionAssociation.setSourceObject(obj.getId()); - versionAssociation.setTargetObject(dbObjects.get(0) - .getId()); - versionAssociation.setStatus(StatusTypes.APPROVED); - versionAssociation.setType(AssociationTypes.SUPERSEDES); - versionAssociation.setVersionInfo(EbxmlObjectUtil - .newVersionObject()); - registryObjectDao.save(versionAssociation); - objsVersioned.add(obj); - statusHandler - .info("Supersedes association for new version of [" - + obj.getId() - + "] persisted to the registry"); - } else { - if (!dbObjects.isEmpty()) { - EbxmlExceptionUtil - .createRegistryException( - InvalidRequestExceptionType.class, - "", - "Invalid submit request", - "The submitted id does not exist, yet the lid does. This is an invalid request", - ErrorSeverity.ERROR, statusHandler); - continue; - } - obj.setStatus(StatusTypes.APPROVED); - obj.setVersionInfo(EbxmlObjectUtil.newVersionObject()); - statusHandler.info("Object [" + obj.getId() - + "] added to the registry."); - objsCreated.add(obj); - } - break; - case CREATE_ONLY: - if (storedObjects.containsKey(obj.getId())) { - String message = "Object with id [" + obj.getId() - + "] already exists"; - response.getException() - .add(EbxmlExceptionUtil - .createRegistryException( - ObjectExistsExceptionType.class, - "", - message, - "The " - + Mode.CREATE_ONLY - + " submit mode only accepts new objects", - ErrorSeverity.ERROR, - statusHandler)); - - throw EbxmlExceptionUtil - .createMsgRegistryException(message, - ObjectExistsExceptionType.class, "", - message, "Error submitting object [" - + obj.getId() + "]", - ErrorSeverity.ERROR, null, - statusHandler); - - } else { - obj.setVersionInfo(EbxmlObjectUtil.newVersionObject()); - obj.setStatus(StatusTypes.APPROVED); - statusHandler.info("Object [" + obj.getId() - + "] added to the registry."); - objsCreated.add(obj); - } - - break; - } - registryObjectDao.save(obj); - } catch (EbxmlRegistryException e) { - throw EbxmlExceptionUtil.createMsgRegistryException( - "Database submission error", QueryExceptionType.class, - "", "Database submission error", - "Error submitting object [" + obj.getId() + "]", - ErrorSeverity.ERROR, e, statusHandler); + if (obj.getVersionInfo() == null) { + VersionInfoType version = new VersionInfoType(); + obj.setVersionInfo(version); } + switch (submitMode) { + case CREATE_OR_REPLACE: + if (storedObjects.containsKey(obj.getId())) { + VersionInfoType versionInfo = storedObjects + .get(obj.getId()).getVersionInfo(); + obj.setVersionInfo(versionInfo); + obj.setStatus(storedObjects.get(obj.getId()).getStatus()); + statusHandler.info("Object [" + obj.getId() + + "] replaced in the registry."); + registryObjectDao.delete(storedObjects.get(obj.getId())); + objsUpdated.add(obj); + + } else { + obj.setStatus(StatusTypes.APPROVED); + obj.setVersionInfo(new VersionInfoType()); + statusHandler.info("Object [" + obj.getId() + + "] added to the registry."); + objsCreated.add(obj); + } + break; + case CREATE_OR_VERSION: + if (storedObjects.containsKey(obj.getId())) { + VersionInfoType versionInfo = dbObjects.get(0) + .getVersionInfo(); + obj.setVersionInfo(EbxmlObjectUtil + .incrementVersion(versionInfo)); + obj.setStatus(storedObjects.get(obj.getId()).getStatus()); + statusHandler.info("Object [" + obj.getId() + + "] versioned in the registry."); + obj.setId(EbxmlObjectUtil.getUUID()); + AssociationType versionAssociation = EbxmlObjectUtil.rimObjectFactory + .createAssociationType(); + String idUUID = EbxmlObjectUtil.getUUID(); + versionAssociation.setId(idUUID); + versionAssociation.setLid(idUUID); + versionAssociation.setName(RegistryUtil + .getInternationalString("Version Association")); + versionAssociation + .setDescription(RegistryUtil + .getInternationalString(obj.getId() + + " Supersedes " + + dbObjects.get(0).getId())); + versionAssociation.setOwner(dbObjects.get(0).getOwner()); + versionAssociation + .setObjectType(RegistryObjectTypes.ASSOCIATION); + versionAssociation.setSourceObject(obj.getId()); + versionAssociation + .setTargetObject(dbObjects.get(0).getId()); + versionAssociation.setStatus(StatusTypes.APPROVED); + versionAssociation.setType(AssociationTypes.SUPERSEDES); + versionAssociation.setVersionInfo(new VersionInfoType()); + registryObjectDao.create(versionAssociation); + objsVersioned.add(obj); + statusHandler + .info("Supersedes association for new version of [" + + obj.getId() + + "] persisted to the registry"); + } else { + if (!dbObjects.isEmpty()) { + EbxmlExceptionUtil + .createRegistryException( + InvalidRequestExceptionType.class, + "", + "Invalid submit request", + "The submitted id does not exist, yet the lid does. This is an invalid request", + ErrorSeverity.ERROR, statusHandler); + continue; + } + obj.setStatus(StatusTypes.APPROVED); + obj.setVersionInfo(new VersionInfoType()); + statusHandler.info("Object [" + obj.getId() + + "] added to the registry."); + objsCreated.add(obj); + } + break; + case CREATE_ONLY: + if (storedObjects.containsKey(obj.getId())) { + String message = "Object with id [" + obj.getId() + + "] already exists"; + response.getException() + .add(EbxmlExceptionUtil + .createRegistryException( + ObjectExistsExceptionType.class, + "", + message, + "The " + + Mode.CREATE_ONLY + + " submit mode only accepts new objects", + ErrorSeverity.ERROR, statusHandler)); + + throw EbxmlExceptionUtil.createMsgRegistryException( + message, ObjectExistsExceptionType.class, "", + message, "Error submitting object [" + obj.getId() + + "]", ErrorSeverity.ERROR, null, + statusHandler); + + } else { + obj.setVersionInfo(new VersionInfoType()); + obj.setStatus(StatusTypes.APPROVED); + statusHandler.info("Object [" + obj.getId() + + "] added to the registry."); + objsCreated.add(obj); + } + + break; + } + registryObjectDao.create(obj); + // TODO: Implement proper cataloging of objects accorind to EbXML // spec } @@ -764,10 +751,6 @@ public class LifecycleManagerImpl implements LifecycleManager { this.validator = validator; } - public void setRegistryObjectDao(RegistryObjectTypeDao registryObjectDao) { - this.registryObjectDao = registryObjectDao; - } - public void setAuditTrailMgr(AuditTrailManager auditTrailMgr) { this.auditTrailMgr = auditTrailMgr; } @@ -776,4 +759,8 @@ public class LifecycleManagerImpl implements LifecycleManager { this.cataloger = cataloger; } + public void setRegistryObjectDao(RegistryObjectDao registryObjectDao) { + this.registryObjectDao = registryObjectDao; + } + } 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 b3486f1c2d..a991bbff6d 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 @@ -1,14 +1,59 @@ +/** + * 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.notification; import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.NotificationListener; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.NotificationType; +import org.springframework.transaction.annotation.Transactional; + +import com.raytheon.uf.common.status.IUFStatusHandler; +import com.raytheon.uf.common.status.UFStatus; + +/** + * Implementation of the ebxml notificationListenerImpl. + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 3/18/2013    1082       bphillip    Initial creation
+ * 
+ * 
+ * + * @author bphillip + * @version 1.0 + */ +@Transactional public class NotificationListenerImpl implements NotificationListener { + /** The logger */ + private static final transient IUFStatusHandler statusHandler = UFStatus + .getHandler(NotificationListenerImpl.class); + @Override public void onNotification(NotificationType notification) { - // TODO Auto-generated method stub - + statusHandler.info("Received Notification: [" + notification.getId() + + "]"); } } 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 new file mode 100644 index 0000000000..14658f14e0 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/notification/RegistryNotificationManager.java @@ -0,0 +1,267 @@ +package com.raytheon.uf.edex.registry.ebxml.services.notification; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.soap.MessageFactory; +import javax.xml.soap.SOAPConstants; +import javax.xml.soap.SOAPException; +import javax.xml.soap.SOAPMessage; +import javax.xml.transform.dom.DOMSource; + +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ActionType; +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.AuditableEventType; +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.NotificationType; +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.SubscriptionType; +import oasis.names.tc.ebxml.regrep.xsd.rs.v4.RegistryResponseType; + +import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler; +import org.apache.commons.httpclient.HostConfiguration; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpStatus; +import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.commons.httpclient.methods.RequestEntity; +import org.apache.commons.httpclient.methods.StringRequestEntity; +import org.apache.commons.httpclient.params.HttpMethodParams; +import org.apache.commons.lang.StringEscapeUtils; +import org.springframework.transaction.annotation.Transactional; +import org.w3c.dom.Document; +import org.w3c.dom.NodeList; + +import com.raytheon.uf.common.registry.ebxml.RegistryUtil; +import com.raytheon.uf.common.serialization.SerializationUtil; +import com.raytheon.uf.edex.registry.ebxml.constants.RegistryObjectTypes; +import com.raytheon.uf.edex.registry.ebxml.constants.RegistryResponseStatus; +import com.raytheon.uf.edex.registry.ebxml.constants.StatusTypes; +import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; +import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil; + +@Transactional +public class RegistryNotificationManager { + + private DefaultHttpMethodRetryHandler httpMethodRetryHandler; + + private JAXBContext jaxbResponseContext; + + private Unmarshaller jaxbResponseUnmarshaller; + + public RegistryNotificationManager() throws JAXBException { + httpMethodRetryHandler = new DefaultHttpMethodRetryHandler(3, false); + jaxbResponseContext = JAXBContext + .newInstance(RegistryResponseType.class); + jaxbResponseUnmarshaller = jaxbResponseContext.createUnmarshaller(); + } + + public NotificationType createNotification(SubscriptionType subscription, + List objectsOfInterest, + List eventsOfInterest) { + + List objectsToRemove = new ArrayList(); + for (AuditableEventType event : eventsOfInterest) { + List actionList = event.getAction(); + for (ActionType action : actionList) { + objectsToRemove.clear(); + List regObjs = action.getAffectedObjects() + .getRegistryObject(); + for (RegistryObjectType obj : regObjs) { + boolean found = false; + for (RegistryObjectType objOfInterest : objectsOfInterest) { + if (objOfInterest.getId().equals(obj.getId())) { + found = true; + break; + } + } + if (!found) { + objectsToRemove.add(obj); + } + } + regObjs.removeAll(objectsToRemove); + } + } + + // RegistryObjectType specific Fields + NotificationType notification = new NotificationType(); + notification.setId(EbxmlObjectUtil.getUUID()); + notification.setLid(notification.getId()); + notification.setName(RegistryUtil + .getInternationalString("Notification name")); + notification.setDescription(RegistryUtil + .getInternationalString("Notification Description")); + notification.setObjectType(RegistryObjectTypes.NOTIFICATION); + notification.setStatus(StatusTypes.APPROVED); + notification.setOwner("EDEX_Internal_User"); + + // NotificationType specific fields + notification.setSubscription(subscription.getId()); + notification.setEvent(eventsOfInterest); + return notification; + + } + + public void sendNotificationViaSoap(NotificationType notification, + String serviceAddress) throws EbxmlRegistryException { + String notificationXml = null; + SOAPMessage msg = null; + + /* + * Generate a new SOAP Message + */ + try { + MessageFactory factory = MessageFactory + .newInstance(SOAPConstants.SOAP_1_1_PROTOCOL); + msg = factory.createMessage(); + } catch (SOAPException e) { + throw new EbxmlRegistryException( + "Error creating notification SOAP message", e); + } + + /* + * Marshal the notification to XML string + */ + try { + notificationXml = SerializationUtil.marshalToXml(notification); + } catch (Exception e) { + throw new EbxmlRegistryException("Error marshalling notification", + e); + } + + /* + * Put the notification XML string into the soap message + */ + try { + msg.getSOAPBody().setTextContent(notificationXml); + } catch (SOAPException e) { + throw new EbxmlRegistryException( + "Error setting text content of SOAP Message", e); + } + + /* + * Send the SOAP request + */ + sendSoapMessage(msg, serviceAddress); + } + + private void sendSoapMessage(SOAPMessage message, String serviceAddress) + throws EbxmlRegistryException { + System.out.println("Sending SOAP Message to [" + serviceAddress + + "]..."); + + HostConfiguration hostConfig = new HostConfiguration(); + HttpClient client = new HttpClient(); + client.setHostConfiguration(hostConfig); + PostMethod postMethod = null; + + /* + * Format soap message for transmission + */ + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + RequestEntity reqEntity = null; + try { + message.writeTo(baos); + reqEntity = new StringRequestEntity( + StringEscapeUtils.unescapeXml(baos.toString()), "text/xml", + "utf-8"); + } catch (SOAPException e) { + throw new EbxmlRegistryException( + "Error externalizing Soap message!", e); + } catch (IOException e) { + throw new EbxmlRegistryException( + "Error writing soap message to byte array output stream!", + e); + } finally { + if (baos != null) { + try { + baos.close(); + } catch (IOException e) { + throw new EbxmlRegistryException( + "Error closing ByteArrayOutputStream!", e); + } + } + } + + /* + * Send the soap message via HTTP to desired service address + */ + try { + postMethod = new PostMethod(serviceAddress); + postMethod.setRequestEntity(reqEntity); + postMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, + httpMethodRetryHandler); + + /* + * Post the message to the service address and check the response + */ + int httpStatus = client.executeMethod(postMethod); + if (httpStatus == HttpStatus.SC_OK) { + System.out.println("Soap Message transmission to [" + + serviceAddress + "] successful!"); + } else { + throw new EbxmlRegistryException( + "Soap message transmission to [" + serviceAddress + + "] failed with HTTP Status [" + httpStatus + + "]"); + } + + /* + * Retrieve the server response and validate + */ + byte[] responseBytes = null; + try { + responseBytes = postMethod.getResponseBody(); + } catch (Exception e) { + throw new EbxmlRegistryException("Error reading response from " + + serviceAddress, e); + } + + ByteArrayInputStream responseInputStream = new ByteArrayInputStream( + responseBytes); + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory + .newInstance(); + dbf.setNamespaceAware(true); + DocumentBuilder db = dbf.newDocumentBuilder(); + Document d = db.parse(responseInputStream); + NodeList responseNodeList = d.getElementsByTagNameNS( + "urn:oasis:names:tc:ebxml-regrep:xsd:rs:4.0", + "RegistryResponse"); + if (responseNodeList.getLength() == 0) { + throw new EbxmlRegistryException( + "Invalid response returned from server!"); + } + + RegistryResponseType registryResponse = jaxbResponseUnmarshaller + .unmarshal(new DOMSource(responseNodeList.item(0)), + RegistryResponseType.class).getValue(); + if (registryResponse.getStatus().equals( + RegistryResponseStatus.SUCCESS)) { + System.out.println("Soap service at [" + serviceAddress + + "] returned success response"); + } else { + throw new EbxmlRegistryException("Soap service at [" + + serviceAddress + "] returned response: " + + registryResponse.getStatus()); + } + } finally { + if (responseInputStream != null) { + responseInputStream.close(); + } + } + } catch (Exception e) { + throw new EbxmlRegistryException( + "Error detected sending soap message to " + serviceAddress, + e); + } finally { + postMethod.releaseConnection(); + } + + } +} 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 new file mode 100644 index 0000000000..bd121d8077 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/notification/RegistrySubscriptionManager.java @@ -0,0 +1,157 @@ +package com.raytheon.uf.edex.registry.ebxml.services.notification; + +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.MsgRegistryException; +import oasis.names.tc.ebxml.regrep.xsd.query.v4.QueryResponse; +import oasis.names.tc.ebxml.regrep.xsd.query.v4.ResponseOptionType; +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.AuditableEventType; +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.NotificationType; +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.QueryType; +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.SubscriptionType; + +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; + +import com.raytheon.uf.common.serialization.SerializationUtil; +import com.raytheon.uf.common.status.IUFStatusHandler; +import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.edex.registry.ebxml.dao.AuditableEventTypeDao; +import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectTypeDao; +import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; +import com.raytheon.uf.edex.registry.ebxml.services.query.QueryManagerImpl; +import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil; + +@Transactional(propagation = Propagation.REQUIRED) +public class RegistrySubscriptionManager { + + private static final transient IUFStatusHandler statusHandler = UFStatus + .getHandler(RegistrySubscriptionManager.class); + + private RegistryNotificationManager notificationManager; + + private QueryManagerImpl queryManager; + + private RegistryObjectTypeDao subscriptionDao; + + private AuditableEventTypeDao auditableEventDao; + + public RegistrySubscriptionManager() { + + } + + public void processSubscriptions() throws EbxmlRegistryException, + MsgRegistryException { + // statusHandler + // .info("---------------------PROCESSING SUBSCRIPTIONS----------------------------"); + + // List subs = subscriptionDao + // .getAllObjectsOfType(SubscriptionType.class); + // for (SubscriptionType sub : subs) { + // processSubscription(sub); + // } + } + + private void processSubscription(SubscriptionType sub) + throws MsgRegistryException, EbxmlRegistryException { + // Get objects that match selector query + QueryType selectorQuery = sub.getSelector(); + ResponseOptionType responseOption = EbxmlObjectUtil.queryObjectFactory + .createResponseOptionType(); + responseOption.setReturnType(RegistryObjectType.class.getSimpleName()); + QueryResponse queryResponse = queryManager.executeQuery(responseOption, + selectorQuery); + List objectsOfInterest = queryResponse + .getRegistryObjectList().getRegistryObject(); + + if (!objectsOfInterest.isEmpty()) { + // Now get AuditableEvents that affected objectsOfInterest + // MUST not include AuditableEvents that have already been delivered + // to this subscriber + List eventsOfInterest = auditableEventDao + .getEventsOfInterest(objectsOfInterest); + if (!eventsOfInterest.isEmpty()) { + NotificationType notification = notificationManager + .createNotification(sub, objectsOfInterest, + eventsOfInterest); + List addresses = null; + try { + addresses = getServiceAddressFromDeliveryInfo(sub); + } catch (Exception e) { + throw new EbxmlRegistryException( + "Error extracting service addresses from subscription delivery info!", + e); + } + if (addresses.isEmpty()) { + statusHandler + .warn("No destinations found for notification!"); + } else { + for (String[] deliveryInfo : addresses) { + if (deliveryInfo[0] + .equals("urn:oasis:names:tc:ebxml-regrep:endPointType:soap")) { + notificationManager.sendNotificationViaSoap( + notification, deliveryInfo[1]); + } else { + statusHandler.warn("Unsupported delivery type: " + + deliveryInfo[1] + + ". Notification will not be delivered!"); + } + } + } + } + } + } + + public List getServiceAddressFromDeliveryInfo(SubscriptionType sub) + throws Exception { + List addresses = new ArrayList(); + DocumentBuilderFactory docFactory = DocumentBuilderFactory + .newInstance(); + docFactory.setNamespaceAware(true); + DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); + Document doc = docBuilder.parse(new InputSource(new StringReader( + SerializationUtil.getJaxbManager().marshalToXml(sub)))); + + NodeList nodes = doc.getElementsByTagNameNS( + "http://www.w3.org/2005/08/addressing", "Address"); + System.out.println(nodes.getLength()); + for (int i = 0; i < nodes.getLength(); i++) { + Node addressNode = nodes.item(i); + String endpointType = addressNode + .getAttributes() + .getNamedItemNS( + "urn:oasis:names:tc:ebxml-regrep:xsd:rs:4.0", + "endpointType").getNodeValue(); + String serviceAddress = addressNode.getNodeValue(); + addresses.add(new String[] { endpointType, serviceAddress }); + } + return addresses; + } + + public void setQueryManager(QueryManagerImpl queryManager) { + this.queryManager = queryManager; + } + + public void setSubscriptionDao(RegistryObjectTypeDao subscriptionDao) { + this.subscriptionDao = subscriptionDao; + } + + public void setAuditableEventDao(AuditableEventTypeDao auditableEventDao) { + this.auditableEventDao = auditableEventDao; + } + + public void setNotificationManager( + RegistryNotificationManager notificationManager) { + this.notificationManager = notificationManager; + } +} diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/QueryManagerImpl.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/QueryManagerImpl.java index 793e3d9e47..eb80eac33f 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/QueryManagerImpl.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/QueryManagerImpl.java @@ -21,6 +21,8 @@ package com.raytheon.uf.edex.registry.ebxml.services.query; import java.math.BigInteger; +import javax.xml.bind.JAXBException; + import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.MsgRegistryException; import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.QueryManager; import oasis.names.tc.ebxml.regrep.xsd.query.v4.QueryExceptionType; @@ -30,6 +32,9 @@ import oasis.names.tc.ebxml.regrep.xsd.query.v4.ResponseOptionType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.QueryType; import oasis.names.tc.ebxml.regrep.xsd.rs.v4.UnsupportedCapabilityExceptionType; +import org.springframework.transaction.annotation.Transactional; + +import com.raytheon.uf.common.serialization.SerializationUtil; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.time.util.ITimer; @@ -68,15 +73,18 @@ import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jan 18, 2012 184 bphillip Initial creation + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring injection * * * * @author bphillip * @version 1.0 */ - +@Transactional public class QueryManagerImpl implements QueryManager { + private boolean eagerFetch = false; + protected static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(QueryManagerImpl.class); @@ -204,6 +212,14 @@ public class QueryManagerImpl implements QueryManager { try { query.executeQuery(queryRequest, response); + if (eagerFetch) { + try { + SerializationUtil.getJaxbManager().marshalToXml(response); + } catch (JAXBException e) { + throw new EbxmlRegistryException( + "Error eagerly fetching items", e); + } + } } catch (EbxmlRegistryException e) { throw EbxmlExceptionUtil.createMsgRegistryException( "Error executing query!", QueryExceptionType.class, "", @@ -214,8 +230,7 @@ public class QueryManagerImpl implements QueryManager { timer.stop(); String queryRequestId = queryRequest.getId(); statusHandler.info("QueryManager executeQuery id [" + queryRequestId - + "] operation completed in " - + timer.getElapsedTime() + " ms"); + + "] operation completed in " + timer.getElapsedTime() + " ms"); response.setRequestId(queryRequestId); return response; @@ -301,4 +316,8 @@ public class QueryManagerImpl implements QueryManager { this.queryTypeMgr = queryTypeMgr; } + public void setEagerFetch(boolean eagerFetch) { + this.eagerFetch = eagerFetch; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/RegistryRequestInterceptor.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/RegistryRequestInterceptor.java deleted file mode 100644 index 0156691328..0000000000 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/RegistryRequestInterceptor.java +++ /dev/null @@ -1,70 +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; - -import org.apache.cxf.interceptor.Fault; -import org.apache.cxf.message.Message; -import org.apache.cxf.phase.AbstractPhaseInterceptor; -import org.apache.cxf.phase.Phase; - -import com.raytheon.uf.common.status.IUFStatusHandler; -import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.edex.registry.ebxml.services.util.RegistrySessionManager; - -/** - * - * This class intercepts calls to web services to begin a transaction - * - *
- * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * Mar 12, 2012            bphillip     Initial creation
- * 
- * 
- * - * @author bphillip - * @version 1.0 - */ -public class RegistryRequestInterceptor extends - AbstractPhaseInterceptor { - - /** The logger */ - private static final transient IUFStatusHandler statusHandler = UFStatus - .getHandler(RegistryRequestInterceptor.class); - - /** - * Creates a new RegistryRequestInterceptor before the invoke step of the - * processing chain so a Hibernate session can be created. - */ - public RegistryRequestInterceptor() { - super(Phase.PRE_INVOKE); - } - - @Override - public void handleMessage(Message arg0) throws Fault { - - RegistrySessionManager.openSession(); - - statusHandler.info("Hibernate Transactional Session Opened"); - } -} diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/RegistryRequestReturnInterceptor.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/RegistryRequestReturnInterceptor.java deleted file mode 100644 index 385efc2dbd..0000000000 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/RegistryRequestReturnInterceptor.java +++ /dev/null @@ -1,70 +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; - -import org.apache.cxf.interceptor.Fault; -import org.apache.cxf.message.Message; -import org.apache.cxf.phase.AbstractPhaseInterceptor; -import org.apache.cxf.phase.Phase; - -import com.raytheon.uf.common.status.IUFStatusHandler; -import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.edex.registry.ebxml.services.util.RegistrySessionManager; - -/** - * - * This code intercepts the response returning from the server so the Hibernate - * session can be closed - * - *
- * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * Mar 12, 2012            bphillip     Initial creation
- * 
- * 
- * - * @author bphillip - * @version 1.0 - */ -public class RegistryRequestReturnInterceptor extends - AbstractPhaseInterceptor { - - /** The logger */ - private static final transient IUFStatusHandler statusHandler = UFStatus - .getHandler(RegistryRequestReturnInterceptor.class); - - /** - * Creates a new RegistryRequestReturnInterceptor inserted after the - * response marshalling has taken place - */ - public RegistryRequestReturnInterceptor() { - super(Phase.POST_MARSHAL); - } - - @Override - public void handleMessage(Message arg0) throws Fault { - RegistrySessionManager.closeSession(); - statusHandler.info("Hibernate Transactional Session Closed"); - } - -} diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/AbstractEbxmlQuery.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/AbstractEbxmlQuery.java index 0e3e0a77bf..5627fd07d0 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/AbstractEbxmlQuery.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/AbstractEbxmlQuery.java @@ -34,14 +34,16 @@ 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.rs.v4.UnsupportedCapabilityExceptionType; +import org.springframework.transaction.annotation.Transactional; + import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.edex.registry.ebxml.constants.ErrorSeverity; import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectTypeDao; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; import com.raytheon.uf.edex.registry.ebxml.services.query.QueryManagerImpl; -import com.raytheon.uf.edex.registry.ebxml.services.query.QueryParameters; import com.raytheon.uf.edex.registry.ebxml.services.query.QueryManagerImpl.RETURN_TYPE; +import com.raytheon.uf.edex.registry.ebxml.services.query.QueryParameters; import com.raytheon.uf.edex.registry.ebxml.util.EbxmlExceptionUtil; import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil; @@ -55,12 +57,14 @@ import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 2/21/2012 #184 bphillip Initial creation + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring dao injection * * * * @author bphillip * @version 1.0 */ +@Transactional public abstract class AbstractEbxmlQuery implements IRegistryQuery { protected static final transient IUFStatusHandler statusHandler = UFStatus @@ -74,7 +78,7 @@ public abstract class AbstractEbxmlQuery implements IRegistryQuery { protected boolean matchOlderVersions = false; - protected RegistryObjectTypeDao registryObjectDao = new RegistryObjectTypeDao(); + protected RegistryObjectTypeDao registryObjectDao; public void executeQuery(QueryRequest queryRequest, QueryResponse queryResponse) throws EbxmlRegistryException { @@ -101,14 +105,15 @@ public abstract class AbstractEbxmlQuery implements IRegistryQuery { queryResults.add(regObj); continue; } else { - objVersion = regObj.getVersionInfo().getVersionNumber(); + objVersion = Integer.parseInt(regObj.getVersionInfo() + .getVersionName()); } lid = regObj.getLid(); RegistryObjectType maxObj = maxVersionMap.get(lid); if (maxObj != null) { - version = maxVersionMap.get(lid).getVersionInfo() - .getVersionNumber(); + version = Integer.parseInt(maxObj.getVersionInfo() + .getVersionName()); } if (objVersion > version) { maxVersionMap.put(lid, regObj); @@ -251,4 +256,9 @@ public abstract class AbstractEbxmlQuery implements IRegistryQuery { return filterResults(results, null); } + public void setRegistryObjectDao( + RegistryObjectTypeDao registryObjectDao) { + this.registryObjectDao = registryObjectDao; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/CanonicalEbxmlQuery.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/CanonicalEbxmlQuery.java index 21e79b5b6a..10c7845ddc 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/CanonicalEbxmlQuery.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/CanonicalEbxmlQuery.java @@ -31,13 +31,13 @@ import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jan 18, 2012 bphillip Initial creation + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring dao injection * * * * @author bphillip * @version 1.0 */ - public abstract class CanonicalEbxmlQuery extends AbstractEbxmlQuery { public static final String QUERY_CANONICAL_PREFIX = EbxmlObjectUtil.EBXML_PREFIX @@ -46,4 +46,5 @@ public abstract class CanonicalEbxmlQuery extends AbstractEbxmlQuery { public boolean isCanonical() { return true; } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/AdhocQuery.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/AdhocQuery.java index a91260cfa9..d138046373 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/AdhocQuery.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/AdhocQuery.java @@ -31,7 +31,10 @@ import oasis.names.tc.ebxml.regrep.xsd.rim.v4.QueryType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.SlotType; -import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectTypeDao; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.raytheon.uf.edex.database.DataAccessLayerException; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; import com.raytheon.uf.edex.registry.ebxml.services.query.QueryConstants; import com.raytheon.uf.edex.registry.ebxml.services.query.QueryParameters; @@ -64,13 +67,15 @@ import com.raytheon.uf.edex.registry.ebxml.services.query.types.CanonicalEbxmlQu * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jan 18, 2012 bphillip Initial creation + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring dao injection * * * * @author bphillip * @version 1.0 */ - +@Service +@Transactional public class AdhocQuery extends CanonicalEbxmlQuery { /** The list of valid parameters for this query */ @@ -88,7 +93,6 @@ public class AdhocQuery extends CanonicalEbxmlQuery { @Override protected List query(QueryType queryType, QueryResponse queryResponse) throws EbxmlRegistryException { - RegistryObjectTypeDao registryObjectDao = new RegistryObjectTypeDao(); QueryParameters parameters = getParameterMap(queryType.getSlot(), queryResponse, true); // The client did not specify the required parameter @@ -120,23 +124,27 @@ public class AdhocQuery extends CanonicalEbxmlQuery { AdhocQueryExpression expression = AdhocQueryExpressionManager .getInstance().getAdhocQueryExpression(queryExpressionSlot); Map paramMap = null; - if (queryExpressionSlot.equals("SlotQuery")) { - queryLanguage = "HQL"; - paramMap = new HashMap(); - queryExpression = getSlotQuery(queryType.getSlot(), paramMap); - return registryObjectDao.executeHQLQuery(queryExpression, true, - paramMap); - } else if (expression == null) { - paramMap = getQueryParams(queryType.getSlot()); - queryExpression = queryExpressionSlot; - return filterResults(registryObjectDao.executeHQLQuery( - queryExpression, true, paramMap)); - } else { - queryLanguage = "HQL"; - paramMap = getQueryParams(queryType.getSlot()); - queryExpression = expression.getQueryExpression(); - return filterResults(registryObjectDao.executeHQLQuery( - queryExpression, true, paramMap)); + try { + if (queryExpressionSlot.equals("SlotQuery")) { + queryLanguage = "HQL"; + paramMap = new HashMap(); + queryExpression = getSlotQuery(queryType.getSlot(), paramMap); + return registryObjectDao.executeHQLQuery(queryExpression, true, + paramMap); + } else if (expression == null) { + paramMap = getQueryParams(queryType.getSlot()); + queryExpression = queryExpressionSlot; + return filterResults(registryObjectDao.executeHQLQuery( + queryExpression, true, paramMap)); + } else { + queryLanguage = "HQL"; + paramMap = getQueryParams(queryType.getSlot()); + queryExpression = expression.getQueryExpression(); + return filterResults(registryObjectDao.executeHQLQuery( + queryExpression, true, paramMap)); + } + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Error executing Adhoc Query!", e); } } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/BasicQuery.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/BasicQuery.java index d6bc9f66d7..3f65859588 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/BasicQuery.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/BasicQuery.java @@ -24,10 +24,12 @@ import java.util.Collections; import java.util.List; import oasis.names.tc.ebxml.regrep.xsd.query.v4.QueryResponse; +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ClassificationNodeType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ClassificationType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.QueryType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; +import com.raytheon.uf.edex.database.DataAccessLayerException; import com.raytheon.uf.edex.registry.ebxml.dao.HqlQueryUtil; import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectTypeDao; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; @@ -91,6 +93,8 @@ import com.raytheon.uf.edex.registry.ebxml.services.query.types.CanonicalEbxmlQu * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 2/13/2012 #184 bphillip Initial creation + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring dao injection + * * * * @@ -105,6 +109,8 @@ public class BasicQuery extends CanonicalEbxmlQuery { /** The list of valid parameters for this query */ private static final List QUERY_PARAMETERS = new ArrayList(); + private RegistryObjectTypeDao classificationDao; + /* Initializes the list of parameters */ static { QUERY_PARAMETERS.add(QueryConstants.CLASSIFICATIONS); @@ -124,18 +130,19 @@ public class BasicQuery extends CanonicalEbxmlQuery { List ids = new ArrayList(); - RegistryObjectTypeDao dao = new RegistryObjectTypeDao( - ClassificationType.class); - - for (int i = 0; i < classifications.size(); i++) { - String subQuery = HqlQueryUtil.assembleSingleParamQuery( - ClassificationType.class, "classifiedObject", - HqlQueryUtil.EQUALS, classifications.get(i)); - if (i == 0) { - ids = dao.executeHQLQuery(subQuery); - } else { - ids.retainAll(dao.executeHQLQuery(subQuery)); + try { + for (int i = 0; i < classifications.size(); i++) { + String subQuery = HqlQueryUtil.assembleSingleParamQuery( + ClassificationType.class, "classifiedObject", + HqlQueryUtil.EQUALS, classifications.get(i)); + if (i == 0) { + ids = classificationDao.executeHQLQuery(subQuery); + } else { + ids.retainAll(classificationDao.executeHQLQuery(subQuery)); + } } + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Error executing BasicQuery!", e); } if (ids.isEmpty()) { @@ -210,8 +217,12 @@ public class BasicQuery extends CanonicalEbxmlQuery { params.getParameter(QueryConstants.CLASSIFICATIONS))) { return Collections.emptyList(); } - return registryObjectDao.executeHQLQuery(query.substring(0, - query.length() - conjunction.length())); + try { + return registryObjectDao.executeHQLQuery(query.substring(0, + query.length() - conjunction.length())); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Error executing BasicQuery!", e); + } } @@ -224,4 +235,10 @@ public class BasicQuery extends CanonicalEbxmlQuery { public String getQueryDefinition() { return QUERY_DEFINITION; } + + public void setClassificationDao( + RegistryObjectTypeDao classificationDao) { + this.classificationDao = classificationDao; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/ClassificationSchemeSelector.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/ClassificationSchemeSelector.java index 2e6e889c2a..16778a046c 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/ClassificationSchemeSelector.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/ClassificationSchemeSelector.java @@ -64,6 +64,7 @@ import com.raytheon.uf.edex.registry.ebxml.services.query.types.CanonicalEbxmlQu * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 2/13/2012 #184 bphillip Initial creation + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring dao injection * * * @@ -82,6 +83,8 @@ public class ClassificationSchemeSelector extends CanonicalEbxmlQuery { QUERY_PARAMETERS.add(QueryConstants.CLASSIFICATION_SCHEME_ID); } + private RegistryObjectTypeDao classificationSchemeTypeDao; + @Override protected List query(QueryType queryType, QueryResponse queryResponse) throws EbxmlRegistryException { @@ -102,9 +105,7 @@ public class ClassificationSchemeSelector extends CanonicalEbxmlQuery { * a list as per the requirements of this canonical query described in * the class description */ - RegistryObjectTypeDao registryObjectDao = new RegistryObjectTypeDao( - ClassificationSchemeType.class); - ClassificationSchemeType classificationScheme = registryObjectDao + ClassificationSchemeType classificationScheme = classificationSchemeTypeDao .getById((String) parameters .getFirstParameter(QueryConstants.CLASSIFICATION_SCHEME_ID)); getNodeList(classificationScheme, retVal); @@ -143,4 +144,10 @@ public class ClassificationSchemeSelector extends CanonicalEbxmlQuery { public String getQueryDefinition() { return QUERY_DEFINITION; } + + public void setClassificationSchemeTypeDao( + RegistryObjectTypeDao classificationSchemeTypeDao) { + this.classificationSchemeTypeDao = classificationSchemeTypeDao; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/ExportObject.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/ExportObject.java index 6341e8c7d9..e843093c59 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/ExportObject.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/ExportObject.java @@ -31,7 +31,6 @@ import oasis.names.tc.ebxml.regrep.xsd.rim.v4.QueryType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.TaxonomyElementType; -import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectTypeDao; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; import com.raytheon.uf.edex.registry.ebxml.services.query.QueryConstants; import com.raytheon.uf.edex.registry.ebxml.services.query.QueryParameters; @@ -61,6 +60,7 @@ import com.raytheon.uf.edex.registry.ebxml.services.query.types.CanonicalEbxmlQu * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 2/13/2012 #184 bphillip Initial creation + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring dao injection * * * @@ -78,8 +78,6 @@ public class ExportObject extends CanonicalEbxmlQuery { /** The list of valid parameters for this query */ private static final List QUERY_PARAMETERS = new ArrayList(); - private RegistryObjectTypeDao registryObjectDao = new RegistryObjectTypeDao(); - /* Initializes the list of parameters */ static { QUERY_PARAMETERS.add(QueryConstants.ID); diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/ExtrinsicObjectQuery.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/ExtrinsicObjectQuery.java index b5c7de3d4e..6bd87a377e 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/ExtrinsicObjectQuery.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/ExtrinsicObjectQuery.java @@ -28,6 +28,7 @@ import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ExtrinsicObjectType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.QueryType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; +import com.raytheon.uf.edex.database.DataAccessLayerException; import com.raytheon.uf.edex.registry.ebxml.dao.HqlQueryUtil; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; import com.raytheon.uf.edex.registry.ebxml.services.query.QueryConstants; @@ -44,6 +45,7 @@ import com.raytheon.uf.edex.registry.ebxml.services.query.types.CanonicalEbxmlQu * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jan 18, 2012 bphillip Initial creation + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring dao injection * * * @@ -72,15 +74,16 @@ public class ExtrinsicObjectQuery extends CanonicalEbxmlQuery { QUERY_PARAMETERS.add(QueryConstants.MIME_TYPES); } + private BasicQuery basicQuery; + + @SuppressWarnings("unchecked") @Override protected List query(QueryType queryType, QueryResponse queryResponse) throws EbxmlRegistryException { QueryParameters params = getParameterMap(queryType.getSlot(), queryResponse); - registryObjectDao.setDaoClass(ExtrinsicObjectType.class); - @SuppressWarnings("unchecked") - List results = (List) new BasicQuery().query(queryType, - queryResponse); + + List results = (List) basicQuery.query(queryType, queryResponse); List ids = new ArrayList(); for (RegistryObjectType regObj : results) { ids.add(regObj.getId()); @@ -98,7 +101,11 @@ public class ExtrinsicObjectQuery extends CanonicalEbxmlQuery { query.append(HqlQueryUtil.AND); HqlQueryUtil.assembleSingleParamClause(query, QueryConstants.MIME_TYPE, HqlQueryUtil.IN, mimeTypes); - return registryObjectDao.executeHQLQuery(query); + try { + return (List) registryObjectDao.executeHQLQuery(query); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Data Access Error"); + } } @Override @@ -110,4 +117,9 @@ public class ExtrinsicObjectQuery extends CanonicalEbxmlQuery { public String getQueryDefinition() { return QUERY_DEFINITION; } + + public void setBasicQuery(BasicQuery basicQuery) { + this.basicQuery = basicQuery; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/FindAssociatedObjects.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/FindAssociatedObjects.java index 5d713e2216..e7bd6e0b9e 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/FindAssociatedObjects.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/FindAssociatedObjects.java @@ -80,6 +80,7 @@ import com.raytheon.uf.edex.registry.ebxml.services.query.types.CanonicalEbxmlQu * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 2/13/2012 #184 bphillip Initial creation + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring dao injection * * * @@ -102,6 +103,10 @@ public class FindAssociatedObjects extends CanonicalEbxmlQuery { QUERY_PARAMETERS.add(QueryConstants.TARGET_OBJECT_TYPE); } + private ClassificationNodeDao classificationNodeDao; + + private FindAssociations findAssociations; + @Override protected List query(QueryType queryType, QueryResponse queryResponse) throws EbxmlRegistryException { @@ -140,14 +145,14 @@ public class FindAssociatedObjects extends CanonicalEbxmlQuery { throw new EbxmlRegistryException( "Both sourceObjectType and targetObjectType MUST NOT be specified."); } - List associations = new FindAssociations().query( + List associations = findAssociations.query( queryType, queryResponse); List ids = new ArrayList(); - for (AssociationType association : associations) { + for (RegistryObjectType association : associations) { if (sourceObjectId == null) { - ids.add(association.getSourceObject()); + ids.add(((AssociationType) association).getSourceObject()); } else { - ids.add(association.getTargetObject()); + ids.add(((AssociationType) association).getTargetObject()); } } return registryObjectDao.getById(ids); @@ -156,7 +161,7 @@ public class FindAssociatedObjects extends CanonicalEbxmlQuery { private String getTypeClause(String associationType) throws EbxmlRegistryException { - ClassificationNodeType node = new ClassificationNodeDao() + ClassificationNodeType node = classificationNodeDao .getByPath(associationType); if (node == null) { throw new EbxmlRegistryException( @@ -181,4 +186,13 @@ public class FindAssociatedObjects extends CanonicalEbxmlQuery { return QUERY_DEFINITION; } + public void setClassificationNodeDao( + ClassificationNodeDao classificationNodeDao) { + this.classificationNodeDao = classificationNodeDao; + } + + public void setFindAssociations(FindAssociations findAssociations) { + this.findAssociations = findAssociations; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/FindAssociations.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/FindAssociations.java index f899f858ac..5a3d3e58aa 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/FindAssociations.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/FindAssociations.java @@ -24,10 +24,11 @@ import java.util.Collections; import java.util.List; import oasis.names.tc.ebxml.regrep.xsd.query.v4.QueryResponse; -import oasis.names.tc.ebxml.regrep.xsd.rim.v4.AssociationType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ClassificationNodeType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.QueryType; +import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; +import com.raytheon.uf.edex.database.DataAccessLayerException; import com.raytheon.uf.edex.registry.ebxml.dao.ClassificationNodeDao; import com.raytheon.uf.edex.registry.ebxml.dao.HqlQueryUtil; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; @@ -74,6 +75,7 @@ import com.raytheon.uf.edex.registry.ebxml.services.query.types.CanonicalEbxmlQu * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 2/13/2012 #184 bphillip Initial creation + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring dao injection * * * @@ -96,9 +98,11 @@ public class FindAssociations extends CanonicalEbxmlQuery { QUERY_PARAMETERS.add(QueryConstants.TARGET_OBJECT_TYPE); } + private ClassificationNodeDao classificationNodeDao; + private String getTypeClause(String associationType) throws EbxmlRegistryException { - ClassificationNodeType node = new ClassificationNodeDao() + ClassificationNodeType node = classificationNodeDao .getByPath(associationType); if (node == null) { throw new EbxmlRegistryException( @@ -110,9 +114,8 @@ public class FindAssociations extends CanonicalEbxmlQuery { } - @SuppressWarnings("unchecked") @Override - protected List query(QueryType queryType, + protected List query(QueryType queryType, QueryResponse queryResponse) throws EbxmlRegistryException { QueryParameters parameters = this.getParameterMap(queryType.getSlot(), queryResponse); @@ -146,58 +149,63 @@ public class FindAssociations extends CanonicalEbxmlQuery { clauses.add(" association.targetObject like '" + targetObjectId + "'"); } - if (sourceObjectType != null) { - List ids = registryObjectDao - .executeHQLQuery("select id from RegistryObjectType obj where obj.objectType = '" - + targetObjectType + "'"); - if (ids.isEmpty()) { - return Collections.emptyList(); - } else { - StringBuilder clause = new StringBuilder(); - clause.append(" association.sourceObject in ("); - for (int i = 0; i < ids.size(); i++) { - clause.append("'" + ids.get(i) + "'"); - if (i != ids.size() - 1) { - clause.append(","); + try { + if (sourceObjectType != null) { + List ids = registryObjectDao + .executeHQLQuery("select id from RegistryObjectType obj where obj.objectType = '" + + targetObjectType + "'"); + if (ids.isEmpty()) { + return Collections.emptyList(); + } else { + StringBuilder clause = new StringBuilder(); + clause.append(" association.sourceObject in ("); + for (int i = 0; i < ids.size(); i++) { + clause.append("'" + ids.get(i) + "'"); + if (i != ids.size() - 1) { + clause.append(","); + } } + clause.append(") "); + clauses.add(clause.toString()); } - clause.append(") "); - clauses.add(clause.toString()); } - } - if (targetObjectType != null) { - List ids = registryObjectDao - .executeHQLQuery("select id from RegistryObjectType obj where obj.objectType = '" - + targetObjectType + "'"); - if (ids.isEmpty()) { - return Collections.emptyList(); - } else { - StringBuilder clause = new StringBuilder(); - clause.append(" association.targetObject in ("); - for (int i = 0; i < ids.size(); i++) { - clause.append("'" + ids.get(i) + "'"); - if (i != ids.size() - 1) { - clause.append(","); + if (targetObjectType != null) { + List ids = registryObjectDao + .executeHQLQuery("select id from RegistryObjectType obj where obj.objectType = '" + + targetObjectType + "'"); + if (ids.isEmpty()) { + return Collections.emptyList(); + } else { + StringBuilder clause = new StringBuilder(); + clause.append(" association.targetObject in ("); + for (int i = 0; i < ids.size(); i++) { + clause.append("'" + ids.get(i) + "'"); + if (i != ids.size() - 1) { + clause.append(","); + } } + clause.append(") "); + clauses.add(clause.toString()); } - clause.append(") "); - clauses.add(clause.toString()); } - } - StringBuilder query = new StringBuilder(); - if (clauses.isEmpty()) { - query.append("from AssociationType"); - } else { - query.append("select association from AssociationType association where "); - for (int i = 0; i < clauses.size(); i++) { - query.append(clauses.get(i)); - if (i != clauses.size() - 1) { - query.append(conjunction); + StringBuilder query = new StringBuilder(); + if (clauses.isEmpty()) { + query.append("from AssociationType"); + } else { + query.append("select association from AssociationType association where "); + for (int i = 0; i < clauses.size(); i++) { + query.append(clauses.get(i)); + if (i != clauses.size() - 1) { + query.append(conjunction); + } } } + return registryObjectDao.executeHQLQuery(query); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException( + "Error executing FindAssociations", e); } - return registryObjectDao.executeHQLQuery(query); } @Override @@ -210,4 +218,9 @@ public class FindAssociations extends CanonicalEbxmlQuery { return QUERY_DEFINITION; } + public void setClassificationNodeDao( + ClassificationNodeDao classificationNodeDao) { + this.classificationNodeDao = classificationNodeDao; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetAuditTrailById.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetAuditTrailById.java index e51579c27a..faeb5c2425 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetAuditTrailById.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetAuditTrailById.java @@ -26,7 +26,8 @@ import oasis.names.tc.ebxml.regrep.xsd.query.v4.QueryResponse; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.AuditableEventType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.QueryType; -import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectTypeDao; +import com.raytheon.uf.edex.database.DataAccessLayerException; +import com.raytheon.uf.edex.registry.ebxml.dao.AuditableEventTypeDao; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; import com.raytheon.uf.edex.registry.ebxml.services.query.QueryConstants; import com.raytheon.uf.edex.registry.ebxml.services.query.QueryParameters; @@ -55,6 +56,7 @@ import com.raytheon.uf.edex.registry.ebxml.services.query.types.CanonicalEbxmlQu * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 2/15/2012 #184 bphillip Initial creation + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring dao injection * * * @@ -76,6 +78,8 @@ public class GetAuditTrailById extends CanonicalEbxmlQuery { QUERY_PARAMETERS.add(QueryConstants.START_TIME); } + private AuditableEventTypeDao auditableEventDao; + @SuppressWarnings("unchecked") @Override protected List query(QueryType queryType, @@ -94,9 +98,6 @@ public class GetAuditTrailById extends CanonicalEbxmlQuery { + "]"); } - RegistryObjectTypeDao auditDao = new RegistryObjectTypeDao( - AuditableEventType.class); - String query = "select obj from AuditableEventType obj inner join obj.action as Action " + "inner join Action.affectedObjects as AffectedObjects " + "inner join AffectedObjects.registryObject as regObj " @@ -114,7 +115,12 @@ public class GetAuditTrailById extends CanonicalEbxmlQuery { query = query.replace(":endTimeClause", " and obj.timestamp <= '" + endTime + "'"); } - return auditDao.executeHQLQuery(query); + try { + return auditableEventDao.executeHQLQuery(query); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException( + "Error executing GetAuditTrailById", e); + } } @Override @@ -127,4 +133,8 @@ public class GetAuditTrailById extends CanonicalEbxmlQuery { return QUERY_DEFINITION; } + public void setAuditableEventDao(AuditableEventTypeDao auditableEventDao) { + this.auditableEventDao = auditableEventDao; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetAuditTrailByLid.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetAuditTrailByLid.java index 414c2cb218..8bd775ae56 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetAuditTrailByLid.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetAuditTrailByLid.java @@ -26,7 +26,8 @@ import oasis.names.tc.ebxml.regrep.xsd.query.v4.QueryResponse; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.AuditableEventType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.QueryType; -import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectTypeDao; +import com.raytheon.uf.edex.database.DataAccessLayerException; +import com.raytheon.uf.edex.registry.ebxml.dao.AuditableEventTypeDao; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; import com.raytheon.uf.edex.registry.ebxml.services.query.QueryConstants; import com.raytheon.uf.edex.registry.ebxml.services.query.QueryParameters; @@ -49,7 +50,8 @@ import com.raytheon.uf.edex.registry.ebxml.services.query.types.CanonicalEbxmlQu * SOFTWARE HISTORY * * Date Ticket# Engineer Description ------------ ---------- ----------- - * -------------------------- Jan 18, 2012 bphillip Initial creation + * -------------------------- Jan 18, 2012 bphillip Initial creation 3/18/2013 + * 1802 bphillip Modified to use transaction boundaries and spring dao injection * * * @@ -72,6 +74,8 @@ public class GetAuditTrailByLid extends CanonicalEbxmlQuery { QUERY_PARAMETERS.add(QueryConstants.START_TIME); } + private AuditableEventTypeDao auditableEventDao; + @SuppressWarnings("unchecked") @Override protected List query(QueryType queryType, @@ -90,9 +94,6 @@ public class GetAuditTrailByLid extends CanonicalEbxmlQuery { + "]"); } - RegistryObjectTypeDao auditDao = new RegistryObjectTypeDao( - AuditableEventType.class); - String query = "select obj from AuditableEventType obj inner join obj.action as Action " + "inner join Action.affectedObjects as AffectedObjects " + "inner join AffectedObjects.registryObject as regObj " @@ -110,7 +111,12 @@ public class GetAuditTrailByLid extends CanonicalEbxmlQuery { query = query.replace(":endTimeClause", " and obj.timestamp <= '" + endTime + "'"); } - return auditDao.executeHQLQuery(query); + try { + return auditableEventDao.executeHQLQuery(query); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException( + "Error executing GetAuditTrailByLid!", e); + } } @Override @@ -123,4 +129,8 @@ public class GetAuditTrailByLid extends CanonicalEbxmlQuery { return QUERY_DEFINITION; } + public void setAuditableEventDao(AuditableEventTypeDao auditableEventDao) { + this.auditableEventDao = auditableEventDao; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetAuditTrailByTimeInterval.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetAuditTrailByTimeInterval.java index 51758581a6..3798f33a5a 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetAuditTrailByTimeInterval.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetAuditTrailByTimeInterval.java @@ -28,7 +28,8 @@ import oasis.names.tc.ebxml.regrep.xsd.rim.v4.QueryType; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectTypeDao; +import com.raytheon.uf.edex.database.DataAccessLayerException; +import com.raytheon.uf.edex.registry.ebxml.dao.AuditableEventTypeDao; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; import com.raytheon.uf.edex.registry.ebxml.services.query.QueryConstants; import com.raytheon.uf.edex.registry.ebxml.services.query.QueryParameters; @@ -44,6 +45,7 @@ import com.raytheon.uf.edex.registry.ebxml.services.query.types.CanonicalEbxmlQu * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jan 18, 2012 bphillip Initial creation + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring dao injection * * * @@ -69,6 +71,8 @@ public class GetAuditTrailByTimeInterval extends CanonicalEbxmlQuery { QUERY_PARAMETERS.add(QueryConstants.START_TIME); } + private AuditableEventTypeDao auditableEventDao; + @SuppressWarnings("unchecked") @Override protected List query(QueryType queryType, @@ -91,12 +95,14 @@ public class GetAuditTrailByTimeInterval extends CanonicalEbxmlQuery { + QueryConstants.START_TIME + "]"); } - RegistryObjectTypeDao auditDao = new RegistryObjectTypeDao( - AuditableEventType.class); - String query = "select obj from AuditableEventType obj where obj.timestamp >='" + startTime + "' and obj.timestamp <='" + endTime + "'"; - return auditDao.executeHQLQuery(query); + try { + return auditableEventDao.executeHQLQuery(query); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException( + "Error executing GetAuditTrailByTime", e); + } } @Override @@ -108,4 +114,9 @@ public class GetAuditTrailByTimeInterval extends CanonicalEbxmlQuery { public String getQueryDefinition() { return QUERY_DEFINITION; } + + public void setAuditableEventDao(AuditableEventTypeDao auditableEventDao) { + this.auditableEventDao = auditableEventDao; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetClassificationSchemesById.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetClassificationSchemesById.java index f87ad96a67..92962fdfeb 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetClassificationSchemesById.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetClassificationSchemesById.java @@ -53,6 +53,7 @@ import com.raytheon.uf.edex.registry.ebxml.services.query.types.CanonicalEbxmlQu * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jan 18, 2012 bphillip Initial creation + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring dao injection * * * @@ -73,11 +74,11 @@ public class GetClassificationSchemesById extends CanonicalEbxmlQuery { QUERY_PARAMETERS.add(QueryConstants.ID); } + private RegistryObjectTypeDao classificationSchemeTypeDao; + @Override protected List query(QueryType queryType, QueryResponse queryResponse) throws EbxmlRegistryException { - RegistryObjectTypeDao registryObjectDao = new RegistryObjectTypeDao( - ClassificationSchemeType.class); QueryParameters parameters = getParameterMap(queryType.getSlot(), queryResponse); // The client did not specify the required parameter @@ -92,7 +93,8 @@ public class GetClassificationSchemesById extends CanonicalEbxmlQuery { String id = parameters.getFirstParameter(QueryConstants.ID); List ids = new ArrayList(); if (id.contains("_") || id.contains("%")) { - List matchingIds = registryObjectDao.getMatchingIds(id); + List matchingIds = classificationSchemeTypeDao + .getMatchingIds(id); if (matchingIds.isEmpty()) { return Collections.emptyList(); } @@ -102,7 +104,7 @@ public class GetClassificationSchemesById extends CanonicalEbxmlQuery { ids.add(id); } - return registryObjectDao.getById(ids); + return (List) classificationSchemeTypeDao.getById(ids); } @Override @@ -115,4 +117,9 @@ public class GetClassificationSchemesById extends CanonicalEbxmlQuery { return QUERY_DEFINITION; } + public void setClassificationSchemeTypeDao( + RegistryObjectTypeDao classificationSchemeTypeDao) { + this.classificationSchemeTypeDao = classificationSchemeTypeDao; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetNotification.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetNotification.java index 994ac45ab5..e04cf188b5 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetNotification.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetNotification.java @@ -27,6 +27,7 @@ import oasis.names.tc.ebxml.regrep.xsd.rim.v4.QueryType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.SubscriptionType; +import com.raytheon.uf.edex.database.DataAccessLayerException; import com.raytheon.uf.edex.registry.ebxml.dao.HqlQueryUtil; import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectTypeDao; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; @@ -44,6 +45,7 @@ import com.raytheon.uf.edex.registry.ebxml.services.query.types.CanonicalEbxmlQu * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jan 18, 2012 bphillip Initial creation + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring dao injection * * * @@ -65,11 +67,11 @@ public class GetNotification extends CanonicalEbxmlQuery { QUERY_PARAMETERS.add(QueryConstants.START_TIME); } + private RegistryObjectTypeDao subscriptionDao; + @Override protected List query(QueryType queryType, QueryResponse queryResponse) throws EbxmlRegistryException { - RegistryObjectTypeDao subscriptionDao = new RegistryObjectTypeDao( - SubscriptionType.class); QueryParameters parameters = getParameterMap(queryType.getSlot(), queryResponse); // The client did not specify the required parameter @@ -94,7 +96,12 @@ public class GetNotification extends CanonicalEbxmlQuery { QueryConstants.START_TIME, HqlQueryUtil.EQUALS, startTime.toString()); } - return subscriptionDao.executeHQLQuery(query); + try { + return (List) subscriptionDao.executeHQLQuery(query); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException( + "Error executing GetNotification!", e); + } } @Override @@ -106,4 +113,10 @@ public class GetNotification extends CanonicalEbxmlQuery { public String getQueryDefinition() { return QUERY_DEFINITION; } + + public void setSubscriptionDao( + RegistryObjectTypeDao subscriptionDao) { + this.subscriptionDao = subscriptionDao; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetObjectById.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetObjectById.java index 401e8e8751..8436f13ef3 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetObjectById.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetObjectById.java @@ -27,7 +27,6 @@ import oasis.names.tc.ebxml.regrep.xsd.query.v4.QueryResponse; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.QueryType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; -import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectTypeDao; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; import com.raytheon.uf.edex.registry.ebxml.services.query.QueryConstants; import com.raytheon.uf.edex.registry.ebxml.services.query.QueryParameters; @@ -46,6 +45,7 @@ import com.raytheon.uf.edex.registry.ebxml.services.query.types.CanonicalEbxmlQu * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jan 18, 2012 bphillip Initial creation + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring dao injection * * * @@ -69,7 +69,6 @@ public class GetObjectById extends CanonicalEbxmlQuery { @Override protected List query(QueryType queryType, QueryResponse queryResponse) throws EbxmlRegistryException { - RegistryObjectTypeDao registryObjectDao = new RegistryObjectTypeDao(); QueryParameters parameters = getParameterMap(queryType.getSlot(), queryResponse); // The client did not specify the required parameter @@ -94,7 +93,7 @@ public class GetObjectById extends CanonicalEbxmlQuery { ids.add(id); } - return registryObjectDao.getById(ids); + return (List) registryObjectDao.getById(ids); } @Override diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetObjectsByLid.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetObjectsByLid.java index 18952e2a18..66b626758a 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetObjectsByLid.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetObjectsByLid.java @@ -27,6 +27,7 @@ import oasis.names.tc.ebxml.regrep.xsd.query.v4.QueryResponse; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.QueryType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; +import com.raytheon.uf.edex.database.DataAccessLayerException; import com.raytheon.uf.edex.registry.ebxml.dao.HqlQueryUtil; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; import com.raytheon.uf.edex.registry.ebxml.services.query.QueryConstants; @@ -43,6 +44,7 @@ import com.raytheon.uf.edex.registry.ebxml.services.query.types.CanonicalEbxmlQu * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jan 18, 2012 bphillip Initial creation + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring dao injection * * * @@ -93,8 +95,12 @@ public class GetObjectsByLid extends CanonicalEbxmlQuery { } HqlQueryUtil.assembleSingleParamQuery(query, RegistryObjectType.class, QueryConstants.LID, HqlQueryUtil.IN, lids); - query.append(" order by obj.lid asc,obj.versionInfo.versionNumber desc"); - return registryObjectDao.executeHQLQuery(query); + query.append(" order by obj.lid asc,obj.versionInfo.versionName desc"); + try { + return (List) registryObjectDao.executeHQLQuery(query); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException("Error executing GetObjectsByLid"); + } } @Override diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetRegistryPackagesByMemberId.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetRegistryPackagesByMemberId.java index a1f7bdd584..7c84c7e40e 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetRegistryPackagesByMemberId.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/GetRegistryPackagesByMemberId.java @@ -33,6 +33,7 @@ import org.hibernate.criterion.Property; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.edex.database.DataAccessLayerException; import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectTypeDao; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; import com.raytheon.uf.edex.registry.ebxml.services.query.QueryConstants; @@ -49,6 +50,7 @@ import com.raytheon.uf.edex.registry.ebxml.services.query.types.CanonicalEbxmlQu * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jan 18, 2012 bphillip Initial creation + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring dao injection * * * @@ -73,12 +75,11 @@ public class GetRegistryPackagesByMemberId extends CanonicalEbxmlQuery { QUERY_PARAMETERS.add(QueryConstants.MEMBER_ID); } + private RegistryObjectTypeDao registryPackageDao; + @Override protected List query(QueryType queryType, QueryResponse queryResponse) throws EbxmlRegistryException { - RegistryObjectTypeDao regPackageDao = new RegistryObjectTypeDao( - RegistryPackageType.class); - RegistryObjectTypeDao regDao = new RegistryObjectTypeDao(); QueryParameters parameters = getParameterMap(queryType.getSlot(), queryResponse); // The client did not specify the required parameter @@ -92,7 +93,7 @@ public class GetRegistryPackagesByMemberId extends CanonicalEbxmlQuery { String id = parameters.getFirstParameter(QueryConstants.MEMBER_ID); List ids = new ArrayList(); if (id.contains("_") || id.contains("%")) { - List matchingIds = regDao.getMatchingIds(id); + List matchingIds = registryObjectDao.getMatchingIds(id); if (matchingIds.isEmpty()) { return Collections.emptyList(); } @@ -107,7 +108,12 @@ public class GetRegistryPackagesByMemberId extends CanonicalEbxmlQuery { theQuery.createAlias("registryObjectList", "registryObjectList"); theQuery.createAlias("registryObjectList.registryObject", "regObject"); theQuery.add(Property.forName("regObject.id").in(ids)); - return regPackageDao.executeCriteriaQuery(theQuery); + try { + return registryPackageDao.executeCriteriaQuery(theQuery); + } catch (DataAccessLayerException e) { + throw new EbxmlRegistryException( + "Error executing GetRegistryPackages!", e); + } } @Override @@ -119,4 +125,10 @@ public class GetRegistryPackagesByMemberId extends CanonicalEbxmlQuery { public String getQueryDefinition() { return QUERY_DEFINITION; } + + public void setRegistryPackageDao( + RegistryObjectTypeDao registryPackageDao) { + this.registryPackageDao = registryPackageDao; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/KeywordSearch.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/KeywordSearch.java index 59bec5e484..b48dd6f0c6 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/KeywordSearch.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/KeywordSearch.java @@ -29,12 +29,9 @@ import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.edex.registry.ebxml.dao.RegistryDao; -import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectTypeDao; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; import com.raytheon.uf.edex.registry.ebxml.services.cataloger.IndexEntry; import com.raytheon.uf.edex.registry.ebxml.services.query.QueryConstants; -import com.raytheon.uf.edex.registry.ebxml.services.query.QueryParameters; import com.raytheon.uf.edex.registry.ebxml.services.query.types.CanonicalEbxmlQuery; /** @@ -93,6 +90,7 @@ import com.raytheon.uf.edex.registry.ebxml.services.query.types.CanonicalEbxmlQu * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jan 18, 2012 bphillip Initial creation + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring dao injection * * * @@ -120,31 +118,35 @@ public class KeywordSearch extends CanonicalEbxmlQuery { @Override protected List query(QueryType queryType, QueryResponse queryResponse) throws EbxmlRegistryException { - RegistryObjectTypeDao registryObjectDao = new RegistryObjectTypeDao(); - QueryParameters parameters = getParameterMap(queryType.getSlot(), - queryResponse); - // The client did not specify the required parameter - if (parameters.isEmpty() - || !parameters.containsParameter(QueryConstants.KEYWORDS)) { - throw new EbxmlRegistryException("Canonical query [" - + this.getQueryDefinition() - + "] is missing required parameter [" - + QUERY_PARAMETERS.get(0) + "]"); - } - - String keywords = parameters.getFirstParameter(QueryConstants.KEYWORDS); - String queryString = generateQuery(keywords); - List entries = new RegistryDao(IndexEntry.class) - .executeHQLQuery(queryString); - List ids = new ArrayList(); - for (IndexEntry entry : entries) { - ids.add(entry.getParentId()); - } - if (!ids.isEmpty()) { - return registryObjectDao.getById(ids); - } else { - return Collections.emptyList(); - } + return Collections.emptyList(); + // TODO:Implement + // RegistryObjectTypeDao registryObjectDao = new + // RegistryObjectTypeDao(); + // QueryParameters parameters = getParameterMap(queryType.getSlot(), + // queryResponse); + // // The client did not specify the required parameter + // if (parameters.isEmpty() + // || !parameters.containsParameter(QueryConstants.KEYWORDS)) { + // throw new EbxmlRegistryException("Canonical query [" + // + this.getQueryDefinition() + // + "] is missing required parameter [" + // + QUERY_PARAMETERS.get(0) + "]"); + // } + // + // String keywords = + // parameters.getFirstParameter(QueryConstants.KEYWORDS); + // String queryString = generateQuery(keywords); + // List entries = new RegistryDao(IndexEntry.class) + // .executeHQLQuery(queryString); + // List ids = new ArrayList(); + // for (IndexEntry entry : entries) { + // ids.add(entry.getParentId()); + // } + // if (!ids.isEmpty()) { + // return registryObjectDao.getById(ids); + // } else { + // return Collections.emptyList(); + // } } /** diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/RegistryPackageSelector.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/RegistryPackageSelector.java index a67140996e..7493f0d435 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/RegistryPackageSelector.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/query/types/canonical/RegistryPackageSelector.java @@ -25,7 +25,6 @@ import java.util.List; import oasis.names.tc.ebxml.regrep.xsd.query.v4.QueryResponse; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.QueryType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; -import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryPackageType; import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectTypeDao; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; @@ -43,6 +42,7 @@ import com.raytheon.uf.edex.registry.ebxml.services.query.types.CanonicalEbxmlQu * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jan 18, 2012 bphillip Initial creation + * 3/18/2013 1802 bphillip Modified to use transaction boundaries and spring dao injection * * * @@ -64,10 +64,10 @@ public class RegistryPackageSelector extends CanonicalEbxmlQuery { QUERY_PARAMETERS.add(QueryConstants.DEPTH); } + private RegistryObjectTypeDao registryPackageDao; + protected List query(QueryType queryType, QueryResponse queryResponse) throws EbxmlRegistryException { - RegistryObjectTypeDao registryObjectDao = new RegistryObjectTypeDao( - RegistryPackageType.class); QueryParameters parameters = getParameterMap(queryType.getSlot(), queryResponse); // The client did not specify the required parameter @@ -87,7 +87,7 @@ public class RegistryPackageSelector extends CanonicalEbxmlQuery { .getParameter(QueryConstants.REGISTRY_PACKAGE_IDS)) { packageIds.add((String) obj); } - return registryObjectDao.getById(packageIds); + return registryPackageDao.getById(packageIds); } @Override @@ -100,4 +100,8 @@ public class RegistryPackageSelector extends CanonicalEbxmlQuery { return QUERY_DEFINITION; } + public void setRegistryPackageDao(RegistryObjectTypeDao registryPackageDao) { + this.registryPackageDao = registryPackageDao; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/util/RegistrySessionContext.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/util/RegistrySessionContext.java deleted file mode 100644 index e7046f1510..0000000000 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/util/RegistrySessionContext.java +++ /dev/null @@ -1,120 +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.util; - -import java.util.ArrayList; -import java.util.List; - -import org.hibernate.HibernateException; -import org.hibernate.Transaction; - -import com.raytheon.uf.common.event.Event; -import com.raytheon.uf.common.event.EventBus; -import com.raytheon.uf.common.status.IUFStatusHandler; -import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.common.util.session.SessionContext; -import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectTypeDao; - -/** - * A {@link SessionContext} that stores the transaction and events for the - * registry interactions within a {@link Thread}. - * - *
- * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * Sep 26, 2012 1187       djohnson     Moved in from {@link RegistrySessionManager}.
- * Feb 05, 2013 1580       mpduff       EventBus refactor.
- * 
- * 
- * - * @author djohnson - * @version 1.0 - */ - -public class RegistrySessionContext implements SessionContext { - private static final IUFStatusHandler statusHandler = UFStatus - .getHandler(RegistrySessionContext.class); - - private final List events = new ArrayList(); - - private final Transaction transaction = new RegistryObjectTypeDao() - .getSessionFactory().getCurrentSession().beginTransaction(); - - /** - * {@inheritDoc} - */ - @Override - public void open() { - // The transaction is actually opened upon construction, but this is - // good enough to log it - statusHandler.info(">>>>>>>> Hibernate Transactional Session Opened"); - } - - /** - * {@inheritDoc} - */ - @Override - public void close() { - if (transaction.isActive()) { - try { - transaction.commit(); - - // Now that the Objects are persisted in the database, send - // the notifications to the other components that might be - // looking for them. - for (Event event : events) { - EventBus.publish(event); - } - - statusHandler - .info(">>>>>>>> Hibernate Transactional Session Closed, [" - + events.size() + "] Events published."); - } catch (HibernateException e) { - statusHandler.error("Error committing transaction.", e); - } - } else { - statusHandler - .warn("Transaction is no longer active due to previous errors"); - } - } - - /** - * Add the posting of an event to the current, active Session. Any attempt - * to add an event to an inactive Session will result in an - * IllegalStateException. - * - * @param event - * The event Object to post when the transaction successfully - * completes. - * - * @throws IllegalStateException - * If an attempt is made to add an event to an inactive Session. - */ - public void postEvent(Event event) throws IllegalStateException { - if (!transaction.isActive()) { - throw new IllegalStateException( - "Attempt to add event to an inactive transaction."); - } - events.add(event); - } -} diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/util/RegistrySessionManager.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/util/RegistrySessionManager.java deleted file mode 100644 index 3bc1dcea0e..0000000000 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/util/RegistrySessionManager.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.raytheon.uf.edex.registry.ebxml.services.util; - -import com.raytheon.uf.common.event.Event; -import com.raytheon.uf.common.util.session.SessionContextFactory; -import com.raytheon.uf.common.util.session.SessionManager; - -/** - * Manage individual interactions with the Registry to manage hiberate - * transactions and event framework notifications. - * - *
- * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * Mar 29, 2012            jspinks     Initial creation
- * Sep 27, 2012 1187       djohnson    Split implementation between {@link SessionManager} and {@link RegistrySessionContext}.
- * Feb 07, 2013 1543       djohnson    Use SessionContextFactory instead of context class directly.
- * 
- * 
- * - * @author jspinks - * @version 1.0 - */ -public class RegistrySessionManager { - - /** - * {@link SessionContextFactory} for {@link RegistrySessionContext} - * instances. - */ - private static final SessionContextFactory REGISTRY_SESSION_CONTEXT_FACTORY = new SessionContextFactory() { - /** - * {@inheritDoc} - */ - @Override - public RegistrySessionContext getSessionContext() { - return new RegistrySessionContext(); - } - - /** - * {@inheritDoc} - */ - @Override - public Class getSessionContextClass() { - return RegistrySessionContext.class; - } - }; - - /** - * Opens a Hibernate transaction and binds it to a thread - */ - public static void openSession() { - SessionManager.openSession(REGISTRY_SESSION_CONTEXT_FACTORY); - } - - /** - * Closes the transaction currently bound to this thread and sends any - * events captured during this RegistrySession to the event framework for - * processing. - */ - public static void closeSession() { - SessionManager.closeSession(REGISTRY_SESSION_CONTEXT_FACTORY); - } - - /** - * Add the posting of a event to the current, active Session. Any attempt to - * add a event to an inactive Session will result in an - * IllegalStateException. - * - * @param event - * The event Object to post when the transaction successfully - * completes. - * - * @throws IllegalStateException - * If an attempt is made to add an event to an inactive Session. - */ - public static void postEvent(Event event) throws IllegalStateException { - RegistrySessionContext ctx = SessionManager - .getSessionContext(REGISTRY_SESSION_CONTEXT_FACTORY); - ctx.postEvent(event); - } -} diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/validator/ValidatorTypeManager.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/validator/ValidatorTypeManager.java index ce1ab16ce9..143db54d2d 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/validator/ValidatorTypeManager.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/validator/ValidatorTypeManager.java @@ -26,14 +26,12 @@ import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ClassificationType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ExtensibleObjectType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.IdentifiableType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; -import oasis.names.tc.ebxml.regrep.xsd.rim.v4.VersionInfoType; import oasis.names.tc.ebxml.regrep.xsd.spi.v4.ValidateObjectsResponse; import com.raytheon.uf.edex.registry.ebxml.services.validator.types.ClassificationTypeValidator; import com.raytheon.uf.edex.registry.ebxml.services.validator.types.ExtensibleObjectTypeValidator; import com.raytheon.uf.edex.registry.ebxml.services.validator.types.IdentifiableTypeValidator; import com.raytheon.uf.edex.registry.ebxml.services.validator.types.RegistryObjectTypeValidator; -import com.raytheon.uf.edex.registry.ebxml.services.validator.types.VersionInfoTypeValidator; /** * This class is responsible for managing validator implementations. @@ -45,6 +43,7 @@ import com.raytheon.uf.edex.registry.ebxml.services.validator.types.VersionInfoT * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 2/13/12 184 bphillip Initial creation + * 3/18/2013 1082 bphillip Removed reference to version type validator * * * @@ -66,7 +65,6 @@ public class ValidatorTypeManager { new RegistryObjectTypeValidator()); validatorMap.put(ClassificationType.class, new ClassificationTypeValidator()); - validatorMap.put(VersionInfoType.class, new VersionInfoTypeValidator()); } /** The singleton instance */ diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/validator/types/ClassificationTypeValidator.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/validator/types/ClassificationTypeValidator.java index 58c85cb1ae..2727986c48 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/validator/types/ClassificationTypeValidator.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/validator/types/ClassificationTypeValidator.java @@ -19,21 +19,11 @@ **/ package com.raytheon.uf.edex.registry.ebxml.services.validator.types; -import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ClassificationNodeType; -import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ClassificationSchemeType; -import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ClassificationType; -import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType; import oasis.names.tc.ebxml.regrep.xsd.spi.v4.ValidateObjectsResponse; -import oasis.names.tc.ebxml.regrep.xsd.spi.v4.ValidationExceptionType; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.edex.registry.ebxml.constants.ErrorSeverity; -import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectTypeDao; -import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; import com.raytheon.uf.edex.registry.ebxml.services.validator.IRegistryValidator; -import com.raytheon.uf.edex.registry.ebxml.services.validator.ValidatorTypeManager; -import com.raytheon.uf.edex.registry.ebxml.util.EbxmlExceptionUtil; /** * Validator implementation for validation of ClassificationType objects @@ -45,6 +35,7 @@ import com.raytheon.uf.edex.registry.ebxml.util.EbxmlExceptionUtil; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 2/13/12 184 bphillip Initial creation + * 3/18/2013 1082 bphillip Removed incorrect implementation of validator * * * @@ -59,114 +50,6 @@ public class ClassificationTypeValidator implements IRegistryValidator { @Override public void validate(Object object, ValidateObjectsResponse response) { - ValidatorTypeManager.getInstance().getValidator( - RegistryObjectType.class); - ClassificationType classType = (ClassificationType) object; - - if (classType.getClassifiedObject() == null) { - response.getException() - .add(EbxmlExceptionUtil - .createRegistryException( - ValidationExceptionType.class, - "", - "Validation Failed: classifiedObject attribute missing in classification definition", - "For both internal and external classifications, the classifiedObject " - + "attribute is required and it references the RegistryObjectType instance " - + "that is classified by this Classification", - ErrorSeverity.ERROR, statusHandler)); - } - - String nodeName = classType.getClassificationNode(); - String schemeName = classType.getClassificationScheme(); - if (nodeName == null && schemeName == null) { - response.getException() - .add(EbxmlExceptionUtil - .createRegistryException( - ValidationExceptionType.class, - "", - "Validation Failed: classificationNode and classificationScheme attributes missing in classification definition", - "If the ClassificationType instance represents an external classification," - + "then the classificationScheme attribute is required.If the ClassificationType instance represents an internal classification, then " - + "the classificationNode attribute is required.", - ErrorSeverity.ERROR, statusHandler)); - } - try { - if (nodeName != null && schemeName == null) { - ClassificationNodeType node = getNode(nodeName); - if (node == null) { - // response.getException() - // .add(EbxmlExceptionUtil - // .createRegistryException( - // ValidationExceptionType.class, - // "", - // "Validation Failed: Classification Node [" - // + nodeName - // + "] does not exist", - // "The classificationNode value MUST reference a ClassificationNodeType instance", - // ErrorSeverity.ERROR)); - } - } else if (nodeName == null && schemeName != null) { - ClassificationSchemeType scheme = getScheme(schemeName); - if (scheme == null) { - response.getException() - .add(EbxmlExceptionUtil - .createRegistryException( - ValidationExceptionType.class, - "", - "Validation Failed: Classification Scheme [" - + schemeName - + "] does not exist", - "The classificationScheme value MUST reference a ClassificationSchemeType instance", - ErrorSeverity.ERROR, statusHandler)); - } - } else { - ClassificationNodeType node = getNode(nodeName); - ClassificationSchemeType scheme = getScheme(schemeName); - if (node == null && scheme == null) { - response.getException() - .add(EbxmlExceptionUtil - .createRegistryException( - ValidationExceptionType.class, - "", - "Validation Failed: Classification Node [" - + nodeName - + "] does not exist.Classification Scheme [\"\n" - + " + schemeName\n" - + " + \"] does not exist\"", - "The classificationNode value MUST reference a ClassificationNodeType instance. The classificationScheme value MUST reference a ClassificationSchemeType instance", - ErrorSeverity.ERROR, statusHandler)); - } - - } - } catch (EbxmlRegistryException e) { - response.getException() - .add(EbxmlExceptionUtil - .createRegistryException( - ValidationExceptionType.class, - "", - "Validation Failed: Error verifying classification node and scheme", - "There was an unexpected error encountered while verifying if a classification node or scheme exists", - ErrorSeverity.ERROR, e, statusHandler)); - } - } - - private ClassificationNodeType getNode(String classificationNode) - throws EbxmlRegistryException { - if (classificationNode == null) { - return null; - } else { - return new RegistryObjectTypeDao(ClassificationNodeType.class) - .getById(classificationNode); - } - } - - private ClassificationSchemeType getScheme(String classificationScheme) - throws EbxmlRegistryException { - if (classificationScheme == null) { - return null; - } else { - return new RegistryObjectTypeDao(ClassificationSchemeType.class) - .getById(classificationScheme); - } + // TODO: Correctly implement ebXML validator } } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/validator/types/VersionInfoTypeValidator.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/validator/types/VersionInfoTypeValidator.java deleted file mode 100644 index 0520f56665..0000000000 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/services/validator/types/VersionInfoTypeValidator.java +++ /dev/null @@ -1,101 +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.validator.types; - -import java.util.List; - -import oasis.names.tc.ebxml.regrep.xsd.rim.v4.VersionInfoType; -import oasis.names.tc.ebxml.regrep.xsd.spi.v4.ValidateObjectsResponse; -import oasis.names.tc.ebxml.regrep.xsd.spi.v4.ValidationExceptionType; - -import org.hibernate.criterion.DetachedCriteria; -import org.hibernate.criterion.Property; - -import com.raytheon.uf.common.status.IUFStatusHandler; -import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.edex.registry.ebxml.constants.ErrorSeverity; -import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectTypeDao; -import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; -import com.raytheon.uf.edex.registry.ebxml.services.validator.IRegistryValidator; -import com.raytheon.uf.edex.registry.ebxml.util.EbxmlExceptionUtil; - -/** - * Validator implementation for validation of VersionInfo objects - * - *
- * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * 2/13/12      184        bphillip     Initial creation
- * 
- * 
- * - * @author bphillip - * @version 1.0 - */ -public class VersionInfoTypeValidator implements IRegistryValidator { - - protected static final transient IUFStatusHandler statusHandler = UFStatus - .getHandler(VersionInfoTypeValidator.class); - - private RegistryObjectTypeDao registryObjectDao = new RegistryObjectTypeDao(); - - @Override - public void validate(Object object, ValidateObjectsResponse response) { - VersionInfoType versionInfo = (VersionInfoType) object; - - DetachedCriteria criteria = DetachedCriteria - .forClass(VersionInfoType.class); - criteria.add(Property.forName("versionName").eq( - versionInfo.getVersionName())); - criteria.add(Property.forName("userVersionName").eq( - versionInfo.getUserVersionName())); - List result = null; - try { - result = registryObjectDao.executeCriteriaQuery(criteria); - } catch (EbxmlRegistryException e) { - response.getException() - .add(EbxmlExceptionUtil - .createRegistryException( - ValidationExceptionType.class, - "", - "Validation Failed: Error verifying version number", - "There was an unexpected error encountered while querying the registry to find if a VersionInfoType object was already present", - ErrorSeverity.ERROR, e, statusHandler)); - } - if (result == null || result.isEmpty()) { - try { - registryObjectDao.saveOrUpdate(versionInfo); - } catch (EbxmlRegistryException e) { - response.getException() - .add(EbxmlExceptionUtil - .createRegistryException( - ValidationExceptionType.class, - "", - "Validation Failed: Error verifying version number", - "There was an unexpected error encountered while saving a new VersionInfoType object to the registry", - ErrorSeverity.ERROR, e, statusHandler)); - } - } - } - -} diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/util/EDEXRegistryManager.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/util/EDEXRegistryManager.java index 2bad4ab300..e6719b4609 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/util/EDEXRegistryManager.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/util/EDEXRegistryManager.java @@ -16,8 +16,6 @@ import com.raytheon.uf.common.registry.RegistryQuery; import com.raytheon.uf.common.registry.RegistryResponse; import com.raytheon.uf.common.registry.ebxml.LifecycleManagerFactory; import com.raytheon.uf.common.registry.ebxml.QueryManagerFactory; -import com.raytheon.uf.common.registry.ebxml.RegistryTxManager; -import com.raytheon.uf.common.registry.ebxml.TxManager; import com.raytheon.uf.common.serialization.comm.response.ServerErrorResponse; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; @@ -25,7 +23,6 @@ import com.raytheon.uf.edex.auth.req.AbstractPrivilegedRequestHandler; import com.raytheon.uf.edex.auth.resp.AuthorizationResponse; import com.raytheon.uf.edex.core.EDEXUtil; import com.raytheon.uf.edex.registry.acp.xacml.XACMLPolicyEnforcementPoint; -import com.raytheon.uf.edex.registry.ebxml.services.util.RegistrySessionManager; /** * @@ -45,6 +42,7 @@ import com.raytheon.uf.edex.registry.ebxml.services.util.RegistrySessionManager; * Jun 21, 2012 736 djohnson Change handleRequest() to call RegistryManager. * Sep 14, 2012 1169 djohnson Add use of create only mode. * Sep 27, 2012 1187 djohnson Simplify the session management for a registry interaction. + * 3/18/2013 bphillip Modified to use proper transaction management and spring injection of objects * * * @@ -53,8 +51,7 @@ import com.raytheon.uf.edex.registry.ebxml.services.util.RegistrySessionManager; */ public class EDEXRegistryManager extends AbstractPrivilegedRequestHandler> implements - LifecycleManagerFactory, - QueryManagerFactory, RegistryTxManager { + LifecycleManagerFactory, QueryManagerFactory { @VisibleForTesting static IUFStatusHandler statusHandler = UFStatus @@ -65,7 +62,9 @@ public class EDEXRegistryManager extends private static final String LIFECYCLEMANAGER_BEAN = "lcmServiceImpl"; - private static final String QUERYMANAGER_BEAN = "queryServiceImpl"; + private XACMLPolicyEnforcementPoint xacmlPep; + + private QueryManager queryManager; /** * Get an implementation of LifeCycleManager that uses the internal @@ -81,19 +80,6 @@ public class EDEXRegistryManager extends .getESBComponent(LIFECYCLEMANAGER_BEAN); } - /** - * Get an implementation of TxManager to manage transactions with the - * registry. - * - * @return A implementation of TxManager. - * - * @see RegisryTxManager - */ - @Override - public TxManager getTxManager() { - return this.new EDEXTxManager(); - } - /** * Get an implementation of QueryManager that uses the internal components * defined by the registry itself. @@ -104,64 +90,7 @@ public class EDEXRegistryManager extends */ @Override public QueryManager getQueryManager() { - return (QueryManager) EDEXUtil.getESBComponent(QUERYMANAGER_BEAN); - } - - /** - * Inner class to implement the TxManager interface. The transaction - * management for the EDEX client needs to keep the hiberate Session Object - * open during the submission of a request and the subsequent iteration of - * the results. RegistryManage will use this Class to control that process. - */ - public class EDEXTxManager implements TxManager { - - /** - * Start an internal transaction to keep the hiberate Session open - * during the processing of a registry request. - */ - @Override - public void startTransaction() { - RegistrySessionManager.openSession(); - } - - /** - * Close an internal transaction to allow the hiberate Session to close - * and release resources. - */ - @Override - public void closeTransaction() { - RegistrySessionManager.closeSession(); - } - } - - /** - * This method is used by the Thrift client service route to manage the - * hiberate Session used to query the registry. Like the webservice created - * for LifecycleManager and QueryManger, the transaction management of - * thrift requests made to the registry are managed with spring - * configuration. The webservices use request/response interceptors to start - * and close the hiberate session used to process a webservice request. - * Since this class is the registered IRequestHandler for Thrift client - * requests, that same pattern is used. The camel route defined for - * processing thrift based requests uses this method to open the session for - * the length of the request. The response can then be serialized out - * without encountering hiberate errors for retrieving data. When the - * serialization step has completed, the route calls the closeSession() - * method on this class to close the hiberate session. - * - * @see closeSession() - */ - public void openSession() { - RegistrySessionManager.openSession(); - } - - /** - * Close the hiberate Session. - * - * @see openSession() - */ - public void closeSession() { - RegistrySessionManager.closeSession(); + return queryManager; } /** @@ -195,8 +124,8 @@ public class EDEXRegistryManager extends break; case REMOVE: if (query == null) { - response = RegistryManager.removeRegistyObjects( - username, objects); + response = RegistryManager.removeRegistyObjects(username, + objects); } else if (username == null) { response = RegistryManager.removeRegistyObjects(query); } else { @@ -224,9 +153,16 @@ public class EDEXRegistryManager extends @Override public AuthorizationResponse authorized(IUser user, - IRegistryRequest request) - throws AuthorizationException { - return XACMLPolicyEnforcementPoint.getInstance().handleRegistryRequest( - user, request); + IRegistryRequest request) throws AuthorizationException { + return xacmlPep.handleRegistryRequest(user, request); } + + public void setXacmlPep(XACMLPolicyEnforcementPoint xacmlPep) { + this.xacmlPep = xacmlPep; + } + + public void setQueryManager(QueryManager queryManager) { + this.queryManager = queryManager; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/util/EbxmlObjectUtil.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/util/EbxmlObjectUtil.java index bc077138a2..a6800a9bde 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/util/EbxmlObjectUtil.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/util/EbxmlObjectUtil.java @@ -42,9 +42,6 @@ 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.VersionInfoType; -import com.raytheon.uf.edex.registry.ebxml.dao.VersionInfoTypeDao; -import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; - /** * General utility class containing the ebXML object factories. * @@ -55,6 +52,7 @@ import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jan 18, 2012 184 bphillip Initial creation + * 3/18/2013 1082 bphillip Removed utility methods for VersionInfoType * * * @@ -108,39 +106,6 @@ public class EbxmlObjectUtil { return UUID.randomUUID().toString(); } - /** - * Populates a VersionInfoType object with the next version number. Version - * numbering starts at 1. - * - * @param version - * The version object to increment - * @throws EbxmlRegistryException - */ - public static VersionInfoType getNewVersion(VersionInfoType existingVersion) - throws EbxmlRegistryException { - String newVersion = String.valueOf(Integer.parseInt(existingVersion - .getVersionName()) + 1); - - VersionInfoType versionObj = rimObjectFactory.createVersionInfoType(); - versionObj.setVersionName(newVersion); - versionObj.setUserVersionName("1"); - return new VersionInfoTypeDao().sync(versionObj); - } - - /** - * Creates a new VersionInfoType object with the default version numbers - * - * @return The new VersionInfoType object - * @throws EbxmlRegistryException - */ - public static VersionInfoType newVersionObject() - throws EbxmlRegistryException { - VersionInfoType version = rimObjectFactory.createVersionInfoType(); - version.setVersionName("1"); - version.setUserVersionName("1"); - return new VersionInfoTypeDao().sync(version); - } - /** * Creates an object reference list from a list of registry object * references @@ -409,4 +374,15 @@ public class EbxmlObjectUtil { return classes; } + public static VersionInfoType incrementVersion( + VersionInfoType existingVersion) { + String newVersion = String.valueOf(Integer.parseInt(existingVersion + .getVersionName()) + 1); + + VersionInfoType versionObj = new VersionInfoType(); + versionObj.setVersionName(newVersion); + versionObj.setUserVersionName(existingVersion.getUserVersionName()); + return versionObj; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/web/AddRegistryParty.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/web/AddRegistryParty.java index 706770e057..67f88ce337 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/web/AddRegistryParty.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/web/AddRegistryParty.java @@ -28,14 +28,15 @@ import javax.servlet.http.HttpServletResponse; import oasis.names.tc.ebxml.regrep.xsd.lcm.v4.SubmitObjectsRequest; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.PartyType; +import org.springframework.transaction.annotation.Transactional; + import com.raytheon.uf.common.registry.ebxml.RegistryUtil; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.edex.core.EDEXUtil; -import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectTypeDao; +import com.raytheon.uf.edex.registry.ebxml.dao.PartyDao; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; -import com.raytheon.uf.edex.registry.ebxml.services.util.RegistrySessionManager; -import com.raytheon.uf.edex.registry.ebxml.util.EDEXRegistryManager; +import com.raytheon.uf.edex.registry.ebxml.services.lifecycle.LifecycleManagerImpl; /** * @@ -48,12 +49,14 @@ import com.raytheon.uf.edex.registry.ebxml.util.EDEXRegistryManager; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 7/31/2012 #724 bphillip Initial creation + * 3/13/2013 1082 bphillip Made transactional * * * * @author bphillip * @version 1.0 */ +@Transactional public class AddRegistryParty extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet { @@ -70,7 +73,16 @@ public class AddRegistryParty extends javax.servlet.http.HttpServlet implements /** the page to display upon failure */ private static final String ERROR_RESPONSE_PAGE = "addPartyFailure"; - @SuppressWarnings("rawtypes") + // FIXME: Add spring support to servlets + + private PartyDao partyDao = (PartyDao) EDEXUtil.getESBComponent("partyDao"); + + private LifecycleManagerImpl lcm = (LifecycleManagerImpl) EDEXUtil + .getESBComponent("lcmServiceImpl"); + + private RegistryWebUtil webUtil = (RegistryWebUtil) EDEXUtil + .getESBComponent("webUtil"); + @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { @@ -82,7 +94,7 @@ public class AddRegistryParty extends javax.servlet.http.HttpServlet implements try { // The EDEX internal user cannot be modified if (partyId.equals(RegistryUtil.DEFAULT_OWNER)) { - RegistryWebUtil.sendErrorResponse(request, response, + webUtil.sendErrorResponse(request, response, ERROR_RESPONSE_PAGE, partyId, objectType, "Cannot modify EDEX Internal User"); } @@ -91,19 +103,13 @@ public class AddRegistryParty extends javax.servlet.http.HttpServlet implements * Check to see if the party already exists. If so, the user cannot * be added */ - try { - existingParty = new RegistryObjectTypeDao(PartyType.class) - .getById(partyId); - } catch (EbxmlRegistryException e) { - RegistryWebUtil.sendErrorResponse(request, response, - ERROR_RESPONSE_PAGE, partyId, objectType, - e.getLocalizedMessage()); - } + existingParty = partyDao.getById(partyId); + if (existingParty != null) { statusHandler.error("Error adding " + objectType + " to registry. " + objectType + " " + partyId + " already exists"); - RegistryWebUtil.sendErrorResponse(request, response, + webUtil.sendErrorResponse(request, response, ERROR_RESPONSE_PAGE, partyId, objectType, objectType + " Already Exists"); @@ -114,10 +120,10 @@ public class AddRegistryParty extends javax.servlet.http.HttpServlet implements */ SubmitObjectsRequest submitRequest = null; try { - submitRequest = RegistryWebUtil.createParty(request); + submitRequest = webUtil.createParty(request); } catch (EbxmlRegistryException e) { statusHandler.error("Error creating " + objectType, e); - RegistryWebUtil.sendErrorResponse( + webUtil.sendErrorResponse( request, response, ERROR_RESPONSE_PAGE, @@ -129,15 +135,12 @@ public class AddRegistryParty extends javax.servlet.http.HttpServlet implements // Submit the objects to the registry try { - RegistrySessionManager.openSession(); - ((EDEXRegistryManager) EDEXUtil - .getESBComponent("edexRegistryManager")) - .getLifeCycleManager().submitObjects(submitRequest); - RegistryWebUtil.updatePC(request); + lcm.submitObjects(submitRequest); + webUtil.updatePC(request); } catch (Exception e) { statusHandler.error("Error submitting new " + objectType + " to the registry", e); - RegistryWebUtil.sendErrorResponse( + webUtil.sendErrorResponse( request, response, ERROR_RESPONSE_PAGE, @@ -146,12 +149,10 @@ public class AddRegistryParty extends javax.servlet.http.HttpServlet implements "Error submitting new " + objectType + " to the registry\n" + e.getLocalizedMessage()); - } finally { - RegistrySessionManager.closeSession(); } // Send success response back to the caller - RegistryWebUtil.sendSuccessResponse(request, response, + webUtil.sendSuccessResponse(request, response, SUCCESS_RESPONSE_PAGE, partyId, objectType); } catch (ServletException e) { @@ -159,13 +160,17 @@ public class AddRegistryParty extends javax.servlet.http.HttpServlet implements response.sendError(1, "Error generating response: " + e.getLocalizedMessage()); } - } - @Override - protected void doGet(HttpServletRequest request, - HttpServletResponse response) throws IOException { - response.sendError(500, "GET operation not allowed"); + public void setWebUtil(RegistryWebUtil webUtil) { + this.webUtil = webUtil; } + public void setPartyDao(PartyDao partyDao) { + this.partyDao = partyDao; + } + + public void setLcm(LifecycleManagerImpl lcm) { + this.lcm = lcm; + } } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/web/DeleteRegistryParty.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/web/DeleteRegistryParty.java index a4d0bd1437..c2ced27a97 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/web/DeleteRegistryParty.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/web/DeleteRegistryParty.java @@ -27,12 +27,13 @@ import javax.servlet.http.HttpServletResponse; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.PartyType; +import org.springframework.transaction.annotation.Transactional; + import com.raytheon.uf.common.registry.ebxml.RegistryUtil; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectTypeDao; -import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; -import com.raytheon.uf.edex.registry.ebxml.services.util.RegistrySessionManager; +import com.raytheon.uf.edex.core.EDEXUtil; +import com.raytheon.uf.edex.registry.ebxml.dao.PartyDao; /** * @@ -46,12 +47,14 @@ import com.raytheon.uf.edex.registry.ebxml.services.util.RegistrySessionManager; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 7/31/2012 #724 bphillip Initial creation + * 3/13/2013 1082 bphillip Made transactional * * * * @author bphillip * @version 1.0 */ +@Transactional public class DeleteRegistryParty extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet { @@ -64,6 +67,13 @@ public class DeleteRegistryParty extends javax.servlet.http.HttpServlet /** The page to display upon failure */ private static final String ERROR_RESPONSE_PAGE = "deletePartyFailure"; + // FIXME: Add spring support to servlets + + private PartyDao partyDao = (PartyDao) EDEXUtil.getESBComponent("partyDao"); + + private RegistryWebUtil webUtil = (RegistryWebUtil) EDEXUtil + .getESBComponent("webUtil"); + /** The logger */ private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(DeleteRegistryParty.class); @@ -75,13 +85,11 @@ public class DeleteRegistryParty extends javax.servlet.http.HttpServlet String partyId = request.getParameter(WebFields.ID.fieldName()); String objectType = request.getParameter(WebFields.OBJ_TYPE .fieldName()); - RegistryObjectTypeDao dao = new RegistryObjectTypeDao( - PartyType.class); PartyType existingParty = null; // The EDEX internal user cannot be modified if (partyId.equals(RegistryUtil.DEFAULT_OWNER)) { - RegistryWebUtil.sendErrorResponse(request, response, + webUtil.sendErrorResponse(request, response, ERROR_RESPONSE_PAGE, partyId, objectType, "Cannot remove EDEX Internal User"); } @@ -90,15 +98,11 @@ public class DeleteRegistryParty extends javax.servlet.http.HttpServlet * Check if the party exists. If not, the party obviously cannot be * deleted */ - try { - existingParty = dao.getById(partyId); - } catch (EbxmlRegistryException e) { - RegistryWebUtil.sendErrorResponse(request, response, - ERROR_RESPONSE_PAGE, partyId, objectType, - e.getLocalizedMessage()); - } + + existingParty = partyDao.getById(partyId); + if (existingParty == null) { - RegistryWebUtil.sendErrorResponse(request, response, + webUtil.sendErrorResponse(request, response, ERROR_RESPONSE_PAGE, partyId, objectType, "Unable to delete " + objectType + " " + partyId + ". " + objectType + " does not exist"); @@ -108,21 +112,18 @@ public class DeleteRegistryParty extends javax.servlet.http.HttpServlet * Remove any associations to the party */ try { - RegistrySessionManager.openSession(); - RegistryWebUtil.removeAssociations(existingParty); - RegistryWebUtil.removeParty(existingParty); + webUtil.removeAssociations(existingParty); + webUtil.removeParty(existingParty); } catch (Exception e) { statusHandler.error("Error modifying user", e); - RegistryWebUtil.sendErrorResponse(request, response, + webUtil.sendErrorResponse(request, response, ERROR_RESPONSE_PAGE, partyId, objectType, "Error removing associations to " + objectType + "\n" + e.getLocalizedMessage()); - } finally { - RegistrySessionManager.closeSession(); } // Send back a successful response to the requester - RegistryWebUtil.sendSuccessResponse(request, response, + webUtil.sendSuccessResponse(request, response, SUCCESS_RESPONSE_PAGE, partyId, objectType); } catch (ServletException e) { statusHandler.error("Error generating response", e); @@ -131,4 +132,12 @@ public class DeleteRegistryParty extends javax.servlet.http.HttpServlet } } + public void setPartyDao(PartyDao partyDao) { + this.partyDao = partyDao; + } + + public void setWebUtil(RegistryWebUtil webUtil) { + this.webUtil = webUtil; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/web/ModifyRegistryParty.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/web/ModifyRegistryParty.java index 4a3e7a9b88..dec99be32d 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/web/ModifyRegistryParty.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/web/ModifyRegistryParty.java @@ -28,14 +28,15 @@ import javax.servlet.http.HttpServletResponse; import oasis.names.tc.ebxml.regrep.xsd.lcm.v4.SubmitObjectsRequest; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.PartyType; +import org.springframework.transaction.annotation.Transactional; + import com.raytheon.uf.common.registry.ebxml.RegistryUtil; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.edex.core.EDEXUtil; -import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectTypeDao; +import com.raytheon.uf.edex.registry.ebxml.dao.PartyDao; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; -import com.raytheon.uf.edex.registry.ebxml.services.util.RegistrySessionManager; -import com.raytheon.uf.edex.registry.ebxml.util.EDEXRegistryManager; +import com.raytheon.uf.edex.registry.ebxml.services.lifecycle.LifecycleManagerImpl; /** * @@ -48,12 +49,14 @@ import com.raytheon.uf.edex.registry.ebxml.util.EDEXRegistryManager; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 7/31/2012 #724 bphillip Initial creation + * 3/13/2013 1082 bphillip Made transactional * * * * @author bphillip * @version 1.0 */ +@Transactional public class ModifyRegistryParty extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet { @@ -66,11 +69,20 @@ public class ModifyRegistryParty extends javax.servlet.http.HttpServlet /** Page to display upon failure */ private static final String ERROR_RESPONSE_PAGE = "modifyPartyFailure"; + // FIXME: Add spring support to servlets + + private PartyDao partyDao = (PartyDao) EDEXUtil.getESBComponent("partyDao"); + + private LifecycleManagerImpl lcm = (LifecycleManagerImpl) EDEXUtil + .getESBComponent("lcmServiceImpl"); + + private RegistryWebUtil webUtil = (RegistryWebUtil) EDEXUtil + .getESBComponent("webUtil"); + /** The logger */ private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(ModifyRegistryParty.class); - @SuppressWarnings("rawtypes") @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { @@ -79,13 +91,11 @@ public class ModifyRegistryParty extends javax.servlet.http.HttpServlet String partyId = request.getParameter(WebFields.ID.fieldName()); String objectType = request.getParameter(WebFields.OBJ_TYPE .fieldName()); - RegistryObjectTypeDao dao = new RegistryObjectTypeDao( - PartyType.class); PartyType existingParty = null; // The EDEX internal user cannot be modified if (partyId.equals(RegistryUtil.DEFAULT_OWNER)) { - RegistryWebUtil.sendErrorResponse(request, response, + webUtil.sendErrorResponse(request, response, ERROR_RESPONSE_PAGE, partyId, objectType, "Cannot modify EDEX Internal User"); } @@ -95,15 +105,10 @@ public class ModifyRegistryParty extends javax.servlet.http.HttpServlet * the party cannot be modified. An error response is sent to the * requester */ - try { - existingParty = dao.getById(partyId); - } catch (EbxmlRegistryException e) { - RegistryWebUtil.sendErrorResponse(request, response, - ERROR_RESPONSE_PAGE, partyId, objectType, - e.getLocalizedMessage()); - } + existingParty = partyDao.getById(partyId); + if (existingParty == null) { - RegistryWebUtil.sendErrorResponse(request, response, + webUtil.sendErrorResponse(request, response, ERROR_RESPONSE_PAGE, partyId, objectType, "Unable to modify " + objectType + " " + partyId + ". " + objectType + " does not exist"); @@ -114,10 +119,10 @@ public class ModifyRegistryParty extends javax.servlet.http.HttpServlet */ SubmitObjectsRequest submitRequest = null; try { - submitRequest = RegistryWebUtil.createParty(request); + submitRequest = webUtil.createParty(request); } catch (EbxmlRegistryException e) { statusHandler.error("Error modifying user", e); - RegistryWebUtil.sendErrorResponse( + webUtil.sendErrorResponse( request, response, ERROR_RESPONSE_PAGE, @@ -130,27 +135,21 @@ public class ModifyRegistryParty extends javax.servlet.http.HttpServlet /* * Remove any associations originating from the modified party */ - RegistrySessionManager.openSession(); try { - RegistryWebUtil.removeAssociationsFrom(existingParty); - ((EDEXRegistryManager) EDEXUtil - .getESBComponent("edexRegistryManager")) - .getLifeCycleManager().submitObjects(submitRequest); - RegistryWebUtil.updatePC(request); + webUtil.removeAssociationsFrom(existingParty); + lcm.submitObjects(submitRequest); + webUtil.updatePC(request); } catch (Exception e) { statusHandler.error("Error modifying user", e); - RegistryWebUtil.sendErrorResponse(request, response, + webUtil.sendErrorResponse(request, response, ERROR_RESPONSE_PAGE, partyId, objectType, "Error removing associations to " + objectType + "\n" + e.getLocalizedMessage()); - } finally { - RegistrySessionManager.closeSession(); } - /* * Send back success message to the requester */ - RegistryWebUtil.sendSuccessResponse(request, response, + webUtil.sendSuccessResponse(request, response, SUCCESS_RESPONSE_PAGE, partyId, objectType); } catch (ServletException e) { statusHandler.error("Error generating response", e); @@ -158,4 +157,17 @@ public class ModifyRegistryParty extends javax.servlet.http.HttpServlet "Error generating response: " + e.getLocalizedMessage()); } } + + public void setPartyDao(PartyDao partyDao) { + this.partyDao = partyDao; + } + + public void setWebUtil(RegistryWebUtil webUtil) { + this.webUtil = webUtil; + } + + public void setLcm(LifecycleManagerImpl lcm) { + this.lcm = lcm; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/web/RegistryWebAdmin.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/web/RegistryWebAdmin.java index cee9c9eba4..e64ec6f18b 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/web/RegistryWebAdmin.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/web/RegistryWebAdmin.java @@ -32,11 +32,13 @@ import oasis.names.tc.ebxml.regrep.xsd.rim.v4.PostalAddressType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RoleType; import oasis.names.tc.ebxml.regrep.xsd.rim.v4.TelephoneNumberType; +import org.springframework.transaction.annotation.Transactional; + import com.raytheon.uf.common.registry.ebxml.RegistryUtil; import com.raytheon.uf.edex.registry.ebxml.dao.ClassificationNodeDao; import com.raytheon.uf.edex.registry.ebxml.dao.OrganizationDao; +import com.raytheon.uf.edex.registry.ebxml.dao.PartyDao; import com.raytheon.uf.edex.registry.ebxml.dao.PersonDao; -import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectTypeDao; import com.raytheon.uf.edex.registry.ebxml.dao.RoleDao; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; @@ -51,12 +53,14 @@ import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 7/30/2012 724 bphillip Initial creation + * 3/13/2013 1082 bphillip Made transaction and modified to use spring injection * * * * @author bphillip * @version 1.0 */ +@Transactional public class RegistryWebAdmin { /** Static list of role types */ @@ -64,6 +68,16 @@ public class RegistryWebAdmin { "RegistryAdministrator", "RegistryLocalAdministrator", "RegistryUser", "RegistryGuest" }; + private PartyDao partyDao; + + private ClassificationNodeDao classificationNodeDao; + + private OrganizationDao organizationDao; + + private PersonDao personDao; + + private RoleDao roleDao; + /** * Gets the array of address types from the registry * @@ -72,7 +86,7 @@ public class RegistryWebAdmin { * If errors occur during database access */ public String[] getAddressTypes() throws EbxmlRegistryException { - List result = new ClassificationNodeDao().getAddressTypes(); + List result = classificationNodeDao.getAddressTypes(); return result.toArray(new String[result.size()]); } @@ -84,7 +98,7 @@ public class RegistryWebAdmin { * If errors occur during database access */ public String[] getTelephoneTypes() throws EbxmlRegistryException { - List result = new ClassificationNodeDao().getTelephoneTypes(); + List result = classificationNodeDao.getTelephoneTypes(); return result.toArray(new String[result.size()]); } @@ -96,7 +110,7 @@ public class RegistryWebAdmin { * If errors occur during database access */ public String[] getEmailTypes() throws EbxmlRegistryException { - List result = new ClassificationNodeDao().getEmailTypes(); + List result = classificationNodeDao.getEmailTypes(); return result.toArray(new String[result.size()]); } @@ -121,7 +135,7 @@ public class RegistryWebAdmin { */ public String[] getOrganizationNames(String name) throws EbxmlRegistryException { - List orgs = new OrganizationDao() + List orgs = organizationDao .getOrganizationByName(name); List retVal = new ArrayList(orgs.size()); for (OrganizationType org : orgs) { @@ -143,12 +157,11 @@ public class RegistryWebAdmin { */ public String getOrganization(String name) throws EbxmlRegistryException { // Instantiate the necessary data access objects - PersonDao personDao = new PersonDao(); - OrganizationDao orgDao = new OrganizationDao(); StringBuffer retVal = new StringBuffer(1024); // Query the organization table for matching organization names - List orgs = orgDao.getOrganizationByName(name); + List orgs = organizationDao + .getOrganizationByName(name); if (orgs.size() == 1) { retVal.append("" + orgs.size() + " Match"); } else { @@ -227,12 +240,10 @@ public class RegistryWebAdmin { // Instantiate the necessary data access objects StringBuffer retVal = new StringBuffer(1024); - PersonDao dao = new PersonDao(); - OrganizationDao orgDao = new OrganizationDao(); - RoleDao roleDao = new RoleDao(); // Query for users matching the given search criteria - List users = dao.getByFirstAndLastName(firstName, lastName); + List users = personDao.getByFirstAndLastName(firstName, + lastName); for (int i = 0; i < users.size(); i++) { if (users.get(i).getId().equals(RegistryUtil.DEFAULT_OWNER)) { users.remove(i); @@ -257,7 +268,8 @@ public class RegistryWebAdmin { */ for (PersonType user : users) { String userId = user.getId(); - OrganizationType userOrg = orgDao.getOrganizationForUser(userId); + OrganizationType userOrg = organizationDao + .getOrganizationForUser(userId); RoleType userRole = roleDao.getUserRole(userId); retVal.append(""); retVal.append("") @@ -305,93 +317,86 @@ public class RegistryWebAdmin { */ objId = objId.replaceAll("%20", " "); Map propMap = new HashMap(); - RegistryObjectTypeDao dao = new RegistryObjectTypeDao(PartyType.class); - ClassificationNodeDao nodeDao = new ClassificationNodeDao(); - try { - dao.openSession(); - PartyType party = dao.getById(objId); - if (party == null) { - return ""; - } + PartyType party = partyDao.getById(objId); - propMap.put(WebFields.ID.field(), party.getId()); - if (party instanceof PersonType) { - propMap.put(WebFields.FIRST_NAME.field(), ((PersonType) party) - .getPersonName().getFirstName()); - propMap.put(WebFields.MIDDLE_NAME.field(), ((PersonType) party) - .getPersonName().getMiddleName()); - propMap.put(WebFields.LAST_NAME.field(), ((PersonType) party) - .getPersonName().getLastName()); - OrganizationType userOrg = new OrganizationDao() - .getOrganizationForUser(party.getId()); - String orgId = ""; - if (userOrg != null) { - orgId = userOrg.getId(); - } - RoleType role = new RoleDao().getUserRole(party.getId()); - String roleId = ""; - if (role != null) { - roleId = role.getId(); - } - propMap.put(WebFields.USER_ORG.field(), orgId); - propMap.put(WebFields.USER_ROLE.field(), roleId); - } else if (party instanceof OrganizationType) { - propMap.put(WebFields.ORGANIZATION_NAME.field(), party - .getName().getLocalizedString().get(0).getValue()); - PersonType primaryContact = new PersonDao() - .getById(((OrganizationType) party).getPrimaryContact()); - if (primaryContact == null) { - propMap.put(WebFields.PRIMARY_CONTACT.field(), - "Not Specified"); - } else { - propMap.put(WebFields.PRIMARY_CONTACT.field(), "" - + primaryContact.getPersonName().getLastName() - + ", " - + primaryContact.getPersonName().getFirstName() - + ""); - } - } - - if (!party.getPostalAddress().isEmpty()) { - PostalAddressType addr = party.getPostalAddress().get(0); - propMap.put(WebFields.ADDRESS_TYPE.field(), - nodeDao.getCodeFromNode(addr.getType())); - propMap.put(WebFields.ADDRESS_1.field(), addr.getStreet()); - propMap.put(WebFields.ADDRESS_2.field(), addr.getStreetNumber()); - propMap.put(WebFields.CITY.field(), addr.getCity()); - propMap.put(WebFields.STATE.field(), addr.getStateOrProvince()); - propMap.put(WebFields.COUNTRY.field(), addr.getCountry()); - propMap.put(WebFields.POSTAL_CODE.field(), addr.getPostalCode()); - } - - if (!party.getTelephoneNumber().isEmpty()) { - TelephoneNumberType phone = party.getTelephoneNumber().get(0); - propMap.put(WebFields.TELEPHONE_TYPE.field(), - nodeDao.getCodeFromNode(phone.getType())); - propMap.put(WebFields.AREA_CODE.field(), phone.getAreaCode()); - - if (phone.getNumber().length() == 7) { - propMap.put(WebFields.PHONE_1.field(), phone.getNumber() - .substring(0, 3)); - propMap.put(WebFields.PHONE_2.field(), phone.getNumber() - .substring(3)); - } - propMap.put(WebFields.EXTENSION.field(), phone.getExtension()); - } - - if (!party.getEmailAddress().isEmpty()) { - EmailAddressType email = party.getEmailAddress().get(0); - propMap.put(WebFields.EMAIL_TYPE.field(), - nodeDao.getCodeFromNode(email.getType())); - propMap.put(WebFields.EMAIL.field(), email.getAddress()); - } - } finally { - dao.closeSession(); + if (party == null) { + return ""; } - return RegistryWebUtil.mapToString(propMap); + + propMap.put(WebFields.ID.field(), party.getId()); + if (party instanceof PersonType) { + propMap.put(WebFields.FIRST_NAME.field(), ((PersonType) party) + .getPersonName().getFirstName()); + propMap.put(WebFields.MIDDLE_NAME.field(), ((PersonType) party) + .getPersonName().getMiddleName()); + propMap.put(WebFields.LAST_NAME.field(), ((PersonType) party) + .getPersonName().getLastName()); + OrganizationType userOrg = organizationDao + .getOrganizationForUser(party.getId()); + String orgId = ""; + if (userOrg != null) { + orgId = userOrg.getId(); + } + RoleType role = roleDao.getUserRole(party.getId()); + String roleId = ""; + if (role != null) { + roleId = role.getId(); + } + propMap.put(WebFields.USER_ORG.field(), orgId); + propMap.put(WebFields.USER_ROLE.field(), roleId); + } else if (party instanceof OrganizationType) { + propMap.put(WebFields.ORGANIZATION_NAME.field(), party.getName() + .getLocalizedString().get(0).getValue()); + PersonType primaryContact = personDao + .getById(((OrganizationType) party).getPrimaryContact()); + if (primaryContact == null) { + propMap.put(WebFields.PRIMARY_CONTACT.field(), "Not Specified"); + } else { + propMap.put(WebFields.PRIMARY_CONTACT.field(), "" + + primaryContact.getPersonName().getLastName() + ", " + + primaryContact.getPersonName().getFirstName() + + ""); + } + } + + if (!party.getPostalAddress().isEmpty()) { + PostalAddressType addr = party.getPostalAddress().get(0); + propMap.put(WebFields.ADDRESS_TYPE.field(), + classificationNodeDao.getCodeFromNode(addr.getType())); + propMap.put(WebFields.ADDRESS_1.field(), addr.getStreet()); + propMap.put(WebFields.ADDRESS_2.field(), addr.getStreetNumber()); + propMap.put(WebFields.CITY.field(), addr.getCity()); + propMap.put(WebFields.STATE.field(), addr.getStateOrProvince()); + propMap.put(WebFields.COUNTRY.field(), addr.getCountry()); + propMap.put(WebFields.POSTAL_CODE.field(), addr.getPostalCode()); + } + + if (!party.getTelephoneNumber().isEmpty()) { + TelephoneNumberType phone = party.getTelephoneNumber().get(0); + propMap.put(WebFields.TELEPHONE_TYPE.field(), + classificationNodeDao.getCodeFromNode(phone.getType())); + propMap.put(WebFields.AREA_CODE.field(), phone.getAreaCode()); + + if (phone.getNumber().length() == 7) { + propMap.put(WebFields.PHONE_1.field(), phone.getNumber() + .substring(0, 3)); + propMap.put(WebFields.PHONE_2.field(), phone.getNumber() + .substring(3)); + } + propMap.put(WebFields.EXTENSION.field(), phone.getExtension()); + } + + if (!party.getEmailAddress().isEmpty()) { + EmailAddressType email = party.getEmailAddress().get(0); + propMap.put(WebFields.EMAIL_TYPE.field(), + classificationNodeDao.getCodeFromNode(email.getType())); + propMap.put(WebFields.EMAIL.field(), email.getAddress()); + } + + return mapToString(propMap); } /** @@ -403,7 +408,6 @@ public class RegistryWebAdmin { * If errors occur during database access */ public String[] getUserIdsAndNames() throws EbxmlRegistryException { - PersonDao personDao = new PersonDao(); @SuppressWarnings("unchecked") List allUsers = (List) personDao.getAllUserNames(); @@ -415,4 +419,39 @@ public class RegistryWebAdmin { } return retVal.toArray(new String[] {}); } + + public String mapToString(Map map) { + StringBuffer retVal = new StringBuffer(); + int idx = 0; + for (String key : map.keySet()) { + retVal.append(key).append("===").append(map.get(key)); + if (idx != map.size() - 1) { + retVal.append("_____"); + } + idx++; + } + return retVal.toString(); + } + + public void setPartyDao(PartyDao partyDao) { + this.partyDao = partyDao; + } + + public void setClassificationNodeDao( + ClassificationNodeDao classificationNodeDao) { + this.classificationNodeDao = classificationNodeDao; + } + + public void setOrganizationDao(OrganizationDao organizationDao) { + this.organizationDao = organizationDao; + } + + public void setPersonDao(PersonDao personDao) { + this.personDao = personDao; + } + + public void setRoleDao(RoleDao roleDao) { + this.roleDao = roleDao; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/web/RegistryWebUtil.java b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/web/RegistryWebUtil.java index 216ba56ec0..4a487cb1f8 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/web/RegistryWebUtil.java +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/src/com/raytheon/uf/edex/registry/ebxml/web/RegistryWebUtil.java @@ -22,7 +22,6 @@ package com.raytheon.uf.edex.registry.ebxml.web; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -45,7 +44,6 @@ import oasis.names.tc.ebxml.regrep.xsd.rs.v4.RegistryExceptionType; import oasis.names.tc.ebxml.regrep.xsd.rs.v4.RegistryResponseType; import com.raytheon.uf.common.registry.ebxml.RegistryUtil; -import com.raytheon.uf.edex.core.EDEXUtil; import com.raytheon.uf.edex.registry.ebxml.constants.AssociationTypes; import com.raytheon.uf.edex.registry.ebxml.constants.RegistryObjectTypes; import com.raytheon.uf.edex.registry.ebxml.constants.RegistryResponseStatus; @@ -55,7 +53,7 @@ import com.raytheon.uf.edex.registry.ebxml.dao.ClassificationNodeDao; import com.raytheon.uf.edex.registry.ebxml.dao.OrganizationDao; import com.raytheon.uf.edex.registry.ebxml.dao.PersonDao; import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException; -import com.raytheon.uf.edex.registry.ebxml.util.EDEXRegistryManager; +import com.raytheon.uf.edex.registry.ebxml.services.lifecycle.LifecycleManagerImpl; import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil; /** @@ -68,6 +66,7 @@ import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 7/30/2012 724 bphillip Initial creation + * 3/13/2013 1082 bphillip Modified to use spring injection * * * @@ -76,6 +75,8 @@ import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil; */ public class RegistryWebUtil { + private LifecycleManagerImpl lcm; + /** * Creates a party (user or organization) based on parameters contained in * the servlet request @@ -86,7 +87,7 @@ public class RegistryWebUtil { * @throws EbxmlRegistryException * If errors occur during registry interaction */ - public static SubmitObjectsRequest createParty(HttpServletRequest request) + public SubmitObjectsRequest createParty(HttpServletRequest request) throws EbxmlRegistryException { List objectList = new ArrayList(); @@ -218,7 +219,7 @@ public class RegistryWebUtil { * @throws EbxmlRegistryException * If errors occur during database interaction */ - private static AssociationType createEmployeeOfAssociation(String user, + private AssociationType createEmployeeOfAssociation(String user, String organization) throws EbxmlRegistryException { AssociationType association = new AssociationType(); @@ -246,7 +247,7 @@ public class RegistryWebUtil { * The role (The target of the association) * @return The association object */ - private static AssociationType createHasRoleAssociation(String user, + private AssociationType createHasRoleAssociation(String user, String roleName) { AssociationType association = new AssociationType(); association.setId(EbxmlObjectUtil.getUUID()); @@ -282,7 +283,7 @@ public class RegistryWebUtil { * @throws IOException * If the message cannot be forwarded */ - public static void sendSuccessResponse(HttpServletRequest request, + public void sendSuccessResponse(HttpServletRequest request, HttpServletResponse response, String responsePage, String userId, String partyType) throws ServletException, IOException { request.setAttribute("partyType", partyType); @@ -312,7 +313,7 @@ public class RegistryWebUtil { * @throws IOException * If the message cannot be forwarded */ - public static void sendErrorResponse(HttpServletRequest request, + public void sendErrorResponse(HttpServletRequest request, HttpServletResponse response, String responsePage, String userId, String partyType, String cause) throws ServletException, IOException { @@ -333,17 +334,14 @@ public class RegistryWebUtil { * @throws MsgRegistryException * If errors occur when submitting the remove object request */ - @SuppressWarnings("rawtypes") - public static void removeAssociations(PartyType party) + public void removeAssociations(PartyType party) throws EbxmlRegistryException, MsgRegistryException { AssociationDao associationDao = new AssociationDao(); List associations = associationDao .getAllAssociations(party.getId()); if (!associations.isEmpty()) { RemoveObjectsRequest removeRequest = getRemoveRequest(associations); - ((EDEXRegistryManager) EDEXUtil - .getESBComponent("edexRegistryManager")) - .getLifeCycleManager().removeObjects(removeRequest); + lcm.removeObjects(removeRequest); } } @@ -357,17 +355,14 @@ public class RegistryWebUtil { * @throws MsgRegistryException * If errors occur when submitting the remove object request */ - @SuppressWarnings("rawtypes") - public static void removeAssociationsFrom(PartyType party) + public void removeAssociationsFrom(PartyType party) throws EbxmlRegistryException, MsgRegistryException { AssociationDao associationDao = new AssociationDao(); List associations = associationDao .getAssociationsFrom(party.getId()); if (!associations.isEmpty()) { RemoveObjectsRequest removeRequest = getRemoveRequest(associations); - ((EDEXRegistryManager) EDEXUtil - .getESBComponent("edexRegistryManager")) - .getLifeCycleManager().removeObjects(removeRequest); + lcm.removeObjects(removeRequest); } } @@ -381,17 +376,14 @@ public class RegistryWebUtil { * @throws MsgRegistryException * If errors occur when submitting the remove object request */ - @SuppressWarnings("rawtypes") - public static void removeAssociationsTo(PartyType party) + public void removeAssociationsTo(PartyType party) throws EbxmlRegistryException, MsgRegistryException { AssociationDao associationDao = new AssociationDao(); List associations = associationDao .getAssociationsTo(party.getId()); if (!associations.isEmpty()) { RemoveObjectsRequest removeRequest = getRemoveRequest(associations); - ((EDEXRegistryManager) EDEXUtil - .getESBComponent("edexRegistryManager")) - .getLifeCycleManager().removeObjects(removeRequest); + lcm.removeObjects(removeRequest); } } @@ -403,7 +395,7 @@ public class RegistryWebUtil { * @throws EbxmlRegistryException * If errors occur during database interaction */ - public static void updatePC(HttpServletRequest request) + public void updatePC(HttpServletRequest request) throws EbxmlRegistryException { if (request.getParameter(WebFields.OBJ_TYPE.fieldName()).equals("User")) { String user = request.getParameter(WebFields.ID.fieldName()); @@ -424,7 +416,7 @@ public class RegistryWebUtil { update = true; } if (update) { - orgDao.saveOrUpdate(org); + orgDao.createOrUpdate(org); } } } @@ -439,15 +431,11 @@ public class RegistryWebUtil { * @throws MsgRegistryException * If errors occur when submitting the remove objects request */ - @SuppressWarnings("rawtypes") - public static void removeParty(PartyType party) - throws EbxmlRegistryException, MsgRegistryException { + public void removeParty(PartyType party) throws EbxmlRegistryException, + MsgRegistryException { - EDEXRegistryManager mgr = ((EDEXRegistryManager) EDEXUtil - .getESBComponent("edexRegistryManager")); RemoveObjectsRequest request = getRemoveRequest(party); - RegistryResponseType response = mgr.getLifeCycleManager() - .removeObjects(request); + RegistryResponseType response = lcm.removeObjects(request); if (!response.getStatus().equals(RegistryResponseStatus.SUCCESS)) { StringBuffer exceptionText = new StringBuffer(); exceptionText.append("Remove Objects Failed:\n"); @@ -471,7 +459,7 @@ public class RegistryWebUtil { * The object to be submitted to the registry * @return The submit object request */ - public static SubmitObjectsRequest getSubmitRequest( + public SubmitObjectsRequest getSubmitRequest( T obj) { List objs = new ArrayList(); objs.add(obj); @@ -488,7 +476,7 @@ public class RegistryWebUtil { * The objects to be submitted to the registry * @return The submit object request */ - public static SubmitObjectsRequest getSubmitRequest( + public SubmitObjectsRequest getSubmitRequest( List objs) { SubmitObjectsRequest submitRequest = new SubmitObjectsRequest(); submitRequest.setComment("Object submission"); @@ -511,7 +499,7 @@ public class RegistryWebUtil { * The object to be removed from the registry * @return The RemoveObjectRequest object */ - public static RemoveObjectsRequest getRemoveRequest( + public RemoveObjectsRequest getRemoveRequest( T obj) { List objs = new ArrayList(1); objs.add(obj); @@ -528,7 +516,7 @@ public class RegistryWebUtil { * The objects to be removed from the registry * @return The RemoveObjectRequest object */ - public static RemoveObjectsRequest getRemoveRequest( + public RemoveObjectsRequest getRemoveRequest( List objs) { StringBuffer comment = new StringBuffer(objs.size() * 38); comment.append("Removing objects: "); @@ -546,24 +534,8 @@ public class RegistryWebUtil { } - /** - * Converst a map of objects to a string representation that can be easily - * parsed by the web client - * - * @param map - * The map of key value pairs to convert to a string - * @return The String representation of the map - */ - public static String mapToString(Map map) { - StringBuffer retVal = new StringBuffer(); - int idx = 0; - for (String key : map.keySet()) { - retVal.append(key).append("===").append(map.get(key)); - if (idx != map.size() - 1) { - retVal.append("_____"); - } - idx++; - } - return retVal.toString(); + public void setLcm(LifecycleManagerImpl lcm) { + this.lcm = lcm; } + } diff --git a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/utility/edex_static/base/ebxml/minDB/ext/SubmitObjectsRequest_DataDelivery_OrganizationRoleScheme.xml b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/utility/edex_static/base/ebxml/minDB/ext/SubmitObjectsRequest_DataDelivery_OrganizationRoleScheme.xml index dfcb57bc8a..545a669ffb 100644 --- a/edexOsgi/com.raytheon.uf.edex.registry.ebxml/utility/edex_static/base/ebxml/minDB/ext/SubmitObjectsRequest_DataDelivery_OrganizationRoleScheme.xml +++ b/edexOsgi/com.raytheon.uf.edex.registry.ebxml/utility/edex_static/base/ebxml/minDB/ext/SubmitObjectsRequest_DataDelivery_OrganizationRoleScheme.xml @@ -1,47 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/edexOsgi/com.raytheon.uf.edex.stats/META-INF/MANIFEST.MF b/edexOsgi/com.raytheon.uf.edex.stats/META-INF/MANIFEST.MF index 2c0c6cafe7..cca8321201 100644 --- a/edexOsgi/com.raytheon.uf.edex.stats/META-INF/MANIFEST.MF +++ b/edexOsgi/com.raytheon.uf.edex.stats/META-INF/MANIFEST.MF @@ -22,5 +22,6 @@ Require-Bundle: com.raytheon.uf.common.serialization;bundle-version="1.12.1174", com.raytheon.uf.common.status;bundle-version="1.12.1174", org.apache.commons.collections;bundle-version="3.2.0", org.junit, - javax.measure + javax.measure, + org.hibernate;bundle-version="1.0.0" Import-Package: javax.measure.unit diff --git a/edexOsgi/com.raytheon.uf.edex.stats/res/spring/edex-process-stats.xml b/edexOsgi/com.raytheon.uf.edex.stats/res/spring/edex-process-stats.xml index cf2b57d112..4cd31c1f0f 100644 --- a/edexOsgi/com.raytheon.uf.edex.stats/res/spring/edex-process-stats.xml +++ b/edexOsgi/com.raytheon.uf.edex.stats/res/spring/edex-process-stats.xml @@ -12,12 +12,22 @@ + + + + + + + + + + - - + + - - - + + + - + + + + + + + + + diff --git a/edexOsgi/com.raytheon.uf.edex.stats/res/spring/stats-graph-request.xml b/edexOsgi/com.raytheon.uf.edex.stats/res/spring/stats-graph-request.xml index 9748fb9b8f..717528c4d9 100644 --- a/edexOsgi/com.raytheon.uf.edex.stats/res/spring/stats-graph-request.xml +++ b/edexOsgi/com.raytheon.uf.edex.stats/res/spring/stats-graph-request.xml @@ -9,5 +9,6 @@ + diff --git a/edexOsgi/com.raytheon.uf.edex.stats/src/com/raytheon/uf/edex/stats/AggregateManager.java b/edexOsgi/com.raytheon.uf.edex.stats/src/com/raytheon/uf/edex/stats/AggregateManager.java index 40af314884..aa2abdab5a 100644 --- a/edexOsgi/com.raytheon.uf.edex.stats/src/com/raytheon/uf/edex/stats/AggregateManager.java +++ b/edexOsgi/com.raytheon.uf.edex.stats/src/com/raytheon/uf/edex/stats/AggregateManager.java @@ -32,6 +32,9 @@ import java.util.TimeZone; import javax.xml.bind.JAXBException; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; @@ -70,25 +73,23 @@ import com.raytheon.uf.edex.stats.util.ConfigLoader; * Nov 28, 2012 1350 rjpeter Simplied aggregation and added aggregation with current db aggregate records. * Jan 07, 2013 1451 djohnson Use newGmtCalendar(). * Jan 15, 2013 1487 djohnson Use xml for the grouping information on an {@link AggregateRecord}. + * 3/13/2013 bphillip Updated to use spring injection of dao * * * @author jsanchez * */ +@Component +@Transactional public class AggregateManager { private static final IUFStatusHandler statusHandler = UFStatus .getHandler(AggregateManager.class); + private AggregateRecordDao aggregateDao; + private static final Object[] EMPTY_OBJ_ARR = new Object[0]; - private static final JAXBManager JAXB_MANAGER; - static { - try { - JAXB_MANAGER = new JAXBManager(StatsGroupingColumn.class); - } catch (JAXBException e) { - throw new ExceptionInInitializerError(e); - } - } + private JAXBManager jaxbManager; /** In minutes */ private int bucketInterval; @@ -97,6 +98,7 @@ public class AggregateManager { private static final int defaultBucketInterval = 5; /** default value */ + @SuppressWarnings("unused") private static final int defaultScanInterval = 15; public AggregateManager(String bucketInterval) { @@ -112,8 +114,8 @@ public class AggregateManager { * @param timeRange * @param groupedEvents */ - private void aggregate(AggregateRecordDao dao, StatisticsEvent statsEvent, - TimeRange timeRange, Multimap groupedEvents) { + private void aggregate(StatisticsEvent statsEvent, TimeRange timeRange, + Multimap groupedEvents) { Calendar start = TimeUtil.newGmtCalendar(); start.setTime(timeRange.getStart()); @@ -157,7 +159,7 @@ public class AggregateManager { record.setMin(min); record.setMax(max); record.setCount(count); - dao.mergeRecord(record); + aggregateDao.mergeRecord(record); } catch (Exception e) { statusHandler.error("Unable to aggregate '" + field + "'", e); @@ -217,7 +219,6 @@ public class AggregateManager { long t0 = System.currentTimeMillis(); ConfigLoader configLoader = ConfigLoader.getInstance(); StatsDao statsRecordDao = new StatsDao(); - AggregateRecordDao aggrRecordDao = new AggregateRecordDao(); Map statsMap = configLoader.getTypeView(); @@ -244,7 +245,7 @@ public class AggregateManager { for (Map.Entry> timeMapEntry : timeMap .entrySet()) { - aggregate(aggrRecordDao, event, timeMapEntry.getKey(), + aggregate(event, timeMapEntry.getKey(), timeMapEntry.getValue()); } @@ -309,7 +310,7 @@ public class AggregateManager { } @VisibleForTesting - static String determineGroupRepresentationForEvent( + private String determineGroupRepresentationForEvent( StatisticsEvent statEvent, Event event) throws IllegalAccessException, InvocationTargetException, JAXBException { @@ -329,7 +330,7 @@ public class AggregateManager { StatsGroupingColumn column = new StatsGroupingColumn(); column.setGroup(groupings); - return JAXB_MANAGER.marshalToXml(column); + return jaxbManager.marshalToXml(column); } /** @@ -361,4 +362,13 @@ public class AggregateManager { + bucketInterval + "'"); } } + + public void setAggregateDao(AggregateRecordDao aggregateDao) { + this.aggregateDao = aggregateDao; + } + + public void setJaxbManager(JAXBManager jaxbManager) { + this.jaxbManager = jaxbManager; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.stats/src/com/raytheon/uf/edex/stats/dao/AggregateRecordDao.java b/edexOsgi/com.raytheon.uf.edex.stats/src/com/raytheon/uf/edex/stats/dao/AggregateRecordDao.java index 622ed63451..c0d85eca44 100644 --- a/edexOsgi/com.raytheon.uf.edex.stats/src/com/raytheon/uf/edex/stats/dao/AggregateRecordDao.java +++ b/edexOsgi/com.raytheon.uf.edex.stats/src/com/raytheon/uf/edex/stats/dao/AggregateRecordDao.java @@ -1,21 +1,57 @@ +/** + * 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.stats.dao; +import java.util.HashMap; import java.util.List; +import java.util.Map; -import com.raytheon.uf.common.dataquery.db.QueryParam.QueryOperand; import com.raytheon.uf.common.stats.AggregateRecord; import com.raytheon.uf.common.util.CollectionUtil; import com.raytheon.uf.edex.database.DataAccessLayerException; -import com.raytheon.uf.edex.database.dao.CoreDao; -import com.raytheon.uf.edex.database.dao.DaoConfig; -import com.raytheon.uf.edex.database.query.DatabaseQuery; +import com.raytheon.uf.edex.database.dao.SessionManagedDao; -public class AggregateRecordDao extends CoreDao { +/** + * Stats object data access object + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 3/18/2013    1082       bphillip     Modified to extend sessionmanagedDao and use spring injection
+ * 
+ * 
+ * + * @author bphillip + * @version 1.0 + */ +public class AggregateRecordDao extends + SessionManagedDao { /** * Creates a new data access object */ public AggregateRecordDao() { - super(DaoConfig.forClass("metadata", AggregateRecord.class)); + } /** @@ -29,21 +65,17 @@ public class AggregateRecordDao extends CoreDao { * size 0 will be returned. * @throws DataAccessLayerException */ - @SuppressWarnings("unchecked") public void mergeRecord(AggregateRecord newRecord) throws DataAccessLayerException { - DatabaseQuery query = new DatabaseQuery(AggregateRecord.class); - query.addQueryParam("eventType", newRecord.getEventType(), - QueryOperand.EQUALS); - query.addQueryParam("field", newRecord.getField(), QueryOperand.EQUALS); - query.addQueryParam("grouping", newRecord.getGrouping(), - QueryOperand.EQUALS); - query.addQueryParam("startDate", newRecord.getStartDate(), - QueryOperand.EQUALS); - query.addQueryParam("endDate", newRecord.getEndDate(), - QueryOperand.EQUALS); + String hql = "from AggregateRecord rec where rec.eventType = :eventType and rec.field = :field and rec.grouping = :grouping and rec.startDate = :startDate and rec.endDate = :endDate"; + Map parameters = new HashMap(); + parameters.put("eventType", newRecord.getEventType()); + parameters.put("field", newRecord.getField()); + parameters.put("grouping", newRecord.getGrouping()); + parameters.put("startDate", newRecord.getStartDate()); + parameters.put("endDate", newRecord.getEndDate()); - List results = (List) queryByCriteria(query); + List results = this.executeHQLQuery(hql, parameters); if (!CollectionUtil.isNullOrEmpty(results)) { // shouldn't be able to get multiple results, just merge with first // and update @@ -56,9 +88,19 @@ public class AggregateRecordDao extends CoreDao { if (newRecord.getMax() > prevRecord.getMax()) { prevRecord.setMax(newRecord.getMax()); } - update(prevRecord); + this.update(prevRecord); } else { - persist(newRecord); + this.createOrUpdate(newRecord); } } + + @Override + public AggregateRecord getById(Integer id) { + return super.getById(id); + } + + @Override + protected Class getEntityClass() { + return AggregateRecord.class; + } } diff --git a/edexOsgi/com.raytheon.uf.edex.stats/src/com/raytheon/uf/edex/stats/dao/StatsDao.java b/edexOsgi/com.raytheon.uf.edex.stats/src/com/raytheon/uf/edex/stats/dao/StatsDao.java index b1e1df0439..ea988b9f3b 100644 --- a/edexOsgi/com.raytheon.uf.edex.stats/src/com/raytheon/uf/edex/stats/dao/StatsDao.java +++ b/edexOsgi/com.raytheon.uf.edex.stats/src/com/raytheon/uf/edex/stats/dao/StatsDao.java @@ -1,21 +1,56 @@ +/** + * 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.stats.dao; import java.util.Calendar; +import java.util.HashMap; import java.util.List; +import java.util.Map; -import com.raytheon.uf.common.dataquery.db.QueryParam.QueryOperand; import com.raytheon.uf.common.stats.StatsRecord; import com.raytheon.uf.edex.database.DataAccessLayerException; -import com.raytheon.uf.edex.database.dao.CoreDao; -import com.raytheon.uf.edex.database.dao.DaoConfig; -import com.raytheon.uf.edex.database.query.DatabaseQuery; +import com.raytheon.uf.edex.database.dao.SessionManagedDao; -public class StatsDao extends CoreDao { +/** + * Stats object data access object + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 3/18/2013    1082       bphillip     Modified to extend sessionmanagedDao and use spring injection
+ * 
+ * 
+ * + * @author bphillip + * @version 1.0 + */ +public class StatsDao extends SessionManagedDao { /** * Creates a new data access object */ public StatsDao() { - super(DaoConfig.forClass("metadata", StatsRecord.class)); + } /** @@ -29,18 +64,22 @@ public class StatsDao extends CoreDao { * size 0 will be returned. * @throws DataAccessLayerException */ - @SuppressWarnings("unchecked") public List retrieveRecords(Calendar limit, String eventType, int maxResults) throws DataAccessLayerException { - DatabaseQuery query = new DatabaseQuery(StatsRecord.class); - query.addQueryParam("eventType", eventType, QueryOperand.EQUALS); - query.addQueryParam("date", limit, QueryOperand.LESSTHAN); - query.addOrder("date", true); + Map params = new HashMap(); + String hql = "from StatsRecord rec where rec.eventType = :eventType and rec.date < :date order by rec.date asc"; + params.put("eventType", eventType); + params.put("date", limit); + return this.query(hql, params, maxResults); + } - if (maxResults > 0) { - query.setMaxResults(maxResults); - } + @Override + public StatsRecord getById(Integer id) { + return super.getById(id); + } - return (List) queryByCriteria(query); + @Override + protected Class getEntityClass() { + return StatsRecord.class; } } diff --git a/edexOsgi/com.raytheon.uf.edex.stats/src/com/raytheon/uf/edex/stats/handler/GraphDataHandler.java b/edexOsgi/com.raytheon.uf.edex.stats/src/com/raytheon/uf/edex/stats/handler/GraphDataHandler.java index 6ad60bff07..f2f802cadb 100644 --- a/edexOsgi/com.raytheon.uf.edex.stats/src/com/raytheon/uf/edex/stats/handler/GraphDataHandler.java +++ b/edexOsgi/com.raytheon.uf.edex.stats/src/com/raytheon/uf/edex/stats/handler/GraphDataHandler.java @@ -22,9 +22,12 @@ package com.raytheon.uf.edex.stats.handler; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; + +import org.springframework.transaction.annotation.Transactional; -import com.raytheon.uf.common.dataquery.db.QueryParam.QueryOperand; import com.raytheon.uf.common.serialization.comm.IRequestHandler; import com.raytheon.uf.common.stats.AggregateRecord; import com.raytheon.uf.common.stats.GraphDataRequest; @@ -34,9 +37,7 @@ import com.raytheon.uf.common.stats.xml.StatisticsAggregate; import com.raytheon.uf.common.stats.xml.StatisticsConfig; import com.raytheon.uf.common.stats.xml.StatisticsEvent; import com.raytheon.uf.common.time.util.TimeUtil; -import com.raytheon.uf.edex.database.dao.CoreDao; -import com.raytheon.uf.edex.database.dao.DaoConfig; -import com.raytheon.uf.edex.database.query.DatabaseQuery; +import com.raytheon.uf.edex.stats.dao.AggregateRecordDao; import com.raytheon.uf.edex.stats.data.StatsDataAccumulator; import com.raytheon.uf.edex.stats.util.ConfigLoader; @@ -57,11 +58,10 @@ import com.raytheon.uf.edex.stats.util.ConfigLoader; * @author mpduff * @version 1.0 */ - +@Transactional public class GraphDataHandler implements IRequestHandler { /** Aggregate Record DAO */ - private final CoreDao dao = new CoreDao(DaoConfig.forClass("metadata", - AggregateRecord.class)); + private AggregateRecordDao aggregateRecordDao; private static final String START_DATE = "startDate"; @@ -123,23 +123,27 @@ public class GraphDataHandler implements IRequestHandler { */ private GraphDataResponse getGraphData(GraphDataRequest request) throws Exception { + Map params = new HashMap(); + StringBuffer query = new StringBuffer(); + query.append("from AggregateRecord rec where rec.startDate >= :startDate and rec.endDate <= :endDate"); GraphDataResponse response = new GraphDataResponse(); - DatabaseQuery query = new DatabaseQuery(AggregateRecord.class.getName()); Calendar start = convertToCalendar(request.getTimeRange().getStart()); Calendar end = convertToCalendar(request.getTimeRange().getEnd()); - query.addQueryParam(START_DATE, start, QueryOperand.GREATERTHANEQUALS); - query.addQueryParam(END_DATE, end, QueryOperand.LESSTHANEQUALS); + params.put(START_DATE, start); + params.put(END_DATE, end); if (request.getEventType() != null) { - query.addQueryParam(EVENT_TYPE, request.getEventType(), - QueryOperand.EQUALS); + query.append(" and rec.eventType = :eventType"); + params.put(EVENT_TYPE, request.getEventType()); } if (request.getField() != null) { - query.addQueryParam(FIELD, request.getField(), QueryOperand.EQUALS); + query.append(" and rec.field = :field"); + params.put(FIELD, request.getField()); } - List results = dao.queryByCriteria(query); + List results = aggregateRecordDao.executeHQLQuery(query.toString(), + params); if (!results.isEmpty()) { List arList = new ArrayList(); @@ -216,4 +220,8 @@ public class GraphDataHandler implements IRequestHandler { return unit; } + public void setAggregateRecordDao(AggregateRecordDao aggregateRecordDao) { + this.aggregateRecordDao = aggregateRecordDao; + } + } diff --git a/edexOsgi/com.raytheon.uf.edex.stats/src/com/raytheon/uf/edex/stats/handler/StatsHandler.java b/edexOsgi/com.raytheon.uf.edex.stats/src/com/raytheon/uf/edex/stats/handler/StatsHandler.java index 1b3b552f6e..40114d99bd 100644 --- a/edexOsgi/com.raytheon.uf.edex.stats/src/com/raytheon/uf/edex/stats/handler/StatsHandler.java +++ b/edexOsgi/com.raytheon.uf.edex.stats/src/com/raytheon/uf/edex/stats/handler/StatsHandler.java @@ -24,6 +24,11 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import javax.annotation.PostConstruct; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + import com.google.common.eventbus.AllowConcurrentEvents; import com.google.common.eventbus.Subscribe; import com.raytheon.uf.common.event.Event; @@ -35,8 +40,7 @@ import com.raytheon.uf.common.stats.xml.StatisticsConfig; import com.raytheon.uf.common.stats.xml.StatisticsEvent; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.edex.database.dao.CoreDao; -import com.raytheon.uf.edex.database.dao.DaoConfig; +import com.raytheon.uf.edex.stats.dao.StatsDao; import com.raytheon.uf.edex.stats.util.ConfigLoader; /** @@ -51,18 +55,20 @@ import com.raytheon.uf.edex.stats.util.ConfigLoader; * Aug 21, 2012 jsanchez Removed instance variable of event bus. * Nov 07, 2012 1317 mpduff Updated config files. * Feb 05, 2013 1580 mpduff EventBus refactor. + * 3/18/2013 1082 bphillip Modified to make transactional and use spring injection * * * * @author jsanchez * */ +@Service +@Transactional public class StatsHandler { private static final IUFStatusHandler statusHandler = UFStatus .getHandler(StatsHandler.class); - private final CoreDao dao = new CoreDao(DaoConfig.forClass("metadata", - StatsRecord.class)); + private StatsDao statsDao; private static Set validEventTypes = new HashSet(); @@ -86,6 +92,10 @@ public class StatsHandler { */ public StatsHandler() throws Exception { loadEventValidTypes(); + } + + @PostConstruct + public void registerWithEventBus() { EventBus.register(this); } @@ -124,11 +134,16 @@ public class StatsHandler { record.setDate(event.getDate()); record.setEventType(clazz); record.setEvent(bytes); - dao.persist(record); + statsDao.createOrUpdate(record); } catch (SerializationException e) { statusHandler.error("Error transforming to Thrift.", e); } } } + + public void setStatsDao(StatsDao statsDao) { + this.statsDao = statsDao; + } + }