Allow providers other than PolicyModelsProvider 49/116949/2
authorliamfallon <liam.fallon@est.tech>
Mon, 18 Jan 2021 11:34:12 +0000 (11:34 +0000)
committerliamfallon <liam.fallon@est.tech>
Tue, 19 Jan 2021 15:07:24 +0000 (15:07 +0000)
This change separates the database initiation and close functions of the
DatabasePolicyModelsProviderImpl class into an abstract class that does
the database DAO initiation and closing, and a domain specific part,
that does the manipulation of the policy models in the database.

This means that other providers, that wish to manipulate other objects
in the database, can specialize the AbstractModelsProvider class and use
its common DAO initiation and clsoing functionality, but can have their
own domain specific code.

The abstract class also now supports the Closeable interface.

Note that the exiting JUnit tests provide 100% coverage on
AbstractModelsProvider.

Issue-ID: POLICY-2971
Change-Id: Ibe59c02ab127ddbd9355d892b94a5d315507a8e6
Signed-off-by: liamfallon <liam.fallon@est.tech>
models-provider/src/main/java/org/onap/policy/models/provider/impl/AbstractModelsProvider.java [new file with mode: 0644]
models-provider/src/main/java/org/onap/policy/models/provider/impl/DatabasePolicyModelsProviderImpl.java

diff --git a/models-provider/src/main/java/org/onap/policy/models/provider/impl/AbstractModelsProvider.java b/models-provider/src/main/java/org/onap/policy/models/provider/impl/AbstractModelsProvider.java
new file mode 100644 (file)
index 0000000..818cc44
--- /dev/null
@@ -0,0 +1,115 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.provider.impl;
+
+import java.io.Closeable;
+import java.util.Properties;
+import javax.ws.rs.core.Response;
+import lombok.Getter;
+import lombok.NonNull;
+import org.eclipse.persistence.config.PersistenceUnitProperties;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.dao.DaoParameters;
+import org.onap.policy.models.dao.PfDao;
+import org.onap.policy.models.dao.PfDaoFactory;
+import org.onap.policy.models.dao.impl.DefaultPfDao;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class provides an abstract models provider that can be used to initialise the database for any specialisation of
+ * the class.
+ */
+public abstract class AbstractModelsProvider implements Closeable {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(AbstractModelsProvider.class);
+
+    private final PolicyModelsProviderParameters parameters;
+
+    // Database connection and the DAO for reading and writing Policy Framework concepts
+    @Getter
+    private PfDao pfDao;
+
+    /**
+     * Constructor that takes the parameters.
+     *
+     * @param parameters the parameters for the provider
+     */
+    protected AbstractModelsProvider(@NonNull final PolicyModelsProviderParameters parameters) {
+        this.parameters = parameters;
+    }
+
+    /**
+     * Initialise the provider.
+     *
+     * @throws PfModelException in initialisation errors
+     */
+    public synchronized void init() throws PfModelException {
+        LOGGER.debug("opening the database connection to {} using persistence unit {}", parameters.getDatabaseUrl(),
+                parameters.getPersistenceUnit());
+
+        if (pfDao != null) {
+            String errorMessage = "provider is already initialized";
+            throw new PfModelException(Response.Status.NOT_ACCEPTABLE, errorMessage);
+        }
+
+        // Parameters for the DAO
+        final DaoParameters daoParameters = new DaoParameters();
+        daoParameters.setPluginClass(DefaultPfDao.class.getName());
+        daoParameters.setPersistenceUnit(parameters.getPersistenceUnit());
+
+        // @formatter:off
+        Properties jdbcProperties = new Properties();
+        jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_DRIVER,   parameters.getDatabaseDriver());
+        jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_URL,      parameters.getDatabaseUrl());
+        jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_USER,     parameters.getDatabaseUser());
+        jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_PASSWORD, parameters.getDatabasePassword());
+        // @formatter:on
+
+        daoParameters.setJdbcProperties(jdbcProperties);
+
+        try {
+            pfDao = new PfDaoFactory().createPfDao(daoParameters);
+            pfDao.init(daoParameters);
+        } catch (Exception exc) {
+            String errorMessage = "could not create Data Access Object (DAO) using url \"" + parameters.getDatabaseUrl()
+                    + "\" and persistence unit \"" + parameters.getPersistenceUnit() + "\"";
+
+            this.close();
+            throw new PfModelException(Response.Status.NOT_ACCEPTABLE, errorMessage, exc);
+        }
+    }
+
+    @Override
+    public synchronized void close() {
+        LOGGER.debug("closing the database connection to {} using persistence unit {}", parameters.getDatabaseUrl(),
+                parameters.getPersistenceUnit());
+
+        if (pfDao != null) {
+            pfDao.close();
+            pfDao = null;
+        }
+
+        LOGGER.debug("closed the database connection to {} using persistence unit {}", parameters.getDatabaseUrl(),
+                parameters.getPersistenceUnit());
+    }
+}
index 6b54a1c..3094efc 100644 (file)
@@ -25,16 +25,10 @@ package org.onap.policy.models.provider.impl;
 import java.util.Collection;
 import java.util.Date;
 import java.util.List;
