Changes for checkstyle 8.32
[policy/apex-pdp.git] / model / basic-model / src / main / java / org / onap / policy / apex / model / basicmodel / dao / impl / DefaultApexDao.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
4  *  Modifications Copyright (C) 2019-2020 Nordix Foundation.
5  * ================================================================================
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * SPDX-License-Identifier: Apache-2.0
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.policy.apex.model.basicmodel.dao.impl;
23
24 import java.util.Collection;
25 import java.util.Collections;
26 import java.util.List;
27 import javax.persistence.EntityManager;
28 import javax.persistence.EntityManagerFactory;
29 import javax.persistence.Persistence;
30 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
31 import org.onap.policy.apex.model.basicmodel.concepts.ApexRuntimeException;
32 import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
33 import org.onap.policy.apex.model.basicmodel.concepts.AxConcept;
34 import org.onap.policy.apex.model.basicmodel.concepts.AxReferenceKey;
35 import org.onap.policy.apex.model.basicmodel.dao.ApexDao;
36 import org.onap.policy.apex.model.basicmodel.dao.DaoParameters;
37 import org.slf4j.ext.XLogger;
38 import org.slf4j.ext.XLoggerFactory;
39
40 /**
41  * The Class DefaultApexDao is an JPA implementation of the {@link ApexDao} class for Apex concepts ({@link AxConcept}).
42  * It uses the default JPA implementation in the javax {@link Persistence} class.
43  *
44  *
45  * @author Sergey Sachkov (sergey.sachkov@ericsson.com)
46  */
47 public class DefaultApexDao implements ApexDao {
48     private static final XLogger LOGGER = XLoggerFactory.getXLogger(DefaultApexDao.class);
49
50     private static final String SELECT_C_FROM = "SELECT c FROM ";
51     private static final String AND_C_KEY_LOCAL_NAME = "' AND c.key.localName='";
52     private static final String AND_C_KEY_PARENT_KEY_VERSION = "' AND c.key.parentKeyVersion='";
53     private static final String C_WHERE_C_KEY_PARENT_KEY_NAME = " c WHERE c.key.parentKeyName='";
54     private static final String AND_C_KEY_VERSION = "' AND c.key.version='";
55     private static final String C_WHERE_C_KEY_NAME = " c WHERE c.key.name='";
56     private static final String DELETE_FROM = "DELETE FROM ";
57
58     // Entity manager for JPA
59     private EntityManagerFactory emf = null;
60
61     /**
62      * {@inheritDoc}.
63      */
64     @Override
65     public void init(final DaoParameters daoParameters) throws ApexException {
66         if (daoParameters == null || daoParameters.getPersistenceUnit() == null) {
67             LOGGER.error("Apex persistence unit parameter not set");
68             throw new ApexException("Apex persistence unit parameter not set");
69         }
70
71         LOGGER.debug("Creating Apex persistence unit \"" + daoParameters.getPersistenceUnit() + "\" . . .");
72         try {
73             emf = Persistence.createEntityManagerFactory(daoParameters.getPersistenceUnit(),
74                     daoParameters.getJdbcProperties());
75         } catch (final Exception e) {
76             LOGGER.warn("Creation of Apex persistence unit \"" + daoParameters.getPersistenceUnit() + "\" failed", e);
77             throw new ApexException(
78                     "Creation of Apex persistence unit \"" + daoParameters.getPersistenceUnit() + "\" failed", e);
79         }
80         LOGGER.debug("Created Apex persistence unit \"" + daoParameters.getPersistenceUnit() + "\"");
81     }
82
83     /**
84      * Gets the entity manager for this DAO.
85      *
86      * @return the entity manager
87      */
88     protected final synchronized EntityManager getEntityManager() {
89         if (emf == null) {
90             LOGGER.warn("Apex DAO has not been initialized");
91             throw new ApexRuntimeException("Apex DAO has not been initialized");
92         }
93
94         return emf.createEntityManager();
95     }
96
97     /**
98      * {@inheritDoc}.
99      */
100     @Override
101     public final void close() {
102         if (emf != null) {
103             emf.close();
104         }
105     }
106
107     /**
108      * {@inheritDoc}.
109      */
110     @Override
111     public <T extends AxConcept> void create(final T obj) {
112         if (obj == null) {
113             return;
114         }
115         final EntityManager mg = getEntityManager();
116         try {
117             mg.getTransaction().begin();
118             mg.merge(obj);
119             mg.getTransaction().commit();
120         } finally {
121             mg.close();
122         }
123     }
124
125     /**
126      * {@inheritDoc}.
127      */
128     @Override
129     public <T extends AxConcept> void delete(final T obj) {
130         if (obj == null) {
131             return;
132         }
133         final EntityManager mg = getEntityManager();
134         try {
135             mg.getTransaction().begin();
136             mg.remove(mg.contains(obj) ? obj : mg.merge(obj));
137             mg.getTransaction().commit();
138         } finally {
139             mg.close();
140         }
141     }
142
143     /**
144      * {@inheritDoc}.
145      */
146     @Override
147     public <T extends AxConcept> void delete(final Class<T> someClass, final AxArtifactKey key) {
148         if (key == null) {
149             return;
150         }
151         final EntityManager mg = getEntityManager();
152         try {
153             mg.getTransaction().begin();
154             mg.createQuery(DELETE_FROM + someClass.getSimpleName() + C_WHERE_C_KEY_NAME + key.getName()
155                     + AND_C_KEY_VERSION + key.getVersion() + "'", someClass).executeUpdate();
156             mg.getTransaction().commit();
157         } finally {
158             mg.close();
159         }
160     }
161
162     /**
163      * {@inheritDoc}.
164      */
165     @Override
166     public <T extends AxConcept> void delete(final Class<T> someClass, final AxReferenceKey key) {
167         if (key == null) {
168             return;
169         }
170         final EntityManager mg = getEntityManager();
171         try {
172             mg.getTransaction().begin();
173             mg.createQuery(DELETE_FROM + someClass.getSimpleName() + C_WHERE_C_KEY_PARENT_KEY_NAME
174                     + key.getParentKeyName() + AND_C_KEY_PARENT_KEY_VERSION + key.getParentKeyVersion()
175                     + AND_C_KEY_LOCAL_NAME + key.getLocalName() + "'", someClass).executeUpdate();
176             mg.getTransaction().commit();
177         } finally {
178             mg.close();
179         }
180     }
181
182     /**
183      * {@inheritDoc}.
184      */
185     @Override
186     public <T extends AxConcept> void createCollection(final Collection<T> objs) {
187         if (objs == null || objs.isEmpty()) {
188             return;
189         }
190         final EntityManager mg = getEntityManager();
191         try {
192             mg.getTransaction().begin();
193             for (final T t : objs) {
194                 mg.merge(t);
195             }
196             mg.getTransaction().commit();
197         } finally {
198             mg.close();
199         }
200     }
201
202     /**
203      * {@inheritDoc}.
204      */
205     @Override
206     public <T extends AxConcept> void deleteCollection(final Collection<T> objs) {
207         if (objs == null || objs.isEmpty()) {
208             return;
209         }
210         final EntityManager mg = getEntityManager();
211         try {
212             mg.getTransaction().begin();
213             for (final T t : objs) {
214                 mg.remove(mg.contains(t) ? t : mg.merge(t));
215             }
216             mg.getTransaction().commit();
217         } finally {
218             mg.close();
219         }
220     }
221
222     /**
223      * {@inheritDoc}.
224      */
225     @Override
226     public <T extends AxConcept> int deleteByArtifactKey(final Class<T> someClass,
227             final Collection<AxArtifactKey> keys) {
228         if (keys == null || keys.isEmpty()) {
229             return 0;
230         }
231         int deletedCount = 0;
232         final EntityManager mg = getEntityManager();
233         try {
234             mg.getTransaction().begin();
235             for (final AxArtifactKey key : keys) {
236                 deletedCount += mg.createQuery(DELETE_FROM + someClass.getSimpleName() + C_WHERE_C_KEY_NAME
237                         + key.getName() + AND_C_KEY_VERSION + key.getVersion() + "'", someClass).executeUpdate();
238             }
239             mg.getTransaction().commit();
240         } finally {
241             mg.close();
242         }
243         return deletedCount;
244     }
245
246     /**
247      * {@inheritDoc}.
248      */
249     @Override
250     public <T extends AxConcept> int deleteByReferenceKey(final Class<T> someClass,
251             final Collection<AxReferenceKey> keys) {
252         if (keys == null || keys.isEmpty()) {
253             return 0;
254         }
255         int deletedCount = 0;
256         final EntityManager mg = getEntityManager();
257         try {
258             mg.getTransaction().begin();
259             for (final AxReferenceKey key : keys) {
260                 deletedCount +=
261                         mg.createQuery(
262                                 DELETE_FROM + someClass.getSimpleName() + C_WHERE_C_KEY_PARENT_KEY_NAME
263                                         + key.getParentKeyName() + AND_C_KEY_PARENT_KEY_VERSION
264                                         + key.getParentKeyVersion() + AND_C_KEY_LOCAL_NAME + key.getLocalName() + "'",
265                                 someClass).executeUpdate();
266             }
267             mg.getTransaction().commit();
268         } finally {
269             mg.close();
270         }
271         return deletedCount;
272     }
273
274     /**
275      * {@inheritDoc}.
276      */
277     @Override
278     public <T extends AxConcept> void deleteAll(final Class<T> someClass) {
279         final EntityManager mg = getEntityManager();
280         try {
281             mg.getTransaction().begin();
282             mg.createQuery(DELETE_FROM + someClass.getSimpleName() + " c ", someClass).executeUpdate();
283             mg.getTransaction().commit();
284         } finally {
285             mg.close();
286         }
287     }
288
289     /**
290      * {@inheritDoc}.
291      */
292     @Override
293     public <T extends AxConcept> T get(final Class<T> someClass, final AxArtifactKey key) {
294         if (someClass == null) {
295             return null;
296         }
297         final EntityManager mg = getEntityManager();
298         try {
299             final T t = mg.find(someClass, key);
300             if (t != null) {
301                 // This clone is created to force the JPA DAO to recurse down through the object
302                 try {
303                     final T clonedT = someClass.getDeclaredConstructor().newInstance();
304                     t.copyTo(clonedT);
305                     return clonedT;
306                 } catch (final Exception e) {
307                     LOGGER.warn("Could not clone object of class \"" + someClass.getName() + "\"", e);
308                     return null;
309                 }
310             } else {
311                 return null;
312             }
313         } finally {
314             mg.close();
315         }
316     }
317
318     /**
319      * {@inheritDoc}.
320      */
321     @Override
322     public <T extends AxConcept> T get(final Class<T> someClass, final AxReferenceKey key) {
323         if (someClass == null) {
324             return null;
325         }
326         final EntityManager mg = getEntityManager();
327         try {
328             final T t = mg.find(someClass, key);
329             if (t != null) {
330                 try {
331                     final T clonedT = someClass.getDeclaredConstructor().newInstance();
332                     t.copyTo(clonedT);
333                     return clonedT;
334                 } catch (final Exception e) {
335                     LOGGER.warn("Could not clone object of class \"" + someClass.getName() + "\"", e);
336                     return null;
337                 }
338             } else {
339                 return null;
340             }
341         } finally {
342             mg.close();
343         }
344     }
345
346     /**
347      * {@inheritDoc}.
348      */
349     @Override
350     public <T extends AxConcept> List<T> getAll(final Class<T> someClass) {
351         if (someClass == null) {
352             return Collections.emptyList();
353         }
354         final EntityManager mg = getEntityManager();
355         try {
356             return mg.createQuery(SELECT_C_FROM + someClass.getSimpleName() + " c", someClass).getResultList();
357         } finally {
358             mg.close();
359         }
360     }
361
362     /**
363      * {@inheritDoc}.
364      */
365     @Override
366     public <T extends AxConcept> List<T> getAll(final Class<T> someClass, final AxArtifactKey parentKey) {
367         if (someClass == null) {
368             return Collections.emptyList();
369         }
370         final EntityManager mg = getEntityManager();
371         try {
372             return mg
373                     .createQuery(
374                             SELECT_C_FROM + someClass.getSimpleName() + C_WHERE_C_KEY_PARENT_KEY_NAME
375                                     + parentKey.getName() + AND_C_KEY_PARENT_KEY_VERSION + parentKey.getVersion() + "'",
376                             someClass)
377                     .getResultList();
378         } finally {
379             mg.close();
380         }
381     }
382
383     /**
384      * {@inheritDoc}.
385      */
386     @Override
387     public <T extends AxConcept> T getArtifact(final Class<T> someClass, final AxArtifactKey key) {
388         if (someClass == null || key == null) {
389             return null;
390         }
391         final EntityManager mg = getEntityManager();
392         List<T> ret;
393         try {
394             ret = mg.createQuery(SELECT_C_FROM + someClass.getSimpleName() + C_WHERE_C_KEY_NAME + key.getName()
395                     + AND_C_KEY_VERSION + key.getVersion() + "'", someClass).getResultList();
396         } finally {
397             mg.close();
398         }
399         if (ret == null || ret.isEmpty()) {
400             return null;
401         }
402         if (ret.size() > 1) {
403             throw new IllegalArgumentException("More than one result was returned for search for " + someClass
404                     + " with key " + key.getId() + ": " + ret);
405         }
406         return ret.get(0);
407     }
408
409     /**
410      * {@inheritDoc}.
411      */
412     @Override
413     public <T extends AxConcept> T getArtifact(final Class<T> someClass, final AxReferenceKey key) {
414         if (someClass == null || key == null) {
415             return null;
416         }
417         final EntityManager mg = getEntityManager();
418         List<T> ret;
419         try {
420             ret = mg.createQuery(SELECT_C_FROM + someClass.getSimpleName() + C_WHERE_C_KEY_PARENT_KEY_NAME
421                     + key.getParentKeyName() + AND_C_KEY_PARENT_KEY_VERSION + key.getParentKeyVersion()
422                     + AND_C_KEY_LOCAL_NAME + key.getLocalName() + "'", someClass).getResultList();
423         } finally {
424             mg.close();
425         }
426         if (ret == null || ret.isEmpty()) {
427             return null;
428         }
429         if (ret.size() > 1) {
430             throw new IllegalArgumentException("More than one result was returned for search for " + someClass
431                     + " with key " + key.getId() + ": " + ret);
432         }
433         return ret.get(0);
434     }
435
436     /**
437      * {@inheritDoc}.
438      */
439     @Override
440     public <T extends AxConcept> T update(final T obj) {
441         final EntityManager mg = getEntityManager();
442         T ret;
443         try {
444             mg.getTransaction().begin();
445             ret = mg.merge(obj);
446             mg.flush();
447             mg.getTransaction().commit();
448         } finally {
449             mg.close();
450         }
451         return ret;
452     }
453
454     /**
455      * {@inheritDoc}.
456      */
457     @Override
458     public <T extends AxConcept> long size(final Class<T> someClass) {
459         if (someClass == null) {
460             return 0;
461         }
462         final EntityManager mg = getEntityManager();
463         long size = 0;
464         try {
465             size = mg.createQuery("SELECT COUNT(c) FROM " + someClass.getSimpleName() + " c", Long.class)
466                     .getSingleResult();
467         } finally {
468             mg.close();
469         }
470         return size;
471     }
472 }