changeset 450:808ea2091c1d

Updated repositoy structure and added probe services.
author Raimund Renkert <raimund.renkert@intevation.de>
date Wed, 11 Feb 2015 13:01:55 +0100
parents ee5c7309e4b9
children 89a5dbeb5bd6
files src/main/java/de/intevation/lada/rest/ProbeService.java src/main/java/de/intevation/lada/util/data/AbstractRepository.java src/main/java/de/intevation/lada/util/data/DefaultRepository.java src/main/java/de/intevation/lada/util/data/ReadOnlyRepository.java src/main/java/de/intevation/lada/util/data/Repository.java src/main/java/de/intevation/lada/util/factory/RepositoryFactory.java
diffstat 6 files changed, 205 insertions(+), 90 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/de/intevation/lada/rest/ProbeService.java	Wed Feb 11 12:56:59 2015 +0100
+++ b/src/main/java/de/intevation/lada/rest/ProbeService.java	Wed Feb 11 13:01:55 2015 +0100
@@ -7,9 +7,14 @@
  */
 package de.intevation.lada.rest;
 
+import java.util.List;
+
 import javax.enterprise.context.RequestScoped;
 import javax.inject.Inject;
+import javax.ws.rs.DELETE;
 import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
@@ -20,6 +25,7 @@
 import org.apache.log4j.Logger;
 
 import de.intevation.lada.model.land.LProbe;
+import de.intevation.lada.model.land.ProbeTranslation;
 import de.intevation.lada.util.annotation.AuthenticationConfig;
 import de.intevation.lada.util.annotation.AuthorizationConfig;
 import de.intevation.lada.util.annotation.RepositoryConfig;
@@ -27,6 +33,7 @@
 import de.intevation.lada.util.auth.AuthenticationType;
 import de.intevation.lada.util.auth.Authorization;
 import de.intevation.lada.util.auth.AuthorizationType;
+import de.intevation.lada.util.data.QueryBuilder;
 import de.intevation.lada.util.data.Repository;
 import de.intevation.lada.util.data.RepositoryType;
 import de.intevation.lada.util.rest.Response;
@@ -77,12 +84,79 @@
         return defaultRepo.getById(LProbe.class, Integer.valueOf(id));
     }
 
-    @GET
-    @Produces("application/json")
-    @Path("/land")
-    public Response getAllLand() {
-        //List<LProbe> res = dao.getAllLand();
-        //return new Response(true, 200, res);
-        return null;
+    @POST
+    @Path("/")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response create(@Context HttpHeaders headers, LProbe probe) {
+        if (!authentication.isAuthenticated(headers)) {
+            return new Response(false, 699, null);
+        }
+        /* Persist the new probe object*/
+        Response response = defaultRepo.create(probe, "land");
+        LProbe ret = (LProbe)response.getData();
+        /* Create and persist a new probe translation object*/
+        ProbeTranslation trans = new ProbeTranslation();
+        trans.setProbeId(ret);
+        defaultRepo.create(trans, "land");
+        /* Get and return the new probe object*/
+        Response created =
+            defaultRepo.getById(LProbe.class, ret.getId(), "land");
+        return new Response(true, 200, created.getData());
+    }
+
+    /**
+     * Update an existing probe object.
+     *
+     * @return Response object containing the updated probe object.
+     */
+    @PUT
+    @Path("/")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response update(@Context HttpHeaders headers, LProbe probe) {
+        if (!authentication.isAuthenticated(headers)) {
+            logger.debug("User is not authenticated!");
+            return new Response(false, 699, null);
+        }
+        Response response = defaultRepo.update(probe, "land");
+        Response updated = defaultRepo.getById(
+            LProbe.class,
+            ((LProbe)response.getData()).getId(), "land");
+        return updated;
+    }
+
+    /**
+     * Delete an existing probe object by id.
+     *
+     * @return Response object.
+     */
+    @DELETE
+    @Path("/{id}")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response delete(
+        @Context HttpHeaders headers,
+        @PathParam("id") String id
+    ) {
+        if (!authentication.isAuthenticated(headers)) {
+            logger.debug("User is not authenticated!");
+            return new Response(false, 699, null);
+        }
+        /* Get the probe object by id*/
+        Response probe =
+            defaultRepo.getById(LProbe.class, Integer.valueOf(id), "land");
+        LProbe probeObj = (LProbe)probe.getData();
+        /* Create a query and request the probetranslation object for the
+         * probe*/
+        QueryBuilder<ProbeTranslation> builder =
+            new QueryBuilder<ProbeTranslation>(
+                defaultRepo.entityManager("land"), ProbeTranslation.class);
+        builder.and("probe", probeObj.getId());
+        Response probeTrans = defaultRepo.filter(builder.getQuery(), "land");
+        @SuppressWarnings("unchecked")
+        ProbeTranslation probeTransObj = ((List<ProbeTranslation>)probeTrans.getData()).get(0);
+        /* Delete the probe translation object*/
+        defaultRepo.delete(probeTransObj, "land");
+        /* Delete the probe object*/
+        Response response = defaultRepo.delete(probeObj, "land");
+        return response;
     }
 }