-import java.util.Properties;
 import javax.ws.rs.core.Response;
 import lombok.NonNull;
-import org.eclipse.persistence.config.PersistenceUnitProperties;
 import org.onap.policy.models.base.PfModelException;
 import org.onap.policy.models.base.PfModelRuntimeException;
-import org.onap.policy.models.dao.DaoParameters;
-import org.onap.policy.models.dao.PfDao;
-import org.onap.policy.models.dao.PfDaoFactory;
-import org.onap.policy.models.dao.impl.DefaultPfDao;
 import org.onap.policy.models.pdp.concepts.Pdp;
 import org.onap.policy.models.pdp.concepts.PdpGroup;
 import org.onap.policy.models.pdp.concepts.PdpGroupFilter;
@@ -54,8 +48,6 @@ import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeFilter;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplateFilter;
 import org.onap.policy.models.tosca.authorative.provider.AuthorativeToscaProvider;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * This class provides an implementation of the Policy Models Provider for the ONAP Policy Framework that works towards
@@ -63,81 +55,21 @@ import org.slf4j.LoggerFactory;
  *
  * @author Liam Fallon (liam.fallon@est.tech)
  */
-public class DatabasePolicyModelsProviderImpl implements PolicyModelsProvider {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(DatabasePolicyModelsProviderImpl.class);
-
-    private final PolicyModelsProviderParameters parameters;
-
-    // Database connection and the DAO for reading and writing Policy Framework concepts
-    private PfDao pfDao;
-
+public class DatabasePolicyModelsProviderImpl extends AbstractModelsProvider implements PolicyModelsProvider {
     /**
      * Constructor that takes the parameters.
      *
      * @param parameters the parameters for the provider
      */
     public DatabasePolicyModelsProviderImpl(@NonNull final PolicyModelsProviderParameters parameters) {
-        this.parameters = parameters;
-    }
-
-    @Override
-    public void init() throws PfModelException {
-        LOGGER.debug("opening the database connection to {} using persistence unit {}", parameters.getDatabaseUrl(),
-                parameters.getPersistenceUnit());
-
-        if (pfDao != null) {
-            String errorMessage = "provider is already initialized";
-            LOGGER.warn(errorMessage);
-            throw new PfModelException(Response.Status.NOT_ACCEPTABLE, errorMessage);
-        }
-
-        // Parameters for the DAO
-        final DaoParameters daoParameters = new DaoParameters();
-        daoParameters.setPluginClass(DefaultPfDao.class.getName());
-        daoParameters.setPersistenceUnit(parameters.getPersistenceUnit());
-
-        // @formatter:off
-        Properties jdbcProperties = new Properties();
-        jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_DRIVER,   parameters.getDatabaseDriver());
-        jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_URL,      parameters.getDatabaseUrl());
-        jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_USER,     parameters.getDatabaseUser());
-        jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_PASSWORD, parameters.getDatabasePassword());
-        // @formatter:on
-
-        daoParameters.setJdbcProperties(jdbcProperties);
-
-        try {
-            pfDao = new PfDaoFactory().createPfDao(daoParameters);
-            pfDao.init(daoParameters);
-        } catch (Exception exc) {
-            String errorMessage = "could not create Data Access Object (DAO) using url \"" + parameters.getDatabaseUrl()
-                    + "\" and persistence unit \"" + parameters.getPersistenceUnit() + "\"";
-
-            this.close();
-            throw new PfModelException(Response.Status.NOT_ACCEPTABLE, errorMessage, exc);
-        }
-    }
-
-    @Override
-    public void close() throws PfModelException {
-        LOGGER.debug("closing the database connection to {} using persistence unit {}", parameters.getDatabaseUrl(),
-                parameters.getPersistenceUnit());
-
-        if (pfDao != null) {
-            pfDao.close();
-            pfDao = null;
-        }
-
-        LOGGER.debug("closed the database connection to {} using persistence unit {}", parameters.getDatabaseUrl(),
-                parameters.getPersistenceUnit());
+        super(parameters);
     }
 
     @Override
     public List<ToscaServiceTemplate> getServiceTemplateList(final String name, final String version)
             throws PfModelException {
         assertInitialized();
-        return new AuthorativeToscaProvider().getServiceTemplateList(pfDao, name, version);
+        return new AuthorativeToscaProvider().getServiceTemplateList(getPfDao(), name, version);
     }
 
 
