# HG changeset patch # User Raimund Renkert # Date 1424096088 -3600 # Node ID 51784d74a85ba60973255b0d5fd77baaeecc4c2d # Parent dbeb56e913fd9d620fa183aafc3a68e3fa2abc82 Refactored data access. CDI is much cleaner now. diff -r dbeb56e913fd -r 51784d74a85b src/main/java/de/intevation/lada/util/annotation/RepositoryConfig.java --- a/src/main/java/de/intevation/lada/util/annotation/RepositoryConfig.java Mon Feb 16 15:13:08 2015 +0100 +++ b/src/main/java/de/intevation/lada/util/annotation/RepositoryConfig.java Mon Feb 16 15:14:48 2015 +0100 @@ -1,20 +1,21 @@ -/* Copyright (C) 2013 by Bundesamt fuer Strahlenschutz - * Software engineering by Intevation GmbH - * - * This file is Free Software under the GNU GPL (v>=3) - * and comes with ABSOLUTELY NO WARRANTY! Check out - * the documentation coming with IMIS-Labordaten-Application for details. - */ package de.intevation.lada.util.annotation; +import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import javax.inject.Qualifier; import de.intevation.lada.util.data.RepositoryType; - +@Qualifier @Retention(RetentionPolicy.RUNTIME) +@Target({ + ElementType.TYPE, + ElementType.FIELD, + ElementType.METHOD, + ElementType.PARAMETER}) public @interface RepositoryConfig { RepositoryType type() default RepositoryType.RO; - String dataSource() default ""; } diff -r dbeb56e913fd -r 51784d74a85b src/main/java/de/intevation/lada/util/data/AbstractRepository.java --- a/src/main/java/de/intevation/lada/util/data/AbstractRepository.java Mon Feb 16 15:13:08 2015 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,104 +0,0 @@ -/* Copyright (C) 2013 by Bundesamt fuer Strahlenschutz - * Software engineering by Intevation GmbH - * - * This file is Free Software under the GNU GPL (v>=3) - * and comes with ABSOLUTELY NO WARRANTY! Check out - * the documentation coming with IMIS-Labordaten-Application for details. - */ -package de.intevation.lada.util.data; - -import javax.ejb.EJBTransactionRolledbackException; -import javax.ejb.Stateless; -import javax.ejb.TransactionAttribute; -import javax.ejb.TransactionAttributeType; -import javax.inject.Inject; -import javax.persistence.EntityExistsException; -import javax.persistence.EntityManager; -import javax.persistence.Query; -import javax.persistence.TransactionRequiredException; - -/** - * Abstract class implementing low level data operations. - * - * @author Raimund Renkert - */ -@Stateless -public abstract class AbstractRepository -implements Repository -{ - @Inject - protected EntityManagerProducer emp; - - protected String jndiPath; - - /** - * Create object in the database. - * This operation can not be undone. - * - * @param object The object to create - * - * @throws EntityExistsException - * @throws IllegalArgumentException - * @throws EJBTransactionRolledbackException - * @throws TransactionRequiredException - */ - @TransactionAttribute(TransactionAttributeType.REQUIRED) - protected void persistInDatabase(Object object, String dataSource) - throws EntityExistsException, - IllegalArgumentException, - EJBTransactionRolledbackException, - TransactionRequiredException - { - emp.entityManager(dataSource).persist(object); - } - - /** - * Create object in the database. - * This operation can not be undone. - * - * @param object The object to create - * - * @throws EntityExistsException - * @throws IllegalArgumentException - * @throws EJBTransactionRolledbackException - * @throws TransactionRequiredException - */ - @TransactionAttribute(TransactionAttributeType.REQUIRED) - protected void updateInDatabase(Object object, String dataSource) - throws EntityExistsException, - IllegalArgumentException, - EJBTransactionRolledbackException, - TransactionRequiredException - { - emp.entityManager(dataSource).merge(object); - } - - /** - * Remove an object from the datebase. - * This operation can not be undone. - * - * @param object The object to remove - * - * @throws IllegalArgumentException - * @throws TransactionRequiredException - */ - @TransactionAttribute(TransactionAttributeType.REQUIRED) - protected void removeFromDatabase(Object object, String dataSource) - throws IllegalArgumentException, - TransactionRequiredException - { - EntityManager em = emp.entityManager(dataSource); - em.remove( - em.contains(object) ? - object : em.merge(object)); - } - - public Query queryFromString(String sql, String dataSource) { - EntityManager em = emp.entityManager(dataSource); - return em.createNativeQuery(sql); - } - - public EntityManager entityManager(String dataSource) { - return emp.entityManager(dataSource); - } -} diff -r dbeb56e913fd -r 51784d74a85b src/main/java/de/intevation/lada/util/data/DataTransaction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/de/intevation/lada/util/data/DataTransaction.java Mon Feb 16 15:14:48 2015 +0100 @@ -0,0 +1,103 @@ +/* Copyright (C) 2013 by Bundesamt fuer Strahlenschutz + * Software engineering by Intevation GmbH + * + * This file is Free Software under the GNU GPL (v>=3) + * and comes with ABSOLUTELY NO WARRANTY! Check out + * the documentation coming with IMIS-Labordaten-Application for details. + */ +package de.intevation.lada.util.data; + +import javax.ejb.EJBTransactionRolledbackException; +import javax.ejb.Stateless; +import javax.ejb.TransactionAttribute; +import javax.ejb.TransactionAttributeType; +import javax.inject.Inject; +import javax.persistence.EntityExistsException; +import javax.persistence.EntityManager; +import javax.persistence.Query; +import javax.persistence.TransactionRequiredException; + +/** + * Abstract class implementing low level data operations. + * + * @author Raimund Renkert + */ +@Stateless +public class DataTransaction +{ + @Inject + protected EntityManagerProducer emp; + + protected String jndiPath; + + /** + * Create object in the database. + * This operation can not be undone. + * + * @param object The object to create + * + * @throws EntityExistsException + * @throws IllegalArgumentException + * @throws EJBTransactionRolledbackException + * @throws TransactionRequiredException + */ + @TransactionAttribute(TransactionAttributeType.REQUIRED) + public void persistInDatabase(Object object, String dataSource) + throws EntityExistsException, + IllegalArgumentException, + EJBTransactionRolledbackException, + TransactionRequiredException + { + emp.entityManager(dataSource).persist(object); + } + + /** + * Create object in the database. + * This operation can not be undone. + * + * @param object The object to create + * + * @throws EntityExistsException + * @throws IllegalArgumentException + * @throws EJBTransactionRolledbackException + * @throws TransactionRequiredException + */ + @TransactionAttribute(TransactionAttributeType.REQUIRED) + public void updateInDatabase(Object object, String dataSource) + throws EntityExistsException, + IllegalArgumentException, + EJBTransactionRolledbackException, + TransactionRequiredException + { + emp.entityManager(dataSource).merge(object); + } + + /** + * Remove an object from the datebase. + * This operation can not be undone. + * + * @param object The object to remove + * + * @throws IllegalArgumentException + * @throws TransactionRequiredException + */ + @TransactionAttribute(TransactionAttributeType.REQUIRED) + public void removeFromDatabase(Object object, String dataSource) + throws IllegalArgumentException, + TransactionRequiredException + { + EntityManager em = emp.entityManager(dataSource); + em.remove( + em.contains(object) ? + object : em.merge(object)); + } + + public Query queryFromString(String sql, String dataSource) { + EntityManager em = emp.entityManager(dataSource); + return em.createNativeQuery(sql); + } + + public EntityManager entityManager(String dataSource) { + return emp.entityManager(dataSource); + } +} diff -r dbeb56e913fd -r 51784d74a85b src/main/java/de/intevation/lada/util/data/DefaultRepository.java --- a/src/main/java/de/intevation/lada/util/data/DefaultRepository.java Mon Feb 16 15:13:08 2015 +0100 +++ b/src/main/java/de/intevation/lada/util/data/DefaultRepository.java Mon Feb 16 15:14:48 2015 +0100 @@ -7,14 +7,19 @@ */ package de.intevation.lada.util.data; +import java.util.List; + import javax.ejb.EJBTransactionRolledbackException; -import javax.ejb.Stateless; +import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import javax.persistence.EntityExistsException; +import javax.persistence.EntityManager; import javax.persistence.TransactionRequiredException; +import javax.persistence.criteria.CriteriaQuery; import org.apache.log4j.Logger; +import de.intevation.lada.util.annotation.RepositoryConfig; import de.intevation.lada.util.rest.Response; @@ -23,12 +28,16 @@ * * @author Raimund Renkert */ -@Stateless +@RepositoryConfig(type=RepositoryType.RW) +@ApplicationScoped public class DefaultRepository extends ReadOnlyRepository { @Inject private Logger logger; + @Inject + private DataTransaction transaction; + /** * Create and persist a new object in the database. * @@ -40,7 +49,7 @@ @Override public Response create(Object object, String dataSource) { try { - this.persistInDatabase(object, dataSource); + transaction.persistInDatabase(object, dataSource); } catch (EntityExistsException eee) { logger.error("Could not persist " + object.getClass().getName() + @@ -82,7 +91,7 @@ public Response update(Object object, String dataSource) { Response response = new Response(true, 200, object); try { - this.updateInDatabase(object, dataSource); + transaction.updateInDatabase(object, dataSource); } catch (EntityExistsException eee) { return new Response(false, 601, object); @@ -111,7 +120,7 @@ public Response delete(Object object, String dataSource) { Response response = new Response(true, 200, null); try { - this.removeFromDatabase(object, dataSource); + transaction.removeFromDatabase(object, dataSource); } catch (IllegalArgumentException iae) { return new Response(false, 602, object); @@ -121,4 +130,80 @@ } return response; } + /** + * Get objects from database using the given filter. + * + * @param filter Filter used to request objects. + * @param datasource The datasource. + * + * @return Response object containing the filtered list of objects. + */ + @Override + public Response filter(CriteriaQuery filter, String dataSource) { + List result = + transaction.entityManager(dataSource).createQuery(filter).getResultList(); + return new Response(true, 200, result); + } + + + /** + * Get objects from database using the given filter. + * + * @param filter Filter used to request objects. + * @param size The maximum amount of objects. + * @param start The start index. + * @param datasource The datasource. + * + * @return Response object containing the filtered list of objects. + */ + @Override + public Response filter( + CriteriaQuery filter, + int size, + int start, + String dataSource + ) { + List result = + transaction.entityManager(dataSource).createQuery(filter).getResultList(); + if (size > 0 && start > -1) { + List newList = result.subList(start, size + start); + return new Response(true, 200, newList, result.size()); + } + return new Response(true, 200, result); + } + + /** + * Get all objects. + * + * @param clazz The type of the objects. + * @param dataSource The datasource. + * + * @return Response object containg all requested objects. + */ + public Response getAll(Class clazz, String dataSource) { + EntityManager manager = transaction.entityManager(dataSource); + QueryBuilder builder = + new QueryBuilder(manager, clazz); + List result = + manager.createQuery(builder.getQuery()).getResultList(); + return new Response(true, 200, result); + } + + /** + * Get an object by its id. + * + * @param clazz The type of the object. + * @param id The id of the object. + * @param dataSource The datasource. + * + * @return Response object containg the requested object. + */ + @Override + public Response getById(Class clazz, Object id, String dataSource) { + T item = transaction.entityManager(dataSource).find(clazz, id); + if (item == null) { + return new Response(false, 600, null); + } + return new Response(true, 200, item); + } } diff -r dbeb56e913fd -r 51784d74a85b src/main/java/de/intevation/lada/util/data/ReadOnlyRepository.java --- a/src/main/java/de/intevation/lada/util/data/ReadOnlyRepository.java Mon Feb 16 15:13:08 2015 +0100 +++ b/src/main/java/de/intevation/lada/util/data/ReadOnlyRepository.java Mon Feb 16 15:14:48 2015 +0100 @@ -9,13 +9,13 @@ import java.util.List; -import javax.ejb.Stateless; +import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import javax.persistence.EntityManager; +import javax.persistence.Query; import javax.persistence.criteria.CriteriaQuery; -import org.apache.log4j.Logger; - +import de.intevation.lada.util.annotation.RepositoryConfig; import de.intevation.lada.util.rest.Response; @@ -24,11 +24,12 @@ * * @author Raimund Renkert */ -@Stateless -public class ReadOnlyRepository extends AbstractRepository { +@RepositoryConfig(type=RepositoryType.RO) +@ApplicationScoped +public class ReadOnlyRepository implements Repository { @Inject - private Logger logger; + private DataTransaction transaction; public ReadOnlyRepository() { } @@ -74,7 +75,7 @@ @Override public Response filter(CriteriaQuery filter, String dataSource) { List result = - emp.entityManager(dataSource).createQuery(filter).getResultList(); + transaction.entityManager(dataSource).createQuery(filter).getResultList(); return new Response(true, 200, result); } @@ -97,7 +98,7 @@ String dataSource ) { List result = - emp.entityManager(dataSource).createQuery(filter).getResultList(); + transaction.entityManager(dataSource).createQuery(filter).getResultList(); if (size > 0 && start > -1) { List newList = result.subList(start, size + start); return new Response(true, 200, newList, result.size()); @@ -114,8 +115,7 @@ * @return Response object containg all requested objects. */ public Response getAll(Class clazz, String dataSource) { - logger.warn("ich bin ein logger"); - EntityManager manager = emp.entityManager(dataSource); + EntityManager manager = transaction.entityManager(dataSource); QueryBuilder builder = new QueryBuilder(manager, clazz); List result = @@ -134,10 +134,21 @@ */ @Override public Response getById(Class clazz, Object id, String dataSource) { - T item = emp.entityManager(dataSource).find(clazz, id); + T item = transaction.entityManager(dataSource).find(clazz, id); if (item == null) { return new Response(false, 600, null); } return new Response(true, 200, item); } + + @Override + public Query queryFromString(String sql, String dataSource) { + EntityManager em = transaction.entityManager(dataSource); + return em.createNativeQuery(sql); + } + + @Override + public EntityManager entityManager(String dataSource) { + return transaction.entityManager(dataSource); + } } diff -r dbeb56e913fd -r 51784d74a85b src/main/java/de/intevation/lada/util/factory/RepositoryFactory.java --- a/src/main/java/de/intevation/lada/util/factory/RepositoryFactory.java Mon Feb 16 15:13:08 2015 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -/* Copyright (C) 2013 by Bundesamt fuer Strahlenschutz - * Software engineering by Intevation GmbH - * - * This file is Free Software under the GNU GPL (v>=3) - * and comes with ABSOLUTELY NO WARRANTY! Check out - * the documentation coming with IMIS-Labordaten-Application for details. - */ -package de.intevation.lada.util.factory; - -import javax.enterprise.context.RequestScoped; -import javax.enterprise.inject.New; -import javax.enterprise.inject.Produces; -import javax.enterprise.inject.spi.Annotated; -import javax.enterprise.inject.spi.InjectionPoint; - -import de.intevation.lada.util.annotation.RepositoryConfig; -import de.intevation.lada.util.data.DefaultRepository; -import de.intevation.lada.util.data.ReadOnlyRepository; -import de.intevation.lada.util.data.Repository; -import de.intevation.lada.util.data.RepositoryType; - - -@RequestScoped -public class RepositoryFactory { - - @Produces - Repository createRepository(InjectionPoint injectionPoint, - @New ReadOnlyRepository readOnlyRepo, - @New DefaultRepository defaultRepo) { - Annotated annotated = injectionPoint.getAnnotated(); - RepositoryConfig config = - annotated.getAnnotation(RepositoryConfig.class); - if (config == null) { - return readOnlyRepo; - } - Repository repository; - if (config.type() == RepositoryType.RW) { - repository = defaultRepo; - } - else { - repository = readOnlyRepo; - } - return repository; - } -}