From 3f4c0b2649107a29ebee48de07a175b876cd9979 Mon Sep 17 00:00:00 2001
From: Olivier Maury <Olivier.Maury@inrae.fr>
Date: Mon, 15 Jan 2024 18:27:43 +0100
Subject: [PATCH 1/2] =?UTF-8?q?Trier=20les=20listes=20d=C3=A9roulantes.=20?=
 =?UTF-8?q?refs=20#30?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../www/server/dao/DaoHibernate.java          | 31 +++++++++++++++++--
 .../www/server/dao/RegionDaoHibernate.java    |  8 +++++
 .../www/server/rs/IndicatorResource.java      | 18 ++++++++---
 3 files changed, 50 insertions(+), 7 deletions(-)

diff --git a/www-server/src/main/java/fr/agrometinfo/www/server/dao/DaoHibernate.java b/www-server/src/main/java/fr/agrometinfo/www/server/dao/DaoHibernate.java
index dc1e1b7..5b0e39f 100644
--- a/www-server/src/main/java/fr/agrometinfo/www/server/dao/DaoHibernate.java
+++ b/www-server/src/main/java/fr/agrometinfo/www/server/dao/DaoHibernate.java
@@ -12,6 +12,10 @@ import org.hibernate.engine.spi.SessionImplementor;
 import jakarta.persistence.NoResultException;
 import jakarta.persistence.Query;
 import jakarta.persistence.TypedQuery;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Order;
+import jakarta.persistence.criteria.Root;
 import lombok.extern.log4j.Log4j2;
 
 /**
@@ -104,10 +108,33 @@ public abstract class DaoHibernate<T> {
     /**
      * @return all entities for the related class
      */
-    public final List<T> findAll() {
+    public List<T> findAll() {
+        LOGGER.traceEntry();
+        return findAll(null);
+    }
+
+    /**
+     * @return all entities for the related class
+     */
+    public final List<T> findAll(final Map<String, String> orders) {
         LOGGER.traceEntry();
         try (ScopedEntityManager em = getScopedEntityManager()) {
-            final TypedQuery<T> query = em.createQuery("SELECT t FROM " + clazz.getName() + " t", clazz);
+            final CriteriaBuilder cBuilder = em.getCriteriaBuilder();
+            final CriteriaQuery<T> cQuery = cBuilder.createQuery(clazz);
+            final Root<T> root = cQuery.from(clazz);
+            cQuery.select(root);
+            if (orders != null) {
+                final List<Order> orderList = new ArrayList<>();
+                orders.forEach((column, asc) -> {
+                    if ("DESC".equalsIgnoreCase(asc)) {
+                        orderList.add(cBuilder.desc(root.get(column)));
+                    } else {
+                        orderList.add(cBuilder.asc(root.get(column)));
+                    }
+                });
+                cQuery.orderBy(orderList);
+            }
+            final TypedQuery<T> query = em.createQuery(cQuery);
             LOGGER.traceExit();
             return query.getResultList();
         } catch (final NoResultException e) {
diff --git a/www-server/src/main/java/fr/agrometinfo/www/server/dao/RegionDaoHibernate.java b/www-server/src/main/java/fr/agrometinfo/www/server/dao/RegionDaoHibernate.java
index 0e64c2b..b72980c 100644
--- a/www-server/src/main/java/fr/agrometinfo/www/server/dao/RegionDaoHibernate.java
+++ b/www-server/src/main/java/fr/agrometinfo/www/server/dao/RegionDaoHibernate.java
@@ -1,5 +1,8 @@
 package fr.agrometinfo.www.server.dao;
 
+import java.util.List;
+import java.util.Map;
+
 import fr.agrometinfo.www.server.model.Region;
 import jakarta.enterprise.context.ApplicationScoped;
 
@@ -23,4 +26,9 @@ public class RegionDaoHibernate extends DaoHibernate<Region> implements RegionDa
         return super.find(id);
     }
 
+    @Override
+    public final List<Region> findAll() {
+        return super.findAll(Map.of("name", "asc"));
+    }
+
 }
diff --git a/www-server/src/main/java/fr/agrometinfo/www/server/rs/IndicatorResource.java b/www-server/src/main/java/fr/agrometinfo/www/server/rs/IndicatorResource.java
index bdfd30b..fdcfce0 100644
--- a/www-server/src/main/java/fr/agrometinfo/www/server/rs/IndicatorResource.java
+++ b/www-server/src/main/java/fr/agrometinfo/www/server/rs/IndicatorResource.java
@@ -5,13 +5,12 @@ import static fr.agrometinfo.www.server.util.GeometryUtils.toFeature;
 import java.time.LocalDate;
 import java.time.ZoneId;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Date;
-import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 import org.geojson.Feature;
 import org.geojson.FeatureCollection;
@@ -175,7 +174,7 @@ public class IndicatorResource implements IndicatorService {
         LOGGER.traceEntry();
         final var locale = LocaleUtils.getLocale(httpServletRequest);
         final var indicators = praDailyValueDao.findIndicators();
-        final Map<Long, PeriodDTO> dtos = new HashMap<>();
+        final Map<Long, PeriodDTO> dtos = new LinkedHashMap<>();
         for (final Indicator indicator : indicators) {
             final var p = indicator.getPeriod();
             final var key = Long.valueOf(p.getId());
@@ -188,7 +187,14 @@ public class IndicatorResource implements IndicatorService {
             });
             dtos.get(key).getIndicators().add(toDTO(indicator, locale));
         }
-        return new ArrayList<>(dtos.values());
+        // sort indicators by name
+        for (final PeriodDTO p : dtos.values()) {
+            Collections.sort(p.getIndicators(), //
+                    (o1, o2) -> o1.getDescription().compareTo(o2.getDescription()));
+        }
+        final List<PeriodDTO> periods = new ArrayList<>(dtos.values());
+        Collections.sort(periods, (o1, o2) -> o1.getDescription().compareTo(o2.getDescription()));
+        return periods;
     }
 
     @GET
@@ -197,7 +203,9 @@ public class IndicatorResource implements IndicatorService {
     @Override
     public Map<String, String> getRegions() {
         return regionDao.findAll().stream()//
-                .collect(Collectors.toMap(r -> String.valueOf(r.getId()), Region::getName));
+                .collect(LinkedHashMap::new, //
+                        (map, item) -> map.put(String.valueOf(item.getId()), item.getName()), //
+                        Map::putAll);
     }
 
     @GET
-- 
GitLab


From 98820cbb60f6d87dbc7979ab7dc7f8abfb22fa22 Mon Sep 17 00:00:00 2001
From: Olivier Maury <Olivier.Maury@inrae.fr>
Date: Mon, 15 Jan 2024 21:19:20 +0100
Subject: [PATCH 2/2] Checkstyle

---
 .../main/java/fr/agrometinfo/www/server/dao/DaoHibernate.java    | 1 +
 1 file changed, 1 insertion(+)

diff --git a/www-server/src/main/java/fr/agrometinfo/www/server/dao/DaoHibernate.java b/www-server/src/main/java/fr/agrometinfo/www/server/dao/DaoHibernate.java
index 5b0e39f..d35b0b9 100644
--- a/www-server/src/main/java/fr/agrometinfo/www/server/dao/DaoHibernate.java
+++ b/www-server/src/main/java/fr/agrometinfo/www/server/dao/DaoHibernate.java
@@ -114,6 +114,7 @@ public abstract class DaoHibernate<T> {
     }
 
     /**
+     * @param orders column → asc/desc
      * @return all entities for the related class
      */
     public final List<T> findAll(final Map<String, String> orders) {
-- 
GitLab