From ef530bb385fb8f0a7a72310dc826de53f26085b2 Mon Sep 17 00:00:00 2001
From: Bruno Bonte <bruno.bonte@irstea.fr>
Date: Tue, 21 Jul 2020 16:35:27 +0200
Subject: [PATCH] Adding feature in get function

	* Possibility of specifying the ids of entities reach and hru to
optimise the simulation
---
 modules/CouplingCommunication.java | 77 +++++++++++++++++++++++++-----
 1 file changed, 65 insertions(+), 12 deletions(-)

diff --git a/modules/CouplingCommunication.java b/modules/CouplingCommunication.java
index 76a30a1..150ae19 100644
--- a/modules/CouplingCommunication.java
+++ b/modules/CouplingCommunication.java
@@ -39,6 +39,7 @@ import java.net.Socket;
 
 import org.json.JSONObject;
 import org.json.JSONArray;
+import jams.JAMSException;
 
 /**
  *
@@ -298,8 +299,27 @@ public class CouplingCommunication extends JAMSComponent {
         return result;
     }
 
-    public String getAttribAllHruList(List<String> attributes) {
+    public String getAttribAllHruList(List<String> attributes, List<Long> requestedIds) {
         Iterator<Attribute.Entity> hruIterator = hrus.getEntities().iterator();
+        List<Attribute.Entity> requestedEntities = new ArrayList(); // used only if some entities are requested
+        long id;
+        if (!requestedIds.isEmpty()){
+            Iterator<Long> idsIterator = requestedIds.iterator();
+            while(idsIterator.hasNext()) {
+                Attribute.Entity selectedEntity;
+                id = idsIterator.next();
+                selectedEntity = hrus.getEntity(id);
+                try{
+                    if(selectedEntity == null){
+                        throw new JAMSException("Hru nb "+id+" not found in Hrus");
+                    }
+                } catch(Exception e) {
+                    return("Hru nb "+id+" not found in Hrus");
+                }
+                requestedEntities.add(selectedEntity);
+            }
+            hruIterator = requestedEntities.iterator();
+        }
         Attribute.Entity hru;
         Double value;
         Double hruId;
@@ -328,8 +348,27 @@ public class CouplingCommunication extends JAMSComponent {
         return result;
     }
 
-    public String getAttribAllReachList(List<String> attributes) {
+    public String getAttribAllReachList(List<String> attributes, List<Long> requestedIds) {
         Iterator<Attribute.Entity> reachIterator = reachs.getEntities().iterator();
+        List<Attribute.Entity> requestedEntities = new ArrayList(); // used only if some entities are requested
+        long id;
+        if (!requestedIds.isEmpty()){
+            Iterator<Long> idsIterator = requestedIds.iterator();
+            while(idsIterator.hasNext()) {
+               Attribute.Entity selectedEntity;
+                id = idsIterator.next();
+                selectedEntity = reachs.getEntity(id);
+                try{
+                    if(selectedEntity == null){
+                        throw new JAMSException("Reach nb "+id+" not found in reachs");
+                    }
+                } catch(Exception e) {
+                    return("Reach nb "+id+" not found in reachs");
+                }
+                requestedEntities.add(selectedEntity);
+            }
+            reachIterator = requestedEntities.iterator();
+        }
         Attribute.Entity reach;
         Double value;
         Double reachId;
@@ -751,12 +790,19 @@ public class CouplingCommunication extends JAMSComponent {
                             commandIsGet = true;
                             if (jsonPayload.has("keys") && !jsonPayload.isNull("keys")) {
                                 JSONArray jsonArray = jsonPayload.getJSONArray("keys");
-                                 List<String> keys = new ArrayList();
-                                 for (int i = 0; i < jsonArray.length();i++){
-                                 keys.add(jsonArray.getString(i));
-                                 //log("an attribute name:" + jsonArray.getString(i));
-                                         };
-                                out.print(getAttribAllHruList(keys));
+                                List<String> keys = new ArrayList();
+                                for (int i = 0; i < jsonArray.length();i++){
+                                    keys.add(jsonArray.getString(i));
+                                    //log("an attribute name:" + jsonArray.getString(i));
+                                };
+                                List<Long> ids = new ArrayList();
+                                if (jsonPayload.has("ids") && !jsonPayload.isNull("ids")) {
+                                    jsonArray = jsonPayload.getJSONArray("ids");
+                                    for (int i = 0; i < jsonArray.length();i++){
+                                        ids.add(jsonArray.getLong(i));
+                                    };
+                                }
+                                out.print(getAttribAllHruList(keys, ids));
                             }
                             sAcceptConnection.release();
                         } else if (command.equals("getReach")) {
@@ -765,10 +811,17 @@ public class CouplingCommunication extends JAMSComponent {
                                 JSONArray jsonArray = jsonPayload.getJSONArray("keys");
                                  List<String> keys = new ArrayList();
                                  for (int i = 0; i < jsonArray.length();i++){
-                                 keys.add(jsonArray.getString(i));
-                                 //log("an attribute name:" + jsonArray.getString(i));
-                                         };
-                                out.print(getAttribAllReachList(keys));
+                                    keys.add(jsonArray.getString(i));
+                                    //log("an attribute name:" + jsonArray.getString(i));
+                                 };
+                                List<Long> ids = new ArrayList();
+                                if (jsonPayload.has("ids") && !jsonPayload.isNull("ids")) {
+                                    jsonArray = jsonPayload.getJSONArray("ids");
+                                    for (int i = 0; i < jsonArray.length();i++){
+                                        ids.add(jsonArray.getLong(i));
+                                    };
+                                }
+                                out.print(getAttribAllReachList(keys, ids));
                             }
                             sAcceptConnection.release();
                         } else if (command.equals("getHruSum")) {
-- 
GitLab