From 859e4043b373a1362fcc6a0083ba69d5f18d9ecd Mon Sep 17 00:00:00 2001
From: Robert Butora <robert.butora@inaf.it>
Date: Sat, 23 Mar 2024 11:50:39 +0100
Subject: [PATCH] implements framework for VOTable response (not the VOTable
 yet)

---
 .../main/java/vlkb/output/XmlSerializer.java  | 19 ++++++++++++++++
 .../vlkb/webapi/FormatResponseFilter.java     | 22 ++++++++++++++++---
 .../vlkb/webapi/FormatResponseSettings.java   |  6 ++++-
 3 files changed, 43 insertions(+), 4 deletions(-)

diff --git a/data-discovery/src/main/java/vlkb/output/XmlSerializer.java b/data-discovery/src/main/java/vlkb/output/XmlSerializer.java
index 105e99f..1ff787a 100644
--- a/data-discovery/src/main/java/vlkb/output/XmlSerializer.java
+++ b/data-discovery/src/main/java/vlkb/output/XmlSerializer.java
@@ -10,6 +10,25 @@ public final class XmlSerializer
 
    private XmlSerializer() {} // disables instatiation
 
+   public static void serializeToVoTable(PrintWriter writer, String charEncoding, SearchOutputData searchOutputData,
+         boolean showDuration, long startTime_msec)
+   {
+      writer.println("<?xml version=\"1.0\" encoding=\"" + charEncoding + "\" standalone=\"yes\"?>");
+      writer.println("<results>");
+      writer.println("<description> TBD: VOTable " + searchOutputData.description + " </description>");
+      serialize(writer, searchOutputData.inputs);
+      writer.println("<msg> " + searchOutputData.versionString + " </msg>");
+      writer.println("<DatacubeCount> " + searchOutputData.datacubeCount + " </DatacubeCount>");
+      for(Subsurvey subsurvey : searchOutputData.subsurveyArr)
+      {
+         serialize(writer, subsurvey);
+      }
+      if(showDuration)
+         writer.println("<duration unit=\"msec\">" + (System.currentTimeMillis() - startTime_msec) + "</duration>");
+      writer.println("</results>");
+   }
+
+
    public static void serializeToLegacyResults(PrintWriter writer, String charEncoding, SearchOutputData searchOutputData,
          boolean showDuration, long startTime_msec)
    {
diff --git a/data-discovery/src/main/java/vlkb/webapi/FormatResponseFilter.java b/data-discovery/src/main/java/vlkb/webapi/FormatResponseFilter.java
index 49e1955..20e75ed 100644
--- a/data-discovery/src/main/java/vlkb/webapi/FormatResponseFilter.java
+++ b/data-discovery/src/main/java/vlkb/webapi/FormatResponseFilter.java
@@ -111,11 +111,27 @@ public class FormatResponseFilter implements Filter
                settings.serviceUrls.mergeUrl(),
                dbSubsurveyArr);
 
-         response.setContentType("application/xml");
          response.setCharacterEncoding(RESPONSE_ENCODING);
+         final String respFormat = settings.serviceUrls.responseFormat();
+         LOGGER.info("responseFormat: " + respFormat);
 
-         boolean showDuration = true;
-         XmlSerializer.serializeToLegacyResults(responseWriter, RESPONSE_ENCODING, searchOutputData,showDuration,startTime_msec);
+         if(respFormat.equals("application/vlkb+xml")) // FIXME hsould be application/x-vlkb+xml -> x- is for eXperimental a.k.a. not registered
+         {
+            response.setContentType("application/xml");
+            boolean showDuration = true;
+            XmlSerializer.serializeToLegacyResults(responseWriter, RESPONSE_ENCODING, searchOutputData,showDuration,startTime_msec);
+         }
+         else if(respFormat.equals("application/x-votable+xml"))
+         {
+            response.setContentType(respFormat);
+            boolean showDuration = false;
+            XmlSerializer.serializeToVoTable(responseWriter, RESPONSE_ENCODING, searchOutputData,showDuration,startTime_msec);
+         }
+         else
+         {
+            ; // FIXME throws wrong setting-file param: batter convert string to enum and throw 'unrecoginzed respFormat' then;
+              // here use switch with enums and switch-default: say error: 'unsupported respFromat' type
+         }
 
          responseWriter.close();
       }
diff --git a/data-discovery/src/main/java/vlkb/webapi/FormatResponseSettings.java b/data-discovery/src/main/java/vlkb/webapi/FormatResponseSettings.java
index 9e22cb5..b2979bd 100644
--- a/data-discovery/src/main/java/vlkb/webapi/FormatResponseSettings.java
+++ b/data-discovery/src/main/java/vlkb/webapi/FormatResponseSettings.java
@@ -36,19 +36,22 @@ class FormatResponseSettings
       private String cutoutUrl;
       private String mergeUrl;
       private String surveysAbsPathname;
+      private String respFormat;
 
       public boolean cutoutUrlIsSet() { return (cutoutUrl != null) && cutoutUrl.trim().isEmpty(); }
       public boolean mergeUrlIsSet()  { return (mergeUrl != null) && mergeUrl.trim().isEmpty(); }
       public boolean surveysAbsPathnameIsSet()
        { return (surveysAbsPathname != null) && surveysAbsPathname.trim().isEmpty(); }
+      public boolean responseFormatIsSet() { return (respFormat != null) && respFormat.trim().isEmpty(); }
 
       public String cutoutUrl() {return cutoutUrl;}
       public String mergeUrl()  {return mergeUrl;}
       public String surveysAbsPathname()  {return surveysAbsPathname;}
+      public String responseFormat()  {return respFormat;}
 
       public String toString()
       {
-         return cutoutUrl + "   "  + mergeUrl + "   " + surveysAbsPathname;
+         return cutoutUrl + "   "  + mergeUrl + "   " + surveysAbsPathname + "    " + respFormat;
       }
    }
 
@@ -114,6 +117,7 @@ class FormatResponseSettings
       serviceUrls.cutoutUrl = properties.getProperty("cutout_url","").strip();
       serviceUrls.mergeUrl  = properties.getProperty("merge_url","").strip();
       serviceUrls.surveysAbsPathname = properties.getProperty("surveys_metadata_abs_pathname","/srv/surveys/surveys_metadata.csv").strip();
+      serviceUrls.respFormat = properties.getProperty("response_format","application/x-votable+xml").strip();
       return serviceUrls;
    }
 
-- 
GitLab