2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2019 Nordix Foundation.
4 * ================================================================================
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.policy.models.dao.impl;
23 import java.util.Collection;
24 import java.util.Collections;
25 import java.util.List;
27 import javax.persistence.EntityManager;
28 import javax.persistence.EntityManagerFactory;
29 import javax.persistence.Persistence;
31 import org.onap.policy.models.base.PfConcept;
32 import org.onap.policy.models.base.PfConceptKey;
33 import org.onap.policy.models.base.PfModelException;
34 import org.onap.policy.models.base.PfModelRuntimeException;
35 import org.onap.policy.models.base.PfReferenceKey;
36 import org.onap.policy.models.dao.DaoParameters;
37 import org.onap.policy.models.dao.PfDao;
38 import org.slf4j.Logger;
39 import org.slf4j.LoggerFactory;
42 * The Class DefaultPfDao is an JPA implementation of the {@link PfDao} class for Policy Framework
43 * concepts ({@link PfConcept}). It uses the default JPA implementation in the javax
44 * {@link Persistence} class.
46 public class DefaultPfDao implements PfDao {
47 private static final Logger LOGGER = LoggerFactory.getLogger(DefaultPfDao.class);
49 private static final String SELECT_C_FROM = "SELECT c FROM ";
50 private static final String AND_C_KEY_LOCAL_NAME = "' AND c.key.localName='";
51 private static final String AND_C_KEY_PARENT_KEY_VERSION = "' AND c.key.parentKeyVersion='";
52 private static final String C_WHERE_C_KEY_PARENT_KEY_NAME = " c WHERE c.key.parentKeyName='";
53 private static final String AND_C_KEY_VERSION = "' AND c.key.version='";
54 private static final String C_WHERE_C_KEY_NAME = " c WHERE c.key.name='";
55 private static final String DELETE_FROM = "DELETE FROM ";
57 // Entity manager for JPA
58 private EntityManagerFactory emf = null;
61 public void init(final DaoParameters daoParameters) throws PfModelException {
62 if (daoParameters == null || daoParameters.getPersistenceUnit() == null) {
63 LOGGER.error("Policy Framework persistence unit parameter not set");
64 throw new PfModelException("Policy Framework persistence unit parameter not set");
67 LOGGER.debug("Creating Policy Framework persistence unit \"{}\" . . .", daoParameters.getPersistenceUnit());
69 emf = Persistence.createEntityManagerFactory(daoParameters.getPersistenceUnit(),
70 daoParameters.getJdbcProperties());
71 } catch (final Exception ex) {
72 String errorMessage = "Creation of Policy Framework persistence unit \""
73 + daoParameters.getPersistenceUnit() + "\" failed";
74 LOGGER.warn(errorMessage, ex);
75 throw new PfModelException(errorMessage, ex);
77 LOGGER.debug("Created Policy Framework persistence unit \"{}\"", daoParameters.getPersistenceUnit());
81 * Gets the entity manager for this DAO.
83 * @return the entity manager
85 protected final synchronized EntityManager getEntityManager() {
87 LOGGER.warn("Policy Framework DAO has not been initialized");
88 throw new PfModelRuntimeException("Policy Framework DAO has not been initialized");
91 return emf.createEntityManager();
95 public final void close() {
102 public <T extends PfConcept> void create(final T obj) {
106 final EntityManager mg = getEntityManager();
108 mg.getTransaction().begin();
110 mg.getTransaction().commit();
117 public <T extends PfConcept> void delete(final T obj) {
121 final EntityManager mg = getEntityManager();
123 mg.getTransaction().begin();
124 mg.remove(mg.contains(obj) ? obj : mg.merge(obj));
125 mg.getTransaction().commit();
132 public <T extends PfConcept> void delete(final Class<T> someClass, final PfConceptKey key) {
136 final EntityManager mg = getEntityManager();
138 mg.getTransaction().begin();
139 mg.createQuery(DELETE_FROM + someClass.getSimpleName() + C_WHERE_C_KEY_NAME + key.getName()
140 + AND_C_KEY_VERSION + key.getVersion() + "'", someClass).executeUpdate();
141 mg.getTransaction().commit();
148 public <T extends PfConcept> void delete(final Class<T> someClass, final PfReferenceKey key) {
152 final EntityManager mg = getEntityManager();
154 mg.getTransaction().begin();
155 mg.createQuery(DELETE_FROM + someClass.getSimpleName() + C_WHERE_C_KEY_PARENT_KEY_NAME
156 + key.getParentKeyName() + AND_C_KEY_PARENT_KEY_VERSION + key.getParentKeyVersion()
157 + AND_C_KEY_LOCAL_NAME + key.getLocalName() + "'", someClass).executeUpdate();
158 mg.getTransaction().commit();
165 public <T extends PfConcept> void createCollection(final Collection<T> objs) {
166 if (objs == null || objs.isEmpty()) {
169 final EntityManager mg = getEntityManager();
171 mg.getTransaction().begin();
172 for (final T t : objs) {
175 mg.getTransaction().commit();
182 public <T extends PfConcept> void deleteCollection(final Collection<T> objs) {
183 if (objs == null || objs.isEmpty()) {
186 final EntityManager mg = getEntityManager();
188 mg.getTransaction().begin();
189 for (final T t : objs) {
190 mg.remove(mg.contains(t) ? t : mg.merge(t));
192 mg.getTransaction().commit();
199 public <T extends PfConcept> int deleteByConceptKey(final Class<T> someClass,
200 final Collection<PfConceptKey> keys) {
201 if (keys == null || keys.isEmpty()) {
204 int deletedCount = 0;
205 final EntityManager mg = getEntityManager();
207 mg.getTransaction().begin();
208 for (final PfConceptKey key : keys) {
209 deletedCount += mg.createQuery(DELETE_FROM + someClass.getSimpleName() + C_WHERE_C_KEY_NAME
210 + key.getName() + AND_C_KEY_VERSION + key.getVersion() + "'", someClass).executeUpdate();
212 mg.getTransaction().commit();
220 public <T extends PfConcept> int deleteByReferenceKey(final Class<T> someClass,
221 final Collection<PfReferenceKey> keys) {
222 if (keys == null || keys.isEmpty()) {
225 int deletedCount = 0;
226 final EntityManager mg = getEntityManager();
228 mg.getTransaction().begin();
229 for (final PfReferenceKey key : keys) {
232 DELETE_FROM + someClass.getSimpleName() + C_WHERE_C_KEY_PARENT_KEY_NAME
233 + key.getParentKeyName() + AND_C_KEY_PARENT_KEY_VERSION
234 + key.getParentKeyVersion() + AND_C_KEY_LOCAL_NAME + key.getLocalName() + "'",
235 someClass).executeUpdate();
237 mg.getTransaction().commit();
245 public <T extends PfConcept> void deleteAll(final Class<T> someClass) {
246 final EntityManager mg = getEntityManager();
248 mg.getTransaction().begin();
249 mg.createQuery(DELETE_FROM + someClass.getSimpleName() + " c ", someClass).executeUpdate();
250 mg.getTransaction().commit();
257 public <T extends PfConcept> T get(final Class<T> someClass, final PfConceptKey key) {
258 if (someClass == null) {
261 final EntityManager mg = getEntityManager();
263 final T t = mg.find(someClass, key);
265 // This clone is created to force the JPA DAO to recurse down through the object
267 final T clonedT = someClass.newInstance();
270 } catch (final Exception e) {
271 LOGGER.warn("Could not clone object of class \"" + someClass.getCanonicalName() + "\"", e);
283 public <T extends PfConcept> T get(final Class<T> someClass, final PfReferenceKey key) {
284 if (someClass == null) {
287 final EntityManager mg = getEntityManager();
289 final T t = mg.find(someClass, key);
292 final T clonedT = someClass.newInstance();
295 } catch (final Exception e) {
296 LOGGER.warn("Could not clone object of class \"" + someClass.getCanonicalName() + "\"", e);
308 public <T extends PfConcept> List<T> getAll(final Class<T> someClass) {
309 if (someClass == null) {
310 return Collections.emptyList();
312 final EntityManager mg = getEntityManager();
314 return mg.createQuery(SELECT_C_FROM + someClass.getSimpleName() + " c", someClass).getResultList();
321 public <T extends PfConcept> List<T> getAll(final Class<T> someClass, final PfConceptKey parentKey) {
322 if (someClass == null) {
323 return Collections.emptyList();
325 final EntityManager mg = getEntityManager();
329 SELECT_C_FROM + someClass.getSimpleName() + C_WHERE_C_KEY_PARENT_KEY_NAME
330 + parentKey.getName() + AND_C_KEY_PARENT_KEY_VERSION + parentKey.getVersion() + "'",
339 public <T extends PfConcept> T getConcept(final Class<T> someClass, final PfConceptKey key) {
340 if (someClass == null || key == null) {
343 final EntityManager mg = getEntityManager();
346 ret = mg.createQuery(SELECT_C_FROM + someClass.getSimpleName() + C_WHERE_C_KEY_NAME + key.getName()
347 + AND_C_KEY_VERSION + key.getVersion() + "'", someClass).getResultList();
351 if (ret == null || ret.isEmpty()) {
354 if (ret.size() > 1) {
355 throw new IllegalArgumentException("More than one result was returned for search for " + someClass
356 + " with key " + key.getId() + ": " + ret);
362 public <T extends PfConcept> T getConcept(final Class<T> someClass, final PfReferenceKey key) {
363 if (someClass == null || key == null) {
366 final EntityManager mg = getEntityManager();
369 ret = mg.createQuery(SELECT_C_FROM + someClass.getSimpleName() + C_WHERE_C_KEY_PARENT_KEY_NAME
370 + key.getParentKeyName() + AND_C_KEY_PARENT_KEY_VERSION + key.getParentKeyVersion()
371 + AND_C_KEY_LOCAL_NAME + key.getLocalName() + "'", someClass).getResultList();
375 if (ret == null || ret.isEmpty()) {
378 if (ret.size() > 1) {
379 throw new IllegalArgumentException("More than one result was returned for search for " + someClass
380 + " with key " + key.getId() + ": " + ret);
386 public <T extends PfConcept> T update(final T obj) {
387 final EntityManager mg = getEntityManager();
390 mg.getTransaction().begin();
393 mg.getTransaction().commit();
401 public <T extends PfConcept> long size(final Class<T> someClass) {
402 if (someClass == null) {
405 final EntityManager mg = getEntityManager();
408 size = mg.createQuery("SELECT COUNT(c) FROM " + someClass.getSimpleName() + " c", Long.class)