--- a/src/main/java/de/intevation/lada/util/data/AbstractRepository.java	Wed Feb 11 12:56:59 2015 +0100
+++ b/src/main/java/de/intevation/lada/util/data/AbstractRepository.java	Wed Feb 11 13:01:55 2015 +0100
@@ -11,20 +11,24 @@
 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 <a href="mailto:rrenkert@intevation.de">Raimund Renkert</a>
+ */
 @Stateless
 public abstract class AbstractRepository
-implements Repository 
+implements Repository
 {
+    @Inject
     protected EntityManagerProducer emp;
 
-    protected String dataSource;
-
     protected String jndiPath;
 
     /**
@@ -39,7 +43,17 @@
      * @throws TransactionRequiredException
      */
     @TransactionAttribute(TransactionAttributeType.REQUIRED)
-    protected void persistInDatabase(Object object)
+    protected void persistInDatabase(Object object, String dataSource)
+    throws EntityExistsException,
+        IllegalArgumentException,
+        EJBTransactionRolledbackException,
+        TransactionRequiredException
+    {
+        emp.entityManager(dataSource).persist(object);
+    }
+
+    @TransactionAttribute(TransactionAttributeType.REQUIRED)
+    protected void updateInDatabase(Object object, String dataSource)
     throws EntityExistsException,
         IllegalArgumentException,
         EJBTransactionRolledbackException,
@@ -58,7 +72,7 @@
      * @throws TransactionRequiredException
      */
     @TransactionAttribute(TransactionAttributeType.REQUIRED)
-    protected void removeFromDatabase(Object object)
+    protected void removeFromDatabase(Object object, String dataSource)
     throws IllegalArgumentException,
         TransactionRequiredException
     {
@@ -68,22 +82,12 @@
                 object : em.merge(object));
     }
 
