From db459b285bd5e7238200a9bac784df257ce6508c Mon Sep 17 00:00:00 2001
From: Robert Butora <robert.butora@inaf.it>
Date: Tue, 2 Apr 2024 15:43:46 +0200
Subject: [PATCH] cutout: implements Coutput::doFile with doStream into
 localfile if AMQP hostname not configured

---
 .../main/java/common/vo/NullValueCount.java   |  7 +++
 .../src/main/java/datasets/Cutout.java        |  4 +-
 .../src/main/java/datasets/CutoutImpl.java    | 53 ++++++++++++++-----
 .../src/main/java/webapi/ServletCutout.java   |  3 +-
 .../src/main/java/webapi/Settings.java        |  5 ++
 5 files changed, 56 insertions(+), 16 deletions(-)

diff --git a/data-access/servlet/src/main/java/common/vo/NullValueCount.java b/data-access/servlet/src/main/java/common/vo/NullValueCount.java
index d265b3d..623c05e 100644
--- a/data-access/servlet/src/main/java/common/vo/NullValueCount.java
+++ b/data-access/servlet/src/main/java/common/vo/NullValueCount.java
@@ -6,6 +6,13 @@ class NullValueCount
    double percent;
    long nullCount;
    long totalCount;
+
+   NullValueCount()
+   {
+      percent = 0.0;
+      nullCount = 0;
+      totalCount = 0;
+   }
 }
 
 
diff --git a/data-access/servlet/src/main/java/datasets/Cutout.java b/data-access/servlet/src/main/java/datasets/Cutout.java
index 0ef9440..9cb9507 100644
--- a/data-access/servlet/src/main/java/datasets/Cutout.java
+++ b/data-access/servlet/src/main/java/datasets/Cutout.java
@@ -17,7 +17,9 @@ public interface Cutout
 
 
    public CutResult doFile(String relPathname, int hdunum, Pos pos, Band band, Time time, Pol pol,
-         boolean countNullValues, FitsCard[] extraCards);
+         boolean countNullValues, FitsCard[] extraCards)
+         throws IOException, InterruptedException;
+;
 
 }
 
diff --git a/data-access/servlet/src/main/java/datasets/CutoutImpl.java b/data-access/servlet/src/main/java/datasets/CutoutImpl.java
index a40de95..a253c4c 100644
--- a/data-access/servlet/src/main/java/datasets/CutoutImpl.java
+++ b/data-access/servlet/src/main/java/datasets/CutoutImpl.java
@@ -16,6 +16,7 @@ import java.io.PrintWriter;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileOutputStream;
 import java.io.FileNotFoundException;
 import java.nio.file.StandardOpenOption;
 import java.nio.file.Files;
@@ -184,24 +185,48 @@ class CutoutImpl implements Cutout
    public CutResult doFile(String relPathname, int hdunum,
          Pos pos, Band band, Time time, Pol pol,
          boolean countNullValues, FitsCard[] extraCards)
-   {
-      LOGGER.info("trace: " + pos.toString() );
+         throws IOException, InterruptedException
+      {
+         LOGGER.info("trace: " + pos.toString() );
 
-      String absSubimgPathname = settings.fitsPaths.cutouts() + "/" + generateSubimgPathname(relPathname, hdunum);
+         CutResult cutResult = new CutResult();
 
-      JsonEncoder jReq = new JsonEncoder();
-      jReq.add(relPathname, hdunum);
-      jReq.add(pos);
-      jReq.add(band);
-      jReq.add(time);
-      jReq.add(pol);
-      jReq.add(countNullValues);
-      jReq.add(extraCards);
+         if(settings.amqpConn.isHostnameEmpty())
+         {
+            String absSubimgPathname = settings.fitsPaths.cutouts()
+               + "/" + generateSubimgPathname(relPathname, hdunum);
 
-      String outJson = doRpc( jReq.toString() );
+            OutputStream fileOutputStream = new FileOutputStream( new File(absSubimgPathname) );
 
-      return JsonDecoder.responseFromCutoutJson( outJson );
-   }
+            doStream(relPathname, hdunum, pos, band, time, pol, fileOutputStream);
+
+            // engine returns absPathname see common/cutout.cpp::do_cutout_file()
+            cutResult.filename = absSubimgPathname;
+            cutResult.filesize = Files.size(Paths.get(absSubimgPathname));
+
+            if(countNullValues)
+            {
+               LOGGER.info("NullValuesCount not implemented when used with Cutout::doStream()");
+            }
+         }
+         else
+         {
+            JsonEncoder jReq = new JsonEncoder();
+            jReq.add(relPathname, hdunum);
+            jReq.add(pos);
+            jReq.add(band);
+            jReq.add(time);
+            jReq.add(pol);
+            jReq.add(countNullValues);
+            jReq.add(extraCards);
+
+            String outJson = doRpc( jReq.toString() );
+
+            cutResult = JsonDecoder.responseFromCutoutJson( outJson );
+         }
+
+         return cutResult;
+      }
 
 
 
diff --git a/data-access/servlet/src/main/java/webapi/ServletCutout.java b/data-access/servlet/src/main/java/webapi/ServletCutout.java
index 26e673e..8b77375 100644
--- a/data-access/servlet/src/main/java/webapi/ServletCutout.java
+++ b/data-access/servlet/src/main/java/webapi/ServletCutout.java
@@ -113,7 +113,7 @@ public class ServletCutout extends javax.servlet.http.HttpServlet
 
 
    protected void doCutoutFileStream(String id, Pos pos, Band band, Time time, Pol pol, OutputStream respOutputStream)
-      throws IOException
+      throws IOException, InterruptedException
    {
       LOGGER.info("trace" + pos);
 
@@ -137,6 +137,7 @@ public class ServletCutout extends javax.servlet.http.HttpServlet
 
    protected DataLink doCutoutFile(String id, Pos pos, Band band, Time time, Pol pol,
          boolean countNullValues, String respFormat)
+         throws IOException, InterruptedException
    {
       LOGGER.info("trace");
 
diff --git a/data-access/servlet/src/main/java/webapi/Settings.java b/data-access/servlet/src/main/java/webapi/Settings.java
index 233bfe3..c56f91a 100644
--- a/data-access/servlet/src/main/java/webapi/Settings.java
+++ b/data-access/servlet/src/main/java/webapi/Settings.java
@@ -71,6 +71,11 @@ class Settings
       public int    portNumber() { return portNum; }
       public String routingKey() { return routingKey; }
 
+      public boolean isHostnameEmpty()
+      {
+         return ( (hostName == null) || hostName.trim().isEmpty() );
+      }
+
       public String toString()
       {
          return hostName + " " + String.valueOf(portNum) + " " + routingKey;
-- 
GitLab