@@ -145,21 +77,21 @@ public class DatabasePolicyModelsProviderImpl implements PolicyModelsProvider {
     public List<ToscaServiceTemplate> getFilteredServiceTemplateList(@NonNull ToscaServiceTemplateFilter filter)
             throws PfModelException {
         assertInitialized();
-        return new AuthorativeToscaProvider().getFilteredServiceTemplateList(pfDao, filter);
+        return new AuthorativeToscaProvider().getFilteredServiceTemplateList(getPfDao(), filter);
     }
 
     @Override
     public ToscaServiceTemplate createServiceTemplate(@NonNull final ToscaServiceTemplate serviceTemplate)
             throws PfModelException {
         assertInitialized();
-        return new AuthorativeToscaProvider().createServiceTemplate(pfDao, serviceTemplate);
+        return new AuthorativeToscaProvider().createServiceTemplate(getPfDao(), serviceTemplate);
     }
 
     @Override
     public ToscaServiceTemplate updateServiceTemplate(@NonNull final ToscaServiceTemplate serviceTemplate)
             throws PfModelException {
         assertInitialized();
-        return new AuthorativeToscaProvider().updateServiceTemplate(pfDao, serviceTemplate);
+        return new AuthorativeToscaProvider().updateServiceTemplate(getPfDao(), serviceTemplate);
     }
 
     @Override
@@ -167,46 +99,46 @@ public class DatabasePolicyModelsProviderImpl implements PolicyModelsProvider {
             throws PfModelException {
         assertInitialized();
 
-        return new AuthorativeToscaProvider().deleteServiceTemplate(pfDao, name, version);
+        return new AuthorativeToscaProvider().deleteServiceTemplate(getPfDao(), name, version);
     }
 
     @Override
     public ToscaServiceTemplate getPolicyTypes(final String name, final String version) throws PfModelException {
         assertInitialized();
-        return new AuthorativeToscaProvider().getPolicyTypes(pfDao, name, version);
+        return new AuthorativeToscaProvider().getPolicyTypes(getPfDao(), name, version);
     }
 
     @Override
     public List<ToscaPolicyType> getPolicyTypeList(final String name, final String version) throws PfModelException {
         assertInitialized();
-        return new AuthorativeToscaProvider().getPolicyTypeList(pfDao, name, version);
+        return new AuthorativeToscaProvider().getPolicyTypeList(getPfDao(), name, version);
     }
 
     @Override
     public ToscaServiceTemplate getFilteredPolicyTypes(@NonNull ToscaPolicyTypeFilter filter) throws PfModelException {
         assertInitialized();
-        return new AuthorativeToscaProvider().getFilteredPolicyTypes(pfDao, filter);
+        return new AuthorativeToscaProvider().getFilteredPolicyTypes(getPfDao(), filter);
     }
 
     @Override
     public List<ToscaPolicyType> getFilteredPolicyTypeList(@NonNull ToscaPolicyTypeFilter filter)
             throws PfModelException {
         assertInitialized();
-        return new AuthorativeToscaProvider().getFilteredPolicyTypeList(pfDao, filter);
+        return new AuthorativeToscaProvider().getFilteredPolicyTypeList(getPfDao(), filter);
     }
 
     @Override
     public ToscaServiceTemplate createPolicyTypes(@NonNull final ToscaServiceTemplate serviceTemplate)
             throws PfModelException {
         assertInitialized();
-        return new AuthorativeToscaProvider().createPolicyTypes(pfDao, serviceTemplate);
+        return new AuthorativeToscaProvider().createPolicyTypes(getPfDao(), serviceTemplate);
     }
 
     @Override
     public ToscaServiceTemplate updatePolicyTypes(@NonNull final ToscaServiceTemplate serviceTemplate)
             throws PfModelException {
         assertInitialized();
-        return new AuthorativeToscaProvider().updatePolicyTypes(pfDao, serviceTemplate);
+        return new AuthorativeToscaProvider().updatePolicyTypes(getPfDao(), serviceTemplate);
     }
 
     @Override
@@ -217,45 +149,45 @@ public class DatabasePolicyModelsProviderImpl implements PolicyModelsProvider {
         ToscaConceptIdentifier policyTypeIdentifier = new ToscaConceptIdentifier(name, version);
         assertPolicyTypeNotSupportedInPdpGroup(policyTypeIdentifier);
 
-        return new AuthorativeToscaProvider().deletePolicyType(pfDao, name, version);
+        return new AuthorativeToscaProvider().deletePolicyType(getPfDao(), name, version);
     }
 
     @Override
     public ToscaServiceTemplate getPolicies(final String name, final String version) throws PfModelException {
         assertInitialized();
-        return new AuthorativeToscaProvider().getPolicies(pfDao, name, version);
+        return new AuthorativeToscaProvider().getPolicies(getPfDao(), name, version);
     }
 
     @Override
     public List<ToscaPolicy> getPolicyList(final String name, final String version) throws PfModelException {
         assertInitialized();
-        return new AuthorativeToscaProvider().getPolicyList(pfDao, name, version);
+        return new AuthorativeToscaProvider().getPolicyList(getPfDao(), name, version);
     }
 
     @Override
     public ToscaServiceTemplate getFilteredPolicies(@NonNull ToscaPolicyFilter filter) throws PfModelException {
         assertInitialized();
-        return new AuthorativeToscaProvider().getFilteredPolicies(pfDao, filter);
+        return new AuthorativeToscaProvider().getFilteredPolicies(getPfDao(), filter);
     }
 
     @Override
     public List<ToscaPolicy> getFilteredPolicyList(@NonNull ToscaPolicyFilter filter) throws PfModelException {
         assertInitialized();
-        return new AuthorativeToscaProvider().getFilteredPolicyList(pfDao, filter);
+        return new AuthorativeToscaProvider().getFilteredPolicyList(getPfDao(), filter);
     }
 
     @Override
     public ToscaServiceTemplate createPolicies(@NonNull final ToscaServiceTemplate serviceTemplate)
             throws PfModelException {
         assertInitialized();
-        return new AuthorativeToscaProvider().createPolicies(pfDao, serviceTemplate);
+        return new AuthorativeToscaProvider().createPolicies(getPfDao(), serviceTemplate);
     }
 
     @Override
     public ToscaServiceTemplate updatePolicies(@NonNull final ToscaServiceTemplate serviceTemplate)
             throws PfModelException {
         assertInitialized();
-        return new AuthorativeToscaProvider().updatePolicies(pfDao, serviceTemplate);
+        return new AuthorativeToscaProvider().updatePolicies(getPfDao(), serviceTemplate);
     }
 
     @Override
@@ -266,56 +198,56 @@ public class DatabasePolicyModelsProviderImpl implements PolicyModelsProvider {
         ToscaConceptIdentifier policyIdentifier = new ToscaConceptIdentifier(name, version);
         assertPolicyNotDeployedInPdpGroup(policyIdentifier);
 
-        return new AuthorativeToscaProvider().deletePolicy(pfDao, name, version);
+        return new AuthorativeToscaProvider().deletePolicy(getPfDao(), name, version);
     }
 
     @Override
     public List<PdpGroup> getPdpGroups(final String name) throws PfModelException {
         assertInitialized();
-        return new PdpProvider().getPdpGroups(pfDao, name);
+        return new PdpProvider().getPdpGroups(getPfDao(), name);
     }
 
     @Override
     public List<PdpGroup> getFilteredPdpGroups(@NonNull PdpGroupFilter filter) throws PfModelException {
         assertInitialized();
-        return new PdpProvider().getFilteredPdpGroups(pfDao, filter);
+        return new PdpProvider().getFilteredPdpGroups(getPfDao(), filter);
     }
 
     @Override
     public List<PdpGroup> createPdpGroups(@NonNull final List<PdpGroup> pdpGroups) throws PfModelException {
         assertInitialized();
-        return new PdpProvider().createPdpGroups(pfDao, pdpGroups);
+        return new PdpProvider().createPdpGroups(getPfDao(), pdpGroups);
     }
 
     @Override
     public List<PdpGroup> updatePdpGroups(@NonNull final List<PdpGroup> pdpGroups) throws PfModelException {
         assertInitialized();
-        return new PdpProvider().updatePdpGroups(pfDao, pdpGroups);
+        return new PdpProvider().updatePdpGroups(getPfDao(), pdpGroups);
     }
 
     @Override
     public void updatePdpSubGroup(@NonNull final String pdpGroupName, @NonNull final PdpSubGroup pdpSubGroup)
             throws PfModelException {
         assertInitialized();
-        new PdpProvider().updatePdpSubGroup(pfDao, pdpGroupName, pdpSubGroup);
+        new PdpProvider().updatePdpSubGroup(getPfDao(), pdpGroupName, pdpSubGroup);
     }
 
     @Override
     public void updatePdp(@NonNull String pdpGroupName, @NonNull String pdpSubGroup, @NonNull Pdp pdp)
             throws PfModelException {
-        new PdpProvider().updatePdp(pfDao, pdpGroupName, pdpSubGroup, pdp);
+        new PdpProvider().updatePdp(getPfDao(), pdpGroupName, pdpSubGroup, pdp);
     }
 
     @Override
     public PdpGroup deletePdpGroup(@NonNull final String name) throws PfModelException {
         assertInitialized();
-        return new PdpProvider().deletePdpGroup(pfDao, name);
+        return new PdpProvider().deletePdpGroup(getPfDao(), name);
     }
 
     @Override
     public List<PdpStatistics> getPdpStatistics(final String name, final Date timestamp) throws PfModelException {
         assertInitialized();
-        return new PdpStatisticsProvider().getPdpStatistics(pfDao, name, timestamp);
+        return new PdpStatisticsProvider().getPdpStatistics(getPfDao(), name, timestamp);
     }
 
     @Override
@@ -323,7 +255,7 @@ public class DatabasePolicyModelsProviderImpl implements PolicyModelsProvider {
             final String pdpSubGroup, final Date startTimeStamp, final Date endTimeStamp, final String sortOrder,
             final int getRecordNum) throws PfModelException {
         assertInitialized();
-        return new PdpStatisticsProvider().getFilteredPdpStatistics(pfDao, name, pdpGroupName, pdpSubGroup,
+        return new PdpStatisticsProvider().getFilteredPdpStatistics(getPfDao(), name, pdpGroupName, pdpSubGroup,
                 startTimeStamp, endTimeStamp, sortOrder, getRecordNum);
     }
 
@@ -331,57 +263,56 @@ public class DatabasePolicyModelsProviderImpl implements PolicyModelsProvider {
     public List<PdpStatistics> createPdpStatistics(@NonNull final List<PdpStatistics> pdpStatisticsList)
             throws PfModelException {
         assertInitialized();
-        return new PdpStatisticsProvider().createPdpStatistics(pfDao, pdpStatisticsList);
+        return new PdpStatisticsProvider().createPdpStatistics(getPfDao(), pdpStatisticsList);
     }
 
     @Override
     public List<PdpStatistics> updatePdpStatistics(@NonNull final List<PdpStatistics> pdpStatisticsList)
             throws PfModelException {
         assertInitialized();
-        return new PdpStatisticsProvider().updatePdpStatistics(pfDao, pdpStatisticsList);
+        return new PdpStatisticsProvider().updatePdpStatistics(getPfDao(), pdpStatisticsList);
     }
 
     @Override
     public List<PdpStatistics> deletePdpStatistics(@NonNull final String name, final Date timestamp)
             throws PfModelException {
         assertInitialized();
-        return new PdpStatisticsProvider().deletePdpStatistics(pfDao, name, timestamp);
+        return new PdpStatisticsProvider().deletePdpStatistics(getPfDao(), name, timestamp);
     }
 
     @Override
     public List<PdpPolicyStatus> getAllPolicyStatus() throws PfModelException {
         assertInitialized();
-        return new PdpProvider().getAllPolicyStatus(pfDao);
+        return new PdpProvider().getAllPolicyStatus(getPfDao());
     }
 
     @Override
     public List<PdpPolicyStatus> getAllPolicyStatus(@NonNull ToscaConceptIdentifierOptVersion policy)
                     throws PfModelException {
         assertInitialized();
-        return new PdpProvider().getAllPolicyStatus(pfDao, policy);
+        return new PdpProvider().getAllPolicyStatus(getPfDao(), policy);
     }
 
     @Override
     public List<PdpPolicyStatus> getGroupPolicyStatus(@NonNull String groupName)
                     throws PfModelException {
         assertInitialized();
-        return new PdpProvider().getGroupPolicyStatus(pfDao, groupName);
+        return new PdpProvider().getGroupPolicyStatus(getPfDao(), groupName);
     }
 
     @Override
     public void cudPolicyStatus(Collection<PdpPolicyStatus> createObjs,
                     Collection<PdpPolicyStatus> updateObjs, Collection<PdpPolicyStatus> deleteObjs) {
         assertInitialized();
-        new PdpProvider().cudPolicyStatus(pfDao, createObjs, updateObjs, deleteObjs);
+        new PdpProvider().cudPolicyStatus(getPfDao(), createObjs, updateObjs, deleteObjs);
     }
 
     /**
      * Check if the model provider is initialized.
      */
     private void assertInitialized() {
-        if (pfDao == null) {
+        if (getPfDao() == null) {
             String errorMessage = "policy models provider is not initilaized";
-            LOGGER.warn(errorMessage);
             throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMessage);
         }
     }