From ee77a823e5b6faea7325c6c21262b11e6f531344 Mon Sep 17 00:00:00 2001
From: Robert Butora <robert.butora@inaf.it>
Date: Thu, 11 Apr 2024 14:01:23 +0300
Subject: [PATCH] adds support for coord-system params (POSSYS BANDSYS TIMESYS)
 and their defaults from settings-file

---
 .../vlkb/webapi/FormatResponseFilter.java     |  15 ++++++---
 .../vlkb/webapi/FormatResponseSettings.java   |  24 +++++++++++++--
 .../main/java/vlkb/webapi/SearchServlet.java  |  12 ++++++--
 .../main/java/vlkb/webapi/SearchSettings.java |  29 +++++++++++++++---
 java-libs/lib/vlkb-volib-0.9-SNAPSHOT.jar     | Bin 21965 -> 23078 bytes
 5 files changed, 66 insertions(+), 14 deletions(-)

diff --git a/data-discovery/src/main/java/vlkb/webapi/FormatResponseFilter.java b/data-discovery/src/main/java/vlkb/webapi/FormatResponseFilter.java
index 7515fe0..53eee4a 100644
--- a/data-discovery/src/main/java/vlkb/webapi/FormatResponseFilter.java
+++ b/data-discovery/src/main/java/vlkb/webapi/FormatResponseFilter.java
@@ -52,9 +52,15 @@ class FormatResponseWrapper extends HttpServletResponseWrapper
 public class FormatResponseFilter implements Filter
 {
    private static final Logger LOGGER = Logger.getLogger("FormatResponseFilter");
-   private static final FormatResponseSettings settings = FormatResponseSettings.getInstance("formatresponsefilter.properties");
+   private static final FormatResponseSettings settings = FormatResponseSettings.getInstance(
+         "formatresponsefilter.properties");
 
    final String RESPONSE_ENCODING = "UTF-8";
+   final String DEFAULT_RESPONSEFORMAT = settings.defaults.responseFormat;
+   final String DEFAULT_SKY_SYSTEM     = settings.defaults.skySystem;
+   final String DEFAULT_SPEC_SYSTEM    = settings.defaults.specSystem;
+   final String DEFAULT_TIME_SYSTEM = "MJD_UTC"; // FIXME take from confif file
+
    protected Subsurvey[] dbSubsurveyArr  = null;
    private String reqQueryString;
 
@@ -101,10 +107,9 @@ public class FormatResponseFilter implements Filter
          // FIXME add invalid param excpetions -> params already parsed in servlet
 
          Coord coord = new Coord();
-         coord.pos  = Pos.parsePos(params);
-         coord.pos.setSystem(Pos.System.ICRS);
-         coord.band = Band.parseBand(params);
-         coord.time = Time.parseTime(params);
+         coord.pos  = Pos.parsePos(params, DEFAULT_SKY_SYSTEM);
+         coord.band = Band.parseBand(params, DEFAULT_SPEC_SYSTEM);
+         coord.time = Time.parseTime(params, DEFAULT_TIME_SYSTEM);
          coord.pol  = Pol.parsePol(params);
 
          ObsCore[] obsCoreArr = queryObsCore(pubdidArr,
diff --git a/data-discovery/src/main/java/vlkb/webapi/FormatResponseSettings.java b/data-discovery/src/main/java/vlkb/webapi/FormatResponseSettings.java
index dcebe2a..3c582d8 100644
--- a/data-discovery/src/main/java/vlkb/webapi/FormatResponseSettings.java
+++ b/data-discovery/src/main/java/vlkb/webapi/FormatResponseSettings.java
@@ -11,6 +11,14 @@ class FormatResponseSettings
 {
    private static final Logger LOGGER = Logger.getLogger("FormatResponseSettings");
 
+   public static class DefaultParamValues
+   {
+      String responseFormat;
+      String skySystem;
+      String specSystem;
+      boolean showDuration;
+   }
+
 /*
    public static class DBConn
    {
@@ -58,6 +66,7 @@ class FormatResponseSettings
 
    public DBConn     dbConn;
    public ServiceUrls serviceUrls;
+   public DefaultParamValues defaults;
 
 
    // will not start without config-file; no reasonable code-defaults can be invented
@@ -74,8 +83,9 @@ class FormatResponseSettings
 
             DBConn      dbConn      = loadDBConn(properties);
             ServiceUrls serviceUrls = loadServiceUrls(properties);
+            DefaultParamValues defaults = loadDefaults(properties);
 
-            return new FormatResponseSettings(dbConn, serviceUrls);
+            return new FormatResponseSettings(dbConn, serviceUrls, defaults);
          }
          else
          {
@@ -92,10 +102,11 @@ class FormatResponseSettings
 
 
 
-   private FormatResponseSettings(DBConn dbConn, ServiceUrls serviceUrls)
+   private FormatResponseSettings(DBConn dbConn, ServiceUrls serviceUrls, DefaultParamValues defaults)
    {
       this.dbConn      = dbConn;
       this.serviceUrls = serviceUrls;
+      this.defaults    = defaults;
    }
 
 
@@ -121,6 +132,15 @@ class FormatResponseSettings
       return serviceUrls;
    }
 
+   private static DefaultParamValues loadDefaults(Properties properties)
+   {
+      DefaultParamValues defaults = new DefaultParamValues();
+      defaults.responseFormat = properties.getProperty("default_response_format", "application/fits").strip();
+      defaults.skySystem      = properties.getProperty("default_sky_system", "ICRS").strip();
+      defaults.specSystem     = properties.getProperty("default_spec_system", "WAVE_Barycentric").strip();
+      defaults.showDuration   = "yes".equals(properties.getProperty("show_duration", "no").strip());
+      return defaults;
+   }
 
 }
 
diff --git a/data-discovery/src/main/java/vlkb/webapi/SearchServlet.java b/data-discovery/src/main/java/vlkb/webapi/SearchServlet.java
index 8bda8da..50b9522 100644
--- a/data-discovery/src/main/java/vlkb/webapi/SearchServlet.java
+++ b/data-discovery/src/main/java/vlkb/webapi/SearchServlet.java
@@ -24,6 +24,12 @@ public class SearchServlet extends javax.servlet.http.HttpServlet
    private static final Logger         LOGGER   = Logger.getLogger("PSearch");
    private static final SearchSettings settings = SearchSettings.getInstance("search.properties");
 
+   final String RESPONSE_ENCODING = "utf-8";
+   final String DEFAULT_RESPONSEFORMAT = settings.defaults.responseFormat;
+   final String DEFAULT_SKY_SYSTEM     = settings.defaults.skySystem;
+   final String DEFAULT_SPEC_SYSTEM    = settings.defaults.specSystem;
+   final String DEFAULT_TIME_SYSTEM = "MJD_UTC"; // FIXME take from config file
+
 
    public void init() throws ServletException
    {
@@ -66,9 +72,9 @@ public class SearchServlet extends javax.servlet.http.HttpServlet
 
          // new based on vlkb-volib
          Coord coord = new Coord();
-         coord.pos  = Pos.parsePos(params);
-         coord.band = Band.parseBand(params);
-         coord.time = Time.parseTime(params);
+         coord.pos  = Pos.parsePos(params, DEFAULT_SKY_SYSTEM);
+         coord.band = Band.parseBand(params, DEFAULT_SPEC_SYSTEM);
+         coord.time = Time.parseTime(params, DEFAULT_TIME_SYSTEM);
          coord.pol  = Pol.parsePol(params);
 
          /* query Obscore table */
diff --git a/data-discovery/src/main/java/vlkb/webapi/SearchSettings.java b/data-discovery/src/main/java/vlkb/webapi/SearchSettings.java
index 0a08c5e..bf8c0ea 100644
--- a/data-discovery/src/main/java/vlkb/webapi/SearchSettings.java
+++ b/data-discovery/src/main/java/vlkb/webapi/SearchSettings.java
@@ -11,6 +11,15 @@ class SearchSettings
 {
    private static final Logger LOGGER = Logger.getLogger("SearchSettings");
 
+   public static class DefaultParamValues
+   {
+      String responseFormat;
+      String skySystem;
+      String specSystem;
+      boolean showDuration;
+   }
+
+
 /*
    public static class DBConn
    {
@@ -30,8 +39,8 @@ class SearchSettings
       }
    }
 */
-   public DBConn     dbConn;
-
+    public DBConn     dbConn;
+    public DefaultParamValues defaults;
 
    // will not start without config-file; no reasonable code-defaults can be invented
    public static SearchSettings getInstance(String settingsFileName)
@@ -46,8 +55,9 @@ class SearchSettings
             properties.load(ins);
 
             DBConn      dbConn      = loadDBConn(properties);
+            DefaultParamValues defaults = loadDefaults(properties);
 
-            return new SearchSettings(dbConn);
+            return new SearchSettings(dbConn, defaults);
          }
          else
          {
@@ -64,9 +74,10 @@ class SearchSettings
 
 
 
-   private SearchSettings(DBConn dbConn)
+   private SearchSettings(DBConn dbConn,  DefaultParamValues defaults)
    {
       this.dbConn      = dbConn;
+      this.defaults  = defaults;
    }
 
 
@@ -81,5 +92,15 @@ class SearchSettings
       return dbConn;
    }
 
+   private static DefaultParamValues loadDefaults(Properties properties)
+   {
+      DefaultParamValues defaults = new DefaultParamValues();
+      defaults.responseFormat = properties.getProperty("default_response_format", "application/fits").strip();
+      defaults.skySystem      = properties.getProperty("default_sky_system", "ICRS").strip();
+      defaults.specSystem     = properties.getProperty("default_spec_system", "WAVE_Barycentric").strip();
+      defaults.showDuration   = "yes".equals(properties.getProperty("show_duration", "no").strip());
+      return defaults;
+   }
+
 }
 
diff --git a/java-libs/lib/vlkb-volib-0.9-SNAPSHOT.jar b/java-libs/lib/vlkb-volib-0.9-SNAPSHOT.jar
index 94a329a806bb4c43df0d25c3d36896d6b28ccce4..9ba5160584a847c38f4cae9a2732f69845e30032 100644
GIT binary patch
delta 10378
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

delta 9258
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

-- 
GitLab