From 3cc07c90f703ef24ff04c112172ecf69d5b644f9 Mon Sep 17 00:00:00 2001 From: jhh Date: Tue, 1 Mar 2022 14:49:08 -0600 Subject: Remove features-session-persistence and eelf These are unused. Issue-ID: POLICY-3922 Signed-off-by: jhh Change-Id: I9ef6af27d4d5ed5667a60db841a82b4d492f79f4 --- feature-eelf/pom.xml | 120 -- feature-eelf/src/assembly/assemble_zip.xml | 76 -- .../src/main/feature/config/logback-eelf.xml | 184 --- feature-eelf/src/main/feature/install/disable | 33 - feature-eelf/src/main/feature/install/enable | 35 - .../org/onap/policy/drools/eelf/EelfFeature.java | 73 - ...p.policy.drools.features.PolicyEngineFeatureApi | 1 - .../org/onap/policy/drools/eelf/test/EElfTest.java | 146 -- feature-session-persistence/.gitignore | 1 - feature-session-persistence/pom.xml | 172 --- .../src/assembly/assemble_zip.xml | 76 -- .../config/feature-session-persistence.properties | 30 - .../sql/18020-sessionpersistence.upgrade.sql | 54 - .../persistence/DroolsPersistenceProperties.java | 38 - .../policy/drools/persistence/DroolsSession.java | 42 - .../drools/persistence/DroolsSessionConnector.java | 37 - .../drools/persistence/DroolsSessionEntity.java | 82 -- .../policy/drools/persistence/EntityMgrTrans.java | 143 -- .../persistence/JpaDroolsSessionConnector.java | 108 -- .../drools/persistence/PersistenceFeature.java | 942 ------------- .../src/main/resources/META-INF/persistence.xml | 73 - ...onap.policy.drools.core.PolicySessionFeatureApi | 1 - ...p.policy.drools.features.PolicyEngineFeatureApi | 1 - .../persistence/DroolsSessionEntityTest.java | 179 --- .../drools/persistence/EntityMgrTransTest.java | 562 -------- .../onap/policy/drools/persistence/GenSchema.java | 59 - .../persistence/JpaDroolsSessionConnectorTest.java | 197 --- .../drools/persistence/PersistenceFeatureTest.java | 1392 -------------------- .../src/test/resources/META-INF/persistence.xml | 38 - .../feature-session-persistence.properties | 28 - .../src/test/resources/logback-test.xml | 49 - packages/install/pom.xml | 12 - pom.xml | 2 - 33 files changed, 4986 deletions(-) delete mode 100644 feature-eelf/pom.xml delete mode 100644 feature-eelf/src/assembly/assemble_zip.xml delete mode 100644 feature-eelf/src/main/feature/config/logback-eelf.xml delete mode 100644 feature-eelf/src/main/feature/install/disable delete mode 100644 feature-eelf/src/main/feature/install/enable delete mode 100644 feature-eelf/src/main/java/org/onap/policy/drools/eelf/EelfFeature.java delete mode 100644 feature-eelf/src/main/resources/META-INF/services/org.onap.policy.drools.features.PolicyEngineFeatureApi delete mode 100644 feature-eelf/src/test/java/org/onap/policy/drools/eelf/test/EElfTest.java delete mode 100644 feature-session-persistence/.gitignore delete mode 100644 feature-session-persistence/pom.xml delete mode 100644 feature-session-persistence/src/assembly/assemble_zip.xml delete mode 100644 feature-session-persistence/src/main/feature/config/feature-session-persistence.properties delete mode 100644 feature-session-persistence/src/main/feature/db/sessionpersistence/sql/18020-sessionpersistence.upgrade.sql delete mode 100644 feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/DroolsPersistenceProperties.java delete mode 100644 feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/DroolsSession.java delete mode 100644 feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/DroolsSessionConnector.java delete mode 100644 feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/DroolsSessionEntity.java delete mode 100644 feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/EntityMgrTrans.java delete mode 100644 feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/JpaDroolsSessionConnector.java delete mode 100644 feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/PersistenceFeature.java delete mode 100644 feature-session-persistence/src/main/resources/META-INF/persistence.xml delete mode 100644 feature-session-persistence/src/main/resources/META-INF/services/org.onap.policy.drools.core.PolicySessionFeatureApi delete mode 100644 feature-session-persistence/src/main/resources/META-INF/services/org.onap.policy.drools.features.PolicyEngineFeatureApi delete mode 100644 feature-session-persistence/src/test/java/org/onap/policy/drools/persistence/DroolsSessionEntityTest.java delete mode 100644 feature-session-persistence/src/test/java/org/onap/policy/drools/persistence/EntityMgrTransTest.java delete mode 100644 feature-session-persistence/src/test/java/org/onap/policy/drools/persistence/GenSchema.java delete mode 100644 feature-session-persistence/src/test/java/org/onap/policy/drools/persistence/JpaDroolsSessionConnectorTest.java delete mode 100644 feature-session-persistence/src/test/java/org/onap/policy/drools/persistence/PersistenceFeatureTest.java delete mode 100644 feature-session-persistence/src/test/resources/META-INF/persistence.xml delete mode 100644 feature-session-persistence/src/test/resources/feature-session-persistence.properties delete mode 100644 feature-session-persistence/src/test/resources/logback-test.xml diff --git a/feature-eelf/pom.xml b/feature-eelf/pom.xml deleted file mode 100644 index 2cd33abc..00000000 --- a/feature-eelf/pom.xml +++ /dev/null @@ -1,120 +0,0 @@ - - - - - 4.0.0 - - - org.onap.policy.drools-pdp - drools-pdp - 1.10.1-SNAPSHOT - - - feature-eelf - - feature-eelf - Loadable module that uses EELF and common module logging infrastructure - - - 1.8 - 1.8 - - - - - - maven-assembly-plugin - - - zipfile - - single - - package - - true - ${project.artifactId}-${project.version} - - src/assembly/assemble_zip.xml - - false - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - - copy-dependencies - - prepare-package - - false - ${project.build.directory}/assembly/lib - false - true - true - false - false - false - runtime - true - - - - - - - - - - ch.qos.logback - logback-classic - test - - - com.att.eelf - eelf-core - 2.0.0-oss - - - org.onap.policy.common - ONAP-Logging - ${policy.common.version} - - - org.onap.policy.drools-pdp - policy-management - ${project.version} - provided - - - junit - junit - test - - - - diff --git a/feature-eelf/src/assembly/assemble_zip.xml b/feature-eelf/src/assembly/assemble_zip.xml deleted file mode 100644 index 005d0389..00000000 --- a/feature-eelf/src/assembly/assemble_zip.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - feature-eelf-package - - zip - - - false - - - - target - lib/feature - - feature-eelf-${project.version}.jar - - - - target/assembly/lib - lib/dependencies - - *.jar - - - - src/main/feature/config - config - 0644 - - - - src/main/feature/bin - bin - 0744 - - - - src/main/feature/db - db - 0744 - - - - src/main/feature/install - install - 0744 - - - - - diff --git a/feature-eelf/src/main/feature/config/logback-eelf.xml b/feature-eelf/src/main/feature/config/logback-eelf.xml deleted file mode 100644 index 7acd33fa..00000000 --- a/feature-eelf/src/main/feature/config/logback-eelf.xml +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - ${defaultPattern} - - - - - ${logDirectory}/${auditLogName}.log - - ${logDirectory}/${auditLogName}.%i.log.zip - - 1 - 5 - - - 10MB - - - ${defaultAuditPattern} - - - - - - - - - ${logDirectory}/${metricsLogName}.log - - ${logDirectory}/${metricsLogName}.%i.log.zip - - 1 - 5 - - - 15MB - - - ${defaultMetricPattern} - - - - - - - - - - ${logDirectory}/${errorLogName}.log - - ${logDirectory}/${errorLogName}.%i.log.zip - - 1 - 5 - - - ERROR - - - 20MB - - - ${defaultErrorPattern} - - - - - - - - - ${debugLogDirectory}/${debugLogName}.log - - ${debugLogDirectory}/${debugLogName}.%i.log.zip - - 1 - 5 - - - 20MB - - - ${debugPattern} - - - - - - - - - ${logDirectory}/${networkLogName}.log - - ${logDirectory}/${networkLogName}.%i.log.zip - - 1 - 5 - - - 15MB - - - ${networkPattern} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/feature-eelf/src/main/feature/install/disable b/feature-eelf/src/main/feature/install/disable deleted file mode 100644 index eb4e0fac..00000000 --- a/feature-eelf/src/main/feature/install/disable +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env sh - -### -# ============LICENSE_START======================================================= -# ONAP POLICY -# ================================================================================ -# Copyright (C) 2017-2021 AT&T Intellectual Property. All rights reserved. -# ================================================================================ -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============LICENSE_END========================================================= -## - -if [ "${DEBUG}" = "y" ]; then - set -x -fi - -SYSTEM_PROPS="${POLICY_HOME}"/config/system.properties - -if [ -f "${SYSTEM_PROPS}" ] && [ -r "${SYSTEM_PROPS}" ]; then - if grep -q "^logback.configurationFile=.*$" "${SYSTEM_PROPS}"; then - sed -i -e "s|^logback.configurationFile=.*$|logback.configurationFile=config/logback.xml|" "${SYSTEM_PROPS}" - fi -fi diff --git a/feature-eelf/src/main/feature/install/enable b/feature-eelf/src/main/feature/install/enable deleted file mode 100644 index 50cd9c1e..00000000 --- a/feature-eelf/src/main/feature/install/enable +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env sh - -### -# ============LICENSE_START======================================================= -# ONAP POLICY -# ================================================================================ -# Copyright (C) 2017-2021 AT&T Intellectual Property. All rights reserved. -# ================================================================================ -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============LICENSE_END========================================================= -## - -if [ "${DEBUG}" = "y" ]; then - set -x -fi - -SYSTEM_PROPS="${POLICY_HOME}"/config/system.properties - -if [ -f "${SYSTEM_PROPS}" ] && [ -r "${SYSTEM_PROPS}" ]; then - if grep -q "^logback.configurationFile=.*$" "${SYSTEM_PROPS}"; then - sed -i -e "s|^logback.configurationFile=.*$|logback.configurationFile=config/logback-eelf.xml|" "${SYSTEM_PROPS}" - else - echo "logback.configurationFile=config/logback-eelf.xml" >> "${SYSTEM_PROPS}" - fi -fi diff --git a/feature-eelf/src/main/java/org/onap/policy/drools/eelf/EelfFeature.java b/feature-eelf/src/main/java/org/onap/policy/drools/eelf/EelfFeature.java deleted file mode 100644 index 58679d48..00000000 --- a/feature-eelf/src/main/java/org/onap/policy/drools/eelf/EelfFeature.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * feature-eelf - * ================================================================================ - * Copyright (C) 2017-2019, 2021 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.drools.eelf; - -import com.att.eelf.configuration.Configuration; -import java.nio.file.Paths; -import org.onap.policy.common.logging.flexlogger.FlexLogger; -import org.onap.policy.common.logging.flexlogger.Logger; -import org.onap.policy.drools.features.PolicyEngineFeatureApi; -import org.onap.policy.drools.system.PolicyEngine; -import org.onap.policy.drools.utils.logging.LoggerUtil; - -/** - * Feature EELF : Enables EELF Logging Libraries . - */ -public class EelfFeature implements PolicyEngineFeatureApi { - - @Override - public final boolean beforeBoot(PolicyEngine engine, String[] cliArgs) { - - String logback = System.getProperty(LoggerUtil.LOGBACK_CONFIGURATION_FILE_SYSTEM_PROPERTY, - LoggerUtil.LOGBACK_CONFIGURATION_FILE_DEFAULT); - var logbackPath = Paths.get(logback); - - if (System.getProperty(Configuration.PROPERTY_LOGGING_FILE_PATH) == null) { - System.setProperty(Configuration.PROPERTY_LOGGING_FILE_PATH, - logbackPath.toAbsolutePath().getParent().toString()); - } - - if (System.getProperty(Configuration.PROPERTY_LOGGING_FILE_NAME) == null) { - System.setProperty(Configuration.PROPERTY_LOGGING_FILE_NAME, - logbackPath.getFileName().toString()); - } - - var logger = FlexLogger.getLogger(this.getClass(), true); - - if (logger.isInfoEnabled()) { - logProperty(logger, LoggerUtil.LOGBACK_CONFIGURATION_FILE_SYSTEM_PROPERTY); - logProperty(logger, Configuration.PROPERTY_LOGGING_FILE_PATH); - logProperty(logger, Configuration.PROPERTY_LOGGING_FILE_NAME); - } - - return false; - } - - private void logProperty(Logger logger, String propnm) { - logger.info("eelf-feature: Property " + propnm + "=" + System.getProperty(propnm)); - } - - @Override - public int getSequenceNumber() { - return 0; - } - -} diff --git a/feature-eelf/src/main/resources/META-INF/services/org.onap.policy.drools.features.PolicyEngineFeatureApi b/feature-eelf/src/main/resources/META-INF/services/org.onap.policy.drools.features.PolicyEngineFeatureApi deleted file mode 100644 index f2bcc4cb..00000000 --- a/feature-eelf/src/main/resources/META-INF/services/org.onap.policy.drools.features.PolicyEngineFeatureApi +++ /dev/null @@ -1 +0,0 @@ -org.onap.policy.drools.eelf.EelfFeature diff --git a/feature-eelf/src/test/java/org/onap/policy/drools/eelf/test/EElfTest.java b/feature-eelf/src/test/java/org/onap/policy/drools/eelf/test/EElfTest.java deleted file mode 100644 index 10e2632a..00000000 --- a/feature-eelf/src/test/java/org/onap/policy/drools/eelf/test/EElfTest.java +++ /dev/null @@ -1,146 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * feature-eelf - * ================================================================================ - * Copyright (C) 2017-2020 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.drools.eelf.test; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import ch.qos.logback.classic.LoggerContext; -import com.att.eelf.configuration.Configuration; -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFLogger.Level; -import com.att.eelf.configuration.EELFManager; -import java.util.ArrayList; -import java.util.List; -import org.junit.Test; -import org.onap.policy.common.logging.flexlogger.FlexLogger; -import org.onap.policy.drools.eelf.EelfFeature; -import org.onap.policy.drools.system.PolicyEngineConstants; -import org.onap.policy.drools.utils.logging.LoggerUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Logger Tests. - */ -public class EElfTest { - - /** - * logback configuration location. - */ - public static final String LOGBACK_CONFIGURATION_FILE_DEFAULT = "src/main/feature/config/logback-eelf.xml"; - - /** - * SLF4J Logger. - */ - private final Logger slf4jLogger = LoggerFactory.getLogger(EElfTest.class); - - /** - * Get all loggers. - * - * @return list of all loggers - */ - protected List loggers() { - List loggers = new ArrayList(); - LoggerContext context = - (LoggerContext) org.slf4j.LoggerFactory.getILoggerFactory(); - for (org.slf4j.Logger logger: context.getLoggerList()) { - loggers.add(logger.getName()); - } - slf4jLogger.info(loggers.toString()); - return loggers; - } - - /** - * Assert Log Levels are the same between an EELF Logger and an SLF4J Logger. - * - * @param eelfLogger EELF Logger - * @param slf4jLogger SLF4J Logger - */ - protected void assertLogLevels(EELFLogger eelfLogger, Logger slf4jLogger) { - assertEquals(slf4jLogger.isDebugEnabled(), eelfLogger.isDebugEnabled()); - assertEquals(slf4jLogger.isInfoEnabled(), eelfLogger.isInfoEnabled()); - assertEquals(slf4jLogger.isErrorEnabled(), eelfLogger.isErrorEnabled()); - assertEquals(slf4jLogger.isWarnEnabled(), eelfLogger.isWarnEnabled()); - assertEquals(slf4jLogger.isTraceEnabled(), eelfLogger.isTraceEnabled()); - } - - @Test - public void testSlf4jLog() { - - /* standard slf4j using defaults */ - - slf4jLogger.info("slf4j info"); - - List loggers = loggers(); - - assertFalse(loggers.contains(Configuration.DEBUG_LOGGER_NAME)); - assertFalse(loggers.contains(Configuration.AUDIT_LOGGER_NAME)); - assertFalse(loggers.contains(Configuration.ERROR_LOGGER_NAME)); - assertFalse(loggers.contains(Configuration.METRICS_LOGGER_NAME)); - - /* set logback configuration */ - - System.setProperty(LoggerUtil.LOGBACK_CONFIGURATION_FILE_SYSTEM_PROPERTY, - LOGBACK_CONFIGURATION_FILE_DEFAULT); - - /* set up eelf throuth common loggings library */ - - EelfFeature feature = new EelfFeature(); - feature.beforeBoot(PolicyEngineConstants.getManager(), null); - - loggers = loggers(); - assertTrue(loggers.contains(Configuration.DEBUG_LOGGER_NAME)); - assertTrue(loggers.contains(Configuration.AUDIT_LOGGER_NAME)); - assertTrue(loggers.contains(Configuration.ERROR_LOGGER_NAME)); - assertTrue(loggers.contains(Configuration.METRICS_LOGGER_NAME)); - - final EELFLogger eelfAuditLogger = EELFManager.getAuditLogger(); - final Logger slf4jAuditLogger = org.slf4j.LoggerFactory.getLogger(Configuration.AUDIT_LOGGER_NAME); - org.onap.policy.common.logging.flexlogger.Logger flexLogger = - FlexLogger.getLogger(EElfTest.class, true); - - /* generate an error entry */ - - Exception testException = new IllegalStateException("exception test"); - flexLogger.error("flex-logger exception", testException); - EELFManager.getErrorLogger().error("eelf-logger exception", testException); - org.slf4j.LoggerFactory.getLogger(Configuration.ERROR_LOGGER_NAME).error("slf4j-logger", testException); - - - /* generate an audit entry through all logs */ - - flexLogger.audit("flexlogger audit"); - eelfAuditLogger.info("eelf audit"); - slf4jAuditLogger.info("slf4j audit"); - - /* check log levels in eelf and standard slf4j change in both directions */ - - /* eelf initiated */ - eelfAuditLogger.setLevel(Level.ERROR); - assertLogLevels(eelfAuditLogger, slf4jAuditLogger); - - /* slf4j initiated */ - ((ch.qos.logback.classic.Logger) slf4jLogger).setLevel((ch.qos.logback.classic.Level.INFO)); - assertLogLevels(eelfAuditLogger, slf4jAuditLogger); - } -} diff --git a/feature-session-persistence/.gitignore b/feature-session-persistence/.gitignore deleted file mode 100644 index b83d2226..00000000 --- a/feature-session-persistence/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target/ diff --git a/feature-session-persistence/pom.xml b/feature-session-persistence/pom.xml deleted file mode 100644 index b3662a77..00000000 --- a/feature-session-persistence/pom.xml +++ /dev/null @@ -1,172 +0,0 @@ - - - - - 4.0.0 - - - org.onap.policy.drools-pdp - drools-pdp - 1.10.1-SNAPSHOT - - - feature-session-persistence - - feature-session-persistence - Separately loadable feature module with session persistence code - - - - - - - - maven-assembly-plugin - - - zipfile - - single - - package - - true - ${project.artifactId}-${project.version} - - src/assembly/assemble_zip.xml - - false - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - - copy-dependencies - - prepare-package - - false - ${project.build.directory}/assembly/lib - false - true - true - false - false - false - runtime - provided - true - - - - - - - - - - org.onap.policy.drools-pdp - policy-core - ${project.version} - provided - - - org.onap.policy.drools-pdp - policy-management - ${project.version} - provided - - - org.onap.policy.common - utils - ${policy.common.version} - - - org.powermock - powermock-api-mockito2 - test - - - org.jboss.jbossts - jbossjta - 4.16.6.Final - - - jboss-servlet-api_3.0_spec - org.jboss.spec.javax.servlet - - - - - com.h2database - h2 - test - - - org.hibernate - hibernate-core - provided - - - - javax.persistence - javax.persistence-api - - - - - org.hibernate.common - hibernate-commons-annotations - provided - - - org.apache.commons - commons-dbcp2 - 2.8.0 - - - org.apache.commons - commons-pool2 - 2.8.0 - - - - junit - junit - test - - - org.assertj - assertj-core - test - - - diff --git a/feature-session-persistence/src/assembly/assemble_zip.xml b/feature-session-persistence/src/assembly/assemble_zip.xml deleted file mode 100644 index 8a315960..00000000 --- a/feature-session-persistence/src/assembly/assemble_zip.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - feature-session-persistence - - zip - - - - false - - - - target - lib/feature - - feature-session-persistence-${project.version}.jar - - - - target/assembly/lib - lib/dependencies - - *.jar - - - - src/main/feature/config - config - 0644 - - - - src/main/feature/bin - bin - 0744 - - - - src/main/feature/db - db - 0744 - - - - src/main/feature/install - install - 0744 - - - - diff --git a/feature-session-persistence/src/main/feature/config/feature-session-persistence.properties b/feature-session-persistence/src/main/feature/config/feature-session-persistence.properties deleted file mode 100644 index 50e0618b..00000000 --- a/feature-session-persistence/src/main/feature/config/feature-session-persistence.properties +++ /dev/null @@ -1,30 +0,0 @@ -### -# ============LICENSE_START======================================================= -# feature-session-persistence -# ================================================================================ -# Copyright (C) 2017, 2019, 2021 AT&T Intellectual Property. All rights reserved. -# ================================================================================ -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============LICENSE_END========================================================= -### - -eclipselink.target-database=MySQL -javax.persistence.jdbc.driver= org.mariadb.jdbc.Driver -javax.persistence.jdbc.url=jdbc:mariadb://${envd:SQL_HOST}:${envd:SQL_PORT:3306}/sessionpersistence -javax.persistence.jdbc.user=${envd:SQL_USER} -javax.persistence.jdbc.password=${envd:SQL_PASSWORD} - -#Seconds timeout - 15 minutes -persistence.sessioninfo.timeout=900 - -persistence.objectstore.dir=features/session-persistence/jta diff --git a/feature-session-persistence/src/main/feature/db/sessionpersistence/sql/18020-sessionpersistence.upgrade.sql b/feature-session-persistence/src/main/feature/db/sessionpersistence/sql/18020-sessionpersistence.upgrade.sql deleted file mode 100644 index 6cb0299f..00000000 --- a/feature-session-persistence/src/main/feature/db/sessionpersistence/sql/18020-sessionpersistence.upgrade.sql +++ /dev/null @@ -1,54 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * feature-session-persistence - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -set foreign_key_checks=0; - -CREATE TABLE if not exists sessionpersistence.DROOLSSESSIONENTITY -( -sessionName VARCHAR(255) NOT NULL, -sessionId BIGINT NOT NULL, -createdDate TIMESTAMP NOT NULL, -updatedDate TIMESTAMP NOT NULL, -PRIMARY KEY (sessionName) -); - -CREATE TABLE if not exists sessionpersistence.SESSIONINFO -( -ID BIGINT NOT NULL AUTO_INCREMENT, -LASTMODIFICATIONDATE TIMESTAMP, -RULESBYTEARRAY MEDIUMBLOB, -STARTDATE TIMESTAMP default current_timestamp, -OPTLOCK INTEGER, -PRIMARY KEY (ID) -); - -CREATE TABLE if not exists sessionpersistence.WORKITEMINFO -( -WORKITEMID BIGINT NOT NULL AUTO_INCREMENT, -CREATIONDATE TIMESTAMP default current_timestamp, -`NAME` VARCHAR(500), -PROCESSINSTANCEID BIGINT, -STATE BIGINT, -OPTLOCK INTEGER, -WORKITEMBYTEARRAY BLOB, -PRIMARY KEY (WORKITEMID) -); - -set foreign_key_checks=1; \ No newline at end of file diff --git a/feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/DroolsPersistenceProperties.java b/feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/DroolsPersistenceProperties.java deleted file mode 100644 index ab85864f..00000000 --- a/feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/DroolsPersistenceProperties.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * feature-session-persistence - * ================================================================================ - * Copyright (C) 2017-2018, 2021 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.drools.persistence; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.eclipse.persistence.config.PersistenceUnitProperties; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public final class DroolsPersistenceProperties { - /* - * feature-session-persistence.properties parameter key values - */ - public static final String DB_DRIVER = PersistenceUnitProperties.JDBC_DRIVER; - public static final String DB_URL = PersistenceUnitProperties.JDBC_URL; - public static final String DB_USER = PersistenceUnitProperties.JDBC_USER; - public static final String DB_PWD = PersistenceUnitProperties.JDBC_PASSWORD; - public static final String DB_SESSIONINFO_TIMEOUT = "persistence.sessioninfo.timeout"; - public static final String JTA_OBJECTSTORE_DIR = "persistence.objectstore.dir"; -} diff --git a/feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/DroolsSession.java b/feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/DroolsSession.java deleted file mode 100644 index 3b3c942d..00000000 --- a/feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/DroolsSession.java +++ /dev/null @@ -1,42 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * feature-session-persistence - * ================================================================================ - * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.drools.persistence; - -import java.util.Date; - -public interface DroolsSession { - - String getSessionName(); - - void setSessionName(String sessionName); - - long getSessionId(); - - void setSessionId(long sessionId); - - Date getCreatedDate(); - - void setCreatedDate(Date createdDate); - - Date getUpdatedDate(); - - void setUpdatedDate(Date updatedDate); -} diff --git a/feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/DroolsSessionConnector.java b/feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/DroolsSessionConnector.java deleted file mode 100644 index 4656f9fd..00000000 --- a/feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/DroolsSessionConnector.java +++ /dev/null @@ -1,37 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * feature-session-persistence - * ================================================================================ - * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.drools.persistence; - -public interface DroolsSessionConnector { - /** - * Gets a session by PDP id and name. - * @param sessName session name - * @return a session, or {@code null} if it is not found - */ - DroolsSession get(String sessName); - - /** - * Replaces a session, adding it if it does not exist. - * @param sess session to be replaced - */ - void replace(DroolsSession sess); - -} diff --git a/feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/DroolsSessionEntity.java b/feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/DroolsSessionEntity.java deleted file mode 100644 index 9ac68567..00000000 --- a/feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/DroolsSessionEntity.java +++ /dev/null @@ -1,82 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * feature-session-persistence - * ================================================================================ - * Copyright (C) 2017-2018, 2020-2021 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.drools.persistence; - -import java.io.Serializable; -import java.util.Date; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.PrePersist; -import javax.persistence.PreUpdate; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Entity -@Getter -@Setter -@EqualsAndHashCode(onlyExplicitlyIncluded = true) -@NoArgsConstructor -public class DroolsSessionEntity implements Serializable, DroolsSession { - - private static final long serialVersionUID = -5495057038819948709L; - - @Id - @Column(name = "sessionName", nullable = false) - @EqualsAndHashCode.Include - private String sessionName = "-1"; - - @Column(name = "sessionId", nullable = false) - private long sessionId = -1L; - - @Temporal(TemporalType.TIMESTAMP) - @Column(name = "createdDate", nullable = false) - private Date createdDate; - - @Temporal(TemporalType.TIMESTAMP) - @Column(name = "updatedDate", nullable = false) - private Date updatedDate; - - public DroolsSessionEntity(String sessionName, long sessionId) { - this.sessionName = sessionName; - this.sessionId = sessionId; - } - - @PrePersist - public void prePersist() { - this.createdDate = new Date(); - this.updatedDate = new Date(); - } - - @PreUpdate - public void preUpdate() { - this.updatedDate = new Date(); - } - - @Override - public String toString() { - return "{name=" + getSessionName() + ", id=" + getSessionId() + "}"; - } -} diff --git a/feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/EntityMgrTrans.java b/feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/EntityMgrTrans.java deleted file mode 100644 index 7103c47c..00000000 --- a/feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/EntityMgrTrans.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * feature-session-persistence - * ================================================================================ - * Copyright (C) 2017-2018, 2021 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.drools.persistence; - -import javax.persistence.EntityManager; -import javax.transaction.HeuristicMixedException; -import javax.transaction.HeuristicRollbackException; -import javax.transaction.NotSupportedException; -import javax.transaction.RollbackException; -import javax.transaction.Status; -import javax.transaction.SystemException; -import javax.transaction.UserTransaction; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.Setter; -import org.onap.policy.common.utils.jpa.EntityMgrCloser; - -/** - * Wrapper for an EntityManager that creates a JTA transaction that is auto-rolled - * back when closed. Note: commit() and rollback() actions do nothing if a transaction was - * already in progress when this object was constructed. - */ -public class EntityMgrTrans extends EntityMgrCloser { - - /** - * Transaction to be rolled back. - */ - @Getter(AccessLevel.PROTECTED) - @Setter(AccessLevel.PROTECTED) - private static UserTransaction userTrans = com.arjuna.ats.jta.UserTransaction.userTransaction(); - - /** - * {@code True} if a transaction had already been started before this object was - * constructed, {@code false} otherwise. - */ - private boolean transInProgress; - - /** - * Constructor. - * - * @param em entity for which a transaction is to be begun - */ - public EntityMgrTrans(EntityManager em) { - super(em); - - try { - transInProgress = (userTrans.getStatus() == Status.STATUS_ACTIVE); - if (!transInProgress) { - userTrans.begin(); - } - - em.joinTransaction(); - - } catch (RuntimeException | NotSupportedException | SystemException e) { - em.close(); - throw new EntityMgrException(e); - } - } - - /** - * Commits the transaction. - */ - public void commit() { - if (transInProgress) { - return; - } - - try { - userTrans.commit(); - - } catch (SecurityException | IllegalStateException | RollbackException | HeuristicMixedException - | HeuristicRollbackException | SystemException e) { - - throw new EntityMgrException(e); - } - } - - /** - * Rolls back the transaction. - */ - public void rollback() { - if (transInProgress) { - return; - } - - try { - userTrans.rollback(); - - } catch (IllegalStateException | SecurityException | SystemException e) { - throw new EntityMgrException(e); - } - } - - @Override - public void close() { - try { - if (!transInProgress && userTrans.getStatus() == Status.STATUS_ACTIVE) { - userTrans.rollback(); - } - - } catch (IllegalStateException | SecurityException | SystemException e) { - throw new EntityMgrException(e); - - } finally { - super.close(); - } - } - - /** - * Runtime exceptions generated by this class. Wraps exceptions generated by delegated - * operations, particularly when they are not, themselves, Runtime exceptions. - */ - public static class EntityMgrException extends RuntimeException { - private static final long serialVersionUID = 1L; - - /** - * Constructor. - * - * @param ex exception to be wrapped - */ - public EntityMgrException(Exception ex) { - super(ex); - } - } -} diff --git a/feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/JpaDroolsSessionConnector.java b/feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/JpaDroolsSessionConnector.java deleted file mode 100644 index 14c72708..00000000 --- a/feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/JpaDroolsSessionConnector.java +++ /dev/null @@ -1,108 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * feature-session-persistence - * ================================================================================ - * Copyright (C) 2017-2018, 2021 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.drools.persistence; - -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; -import lombok.AllArgsConstructor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -@AllArgsConstructor -public class JpaDroolsSessionConnector implements DroolsSessionConnector { - - private static Logger logger = LoggerFactory.getLogger(JpaDroolsSessionConnector.class); - - private final EntityManagerFactory emf; - - @Override - public DroolsSession get(String sessName) { - - var em = emf.createEntityManager(); - DroolsSessionEntity entity = null; - - try (var trans = new EntityMgrTrans(em)) { - - entity = em.find(DroolsSessionEntity.class, sessName); - if (entity != null) { - em.refresh(entity); - } - - trans.commit(); - } - - return entity; - } - - @Override - public void replace(DroolsSession sess) { - String sessName = sess.getSessionName(); - - logger.info("replace: Entering and manually updating session name= {}", sessName); - - var em = emf.createEntityManager(); - - try (var trans = new EntityMgrTrans(em)) { - - if (!update(em, sess)) { - add(em, sess); - } - - trans.commit(); - } - - logger.info("replace: Exiting"); - } - - /** - * Adds a session to the persistent store. - * - * @param em entity manager - * @param sess session to be added - */ - private void add(EntityManager em, DroolsSession sess) { - logger.info("add: Inserting session id={}", sess.getSessionId()); - - var ent = new DroolsSessionEntity(sess.getSessionName(), sess.getSessionId()); - - em.persist(ent); - } - - /** - * Updates a session, if it exists within the persistent store. - * - * @param em entity manager - * @param sess session data to be persisted - * @return {@code true} if a record was updated, {@code false} if it was not found - */ - private boolean update(EntityManager em, DroolsSession sess) { - - DroolsSessionEntity session = em.find(DroolsSessionEntity.class, sess.getSessionName()); - if (session == null) { - return false; - } - - logger.info("update: Updating session id to {}", sess.getSessionId()); - session.setSessionId(sess.getSessionId()); - - return true; - } -} diff --git a/feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/PersistenceFeature.java b/feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/PersistenceFeature.java deleted file mode 100644 index a929c712..00000000 --- a/feature-session-persistence/src/main/java/org/onap/policy/drools/persistence/PersistenceFeature.java +++ /dev/null @@ -1,942 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * feature-session-persistence - * ================================================================================ - * Copyright (C) 2017-2021 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.drools.persistence; - -import java.io.IOException; -import java.sql.PreparedStatement; -import java.sql.SQLException; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import javax.persistence.EntityManagerFactory; -import javax.persistence.Persistence; -import javax.transaction.TransactionManager; -import javax.transaction.TransactionSynchronizationRegistry; -import javax.transaction.UserTransaction; -import org.apache.commons.dbcp2.BasicDataSource; -import org.apache.commons.dbcp2.BasicDataSourceFactory; -import org.hibernate.cfg.AvailableSettings; -import org.kie.api.KieServices; -import org.kie.api.runtime.Environment; -import org.kie.api.runtime.EnvironmentName; -import org.kie.api.runtime.KieSession; -import org.kie.api.runtime.KieSessionConfiguration; -import org.onap.policy.drools.core.PolicyContainer; -import org.onap.policy.drools.core.PolicySession; -import org.onap.policy.drools.core.PolicySessionFeatureApi; -import org.onap.policy.drools.features.PolicyEngineFeatureApi; -import org.onap.policy.drools.system.PolicyController; -import org.onap.policy.drools.system.PolicyControllerConstants; -import org.onap.policy.drools.system.PolicyEngine; -import org.onap.policy.drools.utils.PropertyUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * If this feature is supported, there is a single instance of it. It adds persistence to Drools - * sessions. In addition, if an active-standby feature exists, then that is used to determine the - * active and last-active PDP. If it does not exist, then the current host name is used as the PDP - * id. - * - *