-    public Query queryFromString(String sql) {
+    public Query queryFromString(String sql, String dataSource) {
         EntityManager em = emp.entityManager(dataSource);
         return em.createNativeQuery(sql);
     }
 
-    @Override
-    public void setDataSource(String dataSource) {
-        this.dataSource = dataSource;
-    }
-
-    @Override
-    public String getDataSource() {
-        return this.dataSource;
-    }
-
-    public void setEntityManagerProducer(EntityManagerProducer emp) {
-        this.emp = emp;
+    public EntityManager entityManager(String dataSource) {
+        return emp.entityManager(dataSource);
     }
 }
--- a/src/main/java/de/intevation/lada/util/data/DefaultRepository.java	Wed Feb 11 12:56:59 2015 +0100
+++ b/src/main/java/de/intevation/lada/util/data/DefaultRepository.java	Wed Feb 11 13:01:55 2015 +0100
@@ -8,25 +8,71 @@
 package de.intevation.lada.util.data;
 
 import javax.ejb.EJBTransactionRolledbackException;
+import javax.ejb.Stateless;
+import javax.inject.Inject;
 import javax.persistence.EntityExistsException;
 import javax.persistence.TransactionRequiredException;
 
+import org.apache.log4j.Logger;
+
 import de.intevation.lada.util.rest.Response;
 
 
 /**
  * @author rrenkert
  */
+@Stateless
 public class DefaultRepository extends ReadOnlyRepository {
 
-    public DefaultRepository() {
+    @Inject
+    private Logger logger;
+
+    /**
+     * Create and persist a new object in the database.
+     *
+     * @param object The new object.
+     * @param dataSource The datasource.
+     *
+     * @return Response object containing the new object.
+     */
+    @Override
+    public Response create(Object object, String dataSource) {
+        try {
+            this.persistInDatabase(object, dataSource);
+        }
+        catch (EntityExistsException eee) {
+            logger.error("Could not persist " + object.getClass().getName() +
+                ". Reason: " + eee.getClass().getName() + " - " +
+                eee.getMessage());
+            return new Response(false, 601, object);
+        }
+        catch (IllegalArgumentException iae) {
+            logger.error("Could not persist " + object.getClass().getName() +
+                ". Reason: " + iae.getClass().getName() + " - " +
+                iae.getMessage());
+            return new Response(false, 602, object);
+        }
+        catch (TransactionRequiredException tre) {
+            logger.error("Could not persist " + object.getClass().getName() +
+                ". Reason: " + tre.getClass().getName() + " - " +
+                tre.getMessage());
+            return new Response(false, 603, object);
+        }
+        catch (EJBTransactionRolledbackException ete) {
+            logger.error("Could not persist " + object.getClass().getName() +
+                ". Reason: " + ete.getClass().getName() + " - " +
+                ete.getMessage());
+            return new Response(false, 604, object);
+        }
+        Response response = new Response(true, 200, object);
+        return response;
     }
 
     @Override
-    public Response create(Object object) {
+    public Response update(Object object, String dataSource) {
         Response response = new Response(true, 200, object);
         try {
-            this.persistInDatabase(object);
+            this.updateInDatabase(object, dataSource);
         }
         catch (EntityExistsException eee) {
             return new Response(false, 601, object);
@@ -44,31 +90,10 @@
     }
 
     @Override
-    public Response update(Object object) {
-        Response response = new Response(true, 200, object);
-        try {
-            this.persistInDatabase(object);
-        }
-        catch (EntityExistsException eee) {
-            return new Response(false, 601, object);
-        }
-        catch (IllegalArgumentException iae) {
-            return new Response(false, 602, object);
-        }
-        catch (TransactionRequiredException tre) {
-            return new Response(false, 603, object);
-        }
-        catch (EJBTransactionRolledbackException ete) {
-            return new Response(false, 604, object);
-        }
-        return response;
-    }
-
-    @Override
-    public Response delete(Object object) {
+    public Response delete(Object object, String dataSource) {
         Response response = new Response(true, 200, null);
         try {
-            this.removeFromDatabase(object);
+            this.removeFromDatabase(object, dataSource);
         }
         catch (IllegalArgumentException iae) {
             return new Response(false, 602, object);
--- a/src/main/java/de/intevation/lada/util/data/ReadOnlyRepository.java	Wed Feb 11 12:56:59 2015 +0100
+++ b/src/main/java/de/intevation/lada/util/data/ReadOnlyRepository.java	Wed Feb 11 13:01:55 2015 +0100
@@ -9,43 +9,57 @@
 
 import java.util.List;
 
+import javax.ejb.Stateless;
+import javax.inject.Inject;
 import javax.persistence.EntityManager;
 import javax.persistence.criteria.CriteriaQuery;
 
+import org.apache.log4j.Logger;
+
 import de.intevation.lada.util.rest.Response;
 
+
 /**
  * @author rrenkert
  */
+@Stateless
 public class ReadOnlyRepository extends AbstractRepository {
 
+    @Inject
+    private Logger logger;
+
     public ReadOnlyRepository() {
     }
 
     @Override
-    public Response create(Object object) {
+    public Response create(Object object, String dataSource) {
         return null;
     }
 
     @Override
-    public Response update(Object object) {
+    public Response update(Object object, String dataSource) {
         return null;
     }
 
     @Override
-    public Response delete(Object object) {
+    public Response delete(Object object, String dataSource) {
         return null;
     }
 
     @Override
-    public <T> Response filter(CriteriaQuery<T> filter) {
+    public <T> Response filter(CriteriaQuery<T> filter, String dataSource) {
         List<T> result =
             emp.entityManager(dataSource).createQuery(filter).getResultList();
         return new Response(true, 200, result);
     }
 
     @Override
-    public <T> Response filter(CriteriaQuery<T> filter, int size, int start) {
+    public <T> Response filter(
+        CriteriaQuery<T> filter,
+        int size,
+        int start,
+        String dataSource
+    ) {
         List<T> result =
             emp.entityManager(dataSource).createQuery(filter).getResultList();
         if (size > 0 && start > -1) {
@@ -55,7 +69,7 @@
         return new Response(true, 200, result);
     }
 
-    public <T> Response getAll(Class<T> clazz) {
+    public <T> Response getAll(Class<T> clazz, String dataSource) {
         EntityManager manager = emp.entityManager(dataSource);
         QueryBuilder<T> builder =
             new QueryBuilder<T>(manager, clazz);
@@ -65,7 +79,7 @@
     }
 
     @Override
-    public <T> Response getById(Class<T> clazz, Object id) {
+    public <T> Response getById(Class<T> clazz, Object id, String dataSource) {
         T item = emp.entityManager(dataSource).find(clazz, id);
         if (item == null) {
             return new Response(false, 600, null);
--- a/src/main/java/de/intevation/lada/util/data/Repository.java	Wed Feb 11 12:56:59 2015 +0100
+++ b/src/main/java/de/intevation/lada/util/data/Repository.java	Wed Feb 11 13:01:55 2015 +0100
@@ -7,6 +7,7 @@
  */
 package de.intevation.lada.util.data;
 
+import javax.persistence.EntityManager;
 import javax.persistence.Query;
 import javax.persistence.criteria.CriteriaQuery;
 
@@ -20,25 +21,25 @@
  */
 public interface Repository {
 
-    public Response create(Object object);
-
-    public Response update(Object object);
-
-    public Response delete(Object object);
-
-    public <T> Response filter(CriteriaQuery<T> filter);
-
-    public <T> Response filter(CriteriaQuery<T> filter, int size, int start);
+    public Response create(Object object, String dataSource);
 
-    public <T> Response getAll(Class<T> clazz);
-
-    public <T> Response getById(Class<T> clazz, Object id);
-
-    public Query queryFromString(String sql); 
+    public Response update(Object object, String dataSource);
 
-    public void setDataSource(String dataSource);
+    public Response delete(Object object, String dataSource);
 
-    public String getDataSource();
+    public <T> Response filter(CriteriaQuery<T> filter, String dataSource);
 
-    public void setEntityManagerProducer(EntityManagerProducer emp);
+    public <T> Response filter(
+        CriteriaQuery<T> filter,
+        int size,
+        int start,
+        String dataSource);
+
+    public <T> Response getAll(Class<T> clazz, String dataSource);
+
+    public <T> Response getById(Class<T> clazz, Object id, String dataSource);
+
+    public Query queryFromString(String sql, String dataSource);
+
+    public EntityManager entityManager(String dataSource);
 }
--- a/src/main/java/de/intevation/lada/util/factory/RepositoryFactory.java	Wed Feb 11 12:56:59 2015 +0100
+++ b/src/main/java/de/intevation/lada/util/factory/RepositoryFactory.java	Wed Feb 11 13:01:55 2015 +0100
@@ -7,42 +7,39 @@
  */
 package de.intevation.lada.util.factory;
 
-import javax.enterprise.context.ApplicationScoped;
+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 javax.inject.Inject;
 
 import de.intevation.lada.util.annotation.RepositoryConfig;
 import de.intevation.lada.util.data.DefaultRepository;
-import de.intevation.lada.util.data.EntityManagerProducer;
 import de.intevation.lada.util.data.ReadOnlyRepository;
 import de.intevation.lada.util.data.Repository;
 import de.intevation.lada.util.data.RepositoryType;
 
 
-@ApplicationScoped
+@RequestScoped
 public class RepositoryFactory {
 
-    @Inject
-    private EntityManagerProducer emp;
-
     @Produces
-    Repository createRepository(InjectionPoint injectionPoint) {
+    Repository createRepository(InjectionPoint injectionPoint,
+        @New ReadOnlyRepository readOnlyRepo,
+        @New DefaultRepository defaultRepo) {
         Annotated annotated = injectionPoint.getAnnotated();
-        RepositoryConfig config = annotated.getAnnotation(RepositoryConfig.class);
+        RepositoryConfig config =
+            annotated.getAnnotation(RepositoryConfig.class);
         if (config == null) {
-            return new ReadOnlyRepository();
+            return readOnlyRepo;
         }
         Repository repository;
         if (config.type() == RepositoryType.RW) {
-            repository = new DefaultRepository();
+            repository = defaultRepo;
         }
         else {
-            repository = new ReadOnlyRepository();
+            repository = readOnlyRepo;
         }
-        repository.setEntityManagerProducer(emp);
-        repository.setDataSource(config.dataSource());
         return repository;
     }
 }
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)