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