The bulk of the code here was once in other classes, such as 'PolicyContainer' and 'Main'. It - * was moved here as part of making this a separate optional feature. - */ -public class PersistenceFeature implements PolicySessionFeatureApi, PolicyEngineFeatureApi { - - private static final Logger logger = LoggerFactory.getLogger(PersistenceFeature.class); - - /** KieService factory. */ - private KieServices kieSvcFact; - - /** Persistence properties. */ - private Properties persistProps; - - /** Whether or not the SessionInfo records should be cleaned out. */ - private boolean sessInfoCleaned; - - /** SessionInfo timeout, in milli-seconds, as read from - * {@link #persistProps}. */ - private long sessionInfoTimeoutMs; - - /** Object used to serialize cleanup of sessioninfo table. */ - private Object cleanupLock = new Object(); - - /** - * Lookup the adjunct for this feature that is associated with the specified PolicyContainer. If - * not found, create one. - * - * @param policyContainer the container whose adjunct we are looking up, and possibly creating - * @return the associated 'ContainerAdjunct' instance, which may be new - */ - private ContainerAdjunct getContainerAdjunct(PolicyContainer policyContainer) { - - Object rval = policyContainer.getAdjunct(this); - - if (!(rval instanceof ContainerAdjunct)) { - // adjunct does not exist, or has the wrong type (should never - // happen) - rval = new ContainerAdjunct(policyContainer); - policyContainer.setAdjunct(this, rval); - } - - return (ContainerAdjunct) rval; - } - - /** - * {@inheritDoc}. - **/ - @Override - public int getSequenceNumber() { - return 1; - } - - /** - * {@inheritDoc}. - **/ - @Override - public void globalInit(String[] args, String configDir) { - - kieSvcFact = getKieServices(); - - try { - persistProps = loadProperties(configDir + "/feature-session-persistence.properties"); - - } catch (IOException e1) { - logger.error("initializePersistence: ", e1); - } - - sessionInfoTimeoutMs = getPersistenceTimeout(); - } - - /** - * Creates a persistent KieSession, loading it from the persistent store, or creating one, if it - * does not exist yet. - */ - @Override - public KieSession activatePolicySession( - PolicyContainer policyContainer, String name, String kieBaseName) { - - if (isPersistenceEnabled(policyContainer, name)) { - cleanUpSessionInfo(); - - return getContainerAdjunct(policyContainer).newPersistentKieSession(name, kieBaseName); - } - - return null; - } - - /** - * {@inheritDoc}. - **/ - @Override - public PolicySession.ThreadModel selectThreadModel(PolicySession session) { - - var policyContainer = session.getContainer(); - if (isPersistenceEnabled(policyContainer, session.getName())) { - return new PersistentThreadModel(session, getProperties(policyContainer)); - } - return null; - } - - /** - * {@inheritDoc}. - **/ - @Override - public void disposeKieSession(PolicySession policySession) { - - ContainerAdjunct contAdj = - (ContainerAdjunct) policySession.getContainer().getAdjunct(this); - if (contAdj != null) { - contAdj.disposeKieSession(policySession.getName()); - } - } - - /** - * {@inheritDoc}. - **/ - @Override - public void destroyKieSession(PolicySession policySession) { - - ContainerAdjunct contAdj = - (ContainerAdjunct) policySession.getContainer().getAdjunct(this); - if (contAdj != null) { - contAdj.destroyKieSession(policySession.getName()); - } - } - - /** - * {@inheritDoc}. - **/ - @Override - public boolean afterStart(PolicyEngine engine) { - return false; - } - - /** - * {@inheritDoc}. - **/ - @Override - public boolean beforeStart(PolicyEngine engine) { - return cleanup(); - } - - /** - * {@inheritDoc}. - **/ - @Override - public boolean beforeActivate(PolicyEngine engine) { - return cleanup(); - } - - private boolean cleanup() { - synchronized (cleanupLock) { - sessInfoCleaned = false; - } - - return false; - } - - /** - * {@inheritDoc}. - **/ - @Override - public boolean afterActivate(PolicyEngine engine) { - return false; - } - - /* ============================================================ */ - - /** - * Gets the persistence timeout value for sessioninfo records. - * - * @return the timeout value, in milli-seconds, or {@code -1} if it is unspecified or invalid - */ - private long getPersistenceTimeout() { - String timeoutString = null; - - try { - timeoutString = persistProps.getProperty(DroolsPersistenceProperties.DB_SESSIONINFO_TIMEOUT); - - if (timeoutString != null) { - // timeout parameter is specified - return Long.valueOf(timeoutString) * 1000; - } - - } catch (NumberFormatException e) { - logger.error( - "Invalid value for Drools persistence property persistence.sessioninfo.timeout: {}", - timeoutString, - e); - } - - return -1; - } - - /* ============================================================ */ - - /** - * Each instance of this class is a logical extension of a 'PolicyContainer' instance. Its - * reference is stored in the 'adjuncts' table within the 'PolicyContainer', and will be - * garbage-collected with the container. - */ - protected class ContainerAdjunct { - /** 'PolicyContainer' instance that this adjunct is extending. */ - private PolicyContainer policyContainer; - - /** Maps a KIE session name to its data source. */ - private Map name2ds = new HashMap<>(); - - /** - * Constructor - initialize a new 'ContainerAdjunct'. - * - * @param policyContainer the 'PolicyContainer' instance this adjunct is extending - */ - private ContainerAdjunct(PolicyContainer policyContainer) { - this.policyContainer = policyContainer; - } - - /** - * Create a new persistent KieSession. If there is already a corresponding entry in the - * database, it is used to initialize the KieSession. If not, a completely new session is - * created. - * - * @param name the name of the KieSession (which is also the name of the associated - * PolicySession) - * @param kieBaseName the name of the 'KieBase' instance containing this session - * @return a new KieSession with persistence enabled - */ - private KieSession newPersistentKieSession(String name, String kieBaseName) { - - configureSysProps(); - - BasicDataSource ds = makeDataSource(getDataSourceProperties()); - var dsemf = new DsEmf(ds); - - try { - EntityManagerFactory emf = dsemf.emf; - DroolsSessionConnector conn = makeJpaConnector(emf); - - long desiredSessionId = getSessionId(conn, name); - - logger.info( - "\n\nThis controller is primary... coming up with session {} \n\n", desiredSessionId); - - // session does not exist -- attempt to create one - logger.info( - "getPolicySession:session does not exist -- attempt to create one with name {}", name); - - var env = kieSvcFact.newEnvironment(); - - configureKieEnv(env, emf); - - var kieConf = kieSvcFact.newKieSessionConfiguration(); - - KieSession kieSession = - (desiredSessionId >= 0 - ? loadKieSession(kieBaseName, desiredSessionId, env, kieConf) - : null); - - if (kieSession == null) { - // loadKieSession() returned null or desiredSessionId < 0 - logger.info( - "LOADING We cannot load session {}. Going to create a new one", desiredSessionId); - - kieSession = newKieSession(kieBaseName, env); - } - - replaceSession(conn, name, kieSession); - - name2ds.put(name, dsemf); - - return kieSession; - - } catch (RuntimeException e) { - dsemf.close(); - throw e; - } - } - - /** - * Loads an existing KieSession from the persistent store. - * - * @param kieBaseName the name of the 'KieBase' instance containing this session - * @param desiredSessionId id of the desired KieSession - * @param env Kie Environment for the session - * @param kieConf Kie Configuration for the session - * @return the persistent session, or {@code null} if it could not be loaded - */ - private KieSession loadKieSession( - String kieBaseName, long desiredSessionId, Environment env, KieSessionConfiguration kieConf) { - try { - var kieSession = - kieSvcFact - .getStoreServices() - .loadKieSession( - desiredSessionId, - policyContainer.getKieContainer().getKieBase(kieBaseName), - kieConf, - env); - - logger.info("LOADING Loaded session {}", desiredSessionId); - - return kieSession; - - } catch (Exception e) { - logger.error("loadKieSession error: ", e); - return null; - } - } - - /** - * Creates a new, persistent KieSession. - * - * @param kieBaseName the name of the 'KieBase' instance containing this session - * @param env Kie Environment for the session - * @return a new, persistent session - */ - private KieSession newKieSession(String kieBaseName, Environment env) { - var kieSession = - kieSvcFact - .getStoreServices() - .newKieSession(policyContainer.getKieContainer().getKieBase(kieBaseName), null, env); - - logger.info("LOADING CREATED {}", kieSession.getIdentifier()); - - return kieSession; - } - - /** - * Closes the data source associated with a session. - * - * @param name name of the session being destroyed - */ - private void destroyKieSession(String name) { - closeDataSource(name); - } - - /** - * Closes the data source associated with a session. - * - * @param name name of the session being disposed of - */ - private void disposeKieSession(String name) { - closeDataSource(name); - } - - /** - * Closes the data source associated with a session. - * - * @param name name of the session whose data source is to be closed - */ - private void closeDataSource(String name) { - DsEmf ds = name2ds.remove(name); - if (ds != null) { - ds.close(); - } - } - - /** Configures java system properties for JPA/JTA. */ - private void configureSysProps() { - System.setProperty("com.arjuna.ats.arjuna.coordinator.defaultTimeout", "60"); - System.setProperty( - "com.arjuna.ats.arjuna.objectstore.objectStoreDir", - persistProps.getProperty(DroolsPersistenceProperties.JTA_OBJECTSTORE_DIR)); - System.setProperty( - "ObjectStoreEnvironmentBean.objectStoreDir", - persistProps.getProperty(DroolsPersistenceProperties.JTA_OBJECTSTORE_DIR)); - } - - /** - * Configures a Kie Environment. - * - * @param env environment to be configured - * @param emf entity manager factory - */ - private void configureKieEnv(Environment env, EntityManagerFactory emf) { - env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf); - env.set(EnvironmentName.TRANSACTION, getUserTrans()); - env.set(EnvironmentName.TRANSACTION_SYNCHRONIZATION_REGISTRY, getTransSyncReg()); - env.set(EnvironmentName.TRANSACTION_MANAGER, getTransMgr()); - } - - /** - * Gets a session's ID from the persistent store. - * - * @param conn persistence connector - * @param sessnm name of the session - * @return the session's id, or {@code -1} if the session is not found - */ - private long getSessionId(DroolsSessionConnector conn, String sessnm) { - DroolsSession sess = conn.get(sessnm); - return sess != null ? sess.getSessionId() : -1; - } - - /** - * Replaces a session within the persistent store, if it exists. Adds it otherwise. - * - * @param conn persistence connector - * @param sessnm name of session to be updated - * @param kieSession new session information - */ - private void replaceSession(DroolsSessionConnector conn, String sessnm, KieSession kieSession) { - - var sess = new DroolsSessionEntity(); - - sess.setSessionName(sessnm); - sess.setSessionId(kieSession.getIdentifier()); - - conn.replace(sess); - } - } - - /* ============================================================ */ - - /** - * Gets the data source properties. - * - * @return the data source properties - */ - private Properties getDataSourceProperties() { - var props = new Properties(); - props.put("driverClassName", persistProps.getProperty(DroolsPersistenceProperties.DB_DRIVER)); - props.put("url", persistProps.getProperty(DroolsPersistenceProperties.DB_URL)); - props.put("username", persistProps.getProperty(DroolsPersistenceProperties.DB_USER)); - props.put("password", persistProps.getProperty(DroolsPersistenceProperties.DB_PWD)); - props.put("maxActive", "3"); - props.put("maxIdle", "1"); - props.put("maxWait", "120000"); - props.put("whenExhaustedAction", "2"); - props.put("testOnBorrow", "false"); - props.put("poolPreparedStatements", "true"); - - return props; - } - - /** - * Removes "old" Drools 'sessioninfo' records, so they aren't used to restore data to Drools - * sessions. This also has the useful side-effect of removing abandoned records as well. - */ - private void cleanUpSessionInfo() { - - synchronized (cleanupLock) { - if (sessInfoCleaned) { - logger.info("Clean up of sessioninfo table: already done"); - return; - } - - if (sessionInfoTimeoutMs < 0) { - logger.info("Clean up of sessioninfo table: no timeout specified"); - return; - } - - // now do the record deletion - try (BasicDataSource ds = makeDataSource(getDataSourceProperties()); - var connection = ds.getConnection(); - PreparedStatement statement = - connection.prepareStatement( - "DELETE FROM sessioninfo WHERE timestampdiff(second,lastmodificationdate,now()) > ?")) { - - connection.setAutoCommit(true); - - statement.setLong(1, sessionInfoTimeoutMs / 1000); - - int count = statement.executeUpdate(); - logger.info("Cleaning up sessioninfo table -- {} records removed", count); - - } catch (SQLException e) { - logger.error("Clean up of sessioninfo table failed", e); - } - - // delete DroolsSessionEntity where sessionId not in (sessinfo.xxx)? - - sessInfoCleaned = true; - } - } - - /** - * Determine whether persistence is enabled for a specific container. - * - * @param container container to be checked - * @param sessionName name of the session to be checked - * @return {@code true} if persistence is enabled for this container, and {@code false} if not - */ - private boolean isPersistenceEnabled(PolicyContainer container, String sessionName) { - var properties = getProperties(container); - var rval = false; - - if (properties != null) { - // fetch the 'type' property - String type = getProperty(properties, sessionName, "type"); - rval = "auto".equals(type) || "native".equals(type); - } - - return rval; - } - - /** - * Determine the controller properties associated with the policy container. - * - * @param container container whose properties are to be retrieved - * @return the container's properties, or {@code null} if not found - */ - private Properties getProperties(PolicyContainer container) { - try { - return getPolicyController(container).getProperties(); - } catch (IllegalArgumentException e) { - logger.error("getProperties exception: ", e); - return null; - } - } - - /** - * Fetch the persistence property associated with a session. The name may have the form: - * - *

    - *
  • persistence.SESSION-NAME.PROPERTY - *
  • persistence.PROPERTY - *
- * - * @param properties properties from which the value is to be retrieved - * @param sessionName session name of interest - * @param property property name of interest - * @return the property value, or {@code null} if not found - */ - private String getProperty(Properties properties, String sessionName, String property) { - String value = properties.getProperty("persistence." + sessionName + "." + property); - if (value == null) { - value = properties.getProperty("persistence." + property); - } - - return value; - } - - /* ============================================================ */ - - /** - * This 'ThreadModel' variant periodically calls 'KieSession.fireAllRules()', because the - * 'fireUntilHalt' method isn't compatible with persistence. - */ - public class PersistentThreadModel implements Runnable, PolicySession.ThreadModel { - - /** Session associated with this persistent thread. */ - private final PolicySession session; - - /** The session thread. */ - private final Thread thread; - - /** Used to indicate that processing should stop. */ - private final CountDownLatch stopped = new CountDownLatch(1); - - /** Minimum time, in milli-seconds, that the thread should sleep before firing rules again. */ - long minSleepTime = 100; - - /** - * Maximum time, in milli-seconds, that the thread should sleep before firing rules again. This - * is a "half" time, so that we can multiply it by two without overflowing the word size. - */ - long halfMaxSleepTime = 5000L / 2L; - - /** - * Constructor - initialize variables and create thread. - * - * @param session the 'PolicySession' instance - * @param properties may contain additional session properties - */ - public PersistentThreadModel(PolicySession session, Properties properties) { - this.session = session; - this.thread = new Thread(this, getThreadName()); - - if (properties == null) { - return; - } - - // extract 'minSleepTime' and/or 'maxSleepTime' - String name = session.getName(); - - // fetch 'minSleepTime' value, and update if defined - var sleepTimeString = getProperty(properties, name, "minSleepTime"); - if (sleepTimeString != null) { - try { - minSleepTime = Math.max(1, Integer.valueOf(sleepTimeString)); - } catch (Exception e) { - logger.error("{}: Illegal value for 'minSleepTime'", sleepTimeString, e); - } - } - - // fetch 'maxSleepTime' value, and update if defined - long maxSleepTime = 2 * halfMaxSleepTime; - sleepTimeString = getProperty(properties, name, "maxSleepTime"); - if (sleepTimeString != null) { - try { - maxSleepTime = Math.max(1, Integer.valueOf(sleepTimeString)); - } catch (Exception e) { - logger.error("{}: Illegal value for 'maxSleepTime'", sleepTimeString, e); - } - } - - // swap values if needed - if (minSleepTime > maxSleepTime) { - logger.error("minSleepTime({}) is greater than maxSleepTime({}) -- swapping", minSleepTime, - maxSleepTime); - long tmp = minSleepTime; - minSleepTime = maxSleepTime; - maxSleepTime = tmp; - } - - halfMaxSleepTime = Math.max(1, maxSleepTime / 2); - } - - /** - * Get thread name. - * - * @return the String to use as the thread name */ - private String getThreadName() { - return "Session " + session.getFullName() + " (persistent)"; - } - - /*=========================*/ - /* 'ThreadModel' interface */ - /*=========================*/ - - /** - * {@inheritDoc}. - **/ - @Override - public void start() { - thread.start(); - } - - /** - * {@inheritDoc}. - **/ - @Override - public void stop() { - // tell the thread to stop - stopped.countDown(); - - // wait up to 10 seconds for the thread to stop - try { - thread.join(10000); - - } catch (InterruptedException e) { - logger.error("stopThread exception: ", e); - Thread.currentThread().interrupt(); - } - - // verify that it's done - if (thread.isAlive()) { - logger.error("stopThread: still running"); - } - } - - /** - * {@inheritDoc}. - **/ - @Override - public void updated() { - // the container artifact has been updated -- adjust the thread name - thread.setName(getThreadName()); - } - - /*======================*/ - /* 'Runnable' interface */ - /*======================*/ - - /** - * {@inheritDoc}. - **/ - @Override - public void run() { - logger.info("PersistentThreadModel running"); - - // set thread local variable - session.setPolicySession(); - - var kieSession = session.getKieSession(); - long sleepTime = 2 * halfMaxSleepTime; - - // We want to continue, despite any exceptions that occur - // while rules are fired. - - var cont = true; - while (cont) { - - try { - if (kieSession.fireAllRules() > 0) { - // some rules fired -- reduce poll delay - sleepTime = Math.max(minSleepTime, sleepTime / 2); - } else { - // no rules fired -- increase poll delay - sleepTime = 2 * Math.min(halfMaxSleepTime, sleepTime); - } - - } catch (Exception | LinkageError e) { - logger.error("Exception during kieSession.fireAllRules", e); - } - - try { - if (stopped.await(sleepTime, TimeUnit.MILLISECONDS)) { - cont = false; - } - - } catch (InterruptedException e) { - logger.error("startThread exception: ", e); - Thread.currentThread().interrupt(); - cont = false; - } - } - - session.removePolicySession(); - logger.info("PersistentThreadModel completed"); - } - } - - /* ============================================================ */ - - /** DataSource-EntityManagerFactory pair. */ - private class DsEmf { - private BasicDataSource bds; - private EntityManagerFactory emf; - - /** - * Makes an entity manager factory for the given data source. - * - * @param bds pooled data source - */ - public DsEmf(BasicDataSource bds) { - try { - Map props = new HashMap<>(); - props.put(AvailableSettings.JPA_JTA_DATASOURCE, bds); - - this.bds = bds; - this.emf = makeEntMgrFact(props); - - } catch (RuntimeException e) { - closeDataSource(); - throw e; - } - } - - /** Closes the entity manager factory and the data source. */ - public void close() { - try { - emf.close(); - - } catch (RuntimeException e) { - closeDataSource(); - throw e; - } - - closeDataSource(); - } - - /** Closes the data source only. */ - private void closeDataSource() { - try { - bds.close(); - - } catch (SQLException e) { - throw new PersistenceFeatureException(e); - } - } - } - - private static class SingletonRegistry { - private static final TransactionSynchronizationRegistry transreg = - new com.arjuna.ats.internal.jta.transaction.arjunacore - .TransactionSynchronizationRegistryImple(); - - private SingletonRegistry() { - super(); - } - } - - /* Factory for various items. Methods can be overridden for junit testing. */ - - /** - * Gets the transaction manager. - * - * @return the transaction manager - */ - protected TransactionManager getTransMgr() { - return com.arjuna.ats.jta.TransactionManager.transactionManager(); - } - - /** - * Gets the user transaction. - * - * @return the user transaction - */ - protected UserTransaction getUserTrans() { - return com.arjuna.ats.jta.UserTransaction.userTransaction(); - } - - /** - * Gets the transaction synchronization registry. - * - * @return the transaction synchronization registry - */ - protected TransactionSynchronizationRegistry getTransSyncReg() { - return SingletonRegistry.transreg; - } - - /** - * Gets the KIE services. - * - * @return the KIE services - */ - protected KieServices getKieServices() { - return KieServices.Factory.get(); - } - - /** - * Loads properties from a file. - * - * @param filenm name of the file to load - * @return properties, as loaded from the file - * @throws IOException if an error occurs reading from the file - */ - protected Properties loadProperties(String filenm) throws IOException { - return PropertyUtil.getProperties(filenm); - } - - /** - * Makes a Data Source. - * - * @param dsProps data source properties - * @return a new data source - */ - protected BasicDataSource makeDataSource(Properties dsProps) { - try { - return BasicDataSourceFactory.createDataSource(dsProps); - - } catch (Exception e) { - throw new PersistenceFeatureException(e); - } - } - - /** - * Makes a new JPA connector for drools sessions. - * - * @param emf entity manager factory - * @return a new JPA connector for drools sessions - */ - protected DroolsSessionConnector makeJpaConnector(EntityManagerFactory emf) { - return new JpaDroolsSessionConnector(emf); - } - - /** - * Makes a new entity manager factory. - * - * @param props properties with which the factory should be configured - * @return a new entity manager factory - */ - protected EntityManagerFactory makeEntMgrFact(Map props) { - return Persistence.createEntityManagerFactory("onapsessionsPU", props); - } - - /** - * Gets the policy controller associated with a given policy container. - * - * @param container container whose controller is to be retrieved - * @return the container's controller - */ - protected PolicyController getPolicyController(PolicyContainer container) { - return PolicyControllerConstants.getFactory().get(container.getGroupId(), container.getArtifactId()); - } - - /** - * Runtime exceptions generated by this class. Wraps exceptions generated by delegated operations, - * particularly when they are not, themselves, Runtime exceptions. - */ - public static class PersistenceFeatureException extends RuntimeException { - private static final long serialVersionUID = 1L; - - /** - * Constructor. - * */ - public PersistenceFeatureException(Exception ex) { - super(ex); - } - } -} diff --git a/feature-session-persistence/src/main/resources/META-INF/persistence.xml b/feature-session-persistence/src/main/resources/META-INF/persistence.xml deleted file mode 100644 index 661803a5..00000000 --- a/feature-session-persistence/src/main/resources/META-INF/persistence.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - org.hibernate.jpa.HibernatePersistenceProvider - org.onap.policy.drools.persistence.DroolsSessionEntity - org.drools.persistence.info.SessionInfo - org.drools.persistence.info.WorkItemInfo - - - - - - - - - - - - - org.hibernate.jpa.HibernatePersistenceProvider - org.onap.policy.drools.persistence.DroolsSessionEntity - org.drools.persistence.info.SessionInfo - org.drools.persistence.info.WorkItemInfo - - - - - - - - - diff --git a/feature-session-persistence/src/main/resources/META-INF/services/org.onap.policy.drools.core.PolicySessionFeatureApi b/feature-session-persistence/src/main/resources/META-INF/services/org.onap.policy.drools.core.PolicySessionFeatureApi deleted file mode 100644 index 26366fd3..00000000 --- a/feature-session-persistence/src/main/resources/META-INF/services/org.onap.policy.drools.core.PolicySessionFeatureApi +++ /dev/null @@ -1 +0,0 @@ -org.onap.policy.drools.persistence.PersistenceFeature diff --git a/feature-session-persistence/src/main/resources/META-INF/services/org.onap.policy.drools.features.PolicyEngineFeatureApi b/feature-session-persistence/src/main/resources/META-INF/services/org.onap.policy.drools.features.PolicyEngineFeatureApi deleted file mode 100644 index 26366fd3..00000000 --- a/feature-session-persistence/src/main/resources/META-INF/services/org.onap.policy.drools.features.PolicyEngineFeatureApi +++ /dev/null @@ -1 +0,0 @@ -org.onap.policy.drools.persistence.PersistenceFeature diff --git a/feature-session-persistence/src/test/java/org/onap/policy/drools/persistence/DroolsSessionEntityTest.java b/feature-session-persistence/src/test/java/org/onap/policy/drools/persistence/DroolsSessionEntityTest.java deleted file mode 100644 index bd979162..00000000 --- a/feature-session-persistence/src/test/java/org/onap/policy/drools/persistence/DroolsSessionEntityTest.java +++ /dev/null @@ -1,179 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * feature-session-persistence - * ================================================================================ - * Copyright (C) 2017-2018, 2020-2021 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.drools.persistence; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; - -import java.util.Date; -import org.junit.Test; - -public class DroolsSessionEntityTest { - - @Test - public void testHashCode() { - DroolsSessionEntity entity = makeEnt("mynameA", 1); - - DroolsSessionEntity e2 = makeEnt("mynameA", 2); - - // session id is not part of hash code - assertEquals(entity.hashCode(), e2.hashCode()); - - // diff sess name - e2 = makeEnt("mynameB", 1); - assertNotEquals(entity.hashCode(), e2.hashCode()); - } - - /** Ensures that hashCode() functions as expected when the getXxx methods are overridden. */ - @Test - public void testHashCode_Subclass() { - DroolsSessionEntity entity = makeEnt2("mynameA", 1); - - DroolsSessionEntity e2 = makeEnt("mynameA", 2); - - // session id is not part of hash code - assertEquals(entity.hashCode(), e2.hashCode()); - - // diff sess name - e2 = makeEnt("mynameB", 1); - assertNotEquals(entity.hashCode(), e2.hashCode()); - } - - @Test - public void testGetSessionName_testSetSessionName() { - DroolsSessionEntity entity = makeEnt("mynameZ", 1); - - assertEquals("mynameZ", entity.getSessionName()); - - entity.setSessionName("another"); - assertEquals("another", entity.getSessionName()); - - // others unchanged - assertEquals(1, entity.getSessionId()); - } - - @Test - public void testGetSessionId_testSetSessionId() { - DroolsSessionEntity entity = makeEnt("mynameA", 1); - - assertEquals(1, entity.getSessionId()); - - entity.setSessionId(20); - assertEquals(20, entity.getSessionId()); - - // others unchanged - assertEquals("mynameA", entity.getSessionName()); - } - - @Test - public void testGetCreatedDate_testSetCreatedDate_testGetUpdatedDate_testSetUpdatedDate() { - DroolsSessionEntity entity = new DroolsSessionEntity(); - - Date crtdt = new Date(System.currentTimeMillis() - 100); - entity.setCreatedDate(crtdt); - - Date updt = new Date(System.currentTimeMillis() - 200); - entity.setUpdatedDate(updt); - - assertEquals(crtdt, entity.getCreatedDate()); - assertEquals(updt, entity.getUpdatedDate()); - } - - @Test - public void testEqualsObject() { - DroolsSessionEntity entity = makeEnt("mynameA", 1); - - // diff object type - assertNotEquals(entity, "hello"); - - // reflexive - assertEquals(entity, entity); - - DroolsSessionEntity e2 = makeEnt("mynameA", 2); - - // session id is not part of hash code - assertEquals(entity, e2); - assertEquals(entity, e2); - - // diff sess name - e2 = makeEnt("mynameB", 1); - assertNotEquals(entity, e2); - assertNotEquals(entity, e2); - } - - /** Ensures that equals() functions as expected when the getXxx methods are overridden. */ - @Test - public void testEqualsObject_Subclass() { - DroolsSessionEntity entity = makeEnt2("mynameA", 1); - - // reflexive - assertEquals(entity, entity); - - DroolsSessionEntity e2 = makeEnt("mynameA", 2); - - // session id is not part of hash code - assertEquals(entity, e2); - assertEquals(entity, e2); - - // diff sess name - e2 = makeEnt("mynameB", 1); - assertNotEquals(entity, e2); - assertNotEquals(entity, e2); - } - - @Test - public void testToString() { - DroolsSessionEntity entity = makeEnt("mynameA", 23); - - assertEquals("{name=mynameA, id=23}", entity.toString()); - } - - /** - * Makes a session Entity. The parameters are stored into the Entity object via the setXxx - * methods. - * - * @param sessnm session name - * @param sessid session id - * @return a new session Entity - */ - private DroolsSessionEntity makeEnt(String sessnm, long sessid) { - - DroolsSessionEntity entity = new DroolsSessionEntity(); - - entity.setSessionName(sessnm); - entity.setSessionId(sessid); - - return entity; - } - - /** - * Makes a session Entity that overrides the getXxx methods. The parameters that are provided are - * returned by the overridden methods, but they are not stored into the Entity object via - * the setXxx methods. - * - * @param sessnm session name - * @param sessid session id - * @return a new session Entity - */ - private DroolsSessionEntity makeEnt2(String sessnm, long sessid) { - return new DroolsSessionEntity(sessnm, sessid); - } -} diff --git a/feature-session-persistence/src/test/java/org/onap/policy/drools/persistence/EntityMgrTransTest.java b/feature-session-persistence/src/test/java/org/onap/policy/drools/persistence/EntityMgrTransTest.java deleted file mode 100644 index fb0d1102..00000000 --- a/feature-session-persistence/src/test/java/org/onap/policy/drools/persistence/EntityMgrTransTest.java +++ /dev/null @@ -1,562 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * feature-session-persistence - * ================================================================================ - * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.drools.persistence; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import java.util.HashMap; -import java.util.Map; -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; -import javax.persistence.Persistence; -import javax.transaction.HeuristicMixedException; -import javax.transaction.HeuristicRollbackException; -import javax.transaction.NotSupportedException; -import javax.transaction.RollbackException; -import javax.transaction.Status; -import javax.transaction.SystemException; -import javax.transaction.UserTransaction; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.onap.policy.drools.persistence.EntityMgrTrans.EntityMgrException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class EntityMgrTransTest { - - private static final Logger logger = LoggerFactory.getLogger(PersistenceFeatureTest.class); - - private static UserTransaction savetrans; - - private UserTransaction trans; - private EntityManager mgr; - - /** - * Configure properties for JTA. - */ - @BeforeClass - public static void setUpBeforeClass() { - System.setProperty("com.arjuna.ats.arjuna.objectstore.objectStoreDir", "target/tm"); - System.setProperty("ObjectStoreEnvironmentBean.objectStoreDir", "target/tm"); - - savetrans = EntityMgrTrans.getUserTrans(); - } - - @AfterClass - public static void tearDownAfterClass() { - EntityMgrTrans.setUserTrans(savetrans); - } - - /** - * Creates a mock transaction and entity manager. Resets the "userTrans" field of the - * class under test. - * - * @throws Exception if an error occurs - */ - @Before - public void setUp() throws Exception { - trans = mock(UserTransaction.class); - mgr = mock(EntityManager.class); - - when(trans.getStatus()).thenReturn(Status.STATUS_NO_TRANSACTION, Status.STATUS_ACTIVE); - - EntityMgrTrans.setUserTrans(trans); - } - - /** - * Verifies that the constructor starts a transaction, but does not do anything extra - * before being closed. - * - * @throws Exception if an error occurs - */ - @Test - public void testEntityMgrTrans_Inactive() throws Exception { - final EntityMgrTrans emt = new EntityMgrTrans(mgr); - - // verify that transaction was started - verify(trans).begin(); - verify(mgr).joinTransaction(); - - // verify not closed, committed, or rolled back yet - verify(trans, never()).commit(); - verify(trans, never()).rollback(); - verify(mgr, never()).close(); - - emt.close(); - } - - /** - * Verifies that the constructor does not start a transaction, because one is already - * active. - * - * @throws Exception if an error occurs - */ - @Test - public void testEntityMgrTrans_Active() throws Exception { - - when(trans.getStatus()).thenReturn(Status.STATUS_ACTIVE); - - final EntityMgrTrans emt = new EntityMgrTrans(mgr); - - // verify that transaction was not re-started started - verify(trans, never()).begin(); - - // verify that transaction was joined - verify(mgr).joinTransaction(); - - // verify not closed, committed, or rolled back yet - verify(trans, never()).commit(); - verify(trans, never()).rollback(); - verify(mgr, never()).close(); - - emt.close(); - } - - @Test(expected = EntityMgrException.class) - public void testEntityMgrTrans_RtEx() throws Exception { - - doThrow(new IllegalArgumentException("expected exception")).when(trans).begin(); - - try (EntityMgrTrans emt = new EntityMgrTrans(mgr)) { - // Empty - } - } - - @Test(expected = EntityMgrException.class) - public void testEntityMgrTrans_NotSuppEx() throws Exception { - - doThrow(new NotSupportedException("expected exception")).when(trans).begin(); - - try (EntityMgrTrans emt = new EntityMgrTrans(mgr)) { - // Empty - } - } - - @Test(expected = EntityMgrException.class) - public void testEntityMgrTrans_SysEx() throws Exception { - - doThrow(new SystemException("expected exception")).when(trans).begin(); - - try (EntityMgrTrans emt = new EntityMgrTrans(mgr)) { - // Empty - } - } - - /** - * Verifies that the transaction is not rolled back, but the manager is closed when a - * transaction is already active. - */ - @Test - public void testClose_Active() throws Exception { - when(trans.getStatus()).thenReturn(Status.STATUS_ACTIVE); - - EntityMgrTrans emt = new EntityMgrTrans(mgr); - emt.close(); - - // closed and rolled back, but not committed - verify(trans, never()).commit(); - verify(trans, never()).rollback(); - verify(mgr).close(); - } - - /** - * Verifies that the transaction is rolled back and the manager is closed when a - * transaction is begun by the constructor. - */ - @Test - public void testClose_Begun() throws Exception { - EntityMgrTrans emt = new EntityMgrTrans(mgr); - - emt.close(); - - // closed and rolled back, but not committed - verify(trans, never()).commit(); - verify(trans).rollback(); - verify(mgr).close(); - } - - /** - * Verifies that the manager is closed, but that the transaction is not rolled - * back when no transaction is active. - */ - @Test - public void testClose_Inactive() throws Exception { - when(trans.getStatus()).thenReturn(Status.STATUS_NO_TRANSACTION); - - EntityMgrTrans emt = new EntityMgrTrans(mgr); - - emt.close(); - - // closed, but not committed or rolled back - verify(mgr).close(); - verify(trans, never()).commit(); - verify(trans, never()).rollback(); - } - - @Test(expected = EntityMgrException.class) - public void testClose_IllStateEx() throws Exception { - - doThrow(new IllegalStateException("expected exception")).when(trans).rollback(); - - try (EntityMgrTrans emt = new EntityMgrTrans(mgr)) { - // Empty - } - } - - @Test(expected = EntityMgrException.class) - public void testClose_SecEx() throws Exception { - - doThrow(new SecurityException("expected exception")).when(trans).rollback(); - - try (EntityMgrTrans emt = new EntityMgrTrans(mgr)) { - // Empty - } - } - - @Test(expected = EntityMgrException.class) - public void testClose_SysEx() throws Exception { - - doThrow(new SystemException("expected exception")).when(trans).rollback(); - - try (EntityMgrTrans emt = new EntityMgrTrans(mgr)) { - // Empty - } - } - - /** - * Verifies that the manager is closed and the transaction rolled back when "try" - * block exits normally and a transaction is active. - */ - @Test - public void testClose_TryWithoutExcept_Active() throws Exception { - try (EntityMgrTrans emt = new EntityMgrTrans(mgr)) { - // Empty - } - - // closed and rolled back, but not committed - verify(trans, never()).commit(); - verify(trans).rollback(); - verify(mgr).close(); - } - - /** - * Verifies that the manager is closed, but that the transaction is not rolled - * back when "try" block exits normally and no transaction is active. - */ - @Test - public void testClose_TryWithoutExcept_Inactive() throws Exception { - - when(trans.getStatus()).thenReturn(Status.STATUS_NO_TRANSACTION); - - try (EntityMgrTrans emt = new EntityMgrTrans(mgr)) { - // Empty - } - - // closed, but not rolled back or committed - verify(trans, never()).commit(); - verify(trans, never()).rollback(); - verify(mgr).close(); - } - - /** - * Verifies that the manager is closed and the transaction rolled back when "try" - * block throws an exception and a transaction is active. - */ - @Test - public void testClose_TryWithExcept_Active() throws Exception { - try { - try (EntityMgrTrans emt = new EntityMgrTrans(mgr)) { - throw new SystemException("expected exception"); - } - - } catch (Exception e) { - logger.trace("expected exception", e); - } - - // closed and rolled back, but not committed - verify(trans, never()).commit(); - verify(trans).rollback(); - verify(mgr).close(); - } - - /** - * Verifies that the manager is closed, but that the transaction is not rolled - * back when "try" block throws an exception and no transaction is active. - */ - @Test - public void testClose_TryWithExcept_Inactive() throws Exception { - - when(trans.getStatus()).thenReturn(Status.STATUS_NO_TRANSACTION); - - try { - try (EntityMgrTrans emt = new EntityMgrTrans(mgr)) { - throw new SystemException("expected exception"); - } - - } catch (Exception e) { - logger.trace("expected exception", e); - } - - // closed, but not rolled back or committed - verify(trans, never()).commit(); - verify(trans, never()).rollback(); - verify(mgr).close(); - } - - /** - * Verifies that commit() only commits, and that the subsequent close() does not - * re-commit. - */ - @Test - public void testCommit() throws Exception { - EntityMgrTrans emt = new EntityMgrTrans(mgr); - - emt.commit(); - - when(trans.getStatus()).thenReturn(Status.STATUS_COMMITTED); - - // committed, but not closed or rolled back - verify(trans).commit(); - verify(trans, never()).rollback(); - verify(mgr, never()).close(); - - // closed, but not re-committed - emt.close(); - - verify(trans, times(1)).commit(); - verify(mgr).close(); - } - - /** - * Verifies that commit() does nothing, and that the subsequent close() does not - * re-commit when a transaction is already active. - */ - @Test - public void testCommit_Active() throws Exception { - when(trans.getStatus()).thenReturn(Status.STATUS_ACTIVE); - - EntityMgrTrans emt = new EntityMgrTrans(mgr); - - emt.commit(); - - // nothing happened yet - verify(trans, never()).commit(); - verify(trans, never()).rollback(); - verify(mgr, never()).close(); - - // closed, but not re-committed - emt.close(); - - // still no commit or rollback - verify(trans, never()).commit(); - verify(trans, never()).rollback(); - verify(mgr).close(); - } - - @Test(expected = EntityMgrException.class) - public void testCommit_SecEx() throws Exception { - - doThrow(new SecurityException("expected exception")).when(trans).commit(); - - try (EntityMgrTrans emt = new EntityMgrTrans(mgr)) { - emt.commit(); - } - } - - @Test(expected = EntityMgrException.class) - public void testCommit_IllStateEx() throws Exception { - - doThrow(new IllegalStateException("expected exception")).when(trans).commit(); - - try (EntityMgrTrans emt = new EntityMgrTrans(mgr)) { - emt.commit(); - } - } - - @Test(expected = EntityMgrException.class) - public void testCommit_RbEx() throws Exception { - - doThrow(new RollbackException("expected exception")).when(trans).commit(); - - try (EntityMgrTrans emt = new EntityMgrTrans(mgr)) { - emt.commit(); - } - } - - @Test(expected = EntityMgrException.class) - public void testCommit_HmEx() throws Exception { - - doThrow(new HeuristicMixedException("expected exception")).when(trans).commit(); - - try (EntityMgrTrans emt = new EntityMgrTrans(mgr)) { - emt.commit(); - } - } - - @Test(expected = EntityMgrException.class) - public void testCommit_HrbEx() throws Exception { - - doThrow(new HeuristicRollbackException("expected exception")).when(trans).commit(); - - try (EntityMgrTrans emt = new EntityMgrTrans(mgr)) { - emt.commit(); - } - } - - @Test(expected = EntityMgrException.class) - public void testCommit_SysEx() throws Exception { - - doThrow(new SystemException("expected exception")).when(trans).commit(); - - try (EntityMgrTrans emt = new EntityMgrTrans(mgr)) { - emt.commit(); - } - } - - /** - * Verifies that rollback() only rolls back, and that the subsequent close() does not - * re-roll back. - */ - @Test - public void testRollback() throws Exception { - EntityMgrTrans emt = new EntityMgrTrans(mgr); - - emt.rollback(); - - when(trans.getStatus()).thenReturn(Status.STATUS_ROLLEDBACK); - - // rolled back, but not closed or committed - verify(trans, never()).commit(); - verify(trans).rollback(); - verify(mgr, never()).close(); - - // closed, but not re-rolled back - emt.close(); - - // still no commit or rollback - verify(trans, never()).commit(); - verify(trans).rollback(); - verify(mgr).close(); - } - - /** - * Verifies that rollback() does nothing, and that the subsequent close() does not - * re-roll back when a transaction is already active. - */ - @Test - public void testRollback_Active() throws Exception { - when(trans.getStatus()).thenReturn(Status.STATUS_ACTIVE); - EntityMgrTrans emt = new EntityMgrTrans(mgr); - - emt.rollback(); - - // nothing happens - verify(trans, never()).commit(); - verify(trans, never()).rollback(); - verify(mgr, never()).close(); - - emt.close(); - - // still no commit or rollback - verify(trans, never()).commit(); - verify(trans, never()).rollback(); - verify(mgr).close(); - } - - @Test(expected = EntityMgrException.class) - public void testRollback_IllStateEx() throws Exception { - - doThrow(new IllegalStateException("expected exception")).when(trans).rollback(); - - try (EntityMgrTrans emt = new EntityMgrTrans(mgr)) { - emt.rollback(); - } - } - - @Test(expected = EntityMgrException.class) - public void testRollback_SecEx() throws Exception { - - doThrow(new SecurityException("expected exception")).when(trans).rollback(); - - try (EntityMgrTrans emt = new EntityMgrTrans(mgr)) { - emt.rollback(); - } - } - - @Test(expected = EntityMgrException.class) - public void testRollback_SysEx() throws Exception { - - doThrow(new SystemException("expected exception")).when(trans).rollback(); - - try (EntityMgrTrans emt = new EntityMgrTrans(mgr)) { - emt.rollback(); - } - } - - @Test - public void testEntityMgrException() { - SecurityException secex = new SecurityException("expected exception"); - EntityMgrException ex = new EntityMgrException(secex); - - assertEquals(secex, ex.getCause()); - - } - - /** - * Tests using real (i.e., not mocked) Persistence classes. - */ - @Test - public void testReal() { - EntityMgrTrans.setUserTrans(savetrans); - - Map propMap = new HashMap<>(); - - propMap.put("javax.persistence.jdbc.driver", "org.h2.Driver"); - propMap.put("javax.persistence.jdbc.url", "jdbc:h2:mem:EntityMgrTransTest"); - - EntityManagerFactory emf = Persistence.createEntityManagerFactory("junitDroolsSessionEntityPU", propMap); - - try (EntityMgrTrans trans1 = new EntityMgrTrans(emf.createEntityManager())) { - - // nest a transaction - should still be OK - - try (EntityMgrTrans trans2 = new EntityMgrTrans(emf.createEntityManager())) { - // Empty - } - - } catch (Exception e) { - logger.info("persistence error", e); - emf.close(); - fail("persistence error"); - } - - emf.close(); - } -} diff --git a/feature-session-persistence/src/test/java/org/onap/policy/drools/persistence/GenSchema.java b/feature-session-persistence/src/test/java/org/onap/policy/drools/persistence/GenSchema.java deleted file mode 100644 index 31fcfa84..00000000 --- a/feature-session-persistence/src/test/java/org/onap/policy/drools/persistence/GenSchema.java +++ /dev/null @@ -1,59 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * feature-session-persistence - * ================================================================================ - * Copyright (C) 2017-2020 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.drools.persistence; - -import java.util.HashMap; -import java.util.Map; -import javax.persistence.Persistence; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** Generates the schema DDL files. */ -public class GenSchema { - - private static final Logger logger = LoggerFactory.getLogger(PersistenceFeatureTest.class); - - /** - * Opens the EMF, which generates the schema, as a side-effect. - * - * @throws Exception exception - */ - private GenSchema() throws Exception { - Map propMap = new HashMap<>(); - - propMap.put("javax.persistence.jdbc.driver", "org.h2.Driver"); - propMap.put("javax.persistence.jdbc.url", "jdbc:h2:mem:JpaDroolsSessionConnectorTest"); - - Persistence.createEntityManagerFactory("schemaDroolsPU", propMap).close(); - } - - /** - * This is is provided as a utility for producing a basic ddl schema file in the sql directory. - */ - public static void main(String[] args) { - try { - new GenSchema(); - - } catch (Exception e) { - logger.error("failed to generate schema", e); - } - } -} diff --git a/feature-session-persistence/src/test/java/org/onap/policy/drools/persistence/JpaDroolsSessionConnectorTest.java b/feature-session-persistence/src/test/java/org/onap/policy/drools/persistence/JpaDroolsSessionConnectorTest.java deleted file mode 100644 index c1fe08a1..00000000 --- a/feature-session-persistence/src/test/java/org/onap/policy/drools/persistence/JpaDroolsSessionConnectorTest.java +++ /dev/null @@ -1,197 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * feature-session-persistence - * ================================================================================ - * Copyright (C) 2017-2018, 2020 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.drools.persistence; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import java.util.HashMap; -import java.util.Map; -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; -import javax.persistence.EntityTransaction; -import javax.persistence.Persistence; -import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -public class JpaDroolsSessionConnectorTest { - - private EntityManagerFactory emf; - private JpaDroolsSessionConnector conn; - - @BeforeClass - public static void setUpBeforeClass() { - System.setProperty("com.arjuna.ats.arjuna.objectstore.objectStoreDir", "target/tm"); - System.setProperty("ObjectStoreEnvironmentBean.objectStoreDir", "target/tm"); - } - - /** - * Setup. - * - * @throws Exception exception - */ - @Before - public void setUp() throws Exception { - Map propMap = new HashMap<>(); - - propMap.put("javax.persistence.jdbc.driver", "org.h2.Driver"); - propMap.put("javax.persistence.jdbc.url", "jdbc:h2:mem:JpaDroolsSessionConnectorTest"); - - emf = Persistence.createEntityManagerFactory("junitDroolsSessionEntityPU", propMap); - - conn = new JpaDroolsSessionConnector(emf); - } - - @After - public void tearDown() { - // this will cause the memory db to be dropped - emf.close(); - } - - @Test - public void testGet() { - /* - * Load up the DB with some data. - */ - - addSession("nameA", 10); - addSession("nameY", 20); - - /* - * Now test the functionality. - */ - - // not found - assertNull(conn.get("unknown")); - - assertEquals("{name=nameA, id=10}", conn.get("nameA").toString()); - - assertEquals("{name=nameY, id=20}", conn.get("nameY").toString()); - } - - @Test(expected = IllegalArgumentException.class) - public void testGet_NewEx() { - EntityManagerFactory emf = mock(EntityManagerFactory.class); - EntityManager em = mock(EntityManager.class); - - when(emf.createEntityManager()).thenReturn(em); - when(em.find(any(), any())).thenThrow(new IllegalArgumentException("expected exception")); - - conn = new JpaDroolsSessionConnector(emf); - conn.get("xyz"); - } - - @Test(expected = IllegalArgumentException.class) - public void testGet_FindEx() { - EntityManagerFactory emf = mock(EntityManagerFactory.class); - EntityManager em = mock(EntityManager.class); - EntityTransaction tr = mock(EntityTransaction.class); - - when(emf.createEntityManager()).thenReturn(em); - when(em.getTransaction()).thenReturn(tr); - when(em.find(any(), any())).thenThrow(new IllegalArgumentException("expected exception")); - - new JpaDroolsSessionConnector(emf).get("xyz"); - } - - @Test(expected = IllegalArgumentException.class) - public void testGet_FindEx_CloseEx() { - EntityManagerFactory emf = mock(EntityManagerFactory.class); - EntityManager em = mock(EntityManager.class); - EntityTransaction tr = mock(EntityTransaction.class); - - when(emf.createEntityManager()).thenReturn(em); - when(em.getTransaction()).thenReturn(tr); - when(em.find(any(), any())).thenThrow(new IllegalArgumentException("expected exception")); - doThrow(new IllegalArgumentException("expected exception #2")).when(em).close(); - - new JpaDroolsSessionConnector(emf).get("xyz"); - } - - @Test - public void testReplace_Existing() { - addSession("nameA", 10); - - DroolsSessionEntity sess = new DroolsSessionEntity("nameA", 30); - - conn.replace(sess); - - // id should be changed - assertEquals(sess.toString(), conn.get("nameA").toString()); - } - - @Test - public void testReplace_New() { - DroolsSessionEntity sess = new DroolsSessionEntity("nameA", 30); - - conn.replace(sess); - - assertEquals(sess.toString(), conn.get("nameA").toString()); - } - - @Test - public void testAdd() { - DroolsSessionEntity sess = new DroolsSessionEntity("nameA", 30); - - conn.replace(sess); - - assertEquals(sess.toString(), conn.get("nameA").toString()); - } - - @Test - public void testUpdate() { - addSession("nameA", 10); - - DroolsSessionEntity sess = new DroolsSessionEntity("nameA", 30); - - conn.replace(sess); - - // id should be changed - assertEquals("{name=nameA, id=30}", conn.get("nameA").toString()); - } - - /** - * Adds a session to the DB. - * - * @param sessnm session name - * @param sessid session id - */ - private void addSession(String sessnm, int sessid) { - EntityManager em = emf.createEntityManager(); - - try (EntityMgrTrans trans = new EntityMgrTrans(em)) { - DroolsSessionEntity ent = new DroolsSessionEntity(); - - ent.setSessionName(sessnm); - ent.setSessionId(sessid); - - em.persist(ent); - - trans.commit(); - } - } -} diff --git a/feature-session-persistence/src/test/java/org/onap/policy/drools/persistence/PersistenceFeatureTest.java b/feature-session-persistence/src/test/java/org/onap/policy/drools/persistence/PersistenceFeatureTest.java deleted file mode 100644 index 4450b8c8..00000000 --- a/feature-session-persistence/src/test/java/org/onap/policy/drools/persistence/PersistenceFeatureTest.java +++ /dev/null @@ -1,1392 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * feature-session-persistence - * ================================================================================ - * Copyright (C) 2017-2018, 2020-2021 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.drools.persistence; - -import static org.assertj.core.api.Assertions.assertThatCode; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; -import javax.transaction.TransactionManager; -import javax.transaction.TransactionSynchronizationRegistry; -import javax.transaction.UserTransaction; -import org.apache.commons.dbcp2.BasicDataSource; -import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.kie.api.KieBase; -import org.kie.api.KieServices; -import org.kie.api.persistence.jpa.KieStoreServices; -import org.kie.api.runtime.Environment; -import org.kie.api.runtime.EnvironmentName; -import org.kie.api.runtime.KieContainer; -import org.kie.api.runtime.KieSession; -import org.kie.api.runtime.KieSessionConfiguration; -import org.mockito.ArgumentCaptor; -import org.onap.policy.drools.core.PolicyContainer; -import org.onap.policy.drools.core.PolicySession; -import org.onap.policy.drools.core.PolicySession.ThreadModel; -import org.onap.policy.drools.persistence.PersistenceFeature.PersistenceFeatureException; -import org.onap.policy.drools.persistence.PersistenceFeature.PersistentThreadModel; -import org.onap.policy.drools.system.PolicyController; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class PersistenceFeatureTest { - - private static final String MY_KIE_BASE = "mybase"; - - private static final String MY_SESS_NAME = "myname"; - - private static final String MISSING_EXCEPTION = "missing exception"; - - private static final String EXPECTED = "expected exception"; - - private static final Logger logger = LoggerFactory.getLogger(PersistenceFeatureTest.class); - - private static final String JDBC_DRIVER = "fake.driver"; - private static final String JDBC_URL = "fake.url"; - private static final String JDBC_USER = "fake.user"; - private static final String JDBC_PASSWD = "fake.password"; - private static final String JTA_OSDIR = "target"; - private static final String SRC_TEST_RESOURCES = "src/test/resources"; - - private static Properties stdprops; - - private JpaDroolsSessionConnector jpa; - private DroolsSession sess; - private KieSession kiesess; - private BasicDataSource bds; - private EntityManagerFactory emf; - private Connection conn; - private Properties props; - private KieServices kiesvc; - private Environment kieenv; - private KieSessionConfiguration kiecfg; - private KieBase kiebase; - private KieStoreServices kiestore; - private TransactionManager transmgr; - private UserTransaction usertrans; - private TransactionSynchronizationRegistry transreg; - private PolicyController polctlr; - private PolicyContainer polcont; - private PolicySession polsess; - private int emfCount; - private int jpaCount; - private String propName; - - private PersistenceFeature feat; - - /** - * Setup before class. - * - * @throws Exception exception - */ - @BeforeClass - public static void setUpBeforeClass() throws Exception { - stdprops = new Properties(); - - stdprops.put(DroolsPersistenceProperties.DB_DRIVER, JDBC_DRIVER); - stdprops.put(DroolsPersistenceProperties.DB_URL, JDBC_URL); - stdprops.put(DroolsPersistenceProperties.DB_USER, JDBC_USER); - stdprops.put(DroolsPersistenceProperties.DB_PWD, JDBC_PASSWD); - stdprops.put(DroolsPersistenceProperties.JTA_OBJECTSTORE_DIR, JTA_OSDIR); - stdprops.put(DroolsPersistenceProperties.DB_SESSIONINFO_TIMEOUT, "50"); - - System.setProperty("com.arjuna.ats.arjuna.objectstore.objectStoreDir", "target/tm"); - System.setProperty("ObjectStoreEnvironmentBean.objectStoreDir", "target/tm"); - } - - /** - * Setup. - * - * @throws Exception exception - */ - @Before - public void setUp() throws Exception { - jpa = mock(JpaDroolsSessionConnector.class); - sess = mock(DroolsSession.class); - bds = mock(BasicDataSource.class); - emf = mock(EntityManagerFactory.class); - kiesess = mock(KieSession.class); - conn = null; - props = new Properties(); - kiesvc = mock(KieServices.class); - kieenv = mock(Environment.class); - kiecfg = mock(KieSessionConfiguration.class); - kiebase = mock(KieBase.class); - kiestore = mock(KieStoreServices.class); - transmgr = mock(TransactionManager.class); - usertrans = mock(UserTransaction.class); - transreg = mock(TransactionSynchronizationRegistry.class); - polcont = mock(PolicyContainer.class); - polctlr = mock(PolicyController.class); - polsess = mock(PolicySession.class); - emfCount = 0; - jpaCount = 0; - propName = null; - - feat = new PersistenceFeatureImpl(); - - props.putAll(stdprops); - - System.setProperty("com.arjuna.ats.arjuna.objectstore.objectStoreDir", "target/tm"); - System.setProperty("ObjectStoreEnvironmentBean.objectStoreDir", "target/tm"); - - when(kiesvc.newEnvironment()).thenReturn(kieenv); - when(kiesvc.getStoreServices()).thenReturn(kiestore); - when(kiesvc.newKieSessionConfiguration()).thenReturn(kiecfg); - - KieContainer kiecont = mock(KieContainer.class); - when(polcont.getKieContainer()).thenReturn(kiecont); - - when(polsess.getContainer()).thenReturn(polcont); - - when(kiecont.getKieBase(anyString())).thenReturn(kiebase); - } - - /** - * Tear down. - */ - @After - public void tearDown() { - // this will cause the in-memory test DB to be dropped - if (conn != null) { - try { - conn.close(); - } catch (SQLException e) { - logger.warn("failed to close connection", e); - } - } - - if (emf != null) { - try { - emf.close(); - } catch (IllegalArgumentException e) { - logger.trace("ignored exception", e); - } - } - } - - @Test - public void testGetContainerAdjunct_New() throws Exception { - setUpKie(MY_SESS_NAME, 999L, true); - mockDbConn(5); - - // force getContainerAdjunct() to be invoked - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - ArgumentCaptor adjcap = - ArgumentCaptor.forClass(PersistenceFeature.ContainerAdjunct.class); - - verify(polcont, times(1)).setAdjunct(any(), adjcap.capture()); - - assertNotNull(adjcap.getValue()); - } - - @Test - public void testGetContainerAdjunct_Existing() throws Exception { - setUpKie(MY_SESS_NAME, 999L, true); - mockDbConn(5); - - // force getContainerAdjunct() to be invoked - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - ArgumentCaptor adjcap = - ArgumentCaptor.forClass(PersistenceFeature.ContainerAdjunct.class); - - verify(polcont, times(1)).setAdjunct(any(), adjcap.capture()); - - // return adjunct on next call - when(polcont.getAdjunct(any())).thenReturn(adjcap.getValue()); - - // force getContainerAdjunct() to be invoked again - setUpKie("myname2", 999L, true); - mockDbConn(5); - feat.activatePolicySession(polcont, "myname2", MY_KIE_BASE); - - // ensure it isn't invoked again - verify(polcont, times(1)).setAdjunct(any(), any()); - } - - @Test - public void testGetContainerAdjunct_WrongType() throws Exception { - setUpKie(MY_SESS_NAME, 999L, true); - mockDbConn(5); - - // return false adjunct on next call - when(polcont.getAdjunct(any())).thenReturn("not-a-real-adjunct"); - - // force getContainerAdjunct() to be invoked - setUpKie("myname2", 999L, true); - mockDbConn(5); - feat.activatePolicySession(polcont, "myname2", MY_KIE_BASE); - - ArgumentCaptor adjcap = - ArgumentCaptor.forClass(PersistenceFeature.ContainerAdjunct.class); - - verify(polcont, times(1)).setAdjunct(any(), adjcap.capture()); - - assertNotNull(adjcap.getValue()); - } - - @Test - public void testGetSequenceNumber() { - assertEquals(1, feat.getSequenceNumber()); - } - - @Test - public void testGlobalInit() throws Exception { - - feat.globalInit(null, SRC_TEST_RESOURCES); - - // verify that various factory methods were invoked - assertEquals("src/test/resources/feature-session-persistence.properties", propName); - } - - @Test(expected = NullPointerException.class) - public void testGlobalInitIoEx() throws Exception { - - feat = new PersistenceFeatureImpl() { - @Override - protected Properties loadProperties(String filenm) throws IOException { - throw new IOException(EXPECTED); - } - }; - - feat.globalInit(null, SRC_TEST_RESOURCES); - } - - @Test - public void testActivatePolicySession() throws Exception { - setUpKie(MY_SESS_NAME, 999L, true); - final PreparedStatement ps = mockDbConn(5); - - feat.beforeActivate(null); - - KieSession session = feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - verify(kiestore).loadKieSession(anyLong(), any(), any(), any()); - verify(kiestore, never()).newKieSession(any(), any(), any()); - - assertEquals(session, kiesess); - - verify(ps).executeUpdate(); - - verify(kieenv, times(4)).set(anyString(), any()); - - verify(jpa).get(MY_SESS_NAME); - verify(jpa).replace(any()); - } - - @Test - public void testActivatePolicySession_NoPersistence() throws Exception { - setUpKie(MY_SESS_NAME, 999L, true); - final PreparedStatement ps = mockDbConn(5); - - props.remove("persistence.type"); - - feat.beforeStart(null); - - assertNull(feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE)); - - verify(ps, never()).executeUpdate(); - verify(kiestore, never()).loadKieSession(anyLong(), any(), any(), any()); - verify(kiestore, never()).newKieSession(any(), any(), any()); - } - - /** Verifies that a new KIE session is created when there is no existing session entity. */ - @Test - public void testActivatePolicySession_New() throws Exception { - setUpKie("noName", 999L, true); - mockDbConn(5); - - KieSession session = feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - verify(kiestore, never()).loadKieSession(anyLong(), any(), any(), any()); - verify(kiestore).newKieSession(any(), any(), any()); - - assertEquals(session, kiesess); - - verify(kieenv, times(4)).set(anyString(), any()); - - verify(jpa).get(MY_SESS_NAME); - verify(jpa).replace(any()); - } - - /** - * Verifies that a new KIE session is created when there KIE fails to load an existing session. - */ - @Test - public void testActivatePolicySession_LoadFailed() throws Exception { - setUpKie(MY_SESS_NAME, 999L, false); - mockDbConn(5); - - KieSession session = feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - verify(kiestore).loadKieSession(anyLong(), any(), any(), any()); - verify(kiestore).newKieSession(any(), any(), any()); - - assertEquals(session, kiesess); - - verify(kieenv, times(4)).set(anyString(), any()); - - verify(jpa).get(MY_SESS_NAME); - - ArgumentCaptor drools = ArgumentCaptor.forClass(DroolsSession.class); - verify(jpa).replace(drools.capture()); - - assertEquals(MY_SESS_NAME, drools.getValue().getSessionName()); - assertEquals(100L, drools.getValue().getSessionId()); - } - - @Test - public void testLoadDataSource() throws Exception { - setUpKie(MY_SESS_NAME, 999L, false); - mockDbConn(5); - - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - assertEquals(1, emfCount); - } - - @Test - public void testConfigureSysProps() throws Exception { - setUpKie(MY_SESS_NAME, 999L, false); - mockDbConn(5); - - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - assertEquals("60", System.getProperty("com.arjuna.ats.arjuna.coordinator.defaultTimeout")); - assertEquals(JTA_OSDIR, System.getProperty("com.arjuna.ats.arjuna.objectstore.objectStoreDir")); - assertEquals(JTA_OSDIR, System.getProperty("ObjectStoreEnvironmentBean.objectStoreDir")); - } - - @Test - public void testConfigureKieEnv() throws Exception { - setUpKie(MY_SESS_NAME, 999L, false); - mockDbConn(5); - - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - verify(kieenv, times(4)).set(any(), any()); - - verify(kieenv).set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf); - verify(kieenv).set(EnvironmentName.TRANSACTION, usertrans); - verify(kieenv).set(EnvironmentName.TRANSACTION_MANAGER, transmgr); - verify(kieenv).set(EnvironmentName.TRANSACTION_SYNCHRONIZATION_REGISTRY, transreg); - - verify(bds, times(1)).close(); - } - - @Test - public void testConfigureKieEnv_RtEx() throws Exception { - setUpKie(MY_SESS_NAME, 999L, false); - mockDbConn(5); - - feat = new PersistenceFeatureMockDb() { - @Override - protected UserTransaction getUserTrans() { - throw new IllegalArgumentException(EXPECTED); - } - }; - - feat.globalInit(null, SRC_TEST_RESOURCES); - - try { - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - fail(MISSING_EXCEPTION); - - } catch (IllegalArgumentException ex) { - logger.trace(EXPECTED, ex); - } - - verify(bds, times(2)).close(); - } - - @Test - public void testLoadKieSession() throws Exception { - setUpKie(MY_SESS_NAME, 999L, true); - mockDbConn(5); - - KieSession session = feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - verify(kiestore).loadKieSession(999L, kiebase, kiecfg, kieenv); - verify(kiestore, never()).newKieSession(any(), any(), any()); - - assertEquals(session, kiesess); - } - - /* - * Verifies that loadKieSession() returns null (thus causing newKieSession() - * to be called) when an Exception occurs. - */ - @Test - public void testLoadKieSession_Ex() throws Exception { - setUpKie(MY_SESS_NAME, 999L, false); - mockDbConn(5); - - when(kiestore.loadKieSession(anyLong(), any(), any(), any())) - .thenThrow(new IllegalArgumentException(EXPECTED)); - - KieSession session = feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - verify(kiestore).loadKieSession(anyLong(), any(), any(), any()); - verify(kiestore).newKieSession(any(), any(), any()); - - assertEquals(session, kiesess); - } - - @Test - public void testNewKieSession() throws Exception { - setUpKie(MY_SESS_NAME, 999L, false); - mockDbConn(5); - - KieSession session = feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - verify(kiestore).newKieSession(kiebase, null, kieenv); - - assertEquals(session, kiesess); - } - - @Test - public void testLoadDataSource_DiffSession() throws Exception { - setUpKie(MY_SESS_NAME, 999L, false); - mockDbConn(5); - - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - ArgumentCaptor adjcap = - ArgumentCaptor.forClass(PersistenceFeature.ContainerAdjunct.class); - - verify(polcont).setAdjunct(any(), adjcap.capture()); - - when(polcont.getAdjunct(any())).thenReturn(adjcap.getValue()); - - setUpKie("myname2", 999L, false); - mockDbConn(5); - - // invoke it again - feat.activatePolicySession(polcont, "myname2", MY_KIE_BASE); - - assertEquals(2, emfCount); - } - - @Test - public void testSelectThreadModel_Persistent() throws Exception { - setUpKie(MY_SESS_NAME, 999L, true); - - ThreadModel model = feat.selectThreadModel(polsess); - assertNotNull(model); - assertTrue(model instanceof PersistentThreadModel); - } - - @Test - public void testSelectThreadModel_NotPersistent() throws Exception { - assertNull(feat.selectThreadModel(polsess)); - } - - @Test - public void testSelectThreadModel_Start__Run_Update_Stop() throws Exception { - setUpKie(MY_SESS_NAME, 999L, true); - - ThreadModel model = feat.selectThreadModel(polsess); - assertNotNull(model); - assertTrue(model instanceof PersistentThreadModel); - - when(polsess.getKieSession()).thenReturn(kiesess); - - model.start(); - new CountDownLatch(1).await(10, TimeUnit.MILLISECONDS); - model.updated(); - model.stop(); - } - - @Test - public void testDisposeKieSession() throws Exception { - setUpKie(MY_SESS_NAME, 999L, false); - mockDbConn(5); - - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - verify(emf, never()).close(); - - final ArgumentCaptor adjcap = - ArgumentCaptor.forClass(PersistenceFeature.ContainerAdjunct.class); - - verify(polcont).setAdjunct(any(), adjcap.capture()); - - when(polcont.getAdjunct(any())).thenReturn(adjcap.getValue()); - - feat.disposeKieSession(polsess); - - // call twice to ensure it isn't re-closed - feat.disposeKieSession(polsess); - - verify(emf, times(1)).close(); - } - - @Test - public void testDisposeKieSession_NoAdjunct() throws Exception { - feat.globalInit(null, SRC_TEST_RESOURCES); - - assertThatCode(() -> feat.disposeKieSession(polsess)).doesNotThrowAnyException(); - } - - @Test - public void testDisposeKieSession_NoPersistence() throws Exception { - setUpKie(MY_SESS_NAME, 999L, false); - mockDbConn(5); - - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - verify(emf, never()).close(); - - final ArgumentCaptor adjcap = - ArgumentCaptor.forClass(PersistenceFeature.ContainerAdjunct.class); - - verify(polcont).setAdjunct(any(), adjcap.capture()); - - when(polcont.getAdjunct(any())).thenReturn(adjcap.getValue()); - - // specify a session that was never loaded - when(polsess.getName()).thenReturn("anotherName"); - - feat.disposeKieSession(polsess); - - verify(emf, never()).close(); - } - - @Test - public void testDestroyKieSession() throws Exception { - setUpKie(MY_SESS_NAME, 999L, false); - mockDbConn(5); - - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - verify(emf, never()).close(); - - final ArgumentCaptor adjcap = - ArgumentCaptor.forClass(PersistenceFeature.ContainerAdjunct.class); - - verify(polcont).setAdjunct(any(), adjcap.capture()); - - when(polcont.getAdjunct(any())).thenReturn(adjcap.getValue()); - - feat.destroyKieSession(polsess); - - // call twice to ensure it isn't re-closed - feat.destroyKieSession(polsess); - - verify(emf, times(1)).close(); - } - - @Test - public void testDestroyKieSession_NoAdjunct() throws Exception { - feat.globalInit(null, SRC_TEST_RESOURCES); - - assertThatCode(() -> feat.destroyKieSession(polsess)).doesNotThrowAnyException(); - } - - @Test - public void testDestroyKieSession_NoPersistence() throws Exception { - setUpKie(MY_SESS_NAME, 999L, false); - mockDbConn(5); - - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - verify(emf, never()).close(); - - final ArgumentCaptor adjcap = - ArgumentCaptor.forClass(PersistenceFeature.ContainerAdjunct.class); - - verify(polcont).setAdjunct(any(), adjcap.capture()); - - when(polcont.getAdjunct(any())).thenReturn(adjcap.getValue()); - - // specify a session that was never loaded - when(polsess.getName()).thenReturn("anotherName"); - - feat.destroyKieSession(polsess); - - verify(emf, never()).close(); - } - - @Test - public void testAfterStart() { - assertFalse(feat.afterStart(null)); - } - - @Test - public void testBeforeStart() { - assertFalse(feat.beforeStart(null)); - } - - @Test - public void testBeforeShutdown() { - assertFalse(feat.beforeShutdown(null)); - } - - @Test - public void testAfterShutdown() { - assertFalse(feat.afterShutdown(null)); - } - - @Test - public void testBeforeConfigure() { - assertFalse(feat.beforeConfigure(null, null)); - } - - @Test - public void testAfterConfigure() { - assertFalse(feat.afterConfigure(null)); - } - - @Test - public void testBeforeActivate() { - assertFalse(feat.beforeActivate(null)); - } - - @Test - public void testAfterActivate() { - assertFalse(feat.afterActivate(null)); - } - - @Test - public void testBeforeDeactivate() { - assertFalse(feat.beforeDeactivate(null)); - } - - @Test - public void testAfterDeactivate() { - assertFalse(feat.afterDeactivate(null)); - } - - @Test - public void testBeforeStop() { - assertFalse(feat.beforeStop(null)); - } - - @Test - public void testAfterStop() { - assertFalse(feat.afterStop(null)); - } - - @Test - public void testBeforeLock() { - assertFalse(feat.beforeLock(null)); - } - - @Test - public void testAfterLock() { - assertFalse(feat.afterLock(null)); - } - - @Test - public void testBeforeUnlock() { - assertFalse(feat.beforeUnlock(null)); - } - - @Test - public void testAfterUnlock() { - assertFalse(feat.afterUnlock(null)); - } - - @Test - public void testGetPersistenceTimeout_Valid() throws Exception { - setUpKie(MY_SESS_NAME, 999L, true); - final PreparedStatement statement = mockDbConn(5); - - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - verify(statement).executeUpdate(); - } - - @Test - public void testGetPersistenceTimeout_Missing() throws Exception { - - props.remove(DroolsPersistenceProperties.DB_SESSIONINFO_TIMEOUT); - - setUpKie(MY_SESS_NAME, 999L, true); - final PreparedStatement statement = mockDbConn(0); - - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - verify(statement, never()).executeUpdate(); - } - - @Test - public void testGetPersistenceTimeout_Invalid() throws Exception { - props.setProperty(DroolsPersistenceProperties.DB_SESSIONINFO_TIMEOUT, "abc"); - - setUpKie(MY_SESS_NAME, 999L, true); - final PreparedStatement s = mockDbConn(0); - - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - verify(s, never()).executeUpdate(); - } - - @Test - public void testCleanUpSessionInfo() throws Exception { - setUpKie(MY_SESS_NAME, 999L, true); - - // use a real DB so we can verify that the "delete" works correctly - feat = new PartialFeature(); - - makeSessionInfoTbl(20000); - - // create mock entity manager for use by JPA connector - EntityManager em = mock(EntityManager.class); - when(emf.createEntityManager()).thenReturn(em); - - feat.globalInit(null, SRC_TEST_RESOURCES); - - feat.beforeStart(null); - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - assertEquals("[1, 4, 5]", getSessions().toString()); - } - - @Test - public void testCleanUpSessionInfo_WithBeforeStart() throws Exception { - setUpKie(MY_SESS_NAME, 999L, true); - final PreparedStatement statement = mockDbConn(0); - - // reset - feat.beforeStart(null); - - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - verify(statement, times(1)).executeUpdate(); - - // should not clean-up again - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - verify(statement, times(1)).executeUpdate(); - - // reset - feat.beforeStart(null); - - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - verify(statement, times(2)).executeUpdate(); - - // should not clean-up again - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - verify(statement, times(2)).executeUpdate(); - } - - @Test - public void testCleanUpSessionInfo_WithBeforeActivate() throws Exception { - setUpKie(MY_SESS_NAME, 999L, true); - final PreparedStatement statement = mockDbConn(0); - - // reset - feat.beforeActivate(null); - - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - verify(statement, times(1)).executeUpdate(); - - // should not clean-up again - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - verify(statement, times(1)).executeUpdate(); - - // reset - feat.beforeActivate(null); - - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - verify(statement, times(2)).executeUpdate(); - - // should not clean-up again - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - verify(statement, times(2)).executeUpdate(); - } - - @Test - public void testCleanUpSessionInfo_NoTimeout() throws Exception { - - props.remove(DroolsPersistenceProperties.DB_SESSIONINFO_TIMEOUT); - - setUpKie(MY_SESS_NAME, 999L, true); - final PreparedStatement statement = mockDbConn(0); - - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - verify(statement, never()).executeUpdate(); - } - - @Test - public void testCleanUpSessionInfo_NoUrl() throws Exception { - props.remove(DroolsPersistenceProperties.DB_URL); - - setUpKie(MY_SESS_NAME, 999L, true); - final PreparedStatement statement = mockDbConn(0); - - try { - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - fail(MISSING_EXCEPTION); - } catch (RuntimeException e) { - logger.trace(EXPECTED, e); - } - - verify(statement, never()).executeUpdate(); - } - - @Test - public void testCleanUpSessionInfo_NoUser() throws Exception { - props.remove(DroolsPersistenceProperties.DB_USER); - - setUpKie(MY_SESS_NAME, 999L, true); - final PreparedStatement statement = mockDbConn(0); - - try { - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - fail(MISSING_EXCEPTION); - } catch (RuntimeException e) { - logger.trace(EXPECTED, e); - } - - verify(statement, never()).executeUpdate(); - } - - @Test - public void testCleanUpSessionInfo_NoPassword() throws Exception { - props.remove(DroolsPersistenceProperties.DB_PWD); - - setUpKie(MY_SESS_NAME, 999L, true); - final PreparedStatement statement = mockDbConn(0); - - try { - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - fail(MISSING_EXCEPTION); - } catch (RuntimeException e) { - logger.trace(EXPECTED, e); - } - - verify(statement, never()).executeUpdate(); - } - - @Test - public void testCleanUpSessionInfo_SqlEx() throws Exception { - setUpKie(MY_SESS_NAME, 999L, true); - final PreparedStatement statement = mockDbConn(-1); - - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - verify(statement).executeUpdate(); - } - - @Test - public void testGetDroolsSessionConnector() throws Exception { - setUpKie(MY_SESS_NAME, 999L, true); - mockDbConn(5); - - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - assertEquals(1, jpaCount); - } - - @Test - public void testReplaceSession() throws Exception { - setUpKie(MY_SESS_NAME, 999L, true); - mockDbConn(5); - - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - final ArgumentCaptor sesscap = ArgumentCaptor.forClass(DroolsSession.class); - - verify(jpa).replace(sesscap.capture()); - - assertEquals(MY_SESS_NAME, sesscap.getValue().getSessionName()); - assertEquals(999L, sesscap.getValue().getSessionId()); - } - - @Test - public void testIsPersistenceEnabled_Auto() throws Exception { - setUpKie(MY_SESS_NAME, 999L, true); - mockDbConn(5); - - props.setProperty("persistence.type", "auto"); - - assertNotNull(feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE)); - } - - @Test - public void testIsPersistenceEnabled_Native() throws Exception { - setUpKie(MY_SESS_NAME, 999L, true); - mockDbConn(5); - - props.setProperty("persistence.type", "native"); - - assertNotNull(feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE)); - } - - @Test - public void testIsPersistenceEnabled_None() throws Exception { - setUpKie(MY_SESS_NAME, 999L, true); - mockDbConn(5); - - props.remove("persistence.type"); - - assertNull(feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE)); - } - - @Test - public void testGetProperties_Ex() throws Exception { - setUpKie(MY_SESS_NAME, 999L, true); - mockDbConn(5); - - feat = new PersistenceFeatureMockDb() { - @Override - protected PolicyController getPolicyController(PolicyContainer container) { - throw new IllegalArgumentException(EXPECTED); - } - }; - - assertNull(feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE)); - } - - @Test - public void testGetProperty_Specific() throws Exception { - setUpKie(MY_SESS_NAME, 999L, true); - mockDbConn(5); - - props.remove("persistence.type"); - props.setProperty("persistence.myname.type", "auto"); - - assertNotNull(feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE)); - } - - @Test - public void testGetProperty_Specific_None() throws Exception { - setUpKie(MY_SESS_NAME, 999L, true); - mockDbConn(5); - - props.remove("persistence.type"); - props.setProperty("persistence.xxx.type", "auto"); - - assertNull(feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE)); - } - - @Test - public void testGetProperty_Both_SpecificOn() throws Exception { - setUpKie(MY_SESS_NAME, 999L, true); - mockDbConn(5); - - props.setProperty("persistence.type", "other"); - props.setProperty("persistence.myname.type", "auto"); - - assertNotNull(feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE)); - } - - @Test - public void testGetProperty_Both_SpecificDisabledOff() throws Exception { - setUpKie(MY_SESS_NAME, 999L, true); - mockDbConn(5); - - props.setProperty("persistence.type", "auto"); - props.setProperty("persistence.myname.type", "other"); - - assertNull(feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE)); - } - - @Test - public void testGetProperty_None() throws Exception { - setUpKie(MY_SESS_NAME, 999L, true); - mockDbConn(5); - - props.remove("persistence.type"); - - assertNull(feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE)); - } - - @Test - public void testPersistenceFeatureException() { - SecurityException secex = new SecurityException(EXPECTED); - PersistenceFeatureException ex = new PersistenceFeatureException(secex); - - assertEquals(secex, ex.getCause()); - } - - @Test - public void testDsEmf_RtEx() throws Exception { - setUpKie(MY_SESS_NAME, 999L, false); - mockDbConn(5); - - feat = new PersistenceFeatureMockDb() { - @Override - protected EntityManagerFactory makeEntMgrFact(Map props) { - throw new IllegalArgumentException(EXPECTED); - } - }; - - feat.globalInit(null, SRC_TEST_RESOURCES); - - try { - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - fail(MISSING_EXCEPTION); - - } catch (IllegalArgumentException ex) { - logger.trace(EXPECTED, ex); - } - - verify(bds, times(2)).close(); - } - - @Test - public void testDsEmf_Close_RtEx() throws Exception { - setUpKie(MY_SESS_NAME, 999L, false); - mockDbConn(5); - - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - ArgumentCaptor adjcap = - ArgumentCaptor.forClass(PersistenceFeature.ContainerAdjunct.class); - - verify(polcont, times(1)).setAdjunct(any(), adjcap.capture()); - - // return adjunct on next call - when(polcont.getAdjunct(any())).thenReturn(adjcap.getValue()); - - IllegalArgumentException exception = new IllegalArgumentException(EXPECTED); - doThrow(exception).when(emf).close(); - assertThatCode(() -> feat.destroyKieSession(polsess)).isEqualTo(exception); - - verify(bds, times(2)).close(); - } - - @Test - public void testDsEmf_CloseDataSource_RtEx() throws Exception { - setUpKie(MY_SESS_NAME, 999L, false); - mockDbConn(5); - - feat.activatePolicySession(polcont, MY_SESS_NAME, MY_KIE_BASE); - - ArgumentCaptor adjcap = - ArgumentCaptor.forClass(PersistenceFeature.ContainerAdjunct.class); - - verify(polcont, times(1)).setAdjunct(any(), adjcap.capture()); - - // return adjunct on next call - when(polcont.getAdjunct(any())).thenReturn(adjcap.getValue()); - - SQLException cause = new SQLException(EXPECTED); - doThrow(cause).when(bds).close(); - assertThatCode(() -> feat.destroyKieSession(polsess)).isInstanceOf(PersistenceFeatureException.class) - .hasCause(cause); - } - - /** - * Gets an ordered list of ids of the current SessionInfo records. - * - * @return ordered list of SessInfo IDs - * @throws SQLException sql exception - * @throws IOException io exception - */ - private List getSessions() throws SQLException, IOException { - attachDb(); - - ArrayList lst = new ArrayList<>(5); - - try (PreparedStatement stmt = conn.prepareStatement("SELECT id from sessioninfo order by id"); - ResultSet rs = stmt.executeQuery()) { - - while (rs.next()) { - lst.add(rs.getInt(1)); - } - } - - return lst; - } - - /** - * Sets up for doing invoking the newKieSession() method. - * - * @param sessnm name to which JPA should respond with a session - * @param sessid session id to be returned by the session - * @param loadOk {@code true} if loadKieSession() should return a value, {@code false} to return - * null - * @throws Exception exception - */ - private void setUpKie(String sessnm, long sessid, boolean loadOk) throws Exception { - props.setProperty("persistence.type", "auto"); - - when(polctlr.getProperties()).thenReturn(props); - - when(jpa.get(sessnm)).thenReturn(sess); - - when(sess.getSessionId()).thenReturn(sessid); - - when(polsess.getContainer()).thenReturn(polcont); - when(polsess.getName()).thenReturn(sessnm); - - if (loadOk) { - when(kiesess.getIdentifier()).thenReturn(sessid); - when(kiestore.loadKieSession(anyLong(), any(), any(), any())).thenReturn(kiesess); - - } else { - // use an alternate id for the new session - when(kiesess.getIdentifier()).thenReturn(100L); - when(kiestore.loadKieSession(anyLong(), any(), any(), any())).thenReturn(null); - } - - when(kiestore.newKieSession(any(), any(), any())).thenReturn(kiesess); - - feat = new PersistenceFeatureKie(); - feat.globalInit(null, SRC_TEST_RESOURCES); - } - - /** - * Creates the SessionInfo DB table and populates it with some data. - * - * @param expMs number of milli-seconds for expired sessioninfo records - * @throws SQLException exception - * @throws IOException exception - */ - private void makeSessionInfoTbl(int expMs) throws SQLException, IOException { - - attachDb(); - - try (PreparedStatement stmt = - conn.prepareStatement("CREATE TABLE sessioninfo(id int, lastmodificationdate timestamp)")) { - - stmt.executeUpdate(); - } - - try (PreparedStatement stmt = - conn.prepareStatement("INSERT into sessioninfo(id, lastmodificationdate) values(?, ?)")) { - - Timestamp ts; - - // current data - ts = new Timestamp(System.currentTimeMillis()); - stmt.setTimestamp(2, ts); - - stmt.setInt(1, 1); - stmt.executeUpdate(); - - stmt.setInt(1, 4); - stmt.executeUpdate(); - - stmt.setInt(1, 5); - stmt.executeUpdate(); - - // expired data - ts = new Timestamp(System.currentTimeMillis() - expMs); - stmt.setTimestamp(2, ts); - - stmt.setInt(1, 2); - stmt.executeUpdate(); - - stmt.setInt(1, 3); - stmt.executeUpdate(); - } - } - - /** - * Attaches {@link #conn} to the DB, if it isn't already attached. - * - * @throws SQLException sql exception - * @throws IOException if the property file cannot be read - */ - private void attachDb() throws SQLException, IOException { - if (conn == null) { - Properties props = loadDbProps(); - - conn = - DriverManager.getConnection( - props.getProperty(DroolsPersistenceProperties.DB_URL), - props.getProperty(DroolsPersistenceProperties.DB_USER), - props.getProperty(DroolsPersistenceProperties.DB_PWD)); - conn.setAutoCommit(true); - } - } - - /** - * Loads the DB properties from the file, feature-session-persistence.properties. - * - * @return the properties that were loaded - * @throws IOException if the property file cannot be read - * @throws FileNotFoundException if the property file does not exist - */ - private Properties loadDbProps() throws IOException, FileNotFoundException { - - Properties props = new Properties(); - - try (FileReader rdr = - new FileReader("src/test/resources/feature-session-persistence.properties")) { - props.load(rdr); - } - - return props; - } - - /** - * Create a mock DB connection and statement. - * - * @param retval value to be returned when the statement is executed, or negative to throw an - * exception - * @return the statement that will be returned by the connection - * @throws SQLException sql exception - */ - private PreparedStatement mockDbConn(int retval) throws SQLException { - Connection connection = mock(Connection.class); - PreparedStatement statement = mock(PreparedStatement.class); - - when(bds.getConnection()).thenReturn(connection); - when(connection.prepareStatement(anyString())).thenReturn(statement); - - if (retval < 0) { - // should throw an exception - when(statement.executeUpdate()).thenThrow(new SQLException(EXPECTED)); - - } else { - // should return the value - when(statement.executeUpdate()).thenReturn(retval); - } - - feat = new PersistenceFeatureMockDb(); - feat.globalInit(null, SRC_TEST_RESOURCES); - - return statement; - } - - /** - * Feature with a mock DB. - */ - private class PersistenceFeatureMockDb extends PersistenceFeatureKie { - - @Override - protected BasicDataSource makeDataSource(Properties dsProps) { - return bds; - } - } - - /** - * Feature supporting newKieSession. - */ - private class PersistenceFeatureKie extends PersistenceFeatureImpl { - - @Override - protected EntityManagerFactory makeEntMgrFact(Map props) { - ++emfCount; - return emf; - } - - @Override - protected DroolsSessionConnector makeJpaConnector(EntityManagerFactory emf) { - ++jpaCount; - return jpa; - } - } - - /** - * Feature with overrides. - */ - private class PersistenceFeatureImpl extends PartialFeature { - - @Override - protected Properties loadProperties(String filenm) throws IOException { - propName = filenm; - return props; - } - - @Override - protected BasicDataSource makeDataSource(Properties dsProps) { - return null; - } - - @Override - protected DroolsSessionConnector makeJpaConnector(EntityManagerFactory emf) { - ++jpaCount; - return null; - } - } - - /** - * Feature with some overrides. - */ - private class PartialFeature extends PersistenceFeature { - - @Override - protected TransactionManager getTransMgr() { - return transmgr; - } - - @Override - protected UserTransaction getUserTrans() { - return usertrans; - } - - @Override - protected TransactionSynchronizationRegistry getTransSyncReg() { - return transreg; - } - - @Override - protected KieServices getKieServices() { - return kiesvc; - } - - @Override - protected EntityManagerFactory makeEntMgrFact(Map props) { - ++emfCount; - return emf; - } - - @Override - protected PolicyController getPolicyController(PolicyContainer container) { - return polctlr; - } - } -} diff --git a/feature-session-persistence/src/test/resources/META-INF/persistence.xml b/feature-session-persistence/src/test/resources/META-INF/persistence.xml deleted file mode 100644 index 0fc695d3..00000000 --- a/feature-session-persistence/src/test/resources/META-INF/persistence.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - org.hibernate.jpa.HibernatePersistenceProvider - org.onap.policy.drools.persistence.DroolsSessionEntity - - - - - - diff --git a/feature-session-persistence/src/test/resources/feature-session-persistence.properties b/feature-session-persistence/src/test/resources/feature-session-persistence.properties deleted file mode 100644 index 1c662f95..00000000 --- a/feature-session-persistence/src/test/resources/feature-session-persistence.properties +++ /dev/null @@ -1,28 +0,0 @@ -### -# ============LICENSE_START======================================================= -# feature-session-persistence -# ================================================================================ -# Copyright (C) 2017, 2021 AT&T Intellectual Property. All rights reserved. -# ================================================================================ -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ============LICENSE_END========================================================= -### - -eclipselink.target-database=Auto -javax.persistence.jdbc.driver=org.h2.Driver -javax.persistence.jdbc.url=jdbc:h2:mem:TestPersistenceFeature -javax.persistence.jdbc.user=testuser -javax.persistence.jdbc.password=testpass - -persistence.sessioninfo.timeout=10 -persistence.objectstore.dir=target/jta diff --git a/feature-session-persistence/src/test/resources/logback-test.xml b/feature-session-persistence/src/test/resources/logback-test.xml deleted file mode 100644 index 7f151173..00000000 --- a/feature-session-persistence/src/test/resources/logback-test.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M\(%line\) - %msg%n - - - - - logs/debug.log - - - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M\(%line\) - %msg%n - - - - - - - - - - diff --git a/packages/install/pom.xml b/packages/install/pom.xml index 5c531c21..1470ac0c 100644 --- a/packages/install/pom.xml +++ b/packages/install/pom.xml @@ -79,18 +79,6 @@ ${project.version} zip - - org.onap.policy.drools-pdp - feature-eelf - ${project.version} - zip - - - org.onap.policy.drools-pdp - feature-session-persistence - ${project.version} - zip - org.onap.policy.drools-pdp feature-test-transaction diff --git a/pom.xml b/pom.xml index e9ec9cb7..effaf291 100644 --- a/pom.xml +++ b/pom.xml @@ -61,9 +61,7 @@ policy-domains policy-management feature-healthcheck - feature-eelf feature-pooling-dmaap - feature-session-persistence feature-test-transaction feature-distributed-locking feature-controller-logging -- cgit 1.2.3-korg